From c981bb5500c9d50d28cc3545cd5742ff47de4e30 Mon Sep 17 00:00:00 2001 From: Santiago Palladino Date: Tue, 5 Mar 2024 19:53:51 -0300 Subject: [PATCH 01/12] chore: Remove old contract deployment flow --- .../src/core/libraries/ConstantsGen.sol | 44 +++--- .../periphery/ContractDeploymentEmitter.sol | 51 ------ .../interfaces/IContractDeploymentEmitter.sol | 47 ------ .../context/inputs/private_context_inputs.nr | 3 +- .../aztec/src/context/private_context.nr | 9 +- .../aztec/src/context/public_context.nr | 5 - .../aztec/src/history/contract_inclusion.nr | 3 +- .../src/oracle/get_membership_witness.nr | 14 +- .../crates/private-kernel-lib/src/common.nr | 117 ++++---------- .../src/private_kernel_init.nr | 141 ++--------------- .../src/private_kernel_inner.nr | 34 +--- .../crates/public-kernel-lib/src/common.nr | 11 +- .../src/public_kernel_app_logic.nr | 15 +- .../src/public_kernel_setup.nr | 17 +- .../src/public_kernel_teardown.nr | 8 +- .../crates/public-kernel-lib/src/utils.nr | 9 +- .../rollup-lib/src/base/base_rollup_inputs.nr | 149 +----------------- .../rollup-lib/src/base/state_diff_hints.nr | 4 +- .../crates/rollup-lib/src/components.nr | 21 +-- .../src/merge/merge_rollup_inputs.nr | 8 - .../crates/rollup-lib/src/root.nr | 4 - .../src/tests/previous_rollup_data.nr | 17 -- .../crates/types/src/abis.nr | 2 - .../accumulated_revertible_data_builder.nr | 16 +- .../combined_accumulated_data.nr | 20 +-- .../combined_accumulated_data_builder.nr | 25 +-- .../private_accumulated_revertible_data.nr | 11 +- .../public_accumulated_revertible_data.nr | 8 +- .../crates/types/src/abis/call_context.nr | 7 +- .../types/src/abis/contract_leaf_preimage.nr | 9 -- .../types/src/abis/membership_witness.nr | 9 +- .../types/src/abis/new_contract_data.nr | 110 ------------- .../types/src/abis/private_call_stack_item.nr | 3 +- .../src/abis/private_circuit_public_inputs.nr | 13 +- .../abis/private_kernel/private_call_data.nr | 2 +- .../types/src/abis/public_call_stack_item.nr | 6 +- .../src/abis/public_circuit_public_inputs.nr | 3 +- .../crates/types/src/constants.nr | 29 ++-- .../crates/types/src/contrakt.nr | 1 - .../src/contrakt/contract_deployment_data.nr | 86 ---------- .../crates/types/src/hash.nr | 29 +--- .../crates/types/src/header.nr | 3 +- .../types/src/partial_state_reference.nr | 13 +- .../crates/types/src/tests/fixtures.nr | 5 - .../src/tests/fixtures/contract_functions.nr | 12 -- .../types/src/tests/fixtures/contract_tree.nr | 40 ----- .../types/src/tests/fixtures/contracts.nr | 1 - .../types/src/tests/kernel_data_builder.nr | 2 +- .../src/tests/private_call_data_builder.nr | 17 +- .../private_circuit_public_inputs_builder.nr | 36 +---- .../src/tests/public_call_data_builder.nr | 1 - .../crates/types/src/tests/testing_harness.nr | 33 +--- .../types/src/transaction/tx_context.nr | 17 +- .../types/src/transaction/tx_request.nr | 21 +-- yarn-project/archiver/README.md | 5 +- .../archiver/src/archiver/archiver.test.ts | 34 +--- .../archiver/src/archiver/archiver.ts | 49 +----- .../archiver/src/archiver/archiver_store.ts | 23 --- .../src/archiver/archiver_store_test_suite.ts | 113 ------------- .../archiver/src/archiver/data_retrieval.ts | 43 +---- .../archiver/src/archiver/eth_log_handlers.ts | 71 +-------- .../archiver/kv_archiver_store/block_store.ts | 10 -- .../kv_archiver_store/contract_store.ts | 43 ----- .../kv_archiver_store/kv_archiver_store.ts | 29 ---- .../memory_archiver_store.ts | 47 +----- yarn-project/archiver/src/index.ts | 1 - .../aztec-node/src/aztec-node/server.ts | 15 -- yarn-project/aztec.js/src/contract/sent_tx.ts | 2 - yarn-project/aztec/src/sandbox.ts | 6 - .../circuit-types/src/contract_data.ts | 16 +- .../src/interfaces/aztec-node.ts | 12 -- yarn-project/circuit-types/src/l2_block.ts | 4 - .../circuit-types/src/merkle_tree_id.ts | 21 ++- yarn-project/circuit-types/src/mocks.ts | 5 - .../circuit-types/src/stats/metrics.ts | 4 +- yarn-project/circuit-types/src/stats/stats.ts | 10 +- yarn-project/circuit-types/src/tx/tx.ts | 36 +---- .../circuit-types/src/tx/tx_receipt.ts | 8 - yarn-project/circuit-types/src/tx_effect.ts | 34 +--- yarn-project/circuits.js/src/constants.gen.ts | 29 ++-- .../contract_deployment_data.test.ts.snap | 44 ------ .../structs/__snapshots__/header.test.ts.snap | 122 +++++++------- .../private_call_stack_item.test.ts.snap | 126 +++++++-------- ...private_circuit_public_inputs.test.ts.snap | 116 +++++++------- .../public_call_stack_item.test.ts.snap | 62 ++++---- .../public_circuit_public_inputs.test.ts.snap | 124 +++++++-------- .../__snapshots__/tx_context.test.ts.snap | 58 +++---- .../__snapshots__/tx_request.test.ts.snap | 2 +- .../circuits.js/src/structs/call_context.ts | 9 -- .../structs/contract_deployment_data.test.ts | 30 ---- .../src/structs/contract_deployment_data.ts | 97 ------------ .../circuits.js/src/structs/function_data.ts | 1 + .../src/structs/global_variables.ts | 3 +- .../circuits.js/src/structs/header.test.ts | 10 +- yarn-project/circuits.js/src/structs/index.ts | 2 - .../new_contract_data.test.ts.snap | 87 ---------- .../kernel/combined_accumulated_data.ts | 27 ---- .../structs/kernel/new_contract_data.test.ts | 48 ------ .../src/structs/kernel/new_contract_data.ts | 85 ---------- .../src/structs/partial_state_reference.ts | 17 +- .../structs/private_call_stack_item.test.ts | 10 +- .../private_circuit_public_inputs.test.ts | 10 +- .../structs/private_circuit_public_inputs.ts | 10 -- .../structs/public_call_stack_item.test.ts | 18 ++- .../public_circuit_public_inputs.test.ts | 10 +- .../src/structs/rollup/state_diff_hints.ts | 6 - .../src/structs/tx_context.test.ts | 10 +- .../circuits.js/src/structs/tx_context.ts | 38 +---- .../src/structs/tx_request.test.ts | 22 ++- .../circuits.js/src/tests/factories.ts | 42 +---- yarn-project/cli/src/utils.ts | 6 - .../src/e2e_inclusion_proofs_contract.test.ts | 4 +- yarn-project/end-to-end/src/fixtures/utils.ts | 6 - .../src/integration_l1_publisher.test.ts | 13 +- .../ethereum/src/deploy_l1_contracts.ts | 13 -- .../foundation/src/testing/test_data.ts | 34 ++++ .../scripts/generate-artifacts.sh | 1 - .../src/index.test.ts | 19 --- .../src/type_conversion.test.ts | 34 +--- .../src/type_conversion.ts | 89 ----------- .../p2p/src/service/tx_messages.test.ts | 4 - yarn-project/p2p/src/service/tx_messages.ts | 22 +-- .../pxe/src/pxe_service/pxe_service.ts | 24 +-- .../pxe/src/simulator_oracle/index.ts | 2 - .../scripts/src/benchmarks/aggregate.ts | 2 +- .../scripts/src/benchmarks/markdown.ts | 6 +- .../block_builder/solo_block_builder.test.ts | 71 +++------ .../src/block_builder/solo_block_builder.ts | 56 ++----- .../src/publisher/l1-publisher.ts | 86 +--------- .../src/publisher/viem-tx-sender.ts | 54 +------ .../src/sequencer/processed_tx.ts | 20 +-- .../src/sequencer/public_processor.test.ts | 21 +-- .../src/sequencer/sequencer.test.ts | 50 +----- .../src/sequencer/sequencer.ts | 35 ---- .../src/simulator/public_executor.ts | 20 --- .../src/client/client_execution_context.ts | 14 +- .../src/client/private_execution.test.ts | 13 +- .../simulator/src/client/simulator.ts | 3 +- .../simulator/src/public/index.test.ts | 9 -- .../src/public/public_execution_context.ts | 1 - .../server_world_state_synchronizer.test.ts | 39 ++--- .../merkle_tree_snapshot_operations_facade.ts | 5 - .../src/world-state-db/merkle_trees.ts | 14 +- 143 files changed, 725 insertions(+), 3302 deletions(-) delete mode 100644 l1-contracts/src/periphery/ContractDeploymentEmitter.sol delete mode 100644 l1-contracts/src/periphery/interfaces/IContractDeploymentEmitter.sol delete mode 100644 noir-projects/noir-protocol-circuits/crates/types/src/abis/contract_leaf_preimage.nr delete mode 100644 noir-projects/noir-protocol-circuits/crates/types/src/abis/new_contract_data.nr delete mode 100644 noir-projects/noir-protocol-circuits/crates/types/src/contrakt/contract_deployment_data.nr delete mode 100644 noir-projects/noir-protocol-circuits/crates/types/src/tests/fixtures/contract_tree.nr delete mode 100644 yarn-project/circuits.js/src/structs/__snapshots__/contract_deployment_data.test.ts.snap delete mode 100644 yarn-project/circuits.js/src/structs/contract_deployment_data.test.ts delete mode 100644 yarn-project/circuits.js/src/structs/contract_deployment_data.ts delete mode 100644 yarn-project/circuits.js/src/structs/kernel/__snapshots__/new_contract_data.test.ts.snap delete mode 100644 yarn-project/circuits.js/src/structs/kernel/new_contract_data.test.ts delete mode 100644 yarn-project/circuits.js/src/structs/kernel/new_contract_data.ts diff --git a/l1-contracts/src/core/libraries/ConstantsGen.sol b/l1-contracts/src/core/libraries/ConstantsGen.sol index b9ba3fb6926..6b6bbac2583 100644 --- a/l1-contracts/src/core/libraries/ConstantsGen.sol +++ b/l1-contracts/src/core/libraries/ConstantsGen.sol @@ -43,7 +43,6 @@ library Constants { uint256 internal constant MAX_NON_REVERTIBLE_PUBLIC_DATA_READS_PER_TX = 16; uint256 internal constant MAX_REVERTIBLE_PUBLIC_DATA_READS_PER_TX = 16; uint256 internal constant MAX_NEW_L2_TO_L1_MSGS_PER_TX = 2; - uint256 internal constant MAX_NEW_CONTRACTS_PER_TX = 1; uint256 internal constant MAX_NOTE_HASH_READ_REQUESTS_PER_TX = 128; uint256 internal constant MAX_NULLIFIER_READ_REQUESTS_PER_TX = 8; uint256 internal constant MAX_NULLIFIER_KEY_VALIDATION_REQUESTS_PER_TX = 4; @@ -52,15 +51,17 @@ library Constants { uint256 internal constant NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP = 16; uint256 internal constant VK_TREE_HEIGHT = 3; uint256 internal constant FUNCTION_TREE_HEIGHT = 5; - uint256 internal constant CONTRACT_TREE_HEIGHT = 16; uint256 internal constant NOTE_HASH_TREE_HEIGHT = 32; uint256 internal constant PUBLIC_DATA_TREE_HEIGHT = 40; uint256 internal constant NULLIFIER_TREE_HEIGHT = 20; uint256 internal constant L1_TO_L2_MSG_TREE_HEIGHT = 16; uint256 internal constant ROLLUP_VK_TREE_HEIGHT = 8; uint256 internal constant ARTIFACT_FUNCTION_TREE_MAX_HEIGHT = 5; - uint256 internal constant CONTRACT_SUBTREE_HEIGHT = 0; - uint256 internal constant CONTRACT_SUBTREE_SIBLING_PATH_LENGTH = 16; + uint256 internal constant NULLIFIER_TREE_ID = 0; + uint256 internal constant NOTE_HASH_TREE_ID = 1; + uint256 internal constant PUBLIC_DATA_TREE_ID = 2; + uint256 internal constant L1_TO_L2_MESSAGE_TREE_ID = 3; + uint256 internal constant ARCHIVE_TREE_ID = 4; uint256 internal constant NOTE_HASH_SUBTREE_HEIGHT = 6; uint256 internal constant NOTE_HASH_SUBTREE_SIBLING_PATH_LENGTH = 26; uint256 internal constant NULLIFIER_SUBTREE_HEIGHT = 6; @@ -79,25 +80,19 @@ library Constants { uint256 internal constant MAX_PACKED_PUBLIC_BYTECODE_SIZE_IN_FIELDS = 9000; uint256 internal constant MAX_PACKED_BYTECODE_SIZE_PER_PRIVATE_FUNCTION_IN_FIELDS = 500; uint256 internal constant MAX_PACKED_BYTECODE_SIZE_PER_UNCONSTRAINED_FUNCTION_IN_FIELDS = 500; - uint256 internal constant REGISTERER_CONTRACT_CLASS_REGISTERED_MAGIC_VALUE = - 0x6999d1e02b08a447a463563453cb36919c9dd7150336fc7c4d2b52f8; - uint256 internal constant REGISTERER_PRIVATE_FUNCTION_BROADCASTED_MAGIC_VALUE = - 0x1b70e95fde0b70adc30496b90a327af6a5e383e028e7a43211a07bcd; - uint256 internal constant REGISTERER_UNCONSTRAINED_FUNCTION_BROADCASTED_MAGIC_VALUE = - 0xe7af816635466f128568edb04c9fa024f6c87fb9010fdbffa68b3d99; - uint256 internal constant DEPLOYER_CONTRACT_INSTANCE_DEPLOYED_MAGIC_VALUE = - 0x85864497636cf755ae7bde03f267ce01a520981c21c3682aaf82a631; - uint256 internal constant DEPLOYER_CONTRACT_ADDRESS = - 0x0747a20ed0c86035e44ea5606f30de459f40b55c5e82012640aa554546af9044; + uint256 internal constant REGISTERER_CONTRACT_CLASS_REGISTERED_MAGIC_VALUE = 0x6999d1e02b08a447a463563453cb36919c9dd7150336fc7c4d2b52f8; + uint256 internal constant REGISTERER_PRIVATE_FUNCTION_BROADCASTED_MAGIC_VALUE = 0x1b70e95fde0b70adc30496b90a327af6a5e383e028e7a43211a07bcd; + uint256 internal constant REGISTERER_UNCONSTRAINED_FUNCTION_BROADCASTED_MAGIC_VALUE = 0xe7af816635466f128568edb04c9fa024f6c87fb9010fdbffa68b3d99; + uint256 internal constant DEPLOYER_CONTRACT_INSTANCE_DEPLOYED_MAGIC_VALUE = 0x85864497636cf755ae7bde03f267ce01a520981c21c3682aaf82a631; + uint256 internal constant DEPLOYER_CONTRACT_ADDRESS = 0x0747a20ed0c86035e44ea5606f30de459f40b55c5e82012640aa554546af9044; uint256 internal constant L1_TO_L2_MESSAGE_ORACLE_CALL_LENGTH = 17; uint256 internal constant MAX_NOTE_FIELDS_LENGTH = 20; uint256 internal constant GET_NOTE_ORACLE_RETURN_LENGTH = 23; uint256 internal constant MAX_NOTES_PER_PAGE = 10; uint256 internal constant VIEW_NOTE_ORACLE_RETURN_LENGTH = 212; uint256 internal constant AZTEC_ADDRESS_LENGTH = 1; - uint256 internal constant CALL_CONTEXT_LENGTH = 8; + uint256 internal constant CALL_CONTEXT_LENGTH = 7; uint256 internal constant CONTENT_COMMITMENT_LENGTH = 7; - uint256 internal constant CONTRACT_DEPLOYMENT_DATA_LENGTH = 6; uint256 internal constant CONTRACT_INSTANCE_LENGTH = 6; uint256 internal constant CONTRACT_STORAGE_READ_LENGTH = 2; uint256 internal constant CONTRACT_STORAGE_UPDATE_REQUEST_LENGTH = 2; @@ -105,19 +100,18 @@ library Constants { uint256 internal constant FUNCTION_DATA_LENGTH = 4; uint256 internal constant FUNCTION_LEAF_PREIMAGE_LENGTH = 5; uint256 internal constant GLOBAL_VARIABLES_LENGTH = 6; - uint256 internal constant HEADER_LENGTH = 25; + uint256 internal constant HEADER_LENGTH = 23; uint256 internal constant L1_TO_L2_MESSAGE_LENGTH = 8; uint256 internal constant L2_TO_L1_MESSAGE_LENGTH = 2; - uint256 internal constant NEW_CONTRACT_DATA_LENGTH = 3; uint256 internal constant NULLIFIER_KEY_VALIDATION_REQUEST_LENGTH = 4; uint256 internal constant NULLIFIER_KEY_VALIDATION_REQUEST_CONTEXT_LENGTH = 5; - uint256 internal constant PARTIAL_STATE_REFERENCE_LENGTH = 8; - uint256 internal constant PRIVATE_CALL_STACK_ITEM_LENGTH = 223; - uint256 internal constant PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH = 218; - uint256 internal constant PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH = 199; - uint256 internal constant STATE_REFERENCE_LENGTH = 10; - uint256 internal constant TX_CONTEXT_DATA_LENGTH = 11; - uint256 internal constant TX_REQUEST_LENGTH = 17; + uint256 internal constant PARTIAL_STATE_REFERENCE_LENGTH = 6; + uint256 internal constant PRIVATE_CALL_STACK_ITEM_LENGTH = 214; + uint256 internal constant PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH = 209; + uint256 internal constant PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH = 196; + uint256 internal constant STATE_REFERENCE_LENGTH = 8; + uint256 internal constant TX_CONTEXT_DATA_LENGTH = 4; + uint256 internal constant TX_REQUEST_LENGTH = 10; uint256 internal constant GET_NOTES_ORACLE_RETURN_LENGTH = 674; uint256 internal constant NOTE_HASHES_NUM_BYTES_PER_BASE_ROLLUP = 2048; uint256 internal constant NULLIFIERS_NUM_BYTES_PER_BASE_ROLLUP = 2048; diff --git a/l1-contracts/src/periphery/ContractDeploymentEmitter.sol b/l1-contracts/src/periphery/ContractDeploymentEmitter.sol deleted file mode 100644 index efa55fc0f35..00000000000 --- a/l1-contracts/src/periphery/ContractDeploymentEmitter.sol +++ /dev/null @@ -1,51 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// Copyright 2023 Aztec Labs. -pragma solidity >=0.8.18; - -// Interfaces -import {IContractDeploymentEmitter} from "./interfaces/IContractDeploymentEmitter.sol"; - -/** - * @title ContractDeploymentEmitter - * @author Aztec Labs - * @notice Used to log data on chain which are not required to advance the state but are needed for other purposes - */ -contract ContractDeploymentEmitter is IContractDeploymentEmitter { - /** - * @notice Publishes public function bytecode to L1. - * @dev Emits a `ContractDeployment` event - * @dev Unverified and can be emitted by anyone - * @param _l2BlockNum - The L2 block number that the contract deployment is related to - * @param _aztecAddress - The address of the L2 counterparty - * @param _portalAddress - The address of the L1 counterparty - * @param _l2BlockHash - The hash of the L2 block that this is related to - * @param _contractClassId - The contract class id - * @param _saltedInitializationHash - Salted init hash - * @param _publicKeyHash - Public key hash - * @param _acir - The acir bytecode of the L2 contract - * @dev See the link below for more info on partial address and public key: - * https://github.com/AztecProtocol/aztec-packages/blob/master/docs/docs/concepts/foundation/accounts/keys.md#addresses-partial-addresses-and-public-keys - * TODO: replace the link above with the link to deployed docs - */ - function emitContractDeployment( - uint256 _l2BlockNum, - bytes32 _aztecAddress, - address _portalAddress, - bytes32 _l2BlockHash, - bytes32 _contractClassId, - bytes32 _saltedInitializationHash, - bytes32 _publicKeyHash, - bytes calldata _acir - ) external override(IContractDeploymentEmitter) { - emit ContractDeployment( - _l2BlockNum, - _aztecAddress, - _portalAddress, - _l2BlockHash, - _contractClassId, - _saltedInitializationHash, - _publicKeyHash, - _acir - ); - } -} diff --git a/l1-contracts/src/periphery/interfaces/IContractDeploymentEmitter.sol b/l1-contracts/src/periphery/interfaces/IContractDeploymentEmitter.sol deleted file mode 100644 index 9debce8240f..00000000000 --- a/l1-contracts/src/periphery/interfaces/IContractDeploymentEmitter.sol +++ /dev/null @@ -1,47 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// Copyright 2023 Aztec Labs. -pragma solidity >=0.8.18; - -/** - * @title Contract Deployment Emitter Interface - * @author Aztec Labs - * @notice Interface for Contract Deployment Emitter - * The contract is used to broadcast information about deployed contracts with public functions. - */ -interface IContractDeploymentEmitter { - /** - * @notice Links L1 and L2 addresses and stores the acir bytecode of the L2 contract - * @param l2BlockNum - The L2 block number that the information is related to - * @param aztecAddress - The address of the L2 counterparty - * @param portalAddress - The address of the L1 counterparty - * @param l2BlockHash - The hash of the L2 block that this is related to - * @param contractClassId - The contract class id - * @param saltedInitializationHash - Salted init hash - * @param publicKeyHash - Public key hash - * @param acir - The acir bytecode of the L2 contract - * @dev See the link below for more info on partial address and public key: - * https://github.com/AztecProtocol/aztec-packages/blob/master/docs/docs/concepts/foundation/accounts/keys.md#addresses-partial-addresses-and-public-keys - * TODO: replace the link above with the link to deployed docs - */ - event ContractDeployment( - uint256 indexed l2BlockNum, - bytes32 indexed aztecAddress, - address indexed portalAddress, - bytes32 l2BlockHash, - bytes32 contractClassId, - bytes32 saltedInitializationHash, - bytes32 publicKeyHash, - bytes acir - ); - - function emitContractDeployment( - uint256 _l2BlockNum, - bytes32 _aztecAddress, - address _portalAddress, - bytes32 _l2BlockHash, - bytes32 _contractClassId, - bytes32 _saltedInitializationHash, - bytes32 _publicKeyHash, - bytes calldata _acir - ) external; -} diff --git a/noir-projects/aztec-nr/aztec/src/context/inputs/private_context_inputs.nr b/noir-projects/aztec-nr/aztec/src/context/inputs/private_context_inputs.nr index 48339688ea9..a2bf9752ee2 100644 --- a/noir-projects/aztec-nr/aztec/src/context/inputs/private_context_inputs.nr +++ b/noir-projects/aztec-nr/aztec/src/context/inputs/private_context_inputs.nr @@ -1,5 +1,5 @@ use dep::protocol_types::{ - abis::call_context::CallContext, contrakt::contract_deployment_data::ContractDeploymentData, + abis::call_context::CallContext, header::Header }; use crate::context::globals::private_global_variables::PrivateGlobalVariables; @@ -9,7 +9,6 @@ use crate::context::globals::private_global_variables::PrivateGlobalVariables; struct PrivateContextInputs { call_context : CallContext, historical_header: Header, - contract_deployment_data: ContractDeploymentData, private_global_variables: PrivateGlobalVariables, } // docs:end:private-context-inputs \ No newline at end of file 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 15f12340fe2..ac987de4251 100644 --- a/noir-projects/aztec-nr/aztec/src/context/private_context.nr +++ b/noir-projects/aztec-nr/aztec/src/context/private_context.nr @@ -140,11 +140,6 @@ impl PrivateContext { } } - pub fn is_deployment(self) -> bool { - // TODO(#4738): Implement this - false - } - // Returns the header of an arbitrary block whose block number is less than or equal to the block number // of historical header. pub fn get_header_at(self, block_number: u32) -> Header { @@ -167,6 +162,7 @@ impl PrivateContext { // - in the private circuit inner that it remains 0 // I've had to initialize the counter here so that it would work for contract deployments // the above checks should be doable after we figure out fee payments for contract deployments + // TO(fees): there are no more contract deployments at the protocol level min_revertible_side_effect_counter: self.min_revertible_side_effect_counter, note_hash_read_requests: self.note_hash_read_requests.storage, nullifier_read_requests: self.nullifier_read_requests.storage, @@ -182,7 +178,6 @@ impl PrivateContext { encrypted_log_preimages_length, unencrypted_log_preimages_length, historical_header: self.historical_header, - contract_deployment_data: self.inputs.contract_deployment_data, chain_id: self.inputs.private_global_variables.chain_id, version: self.inputs.private_global_variables.version }; @@ -349,7 +344,6 @@ impl PrivateContext { // Assert that the call context of the enqueued call generated by the oracle matches our request. assert(item.public_inputs.call_context.is_delegate_call == is_delegate_call); assert(item.public_inputs.call_context.is_static_call == is_static_call); - assert(item.public_inputs.call_context.is_contract_deployment == false); if (is_delegate_call) { // For delegate calls, we also constrain the execution context address for the nested call to be equal to our address. @@ -485,7 +479,6 @@ impl PrivateContext { // Assert that the call context of the enqueued call generated by the oracle matches our request. assert(item.public_inputs.call_context.is_delegate_call == is_delegate_call); assert(item.public_inputs.call_context.is_static_call == is_static_call); - assert(item.public_inputs.call_context.is_contract_deployment == false); if (is_delegate_call) { // For delegate calls, we also constrain the execution context address for the nested call to be equal to our address. diff --git a/noir-projects/aztec-nr/aztec/src/context/public_context.nr b/noir-projects/aztec-nr/aztec/src/context/public_context.nr index 11a5aac333e..510df6b0d0b 100644 --- a/noir-projects/aztec-nr/aztec/src/context/public_context.nr +++ b/noir-projects/aztec-nr/aztec/src/context/public_context.nr @@ -117,11 +117,6 @@ impl PublicContext { } } - pub fn is_deployment(self) -> bool { - // TODO(#4738): Implement this - false - } - pub fn block_number(self) -> Field { self.inputs.public_global_variables.block_number } diff --git a/noir-projects/aztec-nr/aztec/src/history/contract_inclusion.nr b/noir-projects/aztec-nr/aztec/src/history/contract_inclusion.nr index 6cd81a277cf..7f27c5de5d8 100644 --- a/noir-projects/aztec-nr/aztec/src/history/contract_inclusion.nr +++ b/noir-projects/aztec-nr/aztec/src/history/contract_inclusion.nr @@ -1,11 +1,10 @@ use dep::protocol_types::{ - abis::{new_contract_data::NewContractData as ContractLeafPreimage}, address::{AztecAddress, EthAddress}, contract_class_id::ContractClassId, grumpkin_point::GrumpkinPoint }; use dep::std::merkle::compute_merkle_root; -use crate::{context::PrivateContext, oracle::get_membership_witness::get_contract_membership_witness}; +use crate::{context::PrivateContext}; // Proves that a contract exists at block `block_number` and returns its address. // Note: This can be used to approximate a factory pattern --> a factory contract could perform this proof and that diff --git a/noir-projects/aztec-nr/aztec/src/oracle/get_membership_witness.nr b/noir-projects/aztec-nr/aztec/src/oracle/get_membership_witness.nr index 1e82b12c91e..4c7ac8ce2ac 100644 --- a/noir-projects/aztec-nr/aztec/src/oracle/get_membership_witness.nr +++ b/noir-projects/aztec-nr/aztec/src/oracle/get_membership_witness.nr @@ -1,8 +1,7 @@ -use dep::protocol_types::{constants::{ARCHIVE_HEIGHT, CONTRACT_TREE_HEIGHT, NOTE_HASH_TREE_HEIGHT}, utils::arr_copy_slice}; +use dep::protocol_types::{constants::{ARCHIVE_HEIGHT, NOTE_HASH_TREE_HEIGHT}, utils::arr_copy_slice}; -global CONTRACT_TREE_ID = 0; -global NOTE_HASH_TREE_ID = 2; -global ARCHIVE_TREE_ID = 5; +global NOTE_HASH_TREE_ID = 1; +global ARCHIVE_TREE_ID = 4; // Note: We have M here because we need to somehow set it when calling get_membership_witness function and one way to // do it is to set M here and then set type of the return param, e.g.: @@ -32,13 +31,6 @@ unconstrained pub fn get_membership_witness( MembershipWitness { index: fields[0], path: arr_copy_slice(fields, [0; N], 1) } } -unconstrained pub fn get_contract_membership_witness( - block_number: u32, - leaf_value: Field -) -> MembershipWitness { - get_membership_witness(block_number, CONTRACT_TREE_ID, leaf_value) -} - // Note: get_nullifier_membership_witness function is implemented in get_nullifier_membership_witness.nr unconstrained pub fn get_note_hash_membership_witness( diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/common.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/common.nr index 49076a1a403..4313375bed7 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/common.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/common.nr @@ -3,14 +3,14 @@ use dep::types::{ abis::{ call_request::CallRequest, accumulated_data::CombinedAccumulatedData, function_data::FunctionData, kernel_circuit_public_inputs::PrivateKernelCircuitPublicInputsBuilder, - membership_witness::NoteHashReadRequestMembershipWitness, new_contract_data::NewContractData, + membership_witness::NoteHashReadRequestMembershipWitness, private_circuit_public_inputs::PrivateCircuitPublicInputs, private_kernel::private_call_data::PrivateCallData, kernel_data::{PrivateKernelInnerData, PrivateKernelTailData}, side_effect::{SideEffect, SideEffectLinkedToNoteHash} }, address::{AztecAddress, EthAddress, PartialAddress, compute_initialization_hash}, - contract_class_id::ContractClassId, contrakt::contract_deployment_data::ContractDeploymentData, + contract_class_id::ContractClassId, constants::{ MAX_NEW_NULLIFIERS_PER_CALL, MAX_NEW_L2_TO_L1_MSGS_PER_CALL, MAX_NEW_NOTE_HASHES_PER_CALL, MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL, MAX_NOTE_HASH_READ_REQUESTS_PER_CALL, @@ -19,9 +19,8 @@ use dep::types::{ grumpkin_private_key::GrumpkinPrivateKey, hash::{ compute_constructor_hash, compute_l2_to_l1_hash, compute_logs_hash, - compute_new_contract_address_hash, contract_tree_root_from_siblings, - function_tree_root_from_siblings, pedersen_hash, private_functions_root_from_siblings, - root_from_sibling_path, silo_note_hash, silo_nullifier, + compute_new_contract_address_hash, function_tree_root_from_siblings, pedersen_hash, + private_functions_root_from_siblings, root_from_sibling_path, silo_note_hash, silo_nullifier, stdlib_recursion_verification_key_compress_native_vk }, utils::{arrays::{array_length, array_to_bounded_vec, validate_array}}, @@ -108,8 +107,6 @@ pub fn initialize_end_values( public_inputs.end.encrypted_log_preimages_length = start.encrypted_log_preimages_length; public_inputs.end.unencrypted_log_preimages_length = start.unencrypted_log_preimages_length; - - public_inputs.end.new_contracts = array_to_bounded_vec(start.new_contracts); } fn perform_static_call_checks(private_call: PrivateCallData) { @@ -300,95 +297,43 @@ pub fn update_end_values( public_inputs.end.unencrypted_log_preimages_length = public_inputs.end.unencrypted_log_preimages_length + private_call_public_inputs.unencrypted_log_preimages_length; } -pub fn contract_logic( - private_call: PrivateCallData, - public_inputs: &mut PrivateKernelCircuitPublicInputsBuilder, - contract_dep_data: ContractDeploymentData, - function_data: FunctionData -) { - let private_call_public_inputs = private_call.call_stack_item.public_inputs; - let portal_contract_address = private_call.portal_contract_address; +pub fn contract_logic(private_call: PrivateCallData) { let contract_address = private_call.call_stack_item.contract_address; // TODO(https://github.com/AztecProtocol/aztec-packages/issues/3062): Why is this using a hash function from the stdlib::recursion namespace let private_call_vk_hash = stdlib_recursion_verification_key_compress_native_vk(private_call.vk); - let is_contract_deployment = public_inputs.constants.tx_context.is_contract_deployment_tx; - - // input storage contract address must be 0 if its a constructor call and non-zero otherwise - if is_contract_deployment { - let computed_initialization_hash = compute_initialization_hash( - function_data.selector.to_field(), - private_call_public_inputs.args_hash - ); - - assert( - computed_initialization_hash == contract_dep_data.initialization_hash, "initialization hash does not match computed one" - ); - - let new_contract_address = AztecAddress::compute_from_public_key( - contract_dep_data.public_key, - contract_dep_data.contract_class_id, - contract_dep_data.contract_address_salt, - contract_dep_data.initialization_hash, - contract_dep_data.portal_contract_address - ); - - let new_contract_data = NewContractData { - contract_address: new_contract_address, - portal_contract_address, - contract_class_id: contract_dep_data.contract_class_id - }; - public_inputs.end.new_contracts.push(new_contract_data); - - // TODO(https://github.com/AztecProtocol/aztec-packages/issues/3062) VKs are mocked out for now - // assert(contract_dep_data.constructor_vk_hash == private_call_vk_hash, "constructor_vk_hash doesn't match private_call_vk_hash"); - - assert( - contract_address.eq(new_contract_address), "contract address supplied does not match derived address" - ); + assert(!contract_address.is_zero(), "contract address cannot be zero"); + // std::println(f"contract_address={contract_address}"); + // std::println(f"private_call_vk_hash={private_call_vk_hash}"); - let new_contract_address_nullifier = compute_new_contract_address_hash(new_contract_address); - - public_inputs.end.new_nullifiers.push( - SideEffectLinkedToNoteHash { value: new_contract_address_nullifier, note_hash: 0, counter: 1 } - ); - } else { - // non-contract deployments must specify contract address being interacted with - assert(!contract_address.is_zero(), "contract address cannot be zero"); - // std::println(f"contract_address={contract_address}"); - // std::println(f"private_call_vk_hash={private_call_vk_hash}"); - - // Recompute the contract class id - let computed_private_functions_root = private_functions_root_from_siblings( - private_call.call_stack_item.function_data.selector, - private_call_vk_hash, - private_call.function_leaf_membership_witness.leaf_index, - private_call.function_leaf_membership_witness.sibling_path - ); - // std::println(f"computed_private_functions_root={computed_private_functions_root}"); + // Recompute the contract class id + let computed_private_functions_root = private_functions_root_from_siblings( + private_call.call_stack_item.function_data.selector, + private_call_vk_hash, + private_call.function_leaf_membership_witness.leaf_index, + private_call.function_leaf_membership_witness.sibling_path + ); + // std::println(f"computed_private_functions_root={computed_private_functions_root}"); - let computed_contract_class_id = ContractClassId::compute( - private_call.contract_class_artifact_hash, - computed_private_functions_root, - private_call.contract_class_public_bytecode_commitment - ); - // std::println(f"computed_contract_class_id={computed_contract_class_id}"); + let computed_contract_class_id = ContractClassId::compute( + private_call.contract_class_artifact_hash, + computed_private_functions_root, + private_call.contract_class_public_bytecode_commitment + ); + // std::println(f"computed_contract_class_id={computed_contract_class_id}"); - // Recompute contract address using the preimage which includes the class_id - let computed_partial_address = PartialAddress::compute_from_salted_initialization_hash( - computed_contract_class_id, - private_call.salted_initialization_hash - ); - // std::println(f"computed_partial_address={computed_partial_address}"); + // Recompute contract address using the preimage which includes the class_id + let computed_partial_address = PartialAddress::compute_from_salted_initialization_hash( + computed_contract_class_id, + private_call.salted_initialization_hash + ); + // std::println(f"computed_partial_address={computed_partial_address}"); - let computed_address = AztecAddress::compute(private_call.public_keys_hash, computed_partial_address); - // std::println(f"computed_address={computed_address}"); + let computed_address = AztecAddress::compute(private_call.public_keys_hash, computed_partial_address); + // std::println(f"computed_address={computed_address}"); - assert( - computed_address.eq(contract_address), "computed contract address does not match expected one" - ); - } + assert(computed_address.eq(contract_address), "computed contract address does not match expected one"); } pub fn validate_previous_kernel_values(end: CombinedAccumulatedData) { diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_init.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_init.nr index 6da43c3f9ba..b94c09f3000 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_init.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_init.nr @@ -100,12 +100,7 @@ impl PrivateKernelInitCircuitPrivateInputs { self.update_end_values(&mut public_inputs); common::update_end_values(self.private_call, &mut public_inputs); - common::contract_logic( - self.private_call, - &mut public_inputs, - self.tx_request.tx_context.contract_deployment_data, - self.tx_request.function_data - ); + common::contract_logic(self.private_call); // TODO(David): What previous kernel proof are we talking about, since this is private-kernel-init let (is_previous_state_valid, updated_aggregation_object) = verify_previous_kernel_state(public_inputs.aggregation_object, self.private_call.proof); @@ -142,15 +137,7 @@ mod tests { impl PrivateKernelInitInputsBuilder { pub fn new() -> Self { - PrivateKernelInitInputsBuilder::new_with_config(false) - } - - pub fn new_constructor() -> Self { - PrivateKernelInitInputsBuilder::new_with_config(true) - } - - fn new_with_config(is_constructor: bool) -> Self { - let private_call = PrivateCallDataBuilder::new(is_constructor); + let private_call = PrivateCallDataBuilder::new(); let tx_request = private_call.build_tx_request(); PrivateKernelInitInputsBuilder { tx_request, private_call } @@ -167,33 +154,6 @@ mod tests { } } - pub fn validate_deployed_contract_address(tx_request: TxRequest, public_inputs: PrivateKernelInnerCircuitPublicInputs) { - assert_eq(public_inputs.end.new_contracts.len(), 1); - let cdd = tx_request.tx_context.contract_deployment_data; - - let computed_initialization_hash = compute_initialization_hash( - tx_request.function_data.selector.to_field(), - tx_request.args_hash - ); - assert( - computed_initialization_hash == cdd.initialization_hash, "initialization hash does not match computed one" - ); - let contract_address = AztecAddress::compute_from_public_key( - cdd.public_key, - cdd.contract_class_id, - cdd.contract_address_salt, - cdd.initialization_hash, - cdd.portal_contract_address - ); - assert(public_inputs.end.new_contracts[0].contract_address.eq(contract_address)); - } - - pub fn validate_no_new_deployed_contract(public_inputs: PrivateKernelInnerCircuitPublicInputs) { - for new_contract in public_inputs.end.new_contracts { - assert(new_contract.is_empty()); - } - } - #[test] fn deposit() { let mut builder = PrivateKernelInitInputsBuilder::new(); @@ -208,8 +168,6 @@ mod tests { let public_inputs = builder.execute(); - validate_no_new_deployed_contract(public_inputs); - // Check the first nullifier is hash of the signed tx request let tx_hash = builder.tx_request.hash(); assert_eq(public_inputs.end.new_nullifiers[0].value, tx_hash); @@ -226,27 +184,9 @@ mod tests { assert_eq(public_inputs.end.unencrypted_logs_hash, expected_unencrypted_logs_hash); } - #[test] - fn basic_contract_deployment() { - let builder = PrivateKernelInitInputsBuilder::new_constructor(); - - let public_inputs = builder.execute(); - - validate_deployed_contract_address(builder.tx_request, public_inputs); - - // Since there are no logs, log preimages length should be 0 and both logs hashes should be a sha256 hash of 2 zero - // values - assert_eq(public_inputs.end.encrypted_log_preimages_length, 0); - assert_eq(public_inputs.end.unencrypted_log_preimages_length, 0); - - let expected_logs_hash = compute_logs_hash([0, 0], [0, 0]); - assert_eq(public_inputs.end.encrypted_logs_hash, expected_logs_hash); - assert_eq(public_inputs.end.unencrypted_logs_hash, expected_logs_hash); - } - #[test(should_fail_with = "invalid array")] fn input_validation_malformed_arrays_return_values() { - let mut builder = PrivateKernelInitInputsBuilder::new_constructor(); + let mut builder = PrivateKernelInitInputsBuilder::new(); builder.private_call.public_inputs.return_values.extend_from_array([0, 9123]); @@ -255,7 +195,7 @@ mod tests { #[test(should_fail_with = "invalid array")] fn input_validation_malformed_arrays_note_hash_read_requests() { - let mut builder = PrivateKernelInitInputsBuilder::new_constructor(); + let mut builder = PrivateKernelInitInputsBuilder::new(); builder.private_call.public_inputs.note_hash_read_requests.extend_from_array( [ @@ -269,7 +209,7 @@ mod tests { #[test(should_fail_with = "invalid array")] fn input_validation_malformed_arrays_commitments() { - let mut builder = PrivateKernelInitInputsBuilder::new_constructor(); + let mut builder = PrivateKernelInitInputsBuilder::new(); builder.private_call.public_inputs.new_note_hashes.extend_from_array( [ @@ -283,7 +223,7 @@ mod tests { #[test(should_fail_with = "invalid array")] fn input_validation_malformed_arrays_nullifiers() { - let mut builder = PrivateKernelInitInputsBuilder::new_constructor(); + let mut builder = PrivateKernelInitInputsBuilder::new(); builder.private_call.public_inputs.new_nullifiers.extend_from_array( [ @@ -297,7 +237,7 @@ mod tests { #[test(should_fail_with = "invalid array")] fn input_validation_malformed_arrays_private_call_stack() { - let mut builder = PrivateKernelInitInputsBuilder::new_constructor(); + let mut builder = PrivateKernelInitInputsBuilder::new(); builder.private_call.public_inputs.private_call_stack_hashes.extend_from_array([0, 9123]); @@ -306,7 +246,7 @@ mod tests { #[test(should_fail_with = "invalid array")] fn input_validation_malformed_arrays_public_call_stack() { - let mut builder = PrivateKernelInitInputsBuilder::new_constructor(); + let mut builder = PrivateKernelInitInputsBuilder::new(); builder.private_call.public_inputs.public_call_stack_hashes.extend_from_array([0, 9123]); @@ -315,7 +255,7 @@ mod tests { #[test(should_fail_with = "invalid array")] fn input_validation_malformed_arrays_new_l2_to_l1_msgs() { - let mut builder = PrivateKernelInitInputsBuilder::new_constructor(); + let mut builder = PrivateKernelInitInputsBuilder::new(); builder.private_call.public_inputs.new_l2_to_l1_msgs.extend_from_array( [ @@ -327,51 +267,9 @@ mod tests { builder.failed(); } - #[test(should_fail_with="contract address supplied does not match derived address")] - fn contract_deployment_incorrect_contract_address_fails() { - let mut builder = PrivateKernelInitInputsBuilder::new_constructor(); - - let random_address = AztecAddress::from_field(27); - builder.private_call.public_inputs.call_context.storage_contract_address = random_address; - builder.tx_request.origin = random_address; - builder.private_call.contract_address = random_address; - - builder.failed(); - } - - #[test(should_fail_with="origin address does not match call stack items contract address")] - fn contract_deployment_contract_address_mismatch_fails() { - let mut builder = PrivateKernelInitInputsBuilder::new_constructor(); - - let random_address = AztecAddress::from_field(27); - builder.private_call.public_inputs.call_context.storage_contract_address = random_address; - builder.private_call.contract_address = random_address; - - builder.failed(); - } - - #[test(should_fail_with="tx_request function_data must match call_stack_item function_data")] - fn contract_deployment_function_data_mismatch_fails() { - let mut builder = PrivateKernelInitInputsBuilder::new_constructor(); - - builder.tx_request.function_data.selector.inner = 27; - - builder.failed(); - } - - #[test(should_fail_with="noir function args passed to tx_request must match args in the call_stack_item")] - fn contract_deployment_args_hash_mismatch_fails() { - let mut builder = PrivateKernelInitInputsBuilder::new_constructor(); - - // Modify the args hash in tx request. - builder.tx_request.args_hash = 29; - - builder.failed(); - } - #[test(should_fail_with="Private kernel circuit can only execute a private function")] fn private_function_is_private_false_fails() { - let mut builder = PrivateKernelInitInputsBuilder::new_constructor(); + let mut builder = PrivateKernelInitInputsBuilder::new(); // Set is_private in function data to false. builder.private_call.function_data.is_private = false; @@ -381,7 +279,7 @@ mod tests { #[test(should_fail_with="Cannot call an internal function directly")] fn private_function_is_internal_fails() { - let mut builder = PrivateKernelInitInputsBuilder::new_constructor(); + let mut builder = PrivateKernelInitInputsBuilder::new(); builder.private_call.function_data.is_internal = true; @@ -390,7 +288,7 @@ mod tests { #[test(should_fail_with="Users cannot make a static call")] fn private_function_static_call_fails() { - let mut builder = PrivateKernelInitInputsBuilder::new_constructor(); + let mut builder = PrivateKernelInitInputsBuilder::new(); // Set is_static_call to true. builder.private_call.public_inputs.call_context.is_static_call = true; @@ -400,7 +298,7 @@ mod tests { #[test(should_fail_with="Users cannot make a delegatecall")] fn private_function_delegate_call_fails() { - let mut builder = PrivateKernelInitInputsBuilder::new_constructor(); + let mut builder = PrivateKernelInitInputsBuilder::new(); // Set is_delegate_call to true. builder.private_call.public_inputs.call_context.is_delegate_call = true; @@ -410,7 +308,7 @@ mod tests { #[test(should_fail_with="Storage contract address must be that of the called contract")] fn private_function_incorrect_storage_contract_address_fails() { - let mut builder = PrivateKernelInitInputsBuilder::new_constructor(); + let mut builder = PrivateKernelInitInputsBuilder::new(); // Set the storage_contract_address to a random scalar. builder.private_call.public_inputs.call_context.storage_contract_address = AztecAddress::from_field(356); @@ -508,7 +406,6 @@ mod tests { let public_inputs = builder.execute(); - validate_no_new_deployed_contract(public_inputs); // Check the first nullifier is hash of the signed tx request assert_eq(public_inputs.end.new_nullifiers[0].value, builder.tx_request.hash()); @@ -524,7 +421,6 @@ mod tests { let public_inputs = builder.execute(); - validate_no_new_deployed_contract(public_inputs); // Check the first nullifier is hash of the signed tx request assert_eq(public_inputs.end.new_nullifiers[0].value, builder.tx_request.hash()); @@ -540,7 +436,6 @@ mod tests { let public_inputs = builder.execute(); - validate_no_new_deployed_contract(public_inputs); // Check the first nullifier is hash of the signed tx request assert_eq(public_inputs.end.new_nullifiers[0].value, builder.tx_request.hash()); @@ -556,7 +451,6 @@ mod tests { let public_inputs = builder.execute(); - validate_no_new_deployed_contract(public_inputs); // Check the first nullifier is hash of the signed tx request assert_eq(public_inputs.end.new_nullifiers[0].value, builder.tx_request.hash()); @@ -572,7 +466,6 @@ mod tests { let public_inputs = builder.execute(); - validate_no_new_deployed_contract(public_inputs); // Check the first nullifier is hash of the signed tx request assert_eq(public_inputs.end.new_nullifiers[0].value, builder.tx_request.hash()); @@ -589,7 +482,6 @@ mod tests { let public_inputs = builder.execute(); - validate_no_new_deployed_contract(public_inputs); // Check the first nullifier is hash of the signed tx request assert_eq(public_inputs.end.new_nullifiers[0].value, builder.tx_request.hash()); @@ -605,7 +497,6 @@ mod tests { let public_inputs = builder.execute(); - validate_no_new_deployed_contract(public_inputs); // Check the first nullifier is hash of the signed tx request assert_eq(public_inputs.end.new_nullifiers[0].value, builder.tx_request.hash()); @@ -617,7 +508,7 @@ mod tests { #[test] fn propagate_nullifier_read_requests() { - let mut builder = PrivateKernelInitInputsBuilder::new_constructor(); + let mut builder = PrivateKernelInitInputsBuilder::new(); let storage_contract_address = builder.private_call.public_inputs.call_context.storage_contract_address; let request_0 = ReadRequest { value: 123, counter: 4567 }; @@ -643,7 +534,7 @@ mod tests { #[test] fn propagate_nullifier_key_validation_requests() { - let mut builder = PrivateKernelInitInputsBuilder::new_constructor(); + let mut builder = PrivateKernelInitInputsBuilder::new(); let request = NullifierKeyValidationRequest { public_key: GrumpkinPoint { x: 1, y: 2 }, secret_key: GrumpkinPrivateKey { high: 3, low: 4 } }; builder.private_call.public_inputs.nullifier_key_validation_requests.push(request); diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_inner.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_inner.nr index 4b2fd76d3b1..0ed47ed052b 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_inner.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_inner.nr @@ -20,15 +20,6 @@ impl PrivateKernelInnerCircuitPrivateInputs { common::validate_call_against_request(self.private_call, call_request); } - fn validate_contract_tree_root(self) { - let purported_contract_tree_root = self.private_call.call_stack_item.public_inputs.historical_header.state.partial.contract_tree.root; - let previous_kernel_contract_tree_root = self.previous_kernel.public_inputs.constants.historical_header.state.partial.contract_tree.root; - - assert( - purported_contract_tree_root == previous_kernel_contract_tree_root, "purported_contract_tree_root does not match previous_kernel_contract_tree_root" - ); - } - fn validate_inputs(self) { let this_call_stack_item = self.private_call.call_stack_item; let function_data = this_call_stack_item.function_data; @@ -63,17 +54,7 @@ impl PrivateKernelInnerCircuitPrivateInputs { //TODO(David): feels like update_end_values should happen later common::update_end_values(self.private_call, &mut public_inputs); - // ensure that historical/purported contract tree root matches the one in previous kernel - self.validate_contract_tree_root(); - - let this_call_stack_item = self.private_call.call_stack_item; - - common::contract_logic( - self.private_call, - &mut public_inputs, - this_call_stack_item.public_inputs.contract_deployment_data, - this_call_stack_item.function_data - ); + common::contract_logic(self.private_call); let (is_previous_state_valid, updated_aggregation_object) = verify_previous_kernel_state(public_inputs.aggregation_object, self.private_call.proof); assert(is_previous_state_valid); @@ -105,7 +86,7 @@ mod tests { impl PrivateKernelInnerInputsBuilder { pub fn new() -> Self { let previous_kernel = PreviousKernelDataBuilder::new(false); - let private_call = PrivateCallDataBuilder::new(false); + let private_call = PrivateCallDataBuilder::new(); PrivateKernelInnerInputsBuilder { previous_kernel, private_call } } @@ -159,17 +140,6 @@ mod tests { builder.failed(); } - #[test(should_fail_with = "purported_contract_tree_root does not match previous_kernel_contract_tree_root")] - fn private_function_incorrect_contract_tree_root_fails() { - let mut builder = PrivateKernelInnerInputsBuilder::new(); - - // Set historical contract tree root to a wrong value (the correct value + 1). - let contract_tree_root = builder.previous_kernel.historical_header.state.partial.contract_tree.root; - builder.previous_kernel.historical_header.state.partial.contract_tree.root = contract_tree_root + 1; - - builder.failed(); - } - #[test(should_fail_with="computed contract address does not match expected one")] fn private_function_incorrect_function_leaf_index_fails() { let mut builder = PrivateKernelInnerInputsBuilder::new(); diff --git a/noir-projects/noir-protocol-circuits/crates/public-kernel-lib/src/common.nr b/noir-projects/noir-protocol-circuits/crates/public-kernel-lib/src/common.nr index d0a97da56de..7df1fac5ffa 100644 --- a/noir-projects/noir-protocol-circuits/crates/public-kernel-lib/src/common.nr +++ b/noir-projects/noir-protocol-circuits/crates/public-kernel-lib/src/common.nr @@ -2,10 +2,9 @@ use dep::types::{ abis::{ call_request::CallRequest, public_call_stack_item::PublicCallStackItem, kernel_circuit_public_inputs::PublicKernelCircuitPublicInputsBuilder, - new_contract_data::NewContractData, kernel_data::{PrivateKernelTailData, PublicKernelData}, - public_call_data::PublicCallData, public_data_read::PublicDataRead, - public_data_update_request::PublicDataUpdateRequest, read_request::ReadRequestContext, - side_effect::{SideEffect, SideEffectLinkedToNoteHash} + kernel_data::{PrivateKernelTailData, PublicKernelData}, public_call_data::PublicCallData, + public_data_read::PublicDataRead, public_data_update_request::PublicDataUpdateRequest, + read_request::ReadRequestContext, side_effect::{SideEffect, SideEffectLinkedToNoteHash} }, address::AztecAddress, contrakt::{storage_read::StorageRead, storage_update_request::StorageUpdateRequest}, @@ -25,9 +24,6 @@ use crate::hash::{compute_public_data_tree_index, compute_public_data_tree_value pub fn validate_inputs(public_call: PublicCallData) { // Validates commons inputs for all type of kernel inputs let this_call_stack_item: PublicCallStackItem = public_call.call_stack_item; - assert( - this_call_stack_item.public_inputs.call_context.is_contract_deployment == false, "Contract deployment cannot be a public function" - ); assert( !this_call_stack_item.contract_address.eq(AztecAddress::zero()), "Contract address cannot be zero" ); @@ -66,7 +62,6 @@ pub fn initialize_emitted_end_values( circuit_outputs.end.unencrypted_log_preimages_length = start.unencrypted_log_preimages_length; circuit_outputs.end.encrypted_logs_hash = start.encrypted_logs_hash; circuit_outputs.end.encrypted_log_preimages_length = start.encrypted_log_preimages_length; - circuit_outputs.end.new_contracts = array_to_bounded_vec(previous_kernel.public_inputs.end.new_contracts); } let start_non_revertible = previous_kernel.public_inputs.end_non_revertible; diff --git a/noir-projects/noir-protocol-circuits/crates/public-kernel-lib/src/public_kernel_app_logic.nr b/noir-projects/noir-protocol-circuits/crates/public-kernel-lib/src/public_kernel_app_logic.nr index 810e32dcf37..546e026f156 100644 --- a/noir-projects/noir-protocol-circuits/crates/public-kernel-lib/src/public_kernel_app_logic.nr +++ b/noir-projects/noir-protocol-circuits/crates/public-kernel-lib/src/public_kernel_app_logic.nr @@ -68,14 +68,12 @@ mod tests { use crate::{ public_kernel_app_logic::PublicKernelAppLogicCircuitPrivateInputs, utils::{ - assert_eq_call_requests, assert_eq_new_contracts, assert_eq_public_data_reads, - assert_eq_public_data_update_requests, compute_public_data_reads, - compute_public_data_update_requests + assert_eq_call_requests, assert_eq_public_data_reads, assert_eq_public_data_update_requests, + compute_public_data_reads, compute_public_data_update_requests } }; use dep::types::{ abis::{ - new_contract_data::NewContractData, kernel_circuit_public_inputs::PublicKernelCircuitPublicInputs, public_data_read::PublicDataRead, public_data_update_request::PublicDataUpdateRequest, side_effect::{SideEffect, SideEffectLinkedToNoteHash} @@ -398,14 +396,6 @@ mod tests { #[test] fn circuit_outputs_should_be_correctly_populated_with_previous_private_kernel() { let mut builder = PublicKernelAppLogicCircuitPrivateInputsBuilder::new(); - let new_contracts = [ - NewContractData { - contract_address: AztecAddress::from_field(123), - portal_contract_address: EthAddress::from_field(456), - contract_class_id: ContractClassId::from_field(78) - } - ]; - builder.previous_kernel.end.new_contracts.extend_from_array(new_contracts); builder.public_call.append_public_call_requests_for_regular_calls(2); let storage = builder.public_call.public_call_stack.storage; @@ -421,7 +411,6 @@ mod tests { let public_inputs = builder.execute(); - assert_eq_new_contracts(public_inputs.end.new_contracts, new_contracts); assert_eq_call_requests(public_inputs.end.private_call_stack, []); assert_eq_call_requests(public_inputs.end.public_call_stack, public_call_stack); assert_eq_public_data_update_requests( diff --git a/noir-projects/noir-protocol-circuits/crates/public-kernel-lib/src/public_kernel_setup.nr b/noir-projects/noir-protocol-circuits/crates/public-kernel-lib/src/public_kernel_setup.nr index 539eff98fe9..a08b158dd3f 100644 --- a/noir-projects/noir-protocol-circuits/crates/public-kernel-lib/src/public_kernel_setup.nr +++ b/noir-projects/noir-protocol-circuits/crates/public-kernel-lib/src/public_kernel_setup.nr @@ -70,16 +70,14 @@ mod tests { use crate::{ public_kernel_setup::PublicKernelSetupCircuitPrivateInputs, utils::{ - assert_eq_call_requests, assert_eq_new_contracts, assert_eq_public_data_reads, - assert_eq_public_data_update_requests, compute_public_data_reads, - compute_public_data_update_requests + assert_eq_call_requests, assert_eq_public_data_reads, assert_eq_public_data_update_requests, + compute_public_data_reads, compute_public_data_update_requests } }; use dep::types::{ abis::{ call_request::CallRequest, function_selector::FunctionSelector, - kernel_circuit_public_inputs::PublicKernelCircuitPublicInputs, - new_contract_data::NewContractData, public_data_read::PublicDataRead, + kernel_circuit_public_inputs::PublicKernelCircuitPublicInputs, public_data_read::PublicDataRead, public_data_update_request::PublicDataUpdateRequest, public_call_data::PublicCallData }, address::{AztecAddress, EthAddress}, contract_class_id::ContractClassId, @@ -377,14 +375,6 @@ mod tests { #[test] fn circuit_outputs_should_be_correctly_populated_with_previous_private_kernel() { let mut builder = PublicKernelSetupCircuitPrivateInputsBuilder::new(); - let new_contracts = [ - NewContractData { - contract_address: AztecAddress::from_field(123), - portal_contract_address: EthAddress::from_field(456), - contract_class_id: ContractClassId::from_field(78) - } - ]; - builder.previous_kernel.end.new_contracts.extend_from_array(new_contracts); builder.public_call.append_public_call_requests_for_regular_calls(2); let storage = builder.public_call.public_call_stack.storage; @@ -413,7 +403,6 @@ mod tests { let public_inputs = kernel.public_kernel_setup(); - assert_eq_new_contracts(public_inputs.end.new_contracts, new_contracts); assert_eq_call_requests(public_inputs.end.private_call_stack, []); assert_eq_call_requests( public_inputs.end_non_revertible.public_call_stack, diff --git a/noir-projects/noir-protocol-circuits/crates/public-kernel-lib/src/public_kernel_teardown.nr b/noir-projects/noir-protocol-circuits/crates/public-kernel-lib/src/public_kernel_teardown.nr index ae6af32e33f..efa4111dcdf 100644 --- a/noir-projects/noir-protocol-circuits/crates/public-kernel-lib/src/public_kernel_teardown.nr +++ b/noir-projects/noir-protocol-circuits/crates/public-kernel-lib/src/public_kernel_teardown.nr @@ -66,16 +66,14 @@ mod tests { use crate::{ public_kernel_teardown::PublicKernelTeardownCircuitPrivateInputs, utils::{ - assert_eq_call_requests, assert_eq_new_contracts, assert_eq_public_data_reads, - assert_eq_public_data_update_requests, compute_public_data_reads, - compute_public_data_update_requests + assert_eq_call_requests, assert_eq_public_data_reads, assert_eq_public_data_update_requests, + compute_public_data_reads, compute_public_data_update_requests } }; use dep::types::{ abis::{ call_request::CallRequest, function_selector::FunctionSelector, - kernel_circuit_public_inputs::PublicKernelCircuitPublicInputs, - new_contract_data::NewContractData, public_data_read::PublicDataRead, + kernel_circuit_public_inputs::PublicKernelCircuitPublicInputs, public_data_read::PublicDataRead, public_data_update_request::PublicDataUpdateRequest }, address::{AztecAddress, EthAddress}, contract_class_id::ContractClassId, diff --git a/noir-projects/noir-protocol-circuits/crates/public-kernel-lib/src/utils.nr b/noir-projects/noir-protocol-circuits/crates/public-kernel-lib/src/utils.nr index 7c3fe79a05a..2cbdf5c485d 100644 --- a/noir-projects/noir-protocol-circuits/crates/public-kernel-lib/src/utils.nr +++ b/noir-projects/noir-protocol-circuits/crates/public-kernel-lib/src/utils.nr @@ -1,7 +1,7 @@ use crate::hash::{compute_public_data_tree_index, compute_public_data_tree_value}; use dep::types::{ abis::{ - call_request::CallRequest, new_contract_data::NewContractData, public_data_read::PublicDataRead, + call_request::CallRequest, public_data_read::PublicDataRead, public_data_update_request::PublicDataUpdateRequest }, address::AztecAddress, @@ -60,10 +60,3 @@ pub fn assert_eq_public_data_update_requests( ) { assert(array_eq(public_data_update_requests, expected)); } - -pub fn assert_eq_new_contracts( - new_contracts: [NewContractData; N], - expected: [NewContractData; S] -) { - assert(array_eq(new_contracts, expected)); -} diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/base_rollup_inputs.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/base_rollup_inputs.nr index 9b5f2037b1f..b554d16bc9e 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/base_rollup_inputs.nr +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/base_rollup_inputs.nr @@ -19,8 +19,7 @@ use dep::types::{ }, constants::{ NOTE_HASH_SUBTREE_SIBLING_PATH_LENGTH, NULLIFIER_SUBTREE_SIBLING_PATH_LENGTH, - CONTRACT_SUBTREE_SIBLING_PATH_LENGTH, PUBLIC_DATA_TREE_HEIGHT, MAX_NEW_CONTRACTS_PER_TX, - NOTE_HASH_SUBTREE_HEIGHT, CONTRACT_SUBTREE_HEIGHT, NUM_FIELDS_PER_SHA256, + PUBLIC_DATA_TREE_HEIGHT, NOTE_HASH_SUBTREE_HEIGHT, NUM_FIELDS_PER_SHA256, MAX_NEW_NOTE_HASHES_PER_TX, MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, MAX_PUBLIC_DATA_READS_PER_TX, MAX_NEW_NULLIFIERS_PER_TX, NUM_ENCRYPTED_LOGS_HASHES_PER_TX, MAX_NEW_L2_TO_L1_MSGS_PER_TX, NUM_UNENCRYPTED_LOGS_HASHES_PER_TX, NULLIFIER_SUBTREE_HEIGHT, NULLIFIER_TREE_HEIGHT, @@ -73,11 +72,6 @@ impl BaseRollupInputs { == self.constants.global_variables.version, "kernel version does not match the rollup version" ); - // First we compute the contract tree leaves - let contract_leaves = self.calculate_contract_leaves(); - - let contracts_tree_subroot = self.calculate_contract_subtree_root(contract_leaves); - let commitments_tree_subroot = self.calculate_commitments_subtree(); let empty_commitments_subtree_root = calculate_empty_tree_root(NOTE_HASH_SUBTREE_HEIGHT); @@ -90,16 +84,6 @@ impl BaseRollupInputs { NOTE_HASH_SUBTREE_HEIGHT as u8 ); - // Insert contract subtrees: - let empty_contracts_subtree_root = calculate_empty_tree_root(CONTRACT_SUBTREE_HEIGHT); - let end_contract_tree_snapshot = append_only_tree::insert_subtree_to_snapshot_tree( - self.start.contract_tree, - self.state_diff_hints.contract_subtree_sibling_path, - empty_contracts_subtree_root, - contracts_tree_subroot, - CONTRACT_SUBTREE_HEIGHT as u8 - ); - // Insert nullifiers: let end_nullifier_tree_snapshot = self.check_nullifier_tree_non_membership_and_insert_to_tree(); @@ -124,7 +108,6 @@ impl BaseRollupInputs { end: PartialStateReference { note_hash_tree: end_note_hash_tree_snapshot, nullifier_tree: end_nullifier_tree_snapshot, - contract_tree: end_contract_tree_snapshot, public_data_tree: end_public_data_tree_snapshot }, txs_effects_hash: tx_effects_hash, @@ -132,35 +115,6 @@ impl BaseRollupInputs { } } - fn calculate_contract_leaves(self) -> [Field; MAX_NEW_CONTRACTS_PER_TX] { - let mut contract_leaves = [0; MAX_NEW_CONTRACTS_PER_TX]; - let new_contracts = self.kernel_data.public_inputs.end.new_contracts; - - // loop over the new contracts - for i in 0..new_contracts.len() { - let leaf_preimage = new_contracts[i]; - // When there is no contract deployment, we should insert a zero leaf into the tree and ignore the - // member-ship check. This is to ensure that we don't hit "already deployed" errors when we are not - // deploying contracts. e.g., when we are only calling functions on existing contracts. - let to_push = if leaf_preimage.contract_address.to_field() == 0 { - 0 - } else { - leaf_preimage.hash() - }; - contract_leaves[i] = to_push; - } - - contract_leaves - } - - // Cpp code says calculate_contract_subtree, so I'm leaving it as is for now - fn calculate_contract_subtree_root(self, leaves: [Field; MAX_NEW_CONTRACTS_PER_TX]) -> Field { - // Silence warning for unused self, pending proper fix. - let _ = self; - assert_eq(leaves.len(), 1); - leaves[0] - } - // TODO(Kev): This should say calculate_commitments_subtree_root // Cpp code says calculate_commitments_subtree, so I'm leaving it as is for now fn calculate_commitments_subtree(self) -> Field { @@ -437,20 +391,19 @@ mod tests { abis::{ append_only_tree_snapshot::AppendOnlyTreeSnapshot, membership_witness::{ArchiveRootMembershipWitness, NullifierMembershipWitness, PublicDataMembershipWitness}, - new_contract_data::NewContractData, nullifier_leaf_preimage::NullifierLeafPreimage, - public_data_read::PublicDataRead, public_data_update_request::PublicDataUpdateRequest, + nullifier_leaf_preimage::NullifierLeafPreimage, public_data_read::PublicDataRead, + public_data_update_request::PublicDataUpdateRequest, kernel_data::{PublicKernelData, RollupKernelData}, side_effect::SideEffect, accumulated_data::CombinedAccumulatedData }, address::{AztecAddress, EthAddress}, constants::{ - CONTRACT_SUBTREE_SIBLING_PATH_LENGTH, CONTRACT_TREE_HEIGHT, CONTRACT_SUBTREE_HEIGHT, ARCHIVE_HEIGHT, MAX_PUBLIC_DATA_READS_PER_TX, MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, - MAX_NEW_NOTE_HASHES_PER_TX, MAX_NEW_NULLIFIERS_PER_TX, MAX_NEW_CONTRACTS_PER_TX, - NOTE_HASH_SUBTREE_SIBLING_PATH_LENGTH, NOTE_HASH_TREE_HEIGHT, NOTE_HASH_SUBTREE_HEIGHT, - NULLIFIER_SUBTREE_SIBLING_PATH_LENGTH, NULLIFIER_TREE_HEIGHT, NULLIFIER_SUBTREE_HEIGHT, - PUBLIC_DATA_TREE_HEIGHT, PUBLIC_DATA_SUBTREE_HEIGHT, PUBLIC_DATA_SUBTREE_SIBLING_PATH_LENGTH, - NUM_FIELDS_PER_SHA256, MAX_NEW_L2_TO_L1_MSGS_PER_TX + MAX_NEW_NOTE_HASHES_PER_TX, MAX_NEW_NULLIFIERS_PER_TX, NOTE_HASH_SUBTREE_SIBLING_PATH_LENGTH, + NOTE_HASH_TREE_HEIGHT, NOTE_HASH_SUBTREE_HEIGHT, NULLIFIER_SUBTREE_SIBLING_PATH_LENGTH, + NULLIFIER_TREE_HEIGHT, NULLIFIER_SUBTREE_HEIGHT, PUBLIC_DATA_TREE_HEIGHT, + PUBLIC_DATA_SUBTREE_HEIGHT, PUBLIC_DATA_SUBTREE_SIBLING_PATH_LENGTH, NUM_FIELDS_PER_SHA256, + MAX_NEW_L2_TO_L1_MSGS_PER_TX }, contract_class_id::ContractClassId, partial_state_reference::PartialStateReference, hash::assert_check_membership, merkle_tree::{calculate_empty_tree_root, calculate_subtree}, @@ -702,21 +655,6 @@ mod tests { next_available_leaf_index: start_nullifier_tree.get_next_available_index() as u32 }; - let start_contract_tree = NonEmptyMerkleTree::new( - self.pre_existing_contracts, - [0; CONTRACT_TREE_HEIGHT], - [0; CONTRACT_TREE_HEIGHT - 1], - [0; 1] - ); - let start_contract_tree_snapshot = AppendOnlyTreeSnapshot { - root: start_contract_tree.get_root(), - next_available_leaf_index: start_contract_tree.get_next_available_index() as u32 - }; - let contract_subtree_sibling_path = BaseRollupInputsBuilder::extract_subtree_sibling_path( - start_contract_tree.get_sibling_path(self.pre_existing_contracts.len()), - [0; CONTRACT_SUBTREE_SIBLING_PATH_LENGTH] - ); - let mut start_public_data_tree = NonEmptyMerkleTree::new( self.pre_existing_public_data.map(|preimage: PublicDataTreeLeafPreimage| preimage.hash()), [0; PUBLIC_DATA_TREE_HEIGHT], @@ -775,7 +713,6 @@ mod tests { let start = PartialStateReference { note_hash_tree: start_note_hash_tree_snapshot, nullifier_tree: start_nullifier_tree_snapshot, - contract_tree: start_contract_tree_snapshot, public_data_tree: start_public_data_tree_snapshot }; @@ -786,7 +723,6 @@ mod tests { sorted_nullifier_indexes, note_hash_subtree_sibling_path, nullifier_subtree_sibling_path, - contract_subtree_sibling_path, public_data_sibling_path }; @@ -818,75 +754,6 @@ mod tests { } } - #[test] - unconstrained fn no_new_contract_leaves() { - let outputs = BaseRollupInputsBuilder::new().execute(); - let expected_start_contract_tree_snapshot = AppendOnlyTreeSnapshot { root: test_compute_empty_root([0; CONTRACT_TREE_HEIGHT]), next_available_leaf_index: 2 }; - let expected_end_contract_tree_snapshot = AppendOnlyTreeSnapshot { root: test_compute_empty_root([0; CONTRACT_TREE_HEIGHT]), next_available_leaf_index: 3 }; - assert(outputs.start.contract_tree.eq(expected_start_contract_tree_snapshot)); - assert(outputs.end.contract_tree.eq(expected_end_contract_tree_snapshot)); - } - - #[test] - unconstrained fn contract_leaf_inserted() { - let new_contract = NewContractData { - contract_address: AztecAddress::from_field(1), - portal_contract_address: EthAddress::from_field(2), - contract_class_id: ContractClassId::from_field(3) - }; - - let mut builder = BaseRollupInputsBuilder::new(); - let mut new_contracts = builder.kernel_data.end.new_contracts; - new_contracts.push(new_contract); - builder.kernel_data.end.new_contracts = new_contracts; - let mut expected_contracts_tree = NonEmptyMerkleTree::new( - [0; 4], - [0; CONTRACT_TREE_HEIGHT], - [0; CONTRACT_TREE_HEIGHT - 2], - [0; 2] - ); - - let outputs = builder.execute(); - - let expected_start_contract_tree_snapshot = AppendOnlyTreeSnapshot { root: expected_contracts_tree.get_root(), next_available_leaf_index: 2 }; - assert(outputs.start.contract_tree.eq(expected_start_contract_tree_snapshot)); - - expected_contracts_tree.update_leaf(2, new_contract.hash()); - let expected_end_contract_tree_snapshot = AppendOnlyTreeSnapshot { root: expected_contracts_tree.get_root(), next_available_leaf_index: 3 }; - assert(outputs.end.contract_tree.eq(expected_end_contract_tree_snapshot)); - } - - #[test] - unconstrained fn contract_leaf_inserted_in_non_empty_snapshot_tree() { - let new_contract = NewContractData { - contract_address: AztecAddress::from_field(1), - portal_contract_address: EthAddress::from_field(2), - contract_class_id: ContractClassId::from_field(3) - }; - - let mut builder = BaseRollupInputsBuilder::new(); - - builder.pre_existing_contracts = [1,2]; - let mut new_contracts = builder.kernel_data.end.new_contracts; - new_contracts.push(new_contract); - builder.kernel_data.end.new_contracts = new_contracts; - let mut expected_contracts_tree = NonEmptyMerkleTree::new( - [1, 2, 0, 0], - [0; CONTRACT_TREE_HEIGHT], - [0; CONTRACT_TREE_HEIGHT - 2], - [0; 2] - ); - - let outputs = builder.execute(); - - let expected_start_contract_tree_snapshot = AppendOnlyTreeSnapshot { root: expected_contracts_tree.get_root(), next_available_leaf_index: 2 }; - assert(outputs.start.contract_tree.eq(expected_start_contract_tree_snapshot)); - - expected_contracts_tree.update_leaf(2, new_contract.hash()); - let expected_end_contract_tree_snapshot = AppendOnlyTreeSnapshot { root: expected_contracts_tree.get_root(), next_available_leaf_index: 3 }; - assert(outputs.end.contract_tree.eq(expected_end_contract_tree_snapshot)); - } - #[test] unconstrained fn new_note_hashes_tree() { let mut builder = BaseRollupInputsBuilder::new(); diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/state_diff_hints.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/state_diff_hints.nr index a15bb81021f..9c7dd03d70d 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/state_diff_hints.nr +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/state_diff_hints.nr @@ -2,8 +2,7 @@ use dep::types::{ abis::{membership_witness::NullifierMembershipWitness, nullifier_leaf_preimage::NullifierLeafPreimage}, constants::{ MAX_NEW_NULLIFIERS_PER_TX, NOTE_HASH_SUBTREE_SIBLING_PATH_LENGTH, - NULLIFIER_SUBTREE_SIBLING_PATH_LENGTH, CONTRACT_SUBTREE_SIBLING_PATH_LENGTH, - PUBLIC_DATA_SUBTREE_SIBLING_PATH_LENGTH + NULLIFIER_SUBTREE_SIBLING_PATH_LENGTH, PUBLIC_DATA_SUBTREE_SIBLING_PATH_LENGTH } }; @@ -19,6 +18,5 @@ struct StateDiffHints { // snapshots of the relevant trees are stored in partial state reference). note_hash_subtree_sibling_path: [Field; NOTE_HASH_SUBTREE_SIBLING_PATH_LENGTH], nullifier_subtree_sibling_path: [Field; NULLIFIER_SUBTREE_SIBLING_PATH_LENGTH], - contract_subtree_sibling_path: [Field; CONTRACT_SUBTREE_SIBLING_PATH_LENGTH], public_data_sibling_path: [Field; PUBLIC_DATA_SUBTREE_SIBLING_PATH_LENGTH], } diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/components.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/components.nr index aeb3b556855..63f7aff2ce1 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/components.nr +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/components.nr @@ -5,7 +5,7 @@ use dep::types::{ constants::{ NUM_FIELDS_PER_SHA256, MAX_NEW_NOTE_HASHES_PER_TX, MAX_NEW_NULLIFIERS_PER_TX, MAX_NEW_L2_TO_L1_MSGS_PER_TX, NUM_UNENCRYPTED_LOGS_HASHES_PER_TX, NUM_ENCRYPTED_LOGS_HASHES_PER_TX, - MAX_NEW_CONTRACTS_PER_TX, MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX + MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX }, utils::uint256::U256, abis::{append_only_tree_snapshot::AppendOnlyTreeSnapshot, accumulated_data::CombinedAccumulatedData} @@ -74,9 +74,6 @@ pub fn assert_prev_rollups_follow_on_from_each_other( assert( left.end.nullifier_tree.eq(right.start.nullifier_tree), "input proofs have different nullifier tree snapshots" ); - assert( - left.end.contract_tree.eq(right.start.contract_tree), "input proofs have different contract tree snapshots" - ); assert( left.end.public_data_tree.eq(right.start.public_data_tree), "input proofs have different public data tree snapshots" ); @@ -131,9 +128,9 @@ pub fn compute_txs_effects_hash(previous_rollup_data: [PreviousRollupData; 2]) - ) } -global TX_EFFECTS_HASH_FULL_FIELDS = 197; +global TX_EFFECTS_HASH_FULL_FIELDS = 194; global TX_EFFECTS_HASH_LOG_FIELDS = 4; -global TX_EFFECTS_HASH_INPUT_FIELDS = 201; // TX_EFFECTS_HASH_FULL_FIELDS + TX_EFFECTS_HASH_LOG_FIELDS +global TX_EFFECTS_HASH_INPUT_FIELDS = 198; // TX_EFFECTS_HASH_FULL_FIELDS + TX_EFFECTS_HASH_LOG_FIELDS // Computes the tx effects hash for a base rollup (a single transaction) // TODO(Alvaro): This is too slow for brillig without the array optimization @@ -181,17 +178,6 @@ pub fn compute_tx_effects_hash(combined: CombinedAccumulatedData) -> [Field; NUM } offset += MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX * 2; - let contract_leaf = combined.new_contracts[0]; - txs_effects_hash_input[offset] = contract_leaf.hash(); - - offset += MAX_NEW_CONTRACTS_PER_TX; - - let new_contracts = combined.new_contracts; - txs_effects_hash_input[offset] = new_contracts[0].contract_address.to_field(); - txs_effects_hash_input[offset + 1] = new_contracts[0].portal_contract_address.to_field(); - - offset += MAX_NEW_CONTRACTS_PER_TX * 2; - for j in 0..NUM_FIELDS_PER_SHA256 { txs_effects_hash_input[offset + j] = encryptedLogsHash[j]; } @@ -230,7 +216,6 @@ fn consistent_TX_EFFECTS_HASH_INPUT_FIELDS() { + MAX_NEW_NULLIFIERS_PER_TX + MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX * 2 + MAX_NEW_L2_TO_L1_MSGS_PER_TX - + MAX_NEW_CONTRACTS_PER_TX * 3 + NUM_ENCRYPTED_LOGS_HASHES_PER_TX * NUM_FIELDS_PER_SHA256 + NUM_UNENCRYPTED_LOGS_HASHES_PER_TX * NUM_FIELDS_PER_SHA256; assert(TX_EFFECTS_HASH_INPUT_FIELDS == expected_size, "tx effects hash input size is incorrect"); diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/merge/merge_rollup_inputs.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/merge/merge_rollup_inputs.nr index 9f094959573..f2b9e6557c2 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/merge/merge_rollup_inputs.nr +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/merge/merge_rollup_inputs.nr @@ -98,14 +98,6 @@ mod tests { let _output = inputs.merge_rollup_circuit(); } - #[test(should_fail_with="input proofs have different contract tree snapshots")] - fn previous_rollups_dont_follow_contracts() { - let mut inputs = default_merge_rollup_inputs(); - inputs.previous_rollup_data[0].base_or_merge_rollup_public_inputs.end.contract_tree.root = 0; - inputs.previous_rollup_data[1].base_or_merge_rollup_public_inputs.start.contract_tree.root = 1; - let _output = inputs.merge_rollup_circuit(); - } - #[test] fn rollup_fields_are_set_correctly() { let mut inputs = default_merge_rollup_inputs(); diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/root.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/root.nr index 0f38a84cde9..10de29dfc6c 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/root.nr +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/root.nr @@ -97,10 +97,6 @@ mod tests { outputs.header.state.partial.nullifier_tree.eq(inputs.previous_rollup_data[1].base_or_merge_rollup_public_inputs.end.nullifier_tree) ); - assert( - outputs.header.state.partial.contract_tree.eq(inputs.previous_rollup_data[1].base_or_merge_rollup_public_inputs.end.contract_tree) - ); - assert( outputs.header.state.partial.public_data_tree.eq(inputs.previous_rollup_data[1].base_or_merge_rollup_public_inputs.end.public_data_tree) ); diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/tests/previous_rollup_data.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/tests/previous_rollup_data.nr index 90e4d16bfc2..a66ed609eef 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/tests/previous_rollup_data.nr +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/tests/previous_rollup_data.nr @@ -39,23 +39,6 @@ pub fn default_previous_rollup_data() -> [PreviousRollupData; 2] { next_available_leaf_index: 2 }; - previous_rollup_data[0].base_or_merge_rollup_public_inputs.start.contract_tree = AppendOnlyTreeSnapshot { - root: 0, - next_available_leaf_index: 0 - }; - previous_rollup_data[0].base_or_merge_rollup_public_inputs.end.contract_tree = AppendOnlyTreeSnapshot { - root: 1, - next_available_leaf_index: 1 - }; - previous_rollup_data[1].base_or_merge_rollup_public_inputs.start.contract_tree = AppendOnlyTreeSnapshot { - root: 1, - next_available_leaf_index: 1 - }; - previous_rollup_data[1].base_or_merge_rollup_public_inputs.end.contract_tree = AppendOnlyTreeSnapshot { - root: 2, - next_available_leaf_index: 2 - }; - previous_rollup_data[0].base_or_merge_rollup_public_inputs.start.public_data_tree = AppendOnlyTreeSnapshot { root: 0, next_available_leaf_index: 1 diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/abis.nr b/noir-projects/noir-protocol-circuits/crates/types/src/abis.nr index 7736b8940f9..a4aac38d69b 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/abis.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/abis.nr @@ -10,9 +10,7 @@ mod global_variables; mod membership_witness; -mod new_contract_data; mod nullifier_leaf_preimage; -mod contract_leaf_preimage; mod combined_constant_data; diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/abis/accumulated_data/accumulated_revertible_data_builder.nr b/noir-projects/noir-protocol-circuits/crates/types/src/abis/accumulated_data/accumulated_revertible_data_builder.nr index 5ecd302a8a8..3c54520db42 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/abis/accumulated_data/accumulated_revertible_data_builder.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/abis/accumulated_data/accumulated_revertible_data_builder.nr @@ -4,8 +4,7 @@ use crate::{ private_accumulated_revertible_data::PrivateAccumulatedRevertibleData, public_accumulated_revertible_data::PublicAccumulatedRevertibleData }, - call_request::CallRequest, new_contract_data::NewContractData, - nullifier_key_validation_request::NullifierKeyValidationRequestContext, + call_request::CallRequest, nullifier_key_validation_request::NullifierKeyValidationRequestContext, public_data_read::PublicDataRead, public_data_update_request::PublicDataUpdateRequest, read_request::ReadRequestContext, side_effect::{SideEffect, SideEffectLinkedToNoteHash} } @@ -13,10 +12,9 @@ use crate::{ use crate::constants::{ MAX_NOTE_HASH_READ_REQUESTS_PER_TX, MAX_NULLIFIER_READ_REQUESTS_PER_TX, MAX_NULLIFIER_KEY_VALIDATION_REQUESTS_PER_TX, MAX_PRIVATE_CALL_STACK_LENGTH_PER_TX, - MAX_NEW_L2_TO_L1_MSGS_PER_TX, MAX_NEW_CONTRACTS_PER_TX, NUM_FIELDS_PER_SHA256, - MAX_REVERTIBLE_NOTE_HASHES_PER_TX, MAX_REVERTIBLE_NULLIFIERS_PER_TX, - MAX_REVERTIBLE_PUBLIC_CALL_STACK_LENGTH_PER_TX, MAX_REVERTIBLE_PUBLIC_DATA_READS_PER_TX, - MAX_REVERTIBLE_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX + MAX_NEW_L2_TO_L1_MSGS_PER_TX, NUM_FIELDS_PER_SHA256, MAX_REVERTIBLE_NOTE_HASHES_PER_TX, + MAX_REVERTIBLE_NULLIFIERS_PER_TX, MAX_REVERTIBLE_PUBLIC_CALL_STACK_LENGTH_PER_TX, + MAX_REVERTIBLE_PUBLIC_DATA_READS_PER_TX, MAX_REVERTIBLE_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX }; struct AccumulatedRevertibleDataBuilder { @@ -39,8 +37,6 @@ struct AccumulatedRevertibleDataBuilder { encrypted_log_preimages_length: Field, unencrypted_log_preimages_length: Field, - new_contracts: BoundedVec, - public_data_update_requests: BoundedVec, public_data_reads: BoundedVec, } @@ -56,8 +52,7 @@ impl AccumulatedRevertibleDataBuilder { encrypted_logs_hash: self.encrypted_logs_hash, unencrypted_logs_hash: self.unencrypted_logs_hash, encrypted_log_preimages_length: self.encrypted_log_preimages_length, - unencrypted_log_preimages_length: self.unencrypted_log_preimages_length, - new_contracts: self.new_contracts.storage + unencrypted_log_preimages_length: self.unencrypted_log_preimages_length } } @@ -75,7 +70,6 @@ impl AccumulatedRevertibleDataBuilder { unencrypted_logs_hash: self.unencrypted_logs_hash, encrypted_log_preimages_length: self.encrypted_log_preimages_length, unencrypted_log_preimages_length: self.unencrypted_log_preimages_length, - new_contracts: self.new_contracts.storage, public_data_update_requests: self.public_data_update_requests.storage, public_data_reads: self.public_data_reads.storage } diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/abis/accumulated_data/combined_accumulated_data.nr b/noir-projects/noir-protocol-circuits/crates/types/src/abis/accumulated_data/combined_accumulated_data.nr index 7ce04e9e935..bd66210b29a 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/abis/accumulated_data/combined_accumulated_data.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/abis/accumulated_data/combined_accumulated_data.nr @@ -4,7 +4,7 @@ use crate::{ public_accumulated_non_revertible_data::PublicAccumulatedNonRevertibleData, public_accumulated_revertible_data::PublicAccumulatedRevertibleData }, - call_request::CallRequest, caller_context::CallerContext, new_contract_data::NewContractData, + call_request::CallRequest, caller_context::CallerContext, nullifier_key_validation_request::NullifierKeyValidationRequestContext, public_data_read::PublicDataRead, public_data_update_request::PublicDataUpdateRequest, read_request::ReadRequestContext, side_effect::{SideEffect, SideEffectLinkedToNoteHash} @@ -14,13 +14,12 @@ use crate::constants::{ MAX_NOTE_HASH_READ_REQUESTS_PER_TX, MAX_NULLIFIER_READ_REQUESTS_PER_TX, MAX_NULLIFIER_KEY_VALIDATION_REQUESTS_PER_TX, MAX_NEW_NOTE_HASHES_PER_TX, MAX_NEW_NULLIFIERS_PER_TX, MAX_PRIVATE_CALL_STACK_LENGTH_PER_TX, MAX_PUBLIC_CALL_STACK_LENGTH_PER_TX, - MAX_NEW_L2_TO_L1_MSGS_PER_TX, MAX_NEW_CONTRACTS_PER_TX, MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, - MAX_PUBLIC_DATA_READS_PER_TX, NUM_FIELDS_PER_SHA256, MAX_NON_REVERTIBLE_NOTE_HASHES_PER_TX, - MAX_NON_REVERTIBLE_NULLIFIERS_PER_TX, MAX_NON_REVERTIBLE_PUBLIC_CALL_STACK_LENGTH_PER_TX, - MAX_REVERTIBLE_NOTE_HASHES_PER_TX, MAX_REVERTIBLE_NULLIFIERS_PER_TX, - MAX_REVERTIBLE_PUBLIC_CALL_STACK_LENGTH_PER_TX, MAX_REVERTIBLE_PUBLIC_DATA_READS_PER_TX, - MAX_REVERTIBLE_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, MAX_NON_REVERTIBLE_PUBLIC_DATA_READS_PER_TX, - MAX_NON_REVERTIBLE_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX + MAX_NEW_L2_TO_L1_MSGS_PER_TX, MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, MAX_PUBLIC_DATA_READS_PER_TX, + NUM_FIELDS_PER_SHA256, MAX_NON_REVERTIBLE_NOTE_HASHES_PER_TX, MAX_NON_REVERTIBLE_NULLIFIERS_PER_TX, + MAX_NON_REVERTIBLE_PUBLIC_CALL_STACK_LENGTH_PER_TX, MAX_REVERTIBLE_NOTE_HASHES_PER_TX, + MAX_REVERTIBLE_NULLIFIERS_PER_TX, MAX_REVERTIBLE_PUBLIC_CALL_STACK_LENGTH_PER_TX, + MAX_REVERTIBLE_PUBLIC_DATA_READS_PER_TX, MAX_REVERTIBLE_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, + MAX_NON_REVERTIBLE_PUBLIC_DATA_READS_PER_TX, MAX_NON_REVERTIBLE_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX }; use dep::std::unsafe; @@ -48,8 +47,6 @@ struct CombinedAccumulatedData { encrypted_log_preimages_length: Field, unencrypted_log_preimages_length: Field, - new_contracts: [NewContractData; MAX_NEW_CONTRACTS_PER_TX], - public_data_update_requests: [PublicDataUpdateRequest; MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX], public_data_reads: [PublicDataRead; MAX_PUBLIC_DATA_READS_PER_TX], @@ -81,7 +78,6 @@ impl CombinedAccumulatedData { unencrypted_logs_hash: revertible.unencrypted_logs_hash, encrypted_log_preimages_length: revertible.encrypted_log_preimages_length, unencrypted_log_preimages_length: revertible.unencrypted_log_preimages_length, - new_contracts: revertible.new_contracts, public_data_update_requests: array_concat( non_revertible.public_data_update_requests, revertible.public_data_update_requests @@ -97,7 +93,7 @@ impl CombinedAccumulatedData { mod tests { use crate::abis::{ accumulated_data::combined_accumulated_data_builder::CombinedAccumulatedDataBuilder, - call_request::CallRequest, caller_context::CallerContext, new_contract_data::NewContractData, + call_request::CallRequest, caller_context::CallerContext, nullifier_key_validation_request::NullifierKeyValidationRequestContext, public_data_read::PublicDataRead, public_data_update_request::PublicDataUpdateRequest, side_effect::{SideEffect, SideEffectLinkedToNoteHash} diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/abis/accumulated_data/combined_accumulated_data_builder.nr b/noir-projects/noir-protocol-circuits/crates/types/src/abis/accumulated_data/combined_accumulated_data_builder.nr index d949da09d6a..fedfdfe9b5f 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/abis/accumulated_data/combined_accumulated_data_builder.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/abis/accumulated_data/combined_accumulated_data_builder.nr @@ -9,8 +9,7 @@ use crate::{ public_accumulated_revertible_data::PublicAccumulatedRevertibleData, public_accumulated_non_revertible_data::PublicAccumulatedNonRevertibleData }, - call_request::CallRequest, new_contract_data::NewContractData, - nullifier_key_validation_request::NullifierKeyValidationRequestContext, + call_request::CallRequest, nullifier_key_validation_request::NullifierKeyValidationRequestContext, public_data_read::PublicDataRead, public_data_update_request::PublicDataUpdateRequest, read_request::ReadRequestContext, side_effect::{SideEffect, SideEffectLinkedToNoteHash} } @@ -19,13 +18,12 @@ use crate::constants::{ MAX_NOTE_HASH_READ_REQUESTS_PER_TX, MAX_NULLIFIER_READ_REQUESTS_PER_TX, MAX_NULLIFIER_KEY_VALIDATION_REQUESTS_PER_TX, MAX_NEW_NOTE_HASHES_PER_TX, MAX_NEW_NULLIFIERS_PER_TX, MAX_PRIVATE_CALL_STACK_LENGTH_PER_TX, MAX_PUBLIC_CALL_STACK_LENGTH_PER_TX, - MAX_NEW_L2_TO_L1_MSGS_PER_TX, MAX_NEW_CONTRACTS_PER_TX, MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, - MAX_PUBLIC_DATA_READS_PER_TX, NUM_FIELDS_PER_SHA256, MAX_NON_REVERTIBLE_NOTE_HASHES_PER_TX, - MAX_NON_REVERTIBLE_NULLIFIERS_PER_TX, MAX_NON_REVERTIBLE_PUBLIC_CALL_STACK_LENGTH_PER_TX, - MAX_REVERTIBLE_NOTE_HASHES_PER_TX, MAX_REVERTIBLE_NULLIFIERS_PER_TX, - MAX_REVERTIBLE_PUBLIC_CALL_STACK_LENGTH_PER_TX, MAX_REVERTIBLE_PUBLIC_DATA_READS_PER_TX, - MAX_REVERTIBLE_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, MAX_NON_REVERTIBLE_PUBLIC_DATA_READS_PER_TX, - MAX_NON_REVERTIBLE_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX + MAX_NEW_L2_TO_L1_MSGS_PER_TX, MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, MAX_PUBLIC_DATA_READS_PER_TX, + NUM_FIELDS_PER_SHA256, MAX_NON_REVERTIBLE_NOTE_HASHES_PER_TX, MAX_NON_REVERTIBLE_NULLIFIERS_PER_TX, + MAX_NON_REVERTIBLE_PUBLIC_CALL_STACK_LENGTH_PER_TX, MAX_REVERTIBLE_NOTE_HASHES_PER_TX, + MAX_REVERTIBLE_NULLIFIERS_PER_TX, MAX_REVERTIBLE_PUBLIC_CALL_STACK_LENGTH_PER_TX, + MAX_REVERTIBLE_PUBLIC_DATA_READS_PER_TX, MAX_REVERTIBLE_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, + MAX_NON_REVERTIBLE_PUBLIC_DATA_READS_PER_TX, MAX_NON_REVERTIBLE_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX }; use dep::std::unsafe; @@ -53,8 +51,6 @@ struct CombinedAccumulatedDataBuilder { encrypted_log_preimages_length: Field, unencrypted_log_preimages_length: Field, - new_contracts: BoundedVec, - public_data_update_requests: BoundedVec, public_data_reads: BoundedVec, @@ -83,7 +79,6 @@ impl CombinedAccumulatedDataBuilder { unencrypted_logs_hash: revertible.unencrypted_logs_hash, encrypted_log_preimages_length: revertible.encrypted_log_preimages_length, unencrypted_log_preimages_length: revertible.unencrypted_log_preimages_length, - new_contracts: array_to_bounded_vec(revertible.new_contracts), public_data_update_requests: array_to_bounded_vec( array_concat( non_revertible.public_data_update_requests, @@ -113,7 +108,6 @@ impl CombinedAccumulatedDataBuilder { unencrypted_logs_hash: self.unencrypted_logs_hash, encrypted_log_preimages_length: self.encrypted_log_preimages_length, unencrypted_log_preimages_length: self.unencrypted_log_preimages_length, - new_contracts: self.new_contracts.storage, public_data_update_requests: self.public_data_update_requests.storage, public_data_reads: self.public_data_reads.storage } @@ -129,8 +123,7 @@ impl CombinedAccumulatedDataBuilder { encrypted_logs_hash: self.encrypted_logs_hash, unencrypted_logs_hash: self.unencrypted_logs_hash, encrypted_log_preimages_length: self.encrypted_log_preimages_length, - unencrypted_log_preimages_length: self.unencrypted_log_preimages_length, - new_contracts: self.new_contracts.storage + unencrypted_log_preimages_length: self.unencrypted_log_preimages_length } } @@ -148,7 +141,6 @@ impl CombinedAccumulatedDataBuilder { unencrypted_logs_hash: self.unencrypted_logs_hash, encrypted_log_preimages_length: self.encrypted_log_preimages_length, unencrypted_log_preimages_length: self.unencrypted_log_preimages_length, - new_contracts: self.new_contracts.storage, public_data_update_requests: array_cp(self.public_data_update_requests.storage), public_data_reads: array_cp(self.public_data_reads.storage) } @@ -201,7 +193,6 @@ impl CombinedAccumulatedDataBuilder { revertible_builder.unencrypted_logs_hash = self.unencrypted_logs_hash; revertible_builder.encrypted_log_preimages_length = self.encrypted_log_preimages_length; revertible_builder.unencrypted_log_preimages_length= self.unencrypted_log_preimages_length; - revertible_builder.new_contracts = self.new_contracts; (non_revertible_builder.to_private(), revertible_builder.to_private()) } diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/abis/accumulated_data/private_accumulated_revertible_data.nr b/noir-projects/noir-protocol-circuits/crates/types/src/abis/accumulated_data/private_accumulated_revertible_data.nr index 16d6028d74f..be3c470d77e 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/abis/accumulated_data/private_accumulated_revertible_data.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/abis/accumulated_data/private_accumulated_revertible_data.nr @@ -1,13 +1,8 @@ -use crate::{ - abis::{ - call_request::CallRequest, new_contract_data::NewContractData, - side_effect::{SideEffect, SideEffectLinkedToNoteHash} -} -}; +use crate::{abis::{call_request::CallRequest, side_effect::{SideEffect, SideEffectLinkedToNoteHash}}}; use crate::constants::{ MAX_REVERTIBLE_NOTE_HASHES_PER_TX, MAX_REVERTIBLE_NULLIFIERS_PER_TX, MAX_PRIVATE_CALL_STACK_LENGTH_PER_TX, MAX_REVERTIBLE_PUBLIC_CALL_STACK_LENGTH_PER_TX, - MAX_NEW_L2_TO_L1_MSGS_PER_TX, NUM_FIELDS_PER_SHA256, MAX_NEW_CONTRACTS_PER_TX + MAX_NEW_L2_TO_L1_MSGS_PER_TX, NUM_FIELDS_PER_SHA256 }; struct PrivateAccumulatedRevertibleData { @@ -25,8 +20,6 @@ struct PrivateAccumulatedRevertibleData { // variable-length data. encrypted_log_preimages_length: Field, unencrypted_log_preimages_length: Field, - - new_contracts: [NewContractData; MAX_NEW_CONTRACTS_PER_TX], } impl PrivateAccumulatedRevertibleData { diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/abis/accumulated_data/public_accumulated_revertible_data.nr b/noir-projects/noir-protocol-circuits/crates/types/src/abis/accumulated_data/public_accumulated_revertible_data.nr index 1f64f37bb3f..954cb1b69a0 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/abis/accumulated_data/public_accumulated_revertible_data.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/abis/accumulated_data/public_accumulated_revertible_data.nr @@ -1,7 +1,6 @@ use crate::{ abis::{ - call_request::CallRequest, new_contract_data::NewContractData, - nullifier_key_validation_request::NullifierKeyValidationRequestContext, + call_request::CallRequest, nullifier_key_validation_request::NullifierKeyValidationRequestContext, public_data_read::PublicDataRead, public_data_update_request::PublicDataUpdateRequest, read_request::ReadRequestContext, side_effect::{SideEffect, SideEffectLinkedToNoteHash} } @@ -11,8 +10,7 @@ use crate::constants::{ MAX_NULLIFIER_KEY_VALIDATION_REQUESTS_PER_TX, MAX_REVERTIBLE_NOTE_HASHES_PER_TX, MAX_REVERTIBLE_NULLIFIERS_PER_TX, MAX_PRIVATE_CALL_STACK_LENGTH_PER_TX, MAX_REVERTIBLE_PUBLIC_CALL_STACK_LENGTH_PER_TX, MAX_NEW_L2_TO_L1_MSGS_PER_TX, NUM_FIELDS_PER_SHA256, - MAX_NEW_CONTRACTS_PER_TX, MAX_REVERTIBLE_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, - MAX_REVERTIBLE_PUBLIC_DATA_READS_PER_TX + MAX_REVERTIBLE_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, MAX_REVERTIBLE_PUBLIC_DATA_READS_PER_TX }; struct PublicAccumulatedRevertibleData { @@ -35,8 +33,6 @@ struct PublicAccumulatedRevertibleData { encrypted_log_preimages_length: Field, unencrypted_log_preimages_length: Field, - new_contracts: [NewContractData; MAX_NEW_CONTRACTS_PER_TX], - public_data_update_requests: [PublicDataUpdateRequest; MAX_REVERTIBLE_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX], public_data_reads: [PublicDataRead; MAX_REVERTIBLE_PUBLIC_DATA_READS_PER_TX], } diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/abis/call_context.nr b/noir-projects/noir-protocol-circuits/crates/types/src/abis/call_context.nr index 9f1cd659fef..d312ea1c23c 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/abis/call_context.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/abis/call_context.nr @@ -14,7 +14,6 @@ struct CallContext { is_delegate_call : bool, is_static_call : bool, - is_contract_deployment : bool, start_side_effect_counter : u32, } @@ -29,7 +28,6 @@ impl CallContext { assert(self.function_selector.to_field() == 0); assert(self.is_delegate_call == false); assert(self.is_static_call == false); - assert(self.is_contract_deployment == false); assert(self.start_side_effect_counter == 0); } } @@ -43,7 +41,6 @@ impl Eq for CallContext { & call_context.function_selector.eq(self.function_selector) & (call_context.is_delegate_call == self.is_delegate_call) & (call_context.is_static_call == self.is_static_call) - & (call_context.is_contract_deployment == self.is_contract_deployment) & (call_context.start_side_effect_counter == self.start_side_effect_counter) } } @@ -63,7 +60,6 @@ impl Serialize for CallContext { self.function_selector.to_field(), self.is_delegate_call as Field, self.is_static_call as Field, - self.is_contract_deployment as Field, self.start_side_effect_counter as Field, ] } @@ -78,8 +74,7 @@ impl Deserialize for CallContext { function_selector: FunctionSelector::from_field(serialized[3]), is_delegate_call: serialized[4] as bool, is_static_call: serialized[5] as bool, - is_contract_deployment: serialized[6] as bool, - start_side_effect_counter: serialized[7] as u32, + start_side_effect_counter: serialized[6] as u32, } } } diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/abis/contract_leaf_preimage.nr b/noir-projects/noir-protocol-circuits/crates/types/src/abis/contract_leaf_preimage.nr deleted file mode 100644 index 8a0b726de5c..00000000000 --- a/noir-projects/noir-protocol-circuits/crates/types/src/abis/contract_leaf_preimage.nr +++ /dev/null @@ -1,9 +0,0 @@ -// TODO(David): The cpp code uses a typename. I've used a new module -// to make it more obvious that we have NewContractData being aliased -// as ContractLeafPreimage. -// It may make sense to only use `ContractLeafPreimage` in the codebase. -// -// This is not actually being used anywhere due to Noir not -// resolving import path aliases and re-exports properly. -// If you grep for `ContractLeafPreimage` you can see its usage. -use crate::abis::new_contract_data::NewContractData as ContractLeafPreimage; diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/abis/membership_witness.nr b/noir-projects/noir-protocol-circuits/crates/types/src/abis/membership_witness.nr index 443efeaf108..488272527c3 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/abis/membership_witness.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/abis/membership_witness.nr @@ -1,6 +1,6 @@ use crate::constants::{ - CONTRACT_TREE_HEIGHT, FUNCTION_TREE_HEIGHT, NULLIFIER_TREE_HEIGHT, NOTE_HASH_TREE_HEIGHT, - ROLLUP_VK_TREE_HEIGHT, ARCHIVE_HEIGHT, PUBLIC_DATA_TREE_HEIGHT + FUNCTION_TREE_HEIGHT, NULLIFIER_TREE_HEIGHT, NOTE_HASH_TREE_HEIGHT, ROLLUP_VK_TREE_HEIGHT, + ARCHIVE_HEIGHT, PUBLIC_DATA_TREE_HEIGHT }; struct MembershipWitness { @@ -17,11 +17,6 @@ struct FunctionLeafMembershipWitness{ sibling_path: [Field; FUNCTION_TREE_HEIGHT] } -struct ContractLeafMembershipWitness{ - leaf_index: Field, - sibling_path: [Field; CONTRACT_TREE_HEIGHT] -} - struct VKMembershipWitness{ leaf_index: Field, sibling_path: [Field; ROLLUP_VK_TREE_HEIGHT] diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/abis/new_contract_data.nr b/noir-projects/noir-protocol-circuits/crates/types/src/abis/new_contract_data.nr deleted file mode 100644 index 735d7329776..00000000000 --- a/noir-projects/noir-protocol-circuits/crates/types/src/abis/new_contract_data.nr +++ /dev/null @@ -1,110 +0,0 @@ -use crate::address::{AztecAddress, EthAddress}; -use crate::contract_class_id::ContractClassId; -use crate::constants::{GENERATOR_INDEX__CONTRACT_LEAF, NEW_CONTRACT_DATA_LENGTH}; -use dep::std::cmp::Eq; -use crate::traits::{Empty, Serialize, Hash, Deserialize}; -use crate::hash::pedersen_hash; - -struct NewContractData { - contract_address: AztecAddress, - portal_contract_address: EthAddress, - contract_class_id: ContractClassId, -} - -impl Eq for NewContractData { - fn eq(self, data: NewContractData) -> bool { - data.contract_address.eq(self.contract_address) - & data.portal_contract_address.eq(self.portal_contract_address) - & data.contract_class_id.eq(self.contract_class_id) - } -} - -impl Serialize for NewContractData { - fn serialize(self) -> [Field; NEW_CONTRACT_DATA_LENGTH] { - [ - self.contract_address.to_field(), - self.portal_contract_address.to_field(), - self.contract_class_id.to_field(), - ] - } -} - -impl Deserialize for NewContractData { - fn deserialize(serialized: [Field; NEW_CONTRACT_DATA_LENGTH]) -> Self { - Self { - contract_address: AztecAddress::from_field(serialized[0]), - portal_contract_address: EthAddress::from_field(serialized[1]), - contract_class_id: ContractClassId::from_field(serialized[2]), - } - } -} - -impl Empty for NewContractData { - fn empty() -> Self { - Self { - contract_address : AztecAddress::empty(), - portal_contract_address : EthAddress::empty(), - contract_class_id: ContractClassId::from_field(0), - } - } -} - -impl Hash for NewContractData { - fn hash(self) -> Field { - if self.is_empty() { - 0 // We want to return 0 here since the contract_address is zero - } else { - pedersen_hash(self.serialize(), GENERATOR_INDEX__CONTRACT_LEAF) - } - } -} - -impl NewContractData { - pub fn is_empty(self) -> bool { - (self.contract_address.to_field() == 0) - & (self.portal_contract_address.to_field() == 0) - & (self.contract_class_id.to_field() == 0) - } -} - -mod tests { - use crate::{ - abis::new_contract_data::NewContractData, address::{AztecAddress, EthAddress}, - contract_class_id::ContractClassId - }; - - // Matches makeNewContractData in factories.ts - fn make_new_contract_data(seed: Field) -> NewContractData { - NewContractData { - contract_address: AztecAddress::from_field(seed), - portal_contract_address: EthAddress::from_field(seed + 1), - contract_class_id: ContractClassId::from_field(seed + 2) - } - } - - #[test] - fn serialization_of_empty() { - let data: NewContractData = dep::std::unsafe::zeroed(); - let serialized = data.serialize(); - let deserialized = NewContractData::deserialize(serialized); - assert(data.eq(deserialized)); - } - - #[test] - fn empty_hash_is_zero() { - let data: NewContractData = dep::std::unsafe::zeroed(); - let hash = data.hash(); - - // Value from new_contract_data.test.ts "computes empty hash" test - assert_eq(hash, 0x0000000000000000000000000000000000000000000000000000000000000000); - } - - #[test] - fn hash_matches() { - let data = make_new_contract_data(5); - let hash = data.hash(); - - // Value from new_contract_data.test.ts "hash matches" test - assert_eq(hash, 0x2359862482fb58cf5a5ddab56eb6d49908bc811353f3fd6fe9fd057c525cbf0b); - } -} diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_call_stack_item.nr b/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_call_stack_item.nr index cdf79b46085..7b287d20ed6 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_call_stack_item.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_call_stack_item.nr @@ -75,5 +75,6 @@ fn empty_hash() { let hash = item.hash(); // Value from private_call_stack_item.test.ts "computes empty item hash" test - assert_eq(hash, 0x19ee1f10c5c0508a8d727da00c97b8198522d7a17fab73eb804f24183177b798); + let test_data_empty_hash = 0x1c3b67cab2bc3dc2106cfeddd8ea68b8d445849f20ed3b9286ad684542aae25d; + assert_eq(hash, test_data_empty_hash); } diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_circuit_public_inputs.nr b/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_circuit_public_inputs.nr index a36c0e4d4bd..e89c6dc8b31 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_circuit_public_inputs.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_circuit_public_inputs.nr @@ -11,9 +11,8 @@ use crate::{ RETURN_VALUES_LENGTH, PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH, GENERATOR_INDEX__PRIVATE_CIRCUIT_PUBLIC_INPUTS }, - contrakt::contract_deployment_data::ContractDeploymentData, header::Header, hash::pedersen_hash, - messaging::l2_to_l1_message::L2ToL1Message, traits::{Deserialize, Hash, Serialize}, - utils::reader::Reader + header::Header, hash::pedersen_hash, messaging::l2_to_l1_message::L2ToL1Message, + traits::{Deserialize, Hash, Serialize}, utils::reader::Reader }; struct PrivateCircuitPublicInputs { @@ -46,8 +45,6 @@ struct PrivateCircuitPublicInputs { // Header of a block whose state is used during private execution (not the block the transaction is included in). historical_header: Header, - contract_deployment_data: ContractDeploymentData, - // Note: The following 2 values are not redundant to the values in self.historical_header.global_variables because // they can be different in case of a protocol upgrade. In such a situation we could be using header from a block // before the upgrade took place but be using the updated protocol to execute and prove the transaction. @@ -74,7 +71,6 @@ impl Eq for PrivateCircuitPublicInputs { (self.encrypted_log_preimages_length == other.encrypted_log_preimages_length) & (self.unencrypted_log_preimages_length == other.unencrypted_log_preimages_length) & self.historical_header.eq(other.historical_header) & - self.contract_deployment_data.eq(other.contract_deployment_data) & self.chain_id.eq(other.chain_id) & self.version.eq(other.version) } @@ -115,7 +111,6 @@ impl Serialize for PrivateCircuitPublicInp fields.push(self.encrypted_log_preimages_length); fields.push(self.unencrypted_log_preimages_length); fields.extend_from_array(self.historical_header.serialize()); - fields.extend_from_array(self.contract_deployment_data.serialize()); fields.push(self.chain_id); fields.push(self.version); @@ -148,7 +143,6 @@ impl Deserialize for PrivateCircuitPublicI encrypted_log_preimages_length: reader.read(), unencrypted_log_preimages_length: reader.read(), historical_header: reader.read_struct(Header::deserialize), - contract_deployment_data: reader.read_struct(ContractDeploymentData::deserialize), chain_id: reader.read(), version: reader.read(), }; @@ -178,5 +172,6 @@ fn empty_hash() { let hash = inputs.hash(); // Value from private_circuit_public_inputs.test.ts "computes empty item hash" test - assert_eq(hash, 0x13ba2af75e4afaa4e52dd1afa083e87706cdbab1a33442025dc3a9bbb546d207); + let test_data_empty_hash = 0x2745ec62624afeb19b86af3d440db1f8c3432e1d17a074c75cb8f44999fd3fae; + assert_eq(hash, test_data_empty_hash); } diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_kernel/private_call_data.nr b/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_kernel/private_call_data.nr index 4d8c8aeef2d..40ffa87a975 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_kernel/private_call_data.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_kernel/private_call_data.nr @@ -1,6 +1,6 @@ use crate::abis::{ call_request::CallRequest, private_call_stack_item::PrivateCallStackItem, - membership_witness::{ContractLeafMembershipWitness, FunctionLeafMembershipWitness, NoteHashReadRequestMembershipWitness} + membership_witness::{FunctionLeafMembershipWitness, NoteHashReadRequestMembershipWitness} }; use crate::address::{SaltedInitializationHash, PublicKeysHash, EthAddress}; use crate::contract_class_id::ContractClassId; diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/abis/public_call_stack_item.nr b/noir-projects/noir-protocol-circuits/crates/types/src/abis/public_call_stack_item.nr index 51ee94e817b..0b9dabb2db7 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/abis/public_call_stack_item.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/abis/public_call_stack_item.nr @@ -69,7 +69,8 @@ mod tests { let call_stack_item = PublicCallStackItem { contract_address, public_inputs, is_execution_request: true, function_data }; // Value from public_call_stack_item.test.ts "Computes a callstack item request hash" test - assert_eq(call_stack_item.hash(), 0x10017014b5fd719261c575bd7acd1e604c0dd3e86d8c6af80294eadfc6d174a7); + let test_data_call_stack_item_request_hash = 0x09cb16dc10b48bb544bd5f4293cfd2dee539bd281aa468c0c69a9352df17a307; + assert_eq(call_stack_item.hash(), test_data_call_stack_item_request_hash); } #[test] @@ -86,6 +87,7 @@ mod tests { let call_stack_item = PublicCallStackItem { contract_address, public_inputs, is_execution_request: false, function_data }; // Value from public_call_stack_item.test.ts "Computes a callstack item hash" test - assert_eq(call_stack_item.hash(), 0x182201ec06be2dc7eddaa8b828eb293eab9938c4d41cde1e2b1b766ee21d2a54); + let test_data_call_stack_item_hash = 0x086b4890110c751f01df5eb163b250f10c90a4f38e73e07e3b5a58685456eaa9; + assert_eq(call_stack_item.hash(), test_data_call_stack_item_hash); } } diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/abis/public_circuit_public_inputs.nr b/noir-projects/noir-protocol-circuits/crates/types/src/abis/public_circuit_public_inputs.nr index a1a1667fdd1..b8f44a158ad 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/abis/public_circuit_public_inputs.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/abis/public_circuit_public_inputs.nr @@ -135,5 +135,6 @@ fn empty_hash() { let hash = inputs.hash(); // Value from public_circuit_public_inputs.test.ts "computes empty item hash" test - assert_eq(hash, 0x01fcd6e2480909d55f03f4ee87924cbabb0b4706cb742c70422e423b2db5f4eb); + let test_data_empty_hash = 0x153eea640dd0a53eaa029301381962507fb89e348d42d6f3335107644c6541b9; + assert_eq(hash, test_data_empty_hash); } diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr b/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr index 00e295c50b1..8e78d6db6d3 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr @@ -58,7 +58,6 @@ global MAX_NON_REVERTIBLE_PUBLIC_DATA_READS_PER_TX: u64 = 16; global MAX_REVERTIBLE_PUBLIC_DATA_READS_PER_TX: u64 = 16; global MAX_NEW_L2_TO_L1_MSGS_PER_TX: u64 = 2; -global MAX_NEW_CONTRACTS_PER_TX: u64 = 1; global MAX_NOTE_HASH_READ_REQUESTS_PER_TX: u64 = 128; global MAX_NULLIFIER_READ_REQUESTS_PER_TX: u64 = 8; // Change it to a larger value when there's a seperate reset circuit. global MAX_NULLIFIER_KEY_VALIDATION_REQUESTS_PER_TX: u64 = 4; @@ -72,17 +71,19 @@ global NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP: u64 = 16; // TREES RELATED CONSTANTS global VK_TREE_HEIGHT: u64 = 3; global FUNCTION_TREE_HEIGHT: u64 = 5; -global CONTRACT_TREE_HEIGHT: u64 = 16; global NOTE_HASH_TREE_HEIGHT: u64 = 32; global PUBLIC_DATA_TREE_HEIGHT: u64 = 40; global NULLIFIER_TREE_HEIGHT: u64 = 20; global L1_TO_L2_MSG_TREE_HEIGHT: u64 = 16; global ROLLUP_VK_TREE_HEIGHT: u64 = 8; global ARTIFACT_FUNCTION_TREE_MAX_HEIGHT = 5; +global NULLIFIER_TREE_ID = 0; +global NOTE_HASH_TREE_ID = 1; +global PUBLIC_DATA_TREE_ID = 2; +global L1_TO_L2_MESSAGE_TREE_ID = 3; +global ARCHIVE_TREE_ID = 4; // SUB-TREES RELATED CONSTANTS -global CONTRACT_SUBTREE_HEIGHT: u64 = 0; -global CONTRACT_SUBTREE_SIBLING_PATH_LENGTH: u64 = 16; global NOTE_HASH_SUBTREE_HEIGHT: u64 = 6; global NOTE_HASH_SUBTREE_SIBLING_PATH_LENGTH: u64 = 26; global NULLIFIER_SUBTREE_HEIGHT: u64 = 6; @@ -145,9 +146,8 @@ global VIEW_NOTE_ORACLE_RETURN_LENGTH: u64 = 212; // LENGTH OF STRUCTS SERIALIZED TO FIELDS global AZTEC_ADDRESS_LENGTH = 1; -global CALL_CONTEXT_LENGTH: u64 = 8; +global CALL_CONTEXT_LENGTH: u64 = 7; global CONTENT_COMMITMENT_LENGTH: u64 = 7; -global CONTRACT_DEPLOYMENT_DATA_LENGTH: u64 = 6; global CONTRACT_INSTANCE_LENGTH: u64 = 6; global CONTRACT_STORAGE_READ_LENGTH: u64 = 2; global CONTRACT_STORAGE_UPDATE_REQUEST_LENGTH: u64 = 2; @@ -155,23 +155,22 @@ global ETH_ADDRESS_LENGTH = 1; global FUNCTION_DATA_LENGTH: u64 = 4; global FUNCTION_LEAF_PREIMAGE_LENGTH: u64 = 5; global GLOBAL_VARIABLES_LENGTH: u64 = 6; -global HEADER_LENGTH: u64 = 25; // 2 for last_archive, 7 for content commitment, 10 for state reference, 6 for global vars +global HEADER_LENGTH: u64 = 23; // 2 for last_archive, 7 for content commitment, 8 for state reference, 6 for global vars global L1_TO_L2_MESSAGE_LENGTH: u64 = 8; global L2_TO_L1_MESSAGE_LENGTH: u64 = 2; -global NEW_CONTRACT_DATA_LENGTH: u64 = 3; global NULLIFIER_KEY_VALIDATION_REQUEST_LENGTH = 4; global NULLIFIER_KEY_VALIDATION_REQUEST_CONTEXT_LENGTH = 5; -global PARTIAL_STATE_REFERENCE_LENGTH: u64 = 8; -global PRIVATE_CALL_STACK_ITEM_LENGTH: u64 = 223; +global PARTIAL_STATE_REFERENCE_LENGTH: u64 = 6; +global PRIVATE_CALL_STACK_ITEM_LENGTH: u64 = 214; // Change this ONLY if you have changed the PrivateCircuitPublicInputs structure. // In other words, if the structure/size of the public inputs of a function call changes then we should change this // constant as well PRIVATE_CALL_STACK_ITEM_LENGTH -global PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH: u64 = 218; +global PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH: u64 = 209; // Change this ONLY if you have changed the PublicCircuitPublicInputs structure. -global PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH: u64 = 199; -global STATE_REFERENCE_LENGTH: u64 = 10; // 2 for snap + 8 for partial -global TX_CONTEXT_DATA_LENGTH: u64 = 11; -global TX_REQUEST_LENGTH: u64 = 17; +global PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH: u64 = 196; +global STATE_REFERENCE_LENGTH: u64 = 8; // 2 for snap + 8 for partial +global TX_CONTEXT_DATA_LENGTH: u64 = 4; +global TX_REQUEST_LENGTH: u64 = 10; global GET_NOTES_ORACLE_RETURN_LENGTH: u64 = 674; global NOTE_HASHES_NUM_BYTES_PER_BASE_ROLLUP: Field = 2048; diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/contrakt.nr b/noir-projects/noir-protocol-circuits/crates/types/src/contrakt.nr index 75c7324eb40..1a84b4f0a76 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/contrakt.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/contrakt.nr @@ -1,3 +1,2 @@ -mod contract_deployment_data; mod storage_read; mod storage_update_request; diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/contrakt/contract_deployment_data.nr b/noir-projects/noir-protocol-circuits/crates/types/src/contrakt/contract_deployment_data.nr deleted file mode 100644 index 29e87193e9a..00000000000 --- a/noir-projects/noir-protocol-circuits/crates/types/src/contrakt/contract_deployment_data.nr +++ /dev/null @@ -1,86 +0,0 @@ -use crate::{ - address::EthAddress, contract_class_id::ContractClassId, - constants::{CONTRACT_DEPLOYMENT_DATA_LENGTH, GENERATOR_INDEX__CONTRACT_DEPLOYMENT_DATA}, - grumpkin_point::GrumpkinPoint, hash::pedersen_hash, traits::{Deserialize, Hash, Serialize} -}; - -// docs:start:contract-deployment-data -struct ContractDeploymentData { - public_key : GrumpkinPoint, - initialization_hash : Field, - contract_class_id : ContractClassId, - contract_address_salt : Field, - portal_contract_address : EthAddress, -} -// docs:end:contract-deployment-data - -impl Eq for ContractDeploymentData { - fn eq(self, other: Self) -> bool { - self.public_key.eq(other.public_key) & - self.initialization_hash.eq(other.initialization_hash) & - self.contract_class_id.eq(other.contract_class_id) & - self.contract_address_salt.eq(other.contract_address_salt) & - self.portal_contract_address.eq(other.portal_contract_address) - } -} - -impl Hash for ContractDeploymentData { - fn hash(self) -> Field { - pedersen_hash(self.serialize(), GENERATOR_INDEX__CONTRACT_DEPLOYMENT_DATA) - } -} - -impl Serialize for ContractDeploymentData { - fn serialize(self) -> [Field; CONTRACT_DEPLOYMENT_DATA_LENGTH] { - [ - self.public_key.x, - self.public_key.y, - self.initialization_hash, - self.contract_class_id.to_field(), - self.contract_address_salt, - self.portal_contract_address.to_field(), - ] - } -} - -impl Deserialize for ContractDeploymentData { - fn deserialize(serialized: [Field; CONTRACT_DEPLOYMENT_DATA_LENGTH]) -> Self { - Self { - public_key: GrumpkinPoint { - x: serialized[0], - y: serialized[1], - }, - initialization_hash: serialized[2], - contract_class_id: ContractClassId::from_field(serialized[3]), - contract_address_salt: serialized[4], - portal_contract_address: EthAddress::from_field(serialized[5]), - } - } -} - -impl ContractDeploymentData { - fn assert_is_zero(self) { - self.public_key.assert_is_zero(); - assert(self.initialization_hash == 0); - self.contract_class_id.assert_is_zero(); - assert(self.contract_address_salt == 0); - self.portal_contract_address.assert_is_zero(); - } -} - -#[test] -fn serialization_of_empty() { - let data: ContractDeploymentData = dep::std::unsafe::zeroed(); - let serialized = data.serialize(); - let deserialized = ContractDeploymentData::deserialize(serialized); - assert(data.eq(deserialized)); -} - -#[test] -fn empty_hash() { - let data: ContractDeploymentData = dep::std::unsafe::zeroed(); - let hash = data.hash(); - - // Value from contract_deployment_data.test.ts "computes empty item hash" test - assert_eq(hash, 0x0e7babf59de8dfc7f5992cd34fb0066105d07ce67f68fc33d4a0a6a933a30405); -} diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/hash.nr b/noir-projects/noir-protocol-circuits/crates/types/src/hash.nr index 14c5deba67d..0afb6ea78a9 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/hash.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/hash.nr @@ -4,16 +4,14 @@ use crate::abis::function_selector::FunctionSelector; use crate::abis::function_leaf_preimage::FunctionLeafPreimage; use crate::abis::contract_class_function_leaf_preimage::ContractClassFunctionLeafPreimage; use crate::contract_class_id::ContractClassId; -use crate::abis::new_contract_data::NewContractData as ContractLeafPreimage; use crate::abis::function_data::FunctionData; use crate::abis::side_effect::{SideEffect}; use crate::utils::uint256::U256; use crate::constants::{ - ARGS_HASH_CHUNK_COUNT, ARGS_HASH_CHUNK_LENGTH, CONTRACT_TREE_HEIGHT, FUNCTION_TREE_HEIGHT, - NUM_FIELDS_PER_SHA256, GENERATOR_INDEX__SILOED_NOTE_HASH, GENERATOR_INDEX__OUTER_NULLIFIER, - GENERATOR_INDEX__VK, GENERATOR_INDEX__CONSTRUCTOR, GENERATOR_INDEX__PARTIAL_ADDRESS, - GENERATOR_INDEX__CONTRACT_ADDRESS, GENERATOR_INDEX__NOTE_HASH_NONCE, - GENERATOR_INDEX__UNIQUE_NOTE_HASH, GENERATOR_INDEX__FUNCTION_ARGS + ARGS_HASH_CHUNK_COUNT, ARGS_HASH_CHUNK_LENGTH, FUNCTION_TREE_HEIGHT, NUM_FIELDS_PER_SHA256, + GENERATOR_INDEX__SILOED_NOTE_HASH, GENERATOR_INDEX__OUTER_NULLIFIER, GENERATOR_INDEX__VK, + GENERATOR_INDEX__CONSTRUCTOR, GENERATOR_INDEX__PARTIAL_ADDRESS, GENERATOR_INDEX__CONTRACT_ADDRESS, + GENERATOR_INDEX__NOTE_HASH_NONCE, GENERATOR_INDEX__UNIQUE_NOTE_HASH, GENERATOR_INDEX__FUNCTION_ARGS }; use crate::messaging::l2_to_l1_message::L2ToL1Message; @@ -119,25 +117,6 @@ pub fn function_tree_root_from_siblings( function_tree_root } -// Calculate the contract tree root from the sibling path and leaf preimage. -pub fn contract_tree_root_from_siblings( - contract_class_id: ContractClassId, - storage_contract_address: AztecAddress, - portal_contract_address: EthAddress, - contract_leaf_index: Field, - contract_leaf_sibling_path: [Field; CONTRACT_TREE_HEIGHT] -) -> Field { - //TODO(Kev): if we use shorthand syntax here, we get an error as expected, - // since variable name is `storage_contract_address` but the span is incorrect. - let contract_leaf_preimage = ContractLeafPreimage { contract_address: storage_contract_address, portal_contract_address, contract_class_id }; - - let contract_leaf = contract_leaf_preimage.hash(); - - let computed_contract_tree_root = root_from_sibling_path(contract_leaf, contract_leaf_index, contract_leaf_sibling_path); - - computed_contract_tree_root -} - pub fn private_functions_root_from_siblings( selector: FunctionSelector, vk_hash: Field, diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/header.nr b/noir-projects/noir-protocol-circuits/crates/types/src/header.nr index ece1d741a96..57ec93f228d 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/header.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/header.nr @@ -103,5 +103,6 @@ fn empty_hash_is_zero() { let hash = header.hash(); // Value from new_contract_data.test.ts "computes empty hash" test - assert_eq(hash, 0x2df930cc7b9fc763e82ade72f7c4618834692b2a3d0936aff8d7bbfb27f59d6e); + let test_data_empty_hash = 0x124e8c40a6eca2e3ad10c04050b01a3fad00df3cea47b13592c7571b6914c7a7; + assert_eq(hash, test_data_empty_hash); } diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/partial_state_reference.nr b/noir-projects/noir-protocol-circuits/crates/types/src/partial_state_reference.nr index 245294969c0..10761f02f22 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/partial_state_reference.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/partial_state_reference.nr @@ -6,7 +6,6 @@ use crate::{ struct PartialStateReference { note_hash_tree: AppendOnlyTreeSnapshot, nullifier_tree: AppendOnlyTreeSnapshot, - contract_tree: AppendOnlyTreeSnapshot, public_data_tree: AppendOnlyTreeSnapshot, } @@ -14,7 +13,6 @@ impl Eq for PartialStateReference { fn eq(self, other: PartialStateReference) -> bool { self.note_hash_tree.eq(other.note_hash_tree) & self.nullifier_tree.eq(other.nullifier_tree) & - self.contract_tree.eq(other.contract_tree) & self.public_data_tree.eq(other.public_data_tree) } } @@ -23,16 +21,13 @@ impl Serialize for PartialStateReference { fn serialize(self) -> [Field; PARTIAL_STATE_REFERENCE_LENGTH] { let serialized_note_hash_tree = self.note_hash_tree.serialize(); let serialized_nullifier_tree = self.nullifier_tree.serialize(); - let serialized_contract_tree = self.contract_tree.serialize(); let serialized_public_data_tree = self.public_data_tree.serialize(); [ - serialized_note_hash_tree[0], + serialized_note_hash_tree[0], serialized_note_hash_tree[1], serialized_nullifier_tree[0], serialized_nullifier_tree[1], - serialized_contract_tree[0], - serialized_contract_tree[1], serialized_public_data_tree[0], serialized_public_data_tree[1], ] @@ -48,11 +43,8 @@ impl Deserialize for PartialStateReference { nullifier_tree: AppendOnlyTreeSnapshot::deserialize( [serialized[2], serialized[3]] ), - contract_tree: AppendOnlyTreeSnapshot::deserialize( - [serialized[4], serialized[5]] - ), public_data_tree: AppendOnlyTreeSnapshot::deserialize( - [serialized[6], serialized[7]] + [serialized[4], serialized[5]] ), } } @@ -63,7 +55,6 @@ impl Empty for PartialStateReference { Self { note_hash_tree: AppendOnlyTreeSnapshot::zero(), nullifier_tree: AppendOnlyTreeSnapshot::zero(), - contract_tree: AppendOnlyTreeSnapshot::zero(), public_data_tree: AppendOnlyTreeSnapshot::zero(), } } diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixtures.nr b/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixtures.nr index 1a39d338404..37f30d7216c 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixtures.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixtures.nr @@ -1,5 +1,4 @@ mod contract_functions; -mod contract_tree; mod contracts; mod note_hash_tree; mod note_hash_read_requests; @@ -46,10 +45,6 @@ global HEADER = Header { next_available_leaf_index: 0, // TODO: should this be populated? }, nullifier_tree: empty_append_only_tree(), - contract_tree: AppendOnlyTreeSnapshot { - root: fixtures::contract_tree::ROOT, - next_available_leaf_index: 0, // TODO: should this be populated? - }, public_data_tree: empty_append_only_tree() } }, diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixtures/contract_functions.nr b/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixtures/contract_functions.nr index ecee58edac1..2b4692bcaa2 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixtures/contract_functions.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixtures/contract_functions.nr @@ -10,18 +10,6 @@ struct ContractFunction { membership_witness: FunctionLeafMembershipWitness, } -global default_constructor = ContractFunction { - data: FunctionData { - selector: FunctionSelector { inner: 999 }, - is_internal: false, - is_private: true, - is_constructor: true, - }, - vk_hash: 0, - acir_hash: 43214321, - membership_witness: dep::std::unsafe::zeroed(), -}; - // sibling_path taken from __snapshots__/noir_test_gen.test.ts.snap global default_private_function = ContractFunction { data: FunctionData { diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixtures/contract_tree.nr b/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixtures/contract_tree.nr deleted file mode 100644 index 867f28adbe1..00000000000 --- a/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixtures/contract_tree.nr +++ /dev/null @@ -1,40 +0,0 @@ -// Constants taken from __snapshots__/noir_test_gen.test.ts.snap -global ROOT = 0x2d541f5813387a5f4b32d1b3b103447ae142927457a60d00c779a5eeaead471d; -global SIBLING_PATHS = [ - [ - 0x0c58a1ae52142f3369f9c46e6717bbef5aa55f9fc0e901a7d8cc860d9467021e, - 0x27b1d0839a5b23baf12a8d195b18ac288fcf401afb2f70b8a4b529ede5fa9fed, - 0x21dbfd1d029bf447152fcf89e355c334610d1632436ba170f738107266a71550, - 0x0bcd1f91cf7bdd471d0a30c58c4706f3fdab3807a954b8f5b5e3bfec87d001bb, - 0x06e62084ee7b602fe9abc15632dda3269f56fb0c6e12519a2eb2ec897091919d, - 0x03c9e2e67178ac638746f068907e6677b4cc7a9592ef234ab6ab518f17efffa0, - 0x15d28cad4c0736decea8997cb324cf0a0e0602f4d74472cd977bce2c8dd9923f, - 0x268ed1e1c94c3a45a14db4108bc306613a1c23fab68e0466a002dfb0a3f8d2ab, - 0x0cd8d5695bc2dde99dd531671f76f1482f14ddba8eeca7cb9686d4a62359c257, - 0x047fbb7eb974155702149e58ea6ad91f4c6e953e693db35e953e250d8ceac9a9, - 0x00c5ae2526e665e2c7c698c11a06098b7159f720606d50e7660deb55758b0b02, - 0x2ced19489ab456b8b6c424594cdbbae59c36dfdd4c4621c4032da2d8a9674be5, - 0x1df5a245ffc1da14b46fe56a605f2a47b1cff1592bab4f66cfe5dfe990af6ab5, - 0x2871d090615d14eadb52228c635c90e0adf31176f0814f6525c23e7d7b318c93, - 0x1a2b85ff013d4b2b25074297c7e44aa61f4836d0862b36db2e6ce2b5542f9ea9, - 0x177b9a10bbee32f77c719c6f8d071a18476cbeb021e155c642bbf93c716ce943, - ], - [ - 0x1ec6c50dc972349d72602ec6887f7accd3174d912ea58629447937865cb88a4d, - 0x27b1d0839a5b23baf12a8d195b18ac288fcf401afb2f70b8a4b529ede5fa9fed, - 0x21dbfd1d029bf447152fcf89e355c334610d1632436ba170f738107266a71550, - 0x0bcd1f91cf7bdd471d0a30c58c4706f3fdab3807a954b8f5b5e3bfec87d001bb, - 0x06e62084ee7b602fe9abc15632dda3269f56fb0c6e12519a2eb2ec897091919d, - 0x03c9e2e67178ac638746f068907e6677b4cc7a9592ef234ab6ab518f17efffa0, - 0x15d28cad4c0736decea8997cb324cf0a0e0602f4d74472cd977bce2c8dd9923f, - 0x268ed1e1c94c3a45a14db4108bc306613a1c23fab68e0466a002dfb0a3f8d2ab, - 0x0cd8d5695bc2dde99dd531671f76f1482f14ddba8eeca7cb9686d4a62359c257, - 0x047fbb7eb974155702149e58ea6ad91f4c6e953e693db35e953e250d8ceac9a9, - 0x00c5ae2526e665e2c7c698c11a06098b7159f720606d50e7660deb55758b0b02, - 0x2ced19489ab456b8b6c424594cdbbae59c36dfdd4c4621c4032da2d8a9674be5, - 0x1df5a245ffc1da14b46fe56a605f2a47b1cff1592bab4f66cfe5dfe990af6ab5, - 0x2871d090615d14eadb52228c635c90e0adf31176f0814f6525c23e7d7b318c93, - 0x1a2b85ff013d4b2b25074297c7e44aa61f4836d0862b36db2e6ce2b5542f9ea9, - 0x177b9a10bbee32f77c719c6f8d071a18476cbeb021e155c642bbf93c716ce943, - ], -]; diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixtures/contracts.nr b/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixtures/contracts.nr index 7d62ee738f5..96166f5be41 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixtures/contracts.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixtures/contracts.nr @@ -1,4 +1,3 @@ -use crate::abis::membership_witness::ContractLeafMembershipWitness; use crate::address::{AztecAddress, EthAddress, PublicKeysHash, SaltedInitializationHash, PartialAddress}; use crate::tests::fixtures; use crate::contract_class_id::ContractClassId; diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/tests/kernel_data_builder.nr b/noir-projects/noir-protocol-circuits/crates/types/src/tests/kernel_data_builder.nr index ef17cc8e565..6ab1f79d6f1 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/tests/kernel_data_builder.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/tests/kernel_data_builder.nr @@ -54,7 +54,7 @@ impl PreviousKernelDataBuilder { end.new_nullifiers.push(tx_nullifier); } - let tx_context = build_tx_context(false, 0); + let tx_context = build_tx_context(); PreviousKernelDataBuilder { contract_address: fixtures::contracts::parent_contract.address, diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/tests/private_call_data_builder.nr b/noir-projects/noir-protocol-circuits/crates/types/src/tests/private_call_data_builder.nr index f86b5767eeb..19cf0d270c8 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/tests/private_call_data_builder.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/tests/private_call_data_builder.nr @@ -2,7 +2,7 @@ use crate::{ abis::{ call_request::{CallerContext, CallRequest}, private_call_stack_item::PrivateCallStackItem, function_data::FunctionData, - membership_witness::{ContractLeafMembershipWitness, FunctionLeafMembershipWitness, NoteHashReadRequestMembershipWitness}, + membership_witness::{FunctionLeafMembershipWitness, NoteHashReadRequestMembershipWitness}, private_circuit_public_inputs::{PrivateCircuitPublicInputs}, private_kernel::private_call_data::PrivateCallData }, @@ -41,15 +41,11 @@ struct PrivateCallDataBuilder { } impl PrivateCallDataBuilder { - pub fn new(is_constructor: bool) -> Self { - let public_inputs = PrivateCircuitPublicInputsBuilder::new(is_constructor); + pub fn new() -> Self { + let public_inputs = PrivateCircuitPublicInputsBuilder::new(); let contract_data = fixtures::contracts::default_contract; - let contract_function = if is_constructor { - fixtures::contract_functions::default_constructor - } else { - fixtures::contract_functions::default_private_function - }; + let contract_function = fixtures::contract_functions::default_private_function; let function_data = contract_function.data; PrivateCallDataBuilder { @@ -96,10 +92,7 @@ impl PrivateCallDataBuilder { } pub fn build_tx_request(self) -> TxRequest { - let tx_context = build_tx_context( - self.public_inputs.call_context.is_contract_deployment, - self.public_inputs.args_hash - ); + let tx_context = build_tx_context(); TxRequest { origin: self.contract_address, args_hash: self.public_inputs.args_hash, diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/tests/private_circuit_public_inputs_builder.nr b/noir-projects/noir-protocol-circuits/crates/types/src/tests/private_circuit_public_inputs_builder.nr index 2f23306a1c0..46df32f7940 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/tests/private_circuit_public_inputs_builder.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/tests/private_circuit_public_inputs_builder.nr @@ -4,11 +4,8 @@ use crate::{ private_circuit_public_inputs::PrivateCircuitPublicInputs, read_request::ReadRequest, side_effect::{SideEffect, SideEffectLinkedToNoteHash} }, - address::{AztecAddress, compute_initialization_hash}, - contrakt::contract_deployment_data::ContractDeploymentData, - hash::{compute_constructor_hash, hash_args}, header::Header, - messaging::l2_to_l1_message::L2ToL1Message, - tests::{fixtures, testing_harness::build_contract_deployment_data} + address::{AztecAddress, compute_initialization_hash}, hash::{compute_constructor_hash, hash_args}, + header::Header, messaging::l2_to_l1_message::L2ToL1Message, tests::fixtures }; use crate::constants::{ MAX_NOTE_HASH_READ_REQUESTS_PER_CALL, MAX_NULLIFIER_READ_REQUESTS_PER_CALL, @@ -45,14 +42,12 @@ struct PrivateCircuitPublicInputsBuilder { historical_header: Header, - contract_deployment_data: ContractDeploymentData, - chain_id: Field, version: Field, } impl PrivateCircuitPublicInputsBuilder { - pub fn new(is_constructor: bool) -> Self { + pub fn new() -> Self { let mut public_inputs: PrivateCircuitPublicInputsBuilder = dep::std::unsafe::zeroed(); let args_hash = hash_args([]); @@ -60,28 +55,10 @@ impl PrivateCircuitPublicInputsBuilder { let contract_data = fixtures::contracts::default_contract; let portal_contract_address = contract_data.portal_contract_address; - let contract_function = if is_constructor { - fixtures::contract_functions::default_constructor - } else { - fixtures::contract_functions::default_private_function - }; + let contract_function = fixtures::contract_functions::default_private_function; let function_data = contract_function.data; - let contract_deployment_data = build_contract_deployment_data(is_constructor, args_hash); - - let contract_address = if is_constructor { - let constructor = fixtures::contract_functions::default_constructor; - let initialization_hash = compute_initialization_hash(constructor.data.selector.to_field(), args_hash); - AztecAddress::compute_from_public_key( - contract_deployment_data.public_key, - contract_deployment_data.contract_class_id, - contract_deployment_data.contract_address_salt, - initialization_hash, - portal_contract_address - ) - } else { - contract_data.address - }; + let contract_address = contract_data.address; let call_context = CallContext { msg_sender: fixtures::contracts::parent_contract.address, @@ -90,12 +67,10 @@ impl PrivateCircuitPublicInputsBuilder { function_selector: function_data.selector, is_delegate_call: false, is_static_call: false, - is_contract_deployment: is_constructor, start_side_effect_counter: 0 }; public_inputs.call_context = call_context; public_inputs.args_hash = args_hash; - public_inputs.contract_deployment_data = contract_deployment_data; public_inputs.historical_header = fixtures::HEADER; public_inputs.chain_id = 0; public_inputs.version = 1; @@ -123,7 +98,6 @@ impl PrivateCircuitPublicInputsBuilder { encrypted_log_preimages_length: self.encrypted_log_preimages_length, unencrypted_log_preimages_length: self.unencrypted_log_preimages_length, historical_header: self.historical_header, - contract_deployment_data: self.contract_deployment_data, chain_id: self.chain_id, version: self.version } diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/tests/public_call_data_builder.nr b/noir-projects/noir-protocol-circuits/crates/types/src/tests/public_call_data_builder.nr index 9350c46ce10..264fc98b614 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/tests/public_call_data_builder.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/tests/public_call_data_builder.nr @@ -42,7 +42,6 @@ impl PublicCallDataBuilder { function_selector: function_data.selector, is_delegate_call: false, is_static_call: false, - is_contract_deployment: false, start_side_effect_counter: 0, // needed? }; diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/tests/testing_harness.nr b/noir-projects/noir-protocol-circuits/crates/types/src/tests/testing_harness.nr index 08afb981fba..9f03462c7d9 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/tests/testing_harness.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/tests/testing_harness.nr @@ -1,32 +1,5 @@ -use crate::{ - contrakt::contract_deployment_data::ContractDeploymentData, tests::fixtures, - transaction::tx_context::TxContext, address::compute_initialization_hash -}; +use crate::{tests::fixtures, transaction::tx_context::TxContext, address::compute_initialization_hash}; -pub fn build_contract_deployment_data(is_constructor: bool, args_hash: Field) -> ContractDeploymentData { - let mut contract_deployment_data: ContractDeploymentData = dep::std::unsafe::zeroed(); - if is_constructor { - let contract_data = fixtures::contracts::default_contract; - let constructor = fixtures::contract_functions::default_constructor; - contract_deployment_data = ContractDeploymentData { - public_key: fixtures::PUBLIC_KEY, - initialization_hash: compute_initialization_hash(constructor.data.selector.to_field(), args_hash), - contract_class_id: contract_data.contract_class_id, - contract_address_salt: contract_data.contract_address_salt, - portal_contract_address: contract_data.portal_contract_address, - }; - } - contract_deployment_data -} - -pub fn build_tx_context(is_constructor: bool, args_hash: Field) -> TxContext { - let contract_deployment_data = build_contract_deployment_data(is_constructor, args_hash); - TxContext { - is_fee_payment_tx: false, - is_rebate_payment_tx: false, - is_contract_deployment_tx: is_constructor, - contract_deployment_data, - chain_id: 1, - version: 0 - } +pub fn build_tx_context() -> TxContext { + TxContext { is_fee_payment_tx: false, is_rebate_payment_tx: false, chain_id: 1, version: 0 } } diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/transaction/tx_context.nr b/noir-projects/noir-protocol-circuits/crates/types/src/transaction/tx_context.nr index d33ee842c3a..a0655fa6250 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/transaction/tx_context.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/transaction/tx_context.nr @@ -1,15 +1,11 @@ use crate::{ - constants::{GENERATOR_INDEX__TX_CONTEXT, TX_CONTEXT_DATA_LENGTH}, - contrakt::contract_deployment_data::ContractDeploymentData, hash::pedersen_hash, + constants::{GENERATOR_INDEX__TX_CONTEXT, TX_CONTEXT_DATA_LENGTH}, hash::pedersen_hash, traits::{Deserialize, Hash, Serialize}, utils::reader::Reader }; struct TxContext { is_fee_payment_tx : bool, is_rebate_payment_tx : bool, - is_contract_deployment_tx : bool, - - contract_deployment_data : ContractDeploymentData, chain_id : Field, version : Field, @@ -19,8 +15,6 @@ impl Eq for TxContext { fn eq(self, other: Self) -> bool { (self.is_fee_payment_tx == other.is_fee_payment_tx) & (self.is_rebate_payment_tx == other.is_rebate_payment_tx) & - (self.is_contract_deployment_tx == other.is_contract_deployment_tx) & - self.contract_deployment_data.eq(other.contract_deployment_data) & (self.chain_id == other.chain_id) & (self.version == other.version) } @@ -32,8 +26,6 @@ impl Serialize for TxContext { fields.push(self.is_fee_payment_tx as Field); fields.push(self.is_rebate_payment_tx as Field); - fields.push(self.is_contract_deployment_tx as Field); - fields.extend_from_array(self.contract_deployment_data.serialize()); fields.push(self.chain_id); fields.push(self.version); @@ -51,8 +43,6 @@ impl Deserialize for TxContext { let context = Self { is_fee_payment_tx: reader.read() as bool, is_rebate_payment_tx: reader.read() as bool, - is_contract_deployment_tx: reader.read() as bool, - contract_deployment_data: reader.read_struct(ContractDeploymentData::deserialize), chain_id: reader.read(), version: reader.read(), }; @@ -81,6 +71,7 @@ fn empty_hash() { let inputs: TxContext = dep::std::unsafe::zeroed(); let hash = inputs.hash(); - // Value from contract_deployment_data.test.ts "computes empty item hash" test - assert_eq(hash, 0x2e7ff14389eef3dc51597529149e01b49cb33829f7089438c8c145c8f352c17b); + // Value from tx_context.test.ts "computes empty item hash" test + let test_data_empty_hash = 0x200569267c0f73ac89aaa414239398db9445dd4ad3a8cf37015cd55b8d4c5e8d; + assert_eq(hash, test_data_empty_hash); } diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/transaction/tx_request.nr b/noir-projects/noir-protocol-circuits/crates/types/src/transaction/tx_request.nr index 17b604530f4..ef9fad8bfb5 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/transaction/tx_request.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/transaction/tx_request.nr @@ -62,8 +62,7 @@ mod tests { use crate::{ abis::{function_selector::FunctionSelector, function_data::FunctionData}, address::{AztecAddress, EthAddress}, contract_class_id::ContractClassId, - contrakt::contract_deployment_data::ContractDeploymentData, grumpkin_point::GrumpkinPoint, - transaction::{tx_request::TxRequest, tx_context::TxContext} + grumpkin_point::GrumpkinPoint, transaction::{tx_request::TxRequest, tx_context::TxContext} }; #[test] @@ -80,23 +79,11 @@ mod tests { let tx_request = TxRequest { origin: AztecAddress::from_field(1), args_hash: 3, - tx_context: TxContext { - is_fee_payment_tx: false, - is_rebate_payment_tx: false, - is_contract_deployment_tx: true, - contract_deployment_data: ContractDeploymentData { - public_key: GrumpkinPoint { x: 1, y: 2 }, - initialization_hash: 1, - contract_class_id: ContractClassId::from_field(2), - contract_address_salt: 3, - portal_contract_address: EthAddress::from_field(1) - }, - chain_id: 0, - version: 0 - }, + tx_context: TxContext { is_fee_payment_tx: false, is_rebate_payment_tx: false, chain_id: 0, version: 0 }, function_data: FunctionData { selector: FunctionSelector::from_u32(2), is_internal: false, is_private: true, is_constructor: true } }; // Value from tx_request.test.ts "compute hash" test - assert(tx_request.hash() == 0x05e3f67a5e787faf63c85c28169a9d616b594c9799d9785b4f167d9cd7a71e9e); + let test_data_tx_request_hash = 0x0ab4eaebf540be2999b50051b3c272b5bf7be23d59233b6d453272a42c3c08e5; + assert(tx_request.hash() == test_data_tx_request_hash); } } diff --git a/yarn-project/archiver/README.md b/yarn-project/archiver/README.md index d2787773807..a240d07d596 100644 --- a/yarn-project/archiver/README.md +++ b/yarn-project/archiver/README.md @@ -4,8 +4,7 @@ Archiver is a service which is used to fetch data on-chain data and present them The on-chain data specifically are the following events: 1. `L2BlockProcessed` event emitted on Rollup contract, -2. `ContractDeployment` event emitted on ContractDeploymentEmitter contract, -3. `MessageAdded` event emitted on Inbox contract, +2. `MessageAdded` event emitted on Inbox contract, The interfaces defining how the data can be consumed from the archiver are `L2BlockSource`, `L2LogsSource` and `ContractDataSource`. @@ -14,4 +13,4 @@ The interfaces defining how the data can be consumed from the archiver are `L2Bl To install dependencies and build the package run `yarn install` followed by `yarn build`. To run test execute `yarn test`. -To start the service export `ETHEREUM_HOST` (defaults to `http://127.0.0.1:8545/`), `ARCHIVER_POLLING_INTERVAL` (defaults to `1000 ms`), `ROLLUP_CONTRACT_ADDRESS`, `INBOX_CONTRACT_ADDRESS`, `CONTRACT_DEPLOYMENT_EMITTER_ADDRESS` environmental variables and start the service with `yarn start`. +To start the service export `ETHEREUM_HOST` (defaults to `http://127.0.0.1:8545/`), `ARCHIVER_POLLING_INTERVAL` (defaults to `1000 ms`), `ROLLUP_CONTRACT_ADDRESS`, `INBOX_CONTRACT_ADDRESS` environmental variables and start the service with `yarn start`. diff --git a/yarn-project/archiver/src/archiver/archiver.test.ts b/yarn-project/archiver/src/archiver/archiver.test.ts index 7fd15cf32cf..64c25365fa6 100644 --- a/yarn-project/archiver/src/archiver/archiver.test.ts +++ b/yarn-project/archiver/src/archiver/archiver.test.ts @@ -1,11 +1,10 @@ -import { Body, ExtendedContractData, L2Block, L2BlockL2Logs, LogType } from '@aztec/circuit-types'; +import { Body, L2Block, L2BlockL2Logs, LogType } from '@aztec/circuit-types'; import { AztecAddress } from '@aztec/foundation/aztec-address'; import { EthAddress } from '@aztec/foundation/eth-address'; import { Fr } from '@aztec/foundation/fields'; import { sleep } from '@aztec/foundation/sleep'; import { AvailabilityOracleAbi, - ContractDeploymentEmitterAbi, InboxAbi, NewInboxAbi, RollupAbi, @@ -25,7 +24,6 @@ describe('Archiver', () => { const newInboxAddress = EthAddress.ZERO; const registryAddress = EthAddress.ZERO; const availabilityOracleAddress = EthAddress.ZERO; - const contractDeploymentEmitterAddress = EthAddress.fromString('0x0000000000000000000000000000000000000001'); const blockNumbers = [1, 2, 3]; let publicClient: MockProxy>; let archiverStore: ArchiverDataStore; @@ -43,7 +41,6 @@ describe('Archiver', () => { inboxAddress, newInboxAddress, registryAddress, - contractDeploymentEmitterAddress, archiverStore, 1000, ); @@ -94,7 +91,6 @@ describe('Archiver', () => { .mockResolvedValueOnce([makeLeafInsertedEvent(98n, 1n, 0n), makeLeafInsertedEvent(99n, 1n, 1n)]) .mockResolvedValueOnce([makeTxsPublishedEvent(101n, blocks[0].body.getTxsEffectsHash())]) .mockResolvedValueOnce([makeL2BlockProcessedEvent(101n, 1n)]) - .mockResolvedValueOnce([makeContractDeploymentEvent(103n, blocks[0])]) // the first loop of the archiver ends here at block 2500 .mockResolvedValueOnce(l1ToL2MessageAddedEvents.slice(2, 4).flat()) .mockResolvedValueOnce(makeL1ToL2MessageCancelledEvents(2503n, l1ToL2MessagesToCancel)) .mockResolvedValueOnce([ @@ -108,7 +104,6 @@ describe('Archiver', () => { makeTxsPublishedEvent(2520n, blocks[2].body.getTxsEffectsHash()), ]) .mockResolvedValueOnce([makeL2BlockProcessedEvent(2510n, 2n), makeL2BlockProcessedEvent(2520n, 3n)]) - .mockResolvedValueOnce([makeContractDeploymentEvent(2540n, blocks[1])]) .mockResolvedValue([]); publicClient.getTransaction.mockResolvedValueOnce(publishTxs[0]); publicClient.getTransaction.mockResolvedValueOnce(rollupTxs[0]); @@ -182,7 +177,6 @@ describe('Archiver', () => { inboxAddress, newInboxAddress, registryAddress, - contractDeploymentEmitterAddress, archiverStore, 1000, ); @@ -268,7 +262,6 @@ describe('Archiver', () => { inboxAddress, newInboxAddress, registryAddress, - contractDeploymentEmitterAddress, archiverStore, 1000, ); @@ -345,31 +338,6 @@ function makeTxsPublishedEvent(l1BlockNum: bigint, txsEffectsHash: Buffer) { } as Log; } -/** - * Makes a fake ContractDeployment event for testing purposes. - * @param l1BlockNum - L1 block number. - * @param l2Block - The l2Block this event is associated with. - * @returns An ContractDeployment event. - */ -function makeContractDeploymentEvent(l1BlockNum: bigint, l2Block: L2Block) { - const extendedContractData = ExtendedContractData.random(); - const acir = extendedContractData.bytecode?.toString('hex'); - return { - blockNumber: l1BlockNum, - args: { - l2BlockNum: BigInt(l2Block.number), - aztecAddress: extendedContractData.contractData.contractAddress.toString(), - portalAddress: extendedContractData.contractData.portalContractAddress.toString(), - l2BlockHash: `0x${l2Block.body.getTxsEffectsHash().toString('hex')}`, - contractClassId: extendedContractData.contractClassId.toString(), - saltedInitializationHash: extendedContractData.saltedInitializationHash.toString(), - publicKeyHash: extendedContractData.publicKeyHash.toString(), - acir: '0x' + acir, - }, - transactionHash: `0x${l2Block.number}`, - } as Log; -} - /** * Makes fake L1ToL2 MessageAdded events for testing purposes. * @param l1BlockNum - L1 block number. diff --git a/yarn-project/archiver/src/archiver/archiver.ts b/yarn-project/archiver/src/archiver/archiver.ts index bda21f4a5bd..258c68db0e9 100644 --- a/yarn-project/archiver/src/archiver/archiver.ts +++ b/yarn-project/archiver/src/archiver/archiver.ts @@ -43,7 +43,6 @@ import { retrieveBlockBodiesFromAvailabilityOracle, retrieveBlockMetadataFromRollup, retrieveNewCancelledL1ToL2Messages, - retrieveNewContractData, retrieveNewL1ToL2Messages, retrieveNewPendingL1ToL2Messages, } from './data_retrieval.js'; @@ -76,7 +75,6 @@ export class Archiver implements ArchiveSource { * @param inboxAddress - Ethereum address of the inbox contract. * @param newInboxAddress - Ethereum address of the new inbox contract. * @param registryAddress - Ethereum address of the registry contract. - * @param contractDeploymentEmitterAddress - Ethereum address of the contractDeploymentEmitter contract. * @param pollingIntervalMs - The interval for polling for L1 logs (in milliseconds). * @param store - An archiver data store for storage & retrieval of blocks, encrypted logs & contract data. * @param log - A logger. @@ -88,7 +86,6 @@ export class Archiver implements ArchiveSource { private readonly inboxAddress: EthAddress, private readonly newInboxAddress: EthAddress, private readonly registryAddress: EthAddress, - private readonly contractDeploymentEmitterAddress: EthAddress, private readonly store: ArchiverDataStore, private readonly pollingIntervalMs = 10_000, private readonly log: DebugLogger = createDebugLogger('aztec:archiver'), @@ -131,7 +128,6 @@ export class Archiver implements ArchiveSource { config.l1Contracts.inboxAddress, newInboxAddress, config.l1Contracts.registryAddress, - config.l1Contracts.contractDeploymentEmitterAddress, archiverStore, config.archiverPollingIntervalMS, ); @@ -323,14 +319,6 @@ export class Archiver implements ArchiveSource { retrievedBlocks.retrievedData.forEach((block: L2Block) => { blockNumberToBodyHash[block.number] = block.header.contentCommitment.txsEffectsHash; }); - const retrievedContracts = await retrieveNewContractData( - this.publicClient, - this.contractDeploymentEmitterAddress, - blockUntilSynced, - lastL1Blocks.addedBlock + 1n, - currentL1BlockNumber, - blockNumberToBodyHash, - ); this.log(`Retrieved ${retrievedBlocks.retrievedData.length} block(s) from chain`); @@ -355,18 +343,6 @@ export class Archiver implements ArchiveSource { }), ); - // store contracts for which we have retrieved L2 blocks - const lastKnownL2BlockNum = retrievedBlocks.retrievedData[retrievedBlocks.retrievedData.length - 1].number; - await Promise.all( - retrievedContracts.retrievedData.map(async ([contracts, l2BlockNum]) => { - this.log(`Retrieved extended contract data for l2 block number: ${l2BlockNum}`); - if (l2BlockNum <= lastKnownL2BlockNum) { - await this.store.addExtendedContractData(contracts, l2BlockNum); - await this.storeContractDataAsClassesAndInstances(contracts, l2BlockNum); - } - }), - ); - // from retrieved L2Blocks, confirm L1 to L2 messages that have been published // from each l2block fetch all entryKeys in a flattened array: this.log(`Confirming l1 to l2 messages in store`); @@ -410,6 +386,7 @@ export class Archiver implements ArchiveSource { * Temporary solution until we source this data from the contract class registerer and instance deployer. * @param contracts - The extended contract data to be stored. * @param l2BlockNum - The L2 block number to which the contract data corresponds. + * TODO(palla/purge-old-contract-deploy): Delete this method */ async storeContractDataAsClassesAndInstances(contracts: ExtendedContractData[], l2BlockNum: number) { const classesAndInstances = contracts.map(extendedContractDataToContractClassAndInstance); @@ -489,6 +466,7 @@ export class Archiver implements ArchiveSource { /** * Temporary method for creating a fake extended contract data out of classes and instances registered in the node. * Used as a fallback if the extended contract data is not found. + * TODO(palla/purge-old-contract-deploy): Use proper classes */ private async makeExtendedContractDataFor(address: AztecAddress): Promise { const instance = await this.store.getContractInstance(address); @@ -505,23 +483,14 @@ export class Archiver implements ArchiveSource { return ExtendedContractData.fromClassAndInstance(contractClass, instance); } - /** - * Lookup all contract data in an L2 block. - * @param blockNum - The block number to get all contract data from. - * @returns All new contract data in the block (if found). - */ - public getExtendedContractDataInBlock(blockNum: number): Promise { - return this.store.getExtendedContractDataInBlock(blockNum); - } - /** * Lookup the contract data for this contract. * Contains contract address & the ethereum portal address. * @param contractAddress - The contract data address. * @returns ContractData with the portal address (if we didn't throw an error). */ - public async getContractData(contractAddress: AztecAddress): Promise { - return (await this.store.getContractData(contractAddress)) ?? this.makeContractDataFor(contractAddress); + public getContractData(contractAddress: AztecAddress): Promise { + return this.makeContractDataFor(contractAddress); } /** @@ -537,16 +506,6 @@ export class Archiver implements ArchiveSource { return new ContractData(address, instance.portalContractAddress); } - /** - * Lookup the L2 contract data inside a block. - * Contains contract address & the ethereum portal address. - * @param l2BlockNum - The L2 block number to get the contract data from. - * @returns ContractData with the portal address (if we didn't throw an error). - */ - public getContractDataInBlock(l2BlockNum: number): Promise { - return this.store.getContractDataInBlock(l2BlockNum); - } - /** * Gets the public function data for a contract. * @param contractAddress - The contract address containing the function to fetch. diff --git a/yarn-project/archiver/src/archiver/archiver_store.ts b/yarn-project/archiver/src/archiver/archiver_store.ts index 1070de6a986..7a224289841 100644 --- a/yarn-project/archiver/src/archiver/archiver_store.ts +++ b/yarn-project/archiver/src/archiver/archiver_store.ts @@ -180,29 +180,6 @@ export interface ArchiverDataStore { */ getExtendedContractData(contractAddress: AztecAddress): Promise; - /** - * Lookup all extended contract data in an L2 block. - * @param blockNum - The block number to get all contract data from. - * @returns All extended contract data in the block (if found). - */ - getExtendedContractDataInBlock(blockNum: number): Promise; - - /** - * Get basic info for an L2 contract. - * Contains contract address & the ethereum portal address. - * @param contractAddress - The contract data address. - * @returns ContractData with the portal address (if we didn't throw an error). - */ - getContractData(contractAddress: AztecAddress): Promise; - - /** - * Get basic info for an all L2 contracts deployed in a block. - * Contains contract address & the ethereum portal address. - * @param l2BlockNum - Number of the L2 block where contracts were deployed. - * @returns ContractData with the portal address (if we didn't throw an error). - */ - getContractDataInBlock(l2BlockNum: number): Promise; - /** * Gets the number of the latest L2 block processed. * @returns The number of the latest L2 block processed. diff --git a/yarn-project/archiver/src/archiver/archiver_store_test_suite.ts b/yarn-project/archiver/src/archiver/archiver_store_test_suite.ts index ef3e28a0f7f..af2f0c26e71 100644 --- a/yarn-project/archiver/src/archiver/archiver_store_test_suite.ts +++ b/yarn-project/archiver/src/archiver/archiver_store_test_suite.ts @@ -417,119 +417,6 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch }); }); - describe('getContractData', () => { - let block: L2Block; - beforeEach(async () => { - block = L2Block.random(1); - await store.addBlocks([block]); - await store.addBlockBodies([block.body]); - }); - - it('returns previously stored contract data', async () => { - await expect(store.getContractData(block.body.txEffects[0].contractData[0].contractAddress)).resolves.toEqual( - block.body.txEffects[0].contractData[0], - ); - }); - - it('returns undefined if contract data is not found', async () => { - await expect(store.getContractData(AztecAddress.random())).resolves.toBeUndefined(); - }); - }); - - describe('getContractDataInBlock', () => { - let block: L2Block; - beforeEach(async () => { - block = L2Block.random(1); - await store.addBlocks([block]); - await store.addBlockBodies([block.body]); - }); - - it('returns the contract data for a known block', async () => { - await expect(store.getContractDataInBlock(block.number)).resolves.toEqual( - block.body.txEffects.flatMap(txEffect => txEffect.contractData), - ); - }); - - it('returns an empty array if contract data is not found', async () => { - await expect(store.getContractDataInBlock(block.number + 1)).resolves.toEqual([]); - }); - }); - - describe('addExtendedContractData', () => { - it('stores extended contract data', async () => { - const block = L2Block.random(1); - await store.addBlocks([block]); - await store.addBlockBodies([block.body]); - await expect(store.addExtendedContractData([ExtendedContractData.random()], block.number)).resolves.toEqual( - true, - ); - }); - - it('stores extended contract data for an unknown block', async () => { - await expect(store.addExtendedContractData([ExtendedContractData.random()], 1)).resolves.toEqual(true); - }); - - it('"pushes" extended contract data and does not overwrite', async () => { - const block = L2Block.random(1); - await store.addBlocks([block]); - await store.addBlockBodies([block.body]); - - // Assuming one contract per tx, and the first two txs - const firstContract = ExtendedContractData.random(block.body.txEffects[0].contractData[0]); - await store.addExtendedContractData([firstContract], block.number); - - const secondContract = ExtendedContractData.random(block.body.txEffects[1].contractData[0]); - await store.addExtendedContractData([secondContract], block.number); - - await expect(store.getExtendedContractDataInBlock(block.number)).resolves.toEqual([ - firstContract, - secondContract, - ]); - }); - }); - - describe('getExtendedContractData', () => { - let block: L2Block; - let extendedContractData: ExtendedContractData; - beforeEach(async () => { - block = L2Block.random(1); - extendedContractData = ExtendedContractData.random(block.body.txEffects[0].contractData[0]); - await store.addBlocks([block]); - await store.addBlockBodies([block.body]); - await store.addExtendedContractData([extendedContractData], block.number); - }); - - it('returns previously stored extended contract data', async () => { - await expect(store.getExtendedContractData(extendedContractData.contractData.contractAddress)).resolves.toEqual( - extendedContractData, - ); - }); - - it('returns undefined if extended contract data is not found', async () => { - await expect(store.getExtendedContractData(AztecAddress.random())).resolves.toBeUndefined(); - }); - }); - - describe('getExtendedContractDataInBlock', () => { - let block: L2Block; - let extendedContractData: ExtendedContractData; - beforeEach(async () => { - block = L2Block.random(1); - extendedContractData = ExtendedContractData.random(block.body.txEffects[0].contractData[0]); - await store.addBlocks([block]); - await store.addBlockBodies([block.body]); - await store.addExtendedContractData([extendedContractData], block.number); - }); - - it('returns previously stored extended contract data', async () => { - await expect(store.getExtendedContractDataInBlock(block.number)).resolves.toEqual([extendedContractData]); - }); - - it('returns an empty array if extended contract data is not found for the block', async () => { - await expect(store.getExtendedContractDataInBlock(block.number + 1)).resolves.toEqual([]); - }); - }); - describe('getUnencryptedLogs', () => { const txsPerBlock = 4; const numPublicFunctionCalls = 3; diff --git a/yarn-project/archiver/src/archiver/data_retrieval.ts b/yarn-project/archiver/src/archiver/data_retrieval.ts index ec9378c7d02..8c90b82e147 100644 --- a/yarn-project/archiver/src/archiver/data_retrieval.ts +++ b/yarn-project/archiver/src/archiver/data_retrieval.ts @@ -1,18 +1,16 @@ -import { Body, ExtendedContractData, L1ToL2Message, NewInboxLeaf } from '@aztec/circuit-types'; +import { Body, L1ToL2Message, NewInboxLeaf } from '@aztec/circuit-types'; import { AppendOnlyTreeSnapshot, Fr, Header } from '@aztec/circuits.js'; import { EthAddress } from '@aztec/foundation/eth-address'; import { PublicClient } from 'viem'; import { - getContractDeploymentLogs, getL1ToL2MessageCancelledLogs, getL2BlockProcessedLogs, getLeafInsertedLogs, getPendingL1ToL2MessageLogs, getTxsPublishedLogs, processCancelledL1ToL2MessagesLogs, - processContractDeploymentLogs, processL2BlockProcessedLogs, processLeafInsertedLogs, processPendingL1ToL2MessageAddedLogs, @@ -117,45 +115,6 @@ export async function retrieveBlockBodiesFromAvailabilityOracle( return { nextEthBlockNumber: searchStartBlock, retrievedData: retrievedBlockBodies }; } -/** - * Fetches new contract data. - * @param publicClient - The viem public client to use for transaction retrieval. - * @param contractDeploymentEmitterAddress - The address of the contract deployment emitter contract. - * @param blockUntilSynced - If true, blocks until the archiver has fully synced. - * @param searchStartBlock - The block number to use for starting the search. - * @param searchEndBlock - The highest block number that we should search up to. - * @param blockNumberToBodyHash - A mapping from block number to relevant body hash. - * @returns An array of ExtendedContractData and their equivalent L2 Block number along with the next eth block to search from.. - */ -export async function retrieveNewContractData( - publicClient: PublicClient, - contractDeploymentEmitterAddress: EthAddress, - blockUntilSynced: boolean, - searchStartBlock: bigint, - searchEndBlock: bigint, - blockNumberToBodyHash: { [key: number]: Buffer | undefined }, -): Promise> { - let retrievedNewContracts: [ExtendedContractData[], number][] = []; - do { - if (searchStartBlock > searchEndBlock) { - break; - } - const contractDataLogs = await getContractDeploymentLogs( - publicClient, - contractDeploymentEmitterAddress, - searchStartBlock, - searchEndBlock, - ); - if (contractDataLogs.length === 0) { - break; - } - const newContracts = processContractDeploymentLogs(blockNumberToBodyHash, contractDataLogs); - retrievedNewContracts = retrievedNewContracts.concat(newContracts); - searchStartBlock = (contractDataLogs.findLast(cd => !!cd)?.blockNumber || searchStartBlock) + 1n; - } while (blockUntilSynced && searchStartBlock <= searchEndBlock); - return { nextEthBlockNumber: searchStartBlock, retrievedData: retrievedNewContracts }; -} - /** * Fetch new pending L1 to L2 messages. * @param publicClient - The viem public client to use for transaction retrieval. diff --git a/yarn-project/archiver/src/archiver/eth_log_handlers.ts b/yarn-project/archiver/src/archiver/eth_log_handlers.ts index 515c8641c0b..8a5a06ab411 100644 --- a/yarn-project/archiver/src/archiver/eth_log_handlers.ts +++ b/yarn-project/archiver/src/archiver/eth_log_handlers.ts @@ -1,8 +1,5 @@ import { Body, - ContractData, - EncodedContractFunction, - ExtendedContractData, L1Actor, L1ToL2Message, L2Actor, @@ -12,10 +9,9 @@ import { AppendOnlyTreeSnapshot, Header } from '@aztec/circuits.js'; import { AztecAddress } from '@aztec/foundation/aztec-address'; import { EthAddress } from '@aztec/foundation/eth-address'; import { Fr } from '@aztec/foundation/fields'; -import { BufferReader, numToUInt32BE } from '@aztec/foundation/serialize'; +import { numToUInt32BE } from '@aztec/foundation/serialize'; import { AvailabilityOracleAbi, - ContractDeploymentEmitterAbi, InboxAbi, NewInboxAbi, RollupAbi, @@ -249,71 +245,6 @@ export function getTxsPublishedLogs( }); } -/** - * Gets relevant `ContractDeployment` logs from chain. - * @param publicClient - The viem public client to use for transaction retrieval. - * @param contractDeploymentEmitterAddress - The address of the L2 contract deployment emitter contract. - * @param fromBlock - First block to get logs from (inclusive). - * @param toBlock - Last block to get logs from (inclusive). - * @returns An array of `ContractDeployment` logs. - */ -export function getContractDeploymentLogs( - publicClient: PublicClient, - contractDeploymentEmitterAddress: EthAddress, - fromBlock: bigint, - toBlock: bigint, -): Promise[]> { - return publicClient.getLogs({ - address: getAddress(contractDeploymentEmitterAddress.toString()), - event: getAbiItem({ - abi: ContractDeploymentEmitterAbi, - name: 'ContractDeployment', - }), - fromBlock, - toBlock: toBlock + 1n, // the toBlock argument in getLogs is exclusive - }); -} - -/** - * Processes newly received ContractDeployment logs. - * @param blockNumberToBodyHash - A mapping from block number to relevant body hash. - * @param logs - ContractDeployment logs. - * @returns The set of retrieved extended contract data items. - */ -export function processContractDeploymentLogs( - blockNumberToBodyHash: { [key: number]: Buffer | undefined }, - logs: Log[], -): [ExtendedContractData[], number][] { - const extendedContractData: [ExtendedContractData[], number][] = []; - for (let i = 0; i < logs.length; i++) { - const log = logs[i]; - const l2BlockNum = Number(log.args.l2BlockNum); - const blockHash = Buffer.from(hexToBytes(log.args.l2BlockHash)); - const expectedBlockHash = blockNumberToBodyHash[l2BlockNum]; - if (expectedBlockHash === undefined || !blockHash.equals(expectedBlockHash)) { - continue; - } - const publicFnsReader = BufferReader.asReader(Buffer.from(log.args.acir.slice(2), 'hex')); - const contractClassId = Fr.fromBuffer(Buffer.from(hexToBytes(log.args.contractClassId))); - const saltedInitializationHash = Fr.fromBuffer(Buffer.from(hexToBytes(log.args.saltedInitializationHash))); - const publicKeyHash = Fr.fromBuffer(Buffer.from(hexToBytes(log.args.publicKeyHash))); - - const contractData = new ExtendedContractData( - new ContractData(AztecAddress.fromString(log.args.aztecAddress), EthAddress.fromString(log.args.portalAddress)), - publicFnsReader.readVector(EncodedContractFunction), - contractClassId, - saltedInitializationHash, - publicKeyHash, - ); - if (extendedContractData[i]) { - extendedContractData[i][0].push(contractData); - } else { - extendedContractData[i] = [[contractData], l2BlockNum]; - } - } - return extendedContractData; -} - /** * Get relevant `MessageAdded` logs emitted by Inbox on chain. * @param publicClient - The viem public client to use for transaction retrieval. diff --git a/yarn-project/archiver/src/archiver/kv_archiver_store/block_store.ts b/yarn-project/archiver/src/archiver/kv_archiver_store/block_store.ts index c581bd965ed..8d26356acab 100644 --- a/yarn-project/archiver/src/archiver/kv_archiver_store/block_store.ts +++ b/yarn-project/archiver/src/archiver/kv_archiver_store/block_store.ts @@ -55,16 +55,6 @@ export class BlockStore { block.getTxs().forEach((tx, i) => { void this.#txIndex.set(tx.txHash.toString(), [block.number, i]); }); - - block.body.txEffects - .flatMap(txEffect => txEffect.contractData) - .forEach((contractData, i) => { - if (contractData.contractAddress.isZero()) { - return; - } - - void this.#contractIndex.set(contractData.contractAddress.toString(), [block.number, i]); - }); } return true; diff --git a/yarn-project/archiver/src/archiver/kv_archiver_store/contract_store.ts b/yarn-project/archiver/src/archiver/kv_archiver_store/contract_store.ts index f5653857a33..c9195ebe39f 100644 --- a/yarn-project/archiver/src/archiver/kv_archiver_store/contract_store.ts +++ b/yarn-project/archiver/src/archiver/kv_archiver_store/contract_store.ts @@ -52,47 +52,4 @@ export class ContractStore { return undefined; } - - /** - * Lookup all extended contract data in an L2 block. - * @param blockNumber - The block number to get all contract data from. - * @returns All extended contract data in the block (if found). - */ - getExtendedContractDataInBlock(blockNumber: number): Array { - return (this.#extendedContractData.get(blockNumber) ?? []).map(contract => - ExtendedContractData.fromBuffer(contract), - ); - } - - /** - * Get basic info for an L2 contract. - * Contains contract address & the ethereum portal address. - * @param contractAddress - The contract data address. - * @returns ContractData with the portal address (if we didn't throw an error). - */ - getContractData(contractAddress: AztecAddress): ContractData | undefined { - const [blockNumber, index] = this.#blockStore.getContractLocation(contractAddress) ?? []; - if (typeof blockNumber !== 'number' || typeof index !== 'number') { - return undefined; - } - - const block = this.#blockStore.getBlock(blockNumber); - - if (block?.body.txEffects[index].contractData.length !== 1) { - throw new Error(`Contract data at block: ${blockNumber}, tx: ${index} does not have length of 1`); - } - - return block?.body.txEffects[index].contractData[0]; - } - - /** - * Get basic info for an all L2 contracts deployed in a block. - * Contains contract address & the ethereum portal address. - * @param blockNumber - Number of the L2 block where contracts were deployed. - * @returns ContractData with the portal address (if we didn't throw an error). - */ - getContractDataInBlock(blockNumber: number): ContractData[] { - const block = this.#blockStore.getBlock(blockNumber); - return block?.body.txEffects.flatMap(txEffect => txEffect.contractData) ?? []; - } } diff --git a/yarn-project/archiver/src/archiver/kv_archiver_store/kv_archiver_store.ts b/yarn-project/archiver/src/archiver/kv_archiver_store/kv_archiver_store.ts index 83191b36789..e0e8ee3b639 100644 --- a/yarn-project/archiver/src/archiver/kv_archiver_store/kv_archiver_store.ts +++ b/yarn-project/archiver/src/archiver/kv_archiver_store/kv_archiver_store.ts @@ -272,35 +272,6 @@ export class KVArchiverDataStore implements ArchiverDataStore { return Promise.resolve(this.#contractStore.getExtendedContractData(contractAddress)); } - /** - * Lookup all extended contract data in an L2 block. - * @param blockNumber - The block number to get all contract data from. - * @returns All extended contract data in the block (if found). - */ - getExtendedContractDataInBlock(blockNumber: number): Promise { - return Promise.resolve(Array.from(this.#contractStore.getExtendedContractDataInBlock(blockNumber))); - } - - /** - * Get basic info for an L2 contract. - * Contains contract address & the ethereum portal address. - * @param contractAddress - The contract data address. - * @returns ContractData with the portal address (if we didn't throw an error). - */ - getContractData(contractAddress: AztecAddress): Promise { - return Promise.resolve(this.#contractStore.getContractData(contractAddress)); - } - - /** - * Get basic info for an all L2 contracts deployed in a block. - * Contains contract address & the ethereum portal address. - * @param blockNumber - Number of the L2 block where contracts were deployed. - * @returns ContractData with the portal address (if we didn't throw an error). - */ - getContractDataInBlock(blockNumber: number): Promise { - return Promise.resolve(Array.from(this.#contractStore.getContractDataInBlock(blockNumber))); - } - /** * Gets the number of the latest L2 block processed. * @returns The number of the latest L2 block processed. diff --git a/yarn-project/archiver/src/archiver/memory_archiver_store/memory_archiver_store.ts b/yarn-project/archiver/src/archiver/memory_archiver_store/memory_archiver_store.ts index d299a7d9959..a783b4c5330 100644 --- a/yarn-project/archiver/src/archiver/memory_archiver_store/memory_archiver_store.ts +++ b/yarn-project/archiver/src/archiver/memory_archiver_store/memory_archiver_store.ts @@ -459,6 +459,7 @@ export class MemoryArchiverStore implements ArchiverDataStore { /** * Get the extended contract data for this contract. + * TODO(palla/purge-old-contract-deploy): Delete me? * @param contractAddress - The contract data address. * @returns The extended contract data or undefined if not found. */ @@ -467,52 +468,6 @@ export class MemoryArchiverStore implements ArchiverDataStore { return Promise.resolve(result); } - /** - * Lookup all contract data in an L2 block. - * @param blockNum - The block number to get all contract data from. - * @returns All extended contract data in the block (if found). - */ - public getExtendedContractDataInBlock(blockNum: number): Promise { - if (blockNum > this.l2BlockContexts.length) { - return Promise.resolve([]); - } - return Promise.resolve(this.extendedContractDataByBlock[blockNum] || []); - } - - /** - * Get basic info for an L2 contract. - * Contains contract address & the ethereum portal address. - * @param contractAddress - The contract data address. - * @returns ContractData with the portal address (if we didn't throw an error). - */ - public getContractData(contractAddress: AztecAddress): Promise { - if (contractAddress.isZero()) { - return Promise.resolve(undefined); - } - for (const blockContext of this.l2BlockContexts) { - for (const contractData of blockContext.block.body.txEffects.flatMap(txEffect => txEffect.contractData)) { - if (contractData.contractAddress.equals(contractAddress)) { - return Promise.resolve(contractData); - } - } - } - return Promise.resolve(undefined); - } - - /** - * Get basic info for an all L2 contracts deployed in a block. - * Contains contract address & the ethereum portal address. - * @param l2BlockNum - Number of the L2 block where contracts were deployed. - * @returns ContractData with the portal address (if we didn't throw an error). - */ - public getContractDataInBlock(l2BlockNum: number): Promise { - if (l2BlockNum > this.l2BlockContexts.length) { - return Promise.resolve([]); - } - const block: L2Block | undefined = this.l2BlockContexts[l2BlockNum - INITIAL_L2_BLOCK_NUM]?.block; - return Promise.resolve(block?.body.txEffects.flatMap(txEffect => txEffect.contractData)); - } - /** * Gets the number of the latest L2 block processed. * @returns The number of the latest L2 block processed. diff --git a/yarn-project/archiver/src/index.ts b/yarn-project/archiver/src/index.ts index f6e3c1003e4..a2d04eccd4e 100644 --- a/yarn-project/archiver/src/index.ts +++ b/yarn-project/archiver/src/index.ts @@ -47,7 +47,6 @@ async function main() { l1Contracts.inboxAddress, newInboxAddress, l1Contracts.registryAddress, - l1Contracts.contractDeploymentEmitterAddress, archiverStore, ); diff --git a/yarn-project/aztec-node/src/aztec-node/server.ts b/yarn-project/aztec-node/src/aztec-node/server.ts index c8ee8cfd348..b9933d2c9bf 100644 --- a/yarn-project/aztec-node/src/aztec-node/server.ts +++ b/yarn-project/aztec-node/src/aztec-node/server.ts @@ -26,7 +26,6 @@ import { } from '@aztec/circuit-types'; import { ARCHIVE_HEIGHT, - CONTRACT_TREE_HEIGHT, EthAddress, Fr, Header, @@ -359,20 +358,6 @@ export class AztecNodeService implements AztecNode { return committedDb.findLeafIndex(treeId, leafValue.toBuffer()); } - /** - * Returns a sibling path for the given index in the contract tree. - * @param blockNumber - The block number at which to get the data. - * @param leafIndex - The index of the leaf for which the sibling path is required. - * @returns The sibling path for the leaf index. - */ - public async getContractSiblingPath( - blockNumber: number | 'latest', - leafIndex: bigint, - ): Promise> { - const committedDb = await this.#getWorldState(blockNumber); - return committedDb.getSiblingPath(MerkleTreeId.CONTRACT_TREE, leafIndex); - } - /** * Returns a sibling path for the given index in the nullifier tree. * @param blockNumber - The block number at which to get the data. diff --git a/yarn-project/aztec.js/src/contract/sent_tx.ts b/yarn-project/aztec.js/src/contract/sent_tx.ts index 64379ce0c42..c0d49fa61c2 100644 --- a/yarn-project/aztec.js/src/contract/sent_tx.ts +++ b/yarn-project/aztec.js/src/contract/sent_tx.ts @@ -75,8 +75,6 @@ export class SentTx { nullifiers: tx.nullifiers.filter(n => !n.isZero()), publicDataWrites: tx.publicDataWrites.filter(p => !p.isEmpty()), l2ToL1Msgs: tx.l2ToL1Msgs.filter(l => !l.isZero()), - contractsLeaves: tx.contractLeaves.filter(c => !c.isZero()), - contractData: tx.contractData.filter(c => !c.isEmpty()), visibleNotes, }; } diff --git a/yarn-project/aztec/src/sandbox.ts b/yarn-project/aztec/src/sandbox.ts index 4c4b378ba67..161100eefce 100644 --- a/yarn-project/aztec/src/sandbox.ts +++ b/yarn-project/aztec/src/sandbox.ts @@ -13,8 +13,6 @@ import { retryUntil } from '@aztec/foundation/retry'; import { AvailabilityOracleAbi, AvailabilityOracleBytecode, - ContractDeploymentEmitterAbi, - ContractDeploymentEmitterBytecode, InboxAbi, InboxBytecode, OutboxAbi, @@ -80,10 +78,6 @@ export async function deployContractsToL1( contractDeployLogger = logger, ) { const l1Artifacts: L1ContractArtifactsForDeployment = { - contractDeploymentEmitter: { - contractAbi: ContractDeploymentEmitterAbi, - contractBytecode: ContractDeploymentEmitterBytecode, - }, registry: { contractAbi: RegistryAbi, contractBytecode: RegistryBytecode, diff --git a/yarn-project/circuit-types/src/contract_data.ts b/yarn-project/circuit-types/src/contract_data.ts index 6803d0c1dd2..fe1db7c04ae 100644 --- a/yarn-project/circuit-types/src/contract_data.ts +++ b/yarn-project/circuit-types/src/contract_data.ts @@ -29,20 +29,6 @@ export interface ContractDataSource { */ getContractData(contractAddress: AztecAddress): Promise; - /** - * Gets extended contract data for all contracts deployed in L2 block. - * @param blockNumber - The block number. - * @returns Extended contract data of contracts deployed in L2 block. - */ - getExtendedContractDataInBlock(blockNumber: number): Promise; - - /** - * Lookup contract data in an L2 block. - * @param blockNumber - The block number. - * @returns Portal contract address info of contracts deployed in L2 block. - */ - getContractDataInBlock(blockNumber: number): Promise; - /** * Returns a contract's encoded public function, given its function selector. * @param address - The contract aztec address. @@ -141,6 +127,7 @@ export class EncodedContractFunction { /** * A contract data blob, containing L1 and L2 addresses, public functions' bytecode, partial address and public key. + * TODO(palla/purge-old-contract-deploy): Delete this class? */ export class ExtendedContractData { /** The contract's encoded ACIR code. This should become Brillig code once implemented. */ @@ -270,6 +257,7 @@ export class ExtendedContractData { /** * A contract data blob, containing L1 and L2 addresses. + * TODO(palla/purge-old-contract-deploy): Delete me */ export class ContractData { constructor( diff --git a/yarn-project/circuit-types/src/interfaces/aztec-node.ts b/yarn-project/circuit-types/src/interfaces/aztec-node.ts index 72bc6a5d8a8..0aee895dee8 100644 --- a/yarn-project/circuit-types/src/interfaces/aztec-node.ts +++ b/yarn-project/circuit-types/src/interfaces/aztec-node.ts @@ -1,6 +1,5 @@ import { ARCHIVE_HEIGHT, - CONTRACT_TREE_HEIGHT, Header, L1_TO_L2_MSG_TREE_HEIGHT, NOTE_HASH_TREE_HEIGHT, @@ -41,17 +40,6 @@ export interface AztecNode { */ findLeafIndex(blockNumber: BlockNumber, treeId: MerkleTreeId, leafValue: Fr): Promise; - /** - * Returns a sibling path for the given index in the contract tree. - * @param blockNumber - The block number at which to get the data. - * @param leafIndex - The index of the leaf for which the sibling path is required. - * @returns The sibling path for the leaf index. - */ - getContractSiblingPath( - blockNumber: BlockNumber, - leafIndex: bigint, - ): Promise>; - /** * Returns a sibling path for the given index in the nullifier tree. * @param blockNumber - The block number at which to get the data. diff --git a/yarn-project/circuit-types/src/l2_block.ts b/yarn-project/circuit-types/src/l2_block.ts index a17333ab097..0d947ac4d69 100644 --- a/yarn-project/circuit-types/src/l2_block.ts +++ b/yarn-project/circuit-types/src/l2_block.ts @@ -170,13 +170,11 @@ export class L2Block { this.header.globalVariables, AppendOnlyTreeSnapshot.zero(), // this.startNoteHashTreeSnapshot / commitments, AppendOnlyTreeSnapshot.zero(), // this.startNullifierTreeSnapshot, - AppendOnlyTreeSnapshot.zero(), // this.startContractTreeSnapshot, AppendOnlyTreeSnapshot.zero(), // this.startPublicDataTreeSnapshot, AppendOnlyTreeSnapshot.zero(), // this.startL1ToL2MessageTreeSnapshot, this.header.lastArchive, this.header.state.partial.noteHashTree, this.header.state.partial.nullifierTree, - this.header.state.partial.contractTree, this.header.state.partial.publicDataTree, this.header.state.l1ToL2MessageTree, this.archive, @@ -197,7 +195,6 @@ export class L2Block { new Fr(Number(this.header.globalVariables.blockNumber.toBigInt()) - 1), AppendOnlyTreeSnapshot.zero(), // this.startNoteHashTreeSnapshot, AppendOnlyTreeSnapshot.zero(), // this.startNullifierTreeSnapshot, - AppendOnlyTreeSnapshot.zero(), // this.startContractTreeSnapshot, AppendOnlyTreeSnapshot.zero(), // this.startPublicDataTreeSnapshot, AppendOnlyTreeSnapshot.zero(), // this.startL1ToL2MessageTreeSnapshot, this.header.lastArchive, @@ -215,7 +212,6 @@ export class L2Block { this.header.globalVariables.blockNumber, this.header.state.partial.noteHashTree, this.header.state.partial.nullifierTree, - this.header.state.partial.contractTree, this.header.state.partial.publicDataTree, this.header.state.l1ToL2MessageTree, this.archive, diff --git a/yarn-project/circuit-types/src/merkle_tree_id.ts b/yarn-project/circuit-types/src/merkle_tree_id.ts index 0279f60b89f..25ab0897284 100644 --- a/yarn-project/circuit-types/src/merkle_tree_id.ts +++ b/yarn-project/circuit-types/src/merkle_tree_id.ts @@ -1,14 +1,21 @@ +import { + ARCHIVE_TREE_ID, + L1_TO_L2_MESSAGE_TREE_ID, + NOTE_HASH_TREE_ID, + NULLIFIER_TREE_ID, + PUBLIC_DATA_TREE_ID, +} from '@aztec/circuits.js'; + /** * Defines the possible Merkle tree IDs. - * NOTE: If you change this, update get_membership_witness.nr as well. + * @remarks The MerkleTrees class expects these to start from zero and be in incremental order. */ export enum MerkleTreeId { - CONTRACT_TREE = 0, - NULLIFIER_TREE = 1, - NOTE_HASH_TREE = 2, - PUBLIC_DATA_TREE = 3, - L1_TO_L2_MESSAGE_TREE = 4, - ARCHIVE = 5, + NULLIFIER_TREE = NULLIFIER_TREE_ID, + NOTE_HASH_TREE = NOTE_HASH_TREE_ID, + PUBLIC_DATA_TREE = PUBLIC_DATA_TREE_ID, + L1_TO_L2_MESSAGE_TREE = L1_TO_L2_MESSAGE_TREE_ID, + ARCHIVE = ARCHIVE_TREE_ID, } export const merkleTreeIds = () => { diff --git a/yarn-project/circuit-types/src/mocks.ts b/yarn-project/circuit-types/src/mocks.ts index 36ae115c485..462f92d0d93 100644 --- a/yarn-project/circuit-types/src/mocks.ts +++ b/yarn-project/circuit-types/src/mocks.ts @@ -2,7 +2,6 @@ import { AztecAddress, CallRequest, Fr, - MAX_NEW_CONTRACTS_PER_TX, MAX_PUBLIC_CALL_STACK_LENGTH_PER_TX, MAX_REVERTIBLE_PUBLIC_CALL_STACK_LENGTH_PER_TX, Proof, @@ -38,10 +37,6 @@ export const mockTx = (seed = 1, logs = true) => { logs ? TxL2Logs.random(8, 3) : TxL2Logs.empty(), // 8 priv function invocations creating 3 encrypted logs each logs ? TxL2Logs.random(11, 2) : TxL2Logs.empty(), // 8 priv + 3 pub function invocations creating 2 unencrypted logs each times(MAX_PUBLIC_CALL_STACK_LENGTH_PER_TX, makePublicCallRequest), - times(MAX_NEW_CONTRACTS_PER_TX, () => ExtendedContractData.random()) as Tuple< - ExtendedContractData, - typeof MAX_NEW_CONTRACTS_PER_TX - >, ); tx.data.endNonRevertibleData.publicCallStack = [ diff --git a/yarn-project/circuit-types/src/stats/metrics.ts b/yarn-project/circuit-types/src/stats/metrics.ts index 347732a591b..a27e8c6f0b4 100644 --- a/yarn-project/circuit-types/src/stats/metrics.ts +++ b/yarn-project/circuit-types/src/stats/metrics.ts @@ -5,7 +5,7 @@ export type MetricGroupBy = | 'block-size' | 'chain-length' | 'circuit-name' - | 'contract-count' + | 'classes-registered' | 'leaf-count' | 'data-writes'; @@ -129,7 +129,7 @@ export const Metrics = [ }, { name: 'tx_size_in_bytes', - groupBy: 'contract-count', + groupBy: 'classes-registered', description: 'Size of txs received in the mempool.', events: ['tx-added-to-pool'], }, diff --git a/yarn-project/circuit-types/src/stats/stats.ts b/yarn-project/circuit-types/src/stats/stats.ts index 8ad9f63bcaf..102fb6c6a78 100644 --- a/yarn-project/circuit-types/src/stats/stats.ts +++ b/yarn-project/circuit-types/src/stats/stats.ts @@ -138,14 +138,12 @@ export type TxStats = { encryptedLogSize: number; /** Serialized size of unencrypted logs. */ unencryptedLogSize: number; - /** Serialized size of new contract data. */ - newContractDataSize: number; - /** Number of new contracts deployed in this tx. */ - newContractCount: number; - /** comm */ + /** New commitments count */ newCommitmentCount: number; - /** a */ + /** New nullifier count */ newNullifierCount: number; + /** How many classes were registered through the canonical class registerer. */ + classRegisteredCount: number; }; /** diff --git a/yarn-project/circuit-types/src/tx/tx.ts b/yarn-project/circuit-types/src/tx/tx.ts index e36bf56e085..1b7aeb0768e 100644 --- a/yarn-project/circuit-types/src/tx/tx.ts +++ b/yarn-project/circuit-types/src/tx/tx.ts @@ -1,5 +1,5 @@ import { - MAX_NEW_CONTRACTS_PER_TX, + ContractClassRegisteredEvent, PrivateKernelTailCircuitPublicInputs, Proof, PublicCallRequest, @@ -7,9 +7,8 @@ import { SideEffectLinkedToNoteHash, } from '@aztec/circuits.js'; import { arrayNonEmptyLength } from '@aztec/foundation/collection'; -import { BufferReader, Tuple, serializeToBuffer } from '@aztec/foundation/serialize'; +import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize'; -import { ExtendedContractData } from '../contract_data.js'; import { GetUnencryptedLogsResponse } from '../logs/get_unencrypted_logs_response.js'; import { L2LogsSource } from '../logs/l2_logs_source.js'; import { TxL2Logs } from '../logs/tx_l2_logs.js'; @@ -42,12 +41,6 @@ export class Tx { * Preimages of the public call stack entries from the private kernel circuit output. */ public readonly enqueuedPublicFunctionCalls: PublicCallRequest[], - /** - * Contracts deployed in this tx. - * Note: Portal address is always set to zero in the tx's new contracts. - * TODO(#3417): Check if portal addresses are still always set to zero - */ - public readonly newContracts: Tuple, ) { if (this.unencryptedLogs.functionLogs.length < this.encryptedLogs.functionLogs.length) { // This check is present because each private function invocation creates encrypted FunctionL2Logs object and @@ -82,7 +75,6 @@ export class Tx { reader.readObject(TxL2Logs), reader.readObject(TxL2Logs), reader.readArray(reader.readNumber(), PublicCallRequest), - reader.readArray(reader.readNumber(), ExtendedContractData) as [ExtendedContractData], ); } @@ -98,8 +90,6 @@ export class Tx { this.unencryptedLogs, this.enqueuedPublicFunctionCalls.length, this.enqueuedPublicFunctionCalls, - this.newContracts.length, - this.newContracts, ]); } @@ -114,7 +104,6 @@ export class Tx { unencryptedLogs: this.unencryptedLogs.toBuffer().toString('hex'), proof: this.proof.toBuffer().toString('hex'), enqueuedPublicFunctions: this.enqueuedPublicFunctionCalls.map(f => f.toBuffer().toString('hex')) ?? [], - newContracts: this.newContracts.map(c => c.toBuffer().toString('hex')), }; } @@ -140,15 +129,7 @@ export class Tx { const enqueuedPublicFunctions = obj.enqueuedPublicFunctions ? obj.enqueuedPublicFunctions.map((x: string) => PublicCallRequest.fromBuffer(Buffer.from(x, 'hex'))) : []; - const newContracts = obj.newContracts.map((x: string) => ExtendedContractData.fromBuffer(Buffer.from(x, 'hex'))); - return new Tx( - publicInputs, - Proof.fromBuffer(proof), - encryptedLogs, - unencryptedLogs, - enqueuedPublicFunctions, - newContracts, - ); + return new Tx(publicInputs, Proof.fromBuffer(proof), encryptedLogs, unencryptedLogs, enqueuedPublicFunctions); } /** @@ -172,8 +153,6 @@ export class Tx { unencryptedLogCount: this.unencryptedLogs.getTotalLogCount(), encryptedLogSize: this.encryptedLogs.getSerializedLength(), unencryptedLogSize: this.unencryptedLogs.getSerializedLength(), - newContractCount: arrayNonEmptyLength(this.newContracts, ExtendedContractData.isEmpty), - newContractDataSize: this.newContracts.map(c => c.toBuffer().length).reduce((a, b) => a + b, 0), newCommitmentCount: arrayNonEmptyLength(this.data!.endNonRevertibleData.newNoteHashes, SideEffect.isEmpty) + @@ -185,6 +164,9 @@ export class Tx { proofSize: this.proof.buffer.length, size: this.toBuffer().length, + classRegisteredCount: this.unencryptedLogs + .unrollLogs() + .filter(log => ContractClassRegisteredEvent.isContractClassRegisteredEvent(log)).length, }; } @@ -220,11 +202,7 @@ export class Tx { const enqueuedPublicFunctions = tx.enqueuedPublicFunctionCalls.map(x => { return PublicCallRequest.fromBuffer(x.toBuffer()); }); - const newContracts = tx.newContracts.map(c => ExtendedContractData.fromBuffer(c.toBuffer())) as Tuple< - ExtendedContractData, - typeof MAX_NEW_CONTRACTS_PER_TX - >; - return new Tx(publicInputs, proof, encryptedLogs, unencryptedLogs, enqueuedPublicFunctions, newContracts); + return new Tx(publicInputs, proof, encryptedLogs, unencryptedLogs, enqueuedPublicFunctions); } } diff --git a/yarn-project/circuit-types/src/tx/tx_receipt.ts b/yarn-project/circuit-types/src/tx/tx_receipt.ts index b29d1b13810..0f7a9dbf278 100644 --- a/yarn-project/circuit-types/src/tx/tx_receipt.ts +++ b/yarn-project/circuit-types/src/tx/tx_receipt.ts @@ -96,14 +96,6 @@ interface DebugInfo { * New L2 to L1 messages created by the transaction. */ l2ToL1Msgs: Fr[]; - /** - * New contracts leaves created by the transaction to be inserted into the contract tree. - */ - contractsLeaves: Fr[]; - /** - * New contract data created by the transaction. - */ - contractData: ContractData[]; /** * Notes created in this tx which belong to accounts which are registered in the PXE which was used to submit the * tx. You will not receive notes of accounts which are not registered in the PXE here even though they were diff --git a/yarn-project/circuit-types/src/tx_effect.ts b/yarn-project/circuit-types/src/tx_effect.ts index 6ffb6a54525..79a8bd2104e 100644 --- a/yarn-project/circuit-types/src/tx_effect.ts +++ b/yarn-project/circuit-types/src/tx_effect.ts @@ -1,7 +1,6 @@ -import { ContractData, LogType, PublicDataWrite, TxHash, TxL2Logs } from '@aztec/circuit-types'; +import { LogType, PublicDataWrite, TxHash, TxL2Logs } from '@aztec/circuit-types'; import { Fr, - MAX_NEW_CONTRACTS_PER_TX, MAX_NEW_L2_TO_L1_MSGS_PER_TX, MAX_NEW_NOTE_HASHES_PER_TX, MAX_NEW_NULLIFIERS_PER_TX, @@ -32,14 +31,6 @@ export class TxEffect { * The public data writes to be inserted into the public data tree. */ public publicDataWrites: Tuple, - /** - * The leaves of the new contract data that will be inserted into the contracts tree. - */ - public contractLeaves: Tuple, - /** - * The contract data of the new contracts. - */ - public contractData: Tuple, /** * The logs of the txEffect */ @@ -52,17 +43,12 @@ export class TxEffect { const nonZeroNullifiers = this.nullifiers.filter(h => !h.isZero()); const nonZeroL2ToL1Msgs = this.l2ToL1Msgs.filter(h => !h.isZero()); const nonZeroPublicDataWrites = this.publicDataWrites.filter(h => !h.isEmpty()); - const nonZeroContractLeaves = this.contractLeaves.filter(h => !h.isZero()); - const nonZeroContractData = this.contractData.filter(h => !h.isEmpty()); return Buffer.concat([ serializeArrayOfBufferableToVector(nonZeroNoteHashes, 1), serializeArrayOfBufferableToVector(nonZeroNullifiers, 1), serializeArrayOfBufferableToVector(nonZeroL2ToL1Msgs, 1), serializeArrayOfBufferableToVector(nonZeroPublicDataWrites, 1), - serializeArrayOfBufferableToVector(nonZeroContractLeaves, 1), - // We don't prefix the contract data with the length because we already have that info before contract leaves - ...nonZeroContractData.map(x => x.toBuffer()), this.encryptedLogs.toBuffer(), this.unencryptedLogs.toBuffer(), ]); @@ -81,18 +67,11 @@ export class TxEffect { const nonZeroL2ToL1Msgs = reader.readVectorUint8Prefix(Fr); const nonZeroPublicDataWrites = reader.readVectorUint8Prefix(PublicDataWrite); - const nonZeroContractLeaves = reader.readVectorUint8Prefix(Fr); - - const numContracts = nonZeroContractLeaves.length; - const nonZeroContractData = reader.readArray(numContracts, ContractData); - return new TxEffect( padArrayEnd(nonZeroNoteHashes, Fr.ZERO, MAX_NEW_NOTE_HASHES_PER_TX), padArrayEnd(nonZeroNullifiers, Fr.ZERO, MAX_NEW_NULLIFIERS_PER_TX), padArrayEnd(nonZeroL2ToL1Msgs, Fr.ZERO, MAX_NEW_L2_TO_L1_MSGS_PER_TX), padArrayEnd(nonZeroPublicDataWrites, PublicDataWrite.empty(), MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX), - padArrayEnd(nonZeroContractLeaves, Fr.ZERO, MAX_NEW_CONTRACTS_PER_TX), - padArrayEnd(nonZeroContractData, ContractData.empty(), MAX_NEW_CONTRACTS_PER_TX), TxL2Logs.fromBuffer(reader), TxL2Logs.fromBuffer(reader), ); @@ -118,18 +97,11 @@ export class TxEffect { const encryptedLogsHashKernel0 = this.encryptedLogs.hash(); const unencryptedLogsHashKernel0 = this.unencryptedLogs.hash(); - if (MAX_NEW_CONTRACTS_PER_TX !== 1) { - throw new Error('Only one contract per transaction is supported for now.'); - } - const inputValue = Buffer.concat([ noteHashesBuffer, nullifiersBuffer, newL2ToL1MsgsBuffer, publicDataUpdateRequestsBuffer, - this.contractLeaves[0].toBuffer(), - this.contractData[0].contractAddress.toBuffer(), - this.contractData[0].portalContractAddress.toBuffer32(), encryptedLogsHashKernel0, unencryptedLogsHashKernel0, ]); @@ -148,8 +120,6 @@ export class TxEffect { makeTuple(MAX_NEW_NULLIFIERS_PER_TX, Fr.random), makeTuple(MAX_NEW_L2_TO_L1_MSGS_PER_TX, Fr.random), makeTuple(MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, PublicDataWrite.random), - makeTuple(MAX_NEW_CONTRACTS_PER_TX, Fr.random), - makeTuple(MAX_NEW_CONTRACTS_PER_TX, ContractData.random), TxL2Logs.random(numPrivateCallsPerTx, numEncryptedLogsPerCall, LogType.ENCRYPTED), TxL2Logs.random(numPublicCallsPerTx, numUnencryptedLogsPerCall, LogType.UNENCRYPTED), ); @@ -170,8 +140,6 @@ export class TxEffect { nullifiers: [${this.nullifiers.map(h => h.toString()).join(', ')}], l2ToL1Msgs: [${this.l2ToL1Msgs.map(h => h.toString()).join(', ')}], publicDataWrites: [${this.publicDataWrites.map(h => h.toString()).join(', ')}], - contractLeaves: [${this.contractLeaves.map(h => h.toString()).join(', ')}], - contractData: [${this.contractData.map(h => h.toString()).join(', ')}], encryptedLogs: ${JSON.stringify(this.encryptedLogs.toJSON())}, unencryptedLogs: ${JSON.stringify(this.unencryptedLogs.toJSON())} }`; diff --git a/yarn-project/circuits.js/src/constants.gen.ts b/yarn-project/circuits.js/src/constants.gen.ts index af38c3081ca..5b7285ae4a9 100644 --- a/yarn-project/circuits.js/src/constants.gen.ts +++ b/yarn-project/circuits.js/src/constants.gen.ts @@ -29,7 +29,6 @@ export const MAX_PUBLIC_DATA_READS_PER_TX = 32; export const MAX_NON_REVERTIBLE_PUBLIC_DATA_READS_PER_TX = 16; export const MAX_REVERTIBLE_PUBLIC_DATA_READS_PER_TX = 16; export const MAX_NEW_L2_TO_L1_MSGS_PER_TX = 2; -export const MAX_NEW_CONTRACTS_PER_TX = 1; export const MAX_NOTE_HASH_READ_REQUESTS_PER_TX = 128; export const MAX_NULLIFIER_READ_REQUESTS_PER_TX = 8; export const MAX_NULLIFIER_KEY_VALIDATION_REQUESTS_PER_TX = 4; @@ -38,15 +37,17 @@ export const NUM_UNENCRYPTED_LOGS_HASHES_PER_TX = 1; export const NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP = 16; export const VK_TREE_HEIGHT = 3; export const FUNCTION_TREE_HEIGHT = 5; -export const CONTRACT_TREE_HEIGHT = 16; export const NOTE_HASH_TREE_HEIGHT = 32; export const PUBLIC_DATA_TREE_HEIGHT = 40; export const NULLIFIER_TREE_HEIGHT = 20; export const L1_TO_L2_MSG_TREE_HEIGHT = 16; export const ROLLUP_VK_TREE_HEIGHT = 8; export const ARTIFACT_FUNCTION_TREE_MAX_HEIGHT = 5; -export const CONTRACT_SUBTREE_HEIGHT = 0; -export const CONTRACT_SUBTREE_SIBLING_PATH_LENGTH = 16; +export const NULLIFIER_TREE_ID = 0; +export const NOTE_HASH_TREE_ID = 1; +export const PUBLIC_DATA_TREE_ID = 2; +export const L1_TO_L2_MESSAGE_TREE_ID = 3; +export const ARCHIVE_TREE_ID = 4; export const NOTE_HASH_SUBTREE_HEIGHT = 6; export const NOTE_HASH_SUBTREE_SIBLING_PATH_LENGTH = 26; export const NULLIFIER_SUBTREE_HEIGHT = 6; @@ -80,9 +81,8 @@ export const GET_NOTE_ORACLE_RETURN_LENGTH = 23; export const MAX_NOTES_PER_PAGE = 10; export const VIEW_NOTE_ORACLE_RETURN_LENGTH = 212; export const AZTEC_ADDRESS_LENGTH = 1; -export const CALL_CONTEXT_LENGTH = 8; +export const CALL_CONTEXT_LENGTH = 7; export const CONTENT_COMMITMENT_LENGTH = 7; -export const CONTRACT_DEPLOYMENT_DATA_LENGTH = 6; export const CONTRACT_INSTANCE_LENGTH = 6; export const CONTRACT_STORAGE_READ_LENGTH = 2; export const CONTRACT_STORAGE_UPDATE_REQUEST_LENGTH = 2; @@ -90,19 +90,18 @@ export const ETH_ADDRESS_LENGTH = 1; export const FUNCTION_DATA_LENGTH = 4; export const FUNCTION_LEAF_PREIMAGE_LENGTH = 5; export const GLOBAL_VARIABLES_LENGTH = 6; -export const HEADER_LENGTH = 25; +export const HEADER_LENGTH = 23; export const L1_TO_L2_MESSAGE_LENGTH = 8; export const L2_TO_L1_MESSAGE_LENGTH = 2; -export const NEW_CONTRACT_DATA_LENGTH = 3; export const NULLIFIER_KEY_VALIDATION_REQUEST_LENGTH = 4; export const NULLIFIER_KEY_VALIDATION_REQUEST_CONTEXT_LENGTH = 5; -export const PARTIAL_STATE_REFERENCE_LENGTH = 8; -export const PRIVATE_CALL_STACK_ITEM_LENGTH = 223; -export const PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH = 218; -export const PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH = 199; -export const STATE_REFERENCE_LENGTH = 10; -export const TX_CONTEXT_DATA_LENGTH = 11; -export const TX_REQUEST_LENGTH = 17; +export const PARTIAL_STATE_REFERENCE_LENGTH = 6; +export const PRIVATE_CALL_STACK_ITEM_LENGTH = 214; +export const PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH = 209; +export const PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH = 196; +export const STATE_REFERENCE_LENGTH = 8; +export const TX_CONTEXT_DATA_LENGTH = 4; +export const TX_REQUEST_LENGTH = 10; export const GET_NOTES_ORACLE_RETURN_LENGTH = 674; export const NOTE_HASHES_NUM_BYTES_PER_BASE_ROLLUP = 2048; export const NULLIFIERS_NUM_BYTES_PER_BASE_ROLLUP = 2048; diff --git a/yarn-project/circuits.js/src/structs/__snapshots__/contract_deployment_data.test.ts.snap b/yarn-project/circuits.js/src/structs/__snapshots__/contract_deployment_data.test.ts.snap deleted file mode 100644 index 11a6dffff27..00000000000 --- a/yarn-project/circuits.js/src/structs/__snapshots__/contract_deployment_data.test.ts.snap +++ /dev/null @@ -1,44 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`ContractDeploymentData computes empty hash 1`] = ` -Fr { - "asBigInt": 6550888889575534006716962010714219565950255479539883359305705974567832585221n, - "asBuffer": { - "data": [ - 14, - 123, - 171, - 245, - 157, - 232, - 223, - 199, - 245, - 153, - 44, - 211, - 79, - 176, - 6, - 97, - 5, - 208, - 124, - 230, - 127, - 104, - 252, - 51, - 212, - 160, - 166, - 169, - 51, - 163, - 4, - 5, - ], - "type": "Buffer", - }, -} -`; diff --git a/yarn-project/circuits.js/src/structs/__snapshots__/header.test.ts.snap b/yarn-project/circuits.js/src/structs/__snapshots__/header.test.ts.snap index 501bd971e54..467a757792b 100644 --- a/yarn-project/circuits.js/src/structs/__snapshots__/header.test.ts.snap +++ b/yarn-project/circuits.js/src/structs/__snapshots__/header.test.ts.snap @@ -2,41 +2,41 @@ exports[`Header computes empty hash 1`] = ` Fr { - "asBigInt": 20794359902049712309840803989537372971066838126069955186305683313093334375790n, + "asBigInt": 8280413333055833283969779932916583089750947685208308514303848718118648334247n, "asBuffer": { "data": [ - 45, - 249, - 48, - 204, - 123, - 159, + 18, + 78, + 140, + 64, + 166, + 236, + 162, + 227, + 173, + 16, + 192, + 64, + 80, + 176, + 26, + 63, + 173, + 0, + 223, + 60, + 234, + 71, + 177, + 53, + 146, 199, - 99, - 232, - 42, - 222, - 114, - 247, - 196, - 97, - 136, - 52, + 87, + 27, 105, - 43, - 42, - 61, - 9, - 54, - 175, - 248, - 215, - 187, - 251, - 39, - 245, - 157, - 110, + 20, + 199, + 167, ], "type": "Buffer", }, @@ -45,41 +45,41 @@ Fr { exports[`Header computes hash 1`] = ` Fr { - "asBigInt": 17965313985247589544372198735324565090920557482351371957268170919526618141863n, + "asBigInt": 13391833266438070501747208007860454985931191848099905441104050953572345014416n, "asBuffer": { "data": [ - 39, - 184, - 1, - 227, - 84, - 195, - 178, - 90, + 29, + 155, + 130, + 79, + 53, + 97, + 231, 6, - 248, - 237, - 161, - 177, - 253, + 217, + 232, + 95, + 222, + 137, 166, - 87, - 161, - 67, - 151, - 185, - 244, - 147, - 251, - 142, - 40, - 36, - 177, + 10, + 30, 92, - 201, - 16, - 148, - 167, + 37, + 223, + 248, + 57, + 22, + 124, + 186, + 115, + 102, + 202, + 143, + 110, + 233, + 104, + 144, ], "type": "Buffer", }, diff --git a/yarn-project/circuits.js/src/structs/__snapshots__/private_call_stack_item.test.ts.snap b/yarn-project/circuits.js/src/structs/__snapshots__/private_call_stack_item.test.ts.snap index b33e985b0ed..e5960d9e4d8 100644 --- a/yarn-project/circuits.js/src/structs/__snapshots__/private_call_stack_item.test.ts.snap +++ b/yarn-project/circuits.js/src/structs/__snapshots__/private_call_stack_item.test.ts.snap @@ -2,41 +2,41 @@ exports[`PrivateCallStackItem computes empty item hash 1`] = ` Fr { - "asBigInt": 11728545222320447463870615847019406452447697153424151627800539679719144535960n, + "asBigInt": 12769720081759355614976306280368712404317347095194597439292433374078086865501n, "asBuffer": { "data": [ - 25, - 238, - 31, + 28, + 59, + 103, + 202, + 178, + 188, + 61, + 194, 16, - 197, - 192, - 80, - 138, - 141, - 114, - 125, - 160, - 12, - 151, + 108, + 254, + 221, + 216, + 234, + 104, 184, - 25, - 133, - 34, - 215, - 161, - 127, - 171, - 115, - 235, - 128, - 79, - 36, - 24, - 49, - 119, - 183, - 152, + 212, + 69, + 132, + 159, + 32, + 237, + 59, + 146, + 134, + 173, + 104, + 69, + 66, + 170, + 226, + 93, ], "type": "Buffer", }, @@ -45,41 +45,41 @@ Fr { exports[`PrivateCallStackItem computes hash 1`] = ` Fr { - "asBigInt": 6461024313550232992012690944449959956801421547254954441618992574842987860340n, + "asBigInt": 15383273197742358276934050237500503271511420067531095659815503482756967908035n, "asBuffer": { "data": [ - 14, - 72, - 207, - 103, - 60, - 81, - 67, - 141, - 102, - 164, - 56, - 11, - 55, - 163, - 108, - 206, - 136, - 68, - 246, - 140, - 171, - 112, + 34, + 2, + 159, + 195, + 160, + 177, 139, - 222, - 67, - 9, - 45, - 31, - 20, - 79, - 209, - 116, + 143, + 159, + 228, + 213, + 205, + 178, + 55, + 185, + 181, + 88, + 12, + 157, + 210, + 54, + 130, + 153, + 147, + 109, + 141, + 238, + 223, + 19, + 215, + 66, + 195, ], "type": "Buffer", }, diff --git a/yarn-project/circuits.js/src/structs/__snapshots__/private_circuit_public_inputs.test.ts.snap b/yarn-project/circuits.js/src/structs/__snapshots__/private_circuit_public_inputs.test.ts.snap index 658eb5ad80c..7eb616a5eb0 100644 --- a/yarn-project/circuits.js/src/structs/__snapshots__/private_circuit_public_inputs.test.ts.snap +++ b/yarn-project/circuits.js/src/structs/__snapshots__/private_circuit_public_inputs.test.ts.snap @@ -2,41 +2,41 @@ exports[`PrivateCircuitPublicInputs computes empty inputs hash 1`] = ` Fr { - "asBigInt": 8922874219514432875012773391923445472064121190200882885713359100997704012295n, + "asBigInt": 17763745006781169314070208966183477520908528509358950542366727651717742935982n, "asBuffer": { "data": [ - 19, - 186, - 42, - 247, - 94, + 39, + 69, + 236, + 98, + 98, 74, - 250, - 164, - 229, - 45, - 209, + 254, + 177, + 155, + 134, 175, - 160, - 131, - 232, - 119, - 6, - 205, - 186, + 61, + 68, + 13, 177, - 163, - 52, - 66, - 2, - 93, + 248, 195, - 169, - 187, - 181, - 70, - 210, - 7, + 67, + 46, + 29, + 23, + 160, + 116, + 199, + 92, + 184, + 244, + 73, + 153, + 253, + 63, + 174, ], "type": "Buffer", }, @@ -45,41 +45,41 @@ Fr { exports[`PrivateCircuitPublicInputs hash matches snapshot 1`] = ` Fr { - "asBigInt": 7066918351069413889843757132918099018108150218337345110167110186913735749525n, + "asBigInt": 2683406990652275710764560045525101720521614888217420318262138072256150221152n, "asBuffer": { "data": [ - 15, - 159, - 187, - 234, - 36, - 85, + 5, + 238, + 193, + 41, + 37, 47, + 34, + 41, + 119, + 127, + 150, + 68, + 108, + 41, 1, - 117, - 177, - 232, - 159, - 46, - 23, - 164, - 203, - 100, - 106, - 64, - 164, + 230, + 96, 198, - 12, - 59, - 118, - 51, - 144, - 90, - 35, - 200, + 224, + 30, 25, - 175, - 149, + 96, + 0, + 181, + 124, + 153, + 251, + 58, + 236, + 67, + 177, + 96, ], "type": "Buffer", }, diff --git a/yarn-project/circuits.js/src/structs/__snapshots__/public_call_stack_item.test.ts.snap b/yarn-project/circuits.js/src/structs/__snapshots__/public_call_stack_item.test.ts.snap index f0b947728b1..2a3fa9827d5 100644 --- a/yarn-project/circuits.js/src/structs/__snapshots__/public_call_stack_item.test.ts.snap +++ b/yarn-project/circuits.js/src/structs/__snapshots__/public_call_stack_item.test.ts.snap @@ -1,46 +1,46 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`PublicCallStackItem Computes a callstack item hash 1`] = `"0x182201ec06be2dc7eddaa8b828eb293eab9938c4d41cde1e2b1b766ee21d2a54"`; +exports[`PublicCallStackItem Computes a callstack item hash 1`] = `"0x086b4890110c751f01df5eb163b250f10c90a4f38e73e07e3b5a58685456eaa9"`; -exports[`PublicCallStackItem Computes a callstack item request hash 1`] = `"0x10017014b5fd719261c575bd7acd1e604c0dd3e86d8c6af80294eadfc6d174a7"`; +exports[`PublicCallStackItem Computes a callstack item request hash 1`] = `"0x09cb16dc10b48bb544bd5f4293cfd2dee539bd281aa468c0c69a9352df17a307"`; exports[`PublicCallStackItem computes hash 1`] = ` Fr { - "asBigInt": 45410678569143484234609653232067005723125960091308451781456680995218457503n, + "asBigInt": 11555040142515015296271093908395853249446924243912159350088258091554726377002n, "asBuffer": { "data": [ - 0, 25, - 179, - 151, + 139, + 235, + 195, 174, - 187, + 57, + 172, + 112, + 65, + 182, 246, - 36, - 171, - 201, - 108, - 111, - 243, - 253, - 214, - 195, - 214, - 206, + 207, + 145, + 207, + 32, + 85, 229, - 122, - 245, - 52, - 105, - 87, - 65, - 44, - 87, - 45, - 27, - 159, - 3, - 159, + 119, + 73, + 79, + 143, + 33, + 69, + 216, + 22, + 1, + 177, + 146, + 247, + 30, + 118, + 42, ], "type": "Buffer", }, diff --git a/yarn-project/circuits.js/src/structs/__snapshots__/public_circuit_public_inputs.test.ts.snap b/yarn-project/circuits.js/src/structs/__snapshots__/public_circuit_public_inputs.test.ts.snap index 7a5dd3fc1f0..b08789cc35d 100644 --- a/yarn-project/circuits.js/src/structs/__snapshots__/public_circuit_public_inputs.test.ts.snap +++ b/yarn-project/circuits.js/src/structs/__snapshots__/public_circuit_public_inputs.test.ts.snap @@ -2,41 +2,41 @@ exports[`PublicCircuitPublicInputs computes empty item hash 1`] = ` Fr { - "asBigInt": 899041383159782383308350091877472492566207915893045234143560027519589938411n, + "asBigInt": 9609732044359561258062401911357150124837675690017360504541665164853384659385n, "asBuffer": { "data": [ + 21, + 62, + 234, + 100, + 13, + 208, + 165, + 62, + 170, + 2, + 147, 1, - 252, + 56, + 25, + 98, + 80, + 127, + 184, + 158, + 52, + 141, + 66, 214, - 226, - 72, - 9, - 9, - 213, - 95, - 3, - 244, - 238, - 135, - 146, + 243, + 51, + 81, + 7, + 100, 76, - 186, - 187, - 11, - 71, - 6, - 203, - 116, - 44, - 112, - 66, - 46, - 66, - 59, - 45, - 181, - 244, - 235, + 101, + 65, + 185, ], "type": "Buffer", }, @@ -45,41 +45,41 @@ Fr { exports[`PublicCircuitPublicInputs hash matches snapshot 1`] = ` Fr { - "asBigInt": 11132983907867837190629216452861649594433048836605582311662020710335671547249n, + "asBigInt": 19397609181117033064647611241214741110812938110364460444555150288439577017398n, "asBuffer": { "data": [ - 24, - 157, - 11, - 171, - 221, - 156, - 218, - 207, - 106, - 253, - 198, - 99, - 204, - 123, - 221, - 188, - 0, - 191, - 126, + 42, + 226, + 168, + 96, + 213, + 17, 172, - 98, - 53, - 110, - 180, - 142, - 8, - 253, - 250, - 103, - 217, - 181, - 113, + 178, + 116, + 220, + 163, + 61, + 231, + 166, + 70, + 147, + 254, + 41, + 72, + 39, + 94, + 209, + 73, + 226, + 219, + 131, + 45, + 214, + 206, + 33, + 252, + 54, ], "type": "Buffer", }, diff --git a/yarn-project/circuits.js/src/structs/__snapshots__/tx_context.test.ts.snap b/yarn-project/circuits.js/src/structs/__snapshots__/tx_context.test.ts.snap index 40d9eb511f0..4d6e91939db 100644 --- a/yarn-project/circuits.js/src/structs/__snapshots__/tx_context.test.ts.snap +++ b/yarn-project/circuits.js/src/structs/__snapshots__/tx_context.test.ts.snap @@ -2,41 +2,41 @@ exports[`TxContext computes empty hash 1`] = ` Fr { - "asBigInt": 21032445753769195248650393789370064301738468736130164917667517476782805795195n, + "asBigInt": 14483571110897883400419490783710119837459619381345566311432831352122387488397n, "asBuffer": { "data": [ - 46, - 127, - 241, - 67, + 32, + 5, + 105, + 38, + 124, + 15, + 115, + 172, 137, - 238, - 243, - 220, - 81, - 89, - 117, - 41, + 170, + 164, 20, - 158, - 1, - 180, - 156, - 179, - 56, - 41, - 247, - 8, + 35, + 147, + 152, + 219, 148, - 56, - 200, - 193, 69, - 200, - 243, - 82, - 193, - 123, + 221, + 74, + 211, + 168, + 207, + 55, + 1, + 92, + 213, + 91, + 141, + 76, + 94, + 141, ], "type": "Buffer", }, diff --git a/yarn-project/circuits.js/src/structs/__snapshots__/tx_request.test.ts.snap b/yarn-project/circuits.js/src/structs/__snapshots__/tx_request.test.ts.snap index fd6001beca6..4de712a3404 100644 --- a/yarn-project/circuits.js/src/structs/__snapshots__/tx_request.test.ts.snap +++ b/yarn-project/circuits.js/src/structs/__snapshots__/tx_request.test.ts.snap @@ -1,3 +1,3 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`TxRequest compute hash 1`] = `"0x05e3f67a5e787faf63c85c28169a9d616b594c9799d9785b4f167d9cd7a71e9e"`; +exports[`TxRequest compute hash 1`] = `"0x0ab4eaebf540be2999b50051b3c272b5bf7be23d59233b6d453272a42c3c08e5"`; diff --git a/yarn-project/circuits.js/src/structs/call_context.ts b/yarn-project/circuits.js/src/structs/call_context.ts index 0e79e08f399..a7a1d328487 100644 --- a/yarn-project/circuits.js/src/structs/call_context.ts +++ b/yarn-project/circuits.js/src/structs/call_context.ts @@ -38,10 +38,6 @@ export class CallContext { * Determines whether the call is modifying state. */ public isStaticCall: boolean, - /** - * Determines whether the call is a contract deployment. - */ - public isContractDeployment: boolean, /** * The start side effect counter for this call context. */ @@ -60,7 +56,6 @@ export class CallContext { FunctionSelector.empty(), false, false, - false, 0, ); } @@ -87,7 +82,6 @@ export class CallContext { fields.functionSelector, fields.isDelegateCall, fields.isStaticCall, - fields.isContractDeployment, fields.startSideEffectCounter, ] as const; } @@ -124,7 +118,6 @@ export class CallContext { reader.readObject(FunctionSelector), reader.readBoolean(), reader.readBoolean(), - reader.readBoolean(), reader.readNumber(), ); } @@ -138,7 +131,6 @@ export class CallContext { reader.readObject(FunctionSelector), reader.readBoolean(), reader.readBoolean(), - reader.readBoolean(), reader.readU32(), ); } @@ -151,7 +143,6 @@ export class CallContext { callContext.functionSelector.equals(this.functionSelector) && callContext.isDelegateCall === this.isDelegateCall && callContext.isStaticCall === this.isStaticCall && - callContext.isContractDeployment === this.isContractDeployment && callContext.startSideEffectCounter === this.startSideEffectCounter ); } diff --git a/yarn-project/circuits.js/src/structs/contract_deployment_data.test.ts b/yarn-project/circuits.js/src/structs/contract_deployment_data.test.ts deleted file mode 100644 index 9bddc3a47cf..00000000000 --- a/yarn-project/circuits.js/src/structs/contract_deployment_data.test.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { CONTRACT_DEPLOYMENT_DATA_LENGTH } from '../constants.gen.js'; -import { makeContractDeploymentData } from '../tests/factories.js'; -import { ContractDeploymentData } from './contract_deployment_data.js'; - -describe('ContractDeploymentData', () => { - it(`serializes to buffer and deserializes it back`, () => { - const expected = makeContractDeploymentData(1); - const buffer = expected.toBuffer(); - const res = ContractDeploymentData.fromBuffer(buffer); - expect(res).toEqual(expected); - expect(res.isEmpty()).toBe(false); - }); - - it('number of fields matches constant', () => { - const target = makeContractDeploymentData(327); - const fields = target.toFields(); - expect(fields.length).toBe(CONTRACT_DEPLOYMENT_DATA_LENGTH); - }); - - it('computes empty hash', () => { - const cd = ContractDeploymentData.empty(); - expect(cd.isEmpty()).toBe(true); - - const hash = cd.hash(); - expect(hash).toMatchSnapshot(); - - // Value used in empty_hash test in contract_deployment_data.nr - // console.log("hash", hash.toString()); - }); -}); diff --git a/yarn-project/circuits.js/src/structs/contract_deployment_data.ts b/yarn-project/circuits.js/src/structs/contract_deployment_data.ts deleted file mode 100644 index e7fdb5d7e71..00000000000 --- a/yarn-project/circuits.js/src/structs/contract_deployment_data.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { pedersenHash } from '@aztec/foundation/crypto'; -import { EthAddress } from '@aztec/foundation/eth-address'; -import { Fr, Point } from '@aztec/foundation/fields'; -import { BufferReader, FieldReader, serializeToBuffer, serializeToFields } from '@aztec/foundation/serialize'; -import { FieldsOf } from '@aztec/foundation/types'; - -import { CONTRACT_DEPLOYMENT_DATA_LENGTH, GeneratorIndex } from '../constants.gen.js'; -import { PublicKey } from '../types/public_key.js'; - -/** - * Contract deployment data in a TxContext - * Not to be confused with NewContractData. - */ -export class ContractDeploymentData { - constructor( - /** Public key of the contract. */ - public publicKey: PublicKey, - /** Hash of the initialization payload. */ - public initializationHash: Fr, - /** Contract class identifier. */ - public contractClassId: Fr, - /** Contract address salt (used when deriving a contract address). */ - public contractAddressSalt: Fr, - /** Ethereum address of the portal contract on L1. */ - public portalContractAddress: EthAddress, - ) {} - - static getFields(fields: FieldsOf) { - return [ - fields.publicKey, - fields.initializationHash, - fields.contractClassId, - fields.contractAddressSalt, - fields.portalContractAddress, - ] as const; - } - - toBuffer() { - return serializeToBuffer(...ContractDeploymentData.getFields(this)); - } - - toFields(): Fr[] { - const fields = serializeToFields(...ContractDeploymentData.getFields(this)); - if (fields.length !== CONTRACT_DEPLOYMENT_DATA_LENGTH) { - throw new Error( - `Invalid number of fields for ContractDeploymentData. Expected ${CONTRACT_DEPLOYMENT_DATA_LENGTH}, got ${fields.length}`, - ); - } - return fields; - } - - /** - * Returns an empty ContractDeploymentData. - * @returns The empty ContractDeploymentData. - */ - public static empty(): ContractDeploymentData { - return new ContractDeploymentData(Point.ZERO, Fr.ZERO, Fr.ZERO, Fr.ZERO, EthAddress.ZERO); - } - - isEmpty() { - return ContractDeploymentData.getFields(this).every(f => f.isZero()); - } - - /** - * Deserializes contract deployment data rom a buffer or reader. - * @param buffer - Buffer to read from. - * @returns The deserialized ContractDeploymentData. - */ - static fromBuffer(buffer: Buffer | BufferReader): ContractDeploymentData { - const reader = BufferReader.asReader(buffer); - return new ContractDeploymentData( - reader.readObject(Point), - Fr.fromBuffer(reader), - Fr.fromBuffer(reader), - Fr.fromBuffer(reader), - reader.readObject(EthAddress), - ); - } - - static fromFields(fields: Fr[] | FieldReader): ContractDeploymentData { - const reader = FieldReader.asReader(fields); - return new ContractDeploymentData( - reader.readObject(Point), - reader.readField(), - reader.readField(), - reader.readField(), - reader.readObject(EthAddress), - ); - } - - hash(): Fr { - return pedersenHash( - this.toFields().map(f => f.toBuffer()), - GeneratorIndex.CONTRACT_DEPLOYMENT_DATA, - ); - } -} diff --git a/yarn-project/circuits.js/src/structs/function_data.ts b/yarn-project/circuits.js/src/structs/function_data.ts index 310d03507aa..65a6cfee4bb 100644 --- a/yarn-project/circuits.js/src/structs/function_data.ts +++ b/yarn-project/circuits.js/src/structs/function_data.ts @@ -8,6 +8,7 @@ import { ContractFunctionDao } from '../types/contract_function_dao.js'; /** * Function description for circuit. + * TODO(palla/purge-old-contract-deploy): Remove constructor and possibly internal flags from this struct. */ export class FunctionData { constructor( diff --git a/yarn-project/circuits.js/src/structs/global_variables.ts b/yarn-project/circuits.js/src/structs/global_variables.ts index 3b117686064..05c90e8b0e3 100644 --- a/yarn-project/circuits.js/src/structs/global_variables.ts +++ b/yarn-project/circuits.js/src/structs/global_variables.ts @@ -1,9 +1,10 @@ +import { AztecAddress } from '@aztec/foundation/aztec-address'; +import { EthAddress } from '@aztec/foundation/eth-address'; import { Fr } from '@aztec/foundation/fields'; import { BufferReader, FieldReader, serializeToBuffer, serializeToFields } from '@aztec/foundation/serialize'; import { FieldsOf } from '@aztec/foundation/types'; import { GLOBAL_VARIABLES_LENGTH } from '../constants.gen.js'; -import { AztecAddress, EthAddress } from './index.js'; /** * Global variables of the L2 block. diff --git a/yarn-project/circuits.js/src/structs/header.test.ts b/yarn-project/circuits.js/src/structs/header.test.ts index 0cdd77ea8c8..6bc2bbc084c 100644 --- a/yarn-project/circuits.js/src/structs/header.test.ts +++ b/yarn-project/circuits.js/src/structs/header.test.ts @@ -1,3 +1,5 @@ +import { updateInlineTestData } from '@aztec/foundation/testing'; + import { HEADER_LENGTH } from '../constants.gen.js'; import { makeHeader } from '../tests/factories.js'; import { Header } from './header.js'; @@ -39,7 +41,11 @@ describe('Header', () => { const hash = header.hash(); expect(hash).toMatchSnapshot(); - // Value used in empty_hash test in header.nr - // console.log("hash", hash.toString()); + // Run with AZTEC_GENERATE_TEST_DATA=1 to update noir test data + updateInlineTestData( + 'noir-projects/noir-protocol-circuits/crates/types/src/header.nr', + 'test_data_empty_hash', + hash.toString(), + ); }); }); diff --git a/yarn-project/circuits.js/src/structs/index.ts b/yarn-project/circuits.js/src/structs/index.ts index 5ec39a492e0..f18f723e1e0 100644 --- a/yarn-project/circuits.js/src/structs/index.ts +++ b/yarn-project/circuits.js/src/structs/index.ts @@ -4,7 +4,6 @@ export * from './call_context.js'; export * from './call_request.js'; export * from './complete_address.js'; export * from './content_commitment.js'; -export * from './contract_deployment_data.js'; export * from './contract_storage_read.js'; export * from './contract_storage_update_request.js'; export * from './function_data.js'; @@ -13,7 +12,6 @@ export * from './global_variables.js'; export * from './header.js'; export * from './kernel/combined_accumulated_data.js'; export * from './kernel/combined_constant_data.js'; -export * from './kernel/new_contract_data.js'; export * from './kernel/private_call_data.js'; export * from './kernel/private_kernel_init_circuit_private_inputs.js'; export * from './kernel/private_kernel_inner_circuit_private_inputs.js'; diff --git a/yarn-project/circuits.js/src/structs/kernel/__snapshots__/new_contract_data.test.ts.snap b/yarn-project/circuits.js/src/structs/kernel/__snapshots__/new_contract_data.test.ts.snap deleted file mode 100644 index 1166a008d9e..00000000000 --- a/yarn-project/circuits.js/src/structs/kernel/__snapshots__/new_contract_data.test.ts.snap +++ /dev/null @@ -1,87 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`NewContractData computes contract leaf 1`] = ` -Fr { - "asBigInt": 1205669559362216690501113071754010899122564402260118295790326203728712063609n, - "asBuffer": { - "data": [ - 2, - 170, - 98, - 129, - 115, - 236, - 158, - 132, - 183, - 0, - 14, - 176, - 170, - 124, - 64, - 104, - 64, - 24, - 101, - 95, - 230, - 204, - 70, - 89, - 105, - 38, - 142, - 94, - 141, - 66, - 90, - 121, - ], - "type": "Buffer", - }, -} -`; - -exports[`NewContractData hash matches 1`] = ` -Fr { - "asBigInt": 15989124907542145791377884953407893320840303158499919884975910897341668572939n, - "asBuffer": { - "data": [ - 35, - 89, - 134, - 36, - 130, - 251, - 88, - 207, - 90, - 93, - 218, - 181, - 110, - 182, - 212, - 153, - 8, - 188, - 129, - 19, - 83, - 243, - 253, - 111, - 233, - 253, - 5, - 124, - 82, - 92, - 191, - 11, - ], - "type": "Buffer", - }, -} -`; diff --git a/yarn-project/circuits.js/src/structs/kernel/combined_accumulated_data.ts b/yarn-project/circuits.js/src/structs/kernel/combined_accumulated_data.ts index 65689c76f70..1e05e125508 100644 --- a/yarn-project/circuits.js/src/structs/kernel/combined_accumulated_data.ts +++ b/yarn-project/circuits.js/src/structs/kernel/combined_accumulated_data.ts @@ -7,7 +7,6 @@ import { BufferReader, Tuple, serializeToBuffer } from '@aztec/foundation/serial import { inspect } from 'util'; import { - MAX_NEW_CONTRACTS_PER_TX, MAX_NEW_L2_TO_L1_MSGS_PER_CALL, MAX_NEW_L2_TO_L1_MSGS_PER_TX, MAX_NEW_NOTE_HASHES_PER_TX, @@ -35,7 +34,6 @@ import { CallRequest } from '../call_request.js'; import { NullifierKeyValidationRequestContext } from '../nullifier_key_validation_request.js'; import { ReadRequestContext } from '../read_request.js'; import { SideEffect, SideEffectLinkedToNoteHash } from '../side_effects.js'; -import { NewContractData } from './new_contract_data.js'; const log = createDebugOnlyLogger('aztec:combined_accumulated_data'); @@ -217,10 +215,6 @@ export class CombinedAccumulatedData { * Total accumulated length of the unencrypted log preimages emitted in all the previous kernel iterations */ public unencryptedLogPreimagesLength: Fr, - /** - * All the new contracts deployed in this transaction. - */ - public newContracts: Tuple, /** * All the public data update requests made in this transaction. */ @@ -245,7 +239,6 @@ export class CombinedAccumulatedData { this.unencryptedLogsHash, this.encryptedLogPreimagesLength, this.unencryptedLogPreimagesLength, - this.newContracts, this.publicDataUpdateRequests, this.publicDataReads, ); @@ -275,7 +268,6 @@ export class CombinedAccumulatedData { reader.readArray(2, Fr), Fr.fromBuffer(reader), Fr.fromBuffer(reader), - reader.readArray(MAX_NEW_CONTRACTS_PER_TX, NewContractData), reader.readArray(MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, PublicDataUpdateRequest), reader.readArray(MAX_PUBLIC_DATA_READS_PER_TX, PublicDataRead), ); @@ -304,7 +296,6 @@ export class CombinedAccumulatedData { makeTuple(2, Fr.zero), Fr.zero(), Fr.zero(), - makeTuple(MAX_NEW_CONTRACTS_PER_TX, NewContractData.empty), makeTuple(MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, PublicDataUpdateRequest.empty), makeTuple(MAX_PUBLIC_DATA_READS_PER_TX, PublicDataRead.empty), ); @@ -383,7 +374,6 @@ export class CombinedAccumulatedData { revertible.unencryptedLogsHash, revertible.encryptedLogPreimagesLength, revertible.unencryptedLogPreimagesLength, - revertible.newContracts, publicDataUpdateRequests, publicDataReads, ); @@ -445,10 +435,6 @@ export class PublicAccumulatedRevertibleData { * Total accumulated length of the unencrypted log preimages emitted in all the previous kernel iterations */ public unencryptedLogPreimagesLength: Fr, - /** - * All the new contracts deployed in this transaction. - */ - public newContracts: Tuple, /** * All the public data update requests made in this transaction. */ @@ -475,7 +461,6 @@ export class PublicAccumulatedRevertibleData { this.unencryptedLogsHash, this.encryptedLogPreimagesLength, this.unencryptedLogPreimagesLength, - this.newContracts, this.publicDataUpdateRequests, this.publicDataReads, ); @@ -499,7 +484,6 @@ export class PublicAccumulatedRevertibleData { this.unencryptedLogsHash.every(x => x.isZero()) && this.encryptedLogPreimagesLength.isZero() && this.unencryptedLogPreimagesLength.isZero() && - this.newContracts.every(x => x.isEmpty()) && this.publicDataUpdateRequests.every(x => x.isEmpty()) && this.publicDataReads.every(x => x.isEmpty()) ); @@ -520,7 +504,6 @@ export class PublicAccumulatedRevertibleData { unencryptedLogsHash: [${this.unencryptedLogsHash.map(h => h.toString()).join(', ')}], encryptedLogPreimagesLength: ${this.encryptedLogPreimagesLength} unencryptedLogPreimagesLength: ${this.unencryptedLogPreimagesLength} - newContracts: [${this.newContracts.map(h => h.toString()).join(', ')}], publicDataUpdateRequests: [${this.publicDataUpdateRequests.map(h => h.toString()).join(', ')}], publicDataReads: [${this.publicDataReads.map(h => h.toString()).join(', ')}], }`; @@ -546,7 +529,6 @@ export class PublicAccumulatedRevertibleData { reader.readArray(2, Fr), Fr.fromBuffer(reader), Fr.fromBuffer(reader), - reader.readArray(MAX_NEW_CONTRACTS_PER_TX, NewContractData), reader.readArray(MAX_REVERTIBLE_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, PublicDataUpdateRequest), reader.readArray(MAX_REVERTIBLE_PUBLIC_DATA_READS_PER_TX, PublicDataRead), ); @@ -566,7 +548,6 @@ export class PublicAccumulatedRevertibleData { finalData.unencryptedLogsHash, finalData.encryptedLogPreimagesLength, finalData.unencryptedLogPreimagesLength, - finalData.newContracts, makeTuple(MAX_REVERTIBLE_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, PublicDataUpdateRequest.empty), makeTuple(MAX_REVERTIBLE_PUBLIC_DATA_READS_PER_TX, PublicDataRead.empty), ); @@ -595,7 +576,6 @@ export class PublicAccumulatedRevertibleData { makeTuple(2, Fr.zero), Fr.zero(), Fr.zero(), - makeTuple(MAX_NEW_CONTRACTS_PER_TX, NewContractData.empty), makeTuple(MAX_REVERTIBLE_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, PublicDataUpdateRequest.empty), makeTuple(MAX_REVERTIBLE_PUBLIC_DATA_READS_PER_TX, PublicDataRead.empty), ); @@ -647,10 +627,6 @@ export class PrivateAccumulatedRevertibleData { * Total accumulated length of the unencrypted log preimages emitted in all the previous kernel iterations */ public unencryptedLogPreimagesLength: Fr, - /** - * All the new contracts deployed in this transaction. - */ - public newContracts: Tuple, ) {} toBuffer() { @@ -664,7 +640,6 @@ export class PrivateAccumulatedRevertibleData { this.unencryptedLogsHash, this.encryptedLogPreimagesLength, this.unencryptedLogPreimagesLength, - this.newContracts, ); } @@ -689,7 +664,6 @@ export class PrivateAccumulatedRevertibleData { reader.readArray(2, Fr), Fr.fromBuffer(reader), Fr.fromBuffer(reader), - reader.readArray(MAX_NEW_CONTRACTS_PER_TX, NewContractData), ); } @@ -713,7 +687,6 @@ export class PrivateAccumulatedRevertibleData { makeTuple(2, Fr.zero), Fr.zero(), Fr.zero(), - makeTuple(MAX_NEW_CONTRACTS_PER_TX, NewContractData.empty), ); } } diff --git a/yarn-project/circuits.js/src/structs/kernel/new_contract_data.test.ts b/yarn-project/circuits.js/src/structs/kernel/new_contract_data.test.ts deleted file mode 100644 index 73dc20f8e67..00000000000 --- a/yarn-project/circuits.js/src/structs/kernel/new_contract_data.test.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { Fr } from '@aztec/foundation/fields'; - -import { NEW_CONTRACT_DATA_LENGTH } from '../../constants.gen.js'; -import { makeNewContractData } from '../../tests/factories.js'; -import { NewContractData } from './new_contract_data.js'; - -describe('NewContractData', () => { - let data: NewContractData; - - beforeAll(() => { - const randomInt = Math.floor(Math.random() * 1000); - data = makeNewContractData(randomInt); - }); - - it('serializes to buffer and deserializes it back', () => { - const buffer = data.toBuffer(); - const res = NewContractData.fromBuffer(buffer); - expect(res).toEqual(data); - }); - - it('number of fields matches constant', () => { - const fields = data.toFields(); - expect(fields.length).toBe(NEW_CONTRACT_DATA_LENGTH); - }); - - it('computes contract leaf', () => { - const cd = makeNewContractData(12); - const hash = cd.hash(); - expect(hash).toMatchSnapshot(); - }); - - it('empty "hash" is zero', () => { - const cd = NewContractData.empty(); - expect(cd.isEmpty()).toBe(true); - - const hash = cd.hash(); - expect(hash).toEqual(Fr.ZERO); - }); - - it('hash matches', () => { - const cd = makeNewContractData(5); - const hash = cd.hash(); - expect(hash).toMatchSnapshot(); - - // Value used in hash_matches test in new_contract_data.nr - // console.log("hash", hash.toString()); - }); -}); diff --git a/yarn-project/circuits.js/src/structs/kernel/new_contract_data.ts b/yarn-project/circuits.js/src/structs/kernel/new_contract_data.ts deleted file mode 100644 index 82921fc545f..00000000000 --- a/yarn-project/circuits.js/src/structs/kernel/new_contract_data.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { AztecAddress } from '@aztec/foundation/aztec-address'; -import { pedersenHash } from '@aztec/foundation/crypto'; -import { EthAddress } from '@aztec/foundation/eth-address'; -import { Fr } from '@aztec/foundation/fields'; -import { BufferReader, serializeToBuffer, serializeToFields } from '@aztec/foundation/serialize'; -import { FieldsOf } from '@aztec/foundation/types'; - -import { GeneratorIndex, NEW_CONTRACT_DATA_LENGTH } from '../../constants.gen.js'; - -/** - * The information assembled after the contract deployment was processed by the private kernel circuit. - * - * Note: Not to be confused with `ContractDeploymentData`. - */ -export class NewContractData { - constructor( - /** - * Aztec address of the contract. - */ - public contractAddress: AztecAddress, - /** - * Ethereum address of the portal contract on L1. - */ - public portalContractAddress: EthAddress, - /** - * Contract class id. - */ - public contractClassId: Fr, - ) {} - - static getFields(fields: FieldsOf) { - return [fields.contractAddress, fields.portalContractAddress, fields.contractClassId] as const; - } - - toBuffer() { - return serializeToBuffer(...NewContractData.getFields(this)); - } - - toFields() { - const fields = serializeToFields(...NewContractData.getFields(this)); - if (fields.length !== NEW_CONTRACT_DATA_LENGTH) { - throw new Error( - `Invalid number of fields for NewContractData. Expected ${NEW_CONTRACT_DATA_LENGTH}, got ${fields.length}`, - ); - } - return fields; - } - - /** - * Computes a hash of contract data which is a leaf in the contracts tree. - * @param cd - The contract data of the deployed contract. - * @returns The contract data hash/contract tree leaf. - */ - hash(): Fr { - if (this.isEmpty()) { - return new Fr(0); - } - return pedersenHash( - NewContractData.getFields(this).map(f => f.toBuffer()), - GeneratorIndex.CONTRACT_LEAF, - ); - } - - /** - * Deserializes from a buffer or reader, corresponding to a write in cpp. - * @param buffer - Buffer or reader to read from. - * @returns The deserialized `NewContractData`. - */ - static fromBuffer(buffer: Buffer | BufferReader): NewContractData { - const reader = BufferReader.asReader(buffer); - return new NewContractData(reader.readObject(AztecAddress), reader.readObject(EthAddress), Fr.fromBuffer(reader)); - } - - static empty() { - return new NewContractData(AztecAddress.ZERO, EthAddress.ZERO, Fr.ZERO); - } - - /** - * Checks if the data is empty. - * @returns True if the data operation is empty, false otherwise. - */ - isEmpty(): boolean { - return this.contractAddress.isZero() && this.portalContractAddress.isZero() && this.contractClassId.isZero(); - } -} diff --git a/yarn-project/circuits.js/src/structs/partial_state_reference.ts b/yarn-project/circuits.js/src/structs/partial_state_reference.ts index 28dbd86654e..0ca6b790f38 100644 --- a/yarn-project/circuits.js/src/structs/partial_state_reference.ts +++ b/yarn-project/circuits.js/src/structs/partial_state_reference.ts @@ -13,8 +13,6 @@ export class PartialStateReference { public readonly noteHashTree: AppendOnlyTreeSnapshot, /** Snapshot of the nullifier tree. */ public readonly nullifierTree: AppendOnlyTreeSnapshot, - /** Snapshot of the contract tree. */ - public readonly contractTree: AppendOnlyTreeSnapshot, /** Snapshot of the public data tree. */ public readonly publicDataTree: AppendOnlyTreeSnapshot, ) {} @@ -25,7 +23,6 @@ export class PartialStateReference { reader.readObject(AppendOnlyTreeSnapshot), reader.readObject(AppendOnlyTreeSnapshot), reader.readObject(AppendOnlyTreeSnapshot), - reader.readObject(AppendOnlyTreeSnapshot), ); } @@ -34,10 +31,9 @@ export class PartialStateReference { const noteHashTree = AppendOnlyTreeSnapshot.fromFields(reader); const nullifierTree = AppendOnlyTreeSnapshot.fromFields(reader); - const contractTree = AppendOnlyTreeSnapshot.fromFields(reader); const publicDataTree = AppendOnlyTreeSnapshot.fromFields(reader); - return new PartialStateReference(noteHashTree, nullifierTree, contractTree, publicDataTree); + return new PartialStateReference(noteHashTree, nullifierTree, publicDataTree); } static empty(): PartialStateReference { @@ -45,19 +41,17 @@ export class PartialStateReference { AppendOnlyTreeSnapshot.zero(), AppendOnlyTreeSnapshot.zero(), AppendOnlyTreeSnapshot.zero(), - AppendOnlyTreeSnapshot.zero(), ); } toBuffer() { - return serializeToBuffer(this.noteHashTree, this.nullifierTree, this.contractTree, this.publicDataTree); + return serializeToBuffer(this.noteHashTree, this.nullifierTree, this.publicDataTree); } toFields() { const fields = [ ...this.noteHashTree.toFields(), ...this.nullifierTree.toFields(), - ...this.contractTree.toFields(), ...this.publicDataTree.toFields(), ]; if (fields.length !== PARTIAL_STATE_REFERENCE_LENGTH) { @@ -69,11 +63,6 @@ export class PartialStateReference { } isEmpty(): boolean { - return ( - this.noteHashTree.isZero() && - this.nullifierTree.isZero() && - this.contractTree.isZero() && - this.publicDataTree.isZero() - ); + return this.noteHashTree.isZero() && this.nullifierTree.isZero() && this.publicDataTree.isZero(); } } diff --git a/yarn-project/circuits.js/src/structs/private_call_stack_item.test.ts b/yarn-project/circuits.js/src/structs/private_call_stack_item.test.ts index a47f725551e..cc593e589db 100644 --- a/yarn-project/circuits.js/src/structs/private_call_stack_item.test.ts +++ b/yarn-project/circuits.js/src/structs/private_call_stack_item.test.ts @@ -1,3 +1,5 @@ +import { updateInlineTestData } from '@aztec/foundation/testing'; + import { PRIVATE_CALL_STACK_ITEM_LENGTH } from '../constants.gen.js'; import { makePrivateCallStackItem } from '../tests/factories.js'; import { PrivateCallStackItem } from './private_call_stack_item.js'; @@ -39,7 +41,11 @@ describe('PrivateCallStackItem', () => { const hash = item.hash(); expect(hash).toMatchSnapshot(); - // Value used in empty_hash test in private_call_stack_item.nr - // console.log("hash", hash.toString()); + // Run with AZTEC_GENERATE_TEST_DATA=1 to update noir test data + updateInlineTestData( + 'noir-projects/noir-protocol-circuits/crates/types/src/abis/private_call_stack_item.nr', + 'test_data_empty_hash', + hash.toString(), + ); }); }); diff --git a/yarn-project/circuits.js/src/structs/private_circuit_public_inputs.test.ts b/yarn-project/circuits.js/src/structs/private_circuit_public_inputs.test.ts index ab415ed487e..ab86b1a382a 100644 --- a/yarn-project/circuits.js/src/structs/private_circuit_public_inputs.test.ts +++ b/yarn-project/circuits.js/src/structs/private_circuit_public_inputs.test.ts @@ -1,3 +1,5 @@ +import { updateInlineTestData } from '@aztec/foundation/testing'; + import { PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH } from '../constants.gen.js'; import { makePrivateCircuitPublicInputs } from '../tests/factories.js'; import { PrivateCircuitPublicInputs } from './private_circuit_public_inputs.js'; @@ -43,7 +45,11 @@ describe('PrivateCircuitPublicInputs', () => { const hash = inputs.hash(); expect(hash).toMatchSnapshot(); - // Value used in empty_hash test in private_circuit_public_inputs.nr - // console.log("hash", hash.toString()); + // Run with AZTEC_GENERATE_TEST_DATA=1 to update noir test data + updateInlineTestData( + 'noir-projects/noir-protocol-circuits/crates/types/src/abis/private_circuit_public_inputs.nr', + 'test_data_empty_hash', + hash.toString(), + ); }); }); diff --git a/yarn-project/circuits.js/src/structs/private_circuit_public_inputs.ts b/yarn-project/circuits.js/src/structs/private_circuit_public_inputs.ts index af8fd80dac8..48d6f7c49c7 100644 --- a/yarn-project/circuits.js/src/structs/private_circuit_public_inputs.ts +++ b/yarn-project/circuits.js/src/structs/private_circuit_public_inputs.ts @@ -19,7 +19,6 @@ import { PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH, RETURN_VALUES_LENGTH, } from '../constants.gen.js'; -import { ContractDeploymentData } from '../structs/contract_deployment_data.js'; import { Header } from '../structs/header.js'; import { SideEffect, SideEffectLinkedToNoteHash } from '../structs/side_effects.js'; import { CallContext } from './call_context.js'; @@ -112,10 +111,6 @@ export class PrivateCircuitPublicInputs { * Header of a block whose state is used during private execution (not the block the transaction is included in). */ public historicalHeader: Header, - /** - * Deployment data of contracts being deployed in this kernel iteration. - */ - public contractDeploymentData: ContractDeploymentData, /** * Chain Id of the instance. * @@ -165,7 +160,6 @@ export class PrivateCircuitPublicInputs { reader.readObject(Fr), reader.readObject(Fr), reader.readObject(Header), - reader.readObject(ContractDeploymentData), reader.readObject(Fr), reader.readObject(Fr), ); @@ -192,7 +186,6 @@ export class PrivateCircuitPublicInputs { reader.readField(), reader.readField(), reader.readObject(Header), - reader.readObject(ContractDeploymentData), reader.readField(), reader.readField(), ); @@ -222,7 +215,6 @@ export class PrivateCircuitPublicInputs { Fr.ZERO, Fr.ZERO, Header.empty(), - ContractDeploymentData.empty(), Fr.ZERO, Fr.ZERO, ); @@ -251,7 +243,6 @@ export class PrivateCircuitPublicInputs { this.encryptedLogPreimagesLength.isZero() && this.unencryptedLogPreimagesLength.isZero() && this.historicalHeader.isEmpty() && - this.contractDeploymentData.isEmpty() && this.chainId.isZero() && this.version.isZero() ); @@ -282,7 +273,6 @@ export class PrivateCircuitPublicInputs { fields.encryptedLogPreimagesLength, fields.unencryptedLogPreimagesLength, fields.historicalHeader, - fields.contractDeploymentData, fields.chainId, fields.version, ] as const; diff --git a/yarn-project/circuits.js/src/structs/public_call_stack_item.test.ts b/yarn-project/circuits.js/src/structs/public_call_stack_item.test.ts index c615bc6f77d..79fa42c5417 100644 --- a/yarn-project/circuits.js/src/structs/public_call_stack_item.test.ts +++ b/yarn-project/circuits.js/src/structs/public_call_stack_item.test.ts @@ -1,3 +1,5 @@ +import { updateInlineTestData } from '@aztec/foundation/testing'; + import { makePublicCallStackItem } from '../tests/factories.js'; import { AztecAddress, Fr, FunctionData, FunctionSelector, SideEffect } from './index.js'; import { PublicCallStackItem } from './public_call_stack_item.js'; @@ -29,8 +31,12 @@ describe('PublicCallStackItem', () => { const hash = callStack.hash(); expect(hash.toString()).toMatchSnapshot(); - // Value used in compute_call_stack_item_hash test in public_call_stack_item.test.ts - // console.log("hash", hash.toString()); + // Run with AZTEC_GENERATE_TEST_DATA=1 to update noir test data + updateInlineTestData( + 'noir-projects/noir-protocol-circuits/crates/types/src/abis/public_call_stack_item.nr', + 'test_data_call_stack_item_request_hash', + hash.toString(), + ); }); it('Computes a callstack item hash', () => { @@ -43,7 +49,11 @@ describe('PublicCallStackItem', () => { const hash = callStack.hash(); expect(hash.toString()).toMatchSnapshot(); - // Value used in compute_call_stack_item_request_hash test in public_call_stack_item.test.ts - // console.log("hash", hash.toString()); + // Run with AZTEC_GENERATE_TEST_DATA=1 to update noir test data + updateInlineTestData( + 'noir-projects/noir-protocol-circuits/crates/types/src/abis/public_call_stack_item.nr', + 'test_data_call_stack_item_hash', + hash.toString(), + ); }); }); diff --git a/yarn-project/circuits.js/src/structs/public_circuit_public_inputs.test.ts b/yarn-project/circuits.js/src/structs/public_circuit_public_inputs.test.ts index a69c18ad6ec..e759b1998f2 100644 --- a/yarn-project/circuits.js/src/structs/public_circuit_public_inputs.test.ts +++ b/yarn-project/circuits.js/src/structs/public_circuit_public_inputs.test.ts @@ -1,3 +1,5 @@ +import { updateInlineTestData } from '@aztec/foundation/testing'; + import { PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH } from '../constants.gen.js'; import { makePublicCircuitPublicInputs } from '../tests/factories.js'; import { PublicCircuitPublicInputs } from './public_circuit_public_inputs.js'; @@ -34,7 +36,11 @@ describe('PublicCircuitPublicInputs', () => { const hash = item.hash(); expect(hash).toMatchSnapshot(); - // Value used in empty_hash test in public_circuit_public_inputs.nr - // console.log('hash', hash.toString()); + // Run with AZTEC_GENERATE_TEST_DATA=1 to update noir test data + updateInlineTestData( + 'noir-projects/noir-protocol-circuits/crates/types/src/abis/public_circuit_public_inputs.nr', + 'test_data_empty_hash', + hash.toString(), + ); }); }); diff --git a/yarn-project/circuits.js/src/structs/rollup/state_diff_hints.ts b/yarn-project/circuits.js/src/structs/rollup/state_diff_hints.ts index a73b13372f7..1a812819433 100644 --- a/yarn-project/circuits.js/src/structs/rollup/state_diff_hints.ts +++ b/yarn-project/circuits.js/src/structs/rollup/state_diff_hints.ts @@ -3,7 +3,6 @@ import { Tuple, serializeToBuffer } from '@aztec/foundation/serialize'; import { FieldsOf } from '@aztec/foundation/types'; import { - CONTRACT_SUBTREE_SIBLING_PATH_LENGTH, MAX_NEW_NULLIFIERS_PER_TX, NOTE_HASH_SUBTREE_SIBLING_PATH_LENGTH, NULLIFIER_SUBTREE_SIBLING_PATH_LENGTH, @@ -47,10 +46,6 @@ export class StateDiffHints { * Sibling path "pointing to" where the new nullifiers subtree should be inserted into the nullifier tree. */ public nullifierSubtreeSiblingPath: Tuple, - /** - * Sibling path "pointing to" where the new contracts subtree should be inserted into the contract tree. - */ - public contractSubtreeSiblingPath: Tuple, /** * Sibling path "pointing to" where the new public data subtree should be inserted into the public data tree. */ @@ -69,7 +64,6 @@ export class StateDiffHints { fields.sortedNullifierIndexes, fields.noteHashSubtreeSiblingPath, fields.nullifierSubtreeSiblingPath, - fields.contractSubtreeSiblingPath, fields.publicDataSiblingPath, ] as const; } diff --git a/yarn-project/circuits.js/src/structs/tx_context.test.ts b/yarn-project/circuits.js/src/structs/tx_context.test.ts index d090be9f0ed..2e0888e8a3f 100644 --- a/yarn-project/circuits.js/src/structs/tx_context.test.ts +++ b/yarn-project/circuits.js/src/structs/tx_context.test.ts @@ -1,3 +1,5 @@ +import { updateInlineTestData } from '@aztec/foundation/testing'; + import { TX_CONTEXT_DATA_LENGTH } from '../constants.gen.js'; import { makeTxContext } from '../tests/factories.js'; import { TxContext } from './tx_context.js'; @@ -29,7 +31,11 @@ describe('TxContext', () => { const hash = tc.hash(); expect(hash).toMatchSnapshot(); - // Value used in empty_hash test in contract_deployment_data.nr - // console.log("hash", hash.toString()); + // Run with AZTEC_GENERATE_TEST_DATA=1 to update noir test data + updateInlineTestData( + 'noir-projects/noir-protocol-circuits/crates/types/src/transaction/tx_context.nr', + 'test_data_empty_hash', + hash.toString(), + ); }); }); diff --git a/yarn-project/circuits.js/src/structs/tx_context.ts b/yarn-project/circuits.js/src/structs/tx_context.ts index e66e0596ed8..577d4da75d1 100644 --- a/yarn-project/circuits.js/src/structs/tx_context.ts +++ b/yarn-project/circuits.js/src/structs/tx_context.ts @@ -4,7 +4,6 @@ import { BufferReader, serializeToBuffer, serializeToFields } from '@aztec/found import { FieldsOf } from '@aztec/foundation/types'; import { GeneratorIndex, TX_CONTEXT_DATA_LENGTH } from '../constants.gen.js'; -import { ContractDeploymentData } from '../structs/contract_deployment_data.js'; /** * Transaction context. @@ -26,14 +25,6 @@ export class TxContext { * the user. */ public isRebatePaymentTx: boolean, - /** - * Whether this is a contract deployment tx. - */ - public isContractDeploymentTx: boolean, - /** - * Contract deployment data. - */ - public contractDeploymentData: ContractDeploymentData, /** * Chain ID of the transaction. Here for replay protection. */ @@ -69,29 +60,15 @@ export class TxContext { */ static fromBuffer(buffer: Buffer | BufferReader): TxContext { const reader = BufferReader.asReader(buffer); - return new TxContext( - reader.readBoolean(), - reader.readBoolean(), - reader.readBoolean(), - reader.readObject(ContractDeploymentData), - Fr.fromBuffer(reader), - Fr.fromBuffer(reader), - ); + return new TxContext(reader.readBoolean(), reader.readBoolean(), Fr.fromBuffer(reader), Fr.fromBuffer(reader)); } static empty(chainId: Fr | number = 0, version: Fr | number = 0) { - return new TxContext(false, false, false, ContractDeploymentData.empty(), new Fr(chainId), new Fr(version)); + return new TxContext(false, false, new Fr(chainId), new Fr(version)); } isEmpty(): boolean { - return ( - !this.isFeePaymentTx && - !this.isRebatePaymentTx && - !this.isContractDeploymentTx && - this.contractDeploymentData.isEmpty() && - this.chainId.isZero() && - this.version.isZero() - ); + return !this.isFeePaymentTx && !this.isRebatePaymentTx && this.chainId.isZero() && this.version.isZero(); } /** @@ -109,14 +86,7 @@ export class TxContext { * @returns The array. */ static getFields(fields: FieldsOf) { - return [ - fields.isFeePaymentTx, - fields.isRebatePaymentTx, - fields.isContractDeploymentTx, - fields.contractDeploymentData, - fields.chainId, - fields.version, - ] as const; + return [fields.isFeePaymentTx, fields.isRebatePaymentTx, fields.chainId, fields.version] as const; } hash(): Fr { diff --git a/yarn-project/circuits.js/src/structs/tx_request.test.ts b/yarn-project/circuits.js/src/structs/tx_request.test.ts index 82ef6ff0361..66001a067b3 100644 --- a/yarn-project/circuits.js/src/structs/tx_request.test.ts +++ b/yarn-project/circuits.js/src/structs/tx_request.test.ts @@ -1,12 +1,11 @@ import { FunctionSelector } from '@aztec/foundation/abi'; import { AztecAddress } from '@aztec/foundation/aztec-address'; -import { Fr, Point } from '@aztec/foundation/fields'; +import { Fr } from '@aztec/foundation/fields'; +import { updateInlineTestData } from '@aztec/foundation/testing'; import { TX_REQUEST_LENGTH } from '../constants.gen.js'; import { makeTxRequest } from '../tests/factories.js'; -import { ContractDeploymentData } from './contract_deployment_data.js'; import { FunctionData } from './function_data.js'; -import { EthAddress } from './index.js'; import { TxContext } from './tx_context.js'; import { TxRequest } from './tx_request.js'; @@ -31,25 +30,22 @@ describe('TxRequest', () => { }); it('compute hash', () => { - const deploymentData = new ContractDeploymentData( - new Point(new Fr(1), new Fr(2)), - new Fr(1), - new Fr(2), - new Fr(3), - EthAddress.fromField(new Fr(1)), - ); const txRequest = TxRequest.from({ origin: AztecAddress.fromBigInt(1n), functionData: new FunctionData(FunctionSelector.fromField(new Fr(2n)), false, true, true), argsHash: new Fr(3), - txContext: new TxContext(false, false, true, deploymentData, Fr.ZERO, Fr.ZERO), + txContext: new TxContext(false, false, Fr.ZERO, Fr.ZERO), }); const hash = txRequest.hash().toString(); expect(hash).toMatchSnapshot(); - // Value used in hash test in tx_request.nr - // console.log("hash", hash); + // Run with AZTEC_GENERATE_TEST_DATA=1 to update noir test data + updateInlineTestData( + 'noir-projects/noir-protocol-circuits/crates/types/src/transaction/tx_request.nr', + 'test_data_tx_request_hash', + hash, + ); }); }); diff --git a/yarn-project/circuits.js/src/tests/factories.ts b/yarn-project/circuits.js/src/tests/factories.ts index 128800b95b6..8b9e7822f70 100644 --- a/yarn-project/circuits.js/src/tests/factories.ts +++ b/yarn-project/circuits.js/src/tests/factories.ts @@ -13,7 +13,6 @@ import { AppendOnlyTreeSnapshot, BaseOrMergeRollupPublicInputs, BaseRollupInputs, - CONTRACT_SUBTREE_SIBLING_PATH_LENGTH, CallContext, CallRequest, CallerContext, @@ -21,7 +20,6 @@ import { CombinedAccumulatedData, CombinedConstantData, ConstantRollupData, - ContractDeploymentData, ContractStorageRead, ContractStorageUpdateRequest, FUNCTION_TREE_HEIGHT, @@ -34,7 +32,6 @@ import { GrumpkinScalar, L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH, L2ToL1Message, - MAX_NEW_CONTRACTS_PER_TX, MAX_NEW_L2_TO_L1_MSGS_PER_CALL, MAX_NEW_L2_TO_L1_MSGS_PER_TX, MAX_NEW_NOTE_HASHES_PER_CALL, @@ -73,7 +70,6 @@ import { NULLIFIER_TREE_HEIGHT, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, NUM_FIELDS_PER_SHA256, - NewContractData, NoteHashReadRequestMembershipWitness, NullifierKeyValidationRequest, NullifierKeyValidationRequestContext, @@ -157,8 +153,7 @@ export function makeNewSideEffectLinkedToNoteHash(seed: number): SideEffectLinke */ export function makeTxContext(seed: number): TxContext { // @todo @LHerskind should probably take value for chainId as it will be verified later. - // @todo @LHerskind should probably take value for version as it will be verified later. - return new TxContext(false, false, true, makeContractDeploymentData(seed), Fr.ZERO, Fr.ZERO); + return new TxContext(false, false, new Fr(seed), Fr.ZERO); } /** @@ -286,7 +281,6 @@ export function makeCombinedAccumulatedData(seed = 1, full = false): CombinedAcc tupleGenerator(2, fr, seed + 0x800), // unencrypted logs hash fr(seed + 0x900), // encrypted_log_preimages_length fr(seed + 0xa00), // unencrypted_log_preimages_length - tupleGenerator(MAX_NEW_CONTRACTS_PER_TX, makeNewContractData, seed + 0xb00), tupleGenerator(MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, makePublicDataUpdateRequest, seed + 0xd00), tupleGenerator(MAX_PUBLIC_DATA_READS_PER_TX, makePublicDataRead, seed + 0xe00), ); @@ -317,7 +311,6 @@ export function makeCombinedAccumulatedRevertibleData(seed = 1, full = false): P tupleGenerator(2, fr, seed + 0x800), // unencrypted logs hash fr(seed + 0x900), // encrypted_log_preimages_length fr(seed + 0xa00), // unencrypted_log_preimages_length - tupleGenerator(MAX_NEW_CONTRACTS_PER_TX, makeNewContractData, seed + 0xb00), tupleGenerator(MAX_REVERTIBLE_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, makePublicDataUpdateRequest, seed + 0xd00), tupleGenerator(MAX_REVERTIBLE_PUBLIC_DATA_READS_PER_TX, makePublicDataRead, seed + 0xe00), ); @@ -341,7 +334,6 @@ export function makeFinalAccumulatedData(seed = 1, full = false): PrivateAccumul tupleGenerator(2, fr, seed + 0x800), // unencrypted logs hash fr(seed + 0x900), // encrypted_log_preimages_length fr(seed + 0xa00), // unencrypted_log_preimages_length - tupleGenerator(MAX_NEW_CONTRACTS_PER_TX, makeNewContractData, seed + 0xb00), ); } @@ -373,15 +365,6 @@ export function makeCombinedAccumulatedNonRevertibleData(seed = 1, full = false) ); } -/** - * Creates arbitrary contract data. - * @param seed - The seed to use for generating the contract data. - * @returns A contract data. - */ -export function makeNewContractData(seed = 1): NewContractData { - return new NewContractData(makeAztecAddress(seed), makeEthAddress(seed + 1), fr(seed + 2)); -} - /** * Creates arbitrary aggregation object. * @param seed - The seed to use for generating the aggregation object. @@ -410,7 +393,6 @@ export function makeCallContext(seed = 0, storageContractAddress = makeAztecAddr makeSelector(seed + 3), false, false, - false, 0, ); } @@ -532,7 +514,6 @@ export function makePublicCallRequest(seed = 1): PublicCallRequest { functionSelector: makeSelector(seed + 3), isStaticCall: false, isDelegateCall: false, - isContractDeployment: false, startSideEffectCounter: 0, }); return new PublicCallRequest( @@ -866,7 +847,6 @@ export function makePrivateCircuitPublicInputs(seed = 0): PrivateCircuitPublicIn makeSelector(seed + 4), true, true, - true, 0, ), argsHash: fr(seed + 0x100), @@ -890,27 +870,11 @@ export function makePrivateCircuitPublicInputs(seed = 0): PrivateCircuitPublicIn encryptedLogPreimagesLength: fr(seed + 0xb00), unencryptedLogPreimagesLength: fr(seed + 0xc00), historicalHeader: makeHeader(seed + 0xd00, undefined), - contractDeploymentData: makeContractDeploymentData(seed + 0xe00), chainId: fr(seed + 0x1400), version: fr(seed + 0x1500), }); } -/** - * Makes arbitrary contract deployment data. - * @param seed - The seed to use for generating the contract deployment data. - * @returns A contract deployment data. - */ -export function makeContractDeploymentData(seed = 1) { - return new ContractDeploymentData( - makePoint(seed), - fr(seed + 1), - fr(seed + 2), - fr(seed + 3), - makeEthAddress(seed + 4), - ); -} - /** * Makes global variables. * @param seed - The seed to use for generating the global variables. @@ -1140,7 +1104,6 @@ export function makePartialStateReference(seed = 0): PartialStateReference { makeAppendOnlyTreeSnapshot(seed), makeAppendOnlyTreeSnapshot(seed + 1), makeAppendOnlyTreeSnapshot(seed + 2), - makeAppendOnlyTreeSnapshot(seed + 3), ); } @@ -1197,8 +1160,6 @@ export function makeStateDiffHints(seed = 1): StateDiffHints { const nullifierSubtreeSiblingPath = makeTuple(NULLIFIER_SUBTREE_SIBLING_PATH_LENGTH, fr, seed + 0x6000); - const contractSubtreeSiblingPath = makeTuple(CONTRACT_SUBTREE_SIBLING_PATH_LENGTH, fr, seed + 0x7000); - const publicDataSiblingPath = makeTuple(PUBLIC_DATA_SUBTREE_SIBLING_PATH_LENGTH, fr, 0x8000); return new StateDiffHints( @@ -1208,7 +1169,6 @@ export function makeStateDiffHints(seed = 1): StateDiffHints { sortedNullifierIndexes, noteHashSubtreeSiblingPath, nullifierSubtreeSiblingPath, - contractSubtreeSiblingPath, publicDataSiblingPath, ); } diff --git a/yarn-project/cli/src/utils.ts b/yarn-project/cli/src/utils.ts index 300a0d55a9b..281a8fd297b 100644 --- a/yarn-project/cli/src/utils.ts +++ b/yarn-project/cli/src/utils.ts @@ -48,8 +48,6 @@ export async function deployAztecContracts( debugLogger: DebugLogger, ) { const { - ContractDeploymentEmitterAbi, - ContractDeploymentEmitterBytecode, InboxAbi, InboxBytecode, OutboxAbi, @@ -67,10 +65,6 @@ export async function deployAztecContracts( : privateKeyToAccount(`${privateKey.startsWith('0x') ? '' : '0x'}${privateKey}` as `0x${string}`); const chain = createEthereumChain(rpcUrl, apiKey); const l1Artifacts: L1ContractArtifactsForDeployment = { - contractDeploymentEmitter: { - contractAbi: ContractDeploymentEmitterAbi, - contractBytecode: ContractDeploymentEmitterBytecode, - }, registry: { contractAbi: RegistryAbi, contractBytecode: RegistryBytecode, diff --git a/yarn-project/end-to-end/src/e2e_inclusion_proofs_contract.test.ts b/yarn-project/end-to-end/src/e2e_inclusion_proofs_contract.test.ts index 4d70a918e9a..2a7d82ae218 100644 --- a/yarn-project/end-to-end/src/e2e_inclusion_proofs_contract.test.ts +++ b/yarn-project/end-to-end/src/e2e_inclusion_proofs_contract.test.ts @@ -9,7 +9,6 @@ import { Point, getContractInstanceFromDeployParams, } from '@aztec/aztec.js'; -import { NewContractData } from '@aztec/circuits.js'; import { InclusionProofsContract } from '@aztec/noir-contracts.js/InclusionProofs'; import { jest } from '@jest/globals'; @@ -297,8 +296,7 @@ describe('e2e_inclusion_proofs_contract', () => { it.skip('contract existence failure case', async () => { // This should fail because we choose a block number before the contract was deployed const blockNumber = deploymentBlockNumber - 1; - const contractData = new NewContractData(contract.address, portalContractAddress, contractClassId); - const leaf = contractData.hash(); + const leaf = Fr.ZERO; // TODO: Calculate proper leaf value await expect( contract.methods diff --git a/yarn-project/end-to-end/src/fixtures/utils.ts b/yarn-project/end-to-end/src/fixtures/utils.ts index a18f70cb847..543bd77b48f 100644 --- a/yarn-project/end-to-end/src/fixtures/utils.ts +++ b/yarn-project/end-to-end/src/fixtures/utils.ts @@ -30,8 +30,6 @@ import { deployInstance, registerContractClass } from '@aztec/aztec.js/deploymen import { AvailabilityOracleAbi, AvailabilityOracleBytecode, - ContractDeploymentEmitterAbi, - ContractDeploymentEmitterBytecode, InboxAbi, InboxBytecode, OutboxAbi, @@ -100,10 +98,6 @@ export const setupL1Contracts = async ( logger: DebugLogger, ) => { const l1Artifacts: L1ContractArtifactsForDeployment = { - contractDeploymentEmitter: { - contractAbi: ContractDeploymentEmitterAbi, - contractBytecode: ContractDeploymentEmitterBytecode, - }, registry: { contractAbi: RegistryAbi, contractBytecode: RegistryBytecode, diff --git a/yarn-project/end-to-end/src/integration_l1_publisher.test.ts b/yarn-project/end-to-end/src/integration_l1_publisher.test.ts index 1de3ff621d0..dd11721fc19 100644 --- a/yarn-project/end-to-end/src/integration_l1_publisher.test.ts +++ b/yarn-project/end-to-end/src/integration_l1_publisher.test.ts @@ -23,13 +23,7 @@ import { PublicKernelCircuitPublicInputs, SideEffectLinkedToNoteHash, } from '@aztec/circuits.js'; -import { - fr, - makeNewContractData, - makeNewSideEffect, - makeNewSideEffectLinkedToNoteHash, - makeProof, -} from '@aztec/circuits.js/testing'; +import { fr, makeNewSideEffect, makeNewSideEffectLinkedToNoteHash, makeProof } from '@aztec/circuits.js/testing'; import { createEthereumChain } from '@aztec/ethereum'; import { makeTuple, range } from '@aztec/foundation/array'; import { openTmpStore } from '@aztec/kv-store/utils'; @@ -186,7 +180,6 @@ describe('L1Publisher integration', () => { processedTx.data.end.newNullifiers[processedTx.data.end.newNullifiers.length - 1] = SideEffectLinkedToNoteHash.empty(); processedTx.data.end.newL2ToL1Msgs = makeTuple(MAX_NEW_L2_TO_L1_MSGS_PER_TX, fr, seed + 0x300); - processedTx.data.end.newContracts = [makeNewContractData(seed + 0x1000)]; processedTx.data.end.encryptedLogsHash = to2Fields(processedTx.encryptedLogs.hash()); processedTx.data.end.unencryptedLogsHash = to2Fields(processedTx.unencryptedLogs.hash()); @@ -293,10 +286,6 @@ describe('L1Publisher integration', () => { root: `0x${block.header.state.l1ToL2MessageTree.root.toBuffer().toString('hex').padStart(64, '0')}`, }, partialStateReference: { - contractTree: { - nextAvailableLeafIndex: block.header.state.partial.contractTree.nextAvailableLeafIndex, - root: `0x${block.header.state.partial.contractTree.root.toBuffer().toString('hex').padStart(64, '0')}`, - }, noteHashTree: { nextAvailableLeafIndex: block.header.state.partial.noteHashTree.nextAvailableLeafIndex, root: `0x${block.header.state.partial.noteHashTree.root.toBuffer().toString('hex').padStart(64, '0')}`, diff --git a/yarn-project/ethereum/src/deploy_l1_contracts.ts b/yarn-project/ethereum/src/deploy_l1_contracts.ts index 3ba6f1c2e29..3d05513b621 100644 --- a/yarn-project/ethereum/src/deploy_l1_contracts.ts +++ b/yarn-project/ethereum/src/deploy_l1_contracts.ts @@ -56,10 +56,6 @@ export interface ContractArtifacts { * All L1 Contract Artifacts for deployment */ export interface L1ContractArtifactsForDeployment { - /** - * Contract deployment emitter artifacts - */ - contractDeploymentEmitter: ContractArtifacts; /** * Inbox contract artifacts */ @@ -164,21 +160,12 @@ export const deployL1Contracts = async ( { account }, ); - const contractDeploymentEmitterAddress = await deployL1Contract( - walletClient, - publicClient, - contractsToDeploy.contractDeploymentEmitter.contractAbi, - contractsToDeploy.contractDeploymentEmitter.contractBytecode, - ); - logger(`Deployed contract deployment emitter at ${contractDeploymentEmitterAddress}`); - const l1Contracts: L1ContractAddresses = { availabilityOracleAddress, rollupAddress, registryAddress, inboxAddress, outboxAddress, - contractDeploymentEmitterAddress, }; return { diff --git a/yarn-project/foundation/src/testing/test_data.ts b/yarn-project/foundation/src/testing/test_data.ts index 976701e3489..241ae5eead9 100644 --- a/yarn-project/foundation/src/testing/test_data.ts +++ b/yarn-project/foundation/src/testing/test_data.ts @@ -1,3 +1,9 @@ +import { existsSync, readFileSync, writeFileSync } from 'fs'; +import { dirname, join, resolve } from 'path'; + +import { createConsoleLogger } from '../log/console.js'; +import { fileURLToPath } from '../url/index.js'; + const testData: { [key: string]: { toBuffer(): Buffer }[] } = {}; /** Returns whether test data generation is enabled */ @@ -34,3 +40,31 @@ export function getTestData(itemName: string): { toBuffer(): Buffer }[] { const fullItemName = `${testName} ${itemName}`; return testData[fullItemName]; } + +/** + * Looks for a variable assignment in the target file and updates the value, only if test data generation is enabled. + * Note that a magic inline comment would be a cleaner approach, like `/* TEST-DATA-START *\/` and `/* TEST-DATA-END *\/`, + * but running nargo fmt on it panics since the comment would be erased, so we roll with this for now. + * @remarks Requires AZTEC_GENERATE_TEST_DATA=1 to be set + */ +export function updateInlineTestData(targetFileFromRepoRoot: string, itemName: string, value: string) { + if (!isGenerateTestDataEnabled()) { + return; + } + const logger = createConsoleLogger('aztec:testing:test_data'); + const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), '../../../../'); + if (!existsSync(join(repoRoot, 'CODEOWNERS'))) { + throw new Error(`Path to repo root is incorrect (got ${repoRoot})`); + } + + const targetFile = join(repoRoot, targetFileFromRepoRoot); + const contents = readFileSync(targetFile, 'utf8').toString(); + const regex = new RegExp(`let ${itemName} = .*;`, 'g'); + if (!regex.exec(contents)) { + throw new Error(`Test data marker for ${itemName} not found in ${targetFile}`); + } + + const updatedContents = contents.replaceAll(regex, `let ${itemName} = ${value};`); + writeFileSync(targetFile, updatedContents); + logger(`Updated test data in ${targetFile} for ${itemName} to ${value}`); +} diff --git a/yarn-project/l1-artifacts/scripts/generate-artifacts.sh b/yarn-project/l1-artifacts/scripts/generate-artifacts.sh index 9c39b9526d1..83e239bf1f8 100755 --- a/yarn-project/l1-artifacts/scripts/generate-artifacts.sh +++ b/yarn-project/l1-artifacts/scripts/generate-artifacts.sh @@ -16,7 +16,6 @@ CONTRACTS=( "l1-contracts:NewInbox" "l1-contracts:Outbox" "l1-contracts:Rollup" - "l1-contracts:ContractDeploymentEmitter" "l1-contracts:TokenPortal" "l1-contracts:PortalERC20" "l1-contracts:UniswapPortal" diff --git a/yarn-project/noir-protocol-circuits-types/src/index.test.ts b/yarn-project/noir-protocol-circuits-types/src/index.test.ts index 30d4a9f0449..623b6ca6e25 100644 --- a/yarn-project/noir-protocol-circuits-types/src/index.test.ts +++ b/yarn-project/noir-protocol-circuits-types/src/index.test.ts @@ -18,25 +18,6 @@ describe('Private kernel', () => { logger = createDebugLogger('noir-private-kernel'); }); - // Taken from e2e_nested_contract => performs nested calls => first init (corresponds to deployment) - // To regenerate fixture data run the following on the yarn-project/e2e folder - // AZTEC_GENERATE_TEST_DATA=1 yarn test e2e_nested_contract -t 'performs nested calls' - // TODO(@spalladino) Re-enable this test - it.skip('Executes private kernel init circuit for a contract deployment', async () => { - logger('Initialized Noir instance with private kernel init circuit'); - - const filepath = resolve(dirname(fileURLToPath(import.meta.url)), './fixtures/nested-call-private-kernel-init.hex'); - const serialized = Buffer.from(readFileSync(filepath).toString(), 'hex'); - const kernelInputs = PrivateKernelInitCircuitPrivateInputs.fromBuffer(serialized); - - // We check that the test data is for a contract deployment - expect(kernelInputs.txRequest.txContext.isContractDeploymentTx).toBe(true); - - const kernelOutputs = await executeInit(kernelInputs); - - expect(kernelOutputs).toMatchSnapshot(); - }); - // Taken from e2e_nested_contract => performs nested calls => last inner // To regenerate fixture data run the following on the yarn-project/e2e folder // AZTEC_GENERATE_TEST_DATA=1 yarn test e2e_nested_contract -t 'performs nested calls' diff --git a/yarn-project/noir-protocol-circuits-types/src/type_conversion.test.ts b/yarn-project/noir-protocol-circuits-types/src/type_conversion.test.ts index 92285ce4c0f..da506acb62d 100644 --- a/yarn-project/noir-protocol-circuits-types/src/type_conversion.test.ts +++ b/yarn-project/noir-protocol-circuits-types/src/type_conversion.test.ts @@ -1,20 +1,9 @@ -import { - AztecAddress, - ContractDeploymentData, - EthAddress, - Fr, - FunctionData, - FunctionSelector, - Point, - TxContext, -} from '@aztec/circuits.js'; +import { AztecAddress, EthAddress, Fr, FunctionData, FunctionSelector, Point } from '@aztec/circuits.js'; import { makeHeader } from '@aztec/circuits.js/testing'; import { mapAztecAddressFromNoir, mapAztecAddressToNoir, - mapContractDeploymentDataFromNoir, - mapContractDeploymentDataToNoir, mapEthAddressFromNoir, mapEthAddressToNoir, mapFieldFromNoir, @@ -27,8 +16,6 @@ import { mapHeaderToNoir, mapPointFromNoir, mapPointToNoir, - mapTxContextFromNoir, - mapTxContextToNoir, } from './type_conversion.js'; describe('Noir<>Circuits.js type conversion test suite', () => { @@ -54,25 +41,6 @@ describe('Noir<>Circuits.js type conversion test suite', () => { expect(mapEthAddressFromNoir(mapEthAddressToNoir(ethAddress))).toEqual(ethAddress); }); - const contractDeploymentData = new ContractDeploymentData( - point, - new Fr(29n), - new Fr(30n), - new Fr(31n), - EthAddress.random(), - ); - - it('should map contract deployment data', () => { - expect(mapContractDeploymentDataFromNoir(mapContractDeploymentDataToNoir(contractDeploymentData))).toEqual( - contractDeploymentData, - ); - }); - - it('should map tx context', () => { - const txContext = new TxContext(false, true, false, contractDeploymentData, new Fr(32n), new Fr(33n)); - expect(mapTxContextFromNoir(mapTxContextToNoir(txContext))).toEqual(txContext); - }); - const functionSelector = new FunctionSelector(34); it('should map function selectors', () => { diff --git a/yarn-project/noir-protocol-circuits-types/src/type_conversion.ts b/yarn-project/noir-protocol-circuits-types/src/type_conversion.ts index 10fa0fabdba..a589a7a071f 100644 --- a/yarn-project/noir-protocol-circuits-types/src/type_conversion.ts +++ b/yarn-project/noir-protocol-circuits-types/src/type_conversion.ts @@ -12,7 +12,6 @@ import { CombinedConstantData, ConstantRollupData, ContentCommitment, - ContractDeploymentData, ContractStorageRead, ContractStorageUpdateRequest, EthAddress, @@ -25,7 +24,6 @@ import { GrumpkinScalar, Header, L2ToL1Message, - MAX_NEW_CONTRACTS_PER_TX, MAX_NEW_L2_TO_L1_MSGS_PER_TX, MAX_NEW_NOTE_HASHES_PER_TX, MAX_NEW_NULLIFIERS_PER_TX, @@ -50,7 +48,6 @@ import { MergeRollupInputs, NULLIFIER_TREE_HEIGHT, NUM_FIELDS_PER_SHA256, - NewContractData, NoteHashReadRequestMembershipWitness, NullifierKeyValidationRequest, NullifierKeyValidationRequestContext, @@ -108,15 +105,12 @@ import { CallerContext as CallerContextNoir, CombinedAccumulatedData as CombinedAccumulatedDataNoir, CombinedConstantData as CombinedConstantDataNoir, - ContractDeploymentData as ContractDeploymentDataNoir, FunctionData as FunctionDataNoir, FunctionLeafMembershipWitness as FunctionLeafMembershipWitnessNoir, FunctionSelector as FunctionSelectorNoir, GrumpkinPrivateKey as GrumpkinPrivateKeyNoir, L2ToL1Message as L2ToL1MessageNoir, - NewContractData as NewContractDataNoir, AztecAddress as NoirAztecAddress, - ContractClassId as NoirContractClassId, EthAddress as NoirEthAddress, Field as NoirField, GrumpkinPoint as NoirPoint, @@ -320,46 +314,6 @@ export function mapEthAddressFromNoir(address: NoirEthAddress): EthAddress { return EthAddress.fromField(mapFieldFromNoir(address.inner)); } -/** Maps a field to a contract class id in Noir. */ -export function mapContractClassIdToNoir(contractClassId: Fr): NoirContractClassId { - return { inner: mapFieldToNoir(contractClassId) }; -} - -/** Maps a noir contract class id to typescript. */ -export function mapContractClassIdFromNoir(contractClassId: NoirContractClassId): Fr { - return mapFieldFromNoir(contractClassId.inner); -} - -/** - * Maps a contract deployment data to a noir contract deployment data. - * @param data - The data. - * @returns The noir contract deployment data. - */ -export function mapContractDeploymentDataToNoir(data: ContractDeploymentData): ContractDeploymentDataNoir { - return { - public_key: mapPointToNoir(data.publicKey), - initialization_hash: mapFieldToNoir(data.initializationHash), - contract_class_id: mapContractClassIdToNoir(data.contractClassId), - contract_address_salt: mapFieldToNoir(data.contractAddressSalt), - portal_contract_address: mapEthAddressToNoir(data.portalContractAddress), - }; -} - -/** - * Maps a noir contract deployment data to a contract deployment data. - * @param data - The noir data. - * @returns The contract deployment data. - */ -export function mapContractDeploymentDataFromNoir(data: ContractDeploymentDataNoir): ContractDeploymentData { - return new ContractDeploymentData( - mapPointFromNoir(data.public_key), - mapFieldFromNoir(data.initialization_hash), - mapContractClassIdFromNoir(data.contract_class_id), - mapFieldFromNoir(data.contract_address_salt), - mapEthAddressFromNoir(data.portal_contract_address), - ); -} - /** * Maps a tx context to a noir tx context. * @param txContext - The tx context. @@ -369,8 +323,6 @@ export function mapTxContextToNoir(txContext: TxContext): TxContextNoir { return { is_fee_payment_tx: txContext.isFeePaymentTx, is_rebate_payment_tx: txContext.isRebatePaymentTx, - is_contract_deployment_tx: txContext.isContractDeploymentTx, - contract_deployment_data: mapContractDeploymentDataToNoir(txContext.contractDeploymentData), chain_id: mapFieldToNoir(txContext.chainId), version: mapFieldToNoir(txContext.version), }; @@ -385,8 +337,6 @@ export function mapTxContextFromNoir(txContext: TxContextNoir): TxContext { return new TxContext( txContext.is_fee_payment_tx, txContext.is_rebate_payment_tx, - txContext.is_contract_deployment_tx, - mapContractDeploymentDataFromNoir(txContext.contract_deployment_data), mapFieldFromNoir(txContext.chain_id), mapFieldFromNoir(txContext.version), ); @@ -467,7 +417,6 @@ export function mapCallContextFromNoir(callContext: CallContextNoir): CallContex mapFunctionSelectorFromNoir(callContext.function_selector), callContext.is_delegate_call, callContext.is_static_call, - callContext.is_contract_deployment, mapNumberFromNoir(callContext.start_side_effect_counter), ); } @@ -485,7 +434,6 @@ export function mapCallContextToNoir(callContext: CallContext): CallContextNoir function_selector: mapFunctionSelectorToNoir(callContext.functionSelector), is_delegate_call: callContext.isDelegateCall, is_static_call: callContext.isStaticCall, - is_contract_deployment: callContext.isContractDeployment, start_side_effect_counter: mapNumberToNoir(callContext.startSideEffectCounter), }; } @@ -741,7 +689,6 @@ export function mapPrivateCircuitPublicInputsToNoir( encrypted_log_preimages_length: mapFieldToNoir(privateCircuitPublicInputs.encryptedLogPreimagesLength), unencrypted_log_preimages_length: mapFieldToNoir(privateCircuitPublicInputs.unencryptedLogPreimagesLength), historical_header: mapHeaderToNoir(privateCircuitPublicInputs.historicalHeader), - contract_deployment_data: mapContractDeploymentDataToNoir(privateCircuitPublicInputs.contractDeploymentData), chain_id: mapFieldToNoir(privateCircuitPublicInputs.chainId), version: mapFieldToNoir(privateCircuitPublicInputs.version), min_revertible_side_effect_counter: mapFieldToNoir(privateCircuitPublicInputs.minRevertibleSideEffectCounter), @@ -856,32 +803,6 @@ export function mapSha256HashToNoir(hash: Buffer): FixedLengthArray { return to2Fields(hash).map(mapFieldToNoir) as FixedLengthArray; } -/** - * Maps new contract data from noir to the parsed type. - * @param newContractData - The noir new contract data. - * @returns The parsed new contract data. - */ -export function mapNewContractDataFromNoir(newContractData: NewContractDataNoir): NewContractData { - return new NewContractData( - mapAztecAddressFromNoir(newContractData.contract_address), - mapEthAddressFromNoir(newContractData.portal_contract_address), - mapContractClassIdFromNoir(newContractData.contract_class_id), - ); -} - -/** - * Maps new contract data to noir new contract data. - * @param newContractData - The new contract data. - * @returns The noir new contract data. - */ -export function mapNewContractDataToNoir(newContractData: NewContractData): NewContractDataNoir { - return { - contract_address: mapAztecAddressToNoir(newContractData.contractAddress), - portal_contract_address: mapEthAddressToNoir(newContractData.portalContractAddress), - contract_class_id: mapContractClassIdToNoir(newContractData.contractClassId), - }; -} - /** * Maps public data update request from noir to the parsed type. * @param publicDataUpdateRequest - The noir public data update request. @@ -1006,7 +927,6 @@ export function mapCombinedAccumulatedDataFromNoir( mapTupleFromNoir(combinedAccumulatedData.unencrypted_logs_hash, NUM_FIELDS_PER_SHA256, mapFieldFromNoir), mapFieldFromNoir(combinedAccumulatedData.encrypted_log_preimages_length), mapFieldFromNoir(combinedAccumulatedData.unencrypted_log_preimages_length), - mapTupleFromNoir(combinedAccumulatedData.new_contracts, MAX_NEW_CONTRACTS_PER_TX, mapNewContractDataFromNoir), mapTupleFromNoir( combinedAccumulatedData.public_data_update_requests, MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, @@ -1050,7 +970,6 @@ export function mapFinalAccumulatedDataFromNoir( mapTupleFromNoir(finalAccumulatedData.unencrypted_logs_hash, NUM_FIELDS_PER_SHA256, mapFieldFromNoir), mapFieldFromNoir(finalAccumulatedData.encrypted_log_preimages_length), mapFieldFromNoir(finalAccumulatedData.unencrypted_log_preimages_length), - mapTupleFromNoir(finalAccumulatedData.new_contracts, MAX_NEW_CONTRACTS_PER_TX, mapNewContractDataFromNoir), ); } @@ -1105,7 +1024,6 @@ export function mapPrivateAccumulatedRevertibleDataToNoir( unencrypted_logs_hash: mapTuple(data.unencryptedLogsHash, mapFieldToNoir), encrypted_log_preimages_length: mapFieldToNoir(data.encryptedLogPreimagesLength), unencrypted_log_preimages_length: mapFieldToNoir(data.unencryptedLogPreimagesLength), - new_contracts: mapTuple(data.newContracts, mapNewContractDataToNoir), }; } @@ -1133,7 +1051,6 @@ export function mapCombinedAccumulatedDataToNoir( unencrypted_logs_hash: mapTuple(combinedAccumulatedData.unencryptedLogsHash, mapFieldToNoir), encrypted_log_preimages_length: mapFieldToNoir(combinedAccumulatedData.encryptedLogPreimagesLength), unencrypted_log_preimages_length: mapFieldToNoir(combinedAccumulatedData.unencryptedLogPreimagesLength), - new_contracts: mapTuple(combinedAccumulatedData.newContracts, mapNewContractDataToNoir), public_data_update_requests: mapTuple( combinedAccumulatedData.publicDataUpdateRequests, mapPublicDataUpdateRequestToNoir, @@ -1224,7 +1141,6 @@ export function mapPublicAccumulatedRevertibleDataToNoir( unencrypted_logs_hash: mapTuple(data.unencryptedLogsHash, mapFieldToNoir), encrypted_log_preimages_length: mapFieldToNoir(data.encryptedLogPreimagesLength), unencrypted_log_preimages_length: mapFieldToNoir(data.unencryptedLogPreimagesLength), - new_contracts: mapTuple(data.newContracts, mapNewContractDataToNoir), public_data_update_requests: mapTuple(data.publicDataUpdateRequests, mapPublicDataUpdateRequestToNoir), public_data_reads: mapTuple(data.publicDataReads, mapPublicDataReadToNoir), }; @@ -1327,7 +1243,6 @@ export function mapFinalAccumulatedDataToNoir( unencrypted_logs_hash: mapTuple(finalAccumulatedData.unencryptedLogsHash, mapFieldToNoir), encrypted_log_preimages_length: mapFieldToNoir(finalAccumulatedData.encryptedLogPreimagesLength), unencrypted_log_preimages_length: mapFieldToNoir(finalAccumulatedData.unencryptedLogPreimagesLength), - new_contracts: mapTuple(finalAccumulatedData.newContracts, mapNewContractDataToNoir), }; } @@ -1468,7 +1383,6 @@ export function mapPublicAccumulatedRevertibleDataFromNoir( mapTupleFromNoir(data.unencrypted_logs_hash, NUM_FIELDS_PER_SHA256, mapFieldFromNoir), mapFieldFromNoir(data.encrypted_log_preimages_length), mapFieldFromNoir(data.unencrypted_log_preimages_length), - mapTupleFromNoir(data.new_contracts, MAX_NEW_CONTRACTS_PER_TX, mapNewContractDataFromNoir), mapTupleFromNoir( data.public_data_update_requests, MAX_REVERTIBLE_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, @@ -1834,7 +1748,6 @@ export function mapPartialStateReferenceFromNoir( return new PartialStateReference( mapAppendOnlyTreeSnapshotFromNoir(partialStateReference.note_hash_tree), mapAppendOnlyTreeSnapshotFromNoir(partialStateReference.nullifier_tree), - mapAppendOnlyTreeSnapshotFromNoir(partialStateReference.contract_tree), mapAppendOnlyTreeSnapshotFromNoir(partialStateReference.public_data_tree), ); } @@ -1938,7 +1851,6 @@ export function mapPartialStateReferenceToNoir( return { note_hash_tree: mapAppendOnlyTreeSnapshotToNoir(partialStateReference.noteHashTree), nullifier_tree: mapAppendOnlyTreeSnapshotToNoir(partialStateReference.nullifierTree), - contract_tree: mapAppendOnlyTreeSnapshotToNoir(partialStateReference.contractTree), public_data_tree: mapAppendOnlyTreeSnapshotToNoir(partialStateReference.publicDataTree), }; } @@ -1959,7 +1871,6 @@ export function mapStateDiffHintsToNoir(hints: StateDiffHints): StateDiffHintsNo sorted_nullifier_indexes: mapTuple(hints.sortedNullifierIndexes, (index: number) => mapNumberToNoir(index)), note_hash_subtree_sibling_path: mapTuple(hints.noteHashSubtreeSiblingPath, mapFieldToNoir), nullifier_subtree_sibling_path: mapTuple(hints.nullifierSubtreeSiblingPath, mapFieldToNoir), - contract_subtree_sibling_path: mapTuple(hints.contractSubtreeSiblingPath, mapFieldToNoir), public_data_sibling_path: mapTuple(hints.publicDataSiblingPath, mapFieldToNoir), }; } diff --git a/yarn-project/p2p/src/service/tx_messages.test.ts b/yarn-project/p2p/src/service/tx_messages.test.ts index e20f90582d1..eedaca26560 100644 --- a/yarn-project/p2p/src/service/tx_messages.test.ts +++ b/yarn-project/p2p/src/service/tx_messages.test.ts @@ -20,10 +20,6 @@ const verifyTx = (actual: Tx, expected: Tx) => { expect(actual.data!.toBuffer()).toEqual(expected.data?.toBuffer()); expect(actual.proof!.toBuffer()).toEqual(expected.proof!.toBuffer()); expect(actual.encryptedLogs!.toBuffer()).toEqual(expected.encryptedLogs?.toBuffer()); - expect(actual.newContracts!.length).toEqual(expected.newContracts!.length); - for (let i = 0; i < actual.newContracts!.length; i++) { - expect(actual.newContracts![i].toBuffer()).toEqual(expected.newContracts![i].toBuffer()); - } }; describe('Messages', () => { diff --git a/yarn-project/p2p/src/service/tx_messages.ts b/yarn-project/p2p/src/service/tx_messages.ts index a3710223cfb..5858f6e3678 100644 --- a/yarn-project/p2p/src/service/tx_messages.ts +++ b/yarn-project/p2p/src/service/tx_messages.ts @@ -1,11 +1,6 @@ -import { ExtendedContractData, Tx, TxHash, TxL2Logs } from '@aztec/circuit-types'; -import { - MAX_NEW_CONTRACTS_PER_TX, - PrivateKernelTailCircuitPublicInputs, - Proof, - PublicCallRequest, -} from '@aztec/circuits.js'; -import { Tuple, numToUInt32BE } from '@aztec/foundation/serialize'; +import { Tx, TxHash, TxL2Logs } from '@aztec/circuit-types'; +import { PrivateKernelTailCircuitPublicInputs, Proof, PublicCallRequest } from '@aztec/circuits.js'; +import { numToUInt32BE } from '@aztec/foundation/serialize'; /** * Enumeration of P2P message types. @@ -151,7 +146,6 @@ export function toTxMessage(tx: Tx): Buffer { createMessageComponent(tx.encryptedLogs), createMessageComponent(tx.unencryptedLogs), createMessageComponents(tx.enqueuedPublicFunctionCalls), - createMessageComponents(tx.newContracts), ]); const messageLength = numToUInt32BE(messageBuffer.length); return Buffer.concat([messageLength, messageBuffer]); @@ -204,13 +198,5 @@ export function fromTxMessage(buffer: Buffer): Tx { } const publicCalls = toObjectArray(unencryptedLogs.remainingData, PublicCallRequest); - const newContracts = toObjectArray(publicCalls.remainingData, ExtendedContractData); - return new Tx( - publicInputs.obj!, - proof.obj!, - encryptedLogs.obj, - unencryptedLogs.obj, - publicCalls.objects, - newContracts.objects as Tuple, - ); + return new Tx(publicInputs.obj!, proof.obj!, encryptedLogs.obj, unencryptedLogs.obj, publicCalls.objects); } diff --git a/yarn-project/pxe/src/pxe_service/pxe_service.ts b/yarn-project/pxe/src/pxe_service/pxe_service.ts index 661091a8c67..a2db19a39f8 100644 --- a/yarn-project/pxe/src/pxe_service/pxe_service.ts +++ b/yarn-project/pxe/src/pxe_service/pxe_service.ts @@ -21,7 +21,6 @@ import { TxHash, TxL2Logs, TxReceipt, - getNewContractPublicFunctions, isNoirCallStackUnresolved, } from '@aztec/circuit-types'; import { TxPXEProcessingStats } from '@aztec/circuit-types/stats'; @@ -38,7 +37,6 @@ import { PublicCallRequest, computeArtifactHash, computeContractClassId, - computeSaltedInitializationHash, getContractClassFromArtifact, } from '@aztec/circuits.js'; import { computeCommitmentNonce, siloNullifier } from '@aztec/circuits.js/hash'; @@ -390,13 +388,8 @@ export class PXEService implements PXE { // all simulations must be serialized w.r.t. the synchronizer return await this.jobQueue.put(async () => { - // We get the contract address from origin, since contract deployments are signalled as origin from their own address - // TODO: Is this ok? Should it be changed to be from ZERO? - const deployedContractAddress = txRequest.txContext.isContractDeploymentTx ? txRequest.origin : undefined; - const newContract = deployedContractAddress ? await this.db.getContract(deployedContractAddress) : undefined; - const timer = new Timer(); - const tx = await this.#simulateAndProve(txRequest, newContract); + const tx = await this.#simulateAndProve(txRequest); this.log(`Processed private part of ${tx.getTxHash()}`, { eventName: 'tx-pxe-processing', duration: timer.ms(), @@ -614,10 +607,9 @@ export class PXEService implements PXE { * * @param txExecutionRequest - The transaction request to be simulated and proved. * @param signature - The ECDSA signature for the transaction request. - * @param newContract - Optional. The address of a new contract to be included in the transaction object. * @returns A private transaction object containing the proof, public inputs, and encrypted logs. */ - async #simulateAndProve(txExecutionRequest: TxExecutionRequest, newContract: ContractDao | undefined) { + async #simulateAndProve(txExecutionRequest: TxExecutionRequest) { // TODO - Pause syncing while simulating. // Get values that allow us to reconstruct the block hash @@ -635,21 +627,11 @@ export class PXEService implements PXE { const unencryptedLogs = new TxL2Logs(collectUnencryptedLogs(executionResult)); const enqueuedPublicFunctions = collectEnqueuedPublicFunctionCalls(executionResult); - const extendedContractData = newContract - ? new ExtendedContractData( - new ContractData(newContract.instance.address, newContract.instance.portalContractAddress), - getNewContractPublicFunctions(newContract), - getContractClassFromArtifact(newContract).id, - computeSaltedInitializationHash(newContract.instance), - newContract.instance.publicKeysHash, - ) - : ExtendedContractData.empty(); - // HACK(#1639): Manually patches the ordering of the public call stack // TODO(#757): Enforce proper ordering of enqueued public calls await this.patchPublicCallStackOrdering(publicInputs, enqueuedPublicFunctions); - return new Tx(publicInputs, proof, encryptedLogs, unencryptedLogs, enqueuedPublicFunctions, [extendedContractData]); + return new Tx(publicInputs, proof, encryptedLogs, unencryptedLogs, enqueuedPublicFunctions); } /** diff --git a/yarn-project/pxe/src/simulator_oracle/index.ts b/yarn-project/pxe/src/simulator_oracle/index.ts index eae626c07c5..b105f4a1e8a 100644 --- a/yarn-project/pxe/src/simulator_oracle/index.ts +++ b/yarn-project/pxe/src/simulator_oracle/index.ts @@ -161,8 +161,6 @@ export class SimulatorOracle implements DBOracle { public async getSiblingPath(blockNumber: number, treeId: MerkleTreeId, leafIndex: bigint): Promise { switch (treeId) { - case MerkleTreeId.CONTRACT_TREE: - return (await this.aztecNode.getContractSiblingPath(blockNumber, leafIndex)).toFields(); case MerkleTreeId.NULLIFIER_TREE: return (await this.aztecNode.getNullifierSiblingPath(blockNumber, leafIndex)).toFields(); case MerkleTreeId.NOTE_HASH_TREE: diff --git a/yarn-project/scripts/src/benchmarks/aggregate.ts b/yarn-project/scripts/src/benchmarks/aggregate.ts index d3e027f3e6f..54bdb56dd4f 100644 --- a/yarn-project/scripts/src/benchmarks/aggregate.ts +++ b/yarn-project/scripts/src/benchmarks/aggregate.ts @@ -151,7 +151,7 @@ function processNodeSyncedChain(entry: NodeSyncedChainHistoryStats, results: Ben /** Processes entries for events tx-added-to-pool, with grouping by deployed contract count. */ function processTxAddedToPool(entry: TxAddedToPoolStats, results: BenchmarkCollectedResults) { - append(results, 'tx_size_in_bytes', entry.newContractCount, entry.size); + append(results, 'tx_size_in_bytes', entry.classRegisteredCount, entry.size); } /** Process entries for events tx-private-part-processed, grouped by new note hashes */ diff --git a/yarn-project/scripts/src/benchmarks/markdown.ts b/yarn-project/scripts/src/benchmarks/markdown.ts index 2fb3ddec168..bdd88c5f0c6 100644 --- a/yarn-project/scripts/src/benchmarks/markdown.ts +++ b/yarn-project/scripts/src/benchmarks/markdown.ts @@ -186,7 +186,7 @@ export function getMarkdown() { const metricsByBlockSize = Metrics.filter(m => m.groupBy === 'block-size').map(m => m.name); const metricsByChainLength = Metrics.filter(m => m.groupBy === 'chain-length').map(m => m.name); const metricsByCircuitName = Metrics.filter(m => m.groupBy === 'circuit-name').map(m => m.name); - const metricsByContractCount = Metrics.filter(m => m.groupBy === 'contract-count').map(m => m.name); + const metricsByClassesRegistered = Metrics.filter(m => m.groupBy === 'classes-registered').map(m => m.name); const metricsByLeafCount = Metrics.filter(m => m.groupBy === 'leaf-count').map(m => m.name); const metricsTxPxeProcessing = Metrics.filter(m => m.name === 'tx_pxe_processing_time_ms').map(m => m.name); @@ -239,8 +239,8 @@ ${getTableContent(pick(benchmark, metricsByLeafCount), baseBenchmark, 'leaves')} ### Miscellaneous -Transaction sizes based on how many contracts are deployed in the tx. -${getTableContent(pick(benchmark, metricsByContractCount), baseBenchmark, 'deployed contracts')} +Transaction sizes based on how many contract classes are registered in the tx. +${getTableContent(pick(benchmark, metricsByClassesRegistered), baseBenchmark, 'registered classes')} Transaction processing duration by data writes. ${getTableContent(pick(benchmark, metricsTxPxeProcessing), baseBenchmark, 'new note hashes')} diff --git a/yarn-project/sequencer-client/src/block_builder/solo_block_builder.test.ts b/yarn-project/sequencer-client/src/block_builder/solo_block_builder.test.ts index 5ffe538c8e8..2afb4e66f12 100644 --- a/yarn-project/sequencer-client/src/block_builder/solo_block_builder.test.ts +++ b/yarn-project/sequencer-client/src/block_builder/solo_block_builder.test.ts @@ -1,13 +1,4 @@ -import { - Body, - ExtendedContractData, - L2Block, - MerkleTreeId, - Tx, - TxEffect, - makeEmptyLogs, - mockTx, -} from '@aztec/circuit-types'; +import { Body, L2Block, MerkleTreeId, Tx, TxEffect, makeEmptyLogs, mockTx } from '@aztec/circuit-types'; import { AppendOnlyTreeSnapshot, AztecAddress, @@ -40,7 +31,6 @@ import { import { fr, makeBaseOrMergeRollupPublicInputs, - makeNewContractData, makeNewSideEffect, makeNewSideEffectLinkedToNoteHash, makePrivateKernelTailCircuitPublicInputs, @@ -135,18 +125,12 @@ describe('sequencer/solo_block_builder', () => { // Updates the expectedDb trees based on the new note hashes, contracts, and nullifiers from these txs const updateExpectedTreesFromTxs = async (txs: ProcessedTx[]) => { - const newContracts = txs.flatMap(tx => tx.data.end.newContracts.map(cd => cd.hash())); - for (const [tree, leaves] of [ - [ - MerkleTreeId.NOTE_HASH_TREE, - txs.flatMap(tx => - [...tx.data.endNonRevertibleData.newNoteHashes, ...tx.data.end.newNoteHashes].map(l => l.value.toBuffer()), - ), - ], - [MerkleTreeId.CONTRACT_TREE, newContracts.map(x => x.toBuffer())], - ] as const) { - await expectsDb.appendLeaves(tree, leaves); - } + await expectsDb.appendLeaves( + MerkleTreeId.NOTE_HASH_TREE, + txs.flatMap(tx => + [...tx.data.endNonRevertibleData.newNoteHashes, ...tx.data.end.newNoteHashes].map(l => l.value.toBuffer()), + ), + ); await expectsDb.batchInsert( MerkleTreeId.NULLIFIER_TREE, txs.flatMap(tx => @@ -186,7 +170,6 @@ describe('sequencer/solo_block_builder', () => { return new PartialStateReference( await getTreeSnapshot(MerkleTreeId.NOTE_HASH_TREE), await getTreeSnapshot(MerkleTreeId.NULLIFIER_TREE), - await getTreeSnapshot(MerkleTreeId.CONTRACT_TREE), await getTreeSnapshot(MerkleTreeId.PUBLIC_DATA_TREE), ); }; @@ -212,7 +195,6 @@ describe('sequencer/solo_block_builder', () => { makeEmptyLogs(), makeEmptyLogs(), times(MAX_PUBLIC_CALL_STACK_LENGTH_PER_TX, makePublicCallRequest), - [ExtendedContractData.random()], ), ); @@ -298,13 +280,8 @@ describe('sequencer/solo_block_builder', () => { builder = new SoloBlockBuilder(builderDb, vks, simulator, prover); }); - const makeContractDeployProcessedTx = async (seed = 0x1) => { - const tx = await makeEmptyProcessedTx(); - tx.data.end.newContracts = [makeNewContractData(seed + 0x1000)]; - return tx; - }; - const makeBloatedProcessedTx = async (seed = 0x1) => { + seed *= MAX_NEW_NULLIFIERS_PER_TX; // Ensure no clashing given incremental seeds const tx = mockTx(seed); const kernelOutput = PublicKernelCircuitPublicInputs.empty(); kernelOutput.constants.historicalHeader = await builderDb.buildInitialHeader(); @@ -344,7 +321,6 @@ describe('sequencer/solo_block_builder', () => { processedTx.data.end.newNullifiers[tx.data.end.newNullifiers.length - 1] = SideEffectLinkedToNoteHash.empty(); processedTx.data.end.newL2ToL1Msgs = makeTuple(MAX_NEW_L2_TO_L1_MSGS_PER_TX, fr, seed + 0x300); - processedTx.data.end.newContracts = [makeNewContractData(seed + 0x1000)]; processedTx.data.end.encryptedLogsHash = to2Fields(processedTx.encryptedLogs.hash()); processedTx.data.end.unencryptedLogsHash = to2Fields(processedTx.unencryptedLogs.hash()); @@ -358,28 +334,26 @@ describe('sequencer/solo_block_builder', () => { [0, 16], [16, 16], ] as const)( - 'builds an L2 block with %i contract deploy txs and %i txs total', - async (deployCount: number, totalCount: number) => { - const contractTreeBefore = await builderDb.getTreeInfo(MerkleTreeId.CONTRACT_TREE); - + 'builds an L2 block with %i bloated txs and %i txs total', + async (bloatedCount: number, totalCount: number) => { + const noteHashTreeBefore = await builderDb.getTreeInfo(MerkleTreeId.NOTE_HASH_TREE); const txs = [ - ...(await Promise.all(times(deployCount, makeContractDeployProcessedTx))), - ...(await Promise.all(times(totalCount - deployCount, makeEmptyProcessedTx))), + ...(await Promise.all(times(bloatedCount, makeBloatedProcessedTx))), + ...(await Promise.all(times(totalCount - bloatedCount, makeEmptyProcessedTx))), ]; const [l2Block] = await builder.buildL2Block(globalVariables, txs, mockL1ToL2Messages); expect(l2Block.number).toEqual(blockNumber); await updateExpectedTreesFromTxs(txs); - const contractTreeAfter = await builderDb.getTreeInfo(MerkleTreeId.CONTRACT_TREE); + const noteHashTreeAfter = await builderDb.getTreeInfo(MerkleTreeId.NOTE_HASH_TREE); - if (deployCount > 0) { - expect(contractTreeAfter.root).not.toEqual(contractTreeBefore.root); + if (bloatedCount > 0) { + expect(noteHashTreeAfter.root).not.toEqual(noteHashTreeBefore.root); } - const expectedContractTreeAfter = await expectsDb.getTreeInfo(MerkleTreeId.CONTRACT_TREE).then(t => t.root); - expect(contractTreeAfter.root).toEqual(expectedContractTreeAfter); - expect(contractTreeAfter.size).toEqual(BigInt(totalCount)); + const expectedNoteHashTreeAfter = await expectsDb.getTreeInfo(MerkleTreeId.NOTE_HASH_TREE).then(t => t.root); + expect(noteHashTreeAfter.root).toEqual(expectedNoteHashTreeAfter); }, 60000, ); @@ -397,12 +371,11 @@ describe('sequencer/solo_block_builder', () => { }, 30_000); it('builds a mixed L2 block', async () => { - // Ensure that each transaction has unique (non-intersecting nullifier values) const txs = await Promise.all([ - makeBloatedProcessedTx(1 * MAX_NEW_NULLIFIERS_PER_TX), - makeBloatedProcessedTx(2 * MAX_NEW_NULLIFIERS_PER_TX), - makeBloatedProcessedTx(3 * MAX_NEW_NULLIFIERS_PER_TX), - makeBloatedProcessedTx(4 * MAX_NEW_NULLIFIERS_PER_TX), + makeBloatedProcessedTx(1), + makeBloatedProcessedTx(2), + makeBloatedProcessedTx(3), + makeBloatedProcessedTx(4), ]); const l1ToL2Messages = range(NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, 1 + 0x400).map(fr); diff --git a/yarn-project/sequencer-client/src/block_builder/solo_block_builder.ts b/yarn-project/sequencer-client/src/block_builder/solo_block_builder.ts index 42045d6416e..da3553c64a8 100644 --- a/yarn-project/sequencer-client/src/block_builder/solo_block_builder.ts +++ b/yarn-project/sequencer-client/src/block_builder/solo_block_builder.ts @@ -5,8 +5,6 @@ import { AppendOnlyTreeSnapshot, BaseOrMergeRollupPublicInputs, BaseRollupInputs, - CONTRACT_SUBTREE_HEIGHT, - CONTRACT_SUBTREE_SIBLING_PATH_LENGTH, ConstantRollupData, GlobalVariables, L1_TO_L2_MSG_SUBTREE_HEIGHT, @@ -137,9 +135,6 @@ export class SoloBlockBuilder implements BlockBuilder { if (txHeader.state.partial.nullifierTree.isZero()) { throw new Error(`Empty nullifier tree in tx: ${toFriendlyJSON(tx)}`); } - if (txHeader.state.partial.contractTree.isZero()) { - throw new Error(`Empty contract tree in tx: ${toFriendlyJSON(tx)}`); - } if (txHeader.state.partial.publicDataTree.isZero()) { throw new Error(`Empty public data tree in tx: ${toFriendlyJSON(tx)}`); } @@ -171,14 +166,11 @@ export class SoloBlockBuilder implements BlockBuilder { for (const tx of txs) { const input = await this.buildBaseRollupInput(tx, globalVariables); baseRollupInputs.push(input); - const promises = [ - MerkleTreeId.NOTE_HASH_TREE, - MerkleTreeId.CONTRACT_TREE, - MerkleTreeId.NULLIFIER_TREE, - MerkleTreeId.PUBLIC_DATA_TREE, - ].map(async (id: MerkleTreeId) => { - return { key: id, value: await this.getTreeSnapshot(id) }; - }); + const promises = [MerkleTreeId.NOTE_HASH_TREE, MerkleTreeId.NULLIFIER_TREE, MerkleTreeId.PUBLIC_DATA_TREE].map( + async (id: MerkleTreeId) => { + return { key: id, value: await this.getTreeSnapshot(id) }; + }, + ); const snapshots: Map = new Map( (await Promise.all(promises)).map(obj => [obj.key, obj.value]), ); @@ -316,11 +308,6 @@ export class SoloBlockBuilder implements BlockBuilder { partialState.nullifierTree, 'NullifierTree', ); - this.validateSimulatedTree( - treeSnapshots.get(MerkleTreeId.CONTRACT_TREE)!, - partialState.contractTree, - 'ContractTree', - ); this.validateSimulatedTree( treeSnapshots.get(MerkleTreeId.PUBLIC_DATA_TREE)!, partialState.publicDataTree, @@ -329,14 +316,11 @@ export class SoloBlockBuilder implements BlockBuilder { } protected async validateState(state: StateReference) { - const promises = [ - MerkleTreeId.NOTE_HASH_TREE, - MerkleTreeId.CONTRACT_TREE, - MerkleTreeId.NULLIFIER_TREE, - MerkleTreeId.PUBLIC_DATA_TREE, - ].map(async (id: MerkleTreeId) => { - return { key: id, value: await this.getTreeSnapshot(id) }; - }); + const promises = [MerkleTreeId.NOTE_HASH_TREE, MerkleTreeId.NULLIFIER_TREE, MerkleTreeId.PUBLIC_DATA_TREE].map( + async (id: MerkleTreeId) => { + return { key: id, value: await this.getTreeSnapshot(id) }; + }, + ); const snapshots: Map = new Map( (await Promise.all(promises)).map(obj => [obj.key, obj.value]), ); @@ -636,7 +620,6 @@ export class SoloBlockBuilder implements BlockBuilder { const start = new PartialStateReference( await this.getTreeSnapshot(MerkleTreeId.NOTE_HASH_TREE), await this.getTreeSnapshot(MerkleTreeId.NULLIFIER_TREE), - await this.getTreeSnapshot(MerkleTreeId.CONTRACT_TREE), await this.getTreeSnapshot(MerkleTreeId.PUBLIC_DATA_TREE), ); @@ -650,25 +633,9 @@ export class SoloBlockBuilder implements BlockBuilder { i < noteHashSubtreeSiblingPathArray.length ? noteHashSubtreeSiblingPathArray[i] : Fr.ZERO, ); - const contractSubtreeSiblingPathArray = await this.getSubtreeSiblingPath( - MerkleTreeId.CONTRACT_TREE, - CONTRACT_SUBTREE_HEIGHT, - ); - - const contractSubtreeSiblingPath = makeTuple(CONTRACT_SUBTREE_SIBLING_PATH_LENGTH, i => - i < contractSubtreeSiblingPathArray.length ? contractSubtreeSiblingPathArray[i] : Fr.ZERO, - ); - - // Update the contract and note hash trees with the new items being inserted to get the new roots + // Update the note hash trees with the new items being inserted to get the new roots // that will be used by the next iteration of the base rollup circuit, skipping the empty ones - const newContracts = tx.data.combinedData.newContracts.map(cd => cd.hash()); const newNoteHashes = tx.data.combinedData.newNoteHashes.map(x => x.value.toBuffer()); - - await this.db.appendLeaves( - MerkleTreeId.CONTRACT_TREE, - newContracts.map(x => x.toBuffer()), - ); - await this.db.appendLeaves(MerkleTreeId.NOTE_HASH_TREE, newNoteHashes); // The read witnesses for a given TX should be generated before the writes of the same TX are applied. @@ -720,7 +687,6 @@ export class SoloBlockBuilder implements BlockBuilder { sortedNullifierIndexes: makeTuple(MAX_NEW_NULLIFIERS_PER_TX, i => sortedNewLeavesIndexes[i]), noteHashSubtreeSiblingPath, nullifierSubtreeSiblingPath, - contractSubtreeSiblingPath, publicDataSiblingPath, }); diff --git a/yarn-project/sequencer-client/src/publisher/l1-publisher.ts b/yarn-project/sequencer-client/src/publisher/l1-publisher.ts index 26a6ea64975..4fb6a11fcb2 100644 --- a/yarn-project/sequencer-client/src/publisher/l1-publisher.ts +++ b/yarn-project/sequencer-client/src/publisher/l1-publisher.ts @@ -1,4 +1,4 @@ -import { ExtendedContractData, L2Block } from '@aztec/circuit-types'; +import { L2Block } from '@aztec/circuit-types'; import { L1PublishStats } from '@aztec/circuit-types/stats'; import { createDebugLogger } from '@aztec/foundation/log'; import { InterruptibleSleep } from '@aztec/foundation/sleep'; @@ -54,22 +54,6 @@ export interface L1PublisherTxSender { */ sendProcessTx(encodedData: L1ProcessArgs): Promise; - /** - * Sends a tx to the contract deployment emitter contract with contract deployment data such as bytecode. Returns once the tx has been mined. - * @param l2BlockNum - Number of the L2 block that owns this encrypted logs. - * @param l2BlockHash - The hash of the block corresponding to this data. - * @param partialAddresses - The partial addresses of the deployed contract - * @param publicKeys - The public keys of the deployed contract - * @param newExtendedContractData - Data to publish. - * @returns The hash of the mined tx. - * @remarks Partial addresses, public keys and contract data has to be in the same order. Read more {@link https://docs.aztec.network/concepts/foundation/accounts/keys#addresses-partial-addresses-and-public-keys | here}. - */ - sendEmitContractDeploymentTx( - l2BlockNum: number, - l2BlockHash: Buffer, - newExtendedContractData: ExtendedContractData[], - ): Promise<(string | undefined)[]>; - /** * Returns a tx receipt if the tx has been mined. * @param txHash - Hash of the tx to look for. @@ -111,16 +95,6 @@ export type L1ProcessArgs = { proof: Buffer; }; -/** - * Helper function to filter out undefined items from an array. - * Also asserts the resulting array is of type . - * @param item - An item from an array to check if undefined or not. - * @returns True if the item is not undefined. - */ -function isNotUndefined(item: T | undefined): item is T { - return item !== undefined; -} - /** * Publishes L2 blocks to L1. This implementation does *not* retry a transaction in * the event of network congestion, but should work for local development. @@ -234,49 +208,6 @@ export class L1Publisher implements L2BlockReceiver { return false; } - /** - * Publishes new contract data to L1. - * @param l2BlockNum - The L2 block number that the new contracts were deployed on. - * @param l2BlockHash - The hash of the block corresponding to this data. - * @param contractData - The new contract data to publish. - * @returns True once the tx has been confirmed and is successful, false on revert or interrupt, blocks otherwise. - */ - public async processNewContractData(l2BlockNum: number, l2BlockHash: Buffer, contractData: ExtendedContractData[]) { - let _contractData: ExtendedContractData[] = []; - while (!this.interrupted) { - const arr = _contractData.length ? _contractData : contractData; - const txHashes = await this.sendEmitNewContractDataTx(l2BlockNum, l2BlockHash, arr); - if (!txHashes) { - break; - } - // filter successful txs - _contractData = arr.filter((_, i) => !!txHashes[i]); - - const receipts = await Promise.all( - txHashes.filter(isNotUndefined).map(txHash => this.getTransactionReceipt(txHash)), - ); - if (!receipts?.length) { - break; - } - - // ALL Txs were mined successfully - if (receipts.length === contractData.length && receipts.every(r => r?.status)) { - return true; - } - - this.log( - `Transaction status failed: ${receipts - .filter(r => !r?.status) - .map(r => r?.transactionHash) - .join(',')}`, - ); - await this.sleepOrInterrupted(); - } - - this.log('L2 block data syncing interrupted while processing contract data.'); - return false; - } - /** * Calling `interrupt` will cause any in progress call to `publishRollup` to return `false` asap. * Be warned, the call may return false even if the tx subsequently gets successfully mined. @@ -330,21 +261,6 @@ export class L1Publisher implements L2BlockReceiver { } } - private async sendEmitNewContractDataTx( - l2BlockNum: number, - l2BlockHash: Buffer, - newExtendedContractData: ExtendedContractData[], - ) { - while (!this.interrupted) { - try { - return await this.txSender.sendEmitContractDeploymentTx(l2BlockNum, l2BlockHash, newExtendedContractData); - } catch (err) { - this.log.error(`Error sending contract data to L1`, err); - await this.sleepOrInterrupted(); - } - } - } - private async getTransactionReceipt(txHash: string): Promise { while (!this.interrupted) { try { diff --git a/yarn-project/sequencer-client/src/publisher/viem-tx-sender.ts b/yarn-project/sequencer-client/src/publisher/viem-tx-sender.ts index cecaa20b453..7c41c469f1f 100644 --- a/yarn-project/sequencer-client/src/publisher/viem-tx-sender.ts +++ b/yarn-project/sequencer-client/src/publisher/viem-tx-sender.ts @@ -1,8 +1,7 @@ -import { ExtendedContractData, L2Block } from '@aztec/circuit-types'; -import { BLOB_SIZE_IN_BYTES } from '@aztec/circuits.js/constants'; +import { L2Block } from '@aztec/circuit-types'; import { createEthereumChain } from '@aztec/ethereum'; import { createDebugLogger } from '@aztec/foundation/log'; -import { AvailabilityOracleAbi, ContractDeploymentEmitterAbi, RollupAbi } from '@aztec/l1-artifacts'; +import { AvailabilityOracleAbi, RollupAbi } from '@aztec/l1-artifacts'; import { GetContractReturnType, @@ -40,10 +39,6 @@ export class ViemTxSender implements L1PublisherTxSender { typeof RollupAbi, WalletClient >; - private contractDeploymentEmitterContract: GetContractReturnType< - typeof ContractDeploymentEmitterAbi, - WalletClient - >; private log = createDebugLogger('aztec:sequencer:viem-tx-sender'); private publicClient: PublicClient; @@ -74,11 +69,6 @@ export class ViemTxSender implements L1PublisherTxSender { abi: RollupAbi, client: walletClient, }); - this.contractDeploymentEmitterContract = getContract({ - address: getAddress(l1Contracts.contractDeploymentEmitterAddress.toString()), - abi: ContractDeploymentEmitterAbi, - client: walletClient, - }); } async getCurrentArchive(): Promise { @@ -169,46 +159,6 @@ export class ViemTxSender implements L1PublisherTxSender { return hash; } - /** - * Sends a tx to the contract deployment emitter contract with contract deployment data such as bytecode. Returns once the tx has been mined. - * @param l2BlockNum - Number of the L2 block that owns this encrypted logs. - * @param l2BlockHash - The hash of the block corresponding to this data. - * @param newExtendedContractData - Data to publish. - * @returns The hash of the mined tx. - */ - async sendEmitContractDeploymentTx( - l2BlockNum: number, - l2BlockHash: Buffer, - newExtendedContractData: ExtendedContractData[], - ): Promise<(string | undefined)[]> { - const hashes: string[] = []; - for (const extendedContractData of newExtendedContractData) { - const args = [ - BigInt(l2BlockNum), - extendedContractData.contractData.contractAddress.toString() as Hex, - extendedContractData.contractData.portalContractAddress.toString() as Hex, - `0x${l2BlockHash.toString('hex')}`, - extendedContractData.contractClassId.toString(), - extendedContractData.saltedInitializationHash.toString(), - extendedContractData.publicKeyHash.toString(), - `0x${extendedContractData.bytecode.toString('hex')}`, - ] as const; - - const codeSize = extendedContractData.bytecode.length; - this.log(`Bytecode is ${codeSize} bytes and require ${codeSize / BLOB_SIZE_IN_BYTES} blobs`); - - const gas = await this.contractDeploymentEmitterContract.estimateGas.emitContractDeployment(args, { - account: this.account, - }); - const hash = await this.contractDeploymentEmitterContract.write.emitContractDeployment(args, { - gas, - account: this.account, - }); - hashes.push(hash); - } - return hashes; - } - /** * Gets the chain object for the given chain id. * @param chainId - Chain id of the target EVM chain. diff --git a/yarn-project/sequencer-client/src/sequencer/processed_tx.ts b/yarn-project/sequencer-client/src/sequencer/processed_tx.ts index daa2239cdcb..75575c0fbf9 100644 --- a/yarn-project/sequencer-client/src/sequencer/processed_tx.ts +++ b/yarn-project/sequencer-client/src/sequencer/processed_tx.ts @@ -1,17 +1,7 @@ -import { - ContractData, - ExtendedContractData, - PublicDataWrite, - SimulationError, - Tx, - TxEffect, - TxHash, - TxL2Logs, -} from '@aztec/circuit-types'; +import { PublicDataWrite, SimulationError, Tx, TxEffect, TxHash, TxL2Logs } from '@aztec/circuit-types'; import { Fr, Header, - MAX_NEW_CONTRACTS_PER_TX, MAX_NEW_NOTE_HASHES_PER_TX, MAX_NEW_NULLIFIERS_PER_TX, MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, @@ -29,7 +19,7 @@ import { Tuple, fromFieldsTuple } from '@aztec/foundation/serialize'; * Represents a tx that has been processed by the sequencer public processor, * so its kernel circuit public inputs are filled in. */ -export type ProcessedTx = Pick & { +export type ProcessedTx = Pick & { /** * Output of the public kernel circuit for this tx. */ @@ -153,7 +143,6 @@ export function makeProcessedTx( proof: previousProof, encryptedLogs: revertReason ? new TxL2Logs([]) : tx.encryptedLogs, unencryptedLogs: revertReason ? new TxL2Logs([]) : tx.unencryptedLogs, - newContracts: revertReason ? [ExtendedContractData.empty()] : tx.newContracts, isEmpty: false, revertReason, }; @@ -177,7 +166,6 @@ export function makeEmptyProcessedTx(header: Header, chainId: Fr, version: Fr): unencryptedLogs: new TxL2Logs([]), data: emptyKernelOutput, proof: emptyProof, - newContracts: [ExtendedContractData.empty()], isEmpty: true, revertReason: undefined, }; @@ -195,10 +183,6 @@ export function toTxEffect(tx: ProcessedTx): TxEffect { PublicDataWrite, typeof MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX >, - tx.data.combinedData.newContracts.map(cd => cd.hash()) as Tuple, - tx.data.combinedData.newContracts.map( - cd => new ContractData(cd.contractAddress, cd.portalContractAddress), - ) as Tuple, tx.encryptedLogs || new TxL2Logs([]), tx.unencryptedLogs || new TxL2Logs([]), ); diff --git a/yarn-project/sequencer-client/src/sequencer/public_processor.test.ts b/yarn-project/sequencer-client/src/sequencer/public_processor.test.ts index 17e639a7000..c1371204787 100644 --- a/yarn-project/sequencer-client/src/sequencer/public_processor.test.ts +++ b/yarn-project/sequencer-client/src/sequencer/public_processor.test.ts @@ -1,5 +1,4 @@ import { - ExtendedContractData, FunctionCall, FunctionL2Logs, PublicDataWrite, @@ -135,7 +134,6 @@ describe('public_processor', () => { proof: tx.proof, encryptedLogs: tx.encryptedLogs, unencryptedLogs: tx.unencryptedLogs, - newContracts: tx.newContracts, isEmpty: false, revertReason: undefined, }; @@ -213,9 +211,7 @@ describe('public_processor', () => { ); kernelOutput.end.unencryptedLogsHash = [Fr.ZERO, Fr.ZERO]; - const tx = new Tx(kernelOutput, proof, TxL2Logs.empty(), TxL2Logs.empty(), publicCallRequests, [ - ExtendedContractData.random(), - ]); + const tx = new Tx(kernelOutput, proof, TxL2Logs.empty(), TxL2Logs.empty(), publicCallRequests); tx.data.needsSetup = false; tx.data.needsTeardown = false; @@ -261,14 +257,7 @@ describe('public_processor', () => { kernelOutput.needsSetup = false; kernelOutput.needsTeardown = false; - const tx = new Tx( - kernelOutput, - proof, - TxL2Logs.empty(), - TxL2Logs.empty(), - [callRequest], - [ExtendedContractData.random()], - ); + const tx = new Tx(kernelOutput, proof, TxL2Logs.empty(), TxL2Logs.empty(), [callRequest]); const publicExecutionResult = PublicExecutionResultBuilder.fromPublicCallRequest({ request: callRequest, @@ -320,7 +309,6 @@ describe('public_processor', () => { TxL2Logs.empty(), // reverse because `enqueuedPublicFunctions` expects the last element to be the front of the queue callRequests.slice().reverse(), - [ExtendedContractData.random()], ); const contractSlotA = fr(0x100); @@ -403,8 +391,6 @@ describe('public_processor', () => { expect(txEffect.publicDataWrites[1]).toEqual( new PublicDataWrite(computePublicDataTreeLeafSlot(baseContractAddress, contractSlotC), fr(0x201)), ); - expect(txEffect.contractData[0].isEmpty()).toBe(true); - expect(txEffect.contractLeaves[0].isZero()).toBe(true); expect(txEffect.encryptedLogs.getTotalLogCount()).toBe(0); expect(txEffect.unencryptedLogs.getTotalLogCount()).toBe(0); }); @@ -437,7 +423,6 @@ describe('public_processor', () => { TxL2Logs.empty(), // reverse because `enqueuedPublicFunctions` expects the last element to be the front of the queue callRequests.slice().reverse(), - [ExtendedContractData.random()], ); // const baseContractAddress = makeAztecAddress(30); @@ -570,7 +555,7 @@ class PublicExecutionResultBuilder { revertReason?: SimulationError; }) { const builder = new PublicExecutionResultBuilder({ - callContext: new CallContext(from, tx.to, EthAddress.ZERO, tx.functionData.selector, false, false, false, 0), + callContext: new CallContext(from, tx.to, EthAddress.ZERO, tx.functionData.selector, false, false, 0), contractAddress: tx.to, functionData: tx.functionData, args: tx.args, diff --git a/yarn-project/sequencer-client/src/sequencer/sequencer.test.ts b/yarn-project/sequencer-client/src/sequencer/sequencer.test.ts index 5ee994cd26d..831ddb4c2fb 100644 --- a/yarn-project/sequencer-client/src/sequencer/sequencer.test.ts +++ b/yarn-project/sequencer-client/src/sequencer/sequencer.test.ts @@ -1,13 +1,4 @@ -import { - ExtendedContractData, - L1ToL2MessageSource, - L2Block, - L2BlockSource, - MerkleTreeId, - Tx, - TxHash, - mockTx, -} from '@aztec/circuit-types'; +import { L1ToL2MessageSource, L2Block, L2BlockSource, MerkleTreeId, Tx, TxHash, mockTx } from '@aztec/circuit-types'; import { AztecAddress, EthAddress, @@ -222,45 +213,6 @@ describe('sequencer', () => { expect(publisher.processL2Block).not.toHaveBeenCalled(); }); - - it('publishes contract data', async () => { - const txWithContract = mockTx(0x10000); - (txWithContract.newContracts as Array) = [ExtendedContractData.random()]; - txWithContract.data.constants.txContext.chainId = chainId; - - const txWithEmptyContract = mockTx(0x20000); - (txWithEmptyContract.newContracts as Array) = [ExtendedContractData.empty()]; - txWithEmptyContract.data.constants.txContext.chainId = chainId; - - const block = L2Block.random(lastBlockNumber + 1); - const proof = makeEmptyProof(); - - p2p.getTxs.mockResolvedValueOnce([txWithContract, txWithEmptyContract]); - blockBuilder.buildL2Block.mockResolvedValueOnce([block, proof]); - publisher.processL2Block.mockResolvedValueOnce(true); - publisher.processNewContractData.mockResolvedValueOnce(true); - globalVariableBuilder.buildGlobalVariables.mockResolvedValueOnce( - new GlobalVariables(chainId, version, new Fr(lastBlockNumber + 1), Fr.ZERO, coinbase, feeRecipient), - ); - - await sequencer.initialSync(); - await sequencer.work(); - - // check that the block was built with both transactions - expect(blockBuilder.buildL2Block).toHaveBeenCalledWith( - expect.anything(), - expect.arrayContaining([ - expect.objectContaining({ hash: txWithContract.getTxHash() }), - expect.objectContaining({ hash: txWithEmptyContract.getTxHash() }), - ]), - expect.any(Array), - ); - - // check that the empty contract did not get published - expect(publisher.processNewContractData).toHaveBeenCalledWith(block.number, block.body.getTxsEffectsHash(), [ - txWithContract.newContracts[0], - ]); - }); }); class TestSubject extends Sequencer { diff --git a/yarn-project/sequencer-client/src/sequencer/sequencer.ts b/yarn-project/sequencer-client/src/sequencer/sequencer.ts index 47ce5804eb5..39f9b12e058 100644 --- a/yarn-project/sequencer-client/src/sequencer/sequencer.ts +++ b/yarn-project/sequencer-client/src/sequencer/sequencer.ts @@ -227,10 +227,6 @@ export class Sequencer { await assertBlockHeight(); - await this.publishExtendedContractData(processedValidTxs, block); - - await assertBlockHeight(); - await this.publishL2Block(block); this.log.info(`Submitted rollup block ${block.number} with ${processedValidTxs.length} transactions`); } catch (err) { @@ -239,37 +235,6 @@ export class Sequencer { } } - /** - * Gets new extended contract data from the txs and publishes it on chain. - * @param validTxs - The set of real transactions being published as part of the block. - * @param block - The L2Block to be published. - */ - protected async publishExtendedContractData(validTxs: ProcessedTx[], block: L2Block) { - // Publishes contract data for txs to the network and awaits the tx to be mined - this.state = SequencerState.PUBLISHING_CONTRACT_DATA; - const newContracts = validTxs.flatMap(tx => tx.newContracts).filter(cd => !cd.isEmpty()); - - if (newContracts.length === 0) { - this.log.debug(`No new contracts to publish in block ${block.number}`); - return; - } - - const txsEffectsHash = block.body.getTxsEffectsHash(); - this.log.info(`Publishing ${newContracts.length} contracts in block ${block.number}`); - - const publishedContractData = await this.publisher.processNewContractData( - block.number, - txsEffectsHash, - newContracts, - ); - - if (publishedContractData) { - this.log(`Successfully published new contract data for block ${block.number}`); - } else if (!publishedContractData && newContracts.length) { - this.log(`Failed to publish new contract data for block ${block.number}`); - } - } - /** * Publishes the L2Block to the rollup contract. * @param block - The L2Block to be published. diff --git a/yarn-project/sequencer-client/src/simulator/public_executor.ts b/yarn-project/sequencer-client/src/simulator/public_executor.ts index 3c7c7bdcbf1..9af59f7729b 100644 --- a/yarn-project/sequencer-client/src/simulator/public_executor.ts +++ b/yarn-project/sequencer-client/src/simulator/public_executor.ts @@ -45,16 +45,6 @@ export class ContractsDataSourcePublicDB implements PublicContractsDB { * @param tx - The transaction to add contracts from. */ public addNewContracts(tx: Tx): Promise { - for (const contract of tx.newContracts) { - const contractAddress = contract.contractData.contractAddress; - - if (contractAddress.isZero()) { - continue; - } - - this.cache.set(contractAddress.toString(), contract); - } - // Extract contract class and instance data from logs and add to cache for this block const logs = tx.unencryptedLogs.unrollLogs().map(UnencryptedL2Log.fromBuffer); ContractClassRegisteredEvent.fromLogs(logs, ClassRegistererAddress).forEach(e => { @@ -76,16 +66,6 @@ export class ContractsDataSourcePublicDB implements PublicContractsDB { * @param tx - The tx's contracts to be removed */ public removeNewContracts(tx: Tx): Promise { - for (const contract of tx.newContracts) { - const contractAddress = contract.contractData.contractAddress; - - if (contractAddress.isZero()) { - continue; - } - - this.cache.delete(contractAddress.toString()); - } - // TODO(@spalladino): Can this inadvertently delete a valid contract added by another tx? // Let's say we have two txs adding the same contract on the same block. If the 2nd one reverts, // wouldn't that accidentally remove the contract added on the first one? diff --git a/yarn-project/simulator/src/client/client_execution_context.ts b/yarn-project/simulator/src/client/client_execution_context.ts index ccefed30157..c0f90ab2758 100644 --- a/yarn-project/simulator/src/client/client_execution_context.ts +++ b/yarn-project/simulator/src/client/client_execution_context.ts @@ -10,7 +10,6 @@ import { } from '@aztec/circuit-types'; import { CallContext, - ContractDeploymentData, FunctionData, FunctionSelector, Header, @@ -89,8 +88,6 @@ export class ClientExecutionContext extends ViewDataOracle { * @returns The initial witness. */ public getInitialWitness(abi: FunctionAbi) { - const contractDeploymentData = this.txContext.contractDeploymentData; - const argumentsSize = countArgumentsSize(abi); const args = this.packedArgsCache.unpack(this.argsHash); @@ -102,7 +99,6 @@ export class ClientExecutionContext extends ViewDataOracle { const fields = [ ...this.callContext.toFields(), ...this.historicalHeader.toFields(), - ...contractDeploymentData.toFields(), this.txContext.chainId, this.txContext.version, @@ -348,14 +344,7 @@ export class ClientExecutionContext extends ViewDataOracle { const targetArtifact = await this.db.getFunctionArtifact(targetContractAddress, functionSelector); const targetFunctionData = FunctionData.fromAbi(targetArtifact); - const derivedTxContext = new TxContext( - false, - false, - false, - ContractDeploymentData.empty(), - this.txContext.chainId, - this.txContext.version, - ); + const derivedTxContext = new TxContext(false, false, this.txContext.chainId, this.txContext.version); const derivedCallContext = await this.deriveCallContext( targetContractAddress, @@ -470,7 +459,6 @@ export class ClientExecutionContext extends ViewDataOracle { FunctionSelector.fromNameAndParameters(targetArtifact.name, targetArtifact.parameters), isDelegateCall, isStaticCall, - false, startSideEffectCounter, ); } diff --git a/yarn-project/simulator/src/client/private_execution.test.ts b/yarn-project/simulator/src/client/private_execution.test.ts index e41a9aac433..d8c08b9bae8 100644 --- a/yarn-project/simulator/src/client/private_execution.test.ts +++ b/yarn-project/simulator/src/client/private_execution.test.ts @@ -3,7 +3,6 @@ import { AppendOnlyTreeSnapshot, CallContext, CompleteAddress, - ContractDeploymentData, FunctionData, Header, L1_TO_L2_MSG_TREE_HEIGHT, @@ -20,7 +19,7 @@ import { sideEffectArrayToValueArray, } from '@aztec/circuits.js'; import { computeCommitmentNonce, computeMessageSecretHash, computeVarArgsHash } from '@aztec/circuits.js/hash'; -import { makeContractDeploymentData, makeHeader } from '@aztec/circuits.js/testing'; +import { makeHeader } from '@aztec/circuits.js/testing'; import { FunctionArtifact, FunctionSelector, @@ -86,12 +85,10 @@ describe('Private Execution test suite', () => { let trees: { [name: keyof typeof treeHeights]: AppendOnlyTree } = {}; const txContextFields: FieldsOf = { - isContractDeploymentTx: false, isFeePaymentTx: false, isRebatePaymentTx: false, chainId: new Fr(10), version: new Fr(20), - contractDeploymentData: ContractDeploymentData.empty(), }; const runSimulator = ({ @@ -154,7 +151,6 @@ describe('Private Execution test suite', () => { new PartialStateReference( name === 'noteHash' ? newSnap : header.state.partial.noteHashTree, header.state.partial.nullifierTree, - header.state.partial.contractTree, header.state.partial.publicDataTree, ), ), @@ -222,13 +218,10 @@ describe('Private Execution test suite', () => { describe('empty constructor', () => { it('should run the empty constructor', async () => { const artifact = getFunctionArtifact(TestContractArtifact, 'constructor'); - const contractDeploymentData = makeContractDeploymentData(100); - const txContext = { isContractDeploymentTx: true, contractDeploymentData }; - const result = await runSimulator({ artifact, txContext }); + const result = await runSimulator({ artifact }); const emptyCommitments = new Array(MAX_NEW_NOTE_HASHES_PER_CALL).fill(Fr.ZERO); expect(sideEffectArrayToValueArray(result.callStackItem.publicInputs.newNoteHashes)).toEqual(emptyCommitments); - expect(result.callStackItem.publicInputs.contractDeploymentData).toEqual(contractDeploymentData); }); it('emits a field as an unencrypted log', async () => { @@ -828,7 +821,6 @@ describe('Private Execution test suite', () => { storageContractAddress: childAddress, portalContractAddress: childPortalContractAddress, functionSelector: childSelector, - isContractDeployment: false, isDelegateCall: false, isStaticCall: false, startSideEffectCounter: 1, @@ -838,7 +830,6 @@ describe('Private Execution test suite', () => { storageContractAddress: parentAddress, portalContractAddress: EthAddress.ZERO, functionSelector: FunctionSelector.fromNameAndParameters(parentArtifact.name, parentArtifact.parameters), - isContractDeployment: false, isDelegateCall: false, isStaticCall: false, startSideEffectCounter: 1, diff --git a/yarn-project/simulator/src/client/simulator.ts b/yarn-project/simulator/src/client/simulator.ts index 4d5e89e8647..c98a4a6cf5c 100644 --- a/yarn-project/simulator/src/client/simulator.ts +++ b/yarn-project/simulator/src/client/simulator.ts @@ -92,10 +92,9 @@ export class AcirSimulator { FunctionSelector.fromNameAndParameters(entryPointArtifact.name, entryPointArtifact.parameters), false, false, - request.functionData.isConstructor, // TODO: when contract deployment is done in-app, we should only reserve one counter for the tx hash // 2 counters are reserved for tx hash and contract deployment nullifier - request.txContext.isContractDeploymentTx ? 2 : 1, + 1, ); const context = new ClientExecutionContext( contractAddress, diff --git a/yarn-project/simulator/src/public/index.test.ts b/yarn-project/simulator/src/public/index.test.ts index 098c72dc096..a4212f61a07 100644 --- a/yarn-project/simulator/src/public/index.test.ts +++ b/yarn-project/simulator/src/public/index.test.ts @@ -108,7 +108,6 @@ describe('ACIR public execution simulator', () => { storageContractAddress: contractAddress, portalContractAddress: EthAddress.random(), functionSelector: FunctionSelector.empty(), - isContractDeployment: false, isDelegateCall: false, isStaticCall: false, startSideEffectCounter: 0, @@ -182,7 +181,6 @@ describe('ACIR public execution simulator', () => { storageContractAddress: contractAddress, portalContractAddress: EthAddress.random(), functionSelector: FunctionSelector.empty(), - isContractDeployment: false, isDelegateCall: false, isStaticCall: false, startSideEffectCounter: 0, @@ -272,7 +270,6 @@ describe('ACIR public execution simulator', () => { storageContractAddress: parentContractAddress, portalContractAddress: EthAddress.random(), functionSelector: FunctionSelector.empty(), - isContractDeployment: false, isDelegateCall: false, isStaticCall: false, startSideEffectCounter: 0, @@ -352,7 +349,6 @@ describe('ACIR public execution simulator', () => { storageContractAddress: contractAddress, portalContractAddress: EthAddress.random(), functionSelector: FunctionSelector.empty(), - isContractDeployment: false, isDelegateCall: false, isStaticCall: false, startSideEffectCounter: 0, @@ -387,7 +383,6 @@ describe('ACIR public execution simulator', () => { storageContractAddress: contractAddress, portalContractAddress, functionSelector: FunctionSelector.empty(), - isContractDeployment: false, isDelegateCall: false, isStaticCall: false, startSideEffectCounter: 0, @@ -418,7 +413,6 @@ describe('ACIR public execution simulator', () => { storageContractAddress: contractAddress, portalContractAddress: EthAddress.random(), functionSelector: FunctionSelector.empty(), - isContractDeployment: false, isDelegateCall: false, isStaticCall: false, startSideEffectCounter: 0, @@ -477,7 +471,6 @@ describe('ACIR public execution simulator', () => { storageContractAddress: contractAddress, portalContractAddress: crossChainMsgSender ?? preimage.sender.sender, functionSelector: FunctionSelector.empty(), - isContractDeployment: false, isDelegateCall: false, isStaticCall: false, startSideEffectCounter: 0, @@ -677,7 +670,6 @@ describe('ACIR public execution simulator', () => { storageContractAddress: AztecAddress.random(), portalContractAddress: EthAddress.ZERO, functionSelector: FunctionSelector.empty(), - isContractDeployment: false, isDelegateCall: false, isStaticCall: false, startSideEffectCounter: 0, @@ -761,7 +753,6 @@ describe('ACIR public execution simulator', () => { storageContractAddress: AztecAddress.random(), portalContractAddress: EthAddress.ZERO, functionSelector: FunctionSelector.empty(), - isContractDeployment: false, isDelegateCall: false, isStaticCall: false, startSideEffectCounter: 0, diff --git a/yarn-project/simulator/src/public/public_execution_context.ts b/yarn-project/simulator/src/public/public_execution_context.ts index 597b0456358..8d332e8edb7 100644 --- a/yarn-project/simulator/src/public/public_execution_context.ts +++ b/yarn-project/simulator/src/public/public_execution_context.ts @@ -186,7 +186,6 @@ export class PublicExecutionContext extends TypedOracle { storageContractAddress: isDelegateCall ? this.execution.contractAddress : targetContractAddress, portalContractAddress: portalAddress, functionSelector, - isContractDeployment: false, isDelegateCall, isStaticCall, startSideEffectCounter: 0, // TODO use counters in public execution diff --git a/yarn-project/world-state/src/synchronizer/server_world_state_synchronizer.test.ts b/yarn-project/world-state/src/synchronizer/server_world_state_synchronizer.test.ts index 3e6866bfd6d..5549ba2705f 100644 --- a/yarn-project/world-state/src/synchronizer/server_world_state_synchronizer.test.ts +++ b/yarn-project/world-state/src/synchronizer/server_world_state_synchronizer.test.ts @@ -22,19 +22,6 @@ const consumeNextBlocks = () => { return Promise.resolve(blocks); }; -const getMockBlock = (blockNumber: number, newContractsCommitments?: Buffer[]) => { - const block = L2Block.random(blockNumber); - - if (newContractsCommitments) { - for (let i = 0; i < newContractsCommitments.length; i++) { - // Assuming one new contract per tx - block.body.txEffects[i].contractLeaves = [Fr.fromBuffer(newContractsCommitments[i])]; - } - } - - return block; -}; - const log = createDebugLogger('aztec:server_world_state_synchronizer_test'); describe('server_world_state_synchronizer', () => { @@ -46,7 +33,7 @@ describe('server_world_state_synchronizer', () => { const merkleTreeDb = mock({ getTreeInfo: jest.fn(() => - Promise.resolve({ depth: 8, treeId: MerkleTreeId.CONTRACT_TREE, root: Buffer.alloc(32, 0), size: 0n }), + Promise.resolve({ depth: 8, treeId: MerkleTreeId.NOTE_HASH_TREE, root: Buffer.alloc(32, 0), size: 0n }), ), getSiblingPath: jest.fn(() => { const pedersen: Pedersen = new Pedersen(); @@ -64,7 +51,7 @@ describe('server_world_state_synchronizer', () => { // create the initial blocks nextBlocks = Array(LATEST_BLOCK_NUMBER) .fill(0) - .map((_, index: number) => getMockBlock(index + 1)); + .map((_, index: number) => L2Block.random(index + 1)); // start the sync process and await it await server.start().catch(err => log.error('Sync not completed: ', err)); @@ -82,7 +69,7 @@ describe('server_world_state_synchronizer', () => { // create the initial blocks nextBlocks = Array(count) .fill(0) - .map((_, index: number) => getMockBlock(LATEST_BLOCK_NUMBER + index + 1)); + .map((_, index: number) => L2Block.random(LATEST_BLOCK_NUMBER + index + 1)); rollupSource.getBlockNumber.mockResolvedValueOnce(LATEST_BLOCK_NUMBER + count); @@ -125,7 +112,7 @@ describe('server_world_state_synchronizer', () => { // create an initial block let currentBlockNumber = 0; - nextBlocks = [getMockBlock(currentBlockNumber + 1)]; + nextBlocks = [L2Block.random(currentBlockNumber + 1)]; // start the sync process but don't await server.start().catch(err => log.error('Sync not completed: ', err)); @@ -147,7 +134,7 @@ describe('server_world_state_synchronizer', () => { continue; } currentBlockNumber++; - nextBlocks = [getMockBlock(currentBlockNumber + 1)]; + nextBlocks = [L2Block.random(currentBlockNumber + 1)]; } // check the status again, should be fully synced @@ -171,7 +158,7 @@ describe('server_world_state_synchronizer', () => { const newBlocks = async () => { while (currentBlockNumber <= LATEST_BLOCK_NUMBER) { await sleep(100); - nextBlocks = [...nextBlocks, getMockBlock(++currentBlockNumber)]; + nextBlocks = [...nextBlocks, L2Block.random(++currentBlockNumber)]; } }; @@ -202,7 +189,7 @@ describe('server_world_state_synchronizer', () => { const newBlocks = async () => { while (currentBlockNumber < LATEST_BLOCK_NUMBER) { await sleep(100); - const newBlock = getMockBlock(++currentBlockNumber); + const newBlock = L2Block.random(++currentBlockNumber); nextBlocks = [...nextBlocks, newBlock]; } }; @@ -260,7 +247,7 @@ describe('server_world_state_synchronizer', () => { const totalBlocks = LATEST_BLOCK_NUMBER + 1; nextBlocks = Array(totalBlocks) .fill(0) - .map((_, index) => getMockBlock(index, [Buffer.alloc(32, index)])); + .map((_, index) => L2Block.random(index)); // sync the server await server.start(); @@ -275,13 +262,13 @@ describe('server_world_state_synchronizer', () => { // the server should now be asleep for a long time // we will add a new block and force an immediate sync - nextBlocks = [getMockBlock(LATEST_BLOCK_NUMBER + 1)]; + nextBlocks = [L2Block.random(LATEST_BLOCK_NUMBER + 1)]; await server.syncImmediate(); let status = await server.status(); expect(status.syncedToL2Block).toBe(LATEST_BLOCK_NUMBER + 1); - nextBlocks = [getMockBlock(LATEST_BLOCK_NUMBER + 2), getMockBlock(LATEST_BLOCK_NUMBER + 3)]; + nextBlocks = [L2Block.random(LATEST_BLOCK_NUMBER + 2), L2Block.random(LATEST_BLOCK_NUMBER + 3)]; await server.syncImmediate(); status = await server.status(); @@ -305,7 +292,7 @@ describe('server_world_state_synchronizer', () => { // we will add 20 blocks and force a sync to at least LATEST + 5 nextBlocks = Array(20) .fill(0) - .map((_, index: number) => getMockBlock(index + 1 + LATEST_BLOCK_NUMBER)); + .map((_, index: number) => L2Block.random(index + 1 + LATEST_BLOCK_NUMBER)); await server.syncImmediate(LATEST_BLOCK_NUMBER + 5); // we should have synced all of the blocks @@ -352,7 +339,7 @@ describe('server_world_state_synchronizer', () => { // we will add 2 blocks and force a sync to at least LATEST + 5 nextBlocks = Array(2) .fill(0) - .map((_, index: number) => getMockBlock(index + 1 + LATEST_BLOCK_NUMBER)); + .map((_, index: number) => L2Block.random(index + 1 + LATEST_BLOCK_NUMBER)); await expect(server.syncImmediate(LATEST_BLOCK_NUMBER + 5)).rejects.toThrow( `Unable to sync to block number ${LATEST_BLOCK_NUMBER + 5}, currently synced to block ${LATEST_BLOCK_NUMBER + 2}`, ); @@ -380,7 +367,7 @@ describe('server_world_state_synchronizer', () => { // create an initial block nextBlocks = Array(LATEST_BLOCK_NUMBER) .fill(0) - .map((_, index: number) => getMockBlock(index + 1)); + .map((_, index: number) => L2Block.random(index + 1)); await expect(server.syncImmediate()).rejects.toThrow(`World State is not running, unable to perform sync`); }); diff --git a/yarn-project/world-state/src/world-state-db/merkle_tree_snapshot_operations_facade.ts b/yarn-project/world-state/src/world-state-db/merkle_tree_snapshot_operations_facade.ts index 8c645dc6ca7..f58dd1295b0 100644 --- a/yarn-project/world-state/src/world-state-db/merkle_tree_snapshot_operations_facade.ts +++ b/yarn-project/world-state/src/world-state-db/merkle_tree_snapshot_operations_facade.ts @@ -83,7 +83,6 @@ export class MerkleTreeSnapshotOperationsFacade implements MerkleTreeOperations async getStateReference(): Promise { const snapshots = await Promise.all([ - this.#getTreeSnapshot(MerkleTreeId.CONTRACT_TREE), this.#getTreeSnapshot(MerkleTreeId.NULLIFIER_TREE), this.#getTreeSnapshot(MerkleTreeId.NOTE_HASH_TREE), this.#getTreeSnapshot(MerkleTreeId.PUBLIC_DATA_TREE), @@ -105,10 +104,6 @@ export class MerkleTreeSnapshotOperationsFacade implements MerkleTreeOperations Fr.fromBuffer(snapshots[MerkleTreeId.NULLIFIER_TREE].getRoot()), Number(snapshots[MerkleTreeId.NULLIFIER_TREE].getNumLeaves()), ), - new AppendOnlyTreeSnapshot( - Fr.fromBuffer(snapshots[MerkleTreeId.CONTRACT_TREE].getRoot()), - Number(snapshots[MerkleTreeId.CONTRACT_TREE].getNumLeaves()), - ), new AppendOnlyTreeSnapshot( Fr.fromBuffer(snapshots[MerkleTreeId.PUBLIC_DATA_TREE].getRoot()), Number(snapshots[MerkleTreeId.PUBLIC_DATA_TREE].getNumLeaves()), diff --git a/yarn-project/world-state/src/world-state-db/merkle_trees.ts b/yarn-project/world-state/src/world-state-db/merkle_trees.ts index de119f5ac58..2e5b1d44db2 100644 --- a/yarn-project/world-state/src/world-state-db/merkle_trees.ts +++ b/yarn-project/world-state/src/world-state-db/merkle_trees.ts @@ -2,7 +2,6 @@ import { L2Block, MerkleTreeId, SiblingPath } from '@aztec/circuit-types'; import { ARCHIVE_HEIGHT, AppendOnlyTreeSnapshot, - CONTRACT_TREE_HEIGHT, ContentCommitment, Fr, GlobalVariables, @@ -89,13 +88,7 @@ export class MerkleTrees implements MerkleTreeDb { const initializeTree = fromDb ? loadTree : newTree; const hasher = new Pedersen(); - const contractTree: AppendOnlyTree = await initializeTree( - StandardTree, - this.store, - hasher, - `${MerkleTreeId[MerkleTreeId.CONTRACT_TREE]}`, - CONTRACT_TREE_HEIGHT, - ); + const nullifierTree = await initializeTree( NullifierTree, this.store, @@ -133,7 +126,7 @@ export class MerkleTrees implements MerkleTreeDb { `${MerkleTreeId[MerkleTreeId.ARCHIVE]}`, ARCHIVE_HEIGHT, ); - this.trees = [contractTree, nullifierTree, noteHashTree, publicDataTree, l1Tol2MessageTree, archive]; + this.trees = [nullifierTree, noteHashTree, publicDataTree, l1Tol2MessageTree, archive]; this.jobQueue.start(); @@ -213,7 +206,6 @@ export class MerkleTrees implements MerkleTreeDb { new PartialStateReference( getAppendOnlyTreeSnapshot(MerkleTreeId.NOTE_HASH_TREE), getAppendOnlyTreeSnapshot(MerkleTreeId.NULLIFIER_TREE), - getAppendOnlyTreeSnapshot(MerkleTreeId.CONTRACT_TREE), getAppendOnlyTreeSnapshot(MerkleTreeId.PUBLIC_DATA_TREE), ), ); @@ -488,7 +480,6 @@ export class MerkleTrees implements MerkleTreeDb { */ async #handleL2Block(l2Block: L2Block): Promise { const treeRootWithIdPairs = [ - [l2Block.header.state.partial.contractTree.root, MerkleTreeId.CONTRACT_TREE], [l2Block.header.state.partial.nullifierTree.root, MerkleTreeId.NULLIFIER_TREE], [l2Block.header.state.partial.noteHashTree.root, MerkleTreeId.NOTE_HASH_TREE], [l2Block.header.state.partial.publicDataTree.root, MerkleTreeId.PUBLIC_DATA_TREE], @@ -509,7 +500,6 @@ export class MerkleTrees implements MerkleTreeDb { // Sync the append only trees for (const [tree, leaves] of [ - [MerkleTreeId.CONTRACT_TREE, l2Block.body.txEffects.flatMap(txEffect => txEffect.contractLeaves)], [MerkleTreeId.NOTE_HASH_TREE, l2Block.body.txEffects.flatMap(txEffect => txEffect.noteHashes)], [MerkleTreeId.L1_TO_L2_MESSAGE_TREE, l2Block.body.l1ToL2Messages], ] as const) { From 763e8270cbfdefc6817b347dcb061ae332d94994 Mon Sep 17 00:00:00 2001 From: Santiago Palladino Date: Fri, 8 Mar 2024 18:32:13 -0300 Subject: [PATCH 02/12] Update solidity l2 block parsing --- l1-contracts/slither_output.md | 116 +++++++++--------- .../src/core/libraries/ConstantsGen.sol | 15 ++- l1-contracts/src/core/libraries/HeaderLib.sol | 37 +++--- .../libraries/decoders/MessagesDecoder.sol | 22 ++-- .../core/libraries/decoders/TxsDecoder.sol | 45 +------ l1-contracts/test/fixtures/empty_block_0.json | 22 ++-- l1-contracts/test/fixtures/empty_block_1.json | 24 ++-- l1-contracts/test/fixtures/mixed_block_0.json | 22 ++-- l1-contracts/test/fixtures/mixed_block_1.json | 24 ++-- noir-projects/.vscode/settings.json | 3 + .../src/integration_l1_publisher.test.ts | 2 +- 11 files changed, 137 insertions(+), 195 deletions(-) create mode 100644 noir-projects/.vscode/settings.json diff --git a/l1-contracts/slither_output.md b/l1-contracts/slither_output.md index 7f202ef2ce5..a43d9bcd639 100644 --- a/l1-contracts/slither_output.md +++ b/l1-contracts/slither_output.md @@ -27,15 +27,15 @@ src/core/Rollup.sol#L58-L103 Impact: Medium Confidence: Medium - [ ] ID-1 -[HeaderLib.decode(bytes).header](src/core/libraries/HeaderLib.sol#L150) is a local variable never initialized +[HeaderLib.decode(bytes).header](src/core/libraries/HeaderLib.sol#L148) is a local variable never initialized -src/core/libraries/HeaderLib.sol#L150 +src/core/libraries/HeaderLib.sol#L148 - [ ] ID-2 -[TxsDecoder.decode(bytes).vars](src/core/libraries/decoders/TxsDecoder.sol#L86) is a local variable never initialized +[TxsDecoder.decode(bytes).vars](src/core/libraries/decoders/TxsDecoder.sol#L79) is a local variable never initialized -src/core/libraries/decoders/TxsDecoder.sol#L86 +src/core/libraries/decoders/TxsDecoder.sol#L79 ## unused-return @@ -57,27 +57,20 @@ src/core/Rollup.sol#L58-L103 Impact: Medium Confidence: High - [ ] ID-5 -Dubious typecast in [TxsDecoder.read4(bytes,uint256)](src/core/libraries/decoders/TxsDecoder.sol#L359-L361): - bytes => bytes4 casting occurs in [uint256(uint32(bytes4(slice(_data,_offset,4))))](src/core/libraries/decoders/TxsDecoder.sol#L360) +Dubious typecast in [TxsDecoder.read1(bytes,uint256)](src/core/libraries/decoders/TxsDecoder.sol#L314-L316): + bytes => bytes1 casting occurs in [uint256(uint8(bytes1(slice(_data,_offset,1))))](src/core/libraries/decoders/TxsDecoder.sol#L315) -src/core/libraries/decoders/TxsDecoder.sol#L359-L361 +src/core/libraries/decoders/TxsDecoder.sol#L314-L316 - [ ] ID-6 -Dubious typecast in [MessagesDecoder.read1(bytes,uint256)](src/core/libraries/decoders/MessagesDecoder.sol#L158-L160): - bytes => bytes1 casting occurs in [uint256(uint8(bytes1(_data)))](src/core/libraries/decoders/MessagesDecoder.sol#L159) - -src/core/libraries/decoders/MessagesDecoder.sol#L158-L160 - - - - [ ] ID-7 Dubious typecast in [Outbox.sendL1Messages(bytes32[])](src/core/messagebridge/Outbox.sol#L38-L46): uint256 => uint32 casting occurs in [version = uint32(REGISTRY.getVersionFor(msg.sender))](src/core/messagebridge/Outbox.sol#L40) src/core/messagebridge/Outbox.sol#L38-L46 - - [ ] ID-8 + - [ ] ID-7 Dubious typecast in [Inbox.sendL2Message(DataStructures.L2Actor,uint32,bytes32,bytes32)](src/core/messagebridge/Inbox.sol#L45-L91): uint256 => uint64 casting occurs in [fee = uint64(msg.value)](src/core/messagebridge/Inbox.sol#L64) uint256 => uint32 casting occurs in [entries.insert(key,fee,uint32(_recipient.version),_deadline,_errIncompatibleEntryArguments)](src/core/messagebridge/Inbox.sol#L76) @@ -85,53 +78,58 @@ Dubious typecast in [Inbox.sendL2Message(DataStructures.L2Actor,uint32,bytes32,b src/core/messagebridge/Inbox.sol#L45-L91 - - [ ] ID-9 -Dubious typecast in [TxsDecoder.read1(bytes,uint256)](src/core/libraries/decoders/TxsDecoder.sol#L349-L351): - bytes => bytes1 casting occurs in [uint256(uint8(bytes1(slice(_data,_offset,1))))](src/core/libraries/decoders/TxsDecoder.sol#L350) + - [ ] ID-8 +Dubious typecast in [TxsDecoder.read4(bytes,uint256)](src/core/libraries/decoders/TxsDecoder.sol#L324-L326): + bytes => bytes4 casting occurs in [uint256(uint32(bytes4(slice(_data,_offset,4))))](src/core/libraries/decoders/TxsDecoder.sol#L325) -src/core/libraries/decoders/TxsDecoder.sol#L349-L351 +src/core/libraries/decoders/TxsDecoder.sol#L324-L326 - - [ ] ID-10 -Dubious typecast in [MessagesDecoder.read4(bytes,uint256)](src/core/libraries/decoders/MessagesDecoder.sol#L168-L170): - bytes => bytes4 casting occurs in [uint256(uint32(bytes4(_data)))](src/core/libraries/decoders/MessagesDecoder.sol#L169) + - [ ] ID-9 +Dubious typecast in [MessagesDecoder.read4(bytes,uint256)](src/core/libraries/decoders/MessagesDecoder.sol#L160-L162): + bytes => bytes4 casting occurs in [uint256(uint32(bytes4(_data)))](src/core/libraries/decoders/MessagesDecoder.sol#L161) -src/core/libraries/decoders/MessagesDecoder.sol#L168-L170 +src/core/libraries/decoders/MessagesDecoder.sol#L160-L162 - - [ ] ID-11 + - [ ] ID-10 Dubious typecast in [Inbox.batchConsume(bytes32[],address)](src/core/messagebridge/Inbox.sol#L122-L143): uint256 => uint32 casting occurs in [expectedVersion = uint32(REGISTRY.getVersionFor(msg.sender))](src/core/messagebridge/Inbox.sol#L128) src/core/messagebridge/Inbox.sol#L122-L143 + - [ ] ID-11 +Dubious typecast in [HeaderLib.decode(bytes)](src/core/libraries/HeaderLib.sol#L143-L184): + bytes => bytes32 casting occurs in [header.lastArchive = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L151-L153) + bytes => bytes4 casting occurs in [header.lastArchive = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L151-L153) + bytes => bytes32 casting occurs in [header.contentCommitment.txTreeHeight = uint256(bytes32(_header))](src/core/libraries/HeaderLib.sol#L156) + bytes => bytes32 casting occurs in [header.contentCommitment.txsEffectsHash = bytes32(_header)](src/core/libraries/HeaderLib.sol#L157) + bytes => bytes32 casting occurs in [header.contentCommitment.inHash = bytes32(_header)](src/core/libraries/HeaderLib.sol#L158) + bytes => bytes32 casting occurs in [header.contentCommitment.outHash = bytes32(_header)](src/core/libraries/HeaderLib.sol#L159) + bytes => bytes32 casting occurs in [header.stateReference.l1ToL2MessageTree = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L162-L164) + bytes => bytes4 casting occurs in [header.stateReference.l1ToL2MessageTree = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L162-L164) + bytes => bytes32 casting occurs in [header.stateReference.partialStateReference.noteHashTree = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L165-L167) + bytes => bytes4 casting occurs in [header.stateReference.partialStateReference.noteHashTree = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L165-L167) + bytes => bytes32 casting occurs in [header.stateReference.partialStateReference.nullifierTree = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L168-L170) + bytes => bytes4 casting occurs in [header.stateReference.partialStateReference.nullifierTree = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L168-L170) + bytes => bytes32 casting occurs in [header.stateReference.partialStateReference.publicDataTree = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L171-L173) + bytes => bytes4 casting occurs in [header.stateReference.partialStateReference.publicDataTree = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L171-L173) + bytes => bytes32 casting occurs in [header.globalVariables.chainId = uint256(bytes32(_header))](src/core/libraries/HeaderLib.sol#L176) + bytes => bytes32 casting occurs in [header.globalVariables.version = uint256(bytes32(_header))](src/core/libraries/HeaderLib.sol#L177) + bytes => bytes32 casting occurs in [header.globalVariables.blockNumber = uint256(bytes32(_header))](src/core/libraries/HeaderLib.sol#L178) + bytes => bytes32 casting occurs in [header.globalVariables.timestamp = uint256(bytes32(_header))](src/core/libraries/HeaderLib.sol#L179) + bytes => bytes20 casting occurs in [header.globalVariables.coinbase = address(bytes20(_header))](src/core/libraries/HeaderLib.sol#L180) + bytes => bytes32 casting occurs in [header.globalVariables.feeRecipient = bytes32(_header)](src/core/libraries/HeaderLib.sol#L181) + +src/core/libraries/HeaderLib.sol#L143-L184 + + - [ ] ID-12 -Dubious typecast in [HeaderLib.decode(bytes)](src/core/libraries/HeaderLib.sol#L145-L189): - bytes => bytes32 casting occurs in [header.lastArchive = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L153-L155) - bytes => bytes4 casting occurs in [header.lastArchive = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L153-L155) - bytes => bytes32 casting occurs in [header.contentCommitment.txTreeHeight = uint256(bytes32(_header))](src/core/libraries/HeaderLib.sol#L158) - bytes => bytes32 casting occurs in [header.contentCommitment.txsEffectsHash = bytes32(_header)](src/core/libraries/HeaderLib.sol#L159) - bytes => bytes32 casting occurs in [header.contentCommitment.inHash = bytes32(_header)](src/core/libraries/HeaderLib.sol#L160) - bytes => bytes32 casting occurs in [header.contentCommitment.outHash = bytes32(_header)](src/core/libraries/HeaderLib.sol#L161) - bytes => bytes32 casting occurs in [header.stateReference.l1ToL2MessageTree = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L164-L166) - bytes => bytes4 casting occurs in [header.stateReference.l1ToL2MessageTree = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L164-L166) - bytes => bytes32 casting occurs in [header.stateReference.partialStateReference.noteHashTree = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L167-L169) - bytes => bytes4 casting occurs in [header.stateReference.partialStateReference.noteHashTree = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L167-L169) - bytes => bytes32 casting occurs in [header.stateReference.partialStateReference.nullifierTree = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L170-L172) - bytes => bytes4 casting occurs in [header.stateReference.partialStateReference.nullifierTree = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L170-L172) - bytes => bytes32 casting occurs in [header.stateReference.partialStateReference.contractTree = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L173-L175) - bytes => bytes4 casting occurs in [header.stateReference.partialStateReference.contractTree = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L173-L175) - bytes => bytes32 casting occurs in [header.stateReference.partialStateReference.publicDataTree = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L176-L178) - bytes => bytes4 casting occurs in [header.stateReference.partialStateReference.publicDataTree = AppendOnlyTreeSnapshot(bytes32(_header),uint32(bytes4(_header)))](src/core/libraries/HeaderLib.sol#L176-L178) - bytes => bytes32 casting occurs in [header.globalVariables.chainId = uint256(bytes32(_header))](src/core/libraries/HeaderLib.sol#L181) - bytes => bytes32 casting occurs in [header.globalVariables.version = uint256(bytes32(_header))](src/core/libraries/HeaderLib.sol#L182) - bytes => bytes32 casting occurs in [header.globalVariables.blockNumber = uint256(bytes32(_header))](src/core/libraries/HeaderLib.sol#L183) - bytes => bytes32 casting occurs in [header.globalVariables.timestamp = uint256(bytes32(_header))](src/core/libraries/HeaderLib.sol#L184) - bytes => bytes20 casting occurs in [header.globalVariables.coinbase = address(bytes20(_header))](src/core/libraries/HeaderLib.sol#L185) - bytes => bytes32 casting occurs in [header.globalVariables.feeRecipient = bytes32(_header)](src/core/libraries/HeaderLib.sol#L186) - -src/core/libraries/HeaderLib.sol#L145-L189 +Dubious typecast in [MessagesDecoder.read1(bytes,uint256)](src/core/libraries/decoders/MessagesDecoder.sol#L150-L152): + bytes => bytes1 casting occurs in [uint256(uint8(bytes1(_data)))](src/core/libraries/decoders/MessagesDecoder.sol#L151) + +src/core/libraries/decoders/MessagesDecoder.sol#L150-L152 ## missing-zero-check @@ -181,11 +179,11 @@ src/core/messagebridge/Inbox.sol#L122-L143 - [ ] ID-17 -[HeaderLib.validate(HeaderLib.Header,uint256,uint256,bytes32)](src/core/libraries/HeaderLib.sol#L108-L138) uses timestamp for comparisons +[HeaderLib.validate(HeaderLib.Header,uint256,uint256,bytes32)](src/core/libraries/HeaderLib.sol#L106-L136) uses timestamp for comparisons Dangerous comparisons: - - [_header.globalVariables.timestamp > block.timestamp](src/core/libraries/HeaderLib.sol#L122) + - [_header.globalVariables.timestamp > block.timestamp](src/core/libraries/HeaderLib.sol#L120) -src/core/libraries/HeaderLib.sol#L108-L138 +src/core/libraries/HeaderLib.sol#L106-L136 - [ ] ID-18 @@ -256,18 +254,18 @@ src/core/messagebridge/NewInbox.sol#L25-L128 Impact: Informational Confidence: High - [ ] ID-26 -[MessagesDecoder.decode(bytes)](src/core/libraries/decoders/MessagesDecoder.sol#L60-L150) uses assembly +[MessagesDecoder.decode(bytes)](src/core/libraries/decoders/MessagesDecoder.sol#L60-L142) uses assembly - [INLINE ASM](src/core/libraries/decoders/MessagesDecoder.sol#L79-L81) - [INLINE ASM](src/core/libraries/decoders/MessagesDecoder.sol#L112-L118) -src/core/libraries/decoders/MessagesDecoder.sol#L60-L150 +src/core/libraries/decoders/MessagesDecoder.sol#L60-L142 - [ ] ID-27 -[TxsDecoder.computeRoot(bytes32[])](src/core/libraries/decoders/TxsDecoder.sol#L291-L310) uses assembly - - [INLINE ASM](src/core/libraries/decoders/TxsDecoder.sol#L298-L300) +[TxsDecoder.computeRoot(bytes32[])](src/core/libraries/decoders/TxsDecoder.sol#L256-L275) uses assembly + - [INLINE ASM](src/core/libraries/decoders/TxsDecoder.sol#L263-L265) -src/core/libraries/decoders/TxsDecoder.sol#L291-L310 +src/core/libraries/decoders/TxsDecoder.sol#L256-L275 ## dead-code @@ -323,9 +321,9 @@ src/core/messagebridge/Inbox.sol#L148-L153 Impact: Informational Confidence: Medium - [ ] ID-35 -Variable [Constants.LOGS_HASHES_NUM_BYTES_PER_BASE_ROLLUP](src/core/libraries/ConstantsGen.sol#L129) is too similar to [Constants.NOTE_HASHES_NUM_BYTES_PER_BASE_ROLLUP](src/core/libraries/ConstantsGen.sol#L122) +Variable [Constants.LOGS_HASHES_NUM_BYTES_PER_BASE_ROLLUP](src/core/libraries/ConstantsGen.sol#L128) is too similar to [Constants.NOTE_HASHES_NUM_BYTES_PER_BASE_ROLLUP](src/core/libraries/ConstantsGen.sol#L121) -src/core/libraries/ConstantsGen.sol#L129 +src/core/libraries/ConstantsGen.sol#L128 - [ ] ID-36 diff --git a/l1-contracts/src/core/libraries/ConstantsGen.sol b/l1-contracts/src/core/libraries/ConstantsGen.sol index 6b6bbac2583..c50bd7a4085 100644 --- a/l1-contracts/src/core/libraries/ConstantsGen.sol +++ b/l1-contracts/src/core/libraries/ConstantsGen.sol @@ -80,11 +80,16 @@ library Constants { uint256 internal constant MAX_PACKED_PUBLIC_BYTECODE_SIZE_IN_FIELDS = 9000; uint256 internal constant MAX_PACKED_BYTECODE_SIZE_PER_PRIVATE_FUNCTION_IN_FIELDS = 500; uint256 internal constant MAX_PACKED_BYTECODE_SIZE_PER_UNCONSTRAINED_FUNCTION_IN_FIELDS = 500; - uint256 internal constant REGISTERER_CONTRACT_CLASS_REGISTERED_MAGIC_VALUE = 0x6999d1e02b08a447a463563453cb36919c9dd7150336fc7c4d2b52f8; - uint256 internal constant REGISTERER_PRIVATE_FUNCTION_BROADCASTED_MAGIC_VALUE = 0x1b70e95fde0b70adc30496b90a327af6a5e383e028e7a43211a07bcd; - uint256 internal constant REGISTERER_UNCONSTRAINED_FUNCTION_BROADCASTED_MAGIC_VALUE = 0xe7af816635466f128568edb04c9fa024f6c87fb9010fdbffa68b3d99; - uint256 internal constant DEPLOYER_CONTRACT_INSTANCE_DEPLOYED_MAGIC_VALUE = 0x85864497636cf755ae7bde03f267ce01a520981c21c3682aaf82a631; - uint256 internal constant DEPLOYER_CONTRACT_ADDRESS = 0x0747a20ed0c86035e44ea5606f30de459f40b55c5e82012640aa554546af9044; + uint256 internal constant REGISTERER_CONTRACT_CLASS_REGISTERED_MAGIC_VALUE = + 0x6999d1e02b08a447a463563453cb36919c9dd7150336fc7c4d2b52f8; + uint256 internal constant REGISTERER_PRIVATE_FUNCTION_BROADCASTED_MAGIC_VALUE = + 0x1b70e95fde0b70adc30496b90a327af6a5e383e028e7a43211a07bcd; + uint256 internal constant REGISTERER_UNCONSTRAINED_FUNCTION_BROADCASTED_MAGIC_VALUE = + 0xe7af816635466f128568edb04c9fa024f6c87fb9010fdbffa68b3d99; + uint256 internal constant DEPLOYER_CONTRACT_INSTANCE_DEPLOYED_MAGIC_VALUE = + 0x85864497636cf755ae7bde03f267ce01a520981c21c3682aaf82a631; + uint256 internal constant DEPLOYER_CONTRACT_ADDRESS = + 0x0747a20ed0c86035e44ea5606f30de459f40b55c5e82012640aa554546af9044; uint256 internal constant L1_TO_L2_MESSAGE_ORACLE_CALL_LENGTH = 17; uint256 internal constant MAX_NOTE_FIELDS_LENGTH = 20; uint256 internal constant GET_NOTE_ORACLE_RETURN_LENGTH = 23; diff --git a/l1-contracts/src/core/libraries/HeaderLib.sol b/l1-contracts/src/core/libraries/HeaderLib.sol index 8da581904fd..9123f0e262b 100644 --- a/l1-contracts/src/core/libraries/HeaderLib.sol +++ b/l1-contracts/src/core/libraries/HeaderLib.sol @@ -37,19 +37,17 @@ import {Hash} from "./Hash.sol"; * | 0x00e8 | 0x04 | noteHashTree.nextAvailableLeafIndex * | 0x00ec | 0x20 | nullifierTree.root * | 0x010c | 0x04 | nullifierTree.nextAvailableLeafIndex - * | 0x0110 | 0x20 | contractTree.root - * | 0x0130 | 0x04 | contractTree.nextAvailableLeafIndex - * | 0x0134 | 0x20 | publicDataTree.root - * | 0x0154 | 0x04 | publicDataTree.nextAvailableLeafIndex + * | 0x0110 | 0x20 | publicDataTree.root + * | 0x0130 | 0x04 | publicDataTree.nextAvailableLeafIndex * | | | } * | | | } * | | | GlobalVariables { - * | 0x0158 | 0x20 | chainId - * | 0x0178 | 0x20 | version - * | 0x0198 | 0x20 | blockNumber - * | 0x01b8 | 0x20 | timestamp - * | 0x01d8 | 0x14 | coinbase - * | 0x01ec | 0x20 | feeRecipient + * | 0x0134 | 0x20 | chainId + * | 0x0154 | 0x20 | version + * | 0x0174 | 0x20 | blockNumber + * | 0x0194 | 0x20 | timestamp + * | 0x01b4 | 0x14 | coinbase + * | 0x01c8 | 0x20 | feeRecipient * | | | } * | | | } * | --- | --- | --- @@ -96,7 +94,7 @@ library HeaderLib { GlobalVariables globalVariables; } - uint256 private constant HEADER_LENGTH = 0x20c; // Header byte length + uint256 private constant HEADER_LENGTH = 0x1e8; // Header byte length /** * @notice Validates the header @@ -170,20 +168,17 @@ library HeaderLib { header.stateReference.partialStateReference.nullifierTree = AppendOnlyTreeSnapshot( bytes32(_header[0x00ec:0x010c]), uint32(bytes4(_header[0x010c:0x0110])) ); - header.stateReference.partialStateReference.contractTree = AppendOnlyTreeSnapshot( - bytes32(_header[0x0110:0x0130]), uint32(bytes4(_header[0x0130:0x0134])) - ); header.stateReference.partialStateReference.publicDataTree = AppendOnlyTreeSnapshot( - bytes32(_header[0x0134:0x0154]), uint32(bytes4(_header[0x0154:0x0158])) + bytes32(_header[0x0110:0x0130]), uint32(bytes4(_header[0x0130:0x0134])) ); // Reading GlobalVariables - header.globalVariables.chainId = uint256(bytes32(_header[0x0158:0x0178])); - header.globalVariables.version = uint256(bytes32(_header[0x0178:0x0198])); - header.globalVariables.blockNumber = uint256(bytes32(_header[0x0198:0x01b8])); - header.globalVariables.timestamp = uint256(bytes32(_header[0x01b8:0x01d8])); - header.globalVariables.coinbase = address(bytes20(_header[0x01d8:0x01ec])); - header.globalVariables.feeRecipient = bytes32(_header[0x01ec:HEADER_LENGTH]); + header.globalVariables.chainId = uint256(bytes32(_header[0x0134:0x0154])); + header.globalVariables.version = uint256(bytes32(_header[0x0154:0x0174])); + header.globalVariables.blockNumber = uint256(bytes32(_header[0x0174:0x0194])); + header.globalVariables.timestamp = uint256(bytes32(_header[0x0194:0x01b4])); + header.globalVariables.coinbase = address(bytes20(_header[0x01b4:0x01c8])); + header.globalVariables.feeRecipient = bytes32(_header[0x01c8:HEADER_LENGTH]); return header; } diff --git a/l1-contracts/src/core/libraries/decoders/MessagesDecoder.sol b/l1-contracts/src/core/libraries/decoders/MessagesDecoder.sol index 0749f008e2c..a6252e176f0 100644 --- a/l1-contracts/src/core/libraries/decoders/MessagesDecoder.sol +++ b/l1-contracts/src/core/libraries/decoders/MessagesDecoder.sol @@ -18,6 +18,9 @@ import {Hash} from "../Hash.sol"; * ------------------- * L2 Body Data Specification * ------------------- + * ------------------- + * L2 Body Data Specification + * ------------------- * | byte start | num bytes | name * | --- | --- | --- * | 0x0 | 0x4 | len(newL1ToL2Msgs) (denoted a) @@ -32,13 +35,10 @@ import {Hash} from "../Hash.sol"; * | tx0Start + 0x1 + b * 0x20 + 0x1 + c * 0x20 + 0x1 | d * 0x20 | newL2ToL1Msgs * | tx0Start + 0x1 + b * 0x20 + 0x1 + c * 0x20 + 0x1 + d * 0x20 | 0x1 | len(newPublicDataWrites) (denoted e) * | tx0Start + 0x1 + b * 0x20 + 0x1 + c * 0x20 + 0x1 + d * 0x20 + 0x01 | e * 0x40 | newPublicDataWrites - * | tx0Start + 0x1 + b * 0x20 + 0x1 + c * 0x20 + 0x1 + d * 0x20 + 0x01 + e * 0x40 | 0x1 | len(contracts) (denoted f) - * | tx0Start + 0x1 + b * 0x20 + 0x1 + c * 0x20 + 0x1 + d * 0x20 + 0x01 + e * 0x40 + 0x1 | f * 0x20 | newContracts - * | tx0Start + 0x1 + b * 0x20 + 0x1 + c * 0x20 + 0x1 + d * 0x20 + 0x01 + e * 0x40 + 0x1 + f * 0x20 | f * 0x34 | newContractsData - * | tx0Start + 0x1 + b * 0x20 + 0x1 + c * 0x20 + 0x1 + d * 0x20 + 0x01 + e * 0x40 + 0x1 + f * 0x20 + f * 0x34 | 0x04 | byteLen(newEncryptedLogs) (denoted g) - * | tx0Start + 0x1 + b * 0x20 + 0x1 + c * 0x20 + 0x1 + d * 0x20 + 0x01 + e * 0x40 + 0x1 + f * 0x20 + f * 0x34 + 0x4 | g | newEncryptedLogs - * | tx0Start + 0x1 + b * 0x20 + 0x1 + c * 0x20 + 0x1 + d * 0x20 + 0x01 + e * 0x40 + 0x1 + f * 0x20 + f * 0x34 + 0x4 + g | 0x04 | byteLen(newUnencryptedLogs) (denoted h) - * | tx0Start + 0x1 + b * 0x20 + 0x1 + c * 0x20 + 0x1 + d * 0x20 + 0x01 + e * 0x40 + 0x1 + f * 0x20 + f * 0x34 + 0x4 + g + 0x4 | h | newUnencryptedLogs + * | tx0Start + 0x1 + b * 0x20 + 0x1 + c * 0x20 + 0x1 + d * 0x20 + 0x01 + e * 0x40 | 0x04 | byteLen(newEncryptedLogs) (denoted f) + * | tx0Start + 0x1 + b * 0x20 + 0x1 + c * 0x20 + 0x1 + d * 0x20 + 0x01 + e * 0x40 + 0x4 | f | newEncryptedLogs + * | tx0Start + 0x1 + b * 0x20 + 0x1 + c * 0x20 + 0x1 + d * 0x20 + 0x01 + e * 0x40 + 0x4 + f | 0x04 | byteLen(newUnencryptedLogs) (denoted g) + * | tx0Start + 0x1 + b * 0x20 + 0x1 + c * 0x20 + 0x1 + d * 0x20 + 0x01 + e * 0x40 + 0x4 + f + 0x4 | g | newUnencryptedLogs * | | | }, * | | | TxEffect 1 { * | | | ... @@ -126,14 +126,6 @@ library MessagesDecoder { offset += 0x1; offset += count * 0x40; // each public data write is 0x40 bytes long - // Contracts - count = read1(_body, offset); - offset += 0x1; - offset += count * 0x20; // each contract leaf is 0x20 bytes long - - // Contract data - offset += count * 0x34; // each contract data is 0x34 bytes long - // Encrypted logs uint256 length = read4(_body, offset); offset += 0x4 + length; diff --git a/l1-contracts/src/core/libraries/decoders/TxsDecoder.sol b/l1-contracts/src/core/libraries/decoders/TxsDecoder.sol index 442b6a41005..95ad430f138 100644 --- a/l1-contracts/src/core/libraries/decoders/TxsDecoder.sol +++ b/l1-contracts/src/core/libraries/decoders/TxsDecoder.sol @@ -14,7 +14,7 @@ import {Hash} from "../Hash.sol"; * @dev Assumes the input trees to be padded. * * ------------------- - * You can use https://gist.github.com/LHerskind/724a7e362c97e8ac2902c6b961d36830 to generate the below outline. + * You can use scripts/l2_block_data_specification_comment.py to generate the below outline. * ------------------- * L2 Body Data Specification * ------------------- @@ -32,13 +32,10 @@ import {Hash} from "../Hash.sol"; * | tx0Start + 0x1 + b * 0x20 + 0x1 + c * 0x20 + 0x1 | d * 0x20 | newL2ToL1Msgs * | tx0Start + 0x1 + b * 0x20 + 0x1 + c * 0x20 + 0x1 + d * 0x20 | 0x1 | len(newPublicDataWrites) (denoted e) * | tx0Start + 0x1 + b * 0x20 + 0x1 + c * 0x20 + 0x1 + d * 0x20 + 0x01 | e * 0x40 | newPublicDataWrites - * | tx0Start + 0x1 + b * 0x20 + 0x1 + c * 0x20 + 0x1 + d * 0x20 + 0x01 + e * 0x40 | 0x1 | len(contracts) (denoted f) - * | tx0Start + 0x1 + b * 0x20 + 0x1 + c * 0x20 + 0x1 + d * 0x20 + 0x01 + e * 0x40 + 0x1 | f * 0x20 | newContracts - * | tx0Start + 0x1 + b * 0x20 + 0x1 + c * 0x20 + 0x1 + d * 0x20 + 0x01 + e * 0x40 + 0x1 + f * 0x20 | f * 0x34 | newContractsData - * | tx0Start + 0x1 + b * 0x20 + 0x1 + c * 0x20 + 0x1 + d * 0x20 + 0x01 + e * 0x40 + 0x1 + f * 0x20 + f * 0x34 | 0x04 | byteLen(newEncryptedLogs) (denoted g) - * | tx0Start + 0x1 + b * 0x20 + 0x1 + c * 0x20 + 0x1 + d * 0x20 + 0x01 + e * 0x40 + 0x1 + f * 0x20 + f * 0x34 + 0x4 | g | newEncryptedLogs - * | tx0Start + 0x1 + b * 0x20 + 0x1 + c * 0x20 + 0x1 + d * 0x20 + 0x01 + e * 0x40 + 0x1 + f * 0x20 + f * 0x34 + 0x4 + g | 0x04 | byteLen(newUnencryptedLogs) (denoted h) - * | tx0Start + 0x1 + b * 0x20 + 0x1 + c * 0x20 + 0x1 + d * 0x20 + 0x01 + e * 0x40 + 0x1 + f * 0x20 + f * 0x34 + 0x4 + g + 0x4 | h | newUnencryptedLogs + * | tx0Start + 0x1 + b * 0x20 + 0x1 + c * 0x20 + 0x1 + d * 0x20 + 0x01 + e * 0x40 | 0x04 | byteLen(newEncryptedLogs) (denoted f) + * | tx0Start + 0x1 + b * 0x20 + 0x1 + c * 0x20 + 0x1 + d * 0x20 + 0x01 + e * 0x40 + 0x4 | f | newEncryptedLogs + * | tx0Start + 0x1 + b * 0x20 + 0x1 + c * 0x20 + 0x1 + d * 0x20 + 0x01 + e * 0x40 + 0x4 + f | 0x04 | byteLen(newUnencryptedLogs) (denoted g) + * | tx0Start + 0x1 + b * 0x20 + 0x1 + c * 0x20 + 0x1 + d * 0x20 + 0x01 + e * 0x40 + 0x4 + f + 0x4 | g | newUnencryptedLogs * | | | }, * | | | TxEffect 1 { * | | | ... @@ -54,8 +51,6 @@ library TxsDecoder { uint256 nullifier; uint256 l2ToL1Msgs; uint256 publicData; - uint256 contracts; - uint256 contractData; } struct Counts { @@ -63,8 +58,6 @@ library TxsDecoder { uint256 nullifier; uint256 l2ToL1Msgs; uint256 publicData; - uint256 contracts; - uint256 contractData; } // Note: Used in `computeConsumables` to get around stack too deep errors. @@ -145,27 +138,6 @@ library TxsDecoder { offsets.publicData = offset; offset += count * 0x40; // each public data write is 0x40 bytes long - // Contracts - count = read1(_body, offset); - offset += 0x1; - counts.contracts = count; - offsets.contracts = offset; - offset += count * 0x20; // each contract leaf is 0x20 bytes long - - // Contract data - counts.contractData = count; // count is the same as contracts - offsets.contractData = offset; - offset += count * 0x34; // each contract data is 0x34 bytes long - - bytes memory contractData = new bytes(Constants.CONTRACT_DATA_NUM_BYTES_PER_BASE_ROLLUP); - if (counts.contracts == 1) { - contractData = bytes.concat( - slice(_body, offsets.contractData, 0x20), // newContractDataKernel.aztecAddress - bytes12(0), // We pad the ethAddress to 32 bytes, we don't use sliceAndPad here because we want to prefix - slice(_body, offsets.contractData + 0x20, 0x14) // newContractDataKernel.ethAddress - ); - } - /** * Compute encrypted and unencrypted logs hashes corresponding to the current leaf. * Note: will advance offsets by the number of bytes processed. @@ -199,15 +171,8 @@ library TxsDecoder { offsets.publicData, counts.publicData * 0x40, Constants.PUBLIC_DATA_WRITES_NUM_BYTES_PER_BASE_ROLLUP - ), - sliceAndPad( - _body, - offsets.contracts, - counts.contracts * 0x20, - Constants.CONTRACTS_NUM_BYTES_PER_BASE_ROLLUP ) ), - contractData, bytes.concat(vars.encryptedLogsHash, vars.unencryptedLogsHash) ); diff --git a/l1-contracts/test/fixtures/empty_block_0.json b/l1-contracts/test/fixtures/empty_block_0.json index ed0b3f5bdd6..6112dafd791 100644 --- a/l1-contracts/test/fixtures/empty_block_0.json +++ b/l1-contracts/test/fixtures/empty_block_0.json @@ -35,27 +35,27 @@ ] }, "block": { - "archive": "0x1bb1134e3fda61b56e838d68034e7c1e3a8da99d2321533b579eb1ae7588cd51", - "body": "0x0000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "txsEffectsHash": "0xdeb8be229731acd5c13f8dbdbfc60fdc8f7865f480d77f84c763d625aefbd6b1", + "archive": "0x0d4cd37d38039b4184c4b1bb3c7ac5175ea704b5921c79b14c162d1d44fa1718", + "body": "0x00000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "txsEffectsHash": "0x9139297703640b243028d35c29ae8c0667886c4edc8db5f879c260d2051bb8a9", "decodedHeader": { "contentCommitment": { "inHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "outHash": "0xc78009fdf07fc56a11f122370658a353aaa542ed63e44c4bc15ff4cd105ab33c", "txTreeHeight": 2, - "txsEffectsHash": "0xdeb8be229731acd5c13f8dbdbfc60fdc8f7865f480d77f84c763d625aefbd6b1" + "txsEffectsHash": "0x9139297703640b243028d35c29ae8c0667886c4edc8db5f879c260d2051bb8a9" }, "globalVariables": { "blockNumber": 1, "chainId": 31337, "timestamp": 0, "version": 1, - "coinbase": "0x56a54c9ad4f77919e45f9b9a18cf55468a60ebe5", - "feeRecipient": "0x02db69f955a50583c56b7405d887a720030cefc20293682c3eba3574e4c77846" + "coinbase": "0xa25fcdbc69bb83c7e6184cb7a93d35841760637d", + "feeRecipient": "0x013a8e44ae7bee1dad2d8c88bddca98035b3fe32796a14d581f4280b3c6b5720" }, "lastArchive": { "nextAvailableLeafIndex": 1, - "root": "0x0f045bd8180c4de901e18a10e9393ae42d9ef7928fe6b68568cb48b91d1355a7" + "root": "0x012a86560737adb075e12af8253fb09abf17aa841fb56d180bc89f0d2d473c7f" }, "stateReference": { "l1ToL2MessageTree": { @@ -63,10 +63,6 @@ "root": "0x1864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f80" }, "partialStateReference": { - "contractTree": { - "nextAvailableLeafIndex": 4, - "root": "0x1864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f80" - }, "noteHashTree": { "nextAvailableLeafIndex": 256, "root": "0x16642d9ccd8346c403aa4c3fa451178b22534a27035cdaa6ec34ae53b29c50cb" @@ -82,8 +78,8 @@ } } }, - "header": "0x0f045bd8180c4de901e18a10e9393ae42d9ef7928fe6b68568cb48b91d1355a7000000010000000000000000000000000000000000000000000000000000000000000002deb8be229731acd5c13f8dbdbfc60fdc8f7865f480d77f84c763d625aefbd6b10000000000000000000000000000000000000000000000000000000000000000c78009fdf07fc56a11f122370658a353aaa542ed63e44c4bc15ff4cd105ab33c1864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f800000001016642d9ccd8346c403aa4c3fa451178b22534a27035cdaa6ec34ae53b29c50cb000001000bcfa3e9f1a8922ee92c6dc964d6595907c1804a86753774322b468f69d4f278000001801864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f80000000040572c8db882674dd026b8877fbba1b700a4407da3ae9ce5fa43215a28163362b000000c00000000000000000000000000000000000000000000000000000000000007a6900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000056a54c9ad4f77919e45f9b9a18cf55468a60ebe502db69f955a50583c56b7405d887a720030cefc20293682c3eba3574e4c77846", + "header": "0x012a86560737adb075e12af8253fb09abf17aa841fb56d180bc89f0d2d473c7f0000000100000000000000000000000000000000000000000000000000000000000000029139297703640b243028d35c29ae8c0667886c4edc8db5f879c260d2051bb8a90000000000000000000000000000000000000000000000000000000000000000c78009fdf07fc56a11f122370658a353aaa542ed63e44c4bc15ff4cd105ab33c1864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f800000001016642d9ccd8346c403aa4c3fa451178b22534a27035cdaa6ec34ae53b29c50cb000001000bcfa3e9f1a8922ee92c6dc964d6595907c1804a86753774322b468f69d4f278000001800572c8db882674dd026b8877fbba1b700a4407da3ae9ce5fa43215a28163362b000000c00000000000000000000000000000000000000000000000000000000000007a69000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000a25fcdbc69bb83c7e6184cb7a93d35841760637d013a8e44ae7bee1dad2d8c88bddca98035b3fe32796a14d581f4280b3c6b5720", "l1ToL2MessagesHash": "0x076a27c79e5ace2a3d47f9dd2e83e4ff6ea8872b3c2218f66c92b89b55f36560", - "publicInputsHash": "0x0115bc353d66365ef2b850d1f9487476c969eda2b6bbeff9e747ab58189010c6" + "publicInputsHash": "0x1fb9d50c8c46ba7fb9e4827d38e389e90f85f83ce81fd2f27b129f01de3c7607" } } \ No newline at end of file diff --git a/l1-contracts/test/fixtures/empty_block_1.json b/l1-contracts/test/fixtures/empty_block_1.json index ffd4c00e0ee..8b6a29ecce8 100644 --- a/l1-contracts/test/fixtures/empty_block_1.json +++ b/l1-contracts/test/fixtures/empty_block_1.json @@ -35,27 +35,27 @@ ] }, "block": { - "archive": "0x16c6e97221a803dec7490cf710172aab5438818de67450a58d111d9f0184a48e", - "body": "0x0000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "txsEffectsHash": "0xdeb8be229731acd5c13f8dbdbfc60fdc8f7865f480d77f84c763d625aefbd6b1", + "archive": "0x0c67e240abf1f98b3e8624dd39f29a3f1df77d688680ba96c770fbe170f3b3c8", + "body": "0x00000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "txsEffectsHash": "0x9139297703640b243028d35c29ae8c0667886c4edc8db5f879c260d2051bb8a9", "decodedHeader": { "contentCommitment": { "inHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "outHash": "0xc78009fdf07fc56a11f122370658a353aaa542ed63e44c4bc15ff4cd105ab33c", "txTreeHeight": 2, - "txsEffectsHash": "0xdeb8be229731acd5c13f8dbdbfc60fdc8f7865f480d77f84c763d625aefbd6b1" + "txsEffectsHash": "0x9139297703640b243028d35c29ae8c0667886c4edc8db5f879c260d2051bb8a9" }, "globalVariables": { "blockNumber": 2, "chainId": 31337, - "timestamp": 1709734014, + "timestamp": 1709933340, "version": 1, - "coinbase": "0x56a54c9ad4f77919e45f9b9a18cf55468a60ebe5", - "feeRecipient": "0x02db69f955a50583c56b7405d887a720030cefc20293682c3eba3574e4c77846" + "coinbase": "0xa25fcdbc69bb83c7e6184cb7a93d35841760637d", + "feeRecipient": "0x013a8e44ae7bee1dad2d8c88bddca98035b3fe32796a14d581f4280b3c6b5720" }, "lastArchive": { "nextAvailableLeafIndex": 2, - "root": "0x1bb1134e3fda61b56e838d68034e7c1e3a8da99d2321533b579eb1ae7588cd51" + "root": "0x0d4cd37d38039b4184c4b1bb3c7ac5175ea704b5921c79b14c162d1d44fa1718" }, "stateReference": { "l1ToL2MessageTree": { @@ -63,10 +63,6 @@ "root": "0x1864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f80" }, "partialStateReference": { - "contractTree": { - "nextAvailableLeafIndex": 8, - "root": "0x1864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f80" - }, "noteHashTree": { "nextAvailableLeafIndex": 512, "root": "0x16642d9ccd8346c403aa4c3fa451178b22534a27035cdaa6ec34ae53b29c50cb" @@ -82,8 +78,8 @@ } } }, - "header": "0x1bb1134e3fda61b56e838d68034e7c1e3a8da99d2321533b579eb1ae7588cd51000000020000000000000000000000000000000000000000000000000000000000000002deb8be229731acd5c13f8dbdbfc60fdc8f7865f480d77f84c763d625aefbd6b10000000000000000000000000000000000000000000000000000000000000000c78009fdf07fc56a11f122370658a353aaa542ed63e44c4bc15ff4cd105ab33c1864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f800000002016642d9ccd8346c403aa4c3fa451178b22534a27035cdaa6ec34ae53b29c50cb000002000bcfa3e9f1a8922ee92c6dc964d6595907c1804a86753774322b468f69d4f278000002801864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f80000000080572c8db882674dd026b8877fbba1b700a4407da3ae9ce5fa43215a28163362b000001400000000000000000000000000000000000000000000000000000000000007a69000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000065e8787e56a54c9ad4f77919e45f9b9a18cf55468a60ebe502db69f955a50583c56b7405d887a720030cefc20293682c3eba3574e4c77846", + "header": "0x0d4cd37d38039b4184c4b1bb3c7ac5175ea704b5921c79b14c162d1d44fa17180000000200000000000000000000000000000000000000000000000000000000000000029139297703640b243028d35c29ae8c0667886c4edc8db5f879c260d2051bb8a90000000000000000000000000000000000000000000000000000000000000000c78009fdf07fc56a11f122370658a353aaa542ed63e44c4bc15ff4cd105ab33c1864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f800000002016642d9ccd8346c403aa4c3fa451178b22534a27035cdaa6ec34ae53b29c50cb000002000bcfa3e9f1a8922ee92c6dc964d6595907c1804a86753774322b468f69d4f278000002800572c8db882674dd026b8877fbba1b700a4407da3ae9ce5fa43215a28163362b000001400000000000000000000000000000000000000000000000000000000000007a69000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000065eb831ca25fcdbc69bb83c7e6184cb7a93d35841760637d013a8e44ae7bee1dad2d8c88bddca98035b3fe32796a14d581f4280b3c6b5720", "l1ToL2MessagesHash": "0x076a27c79e5ace2a3d47f9dd2e83e4ff6ea8872b3c2218f66c92b89b55f36560", - "publicInputsHash": "0x13156a7477a2a9495da438dcf5f43c02f171111e62a94bd1e88a3c46f2895cc4" + "publicInputsHash": "0x162f1283e9286bd320ece105c07c15059c55f8da5da77b8892e0b2e328c39e8e" } } \ No newline at end of file diff --git a/l1-contracts/test/fixtures/mixed_block_0.json b/l1-contracts/test/fixtures/mixed_block_0.json index 47bab763463..63328a25a61 100644 --- a/l1-contracts/test/fixtures/mixed_block_0.json +++ b/l1-contracts/test/fixtures/mixed_block_0.json @@ -52,27 +52,27 @@ ] }, "block": { - "archive": "0x136a8f7d7909e8b294472fef24dc3a6187259aa5005e2e0c32bfd1f49b80b5c8", - "body": "0x00000010151de48ca3efbae39f180fe00b8f472ec9f25be10b4f283a87c6d7839353703914c2ea9dedf77698d4afe23bc663263eed0bf9aa3a8b17d9b74812f185610f9e1570cc6641699e3ae87fa258d80a6d853f7b8ccb211dc244d017e2ca6530f8a12806c860af67e9cd50000378411b8c4c4db172ceb2daa862b259b689ccbdc1e005f140c7c95624c8006774279a01ec1ea88617999e4fe6997b6576c4e1c7395a22048b96b586596bd740d0402e15f5577f7ceb5496b65aafc6d89d7c3b34924b0c3f2d50d16279970d682cada30bfa6b29bc0bac0ee2389f6a0444853eccaa932b2a60561da46a58569d71044a84c639e7f88429826e5622581536eb906d9cdd25a2c0a76f7da6924e10751c755227d2535f4ad258b984e78f9f452a853c52300e212d8e2069e4254d81af07744bcbb81121a38f0e2dbed69a523d3fbf85b75c287ca6f33aadbac2e4f058e05924c140d7895a6ed167caf804b710d2ae3ba62b1b51297b3ea37637af6bd56cf33425d95cc5c96e9c2ee3077322fbec86a0c7f32c15d2a888c6cc122e99478c92470a1311635142d82ad7ae67410beeef4ae31f0902ba2fb964922a4610bb18901f7b923885c1d034da5769a48203ae6f0206a92855e2c01ddb3d6553386b5580d681b8230fa4062948668f834f23e0636eaff70aaa64519aafdf4b040bd2f9836e76b9dc13cfec8065dcdf2834d786e06260d100000004380000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000014100000000000000000000000000000000000000000000000000000000000001420000000000000000000000000000000000000000000000000000000000000143000000000000000000000000000000000000000000000000000000000000014400000000000000000000000000000000000000000000000000000000000001450000000000000000000000000000000000000000000000000000000000000146000000000000000000000000000000000000000000000000000000000000014700000000000000000000000000000000000000000000000000000000000001480000000000000000000000000000000000000000000000000000000000000149000000000000000000000000000000000000000000000000000000000000014a000000000000000000000000000000000000000000000000000000000000014b000000000000000000000000000000000000000000000000000000000000014c000000000000000000000000000000000000000000000000000000000000014d000000000000000000000000000000000000000000000000000000000000014e000000000000000000000000000000000000000000000000000000000000014f0000000000000000000000000000000000000000000000000000000000000150000000000000000000000000000000000000000000000000000000000000015100000000000000000000000000000000000000000000000000000000000001520000000000000000000000000000000000000000000000000000000000000153000000000000000000000000000000000000000000000000000000000000015400000000000000000000000000000000000000000000000000000000000001550000000000000000000000000000000000000000000000000000000000000156000000000000000000000000000000000000000000000000000000000000015700000000000000000000000000000000000000000000000000000000000001580000000000000000000000000000000000000000000000000000000000000159000000000000000000000000000000000000000000000000000000000000015a000000000000000000000000000000000000000000000000000000000000015b000000000000000000000000000000000000000000000000000000000000015c000000000000000000000000000000000000000000000000000000000000015d000000000000000000000000000000000000000000000000000000000000015e000000000000000000000000000000000000000000000000000000000000015f0000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000016100000000000000000000000000000000000000000000000000000000000001620000000000000000000000000000000000000000000000000000000000000163000000000000000000000000000000000000000000000000000000000000016400000000000000000000000000000000000000000000000000000000000001650000000000000000000000000000000000000000000000000000000000000166000000000000000000000000000000000000000000000000000000000000016700000000000000000000000000000000000000000000000000000000000001680000000000000000000000000000000000000000000000000000000000000169000000000000000000000000000000000000000000000000000000000000016a000000000000000000000000000000000000000000000000000000000000016b000000000000000000000000000000000000000000000000000000000000016c000000000000000000000000000000000000000000000000000000000000016d000000000000000000000000000000000000000000000000000000000000016e000000000000000000000000000000000000000000000000000000000000016f00000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000171000000000000000000000000000000000000000000000000000000000000017200000000000000000000000000000000000000000000000000000000000001730000000000000000000000000000000000000000000000000000000000000174000000000000000000000000000000000000000000000000000000000000017500000000000000000000000000000000000000000000000000000000000001760000000000000000000000000000000000000000000000000000000000000177370000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000024100000000000000000000000000000000000000000000000000000000000002420000000000000000000000000000000000000000000000000000000000000243000000000000000000000000000000000000000000000000000000000000024400000000000000000000000000000000000000000000000000000000000002450000000000000000000000000000000000000000000000000000000000000246000000000000000000000000000000000000000000000000000000000000024700000000000000000000000000000000000000000000000000000000000002480000000000000000000000000000000000000000000000000000000000000249000000000000000000000000000000000000000000000000000000000000024a000000000000000000000000000000000000000000000000000000000000024b000000000000000000000000000000000000000000000000000000000000024c000000000000000000000000000000000000000000000000000000000000024d000000000000000000000000000000000000000000000000000000000000024e000000000000000000000000000000000000000000000000000000000000024f0000000000000000000000000000000000000000000000000000000000000250000000000000000000000000000000000000000000000000000000000000025100000000000000000000000000000000000000000000000000000000000002520000000000000000000000000000000000000000000000000000000000000253000000000000000000000000000000000000000000000000000000000000025400000000000000000000000000000000000000000000000000000000000002550000000000000000000000000000000000000000000000000000000000000256000000000000000000000000000000000000000000000000000000000000025700000000000000000000000000000000000000000000000000000000000002580000000000000000000000000000000000000000000000000000000000000259000000000000000000000000000000000000000000000000000000000000025a000000000000000000000000000000000000000000000000000000000000025b000000000000000000000000000000000000000000000000000000000000025c000000000000000000000000000000000000000000000000000000000000025d000000000000000000000000000000000000000000000000000000000000025e000000000000000000000000000000000000000000000000000000000000025f0000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000026100000000000000000000000000000000000000000000000000000000000002620000000000000000000000000000000000000000000000000000000000000263000000000000000000000000000000000000000000000000000000000000026400000000000000000000000000000000000000000000000000000000000002650000000000000000000000000000000000000000000000000000000000000266000000000000000000000000000000000000000000000000000000000000026700000000000000000000000000000000000000000000000000000000000002680000000000000000000000000000000000000000000000000000000000000269000000000000000000000000000000000000000000000000000000000000026a000000000000000000000000000000000000000000000000000000000000026b000000000000000000000000000000000000000000000000000000000000026c000000000000000000000000000000000000000000000000000000000000026d000000000000000000000000000000000000000000000000000000000000026e000000000000000000000000000000000000000000000000000000000000026f00000000000000000000000000000000000000000000000000000000000002700000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000027200000000000000000000000000000000000000000000000000000000000002730000000000000000000000000000000000000000000000000000000000000274000000000000000000000000000000000000000000000000000000000000027500000000000000000000000000000000000000000000000000000000000002760200000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000341100000000000000000000000000000000000000000000000000000000000000540000000000000000000000000000000000000000000000000000000000000054a0000000000000000000000000000000000000000000000000000000000000541000000000000000000000000000000000000000000000000000000000000054b0000000000000000000000000000000000000000000000000000000000000542000000000000000000000000000000000000000000000000000000000000054c0000000000000000000000000000000000000000000000000000000000000543000000000000000000000000000000000000000000000000000000000000054d0000000000000000000000000000000000000000000000000000000000000544000000000000000000000000000000000000000000000000000000000000054e0000000000000000000000000000000000000000000000000000000000000545000000000000000000000000000000000000000000000000000000000000054f00000000000000000000000000000000000000000000000000000000000005460000000000000000000000000000000000000000000000000000000000000550000000000000000000000000000000000000000000000000000000000000054700000000000000000000000000000000000000000000000000000000000005510000000000000000000000000000000000000000000000000000000000000548000000000000000000000000000000000000000000000000000000000000055200000000000000000000000000000000000000000000000000000000000005490000000000000000000000000000000000000000000000000000000000000553000000000000000000000000000000000000000000000000000000000000054a0000000000000000000000000000000000000000000000000000000000000554000000000000000000000000000000000000000000000000000000000000054b0000000000000000000000000000000000000000000000000000000000000555000000000000000000000000000000000000000000000000000000000000054c0000000000000000000000000000000000000000000000000000000000000556000000000000000000000000000000000000000000000000000000000000054d0000000000000000000000000000000000000000000000000000000000000557000000000000000000000000000000000000000000000000000000000000054e0000000000000000000000000000000000000000000000000000000000000558000000000000000000000000000000000000000000000000000000000000054f0000000000000000000000000000000000000000000000000000000000000559011dedfc544c4f1e5f047e5ac2e76a30e407c87cb473bac191649e7f8e1576396200000000000000000000000000000000000000000000000000000000000010400000000000000000000000000000000000001041000011000000021c000000b01d3997dee1edbb7ef7c403f226e122d3d7bb8389be806c58ce0c654c049723707b68b2724538d7f1f7f6ada6e299ea0f83011e3b7b9b06539ee5b999fa332bf5d61b8ee778e565bb06196f27671150e91124bd403b1296f3fd2a74d04c4b1e9eeaaf715cabd221675127060cc62ff21b13be783f59e1898174ccafd0dea8af65ce95b2d9c406c023524d7bdf3931e3cd0cd47139b2decf80410d1a099cd92016e04c75da8674953cdc135badf63b441a000000b0260359f16ab52308e7faa499bd9e01d765ded9f2622ca0df660f5ccb58c4fcc1174435db2fff62885a0f941371f015a6d03da08367f074c6a31f875bd0a57cdf99afb308bb3e8891249fa7d838f7bc27b457efec42bd31b3f1627152869f8af1cfbd48b32bdc8f7d8960d7bb24a124fc25bb0f5acac9df6d45710874016d83a25d22f4c334f062ca45eb699901ad175d2a210dc2a46bb2ae40cdd0aeeceeb9a7bd3dd68e7db26150dbe6921e2f43c156000000b021b1c08aca8bf1e1d6b1f2fd7df97576515f97837379f5dce70161b16f555d403908420de0f9836afaf79691d21d318d1ae577ce362eaa6382fb117c927e3b278f5d429723734c38ef6939555747bcfb94838a1da206ba9a8aa4622139550791c1c91ff8365a26d8dfe3653c2ea31b211dd6042939757e1c1390f94fcf615bd3d1cf49d0afb2d3713d1f3a01f25d2fb6214a3309a27ee15f97cce516fec5d806e1f83a0f49103c045e0862cd1fc8ef570000021c000000b0216bc82309c419ceb58924457e8d7a297aca024b5e37d97cc3cbcc62707b0cdaebcd0a5b5ecbe22b066f1f5bdfe36f0b03be577d28a0227486a0cad6597570c99f12eb0232b098076096f699dc03ef93c1cfb66f245c617364cf570644ab2d291cc74001ba8471c4e9af016d55eba1fe0260cf3de99a5d5ff7e09a31a71eb6cae645240ff497169c9652fbb87193f0c41cc48e915dd93a0887ebb0b75c33dfca5e2de2bb5d67ba745492e865c39287dc000000b01a379a7ef4e1cb541186767b819353e6b090a6f90cd19ceeffbde433c6e5d9c043e02860a9c3837fb78d083175fb30df5857b645a82320cf97aedd92af6d96e1563937235211afda07b4d97e054762dda2f750e3714ce773250e968bc00d6053eed1c5fc963bcb4f577c9a283d3fd8b22276207b12cf61b15f8b5b00ff37bf82129bb65405af19031252e942587c2cf526eea148639833ac35fdadb83ad2d3779d8cd7002919b6873f6ab37361d80ba5000000b02e2e7bef01839fac64c0cc34b3dfa0faccf3f882efe3858d26c556001e86762576f15120e8e1b48b1aee5d3870c2fa40ead7d0ace6aa1d3764f2e90ee7fa6ea5b37369819ba9baa187c022f37b104a3b4d7c4ce3e5c03f6144249042cbaaf9df4177c07340eff481ffb94d328c787bf70ca27f21f88fa21f4f70172d020d9072f84d3c9f06f9cf9f071e7610e598a95f2af27875cb0ed25ec027ac6ea72eb0367fdee5b6447f5ec633b81d605e9567c90000021c000000b0014e8c6e9dba2b685121f150a0c6a496d5abbdf8c4eb7b33725bd3d5bd0b809e08d77ab57c2dd8a823e840c7aebe07d84b8880f8efed5ee7de8fbcd4cc3bbbaa2623caf66612be45ebb748b44d5211fd3195f21a2a662e9050ae21080643ecfcaf592f150ebe1150716e49e500c39a3b0a4191ae426edd10fd2961cfa765d518ac59b520ec3a887b0fe4abf369118ea82671726af89c896caf8fb13b04b4d725b71d6e25ac099212229766bcb37fa56a000000b0188d99db5fc204c1a7ffa3b03d271aeb71d3e1bc0fc621e9db31ccbb35c73ed09a774388d34b67d755c00661e068e377fe0d1eacf41410bcad74ef12f71d4762cc66e4fdfb8b1a7e4c9c2e510a53bbdf11caa41f500f043cf27f2105d8be018ba5a6c410a73d8ebfdc20960f0b1fa1220af50a029a9b4db4f465ab798bb0b1371eda734288edb52178c065221d3b5bbd04c8c7f4c6d1305bf0826aa1a7664a8cb234c3082ebcb94a7cdd9123250b774f000000b00bdaa7593ffd8c29824be7af0e3b4e4e74230a4ab1e44d329d91666389b98a114b23dce55385948fa200bd9d0422483ada36e5a814b7dda6d410648f3d8cf5526ffd318731873b9c07f84c67b6680ba33195402b1fcee07e9a9bf3a3da6f39a85f471f937e8e5d8c43bf84e192f051be16b867bf93059085d68e235460c79b6d776da7f19ad4775e484977586eb5857207e32e9bb027808aac3fd60e8a2df42999149062d6659983dd0ecd70045914ac0000021c000000b0232157d86e289750306ddcdf622229fdd04fc365bc7a1521b7070714f731c15ee1932ef3aa6c8ca1b2f85428d2dde123dce2e69dbd6a33bb34139c52f6e2fef1419def0b14d6510034ee4425e73333e17f648e9f33818dd3252f38c9ce152b65f7fe6de3532e502846e22125db70b27b1aecdeea49276243f3787be5831400fce496e3cf0f8f77a05c386d3e9aaf4fa52bc5c36301d6bd848f2fe6dc03d70291ad4d2906fce4a2a7fc295c7c25137cda000000b00f9060c7379a9aefddf97d65685c86c7b2e298df1941dfc4016bf30f05387952fb1f138089fafe420410f21136ee98c618c9ad1049f35694b87d8616c92afb074d616404ca9b0454bf1b8685189035f5e57fc0c58603c5dbea2e8d30a6527d3f30e81c5a3f76605e37506e563f42aa781192de4a8e98f436a019fb2816920501ab8bd79d44f32a80b51d68f2015571291f753c8129ff9c06f6ec320f8f5230a4d2aad95ab31879cf9ae495c0ef1600f0000000b022c3315379ffcf05387502a5b2549d555ef3ad8a0f65a755aaf26ac4eb18d486f7e164ab358d516444360616a92c16791bd3d6cd020e5dbd8353cf66baaee9b7dd4a7aacdc39159cf9dab017139b54d7d78d452fc3976c11f6474531a32071aff59b12032aa1e600401cfdb637f8f7a92a1b4d9779eca2274dd4ed4e7c1f6e5244c1163431036534eac8967b2bb53a1822c2351bbd438783fb6b7ec31e8776599220520a8851e9e50e4c6a8a9f8993e70000021c000000b0149104a19aa10185cc36c579aedd401d9cd0e0af11842e7b1cfdda07660b8fcbee81b162ac597cb3eb604ab0630c07d5dac58530c4273fe77ecfbdcf85f39696044c447685a967743770c51727e678075e65f7922fbe2c7b43a9d4199529b93d82a45f3d9d4fd98eeab5c9c0009999453063a137b6a7212bf5aa28527719c569b2ea60e8f35780b3912e98f0b8198a7504830a88450c0b038296eed468fd369a7efab809475b52994042d5592864637d000000b02c4c0360c3922ae08dbe9d6a874c133ef63299885eaafaacec62b8f5f7f9a739f7bfe929de1bfb65dbf4f9b36bb0bd7600e6d19c51bf398b317751e22e5e9b575029c3d1bfc99d8603d47d7d925c978ad4e10355cb136b23c864621c0903697971b4d7884507c70eb716094c628b434400377f9accd28d77b2d4f1d7a19b2b7656423167da836b538e51fc588c6ebae705cb21e4aa465065be992995aef9e9383f7765d174fe91fe2d18af127ec8a3d1000000b02ddb1be8dd5daf54a9cd062d401bdcefde8be16079354781afb0ae2a2c4c65775e8d315c83df8cd9a2235ce606117d4be4b789388eae232b8e3beaae7a7b93e5e95cbff94915163671a0290350f9da16e6a0e29c7732f1004b1c3d8c758a3918962968b226fc8c032f250fb3bc3f958c1122336cace9326a1c285ed440bd6569f942ff8540f0af9f40e1f74b41c5de2b08732150fda5bafc68c1000f8aaa38551995288554c954c131194c5f772d0d730000021c000000b00d705cdbd0b66960836766f11621140358f3c8bdeaf41806f7f6259de5cefc3f3866f222a8af9192ab649ac84ed7d629212f439b6566a1e6e85445b5999586fc9226f2dd1535110e7b5a62e73793619860bac464ebbbd230ac6ded1a548963a4b980d8a444c78cf40a6d5fd0412204ed18ccb2ca36bb0aff493373bd45b9cb8956cdd82bcc1e43aa9aee301db33e38c425fe7843a0640e2eead36869566122930ca7ee094252c61553d6ab4a00c182d7000000b00483aa98b79de68424a07211856fdc69a4cc40944cecf9dd87ae532be5385ec5b8f02548a182ef0bd4fd477f15094756f1b7fbeddb4c268694c7e76bff5f4fcdce8ada77ebfbf1c22c77605473b00b7054ee400955ab92bedb06d04dd3a95f5f2ccbaa3e3b6fba47663ef1afbf4570c12da2a32339de6eaefbacc3083fe7bb91e93ad2c804d3502bfe88aa1b28733080115bdfc0d3647edd5f387e8c8a1b37b3209fb0476305e0333a200222b599d305000000b01bd4bb14c7ff12576b36220305ca4a8bfb55b888cf8b78c8818103bd98529d8250382378f2a1af979faae378dc553cd22fb45b59315467baba85cac9d76a107fee4c71a6c0c2f9e991d6d69128fb3336fe2a746c8943326e28930a1642d4aeb7b6d0f5fe211cac49952e9459b9f187b42f7a52d174d68181a43882e9c06e695fb5a621411ff2361d2127cd1a0f88ed1022fd91dbeda422db98e847eef3f7e0f621457c1b33a8bbaf349ab96ac88c483c0000021c000000b023c9053bc95ea43242fbd35d2d655035420e61f791bfb5c16d7a751e2e411c2092e791281f336ef9250cb4078ea80198858e208a8266826eb829853c8e59b39de1bc809e2402b2cd22481e8ff72c01465e746746554ee9873a328187fab4a8ac88d628dbe9e323a25d910a07f3f1fbe411d56f23bb4b74c2d8db9d395aedc72e8a4e3e904ba64006db5a9dd1dbddbe2e1bdf05725ead394621896834a75828817f20c291cbd8389587bafec6fb1d060d000000b006b92a03a448a93f3303d032a9492808d88870f3c3deb20b007da6cf99e0a46b521efb84faeaada34c04b2681dae64ff7b58ec9e5797bb59a321aedf3433e3b16e43a68d7dbdc24150f93f4aa13346024b527dbb762fd952c9d752939473416d0a8e0e69b0344dc845d8f68a88542495182fa8303f64196f6ba9f2eb54e30a49b9898b8b225bc7d997a6207d0488fd6d0d08b153aa0733d3969736f408806ad0e522348c4dbb623dda8011b19e85df44000000b01f4a6295f315c0383a6681159b7dc280624255a48ca4b45a1fe8bb782f88231165449badd698e03f8f2f06bffc410cc24b001aec56fa4a00670c97acaf57ab2e43831e2732efae984bfd5f0520f137d2d5c9507ebb0ce1bcedd1fb0b400867c371b16eb86861cbb4540692e57bb3a76d2dbfd9b60c2d1105d06ade453ee9a724bce9c5ee16bcfda66a95cb65ff2f8b191b40653baecbc5743f361510ed8c784754283bcd5544f1dd0747f11dccfbf3650000021c000000b00460e3e801b58afd8f125216a3da33ca8fbcb5c8507d8c56f8411bdccb46f136152d70c1a29a6a371f6c6b53eb4e83dd37167bbaaa61204eeac0306079901a2ab8f7a83d6d0751af8c40389800eadb0c57574eafecf388c3a0d47c1170e6cafd524b6394497934a19f3d6b65e1c30e280651bdc533b5880b71de971fc6ee1827483bd13c07f96cf6974bd587e9047aea1a93ccaff06277b44cf7a1add65554ecbede568a9677e403d2287ef025743997000000b016787709a80034c9dc0fb2f39f6234b047c52f3c160e640669fd90260b2eb2d2dea5524942937f032f21774a722bf17dec2484cff9eac716adb661e5b8d4198ce6e3b2b8203eedef4591f52d6d1642e49840dec7ff1a450f2f0fa5636b50ef8a84a1ec046537acea23e32d00143f4f062358bd51903021501573205a432d240fcf5cdc7df2da0377b27800348498d7b5047599ed8554e236c36f36a8b81868dee01ac54054831a25c28491b3a87284fd000000b02a2e52bafdffcfeca7bd1da085e893967e375793119394df95b6fa854a4f4236fd034355bdae04c4c9cc669ad5577fe9df8c1e6c14fab5f0a6d370b1c566be7c0c6e9b8cc1decb0cb90200217f8d922e2c68672676d34921fa713dc2803570139b25dffd2d6051a38c0f39b03a7da789201091033db872392c77b7385bdeec03247d638979a0459f1d9b4e3c9c108d4b189b006e11fb36707ca424c2d68b3c00aeba12b9cf5a85bbb705b72cf8a1bd9700000fa400000168000000b02d946b4e2bae3d0ef4007aedfde3fcf0405b8701d4a990d5ec700fc921052dda8319f59add5a35ea6b02bfa654dd65b83e79db2257c1f77c3d0b911fea04ebc10b2db3814aecd65cb91a5de5c022f730ac965dc2d5527a7a1bd3215b35a19419a776fb633f2d8b4fb5531c2249a4d37e18acd5c53516ec6ec43dd43ad7f6233f50b64968dfdfaa18bebd9c7a735fa4901590692d54ff6b2eb5a4c38d90c933dcf9a2c3358c290ad49859a4dfe1ab7ec7000000b029ccecd2419f7fbecbb95f812f44b1583c26e9390c896001b72e04270ce58bd419f40fa31048506295e7a8deeb13d357c14875677bf48bd59ea282b8a72a8ac0081d3aef56c47702f7c8548de02d704b543cc053675374535d6226fc4d995fcf31c01e025521f652368347b29ff4681324ac10216f60cc100217e5907d822edcf035dc242b4b4ea78f50e2c7a99765dd0f0acce997ca0c8480af38843e272ff670d2a070d862fbf9f4498414afb5abb500000168000000b02418964c5c942f2b374450a2ba919c7561f1cbfc07985473b8aaa144dfd277622a1377e6cfaf4b5b1c75ad606d16aa6dad813bb2d5d8adc5c9c43bf509a62a0e97eb6071623ac9eb5864a9ed6f88204bbb3c96a2c3eb4372676faaeeb595f961832e30477ac20d00f9ad7d9b92020ec313b3261b4b99781b8a1b28d77a03730d76931e54d7fe1edf5b140fb3ab57b107251888b8d7ded7705cba2f7966e5ca9fc158ea6713d0f569c663c0e787fdfe4a000000b01c3727083d0179f1e703cc844f9ec0b5ba486e8a66c7f2812ff61b95caae7888b2d58faf7b02c1f6619a1c37246f1bfdb6a45e19efb0353d159055d107bd35f1d1ca2f9dc29364e8061d8d7d5436b3b3780c3a7f9daad14468b6c3c8cf2a17d17a940cac5f2f06072093afda935f819f2518497f5e72b9a3a737d1ef81ec1624cd5c9040b28606b8fbdefe058ec10f37262e914474222771fb2eae95c8cc08263e88a3bfccc857ac24490950b9cdc0ae00000168000000b013551747eb0a06d3c7c509054b92789b00a9c398304fbfad5028696a9ac7a5c12675a74e42da650b2e6083bf79aa151d01f3ace34397603778e8bad2187b082de583be945d0f4f0a345bfc2fd6ab71898c78ab59b8152d691d6fade183415d3bc0b22aa03e2f1e9a31e6a0cc31c4d038020eb201a63d92e3aa5c5eaacedb2d26fd83d80a4138656813094fb8f2fdefdf1a2151c0c682eac499000bf30dc89899f9e8c4440e8e644486f8e757e2dec1eb000000b025124e0a7e741b07c7b50ccf541983bab609b525b4d6602b0e37040876fb588a217442e229df3c230a20cb2fac6c4ca60b5f00aa850bb73acb43abb73eff721d26609b896c5c96f2621d87f731b808bba9a89ded1187110e818f889bf939b7e770d47b2e026b28133f8e4e8f2cf82a3b27e270a4864e8003f0e06318ed0aa1c4e13f10d7c8abacbfa89165fc2bac2c8226573ac16967d1574061ade76bc2332db4d71dc70157c6ee1b36595ba5f42a5600000168000000b00909b65149b5c6dc7e4f37de9bfaa30856fd67966792b032a04b56815075c3cb82bc2de2af44e51a9aec53e8b9c1aefd26f921e740a362bcfe6c51b8bca3c7c79a5c7ef29e767743a03e3df6c7390bfeee6e9b6bdd5c651447b688e63c67edf95e4e28bec271b104073cb3ee0f48e30a24db70ed90f5ad7ef2892dcd71e2c366a87bc044730b25eceaf619b2fe713a090d0fb94e3483267357b22f70a2a084d940d287ae6189f40c1ad640979391c56a000000b00dba227e21fd0a04e80b29253e66aa198e50c1eea38075ec2f510442a3d514dad31590f4807aba77009fe4f92d6f4ef71f72c47f353ad5eed58437d37c6c17fd36df8053615f71cb2a19e32749fc9e70c6da58eefaa37251a0c412dcd948eb6e8b7779153f382163361440e8cc899a442d3c5e3767ff75fc6328305b2707af179bd549cc01f8ce959a436e77df4dace804d2b01dae4d63c25c5a3132ba6392fd9af984ac5b89025c744f540d657bb97b00000168000000b00a1c5328af9c347577966be4c14e9b9e5c6e589d32f25b428067cabf417df3767167d0ef1f51462f8b44227f49f82866e9fbb407b26f921f69b6732202925dedf204eaef4d4b6cd8c7c98259602fe92a789168b611e29708a19ca7c45af5a8de1b15aa30a52fdf919901ef212ec1f4a600463808cd1cd0431c43d261dd3d151103ae01e92c056d46c0b3563d19049d4c1aa160ff0184067c58329bce153ff91ef60e5baec643cf9e65117f97ff3f9721000000b01762a10c825d7cb9c2fdb8e5aa99fd96443ae6b3d41491b0f73b8fd17cbb8278b7960acf6db9fdc46ab6399a744c7ba0bc7bc83b51cec3da9f0ff13da242919d26e769c02ea6db5713389694946be608542452ebf9b8519f37e1b1cc9bde9bd3606b823541debc4c22ced82da312af2b2fb93c430f2eda0c6163aabf9ca716bd821f3d1dfccdb91f3ba1107b146b36781342374c1a618e1b7990a6d653c94824fd031f84ad47ae74099738f5acee673200000168000000b00083728a42461a163a0febba99fae3220b9434cf8bc835cb14c5581a5ee7219d9f831f2c61d207b8fe1c84b8d5258c66a45f1f7d366860f483973606f3606c467ec351c69cccd1aef5938fe81a9e2a88e9ac00994f00d3cbbd4839d7405cf0d002da0cfbe87cc8b7764ed89cc5d5093f19c353010e44935fb9c985d60f714d5231dca1521d790fdd3a724e949d6c5c6112723c602619f9d92928283213c6d11307c0670df46c004cccf01c402304b4a6000000b02b6cbd2dd0c6cc1e3888a7c63b8acd0b142ae0690c751a1a7fe99e76cc05171273565dffe2f3f17d27166630ddc94f9bdf1c7585e9d175d2ed0e3dccfe9c995c1dcc5bf33aeb17fa056b313c13a0efe9b7245f64d18baf5ab4e911224646acae7a4f037980371a5c9f385e710676643028009426f0a60a339e3eda0ea95442a69c138d9fc85797e58e8d0eb6a83c1c2e2c8421c6ba7e661d24a67bb28758d3e3d3db5f51a2a93e5cc0d3a2acc30476cc00000168000000b024cf23e0509894ff3f26874ca1ebad6ba645cd6ff738b3b5c25da45d0093c921e61d1709915d3762d5e3f79a54677bdf3b482372f3efb68084d5cedb62918ca38849adc2123ed07f83e0c9461b81f4712ecd81caf5e6650b85e37620eebe47ffedcdedd9c33970b5fc7bf8c28875d4492b46a9a0358f8414f316e54c243c3d50791ddc20f3a028ed5f7d848828ed6b372e9c0e30cf1504e589b66a7a59acb958350de918640e3b3ef58ca1be943348ce000000b01283f2db772cab926c5c2f0e3065d26e425cfb1d3167269bc087242188980f62c548466105d0f305f7316af310c2d08840c187b537b04eff447627f559ea164f19b5368cd75f7b5d7156bda8296320ad760838443a139585719396287a750faf64df8135e4191fbd40ec3639f46d561608587427ec7561a3693c822ccae7015879d4f740278d364b23398b872821ea9505182ae9b8cec485b7f9f2e4b7554707add275cd92f0e4c97611c70909a76ebd00000168000000b008168f9e17a71df21b009a479cc4ec7d725876fc1ff43d4e8876bac38b83319f1aac66317524390bef0be64e8d4c5f07fb61a640ae5674e79f27a582e30eecb1cc04e0a8efb1665f708a5d8dee86ebd281d5e3d951e997f9249dbd45393bee0ed890a2e4abe5ab8e78220e41f8f7c78a2d75181bbd109284a43e07bf37b0c1468e13b669177ca846f940d3cf2eb773bb04cc55379db92fe351ffab014ebba89b48ba85228fa0e115fa9b2258159bd6fe000000b01f8aa984e6cad2c76c94f857608de0f847e13cfbe6b807b39e6da24ab2ccb0fa191b91209dac1dbffe6c85ae78da7e4691e9c764cedf69005c79ef59deca26a4f35c0812aa9653a447e33c4a9c89a700ee3d0a145581236cb9b33eefc84902e927f39d58ba7bc0cf8cc47bf7d970ea7f0e411fa2bee5ee9b765fd0859065317652a01fc4b3d672fcf2c2b28b2587962926a8411ae2e776cf89310697b0f5fe52e9d775b8e52387ff85ee1c8ab1c34b7900000168000000b02782d9e3a062692c0dd1eb2975979cd8d321fd18168cb02281962a815047c94395b1e54096208061ce8c2796557fb1b0eb91da6518d6bf7f1477bc188605194b36f28d797ee933393e0ee75209586a4298d105b82b260895222842dfaa89f14a33bcb293c583dc39eee9a631fe84da80083b41159d539c921000505de0d2d51bc1d377f35102c560cd8fa5b9a896bf27094946232ca9de261ae964a305ce65211528e2666886fc9a1225f49b0254bb1e000000b017d62a6e89009cd0971abf632dbdc36ac008bcc1860c3f6a0e3998ef4a0ae39e17defd1030c2ec6f199e52e14e3e3ee0d0ab480ab6e9e2babbdc64196d712c78e35101e1efbc784ddad18e76da28790e76bf914118c4aaa4ed4ad7baf9a3fa39d6f8d50e0a9d1840f123de24e46699642fe4d34047765a55470a3fe1a4b5babd05c20087edade6dacc8a9cc372bd9a84191f3a56d04b5d06b176a5b8e5d6f6d418789fa7a736de967907e1942af4171b00000168000000b012fac7044863e8b0e47f27b31ba187c5d1f3c0a08166e5ff62dfadb575d7d27878732503d38be2ef539896bd75a358cec40dadc7b2ef38b1587bda7aa3170045e30f1f87552b5a8b6f7b0314f17dbbb9d73f005e862e3b1eff074ca1507a9bdabd40a98b8ecb51b8a06dbe23a3a7574a2651be7e7881111226833545cf7d8b94bc8ac16d8198d8cb0225a497dbe5278a1c3bfd0b783ee5e2bc249dc2c0d2c199849645bfac4786139a60e68678c92ded000000b013288a1cd8e013e13874f1bdbc88da037b582b0fac3ae6bdd95f844c735c901a0b5f68df0958e32212abcf49eddde58369838b348117ed55cf824e1735af573d9ee74b7a292e7dfc076c4c033e3f06b5c11a7f5cf71353abc7eacb2c5cd194bcaf1e172d629c62de575e3f37a54bbee711aa3ec5f8c3113bcb887613ddcbd0ebb0dd74e0cec904dea6902f06a40a4a831cb00efc721063e01eaea95a7f55d99c0f1b6c1a01b686ad49a264ba502bbec900000168000000b008043ad9e5afd1fc35b24bb875a13e186ee547437bd82c63a2becbebd38869c6174e4fe7f798bb3cf3057739993a8b027bc99b36b34f8583b9f80fd35fee876110d044c27adc942b18baa7ca602a03141529fc2a97e6bfef42894d38712a1f0a6ac79246fa3ede1a667fbb11bba7113b272590d2703a6505c1fd92f1670b463270cc1517eaca17783a00270e917023c71ddc67bb750012cb7ff5fc5610634532c2ef92d83078f915dc83089409a86b31000000b002811ef51db81fa0636ada3375f29b3669908703add2896cec35a052db6e7e806ae8661e888790f6a88f6cc93d316fffa48d4fc7572b07b637440d81315bf5fd911679dea7a1aae9f4ff2b36004ffb1013c494d1003fd882d957380c0f5509083fdcc3f4cd4501da86bcb8e7cb8bd61a01de700bfe099acc40a7886e174ba921b9c3d3a533ce584a274b3a7bc3b01369161860d5504c419098290641074cf870d11bc6485fcd2a6852769a6709d57dcd380000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000018100000000000000000000000000000000000000000000000000000000000001820000000000000000000000000000000000000000000000000000000000000183000000000000000000000000000000000000000000000000000000000000018400000000000000000000000000000000000000000000000000000000000001850000000000000000000000000000000000000000000000000000000000000186000000000000000000000000000000000000000000000000000000000000018700000000000000000000000000000000000000000000000000000000000001880000000000000000000000000000000000000000000000000000000000000189000000000000000000000000000000000000000000000000000000000000018a000000000000000000000000000000000000000000000000000000000000018b000000000000000000000000000000000000000000000000000000000000018c000000000000000000000000000000000000000000000000000000000000018d000000000000000000000000000000000000000000000000000000000000018e000000000000000000000000000000000000000000000000000000000000018f0000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000019100000000000000000000000000000000000000000000000000000000000001920000000000000000000000000000000000000000000000000000000000000193000000000000000000000000000000000000000000000000000000000000019400000000000000000000000000000000000000000000000000000000000001950000000000000000000000000000000000000000000000000000000000000196000000000000000000000000000000000000000000000000000000000000019700000000000000000000000000000000000000000000000000000000000001980000000000000000000000000000000000000000000000000000000000000199000000000000000000000000000000000000000000000000000000000000019a000000000000000000000000000000000000000000000000000000000000019b000000000000000000000000000000000000000000000000000000000000019c000000000000000000000000000000000000000000000000000000000000019d000000000000000000000000000000000000000000000000000000000000019e000000000000000000000000000000000000000000000000000000000000019f00000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001a100000000000000000000000000000000000000000000000000000000000001a200000000000000000000000000000000000000000000000000000000000001a300000000000000000000000000000000000000000000000000000000000001a400000000000000000000000000000000000000000000000000000000000001a500000000000000000000000000000000000000000000000000000000000001a600000000000000000000000000000000000000000000000000000000000001a700000000000000000000000000000000000000000000000000000000000001a800000000000000000000000000000000000000000000000000000000000001a900000000000000000000000000000000000000000000000000000000000001aa00000000000000000000000000000000000000000000000000000000000001ab00000000000000000000000000000000000000000000000000000000000001ac00000000000000000000000000000000000000000000000000000000000001ad00000000000000000000000000000000000000000000000000000000000001ae00000000000000000000000000000000000000000000000000000000000001af00000000000000000000000000000000000000000000000000000000000001b000000000000000000000000000000000000000000000000000000000000001b100000000000000000000000000000000000000000000000000000000000001b200000000000000000000000000000000000000000000000000000000000001b300000000000000000000000000000000000000000000000000000000000001b400000000000000000000000000000000000000000000000000000000000001b500000000000000000000000000000000000000000000000000000000000001b600000000000000000000000000000000000000000000000000000000000001b7370000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000028100000000000000000000000000000000000000000000000000000000000002820000000000000000000000000000000000000000000000000000000000000283000000000000000000000000000000000000000000000000000000000000028400000000000000000000000000000000000000000000000000000000000002850000000000000000000000000000000000000000000000000000000000000286000000000000000000000000000000000000000000000000000000000000028700000000000000000000000000000000000000000000000000000000000002880000000000000000000000000000000000000000000000000000000000000289000000000000000000000000000000000000000000000000000000000000028a000000000000000000000000000000000000000000000000000000000000028b000000000000000000000000000000000000000000000000000000000000028c000000000000000000000000000000000000000000000000000000000000028d000000000000000000000000000000000000000000000000000000000000028e000000000000000000000000000000000000000000000000000000000000028f0000000000000000000000000000000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000029100000000000000000000000000000000000000000000000000000000000002920000000000000000000000000000000000000000000000000000000000000293000000000000000000000000000000000000000000000000000000000000029400000000000000000000000000000000000000000000000000000000000002950000000000000000000000000000000000000000000000000000000000000296000000000000000000000000000000000000000000000000000000000000029700000000000000000000000000000000000000000000000000000000000002980000000000000000000000000000000000000000000000000000000000000299000000000000000000000000000000000000000000000000000000000000029a000000000000000000000000000000000000000000000000000000000000029b000000000000000000000000000000000000000000000000000000000000029c000000000000000000000000000000000000000000000000000000000000029d000000000000000000000000000000000000000000000000000000000000029e000000000000000000000000000000000000000000000000000000000000029f00000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002a100000000000000000000000000000000000000000000000000000000000002a200000000000000000000000000000000000000000000000000000000000002a300000000000000000000000000000000000000000000000000000000000002a400000000000000000000000000000000000000000000000000000000000002a500000000000000000000000000000000000000000000000000000000000002a600000000000000000000000000000000000000000000000000000000000002a700000000000000000000000000000000000000000000000000000000000002a800000000000000000000000000000000000000000000000000000000000002a900000000000000000000000000000000000000000000000000000000000002aa00000000000000000000000000000000000000000000000000000000000002ab00000000000000000000000000000000000000000000000000000000000002ac00000000000000000000000000000000000000000000000000000000000002ad00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002af00000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000002b100000000000000000000000000000000000000000000000000000000000002b200000000000000000000000000000000000000000000000000000000000002b300000000000000000000000000000000000000000000000000000000000002b400000000000000000000000000000000000000000000000000000000000002b500000000000000000000000000000000000000000000000000000000000002b60200000000000000000000000000000000000000000000000000000000000003800000000000000000000000000000000000000000000000000000000000000381100000000000000000000000000000000000000000000000000000000000000580000000000000000000000000000000000000000000000000000000000000058a0000000000000000000000000000000000000000000000000000000000000581000000000000000000000000000000000000000000000000000000000000058b0000000000000000000000000000000000000000000000000000000000000582000000000000000000000000000000000000000000000000000000000000058c0000000000000000000000000000000000000000000000000000000000000583000000000000000000000000000000000000000000000000000000000000058d0000000000000000000000000000000000000000000000000000000000000584000000000000000000000000000000000000000000000000000000000000058e0000000000000000000000000000000000000000000000000000000000000585000000000000000000000000000000000000000000000000000000000000058f00000000000000000000000000000000000000000000000000000000000005860000000000000000000000000000000000000000000000000000000000000590000000000000000000000000000000000000000000000000000000000000058700000000000000000000000000000000000000000000000000000000000005910000000000000000000000000000000000000000000000000000000000000588000000000000000000000000000000000000000000000000000000000000059200000000000000000000000000000000000000000000000000000000000005890000000000000000000000000000000000000000000000000000000000000593000000000000000000000000000000000000000000000000000000000000058a0000000000000000000000000000000000000000000000000000000000000594000000000000000000000000000000000000000000000000000000000000058b0000000000000000000000000000000000000000000000000000000000000595000000000000000000000000000000000000000000000000000000000000058c0000000000000000000000000000000000000000000000000000000000000596000000000000000000000000000000000000000000000000000000000000058d0000000000000000000000000000000000000000000000000000000000000597000000000000000000000000000000000000000000000000000000000000058e0000000000000000000000000000000000000000000000000000000000000598000000000000000000000000000000000000000000000000000000000000058f00000000000000000000000000000000000000000000000000000000000005990121646ddf88c49342087fdb65b3c93f6d9c0bde5d6a57cba4cfeb51de93860cc900000000000000000000000000000000000000000000000000000000000010800000000000000000000000000000000000001081000011000000021c000000b028af71e3cf39b6907d2c040e7edaf822812677748a2c67fa76efb2ab698fe3f2823fc7f53ac6e00999e105bf8f2c3ff4e147f4061884dad80d638cf38508ec765a5858b1f37d302e8bb87f29d97650d60a97500f1099b1b31e87787d9ce79dae74004b3bea953755228a81b396bc48b114cdd89c303ad6ba4a0578683df5eeb5980917d15a78f60b0ca90259acca9a510fe6b1a1b0b616e5b6daa0bb49df341af3c1624a66fc9f13a0f9bd067877074f000000b01590bd33b113f4c35912d16531e3e3795ea7d70ecbc9c1e141d421902565fa266dc3e6a250a7266dccb91536275394ea7e1885b28ea49865c18087f163820e48499aefab8ee869e77046db6559d0167b7fcbc9d1e98e728d1e50ec05dc7eb0bfee78b115e76c8d23c2f02b255ea535de23f1e8744a59bff8c4024653092421ea11065b1b3481fd1356d8844826631c0227fddce690c623ddddd6d2a5a4f43eea20a863a7878105cbabf70bf83dbf745c000000b01d90b229d7ee00cc66cc79a0d3eaf5fc10865c8589d5b6b5117b8e416a9afa7087e98137636994ff2b04c011656bff9f61c2a7e0410d5dbdf6fb052cb9198fd55b124c6faefb224577e7f639a7a2c79a5526d624948a52da1b8327cbf82f9b20121f7ffa20b2d3bab92e107997092afd27dd3dc8029857b46923cb955259726bfc52bff332115fcd1088de24415a8ed80d79cbf6e979fc68dbc563c8446c5b74db1e753630020bcd9c6646d979a402160000021c000000b013d723bb65b13a316680d9bcf15eae685ab616e0bc827a9c495a251defd1d132a36d92da8d014b48e8410dac23a5f9bae14cd6ec992e31a35bb79e34e1922b9e86944d60849e0f7fcffb320af9ee52e7248179c4c79f716ad938e5122a5c39d64e59ba6c38e0d96b4503a95f37140cdb179dc9c94a583494e5497e16a97af3bcfc7c58b04d6d086f7e7ac621c5135efa0cf68d6721626ca1edd2cf6c1b1a7c4198708499eeeb4ad1582ad5ef0affa04c000000b0293c20cb48f70b53cb37502055242da70317cc6eec626a4dcc78408f45288f622c88b3b7bc2619014d8451590037f12094c56a8d14ef6894ff7e48ac06a98a4d17e963e1d4835cca15cb3eff6522fd1c86e7f9add301efaa9ca8dcf62adf6cfe9cf8fdb654cc74fe2bf16fb2da89e10424b629725ea17c66cb040ef65cc226a0813a0a1c02d278ab268c6369ae6af5b21b1869b42f6afa0bd63f61d2535b7c41bfd2726edd5d32762223066192997ce4000000b007f01c1ac5bfff29528225ac1237f36b4e636c320cb23534644ec55dd5cac984a945084a4640bfd1000d970c9a3aa1c5777b8e138de0cb98f6d2ccab3a1b3ba8b455f4f18c9be682ea3b131f42bb797b0768bf018d8bc8d326cf5a40c08aa60f0011926d6be03141cd8b3af79c0bca0117c0361d01d5cea076c8f9c207d3be407e346b7575034c087cb289e9ce1cc1220e070127b77f6fb818461bff10d911235ef61b9d6ded44185fab1a8e038cc2330000021c000000b021467a59920dff95a1220c135cd30e45f4d5449db558b205d95c14cfdc2c7ed910aefd73e3bc57281a099ea5f4c5f399aefeb2421c7259a0f333db7de19fda6c2b4b9fe4269c5475dcb42083d8a9e12789f1b95ccd639220707ef84a6cdb1bf8a561d9bada5c72bedbde441cdea6370a1a7bb69f6ded55769bc912d9b9ce7eeba8f2dae87a71a35b07415855a34b43c80dd2eff43d880a10f809f2f38cea9c2d76440783b62674c5bab56c902212f427000000b0141ffb153cc8a5ce07a5656e6d5e84c4f925bf01e053c11433131d04b3a0627490c83316b5edf3f9a803a90710a8207530ac7327c297850558e66268e7095686da0ce22381dce9f9afeb9de9eeb931e1b30b9305df66919b70c5e484a1ba42f8d2bc10e0e6063d01f9600b519ee42079171964b264531d7c006e20b6bd2107b30ec797d251d93b7e3b722b857acb2af6113ab79f6dd087d44c3494d73d93187905c9ba498909e979315adb52e4537490000000b004c5b23dd37585063c4374bfddcf4724ffc64702ef216af8677cb2f7836fb9b7513b3a8a8495146fe58231e67dfa124e7bee22de16cac980aad13a28b98240895f13a689a9d3308f437ea593be962905f5d0d630ee08c0b37c2d5556121de4589ced2892ff145e4bc144d2167106fa4c0f9d090b938548490616f067a2f8681eee4c2b642dace80f9d1e37f45fb20ac60dab28514723c18ae7b0b2a5f5839c78e075443f177a2d6838f05ee202feca930000021c000000b01b7d5e6fde8aa63e2f971770a9f6a3410c8566e6b8a8093db748bb6bed7c914e80aca52cc936572242babebc0a4db3fd49450be0f953ad662a2781b6b8e8f534ebead19c7f147eb2f4f4f2253c9a783b3a7eef70fd05230a214c6f71105def66ade26144b1b06284a124639cb3b9aa81107c87820000afca291394ab630cdddec1935a8dd06b088697b6db527d1240dc0c7f6c14e4abb522dc72b5fb96f3f41a63883e48ff1e1b191128339f12be496e000000b00e5584ce46829013f30591db40b83c0c74f2661741f9775862b357b6641af8f73d6c28f2a133223f68b11b565aac8a40323024138e14e0c0ad1e9a62b7b0d9812e903470a4dec13e2f086a2eb37f8be013d22e5cb34d2177279df2dbfa841e4b10938e2b7de00832dad1deebb35367fc27accf94e799e75645746824eb55472231f768bb9251303d58f85c3ad93f53380d70b515a16c763ae87fb5c865dca56213da3c924a02d86238c652c51d6dd711000000b0242d5aa5c2301f646f26bce897ae95db1737360796a7b6238cd4fefc113ac2782331d4e0d90393c5ad030ee0040999cc3bdd7f8711309ea017cb24491b1f2a5bf8f2b91569708f9de6902e4eab5b97cfe52037051e00d77e5f39b379a8dda51a77af3c010a305b18fa6a589444ae47941134a90e753c5605d25ff5d999363d57196d2917ff23d7e601708d28a5d76899247c5fe4d8e6940998dd55656c7c169715a76dadea02b3a16667bda224eb445a0000021c000000b0111bce86732d12025a7b042817040283326206402ec03b1f7420b1a060da3a8cf42e62546d5e92781724c098ee8c43f28485d71504f3069b57ade358b63f8ea8677b324f2b5a3267859f9219e01def03bef5d1824fd9efb1c4a5c3be3a3e846df81e07a1925fe4b25524efaf0b247a290d5a622e4373b30a7e048a662383728699b2261f98561f1827a40806f731ad3e287ff3618c0916585361689dcb937fed96b64e8117cd78102d7a9770041cb9df000000b01fbc505c0c49aeda9899c1c3ca095600e9d668ad0621156494d69bdc3d37b8ede3c1f2fb358df02276c77d950064f469c1d28c7dddb9ca8a8f9da800c7b3494b621512aec38d625fc0e388089a515f3a1f7c77c784bf02bed456713da33862bc73ace72bf77014b10829366d72f5d5f72d9a1859526053fb89901823be02155e071f1a529439549c4438c64ef648418409642745a9353ac95d04a5de86f00d7fdc9876ed305fdf825e3e8fbd5db5a391000000b02320939a4b967710515c9878d09ad807e61bf260736a7af5d874465c9cb86192c818776390ced5b86e38721f8e69d67541c33f0e0804e7e3e1c3bc86423bce952d817e8c0af61ff7c9b2973866f1abdb59179a176c2ff6e4b481fa3ae8a4fd954ed46b9be4869c9cc397a4e99918c1c02b8ac1b9d3de72262d0ab87ee985b7477cd4246c842140fd832cea79a9e92e050b578f38ac13740b910956bddc15ae5b5a06b85f89ed450472018a3ecaf8179d0000021c000000b02767677f69d12c1b379686f3ca00ff76bbbdb73cd14169f8336046f0a8690fd67776465f5231b1b0fa2339b9d5eaec6dd1067fa65bc1addadc1624aea975b38dfcaf1d6bdb86a2863f767f2929d1091d17e0999b9855ae6646c2e460a2677c158c3211d63dbd43b552700bfaa70ca06423011b80ddbdb50bac729ade36bee44bc42cb8bd1e5acd190ed2b4368a7688a8043ce2e6b72f161ae77fa76ac6c4e1cb34888ff376eb8ba77c15d7920c3c3549000000b01d721a62dbb8b9671e920eb69af9675eac818c2c8066e2a25287fecfbd4f034c0740a78cd5bf6285c9f1e1c1da293eb1264c302c082c2b24ca87a261cc039329e1452edfb70184f26521dc31035a694c8e106ededfe55e33eb445cf88a52fbdfffa350b5a39f7d825394c79d5e719af7212e6e717260c7c86c0f9659af7c27649bc059d731014577bbaffcf434ad0a2a2ab1e69770165e0592c8f08e1796e8bd730dc7c35a97edcf6ed14cc394231235000000b0099f04e36e4f3f7b8c2928fe57e5a5050a029ea9b66326b30167dc533d9bbc54cbc2aef43aef01e58467cd4d3161b18e41e4dc1c5457f78385db64a3779e79818a8250ccd331e8c673cc61e6d08337a19a411e8265548054f30ecc8c2ed9fdb6ac39fd5c07dae7f8cfb94fa530c5c00c203abdf92de2e4eef5be94fcdd950ac0c0e0a5e26987e8c5e5566d81f7140db116fa0b90e2781cad2317d53e949095a1b05e9eb23cdf18dce60e70457190a3540000021c000000b00812eac67910abd48d458ae5ba6e72cb0fd8eb1bf18d5b52d06e88c6c9189b4f06c5fb43ea5461c78d4b6ef1f4e59b25531046757f58d88171c3a47f079b7f8ee7beb26d398cdbc3b07f9a3cb05dd5d99ae4721b382c95a7d710d2236c407873e7d2e28a388b68931b52b6434c37cfcb266c88d8cdb85659a598193d0f5a3d25084dfd95d07befd75b29ffe1031badf81831719f3f49d5dea2ef8763de8f3da22ad28013767808e842e660056c9407d1000000b00b8c389e50f6194f4935a93f1f69dd5c7621bf625f4b951afb8cb8f6ab346e670aa615a5ab63b33b4706ac106495f3a0f315837046f314da0875900866b15c8f5baf38e0b03ea8d8988468f1a6c2798ec14b8a2082f18b3a731b2f9aeaebe27204fbac7ab4db159bc69645ae5570cd762fe3a1d483479dc015afc8d7edbc93af9055a7c0940ee7c1c9fb877c00b66c1216fd2592549faae6d644d5547b5535d28be9892a8d94844a30c31ee6d802d8cb000000b02a5f747dd67a94972908353f284f63ccdeb9c5456a065f16267abed064f07b8c3386531b922ea63503c47267dd94f41b2e20db0e24ce29d824d0b197c463d2a1d8c012c946ca50d9732f38f97f35d6817a29a857f6f64703902bc64a05a57967f17f8804d0e3657f5347d8fc2c55762627e2524e4bcd4505d1e9fdfbd981fab793a53d6fee2ea3e35dac183bd6c135cb23b8a7d308c85a39d5778dee434fcf55607b8263e73630b9b49e61a1bfefccc40000021c000000b02236a683125b651761790f86824677291184078f9f78a58b8002bc26d9a5dfd7bebc01e6a46d8e2c295b844436a1412ccffa1c23d461f0ac6fcf8242efad0408b48d3507df34ec230bb575a253af27e29fba934644991488a9d0ef030caf0c2d66703a08347880ba61d74d7e549916b80ea1b4257035241c7ef4616cc5c71b2abb45478e2295284d4e9b1e821b01fe0d063973c93f9a44227815b2ce2ef49b8712b231b94b8d7b0d7993f6db43a3a910000000b0177232976d2132807889472788a18394e9de0275a706ad66ae9900b77b7d5a9797499a2ef3ee0d904c41675379a9356e0343cdb90ef60048089f2c6965a835df322b8bab15186eef17b208ee8e1781e3bbf1c012f6c748e4fe1ee7557613b329a1692040c81db1994ff6fd3981ec580d27bde001c7875a1d3f4df0b37d016827eaba50c183aab6b499f0946e3a4d13232f4bb4903b739b8f8ef6e1b428535006e5ef5227f005850dc2a4fcf7f23f76a4000000b00050a57758e773bed114d603f92db4ccd35811f756265e412f4b3867327b19d5efd179d51b22387976cf9244b3211657a5582a69c79d853e577ded1db37d6ecb34e83a8addee4c8ee1a66b38c766843e93b27c509e9e56316b4929fdfb59816bc171443b9b97a05653315ffc5b3a1a9106a1bda2f1c958efffe4c01c83c38fcfb095c8888181ec9577671d1adf35f7a42966014c2be242f0cbd54a01bbede9f5d4e988d53897341e2559ddde59f26db200000fa400000168000000b004012d1bdb68342a9c25ff708a2c24c8ad2ac5cf891292879b1fdaff81408c2188be968777575e96452fe58e784369b0c0ab4e0859b9f4ad3f04539122696a29c5295eb3b66dd9a565714f595a2e66281a4d70f05519347b6a446468f90e53e35206cb4658678b297fddc4262042929c1eabce3c5c480830477f78e081285cd9df6624430e897ff3644a98d99e62e3c40544ed37d456c0a1aab184457d564feb996f37d9736bb836f21dc40210ae937f000000b0001cfad969e044d24ba5b1e18e9df1bd2ca06be44faa9b85a89cc173f696506194450d4cba96300f1313ce3a39ce44cd0fb0444036afef9e7652c7ecee2961032b3f8dccb736a8ffef83374580620a421542763809c031428136c50b3520401ae329273f14dbed0aa6afa05f27e2600b03616f5508ebc44c16a4424d65ca33b5b537282e255a0aaa90d0587805f7ddff02a7609824a7f86a42f6b58e59f463a538eefb8fd848c0166422a2d4a0fd352e00000168000000b02bb6ec3e8c9a24332d09a72028ac7fe45df4f152eb0003c03a7bd9b152b3eb0c6afa5e65df98e6b95c1a0c09034ce77fb2b0542c1e5213a4f9e411fa0931f6cd15224fc7af4c276762e6f9cadeea5358df1c7c51d4c5a0d33bbfc57dd4b7dc06fc55a68535513e6d38cf6b0dfb3726f81282ed3942002680882d1451f52d155d010a9fb0cf8298c6f0341baa0c7d9d6d2960b7c81fa009011e8aab47134cb177c60493ba204c1027bad33119c2dc791c000000b006de0dd7f8e786a7c8d4150ba09eb0e9fdc4ffc99ddf6c9eeea52fd3c0c353ea20c6c18c479bed3de363d34de7080d6df23f894cd84c5c6d91e9f97e2495739a775e87dbb36aaad505f8543dfa475997cd321f382b00a465818df78a39a3f0d32bb25bf121de71252bcd8f98a8eaecf92761148cb09d71d60d6fd1961631d9f07953bafca71d6c97cadf0c3a3b8fb10026c0eb777180ded3be80f3a8a0cef59b21f00957ed38a78025c34dce1983404400000168000000b02940e2c09f05ee629616473451fc069c6631b906661d7d403787fc1a58060dc9162e186f20db214bd3bf2c1cd87226587363d7feb99ab4e2456c20f087a2c1b10feca95b6f0a999168150f36824b9b92907d4d62b9a4b9e21c68b6678bb9256241ca88b7e6ad51a9935cfbebde3c654211f54596bb42e0352e8cc1d453fe8ac25bb36401da77abaa85630528edd169e11aa2e1430a4ce48fffe0500900e873d4a8af1f20eb043a9abaea47b37d301390000000b02396d4625a310caa70d01f1bbf29d863825763da8d1f0c5774fc49f53df5b85f31a7d75fe0c9bb5b4b82a7c959bac5a804c609fb40a0088cf1b3092ba19fcdf579b1810aaff9f07a8ad0c9a79b5669bfc7e8a5bd2cb9f5de7dbe5618501f20309d97a5967027fcd460003f78c66674b40dbf7214e13aa330fe2bea3aedb358d99c75d98244700ee0056184e7845fe07203c93da515c088435252f715d228a4d2537c664ea8bf46d9ada1b3a1c5bdc7c700000168000000b00ff0841351483895e108492cffe28e6b2d8dfa8c4dd411ed8ec2648420ab1264aa59a8dbccd220999ef014e3b63fe69a386cbdc449317afe482e5cd116ae3dde050ffb4bfdc68412ea4f96f1ba6ecc757ce97a4a0457c1263f7e4ef412f01fd3ddd802511d38110b25faad8ce723311d126966b05cac14f654219e2c514cea74e5787a2cdb7426ad01f0f9bdbfe49234279bd837650abc6e5beba2ba0b1dddd33f6605baa3c7c9a753b96bfc6b95fedc000000b02cdb5619e17e313c26b1ae9c2fee30c583df4a29536c649de3911fbea3485cff3a895d4731510482b5fc94f3897cc80e421c9cc6270c5952d6588d26767a19c42696ffe4717ca89a4b0408754b47dc320d968301a205a1cbd639e24733bc9c3d86247649fad121a54c95a3552bb3cbd1302524ed3114dbfa5828c653103fbbf5c5f0cded3194f6c47ddfa5ba8063f6410d6c288203e7618069a528d55d09b9d6f60d01f5dfeb4e76747d9ab67829e1d800000168000000b00f16bdc7b3b4d0f491fddc88d3c35a6da1b73da7e1b93fe4f536e941cfb38fac227778909885d6b2fcda6c07b51593a4fd79c6fcd23f0a9a22418631248879415fdc49b57ec5d049a8b3cc529631c9461e93416dda8343ed46b79652e571e328b189b6bbcc8e597585ac308bbe5fcd1813a6baf8219bf9801903ad21ab14fb5fbcd9efd58940c5e2ae12e95df0aa18400a8ddb4c26b408ebe28d7aae4ad5a12e0576c0a0fd578ba4abf2a9c3ee885dec000000b01de650c0e6a2435e12c94ffcfe4ddeb14f16a75283e74f4439e7ef499334771324e68a8bbf0c1af727a459b6770bdec08ae76cb9b9d4283ac1986e64a493e8df9668fa9c9b58d7415f2996858c185721b0551457fcdc64599246daf7e56ff19c2b2a408897d99f13d164a3481439e0f31afc9608e73a27d2677039cc7abc1cc29a5768c0232011e4c46daaf01341881f2a309f2d150c52893b00503753a57ca6e7af9fa0f1cef680c24193cd0ab79efc00000168000000b001ea06cc58d688d938ece274eff2581edcf09e82e89d82bf5defbe4d28f796f76a18e78f900b4ce22cd5cf3900e1f14a53790573c0799e51725ba1f80427fd2b2b74b566431a68d5bc0f86d26dd10776dd60f3ecef987778a1a887ee57f8baa42bc2ecde2ccd9ad44268335f7d8e15bd0e135726c3e9cc4077e59daddddab9537ed750b84a5c6696a420904fdc22783628bed1f544d196f27374a067ba441162cd619dd8d88c47e5cbdd476f1b7fd63f000000b026811df3f9a0ec27b6161b4e75edc04c121c792d298ca9f2094d5e50fb01d68b173b9bc4068a34e098b25fd3de954199227ad2c52805b75c1c242ff5f3644be399fa21a532345a72329f4efcda351016f055047b7e82c9e803ac83981ca337dfe80c5f3f0a1d73e7fe8ce16f576db6070ec0340703b9c16e239bce7024cde8ab40e969f362e877560301ee9dd2e4f56117785f56414e4b93113d3e24d5630e7bc4e2be9acf70a124125fe5c30a9d99e600000168000000b0131eba5286d5b8f9e21fca8987192b742b2c164a75db3411dd0caa39a16fa4d45c352f33d5a1c89ae664e9d4c6658661c65e181301dd4a0ca88c93a507dc41740799514456c4201e3f28c8782f9f00fcf32c76e612ddbdf1f4dd1336c6653f4c396100223ee734312dfc18bf2c93a3010580092066699b4a2505c8881be5fef5e87ca98a90ef07b9559baf592937bc061b6e901162a602805f72b4a3a5e4d34d2e8d8a3e26b4c9a6e398d8ff746bb60d000000b00c7172f9aac16269cea7563ae94d883b18639c636a242fb57dc5f6afaf73edeb25eb6e0d5b93923cf296f5df2270cafeec8d1b59db99ea96763c7f0f73f8718f46e63e80284a0b0577de171fe45d28c6824807f5d2dbdc9a47c17b18db9d6899fd35f809fa183b4c8ab1ad2fcf83b83e0257a00c227131ef15fec26b9dbfd4200eb595e05768cd101131c6d7175b19081c419188e1a1ad1ce1181b6cb21e65a00247d14ab0716cf413b66955745fa63c00000168000000b006157e0e36d281ebdb8c38d7456a0351f27351bc25efec336c4538ac0d8858eaf8a51009fdeb100b43be5a487c8cff21414ccd5e514d3ee40fd63c0331c5ce336e86cb19d27ecbb0660b5663aafc27945786aa4a2d5d93b74d06baacb547b030bd4ad8babb559952e55f95ffd31cb6f01ec7be1d841ebb807e37d268bc7b3b69c55bca85847b01a4fe7f64b99a8270ce2216b3ddbdeaf67bbb3becf6f1e039e5fbf11aa9a4a7c1f5fc2f00c8d1f9df46000000b00b0990367631f90cfcf04068b0c1c2937abb4aec14c0c68c0740ce3047af4734dfb43eceb2b66baf1f8eac039f2287b045b763ff9334cafb317c16a7686cfa13f586a561300bafebfc02a26038c11b4eef3eca3a06b66458849cbeb4d9111e1f52299ee0eb90c4624fbbe7fc84384ce0133a608ae182af2e9cf872c80226745cc8e3896dc404e7d154b9c408e6993e200a80f5b63a4cb53748d0e437c058ba01391652188fd0143dbb8ee2362946c05800000168000000b01987d343e23ffb885c792400a41254ea8a6f0b24489087972e5e56492b3c5e4f031d0f0149af777613ef63c7f22b7da23ef67f7a70f289c0891b00630934d3804c1dffe3fae6adb528a9cd1534692b175384378d882585f3f029adfe93fa39189f7163846096b6c931e96f46c25968672fc75cfec4d9157724dfd0f24862c5c6806a7727335e52da52a56f4f84c075fe211a26c7abc9ce508ea914d17a32ee04f6bf1165c1fc5cfaa93f8395b9206445000000b00845b111ceec129e3b8d1d12916d0e55fdb47b7d4a974291af352d8fb6e3ac1ff5946415b887395135e87ec88b063fb738fe3fa560143c28a81a5ed2d6d145f570f5a8e970d79e2a50f22a237e094076a2779704375b57fca913524687109701dfc68c24f04406b2de556723d020f317174e0099225dea53eb373ea8e894e22ffda7f3e83c3396d50988c2e251deb32505fa374d6be815708bcf123e25df2f6511e8868058692ce86658e655fdb56e0300000168000000b00e8c0f6172dd78e3e8c40b7c6a34133c8b0bd2688a3ef79dcbb29724a2bf22da32a662af7681c816adc15b50713d212679ac0161bf472987a1411e33cc55bb2af7a47d214dd48c2b987447dd2ff636e14ca75ded969a72f8dbfd884cbe8b5e2af518e8d802b2f21e718383ed5384bdfa0ca9a100e300b43760a851cd75ec082d0feef9f444599d28c5e284d2b7157e53042a47ed15d59173472cf5a577adde20ae944ca2e2b469058fe2b2df9391143e000000b02edf72a3f6ca639e7c27b2b74ad010392fbc9a23528eb3515b0885f5d7b2ce448b30a3626edac6c349952c1bfc22131d32f7ddf8f9b265be42cd2f3733c13f69c84e7b9b1451c4d5c4d3b38a42b6a0ae7770bb03fceec01cd68b4fc452624471b32b8dd17861edc0ce7c8155185578550bf76f841853a0bdcd3cfe5b6f607e24a3b7d91c89ae36be25385238390d58b72e9dfe16cc0324d2bad3ddf3bfd2e725412cec7d2b2e503b62fa99a8e9a0ede000000168000000b0141e6f2e46e53b2be770316dd8df73a1d40ae0fa95503f2022fb20d78db1989b164afb30ac73e31343e6d40835f2ef7526eb79cd4fb82405446f25280922e2eefa1f0a301ee1da8fc08b154ff2877e29a0a833c367908ef0a806fe30d8a5b81c1fa1ffe97e74d1f9704b85a30747011020b792eb95265ef02e53e87da6fdac249934b73a0f73191de5e3c7936d3dd28413e451199268f243d3f24e88fbbe75a61f9b2e28080e0c933b18e7a814525d3f000000b013faa2680c0919d0e33f51bd76e9cbfe5680e94b6013d5fb581e8205ce188269b4878822df360e59015a691029f818e10d56574f289ca05ad8959f3ceedff324e1ad3c9554c23e255aa29eddaea38e36aff9361578d84a18e515e20d7383865d873e57167061f3d444dcab77909fab9d1b9ba933a49d806d701123c928c94ac8ca527874be2d0cae0675ce6666a77dbe282b35da604b47e45a5ddd7c5ff4f904664e0543e09f2e027af1460c93f0440d3800000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000001c100000000000000000000000000000000000000000000000000000000000001c200000000000000000000000000000000000000000000000000000000000001c300000000000000000000000000000000000000000000000000000000000001c400000000000000000000000000000000000000000000000000000000000001c500000000000000000000000000000000000000000000000000000000000001c600000000000000000000000000000000000000000000000000000000000001c700000000000000000000000000000000000000000000000000000000000001c800000000000000000000000000000000000000000000000000000000000001c900000000000000000000000000000000000000000000000000000000000001ca00000000000000000000000000000000000000000000000000000000000001cb00000000000000000000000000000000000000000000000000000000000001cc00000000000000000000000000000000000000000000000000000000000001cd00000000000000000000000000000000000000000000000000000000000001ce00000000000000000000000000000000000000000000000000000000000001cf00000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000001d100000000000000000000000000000000000000000000000000000000000001d200000000000000000000000000000000000000000000000000000000000001d300000000000000000000000000000000000000000000000000000000000001d400000000000000000000000000000000000000000000000000000000000001d500000000000000000000000000000000000000000000000000000000000001d600000000000000000000000000000000000000000000000000000000000001d700000000000000000000000000000000000000000000000000000000000001d800000000000000000000000000000000000000000000000000000000000001d900000000000000000000000000000000000000000000000000000000000001da00000000000000000000000000000000000000000000000000000000000001db00000000000000000000000000000000000000000000000000000000000001dc00000000000000000000000000000000000000000000000000000000000001dd00000000000000000000000000000000000000000000000000000000000001de00000000000000000000000000000000000000000000000000000000000001df00000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001e100000000000000000000000000000000000000000000000000000000000001e200000000000000000000000000000000000000000000000000000000000001e300000000000000000000000000000000000000000000000000000000000001e400000000000000000000000000000000000000000000000000000000000001e500000000000000000000000000000000000000000000000000000000000001e600000000000000000000000000000000000000000000000000000000000001e700000000000000000000000000000000000000000000000000000000000001e800000000000000000000000000000000000000000000000000000000000001e900000000000000000000000000000000000000000000000000000000000001ea00000000000000000000000000000000000000000000000000000000000001eb00000000000000000000000000000000000000000000000000000000000001ec00000000000000000000000000000000000000000000000000000000000001ed00000000000000000000000000000000000000000000000000000000000001ee00000000000000000000000000000000000000000000000000000000000001ef00000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000000000000000000000000000000000000001f100000000000000000000000000000000000000000000000000000000000001f200000000000000000000000000000000000000000000000000000000000001f300000000000000000000000000000000000000000000000000000000000001f400000000000000000000000000000000000000000000000000000000000001f500000000000000000000000000000000000000000000000000000000000001f600000000000000000000000000000000000000000000000000000000000001f73700000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000002c100000000000000000000000000000000000000000000000000000000000002c200000000000000000000000000000000000000000000000000000000000002c300000000000000000000000000000000000000000000000000000000000002c400000000000000000000000000000000000000000000000000000000000002c500000000000000000000000000000000000000000000000000000000000002c600000000000000000000000000000000000000000000000000000000000002c700000000000000000000000000000000000000000000000000000000000002c800000000000000000000000000000000000000000000000000000000000002c900000000000000000000000000000000000000000000000000000000000002ca00000000000000000000000000000000000000000000000000000000000002cb00000000000000000000000000000000000000000000000000000000000002cc00000000000000000000000000000000000000000000000000000000000002cd00000000000000000000000000000000000000000000000000000000000002ce00000000000000000000000000000000000000000000000000000000000002cf00000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000002d100000000000000000000000000000000000000000000000000000000000002d200000000000000000000000000000000000000000000000000000000000002d300000000000000000000000000000000000000000000000000000000000002d400000000000000000000000000000000000000000000000000000000000002d500000000000000000000000000000000000000000000000000000000000002d600000000000000000000000000000000000000000000000000000000000002d700000000000000000000000000000000000000000000000000000000000002d800000000000000000000000000000000000000000000000000000000000002d900000000000000000000000000000000000000000000000000000000000002da00000000000000000000000000000000000000000000000000000000000002db00000000000000000000000000000000000000000000000000000000000002dc00000000000000000000000000000000000000000000000000000000000002dd00000000000000000000000000000000000000000000000000000000000002de00000000000000000000000000000000000000000000000000000000000002df00000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000002e100000000000000000000000000000000000000000000000000000000000002e200000000000000000000000000000000000000000000000000000000000002e300000000000000000000000000000000000000000000000000000000000002e400000000000000000000000000000000000000000000000000000000000002e500000000000000000000000000000000000000000000000000000000000002e600000000000000000000000000000000000000000000000000000000000002e700000000000000000000000000000000000000000000000000000000000002e800000000000000000000000000000000000000000000000000000000000002e900000000000000000000000000000000000000000000000000000000000002ea00000000000000000000000000000000000000000000000000000000000002eb00000000000000000000000000000000000000000000000000000000000002ec00000000000000000000000000000000000000000000000000000000000002ed00000000000000000000000000000000000000000000000000000000000002ee00000000000000000000000000000000000000000000000000000000000002ef00000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000002f100000000000000000000000000000000000000000000000000000000000002f200000000000000000000000000000000000000000000000000000000000002f300000000000000000000000000000000000000000000000000000000000002f400000000000000000000000000000000000000000000000000000000000002f500000000000000000000000000000000000000000000000000000000000002f60200000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000003c11000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000005ca00000000000000000000000000000000000000000000000000000000000005c100000000000000000000000000000000000000000000000000000000000005cb00000000000000000000000000000000000000000000000000000000000005c200000000000000000000000000000000000000000000000000000000000005cc00000000000000000000000000000000000000000000000000000000000005c300000000000000000000000000000000000000000000000000000000000005cd00000000000000000000000000000000000000000000000000000000000005c400000000000000000000000000000000000000000000000000000000000005ce00000000000000000000000000000000000000000000000000000000000005c500000000000000000000000000000000000000000000000000000000000005cf00000000000000000000000000000000000000000000000000000000000005c600000000000000000000000000000000000000000000000000000000000005d000000000000000000000000000000000000000000000000000000000000005c700000000000000000000000000000000000000000000000000000000000005d100000000000000000000000000000000000000000000000000000000000005c800000000000000000000000000000000000000000000000000000000000005d200000000000000000000000000000000000000000000000000000000000005c900000000000000000000000000000000000000000000000000000000000005d300000000000000000000000000000000000000000000000000000000000005ca00000000000000000000000000000000000000000000000000000000000005d400000000000000000000000000000000000000000000000000000000000005cb00000000000000000000000000000000000000000000000000000000000005d500000000000000000000000000000000000000000000000000000000000005cc00000000000000000000000000000000000000000000000000000000000005d600000000000000000000000000000000000000000000000000000000000005cd00000000000000000000000000000000000000000000000000000000000005d700000000000000000000000000000000000000000000000000000000000005ce00000000000000000000000000000000000000000000000000000000000005d800000000000000000000000000000000000000000000000000000000000005cf00000000000000000000000000000000000000000000000000000000000005d90112ed2e4b38f6e75420101b372307b3d2f38c00ab0b31792eb6f350bf881b71ff00000000000000000000000000000000000000000000000000000000000010c000000000000000000000000000000000000010c1000011000000021c000000b01e5230189319f14ab0efa39e4b60d104859784ae68282f85c8e52853e303be387fd1a9bbc3447c87780b37c8509cca3563d0d0f653780288094f51d24f41a79356933470652c7e0f5191778bcad0134f70bcc1029e49cfde87ca163f88cc1051693ea0c26d6021ee358ce60d1afbd8d30785b0b9536aa12e8fc2bd70d1ca9b9940fba45bf539d45037d6f48be97cdf592b908819c0e35d1f14a0d5129014c6c8b5c4ce351ce5f4e273a53cfc98731154000000b01dc8d9999fcc6ad54f110f053fc7228f3a0c153946de89dba66100da614a413a39e1b52c3f8f2a54b6ef4ce6b9adf469ac3ff4223568bd4631c443afcb7670e0df29726b8dfb8c34bb572a2ec1295e597840f204996825768e6e4cded44c3371ff52d008eec9187c53f269e973dcd3ee26cd4136515041f19134677fcb060c42012edd8b8a3a1a44d5d49b6b3128ba82161938edf6081e776e0564729fe9000bfac8be86c61c2d13331f66d93873bb56000000b0010b8b8c1c736cfcf7dcce0b9ab8454e7e6728a4da56559693744ab966f14c17ec457a90391aa8ab6576cd04fbdbaeb6d58b0e9404076ae7323c7e8fb960c6172242ff184dc5ba87743b18f359e6dff4f0a666cf3a88b55404b3f41936295553366440f400bd8aed3dd8e373232d3b8c2cee3c81587452ff6cd31742f5dd7b03660a5320f485de8d4745eee01ecbfc68290151dd58a44f4bbb692a4579b606dcde65ef6410914f59bb394469652600070000021c000000b0040657fd6b4b21c941e9085d59398e0d80d642e991c67c1f01bccbfd1d63f7b81fb01d7ac8a96948232b75ec5671a24f450c843b5338d4deb72963316f115a335c5e4d5c288744ec9f06ae119e727a26a1786bef7b3f9e0ac5614a42bc09462543965ab2e55fabfb749061dec004d3e81e8c41560ab599ddbcb5de70162d73ed08cfb85f7d0f7036e751d65c8f64e09705dc5a976362d2a1e5cccc07fe4a39a8b0d0f94f917a910e2ee47e82dbc8fd90000000b0140dcfdeeeab72373afc37ead979b38fb0fb13f1a6225ef12a1139139485656f6c4bdfc0e511a0c42178b98d53233dce29d6fd8781bb4f593612ab3ea6c652a0105703b0c4e3a4be5c1becfe7c44aef30f08ca75da86bbf30850ef0bd9fca1b1d3d41190b3ea823987455ae7fd4dd5e720971db1d3848924b2aa519dd3963958150ebe9b17e98cad87b5ef673378b1881ada0d2d1d57bfd611abfb9553a7cc19729ff9f185021ed3b9fa1e1db3bfec12000000b025de2593c16146d39491a91219ea3152e81d1e11f2cc4ed06e646f65c5cf1f93babd835ba43dc6158ade659e925d40402151ca1162fad8b97d43dbd4796b882d8949d29b0d333f98f79407e556ee9d6195775e323ce690688547f69814af8c899d099098b069713fd0472f0a04805be0034eafe1186918c87716ea86b9b872a48b88cc30a4a42962b910f730d3db693b2d89ec6db1dc403ebdb4ebc35bc5e4f161c9aedfe033e8f1b9ec58abaa61d71d0000021c000000b00edff87809bd75540d58aeff67fef959a0d5690499fb55021f75ab30f87f49d083319c483d8727c1718e56108a1618318b373dcfcbc01e83029e8467dfde4e4afb7afba6fbe63caea1dd72a4b57f9028e0adea31bdd9c0db76d7acb509d1c1add9ced1b4391113196ac335d545102a5f00df1225ba84b67f35970c446ad5711e0e06d9f38e2332e8180bf758f6df0c37030e89e09a00c55ba933288a1ab7ae561d417d1095594ee05e0f4b002cc70a08000000b015d8148338d5955a60b9023216c899eb6c2286a22537219dbaa900a14a354d3fbbaf2ec6fb8edff397d0f5d112d1a1eeb7ade24fc024be67005bc5bedd3da44a2dc7d93aa42092d5c70fd2fab4ab90ed8d8a6ad33e058e9563cedbecee1eddb773d240de9c3b481bddfab817e1d6ab5e00be620be1ee30fdfec7866cc53fb94c8c7de0afb5fc036585a71dbf547727a229d326c6a850b63aaeda890ab673d6c25d19c917f2a73a52297ebb2ff49f9691000000b02d6bd4fe7ba13886f9346a7f36491938b5f07f8e4accb1f4ca5849609a773d9070dd85f9f4d86fabb78e6c25ed34374c9dc0d93af2e04a4be722db662df98e1f44bec7cc60047d2d73a6cb5b67b97beb69169b798bb4abaa75b2b38607a60c03e11e6f5791d119e8e595acdece318aaa1524fafea967d4e30c2875eaa903fb1581f138655c327200ace755c748dadcf30f07931398bb467af7c1609426eee76f62baa0eb0e1267bea2e579e3d502aee60000021c000000b0194be5d29733de9417607e3bc57fca64fa4803d637c0bdec5dcb6de05b544e8d2e2d02349826667d4924fd130c5c4fc77726e333fdfc8ecb8069de7e951516597cdf6b26b68ea427bf225fdd16b27a3aa674489feb392e4a65c67b085177fdd52c3bcd2212e6415fd8f6805b3c192ac5298ddcf58317c2ce7eea998c25c2bd91789f5e5923860dbd2996b62bec211f28282ba1c797914dbcc7b0e24beedc7b5fb4abee320aa1f77de3e26cdb0d73daf4000000b0251f205e2459d5890559f8f3e9c25ec05ad834ff0ca7f8361ff157b3ae536e5060080eaa664cf514ccfa0ea7684837bb99335be96530608d194f7bfdf857df4faa48d87b06d4a16b0a665c72bcda643031136868020f7dc8c107371049aa4a3a7fb0a2ee14b6dc422b2c8ead02cae16913ce6cf8464c68b1117b5b79ac8cbd0bafcbafea2dc35de053aaa888fb2fc94b1a52eeb8d3f0539208c56217ca0e250d55c3779a9e1de22342e876bd67b2bef2000000b02f8fac27fbf4a08150350aaf3747372b27e0e10707e6b1b37f1cd7965b4f33694e316a91e6cbcca77fdb8e7966fa3f324a776f89b55c6ea12bf974bea09c0bdd580eed35bbbc64328771e042b08ca93ee09a6b9207de34924c57a2e8c513f3bd9b94f26136096054d0214d50a590f67d07f690fac72bf771f6b93f961e829468c53a2505e56a43e1497027b6f1117ac821f3165b7fe86af679f69fe5c3ebd852c0a56d2cfcf992f281ceb4099d3ca0d10000021c000000b0124a707e0449d96a720377369ae5a088739171736b4db65b3f6caa95afbc2a5d7217346efe05430c1b6941f76107a9b8d27980ce12e6dc413e83beb573abccf2b156f750c3c873e8e601c27eec01dc1debe4c44cfa911030ed2f6d4298a7c00ad186123f25e0fa898dd5619ebfa572ef046e12d555d7be24db7ee0e35a2213b1d01f76e385c55af1309d6b90c34afe4721c50f8040f7458debe594857d35969d7251badae2c6044cb9f92e25f7d93a4a000000b022b85d047c87b3fe773ad1fdf6883eb77689455492c52b74ec2e0084976e76295323d323413c1130f0a22295e2abbc1d2a9f28b77b1d1e6b6dfac460a810e80a60bbd501f9466c921f7d0e490243f69b25c5179f95d1b4457f03c7879056c0057ae7b4bf0f5bb6de55748eeb20007299178b3d1d859c6e5028dbe1fd1851e58d9be5ab47a29b6ce2d6aea9c4f1cd7f9418d9bac96947579c062eef42095d3f3af5f61ce4baa5bc558df6784e70fcaeb7000000b01d8a3a82d6236418ce6955cc30282529de49cce6b43f88e0ab4915d5a1d2d208621629500a1efd6e2803d790c9a3d73524259b1504988f88f26d97ace1375fbda81dafe309654ee051194a000fded20f5b5272e908e4284b8e091ee9cf8eeee56f394270136ceec38a32533129a7d37e0300d228e4310b5b42dbc2f0f461b706648aa6a436f6df87db174f309b824afa2fc44f892cd9c086c7107e163653bc776304652072c1a86e52bf5794dea2f3f80000021c000000b02a2816c42d45814e5030bd2ed7d4028e1e0b7e85509054e746de4659d3d2dbf28226681b59d5a0577e1e550e08ec436af9e4029981b635232439404bb5353ef336bf27b3822806ba012e6631ff378d67afa3d4da6e17dfb72b7121caa5d06b656873b60822129faccd24414e1b79da750eadeae84b737ba859ffe7b3791e75d57d14861af28f651da3bc63a1c347a18f1f535c14dc43675fd43481d8e293686921e6cca55690806ae98828eb97fc0913000000b01c1f62898750b60d23a65727004e43ded160a7b9a400b14c860fad973a572bd42109c660fa81a5f82eb7a84e22696575e53c8eb9c1819dc75efe41c0d3a1a024a7a2024015e241c5a4dd7faab548b2558156364c4d9f7854d5d76f27f4400f641cc577ccfcc34a0e513124cb2a660e8e2f2490cdb95314a59aa30d082ab3929c2e7b4fae5aad9e5ef51e60441d605b840697071e4524b360e7807336280e73aabba58798e5add86cf9fdf519c3d0d320000000b00f6d15b98c267fc54fe5a5f2561e8c3f659ced80ad6ea51ad994b94cd46ed840f836cd66d7a84d56fd227dd9c5b1adcaed554edf36cb5432e71d84ae6d28f880ff609c88dd8de38afafbb64f74518648b06f7e22ec0e466ab765f169dfb4f3db3c3ceec2faf023bc9061898f18d1a48b25c56da17032ef29a424cef69ba6ee5560b8419df58f7eaac7359720d914e8e6119939e9de45195afe5a7590a1fd183ffd129fd3b9705cea74a1c1fd797e7f580000021c000000b01d5001c9aead2e11916d74740aca1f2249d355b9aa1650fdd3e6bab51f7718a514e77702d7d915a6ff509ac76a84b4f2635d089f2c5a82bd49c5cb2e324cc84c73875f6b3d08017a7fadaa72ba348b47c8a1ecebc3de09a5a68f88ced5b9b5524d6fed0109279e9c4e053595202dcff80405ba1ce814279b7d361f0a7ae2ea7ae730326c83906496d7be3c3f74e750ff304a2cdf95f2fc116b822be0faa3ff16e82f5e84bdb26d391d65850d17a7f064000000b002db2b2e186c315cc0779ef608375e99941a61742df38fc1fbe3c2e3eb3f7c1f56095eff3964abfc98eb978c65fb1d6acf488cd11e4bddcc44b66a0555c8dc494dad5dcf0dd89fb1dcc47164aeedec7d740b23a93168869e7ebfd34237f3431e1cc35b1aef7f131529bd7de27397ba341b6821a0cac88164ae57d0cb44466c77036c779c1149f3c3cf9dd9d354dc64de291d279e7ae6190bca4989fe41a078e5d30a170fce2fca374320f58799ad2724000000b0250bd8125f11b30dfc6b6fcfcf38e383f0c7226e0f6235db7e9e7f46cd29a205b4c43d408cad8ad168a1af44e12e4f34d4c2ccbcea2fd26793377a647b410755a2d83f4eb60f4498fca3c26ebe08adf60c4c4ba011b4412fd921ada08e4766498fd96d164bfc7f4ff5b20a73dbd9365a161bc2ae7fcf54a2f46be12894541a935bb1a41a87eebe603a30e8deab404089048a00ce4e8944fe5912d46f7304f1bf4b11ded77bbc6b43bcf874f384e3fa8a0000021c000000b01d106f3d1a5a6809d15d461e12a5220f18ac27e79aa74923df5b9870dca65132b18aab60143103441b21354dff15fd5034826266b2e46747b2d77473a35a1662c50fbe381f2f97112c2abef7ef443b356bdc71e465f02510ab1d57f6e09af36828b893362518a84995e3a01ad80b93691cc854f080d0b6f9570244db21dd98c73d56eb361cafd440daa79c4c29e03f7c0dbeaf33cf875be90b028f659fd50d2c38ea9abb3f43eda244406b2cb76d9fae000000b0151dc5d9cda2bd54f954e17f41df11c0f2a43f2be957fed34c672b5a94b60aa97acaf918ae9a1d40045e4f6533d28bcffd0a52f25c1273f182ba577121fb4e2a9479f8733f75771c2faff22866c7e00886c96dbeac186422e978848aa579d93f877c5dbf978765691899ce129bf714d223b38c82f30131dc4b6e807e4b5a9f2bf4ba61a537d89a72c0ac88388d026dfe2d5483abff46037189535726dafc3d67bc4e6245689b89468659f2260703482b000000b007ee3bcd0a172d6addd3acd05918ae1aea9ba129e67fb01aa6a825071ba60741d65aa8da298a2bba9a098549609f0b0d9a7edc04a948efca33e2508fdc68d360835d61539c582fd270955e0d4cd26ac81beb24c07c00aba623dd447f6f68e6a1e168b555a78fbb0947ac7f0215cf1524275ea46cc30181857a942141298c7e7d5ce320492ca24c47cb648cd39e091b0b0e04e0798232d6654347b9a9bbbc39c8182f43b243f5404263f8e5f133c4671600000fa400000168000000b0030e0d37d06f53b2c2a703d52b6d75a00309fe38bdc2aa2a03343f0c19fa0c0777ac567de5cee26a5f9aeffa56812cd93b254f6ad0f2569d1a47fb8d831d1bd686c75f02987c6e8423fe90e4770a37ffc4a3f79737bdb970be87179b0832e7ba5e6f64afc1801c76ac6c69d8b7ef1ddf2bad1fe29382da15f36e4bed6d506c3d6b716adf1f9ee0cd1ec37faac404c9880d2b9a13355097f698c688a1d1daf9492125bb2c8979cf52dc7c7b45c70b84d4000000b00ba5867af12c49f9b715bf5ada2c75cff35e37cdda3febfb1fd133f65eb168fb458118642b36b7b0f6bb598bfb0d8edee887c842f6caaa1449f8d4524caacd4bbba2e158201dfc8eb11d0e04845ac82ae95866da91da4a825ec7a52009d690178c32c361e979008855cfe2374b909def12f0e5747b4a598548fe03988cbfa9c3b9ab94655f78835275d89c84e2d9f64212af50b226b886dd9598f075f5e78079a054431de22fda98e5125d1de60b023900000168000000b01080812459bed64bdd952f740c1d4198051243ff81001b0198f4c2e98f49b24115e9793f16eda35096b0cdb07d44076c3afc025c57e2c08b5de8e21e916b3d85ca0d14cb4ee03e121c0f66d76ff46f0819cee80af0537c21e03a4c82b64e345e77eb755e0163e6c9bbe6049621375c94145cc77e16ee5e68e87c5eeb6be6afaf598aa95d72313a2380811308a70c50501079164269036d467c641771c89cb101a8b9a278bd87cd1f9abe5d4689576318000000b01266b0b738a3afcc2d3e6bc112d04fcd95b7292423a5cb105918ff2065c53c1d5cf6c8427f1116f776b254d36167bb7eda28d118b4fccedd204c937373d15b2c458ccd72e382a96856620141ef8e627fc06d0efe5e727c448f5905b7892c1670690a8b2da51745082a8bb3a99df1d7b02009414a1e14c61d9cc92a4767da0360e04f8818b27f283c1fda04e3cbe7b51c09a47ca32b6cb097046ad9364a70f36f9bb4a7e797f6428b7db980448c32354d00000168000000b02464ffa1c0ef2bf97695ceef0f03c79df69aee260d074d760f04100957b061daec3cf50abf63af003bd8c77254375dc5d1f510e4059a85e45f0b00468bfca8baaa012dce4282dc851f07de90afe4d52477a89c6d417803f8cde38cd415b3b6a1ec0fe71f2b9b9bb35d3131867ed4ebab0c217cf6dc6657f8f2b22fd6ea1e35c72b5f696e38bc0c3b2e2d8b94199f1f1503e8f1638e14200cbfbff8746e9c0a79de856a456341c6eb65aaebf32ac0a5e2000000b0208169c12919e4b227e7891893178edd65fd7886ee195e779f6ac16fefecd9f9ff1d34449e3fb612484ae13338932fceae18fd5f1d2b03ad8a315ef1f2a2aedc641d65c84f8c891aa09255c7c366a5eabd6627829629f1a3f836c94a32b792bf75dfa523b5194db43aa77070ab5c7a0107706f710174f8355cd5098b4df2d28e39f893b69b57fbf5d6fe825570f7168c2c103c2043afbbf580f218ad6e514ff9d821bf27f93bb5a8718123e56a5e7c4e00000168000000b01a58d184b638e1dd51b1669a6be91e6f4a9cf9133f84697d57e8a94dc9cbbd4bb948237525af6f71c74c07ff4fd80bbe919e1ef12d340c2025578f2473dfe118e4a2d0c9fadb63d7508c0f5f9933ef4bfb29249dd53df44ff56724b92da0d8cbd806c60fb8ea7e5d8c6355a91bb92fa416fe2f8e8a9f69951b2b4fee24d1b147c24da3c5077ee7b6b0c01ac06137031c0aae9147b19e182d85570902b16a627357770f276a81535fc2b889c62a6e8d42000000b027a57897f8b0eedd209058949c69ef76d1133716ffcf3f14ad6b3fab2448a13df5f2ad29a6e5acd0f6aaf788e983c3fbff90ab9065817c94d5e203e69b88b99afc0d111e9b08d23db18f27a16fcca7446a0f9da1b825489a048dbc92137173d8c28a9c60b88d1c2a581796471dccc42e2e276708c9a261eee8962ca6208dc28779524de5215d9a9fd1e1d83358b9a0e01bedac1ef990e0955691d7e7fe349c202df91b3037fab7efbb284502e62bb8b700000168000000b00c33561f388276d7cf50b719afdeafd51deb3dbc4e32166eeb5b0ec7890a3bbb7a92f85474ea7731c0639cdcb74fed6e1cb0ec730a89c5c4b7da46eaf68780eca4797c7da8e1ea71ac9f291111c4cb3d30c5115393bd5d9d3fa255524942c09ef912b2fd3d9e1bf0f27fccfa2e27c9c81e8495e9f604438ba950964d2be67dfd0a88c13535506667c91de4aebdf56e932bfc3f8dc523eab18470c5aca4287c4b7fb51a1105c8ed55495b6e7598ba30fe000000b014998ec4473f43a897234482c4391ad1e50c097f21a746dd2ee4eaf4845d521cd345f34196eb2a95876d9dae465eb497ff14d9d8eeb48c9ac3f31ef7f8721e0c50438062fbc3eed66a5e33bf742178974c9205295cc7225303d195eea98633cd54506857fad0857699dcbace36a5ba4b1618d6e4ebd2b76266b4787e6dee58081e39d548ad2e5bc2fb294a929f0dd94f2b7f51bced0ad927dc8a565adc2121f7946a7598e33171f7d37df00b47ff5b6400000168000000b01c0740d7da631077d84b795e81e1e2912a2925c4cb06c67a140d0a14698e0138680ae095c892226120f96f8f9dd79297f95537d0040de3b73aee54dbfea018109206ea69ddf8e72108ccc07a8a365ddecbaf5301724abc297617d5855559fa67abb3fa70c5c5aeb7e0a29c5ab9295a110c971ba9f3fca93fc497d321f320f5cf304ca1189148deebc72b88672ce3ee1d0f223c76e1554476ec13eb2ca43fd354c8958f7b9fe2e424fd54827b581cd3a7000000b020dfbaa01f90e588f612cca5ae346556675f6f55a49e675fb2be33e1f8fc308ecd0c5ced8dcd3f3f4c82c0a6325149de03818a30607ad1150f7bdaac86d3a352482341fcb8d076e4ecc42bb8692b430b5b8622241feadb354b52fb86c47186c83bfd539102715187e0d52e5409b1962124dc1762b18b853947f9c0c610de81d9340b5ca9e49416d8303b1dbddc6458b303870bed6d31f988da566cd7ebf699f695cc5dcecfde37ec2a87c8b830ffe9f800000168000000b00f892c0db9372ffbdc31adb8ecf5b877239310b4d4d90341affcac9db4461587a31a86dbb7624e391251ec5ca053160716ecf2fb3141582e817f969cd1cead892ea85b1f2bf4a8bbdc57424497e70a32602697b53aac4336b99781aabbec364901ee641584f24563ce40a130f9ccb9150b6aafbf98bc4217e8da019cc27e85049e65d72bf9c909233f0d67ff8af7166104bf1ac4fbb159433ad0d24cb96e74249dae2837d8dfdf91be41b199789fc26c000000b0156b8323d03eaa58c2615b3429019a2e1dd7cc710be9b3628e8e8b0618b2147a2d22bc30959ac0028ba60dd2ed96ee6bc4e987b2bf5e1bab42ae9be0cae9df6b0069ff000d5fa68c5fad3666a19cf87424376dedb2014b7e7120e8f0c253a35f75188a0d57055825ad19930f360c00b811cb041b624266bb318923aaa686ff3016573b5b213215ed4f3fa8ed21fc702706193161f3a9712c0eed2a52f7852d532d1224d3098ca7d05f538bef68f76a2300000168000000b01f7ce232879108dca501e59023f273bf5b5818ab03c0dd7fdf2eb7218da5843b60efea24413430cdc76c259b2173a40e11a559c45c77b5b750ff8906562e415c2494c2026d27595846a4f7d94e8e890537174d43356d9e4ba1c870288f438cf0d79d9ac42fad2a235b12f88279c2aa3c26210a832462dada291b60b77fc691ad5cf58726b7b46520b5a3d170d9b5d3fc26eaa9af196efb573b0326361e43e5b0eaea63c941a441753a7760b785eb69d3000000b01d04d18b51080f0ab3bd6854d44b4a727a801eb651d5beb8650add59a96a9af8bb51cc3c4b98f5450b4df79c3cc68ca820e44bef49f363d2d5920aa70ba2943a5ea637ee6647ea4cb57cc2e7e0ff4811460d1e267227bb32081fe183b26e072e33777c29cd00f8790c0736289df0b4291ca462727a93a8fb7f36f2b716b7155dd02d7c1fd5b781841c06b9390b3f27d529ccfc011b7e2c22f03d5dff36839ca9e2b537c64f9a36b04c66837f20ccb6f000000168000000b0000a49a54c6d55828d92c40628802e3d273f52e967260319f73cfae97f41c1f1b4f9c6e8fcf4b7a1df5eda28df42c7b1b315f9d966b9aa907dc75c4d73ece8b30de6e2fd132a9d815cb5dd7c1478b0570b04b35841e42070423b51a91e5be7081c33c95696bf2d6bfec7ee0e5668f14403802c4dd8f33e3448581a99713625b4586ee194a8e14bb779446ba0d62a976c144105e19dcec5f6a7b5691b90617e0ca97c9a19011881221c296350333037f5000000b02e025d5807f478403a6e1e23155518bb93e329646de0e0269f701ea20a45f2a68ac8b66d8fe54a755d6b96dfca9060ce82b4e15890d6fd88673f023198677f4afe0d1762fd3203cc08886ee80eed9f17bea3e376da5c157846d1a1f68f6b309b78cbb5b69922179d744948a784be44fd1922ead640981e2c54d06c98a5a0db4d620fcc7f7a6621e42ed49659fe846ca706e3d2825b0469b20fb796c557705f8db58656ad75d4dbe096e8522477763b6c00000168000000b0075951f922f6ff6e6f18c8940b93bfa399b688c42b725ca3e6e26045862a32ea4eb8e0d41889e9a3c2af56527610401e84ddebc8a543f3d19c1be107eecb33baeff9fa043f17c17972e7a183bc923dbac63f70fe1309edb3379a67c62b9500c9d7d1804be966bf7b7d2c813bdc097cb90d436f9e27602742a7becf917db3f122a7026d590e89e4153a5799aa6fb3c8a601f2577d4f2cebed0f89706b94856e7386a0ab2104fae8c220674b32f0a722fe000000b008e59a641ea6f2a735b9b860d75e3a263c254cc737d1832d215eff96e53d043d9cb73aa9c158ea4e089be5e8fc3297172bc0150c9489c31f6de3aa738028b9f527a39e1aacd166cf9a4521eaf32110d958ba9643b2c2b9e453d1d01f1f826e9342259dc0dcdfd54e646bcf963578593e0f9b709860eaa1f7c2299210c3fee688f22a20385e09a24a03f045d31b2af51d2c87516c7cc752f1294faa66fb642df2c38e1301ed9fb552e714c55d25a3f03e00000168000000b01e4179e5ad7826acd5a7efd8d9170775d1f2f182538a2aee1c77d80044eb2334c7255b7ecb640f6810d891e71609e418fbe670ef8d5fdc3f8fd0c6ca29cbb6344fcb4cdaf4a9c3eba84a685879a9c2b33c9cecd3c15a86ec4915bf470cbf1e0ab701d221db475db33fa391c4686496e813bd1f871a8a9f81c033b4d9888f57681e285f5d56f196abdb58a6513947b747113cfed77a5a59061361546c72bee1502ffaa7cd49b1549ca4bd9197d5f57571000000b02d6cb6745c2a463652cfb52f33faab01c1f665bbac6460f12dcd19a6394e7c4398eb60f8a6c2d7b9c13aed45ae928f6145f3218d4b40d815a5ab8c3cc2373faba8c3ac7a02807dfae60062bfad0e230c32faf94bcc3154418e2c11b0c64ed487317b0f0eb78d7c023301472b74199f38240174eefc38043a74dd0cefd5e5f55f8c8a306de615f210c7802248e07ff44d166e57422e585cd4a110da89b891ca9c12d17b0236e5a28d8d4c27e4046bbe0f380000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020100000000000000000000000000000000000000000000000000000000000002020000000000000000000000000000000000000000000000000000000000000203000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002050000000000000000000000000000000000000000000000000000000000000206000000000000000000000000000000000000000000000000000000000000020700000000000000000000000000000000000000000000000000000000000002080000000000000000000000000000000000000000000000000000000000000209000000000000000000000000000000000000000000000000000000000000020a000000000000000000000000000000000000000000000000000000000000020b000000000000000000000000000000000000000000000000000000000000020c000000000000000000000000000000000000000000000000000000000000020d000000000000000000000000000000000000000000000000000000000000020e000000000000000000000000000000000000000000000000000000000000020f0000000000000000000000000000000000000000000000000000000000000210000000000000000000000000000000000000000000000000000000000000021100000000000000000000000000000000000000000000000000000000000002120000000000000000000000000000000000000000000000000000000000000213000000000000000000000000000000000000000000000000000000000000021400000000000000000000000000000000000000000000000000000000000002150000000000000000000000000000000000000000000000000000000000000216000000000000000000000000000000000000000000000000000000000000021700000000000000000000000000000000000000000000000000000000000002180000000000000000000000000000000000000000000000000000000000000219000000000000000000000000000000000000000000000000000000000000021a000000000000000000000000000000000000000000000000000000000000021b000000000000000000000000000000000000000000000000000000000000021c000000000000000000000000000000000000000000000000000000000000021d000000000000000000000000000000000000000000000000000000000000021e000000000000000000000000000000000000000000000000000000000000021f0000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000022100000000000000000000000000000000000000000000000000000000000002220000000000000000000000000000000000000000000000000000000000000223000000000000000000000000000000000000000000000000000000000000022400000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000226000000000000000000000000000000000000000000000000000000000000022700000000000000000000000000000000000000000000000000000000000002280000000000000000000000000000000000000000000000000000000000000229000000000000000000000000000000000000000000000000000000000000022a000000000000000000000000000000000000000000000000000000000000022b000000000000000000000000000000000000000000000000000000000000022c000000000000000000000000000000000000000000000000000000000000022d000000000000000000000000000000000000000000000000000000000000022e000000000000000000000000000000000000000000000000000000000000022f00000000000000000000000000000000000000000000000000000000000002300000000000000000000000000000000000000000000000000000000000000231000000000000000000000000000000000000000000000000000000000000023200000000000000000000000000000000000000000000000000000000000002330000000000000000000000000000000000000000000000000000000000000234000000000000000000000000000000000000000000000000000000000000023500000000000000000000000000000000000000000000000000000000000002360000000000000000000000000000000000000000000000000000000000000237370000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000030100000000000000000000000000000000000000000000000000000000000003020000000000000000000000000000000000000000000000000000000000000303000000000000000000000000000000000000000000000000000000000000030400000000000000000000000000000000000000000000000000000000000003050000000000000000000000000000000000000000000000000000000000000306000000000000000000000000000000000000000000000000000000000000030700000000000000000000000000000000000000000000000000000000000003080000000000000000000000000000000000000000000000000000000000000309000000000000000000000000000000000000000000000000000000000000030a000000000000000000000000000000000000000000000000000000000000030b000000000000000000000000000000000000000000000000000000000000030c000000000000000000000000000000000000000000000000000000000000030d000000000000000000000000000000000000000000000000000000000000030e000000000000000000000000000000000000000000000000000000000000030f0000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000031100000000000000000000000000000000000000000000000000000000000003120000000000000000000000000000000000000000000000000000000000000313000000000000000000000000000000000000000000000000000000000000031400000000000000000000000000000000000000000000000000000000000003150000000000000000000000000000000000000000000000000000000000000316000000000000000000000000000000000000000000000000000000000000031700000000000000000000000000000000000000000000000000000000000003180000000000000000000000000000000000000000000000000000000000000319000000000000000000000000000000000000000000000000000000000000031a000000000000000000000000000000000000000000000000000000000000031b000000000000000000000000000000000000000000000000000000000000031c000000000000000000000000000000000000000000000000000000000000031d000000000000000000000000000000000000000000000000000000000000031e000000000000000000000000000000000000000000000000000000000000031f0000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000032100000000000000000000000000000000000000000000000000000000000003220000000000000000000000000000000000000000000000000000000000000323000000000000000000000000000000000000000000000000000000000000032400000000000000000000000000000000000000000000000000000000000003250000000000000000000000000000000000000000000000000000000000000326000000000000000000000000000000000000000000000000000000000000032700000000000000000000000000000000000000000000000000000000000003280000000000000000000000000000000000000000000000000000000000000329000000000000000000000000000000000000000000000000000000000000032a000000000000000000000000000000000000000000000000000000000000032b000000000000000000000000000000000000000000000000000000000000032c000000000000000000000000000000000000000000000000000000000000032d000000000000000000000000000000000000000000000000000000000000032e000000000000000000000000000000000000000000000000000000000000032f00000000000000000000000000000000000000000000000000000000000003300000000000000000000000000000000000000000000000000000000000000331000000000000000000000000000000000000000000000000000000000000033200000000000000000000000000000000000000000000000000000000000003330000000000000000000000000000000000000000000000000000000000000334000000000000000000000000000000000000000000000000000000000000033500000000000000000000000000000000000000000000000000000000000003360200000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000401100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000060a0000000000000000000000000000000000000000000000000000000000000601000000000000000000000000000000000000000000000000000000000000060b0000000000000000000000000000000000000000000000000000000000000602000000000000000000000000000000000000000000000000000000000000060c0000000000000000000000000000000000000000000000000000000000000603000000000000000000000000000000000000000000000000000000000000060d0000000000000000000000000000000000000000000000000000000000000604000000000000000000000000000000000000000000000000000000000000060e0000000000000000000000000000000000000000000000000000000000000605000000000000000000000000000000000000000000000000000000000000060f00000000000000000000000000000000000000000000000000000000000006060000000000000000000000000000000000000000000000000000000000000610000000000000000000000000000000000000000000000000000000000000060700000000000000000000000000000000000000000000000000000000000006110000000000000000000000000000000000000000000000000000000000000608000000000000000000000000000000000000000000000000000000000000061200000000000000000000000000000000000000000000000000000000000006090000000000000000000000000000000000000000000000000000000000000613000000000000000000000000000000000000000000000000000000000000060a0000000000000000000000000000000000000000000000000000000000000614000000000000000000000000000000000000000000000000000000000000060b0000000000000000000000000000000000000000000000000000000000000615000000000000000000000000000000000000000000000000000000000000060c0000000000000000000000000000000000000000000000000000000000000616000000000000000000000000000000000000000000000000000000000000060d0000000000000000000000000000000000000000000000000000000000000617000000000000000000000000000000000000000000000000000000000000060e0000000000000000000000000000000000000000000000000000000000000618000000000000000000000000000000000000000000000000000000000000060f00000000000000000000000000000000000000000000000000000000000006190106cba39ce4081d9dc4db5f51166f401fd1d0361fc9bd30cf6d907ad61f27376400000000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000001101000011000000021c000000b02c44cf1daef3a0f4db25e7ad27087e6eca4602194dbbf4fb9dfc8725bb0bc7c6d28ae57d84279ef1a32ed7a3020f76e2df5a956a1fbb238d486e19bc6d213feffab064689847f2843cbcdb14a5170562298135165ad2fa52f3c7a4814a2cfa99807384781d2d30eba66525afda47c40e12a0278eddc53c7947c9546ba13a9f44fe955d890b15d2f2932a9b48476b5ac4202a7e4e6f3b3e31331fdd7b2add0184e03204b0fd607ceb509c2f6bfdf73971000000b009c9e13350abe0731e80e50559b750802417ffa6ade44103a372e88d6aebb532b8d775011cb96edff560375dfa6baf9960bb0e2fbf478d262164004802f170af3a57d9bd9bb35f249080a7742130cc0133b722d786f477bd246c4875669cd15cc6261953b0adb98b047f419af519b2c0148b25d250496427a1f7221c11c54762f41616106b247a80be2fc8814f1e8dcb192ef8e5a2e8b912a303e5c307a9daf18c92ff15c7eb350d9360d19573eb9eb9000000b028787150626f72b9d1dd8b3fafc000ce240c2cffc542b2689e0805b9c5f6af27aec3aaf8db08e4143f4d84a398a41853e740b20538331a0143c4ca50c4781b0d09ee6cae55d20e955df3e5519c3ed650b930fb657a33526b29cab708ae0810e984a3a8bcb3a4ee2d703798d61c7650f017e2ea1e92d2267f9e4622c2fcc5d971a25d35d2e9c248df43c1fafd2ee929052d4a74a4e822fe352f8afe171e74a98c9e13b11d3c5d038efeac68b5350852d80000021c000000b02a398b0901445c7ed2159f29f0256609e85363b7efc3b3e0aa344a7c6b24d40f74fb76335949e2c9550852ea7afe2945fcf9318a76d251f11cf7de97bc71bab4f4eca8dc9f6270b09333071c60bb42e3ad353eab4f6edff5be36576708e17404ae927c5a330452855f3cc8bb3a62adfd0498d9545e02a74903eda94d9203232a919ea9c86b1a32643aa9986467bdb01b0332a22c8ea3a8fb64a9e367571e732e62bf96027ae4495ca42cab82002d56d4000000b0096f12ead4ed9f80ec8d38eac23da17dc0c9d19185b9472dd6d962b3d8dcbf5bea062b2f8db8cbc07ed212361df0844da136985574f5defddd5f8b6cffafc0616f8cd90857cf5d7ef5c9a392ba2c8657f0c2d0bac0a98468a0fbd4595cab91c6380f46a2e3907fff928720fc33052bc40f8aa35a56c657823e53b73129796763d42bef1f0a2a841765170ea34ef72c08023929f9860066cc6c74a4e2ed8e3744e8fe04222517a41008f9f7dacb55daa3000000b004be03bf208a7d7f8c1f2dcde8b9060fd05453820f6311df936149daa4dbfac161ece7610501edc5afb8d4d0e35530652c79d2ccba362991b99b4d6e42b5e3b1189de597f93fbb73ca969f1a69815a11f993117a67b55ddfd3cc2a702ff3b7a76b1317c5c463e4cbf515a887294aed6d17431c4e44b26c55e9e8f3fc23fcb8240e17ac618829b900684ea9177d5781a427db309398648dcd6e1101ebc965790569c748271f3523b123aea8061b830df60000021c000000b0165483cade72cff92ad9268d39277d2acb7ca16f0be32c39a3f0d9dd552ac3f2408f3c781e0856754d5ed3a2923e0cca2e167cbc3e1279f2bf01341f5c90f4297fd20723c76d0c1890b9febb991ab31b512c612227012802094a84e9ed7ddb87c9eff3fc6dea7bde19f8441c1c5636502d2aae9b0d13befbb866adfa6bbd7a590ee99d6602c4e38fbe009a268d75f7121962174bbb3cfe83694bb8c77217ae0cd2b2fb553bf9a03ea6de29cedda3f6ee000000b02422c1e28403da617120254c7725b64a3bbf6bb8e64d9ee4f6a6fdbe551408abdf336bb8d522913366256b036abf028addc1dd9eace0698a751df59cf35f5947e8b6fb9fd2aaeb533aa7746f1746b64e78d48a54d1c3c9f46830da2e5b6ecc8b8f4530d6b084a8b1c767c5c0a4a215aa08fe407bba9514b91cbf7078cfb3b0c035583632d6c06a4167058c7fdcc7be892b76fed9077452b37faef77cdd2403318dcdff767a0e9522c8e72a1895e7a5f1000000b026d8e0820b0849488b031d424c10a6e8cc1e5b9b1b9fbb1c4f7d2e530eac93ec0af3ed43842d680a4b2b9761ed72130955ef01bb3bde6cdf1a9ff0320b0246e9498a67fa643f642f16f6bdc6d26969fe0239d26079a8fd0873043bacd21c879bb871c7bc5bc75ea699853d82ca510d471219702122272310e23f403ef208bca44327c09c856a8520a6597bad28d565c4116ec4444b2a176ae16354fb535c1c180e772bc2169e5c4645277f4b47c3c4450000021c000000b01e3f7227c3637bcf2a84f2ac9a65583a19030fdb5e006a496f6765235205d812ae5a7d87cef9910733155131be00b62ecd343dc8a90160a68cc78ae253c57b34722aef3c672e9e472d550c3e0f99817f6bc91619df1eb5eb2b0fc884cb9cb19bef7ba878ab67d26758ea7595bdacd8742e902eb8d743080f602e2a2d83fda535343aea021a5be0388461f74554095de40aaa7770ab3ef48d135408627312a7c2f769d19d83f4f13e2216c30437e22e5e000000b0247e1b93ad56a66f47bd85e3084b7688996597ae0a272f3203d64f54374dc6d0cc6ce1fa42d6501e89c3071f2b07f15b631bcfa5b9710c7ee4938a7578e96beaf980cce73219a0d966253ee322d360bbd29f42943bcdf93fc6f33c4df7b125576d6865bd270f645dfe83dee842cd9a5e05004f8503d4b12abb0cc94e4715c85496ab14af6a67211b3302624ae87f865d1f25e448227b36d99f0bfd7362838347837ae490ca72ba436a49e96c9d6bc123000000b02e72fd1e481aad1d60c4edacd1cb7b45291e441f6bee3a9fc8cb833ffc91b92c2c2f63c8e99b435a3f1dab0dc34336d34517e25920dcde0dbc3edbae9a2798b7335f697ac9ba9154f45f98e7845fc77bf2b84cca209cbc1fe78f249e4f9087fc85c24de3cfa3e80915c654ab03db15692cfd652d4b9cec78dcd53e2b11a271348af584c33e4755719f62714253c652d117e8603dd14d203e725acc2b5ee1aa79e91caf79dd28879afdcad1ce0e2d0a700000021c000000b024bd2a65f1249717cafe44bf601a54e886974ac931895d32a4b7b369c4b06c96dd35c378bd53930a648417ce08ef34c40493ae4e52fa28547c27efdc506208b18142848f751bcae9e8c1eb7a3d0d9f888fab9b4f635fa36aa1448fdbc168795f97c9d81e6b633778bd1be6aee2b21a5f10f0742698bec359c2ae6a209a0bb1e37f426f7e55d4e9c444a53f145232405b1064e62ee13de91ecb054b21df455af4aa7c81058b0138080068f11c78134187000000b028000d932f1d588e7d2a8a86875007f757d2dd2add83691f2db9119dc0de5a80962e5afb7ae16aa8c86c90d8bd482f770334af762c8d9da81000b31a64c5f664fb87bdb5346a208e73da4b31e46633c20d9cce41e680e75b2f45e4387459845e03ed16c65e311cc7631d1fe176225bd72c84b4a80c56523f03029c8fb8c0357b9b133edb650f9bc4056f12c923390a1006056aa18938e422685df0599a0014217f2d0301ebf4cab6a42a9c831e1e4141000000b02ca8b99982a0d3dbffd9a9781b68384fc077ca137f4c4d072715ce2766920e148d288171052f80d83af84f7146cfab72418cdadb2ec91877627be60ff96fc6e67876e6ab65974d0628a65fa6e365f2d5c2975528e741937c381b7ff2b0a7e27833b7718c8141aae2d04876ae5b10dad902c29a2f86bef47146206862b2a69bfaca6f15a9c5bab868d3d7218d54d9095c0631950a0bc341ff30bc3712a615880ea5be2be9884cbde98ca8206531c737450000021c000000b02d3503d4cce95cb21a90373f61ca1588dbfc9787ad78e3b2bc8d613d64d59c7874c16f7618accdbe6618f9e53e9a9034029b5808d7cf48c521521b5d352cf07f2f28416b93573ed8ad5aab9d2e25c8ff720c1643d7a3d2b6f30c851b34b0f75539ed55b879db3b04f64d7181efa7c1f42e2ac38f4d50734278e5d142474b232043fe3699333d761089069cb501db8ac206a01875140c4c058b671ee709f3b2498beafa9f62b36bc11c00aaeacebd14f3000000b01c864cfbb4bc44d771830db333e5f246b53a1ada94771486465f7cd32fc14c00d9defb2a2cb23ac7bc393341b49547541962901ad0e98de877ba9c1764e1da2503899b0a868bcc6c5b6ca7556ac4d75ecda8efd503080934a33e94adeee18158247959f3ffad91469fd83985247e65db2f8de719affd416af1ed5c2cf58aefec0a852e236ba2fe1bbe3a8f0cf7cef6d015da24622a409e465dfb26c6998eb8ecdc5bb54bf823b4cac7fe272af12515a1000000b011093861d90ac1397267599cbd756ec31b4ad3b2b3df3f2a7457e0b28e81243760f6b5479571fd7004d5d48e879d28d085e9429e7558d42a6ff4c1885fb298c3d48bd53b769bc08124ddc453cb05de7d05dee5dd929f7428d5bc6f6522f6a1c0c69ba2539a5fd3206aa592c37df9f229195f0530d8fbdb5bb42fa35dd1fb429a1f3eaa19b17152e7fa2d777e8269dcc01933c2fab084dca70dc030c1c07531505fe55adcd0c7c386131b8c9f6ff355dd0000021c000000b02f1ce0268ff336aaf8171d835a2e4f62b86db5d56c1d32c60fa777d6ab5e0fbd7a2a64334a52cabc36aa0f6c02fa471f49e23f6acd552322f56e11af8e8daf8a6aa3a535a0d3784d62b236e5532418a3ad1326c938ac55cbf5ed86c56d26090ba5108e76f96da374e12146b0728301e70f4eabc218272179249a6cf08ce0bf6f96679b20f19fb944e3e80a7d8298db4719ece4b00039dd61c64c34d96cb28aa3f185e1178af56999212b36b77a1758b3000000b0193c5f7b14bf1fe6987ed7839304811250ed31c42bc7cdbe5b6204a0b2bfd6473a2d4e7adc1434d1d0749103ae0fb69e29b404ad794fd28824d1e1160227894e61d9e5dfb18af11c4c27bd81e22c2dbe0c79c055507b94ae9a8321bdf85d425767cdda075c01de03574731a0923c8b7b2577c5a2e22d6e681b1d5ec0eef1c59280a2cb9ae55752e3a3c4b2e623f0e8570802cf8a3c66ba6ccf35180dfef0246a975918ac5119f39af175278f8884e884000000b03033b27f0c4890c3816e1ebf2ed7c37ce53753b540916593f9e20c38df9124cc85972b2f034e46859f884effdae861102db23384e205de5400e73aa86bafab3906ada9a368e66da6ccfc9362d7f727c74f07dd31c72403a9f25d4b3524dbdbc7301a134d6bf99da381a2e60c4265307a09b6dfc7611d241e5090ef429512b208a22ed764faacdecb7020798a4d6181d02746157d5623a3587f247abe7d0e9e6f9203338dbafbf77e510d74dfde54b8a10000021c000000b01a3b01ed828dc67efaf1c157e1b864b5cd8af662f2f67e8a3998968ae2bc2530a92e37f57fcf0d25c98aa368acef50965ca10b5f1c9d6508e6e615d9cb52dee75b6e66462950c3495073ec700a1f4d59526d9289bfdf145961405ece6cd6026eb97aa415db56a2293f713e36a7735559102bb7aa0ac4fb6a6dea062de2a228a072823b098708bb608e79aff54527ef4603c65e7e9e5a35b0e7782d81c4a077de6364d93fd9863ba1971e0a440a571cb3000000b0004364462f2de9a06a6ec063100e18ebf4204ea0d0957dd9a728c7554357991e1790568607f4f672cb04aee3b7514d6cf70e6f70fdf381749ab0e5a160b5d0273f45593457a3ec9901d18071b533bf75d29d317b93bc762c0dec1107aa441775e8dfb2b160eb818bb4dd3029bd76564c080fa8a33d60c9dbca0201e444c6ad0617652879e6d41b9f09f718c421164f630a0878ee1d918157636fd12408a49fec777bb24164cbb21b5febdd2a521f9b23000000b00727d640a18311f2dff7c7f98fdee05ff301d76bdca05f7590846c022ca257796177c3205d0e0b471e1f6a4fd7137a4d55eee10c89a37107cf26de293fce6258203d5cce92fa853a7258f10b77ac9b51916dfecc3c15abbe7b3a1b17e139d4888fdaec43246197d2098ed33ea9de870430529cf44ae005ff582a2b8dff9f3b6f4e474ffbe939431642958d8e6008ac5b2f636403f99e1e9839633e0925fb53570598941fa95f31138624e57995aa3fb100000fa400000168000000b01025b62054a062bb8f96963c0e39b9de9932c56cf386f2220a51787f0610f999202e2617f008d24c399bf83576becdf0581b87178215aea88e23fc9e172730c9cdf6b18508d8d6297ca035b82f965911ef499a08c54e1c26475e710529f5520c07bf5db76ad000ea2a437af1d3b0bf4026e7c0898f04d84f03944ea3f2ca21956338f14a7b9000c4af734f19160206dd1a0a6ccf0462c90b6a85bd2926ce4fb0fc088f15bfef02ac77f5fbd77e9ee7ba000000b0008733ea5fc7195c7d84e7137bd8a3d8bb01f291aff650098bb63a9da2c9f0a2a201318e165753b31c8f41db308d95d41d948cc0224f7859164044ca72a4b50025be50a17a007c27d3ab9395977fddeb6239908ac3470bd90e5babc6fd02dca205a62cb350cb34ba4495a901cafa42b8146ce68999cc40ce1f01baa0419ce1ca46b4757b7c0157e33eef611f0c338f311b361a8da6bdbbbf77307d0194dcfabed9698cb84078fd4d1bbcc87af1eef50a00000168000000b00d81515e8f7333ad181e1897561c9ba58036556439e12d13a3c6c7639c9721087ce2ef19de8913e751745e06b5d1dcdce59d3c435bfabf15b0abe372fd96d507b4df9ae3e439b2fad4e93774ea300d0195196f8ac7e448d44a6ff699c3558c3535b74a7818aa70cde9dc642700adb3640eeff8e22e60879541db5653616fe34c776fd99343e0fc1449978c5ef57c2d7c1c298131deb5acf75fa3a0ae52cbf4152441489843d0851c2906d3e9f2ad728f000000b0070c863ce3991ef82b248c8d76e043fec034c4c44f5a5bec691159ab905ac830d21a76cd0298ed0574cfe16e6d7111bc3a3a53a0f3fceb4fef61070dda6cadf31f5fc779e68f525f88d499d82fa96e0bf8dee7404950931b9a889bf8945604da9248a8f7c359e1258895d717f9e1c83f1c59e7053248d88e10b52e3237138b94552f78f7a59f1b70980fe302612afee602120b97f805b24565134e196e9d8feb68eeb1fabb398290715292bfa053f28c00000168000000b029e13941548de2d6051e83831e6cb49dc38595c28f98c2addbef49e5d7eea3fecdf14333b23519d2bc85f13ab889c885aca55153ff8db26f63905a02702459137db0f844d6b96c414e2e3806c3f31134474f2c475a30f669ff69c7e9862fb9b582a644745879ed62cb49946006ff48821e1d204c9aac0d33263f0b99d5f6f2631d352a03afb326b774a38a8b3347738113ded5f41a1ce9e33d175a6abb6c7f0e73b840ff1e96b5ec3417a6f7754eec20000000b0091d32305e60f345d7cc10d50a194bb4ad47336531dcffe919ba174db3bf7e6f024e857cde107b145fce75f8886e9fcb62e288a50a47a10644e7ab8972576baff0e0df1bdbaa1e05236062f87cf41dfd81db649ffe8a1c5778c90b70b4a48b5c90895ca207e903c09789dbc7c48e7b2504eeb572dbbe3d54fabe1036cfed74a8ee6b315f975a6c20ca4fdda67bf220461ff9ffcfe7c8f54d7ec3000f8dfe1fd8024fde5a34eeb73591b7953d37803c1400000168000000b02675c0a0bf19702cd2169daf4ac6402c40b5a8ec2c7f0b99b5793f4f1067045cee1c9e5db795da39feaffae57b86221b3187428273e9fed467b71268777aac5430372d8fec8f2c09bac2d042155e6d152f0cc8874504ebff8fe0f33ca1ab71cc44b6ccf636c8de958e6f693526ed61af19781949223e2f1ce7d0aed58969c4e6c723a520837d8f94067803c0b71a8f7603327f1044699ee9d2a8ab36e14be8d7fb9cff66ffc39d37f12261d199758036000000b0228d93ccb2b08dd9c42a706184774595514a460f780f5a3cd0536df742d4cf9ab8b1a8f96cdacfb7d09bc75b4086165a16df84f077ee1cc5e44bc966efde59a7edfbff18d879262e7db290ae0e47c36d95ed3bfa275156ac7bc3548aa4506ccdc8d7aa7a04ace3c8ba83eb8ad89919f820be96e238cd6d4562e3b3c349d512cce10607e6ba64cd759107e5e508b0d14f285d2a917eddd74da5f7bb40f0dc9bb2d377519586a875c81d7be07460fe600b00000168000000b002b2796d365bfd58933a2d1958ffb7c03e52334a84bda8f407bb45f9f1795421bb19d9caa36f3826fa6b477c1bbab5148688c7c4fdf13eb697da85e2916741b67b5dad529f1c2120efd14dba56757a1e2bc35f5f40ef684b937acfc54f349d59a9265fa1dc3becdd895b78d31e7b89a60ebb448c078c5de09a95fa20858d95e50f08da97916252bef97f8d269e69ee9f0ee2aac70431feed7c541edeea9536284be9ed6caa35792beef346738820cfaa000000b001f6042832f24c51376bf79ff97bb572bd3121ae7422ff8a62b5251d27df9fe5276070f3c785b815cfaf5969e3069f2d7643d047c31a7605430c257e12e6081f97270d59713b7d89cc7fe28ef22397c8963e4d2dcb429e3ee65e621962a4eac66040756455f5d5fe5771977e53e6013e21469f52739565c775e9cbe65ad722df9da814c05a546838e2983aad0f1480352cec891e08d15ad6506d7c740197a7bc7c6959800feeb6ec88e2e8ebdb5d2f6c00000168000000b006ca575cab809c00d8f777d46c7710cf67c26b3f8729adc62b5a5d574b83652f153c07045bc7253fe11f2e0f79bdc7a2eff85acd1ec3430f59bf678549f8f0be844eea6bb09ccd885cefb5bab3584b1873c0e7421bca7e95b331d9822a18f80de43bc280c62a6402ca0747dd7fb1389e12ceebdf80a6994d57cc936584b0807f34a8fb90fcb622af545b489f2b3ff95010623eb3e09afb6a4b6da80a17c0d1d5d9ca05fe701327c5372bf8ec12245024000000b00b29cf4b03fded2298d5a76488f0b0775e2fda5641d4236797435b631b1597375c25babde14100b55f0c439a510286b7947030a10ad65ed025c40a8df590c10adfa82927a029e470421d6db38b52696a99fc87755158852e184e9bc21650e1566588696d8bea8d5cdc69266fa32a61de0fcbb5f1cdb7237fd60901d153b46ca627f7d1c121fd749c67140e098da6fdcd1c07a9052d21d26b7a2ed4a7b359eece06ddd5988f412392e53ae5773d0fd98a00000168000000b003599477d3896bd7bedc1abf16e5e0a16814a9fe43adf7ee650ca48f508abc5b8b947a517cc5075980aba76a5a68a85e30820334350d18bc458cc624cd2851c6ae9b40747721150cb2f846429d1ceb9a5f97bc1b713f566bba9761e47964e9ffdd19b33a563ac505418f2d8fbf2a03a31b5154b322a6550aa7e597690ac48056dbf019ea13cdb4b67271f972e39885061a02d9e272d33e16be17f819f0b3d010351276d2108b9de499ed885b42de5633000000b0091cf19cb865e1dcec874d2da0b3279bdbffcbd124ab88aadace5d187c7ffd0671467dcfd4b776be572771b267f2e62159e8fa8721632f51b6629c41a1a679f6bfd6fa36b95b661633407a188290c557469549901f7b9ee827031c54526ac5cdceb3038b43a46825ef9a1be6aa82e9e209361356b98b6f7957df31efd48a95257547d4456e8c1e975c093c0601b826f92770ed6e1dabf88e210722e78d229c73a9759c0e858699ff51645f287735cea600000168000000b013b4f4678dd21a30d9f2ca1916511e7116496fe3345fb92dd5643bdf1db76d50db8e1551201bb2b6d85b94e5a1b3508e2f8ef86ff915fe415c348eadae7622fc64f518cac7bbb24e195a80efe0f54ebbfcbc83150039ae0b31cd3525edf0b409126165735a492d4852214e068ececf1e0d01ce461dcc3af32008a84621dae8208922d7f2bcb7bd83c2358722db8645cd1010fe6277edc78dd2e9790c94c55b9d0cb886cbb9ca6d025ba7641a9b3f3ade000000b018a7f661cb64c636ee30c9c371a764a3f80e657fb14d087d58c1dab506944853924543dbf38e68b579d1efef7f28e61991c763a9c4e8389def1555c264091c1d142ad41bdfe5a119287a076b70d2e4046dc4dbc8204ecc6cdd1f7e285a89c54054c0748af4cc9ab10ba54fb1da3e78ee0ddbf0b52ee9c624859e55a298b1f7314b971de0922f1b127844744720f4a6ff0194ce9f6145f4a40a3a19c55a05cef8ad36641b8ba4905ba5a77eba07cd37b400000168000000b02c4e340ef4edfb799826a5b8e449efaa65a0c31d84df572101b0cc5c348374e7516bcbd027a160563e725d188c6238969dda734281ec81082cdf53a6ca0a92babfe4766dd50b497c69a7dbc407d482ca714a117948f4372d2ce53643de88f7127b646e4d944efaa56a61758d6a9ee3461b4469fd99bb6f408f84f657be85a8f553da9fc8a1fddb1f7bd8137238023180036e2a1423d1083b2ea849e245e57fef533d1302fe76a709b23b9423f2114305000000b02e639458bcd5beaf682cf7777977b2bf4804d8fa1fa9ba300aaa4206add43d38553e03d645d32e0309823a2841b3c5b062c57443e649036fe3e4cf0e713fc9c94764acc7b987a41c1d91c3f3d02bbdf25aa807f9bb721f8b6a6929e953b7ec6c8c339e2c24797007d46f6b5dfc6c5a5f04f972eed9b4f081cd0659d65dcffcd197a79a6f60179814fef45f0a3818ecae2a9961059b4a1a5b9a969b2edda8590fd0f92d460c691642c6c47e6a0d61837000000168000000b00dbadd9e9f6729f491a2b26a2fb65b62e6b9de8eb6160e599da4eea8284d094ef3acdea12d08a2b9e3fd5ca9d8fb7825bb52f9c1ff82e8b2304b1909df9030e7ff71dd71e4eafd79c66fccea1a46e88ccc5e92bb2f1a113db7f5617a107f47f11e7f712d4a84080bc9b37716513e530e206d975ff2ec276c2f91c82e7b9e4ded3a3459423e30d6dc0d99b8b0c7698e870025d23fe863b48f676208e39c6a0f05d466edc78baa622aad1dfb8e42082487000000b02620ec53f2b876a2bab2acd8ee08f0be7623f51e74da90600a87780aa88790599cbe1a13fd7f6c1f845ccce8b3d9c20c9c15b6ff9100e5d4404d49610964bd3f036bff0d9bbc0c776bb0d241598060b57528038748def77031e2c062dcc86cd57f5a22c6a7bb241240b1e2ff8cb8060126ca27cddf485fd5f4b27a260541023df75f56d2f79d6ca4d226afee7e439a3d1976a0584dae2259506dd9e607061ab2769054bd6998d548d8375caff3bcad2c00000168000000b0083bec20b167b79f445aaffa47873be161b3d27539d4af3c055e78f9311b8ba0541578134cf6286bb56e346a18347a48b07f60bc785d211f735cc5631a7f5794d7c227a21336ff14300d164d2213a629b39d17978eb2d61fef27ebd5820aadd77a0579e846c3327a49eee7cd2b4e34be0dbc527622a9c77aaf8e54955ba6fd7776fcac362eeb58891a6d908e2032bd7e18b50a966ade9700fc802eb438ee8ec812ec25546ee726e7cec4703ffbeeff32000000b017348eb4f9fb8a0ff1f035c91c0da3a49547ccb5aa6ffa5084ddb0fa09d443f5753a907132cb1beac6a2befedac1f8ef77bc83be9d5074d9ac2bb01a07577106e4f5958ac96a66300f98ec7f381478f662dbfdc7ff77679e4bc06084811d960f13276675aaf560175fddd08fe79788a0012cb10db47eb964254d04ca35de823882a00c06424ea4a23bf064c86edf81b52862d75e05f88f65f507b5cf30fb938016dd570b70493bb77a48a93ec757183f", - "txsEffectsHash": "0x96d6dd6caa42f221143e36451601ea093b69d59d2cf21ef49822ed185f9b8e9e", + "archive": "0x0906ec56c4b26551de28a357993a893da99366977732263a996dd928bd232fba", + "body": "0x00000010151de48ca3efbae39f180fe00b8f472ec9f25be10b4f283a87c6d7839353703914c2ea9dedf77698d4afe23bc663263eed0bf9aa3a8b17d9b74812f185610f9e1570cc6641699e3ae87fa258d80a6d853f7b8ccb211dc244d017e2ca6530f8a12806c860af67e9cd50000378411b8c4c4db172ceb2daa862b259b689ccbdc1e005f140c7c95624c8006774279a01ec1ea88617999e4fe6997b6576c4e1c7395a22048b96b586596bd740d0402e15f5577f7ceb5496b65aafc6d89d7c3b34924b0c3f2d50d16279970d682cada30bfa6b29bc0bac0ee2389f6a0444853eccaa932b2a60561da46a58569d71044a84c639e7f88429826e5622581536eb906d9cdd25a2c0a76f7da6924e10751c755227d2535f4ad258b984e78f9f452a853c52300e212d8e2069e4254d81af07744bcbb81121a38f0e2dbed69a523d3fbf85b75c287ca6f33aadbac2e4f058e05924c140d7895a6ed167caf804b710d2ae3ba62b1b51297b3ea37637af6bd56cf33425d95cc5c96e9c2ee3077322fbec86a0c7f32c15d2a888c6cc122e99478c92470a1311635142d82ad7ae67410beeef4ae31f0902ba2fb964922a4610bb18901f7b923885c1d034da5769a48203ae6f0206a92855e2c01ddb3d6553386b5580d681b8230fa4062948668f834f23e0636eaff70aaa64519aafdf4b040bd2f9836e76b9dc13cfec8065dcdf2834d786e06260d100000004380000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000014100000000000000000000000000000000000000000000000000000000000001420000000000000000000000000000000000000000000000000000000000000143000000000000000000000000000000000000000000000000000000000000014400000000000000000000000000000000000000000000000000000000000001450000000000000000000000000000000000000000000000000000000000000146000000000000000000000000000000000000000000000000000000000000014700000000000000000000000000000000000000000000000000000000000001480000000000000000000000000000000000000000000000000000000000000149000000000000000000000000000000000000000000000000000000000000014a000000000000000000000000000000000000000000000000000000000000014b000000000000000000000000000000000000000000000000000000000000014c000000000000000000000000000000000000000000000000000000000000014d000000000000000000000000000000000000000000000000000000000000014e000000000000000000000000000000000000000000000000000000000000014f0000000000000000000000000000000000000000000000000000000000000150000000000000000000000000000000000000000000000000000000000000015100000000000000000000000000000000000000000000000000000000000001520000000000000000000000000000000000000000000000000000000000000153000000000000000000000000000000000000000000000000000000000000015400000000000000000000000000000000000000000000000000000000000001550000000000000000000000000000000000000000000000000000000000000156000000000000000000000000000000000000000000000000000000000000015700000000000000000000000000000000000000000000000000000000000001580000000000000000000000000000000000000000000000000000000000000159000000000000000000000000000000000000000000000000000000000000015a000000000000000000000000000000000000000000000000000000000000015b000000000000000000000000000000000000000000000000000000000000015c000000000000000000000000000000000000000000000000000000000000015d000000000000000000000000000000000000000000000000000000000000015e000000000000000000000000000000000000000000000000000000000000015f0000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000016100000000000000000000000000000000000000000000000000000000000001620000000000000000000000000000000000000000000000000000000000000163000000000000000000000000000000000000000000000000000000000000016400000000000000000000000000000000000000000000000000000000000001650000000000000000000000000000000000000000000000000000000000000166000000000000000000000000000000000000000000000000000000000000016700000000000000000000000000000000000000000000000000000000000001680000000000000000000000000000000000000000000000000000000000000169000000000000000000000000000000000000000000000000000000000000016a000000000000000000000000000000000000000000000000000000000000016b000000000000000000000000000000000000000000000000000000000000016c000000000000000000000000000000000000000000000000000000000000016d000000000000000000000000000000000000000000000000000000000000016e000000000000000000000000000000000000000000000000000000000000016f00000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000171000000000000000000000000000000000000000000000000000000000000017200000000000000000000000000000000000000000000000000000000000001730000000000000000000000000000000000000000000000000000000000000174000000000000000000000000000000000000000000000000000000000000017500000000000000000000000000000000000000000000000000000000000001760000000000000000000000000000000000000000000000000000000000000177370000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000024100000000000000000000000000000000000000000000000000000000000002420000000000000000000000000000000000000000000000000000000000000243000000000000000000000000000000000000000000000000000000000000024400000000000000000000000000000000000000000000000000000000000002450000000000000000000000000000000000000000000000000000000000000246000000000000000000000000000000000000000000000000000000000000024700000000000000000000000000000000000000000000000000000000000002480000000000000000000000000000000000000000000000000000000000000249000000000000000000000000000000000000000000000000000000000000024a000000000000000000000000000000000000000000000000000000000000024b000000000000000000000000000000000000000000000000000000000000024c000000000000000000000000000000000000000000000000000000000000024d000000000000000000000000000000000000000000000000000000000000024e000000000000000000000000000000000000000000000000000000000000024f0000000000000000000000000000000000000000000000000000000000000250000000000000000000000000000000000000000000000000000000000000025100000000000000000000000000000000000000000000000000000000000002520000000000000000000000000000000000000000000000000000000000000253000000000000000000000000000000000000000000000000000000000000025400000000000000000000000000000000000000000000000000000000000002550000000000000000000000000000000000000000000000000000000000000256000000000000000000000000000000000000000000000000000000000000025700000000000000000000000000000000000000000000000000000000000002580000000000000000000000000000000000000000000000000000000000000259000000000000000000000000000000000000000000000000000000000000025a000000000000000000000000000000000000000000000000000000000000025b000000000000000000000000000000000000000000000000000000000000025c000000000000000000000000000000000000000000000000000000000000025d000000000000000000000000000000000000000000000000000000000000025e000000000000000000000000000000000000000000000000000000000000025f0000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000026100000000000000000000000000000000000000000000000000000000000002620000000000000000000000000000000000000000000000000000000000000263000000000000000000000000000000000000000000000000000000000000026400000000000000000000000000000000000000000000000000000000000002650000000000000000000000000000000000000000000000000000000000000266000000000000000000000000000000000000000000000000000000000000026700000000000000000000000000000000000000000000000000000000000002680000000000000000000000000000000000000000000000000000000000000269000000000000000000000000000000000000000000000000000000000000026a000000000000000000000000000000000000000000000000000000000000026b000000000000000000000000000000000000000000000000000000000000026c000000000000000000000000000000000000000000000000000000000000026d000000000000000000000000000000000000000000000000000000000000026e000000000000000000000000000000000000000000000000000000000000026f00000000000000000000000000000000000000000000000000000000000002700000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000027200000000000000000000000000000000000000000000000000000000000002730000000000000000000000000000000000000000000000000000000000000274000000000000000000000000000000000000000000000000000000000000027500000000000000000000000000000000000000000000000000000000000002760200000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000341100000000000000000000000000000000000000000000000000000000000000540000000000000000000000000000000000000000000000000000000000000054a0000000000000000000000000000000000000000000000000000000000000541000000000000000000000000000000000000000000000000000000000000054b0000000000000000000000000000000000000000000000000000000000000542000000000000000000000000000000000000000000000000000000000000054c0000000000000000000000000000000000000000000000000000000000000543000000000000000000000000000000000000000000000000000000000000054d0000000000000000000000000000000000000000000000000000000000000544000000000000000000000000000000000000000000000000000000000000054e0000000000000000000000000000000000000000000000000000000000000545000000000000000000000000000000000000000000000000000000000000054f00000000000000000000000000000000000000000000000000000000000005460000000000000000000000000000000000000000000000000000000000000550000000000000000000000000000000000000000000000000000000000000054700000000000000000000000000000000000000000000000000000000000005510000000000000000000000000000000000000000000000000000000000000548000000000000000000000000000000000000000000000000000000000000055200000000000000000000000000000000000000000000000000000000000005490000000000000000000000000000000000000000000000000000000000000553000000000000000000000000000000000000000000000000000000000000054a0000000000000000000000000000000000000000000000000000000000000554000000000000000000000000000000000000000000000000000000000000054b0000000000000000000000000000000000000000000000000000000000000555000000000000000000000000000000000000000000000000000000000000054c0000000000000000000000000000000000000000000000000000000000000556000000000000000000000000000000000000000000000000000000000000054d0000000000000000000000000000000000000000000000000000000000000557000000000000000000000000000000000000000000000000000000000000054e0000000000000000000000000000000000000000000000000000000000000558000000000000000000000000000000000000000000000000000000000000054f0000000000000000000000000000000000000000000000000000000000000559000011000000021c000000b01a5568558c12530da31799aa88c869ca032222166bc108860f6811683ea22f4f39b931529fc806daa67640ffb924d9780172bc7552300b5daa3844337d8d6fe72803872afd995690e66e60754811dbed7e92f45bbca263a00ccf7177fac6cc90bbc65bdc1d1eeaf82eb1b3466b536f1b0b97f3fb0b650851fb1f4cde5ef303d689a0de66a799b5dfdbb86483dbc5a7070fc810b52aa50729d8e85d6ddce7f28e75444e6c22b26b31d75f075f51ae8a63000000b000c26f7e694358457ebad64680f0520aa891119ef7788ccb76618a48ff13b21a94be66c30931eb69eeec76ab6cd4d44e71e20fabd663210ef6da9110df68c310d4cf2103d896c3e39ea25d2f10d91518a64f85b0d34e52db7214bedaf639a8ca9d4509fd4c8f5fa4177720bf460d892b1c25dc28d946c99b374aa251947cfd89e08947a6396963a9d627e1dfee30eef802d3307ced1b67402a7e8c17c6f3953909fde0abb7c25bd5ae0065455d5e5c8c000000b01a39502351a62e09c4054fd038dcc9b4e2ca809e059a5891b9120c1f97088363a15f27593d63fb63bb5ddae21b3dd4c413957754d1253b313bf9aedcbc3f29c8464c3314a0bb2784994e87e1ada171a34aa02069a4d8361b7b4626fc3367c421bf85c685463faef18a400ded6ff81c12162ceaffbcfa555d62180e6ec59739a07d0546d107ef07d5c04fde75e6d0b3641b620da8863012d7e38c68ec3d6bd0049c1d6b4f8115e2ce3daf3124437c143c0000021c000000b0295919cb2a8fb7184356130b60ca4342f4ef90311b9656cd07a11443e261b6ed0abff9099e9d4116de3d89d806b38216267fd032d95b9540c7e47a07066a0f10bb8646803942f53f46d7f8668d02d0491fe25dbfde564e152e6e4b3007351038ea79547010a0f5b7bcd76d60bd94d9d522c5ee7fb5673442f2badc2a22157f0c6d68507ddb3636cb4f8fa65d7c5d2fd113898f5e80d0b48db0696e7fae2c7714389cb349523937632a69f863cd18df3c000000b02ee2ecda6910d9e71379853e825f688b96e1b0d794b9fd8c51f688eeef326406ecbd969d5a538d3b1283fa9c83d569090189889555b58961a7dfae7790c2b002404739a5c02d2907125c8d6c779ed1d2efd0a5b0f26bf85521be64837cdfbad95d8049cb5890906dcb99843b202f65e510e989a3a22951485bf7d186d345f3d468067deb077669ce1958b8a22e843d5f1de8703d0ac4ea1d2e9d7c1da0ee099a22f990d2cef9e7c9526044bb747ac199000000b00645d668b18af55d7b2529011743650140e6e1d583f49a8de9eb3d3b89d283cf26571a20ac490d4ddc4c872b5faa568568538dcff8ec068d2d0296de107a71a811864065ea1060320ed401f5a8febdd1dba1fb177003c56081d9ee4f17948ed7348681cd51c06198377769ee1d68afa42ce51af6248e963e8e8e86d7f24e5472341c1351fd59fa7f9e5207c3d6e9519527ba1b1837c6e665d4b34b34121c6c5a8ed74a475c6a16955ee9e668467cef3d0000021c000000b00d0932f4c988acdd1b78cfcd566b6c167fa6de5560e351e5b81202d8ae867956d93287b9e988be11a72f830d40d6dc0639a78b8f86b83103f4084fbf009cc469337aa0188ba8ffaf895927fc33b34362087de4a5ffe82a14bc59b23e47cc64c2d65dc59d7a50be54e9c500af1dc1bc930b52a49d2ea4df3e9c845f376250ad98be8cf9205fc1a4cd52ef26b0e8bdf0ec29457264e0962bff8ba5c0a94e611034bd6f9ec8a10b44f90aba042c59917254000000b02883646d2dd6a4cf34b39b65c59da91588e3953642868292367894af8f06206c5a744ed832f8cc6dea898e5ebb8320c13b7ebf038d6cf4b0bfc0d816224a387feffd62811b7801e6d205fa3a89f38e054984f971baa16c45773a9de518f01bf7cbd717aeaf81cdfc4e7b5738a1ce7e3b1177fbc13344e5662aa58056414a37841fa4776279a4cf488890964248aeee340018f58d80c44afd9f639cdff4d81fadfcb1d097a97b6bb22ff32bf4bd6822ae000000b01544a9eaa63352f92e07dba2eb7ed3ddc15a57d716f29e56cd996284690df7f48eaa31b2c3ac8ef4c2c505263718cac51cc0b0ac1ecc6006921b660f3a77407d322db7af97bdff2b86a74258739145308ddcc641f2181b116c5e5a6e70c75f4038fac614b56603769a5090c301bb4ecd234c0864af10bc906bb5ae28eb893b3d1a20a7bd3b5b556367480d20cb36bc2901dcd6f4170dc46272404948fc51142b593e42544ff35b9f8ca091163fe6fc460000021c000000b02979dc27bfc5121a9b1c62b2c3eae5aa19237909a3e937524d05a98c838fc7d5c175367a4dedc09661cc38c8518b09444e36a2c96706459868316814b6d023b9d10eefb529f49d500dfbf526461dcea9af6cc54a78ae62cb9a9cf73cf2900244d95834d6194277b48c3dc11e1dd64edd0065088a3f7d6c03e404a7f6b500d2eecc894651872c4714952eda1502f512cd133c0ea809fb7152dc8338f79feb749a0ef64be9c13752752e2d719fc79fb3cb000000b00158816d22fa520231393b1bde4d24d6f6417263c40dafc70e371951f4ea629d1bc9aea38603ebd47bf478cb86e413e0bc74dcf44423b86878a8655724ef9cfb06f6f5216c2a56f3483b40067c7ee5d12cc3b2b89b944f01d122c202b9c6afaca588b523a7c8e617ddb0271225469f061f3d14724e45ca1d33f49d3d69a909f8b4242cd50e22a30ec4f58d42160e704116ed831f75b50267eb485606e0e66962bedb4ec5be3208e68f7bff60bfe55150000000b00dcde2ca2a7ecd3764a65ba5b37802c1b92e844412340fbcce08c402affb1424aca56ff63db2ce654dd9ad9c766cb6cc772dbfc253f2448fe6e27ba68e86fff2ae320fae8b08e192872a5bde4201cdb3dd0b3a703d52b50a5b3c8d086894ee7d28ef1ab51109e49be12ec06a69ae7f6727b830255ceb30b7d7474b0354dbeb7e7adabe079775abc9290d6fc4c2a3c03e2681c7d50563c64e09d5fd354b56098a1850b84cd521f8a7b1c42cfc485f8dda0000021c000000b0215fd22ba7b99075370219dce247f9c7b234c14cdc5917232d360557937e4016722ee2d383b03f8f814720b01da02fac6b8ad1e4414b7829f115d6a522065dec46f2414516675dab0511ee03ccee700d52486724b7db90012e2b7adc19ffd43a631b3335cb92f86d4531aad9be85a281051fc0483022b3df4caee0538fb1882517ccabe814a18a4fd7262ac195a14abd27bb74d9dadbed6bff555f8d69cfd1b2b28a07c7475d011f30a168ea65477947000000b017cccb424a8f9fc1e0bb8d18368ed51d56ded42e7698eaba8cb8f33239c91a14e6cc075d25aece387e32a4d36fa8e0fb236c3a856e8e4c1be56e89e4453d847eeb1a73a4a50b217159202a8d59e331d36bfe761b2694a79994f9c7d3635318b3658324e154d749961d9f43799756838201305cf00216e778f655e16c9283fce5af1d4e304a489994fa6c57bf0eb9e99208f013d58b2799de2d04a57e283a47a7cc32d98eb3dba49dfbadee8cf62c7b46000000b0109e957b39080c8bb69d6ae4c9fa9e39df8325e109b3ac57f913ee2ceaa499549dbe55c410cfc7f75825f052776e97df0df784602f9f1eb46d232a7c397b21b78b762e341c5bc928fb6f8a774bce30dd298783922435c4d5f9f1569b133b5fca84cf3f78ecf2985f730bbf44513d7a9811f672a057822575d675282ac7e8f8d5ea15f64b4be6e44e4e9faf5bea03d1cc1efe88bf1a564f3ba4e4be4841c2da0b9967e8db3459d9cce8b8eaabda8438630000021c000000b02242ce84431ddfbb9bed8a1c490a8ffdc7e8082e9fe48767a1ecb85153f137701c1883b17e8da1183e7d169d0c95ffdc6d156d9cc336192412adf771648ae74015794f03b09b7e714586fd9aaa261b302de8461681adc47a4cd62ab2f448c6b5a7e4e8021e3d3f2d6d47199a8a9cec5f28f9f90fa6ce970eeacab31911c5fcc7e736e961d7f3bf52ac8f81e6c626e3a407f511569068bc37cd2022b30bb07f189a621c5afa0ca3d38dea20df474a7513000000b0176083ba9d702ff813d58ae969a244fb5ddf4fbcfebe958fcca2ab9cc519b4f19321e5947c907de087f1962e285cc1997bd64f26a4dd570d11f05b6d5eaa0b7b5b1cd648b767e03f9da9a370a45c04c4fcfde5dda4e91c52e23b2b74917a7c54d962aa00d8aa4009e5f5894291ab245124dca69335a1e4deb5d2261374277f80d80cde1cb3efcd5cba147b87db7e48662bc3bab63482724ebdc290bd56d899a446e45edf7ff6cb500fc7c42c20c5a76b000000b012f7dda46a5455a27435ddc17e28ed68b2b453b535bea9951103c653532eca3f1482d33e12c338543b66434b9cfa97d7258dd4649e4bab6477eb0bc495629f63505d4f2cac9db65f7b26dc550cc078b5557e2fd7c16944ee32817cd01360068e1f48041f42ee58cc1433a7f728e528270be336b184013ecd3e6a9864c064fb4dc6bc04fbf8343132a65f993c23a1905f155a5e27ea21a532d181dfbc0fbbb98b4350259e1a959606848dd8e3913fe9b10000021c000000b0087fa6bb44faf0e4adf6c2f94ba12e825c76b0349fdd8f35abbd5bb2acfc8fd080d08c9e7cfdc807254d34a562434e746fc44a2d1d9108b5f27c60f4d71e030f1c64aaaf8a7faccf3db38bded6e00b56dd09854b2778d070d236adeb799b0f9c95ab733a13924693a8e8f8d691e7e5a51816173878716b95a6e01a8ac83be643704a7fc46fb53a1008ec9bd84d4e4ff0160e960cddd01b8307610a7d58907e46196cb55fe01f74e8ae7f0ea0a02bd8a5000000b00ab73e1ee85dc9dd35a66a0c11cd1835f01693398fd642891ac397de22cb69d611eddada0025f62ae14441af47730e8909f206c91ae33864714abb5c8cc4ecb25f59bc9b780e7b40a0395dc06623618c4885677ace7d05cc262ae99f0fa96d2b8ff4c37674bc4c415e9048ca9ccb31980ae21fff96735d2fa6d52a4e6d495c8ee3c18f5b597fcd305c01304222bff41816cc3464d8e8edc278b59186f33101898918e31d2e8a290ef7a0d163d84ab5cb000000b02ae3d1db0a0cc3035c6f57c054627fb7fc997b8f097ac5369fbdad51317120ddb6a5190684b6e9f50d1ab7715c7dffba029baa20ef7f7b97e69a90f15ab6af1f6ccfc001d367d7411790e8b09d767e13a8a679a0bca2d010a6b5009bdbf0b10dca420868de5481c3e16cadfeaa82cfad2c14e0df51d9b897e3f07a4ee20c64e80aa3892defa02605a24ebd43a21570180d0c8e91b356059651a6b2c782302546a44603791a5e788127b9f859461ab77a0000021c000000b00447f275e5c1d0a18fca17c99a9809ebc951d6ad8d8b8aa910edf999c178069fd1db501f29765f7403de7a5516055b48a93ca8d368478add185e6009fd2a53606e4066f8a4b03cf5ee4053acdb973485099edfad97b47a06889a9d1a5a6ebf01ebbf1fde830ef00c35bd7574d479299e03b85cfccabef36df8fc40128409c029413c98ce2a715e900c804e050cbc96ad2e7c8237f7bdaab5ca389962be8482e62b12b0ebb9e24dd6d122c6d697314abf000000b00912ff270c000e6867fe3aa3b49cf2b91ada813dc5949709361cf45390ea436aff8a13bd48c1c18fab2979da9eece6edae35390e73e344d565e6f14dc90b36066a59edffab3ffb0ddfa6e5aa5cee3145ea806ca59b1a79f5ea63efc993e9673b54dbe14a65c73f7002081c439ceb63fa0910f281536433c9daca6e2f139cb10693db9fae024e78c7008316258880c8b22ca5ad798eab727600b6a72f41ac6a6c267186b9dc5ab883e1ebbc399fd53820000000b02116c7fbbe2babbbd515d152e6abe084c0b2b6ee8bc8ca9358c5ab884f533f333697d45868a8eb589273fe1b32a4c1778f93b75176616130f0e8ae5404660f813caea57337d5f9b0d416c811f79ee99a4f3e948dbd9f0c6b8940773d6d64ae361a60f8d0ef78d42c8ccc01490417201b0b0087f47cea8e6d0787a90e9aa0753cb9f0306f4b67c7cf2601f2d561a6fec415a10675552041e81f14e1dbd8cc37fb64f79519f879a6eaf5535369150b6c8b00000fa400000168000000b0044389cc8dcf3d6348524ea264445e043eb548dc44808512893d7251501f61f683a661b49d995ea8dc61648800b50655c20ad3f2c6d638b0bbfeafd34685b3567f5617ab56f3eb9c978e2bc520695edb90d7062b02ae30738c4e6369a5e11b93c3268d46f8503bb609f9b5edc017b7b8173b7ef48eb50538bdc5892c733d4ad6b16089291a2ba06bc6dfba96981eca22216401df580e34f6023f6c84548137cd7aab076361e4d1a36e639867095e0965000000b027cbc7b6ed8e3fcf44579f7e0b4cb0a09cc7b10e07a646ac0cf1dd6f5be6692569e83310be29c9fb164f261cfcd109b130f5b3600ceae3420148fa1625e2cf84b13035bfbe7adfa5930fbfd1ceb0ac68a52dd77f0ccadf894550919b1def5e812065fe3a97a1521656ed192a3239e1710ac774ac64142e7193937e87d877af4b2f369d4e8651052d2670a4cf6c48709306b99cfc5f5bb67d679d8d1d9231a9b36919bbea0c2b4e21cd1bf07cbc5f9a3b00000168000000b0155efcfb94071c840d1cc0af0e51b153e5a6210ee3141fb1597377ea320e74001fc6db79f4e8a7e1bd57a089143b9badd04c7d89025b7c20947ddc9c62af7a9b7f561c07c16d9427c0fc27d7fa43574b7fe3818f917d97ba65d20e6eebfbe02b05d122c1a9c6844c76eec3e8865bd5930fdab60d4ccc357aec664f9cb92cd1be9564adc9b229240b6b10d3785c623c6d1961eded46f5bd56992ba5764fa7f06013b97d684db809e62c2380b30254e0e3000000b01eed34a3547661edfe0399e0030c8c29daa3226059e371f50c41afcce40becbff42c32b558e3529795230f6f3082131d75ea383f5df387112b6ed6383c58a5727d86087ed14fd5eca548dd46a19a01ec9d4979f747d2bd6c0bbfc466fa91dc2c7e4b5564ad2705b190437444351b040002b8469f608c07b1e7bdfa105c92bbeb9fb2072408d0944cd7d2e203a5cd7d7709410a42c09780d254bb15deaf4a4ca0f3ecf8d6d96afdd2cb373afe93a8ec1d00000168000000b00c1a07f1940179af2aed89f43def74322b67fef29c7dd1e8cd0d932c2c84dafcec55f63a727a544500d886f0fec4d7563c0f1f5ac79cdc6adda98fd4f3696641cf34baa4c42fdee50b4f76e9651829c6ceaab93f2c0ec650486d7a7fd3736754606ec6016c50b7ec031adf60a812bd0307742ac003f927ef04204f0db6695156a52c17d664ed2009d0f2d5d6e5928492149879cf90d926d9b9822d7bcaae3a1fd063c066df40eb7f96994f5dbe070cc5000000b012851a6b29e839538be0360dcfe52bd0a4252a5630c8406b7d32492a444b55e635e986d3ffedcf083003745dd643f13046ca0ccacd9fe93843d46b1063cfa9787be6b88ff1cc815edb513185821922e1872cdc9ecf486f83f86df4fa49fa2688d5ac048d9d9013158416246e41aa023728593408cc660cb5896ef694d4c30bdb3982599286e655e065f8567f7ff19c05270859a1e667fe6d01d7240fdfcd21d3a3573a10672bc6292b1382cde7671ebd00000168000000b01ba847254f1a3ba4f275ccce9764ff3d8be1161e42f5335de8523dce0eebd4b6effe16c244e517d1d95272bf915ce7841540843a4552b9e8ed2d884bdc71389c0b8bbc53daaa7e2e3fd02927979d681be6272020ee57326e42ee380c530577f3f9b6f7ed47b37e275de608b1adb3f9502b8bc7183588d913c4804bebc8b9ba7f040f3e1727b0d55958b7d128a8fbe5631e278b86f9b06a5ade93cc1e010bd90b508417a7b73d0bb0f82c6a2b3c35e953000000b0276a33ea28f0b9c977c266e32090bd55c4c9aae4029d72861ea436965029da6083bf372d9ee913cc5cfd307b312baabf3cf1624d2ec4ad63fd028f26886dbe9230307f59e7fe3ef1a2cc9622ca8427b1dbaf7e97127956f9ee017d2a79efb5972d0242786b0c2a9d7813be5223c745e22b927915f1cea90ae558d9e0d9ed4a064a89f5993dd209a95fa9156998f509161ad895e68ee32a4200b4311899f1d72425bfeb9120538640b6f55635c877cf1200000168000000b0195e6f16f14e98308c3ebb08b80e89b70d9b71d864ddc3213454500980219e5fdfdf533a89f8999223c5c7d082b54e2c5c0d98aa10c596c20be6d82b3ab3db91538b23965825dce3ca1b59653fb5ba7f4971dec683be78c764c5580e04b6ab3712a31f1a850f197464357e9ea89c2df6079c82c0f0a6a6e052c9102b829bf0cf676a1d34a7cea3a9704cbf41d574999326614ddbd28e78178b0d267b2d1e25461b80ddaa80420af93fa42a51a10a8b59000000b019279468a7ae0584b6b5ae253516a5e88b9228365ac497e6402511eeb4c00c9e3e21141798c081b47c5a778872fced9961c8d7aa055eceba002d9ec8f69a294f1b5247e959a33a939a4b5b6ca2478ffa4a72bf1002158bc0973f4027a405b4a275e3163af5f43188ee37a58115a5159108dce88b108d15b77f5bbf306b01b9d921f6310bb0b76d9c90bc32fc73299b532f1f6875e880c9c6f1e1a1c85473b7682d1bef34aeb08e9706452bf8a65f523e00000168000000b020c20c343d86d8196bb550d076517e50b991ed7a05aba59093a15c8484956b8838686c71b54f2aa5395146fc829073b7c40b12bc3864dcf31c66ea8c10d436e027523427acfe13b34bdb4c583d9a42b5184ca52ed2e8d60b6319b9e25ec8edf286c4b0e5bd27b62d7e21ca95559fc6ff2cd8f4d6c6acfce0d538b9a33e4784844c0659847098e1b5947732c82d9fb04725493139748613d8d1dcfe59e069556ff498a58fa3c1ec9e7e3959c4937fdbd6000000b016acf374b1f51a9c4721c36605e8bff3fefcfb46cd0415271acf9b1200164a4d7d0168939ecf4df91f9e6b7025c8d4b2e063bf2e6e6b432c1542f1482f18b34511036b4cc38cf9fac723536f2a8c16d92cbdccbb714daa16bf8fbd69bcb0a69d1a7c96e9ca1b0cd714b95dd12eb020100d984b949463df584f209f649362a18a548d04044c57d6f59533886c98c9ad1507f274c2df78531196f455e5f1b4915307c79887199db28a7acbef65cec063dd00000168000000b025c816dadd113d871bd93144f564e0de51717ed7ed3a708183408fbc00793492c0c309f93fb14d5198a247cc74921f2f87cfa62b09b0feaa63f7d1d89c0cc4dac2f6a6b735dc3f6de4926c7491f36969510e9497d40678b4b0e617926132346e421a6df1f0a0e88146ff877f1f32ec53137a3085f1c38b0e672a41768b76b399f0df964ff392107d2cd128c852c51630132c63e22eee655505b173903d81764fff34828c0cd771cd335e2af11bfe9eb8000000b01c5044d896a7f1d9f5cfe004ff5bc3513ce5f4a0940cdaf3b98fd1612d2702a796e8354b2afbb45758ec3cb56217e6ea7297b9c9e21fb6b9e194b66465c686c9682cc9a379fc17daf8698cc1ae3dc1a7a16bd058a55f5f1d27bc7e83e708768cc3774f43ff30ceb00551a01717f10bf601d1f38080a88fe5b2fabc2b503d5c46511edbc5b24402d011bf5e9913c796ad05e4570a9aa6c73187cd4a99c1ed8de96f2f773c8949c4816956457a0d333c7200000168000000b0280c253972d8bf40f92930c202c3933b01975956111307da311b4b036fe2d1574157ad312aa08c6c5f61e8489557ccafe3b8eacd4b35e6995a259800932d4284bcf9020fe300999c1b7c925037092f28a2d34bf8e6c023fa71bf7988584270e643b34ee02d7b9eada2f294ab3360ddd11085c5fca5614b4eda9365e65ab46dc6ae02ee1fc284504ad59e38986e62aef81e34b1ec759f11ef88beb1d3077968bff2a7644f00045665b1de9153a2f921af000000b004b54d25a215b801ddaaf3cf79ff40d8fa56335c1070544c3b11c580a6f5e506f393c90db78b3e4e9e0e2178d48bddcb9c93d5501412de7f84b96db22ace8b04a9cb1dd15cc0c8ec3eaa19a4f368b074a59520d9fd8bff8633d166ce0fb7a8e8c139f911023fdc99fc4c16f357dc57000f03d528f1ebca620923388a99470b0d8b31ca201549ce78373799da159892c62d25b2ee5b136f88a83063e740cfbc8a682df459c58f9bc30c8d22a378236cec00000168000000b014cfbd81b784ff14e8cbc1d7eb587789167efe215a5228d65f0dda2beb2c60bd4072bea6640165a5a8de537db53d4bd65dd552b7bc28f351a774610aa8104f70d5f3aa449340a8103375a9c9dc6bce4380f0604c81f2de931b8076dfb6dd86ea5d04c802def72a07e9c48c6a3df20fdd0b33167b32ae55e3399fb7017830b29cdb4c878a446fb81cb28983019d4531842e90a4e316088fab472c78255b90dadc2e82e332ae267baef71ab7d89ffe122b000000b00d0f03370278ed8812c76872052e048f293d5bf2c52633d392f33f8fe2fe405927e53c92f17f4624c586215e1265bf89004e6ba649509279dbe43e5756f03e76def64550cc47dd6d37a4586bac64eac816c27c18cc01e8e9752f88f1a7d1074eef73fcdb1c4c90f1c860a6f2eaafd0f51ffbede2e83dfe26d81eec2015008f6c064bef21388b587549273dd129c3db00101c96ce957b6c1501f43d8d1936416b734918856a4a8476e93fe31a1f4d616d00000168000000b015d6dc07e6193518d60b1f6c493cd64de7db6706456c951db1490327fc114776200783c8e99afe79894e85602e6239a1324d5cff7adbe732d230f59345f7e2747fbc799613d92657878cae468c6d0e996b0473b4f783a9cd04ccfea3a7decf2994a4dd806afdc0e78332849ff80b8d2f0068f436e2c6c70119045ba0bea2e6a6e6750c571243c8277500b11df57f7ee925cedb4c61172c0bcfa6a66c1a3d557e008fdaaea719859735b028f0b3d8476a000000b016e595a2e0cb056836a9eeb433a31212a8caa46c48a1fb8fb1a7baade1cfde5fde29b8c19db34b7c33a5e53e94eb0c8f85a40975a2ec4b7b49cc8775fdc6cac49888ea4562fe0926633cc9cd993e1530dddd86ed48c4ba5788703cd1ed52f2b63116699fc825c582855941a80023a8281cca34b3e195cc0c01322a551921e2f024911d43dd03d14a06863824d900cfe72724458a2565a6793315972bc707a53bc6a7597313d98abdde7cbe6f07d1ff9100000168000000b01b43dedfe36d7906eac9c76ea2a763f0955e02e54507b290f14064791a4cd1639d66c6bea86ed1c05e6a9b0aa46d163d0d913bdd0c139da417299cb66049d6416d5371ec877bdf1813ecf8097619bbf2452bf7a22b07138f86bece82179ba6da931d76063fa6b20cbd9ee91c1a93b6f315b57d73b329c92d4a3014b3e0d62b3e9bf7dc5933b809c6371cf6aac4a5526c07fdcb281ee48a71792e7dfab762821c66c042e4f7bbbedc0fe9db9ca7112487000000b028e01ab181711e0cdc12b2b39d5e5ffab23facdd821533e3d76e4a769e994dcefb412840e7eba96319dc07e59327b2c92c2272127dd850a122ed420fa22191e440e2c66057f3f7b5bcb78d774b608f3fa3378084d134a0f7a8424494025857a7b922d8e8a77118c8983546f06583ae9918655a8b72d259c9398f742503f97258a6054f63ea85700eb1073615513556df04c948c185e69ceb3c26b17830fbcf626820b4291406bcc983eca24935880315380000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000018100000000000000000000000000000000000000000000000000000000000001820000000000000000000000000000000000000000000000000000000000000183000000000000000000000000000000000000000000000000000000000000018400000000000000000000000000000000000000000000000000000000000001850000000000000000000000000000000000000000000000000000000000000186000000000000000000000000000000000000000000000000000000000000018700000000000000000000000000000000000000000000000000000000000001880000000000000000000000000000000000000000000000000000000000000189000000000000000000000000000000000000000000000000000000000000018a000000000000000000000000000000000000000000000000000000000000018b000000000000000000000000000000000000000000000000000000000000018c000000000000000000000000000000000000000000000000000000000000018d000000000000000000000000000000000000000000000000000000000000018e000000000000000000000000000000000000000000000000000000000000018f0000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000019100000000000000000000000000000000000000000000000000000000000001920000000000000000000000000000000000000000000000000000000000000193000000000000000000000000000000000000000000000000000000000000019400000000000000000000000000000000000000000000000000000000000001950000000000000000000000000000000000000000000000000000000000000196000000000000000000000000000000000000000000000000000000000000019700000000000000000000000000000000000000000000000000000000000001980000000000000000000000000000000000000000000000000000000000000199000000000000000000000000000000000000000000000000000000000000019a000000000000000000000000000000000000000000000000000000000000019b000000000000000000000000000000000000000000000000000000000000019c000000000000000000000000000000000000000000000000000000000000019d000000000000000000000000000000000000000000000000000000000000019e000000000000000000000000000000000000000000000000000000000000019f00000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001a100000000000000000000000000000000000000000000000000000000000001a200000000000000000000000000000000000000000000000000000000000001a300000000000000000000000000000000000000000000000000000000000001a400000000000000000000000000000000000000000000000000000000000001a500000000000000000000000000000000000000000000000000000000000001a600000000000000000000000000000000000000000000000000000000000001a700000000000000000000000000000000000000000000000000000000000001a800000000000000000000000000000000000000000000000000000000000001a900000000000000000000000000000000000000000000000000000000000001aa00000000000000000000000000000000000000000000000000000000000001ab00000000000000000000000000000000000000000000000000000000000001ac00000000000000000000000000000000000000000000000000000000000001ad00000000000000000000000000000000000000000000000000000000000001ae00000000000000000000000000000000000000000000000000000000000001af00000000000000000000000000000000000000000000000000000000000001b000000000000000000000000000000000000000000000000000000000000001b100000000000000000000000000000000000000000000000000000000000001b200000000000000000000000000000000000000000000000000000000000001b300000000000000000000000000000000000000000000000000000000000001b400000000000000000000000000000000000000000000000000000000000001b500000000000000000000000000000000000000000000000000000000000001b600000000000000000000000000000000000000000000000000000000000001b7370000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000028100000000000000000000000000000000000000000000000000000000000002820000000000000000000000000000000000000000000000000000000000000283000000000000000000000000000000000000000000000000000000000000028400000000000000000000000000000000000000000000000000000000000002850000000000000000000000000000000000000000000000000000000000000286000000000000000000000000000000000000000000000000000000000000028700000000000000000000000000000000000000000000000000000000000002880000000000000000000000000000000000000000000000000000000000000289000000000000000000000000000000000000000000000000000000000000028a000000000000000000000000000000000000000000000000000000000000028b000000000000000000000000000000000000000000000000000000000000028c000000000000000000000000000000000000000000000000000000000000028d000000000000000000000000000000000000000000000000000000000000028e000000000000000000000000000000000000000000000000000000000000028f0000000000000000000000000000000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000029100000000000000000000000000000000000000000000000000000000000002920000000000000000000000000000000000000000000000000000000000000293000000000000000000000000000000000000000000000000000000000000029400000000000000000000000000000000000000000000000000000000000002950000000000000000000000000000000000000000000000000000000000000296000000000000000000000000000000000000000000000000000000000000029700000000000000000000000000000000000000000000000000000000000002980000000000000000000000000000000000000000000000000000000000000299000000000000000000000000000000000000000000000000000000000000029a000000000000000000000000000000000000000000000000000000000000029b000000000000000000000000000000000000000000000000000000000000029c000000000000000000000000000000000000000000000000000000000000029d000000000000000000000000000000000000000000000000000000000000029e000000000000000000000000000000000000000000000000000000000000029f00000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002a100000000000000000000000000000000000000000000000000000000000002a200000000000000000000000000000000000000000000000000000000000002a300000000000000000000000000000000000000000000000000000000000002a400000000000000000000000000000000000000000000000000000000000002a500000000000000000000000000000000000000000000000000000000000002a600000000000000000000000000000000000000000000000000000000000002a700000000000000000000000000000000000000000000000000000000000002a800000000000000000000000000000000000000000000000000000000000002a900000000000000000000000000000000000000000000000000000000000002aa00000000000000000000000000000000000000000000000000000000000002ab00000000000000000000000000000000000000000000000000000000000002ac00000000000000000000000000000000000000000000000000000000000002ad00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002af00000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000002b100000000000000000000000000000000000000000000000000000000000002b200000000000000000000000000000000000000000000000000000000000002b300000000000000000000000000000000000000000000000000000000000002b400000000000000000000000000000000000000000000000000000000000002b500000000000000000000000000000000000000000000000000000000000002b60200000000000000000000000000000000000000000000000000000000000003800000000000000000000000000000000000000000000000000000000000000381100000000000000000000000000000000000000000000000000000000000000580000000000000000000000000000000000000000000000000000000000000058a0000000000000000000000000000000000000000000000000000000000000581000000000000000000000000000000000000000000000000000000000000058b0000000000000000000000000000000000000000000000000000000000000582000000000000000000000000000000000000000000000000000000000000058c0000000000000000000000000000000000000000000000000000000000000583000000000000000000000000000000000000000000000000000000000000058d0000000000000000000000000000000000000000000000000000000000000584000000000000000000000000000000000000000000000000000000000000058e0000000000000000000000000000000000000000000000000000000000000585000000000000000000000000000000000000000000000000000000000000058f00000000000000000000000000000000000000000000000000000000000005860000000000000000000000000000000000000000000000000000000000000590000000000000000000000000000000000000000000000000000000000000058700000000000000000000000000000000000000000000000000000000000005910000000000000000000000000000000000000000000000000000000000000588000000000000000000000000000000000000000000000000000000000000059200000000000000000000000000000000000000000000000000000000000005890000000000000000000000000000000000000000000000000000000000000593000000000000000000000000000000000000000000000000000000000000058a0000000000000000000000000000000000000000000000000000000000000594000000000000000000000000000000000000000000000000000000000000058b0000000000000000000000000000000000000000000000000000000000000595000000000000000000000000000000000000000000000000000000000000058c0000000000000000000000000000000000000000000000000000000000000596000000000000000000000000000000000000000000000000000000000000058d0000000000000000000000000000000000000000000000000000000000000597000000000000000000000000000000000000000000000000000000000000058e0000000000000000000000000000000000000000000000000000000000000598000000000000000000000000000000000000000000000000000000000000058f0000000000000000000000000000000000000000000000000000000000000599000011000000021c000000b00591a6c2e0cc57621c6ba62f9003996ec2a0abca0f0e48e0d7f2c31e64fe5bf3914f81930015049cff8097278e6e2bbb491e461049bbfee07b2b1d6763661b2e13c708e0ae1664fb48c7ddcbf36e0bb54e566e5780c543c3e5b8e499ad4a1d19f09f180510d2c5b5b18584b64698ba671d663559c106711f8b368a319504359324bdf96422ce1ae5f173538c41ea5254087a34878e1c7e282f5fc846b9310e9873231d19ed4dd1f6c3d131f95d0263c6000000b02cf8ad6984a7956ad793684b48062ac68f844f9a5e20b6ba35bdc7cd2cf9426e15ca24509967d125b17377aa5598a9a786b231f4ae26c6f51a7248c4a7784b21c7fd92fce191d9fb6b117733ab6e1606521e73a5aa77f45793547088f48ebe8dc9a214f8ef526030b1e7d7adb7f7f0a92433ec5689906dfb789f568eed706d0a3df4f7de2a88c83adece99566346282f0eea86499f1f4337ab0a193f474f21e2b955a4092f80e59918c6ecefed4991b8000000b00c41f784005fca771d1c9cfe7fe49c434f74988fe23949ce9d6e035500069b67e25a5eb27d3658b8baef31384d06ca62fd5f9129aec0a66be801b3154431f005bafa7a976c1716d8e73031770e4fb8d86f3fa41371e4ea88b38a303782b2cc6c8c0caf8f6a4ddda58b509f58b885282b0704392833b1fdc8dd1d64cc5311af330820abad977e5d5e04a8791b724d85fb3011a96c8a3b9ada51d35344f2934e8134ad9f5ad8e4a96d27ffb970726662540000021c000000b007516ab869abd30b8ce814820eafce24b741bd295102e8ad0d5a65b688058a51beb6065e78f8bb311f5435a85af387ed27a6424d51399d40d1a8a11f264bc136e22249cfc2f67e342e0255c8ff86bc95d852ff159f3a03d6442024f19a2a9688a373dc402283cf33877886ef8a5438c214ddc3bad78b277381c39d079b16ba1f099aaaf792c7272aa96ec42fb26751cb13075ffc896900919cc3f6547ff63798307d6ff5340dc03ae4136c7468529031000000b00eb5342f8849a4285e5cfcbf54ef6b54e9c18d979b58e7c388118b77b22bb10604f0c738bfdf935efb2837a483abbb78a052a6d7f935f7e8a81ce1345fe58b0275f36892ac4b89ba6e5dc971c341f9ee297d5ca4fd538dfc786f0a0b14704e78400f234984e865b32c9d26d6d0475dfd14d808b3a77b71f272d0725d1b6d110a7d33176dd8c965332c9329443add6a921d98bef71be5d4810865d2d39f192893d35e3ab2fec680e473d499fd01b663ed000000b017802ea836c5ca0c9f90e176aa45c348d5c04d0503ce588cb6983377fdf0327dd0e48fde6d5cd75102eba2dbb46493bb6edff001cffc2cfcc642e6331766fa06a699eb3fe28ce1a0fa3b7e47f2591591005ddeb5a0e30b3dde152216f0c7458494dd7ce1e30ee20f7e101d01efcbcf34186b2865d9fbb907f89492659c5789f2671f85cd684eec03883b26c79de37c720067ad5be0cae41e7b0144a9d928954a95517127936d91aa34cb822a6b7adce20000021c000000b005e36155228a1e28c98bd83775a53a4c6bad1a9b9fdc79af64a25d153a1b25825622eb60e3e7ca250afc1607d518601cb033452932d956f7f00b3980cb782b22a55bcdb70b3ba051e5ce9098a077b491c84312e7ad156b1b3d3ad2d368f1e430576632934f5f4a05bb6eda9f6ab7d3940c61cb1e6477109660849e30647c0549fa9fe32622d28de9043f0f5d7a1ce1db2cf6aa5ebba15970b077b2527a89afdfa8e7a0982b00f4d2918071f3fa9b4667000000b027d2c420e58ead293de2b24a019f0e3e27140458511a0cb0a2199d2b68577e883eacef69484dec79749995761fa0d1b962acd49ca554f3c5c73f88d370a43b45bcf763c58ba26ddc66b0dc915ff1c40eade23ea062347ecdf2b3c16da0b3f002f0a42cabe7fbf2a87015fdba7657f33523283ea6f5de828e62b8aded2d21bfca3210617c7aeef2907b0cf66dae91f96e0888a2c69206f92032dcb50c1b39d9d36dd3334fdf10c96018709e73353f12e5000000b0037bd3947e0cc48dc5acd19091dd0447dd5cbb4888f6bd71b98a6c2deb337d14ba812b299c2b5ded77f9b28f4ef4e547a3f8bfb797f5225a444c02cd3c3326adf29fe988769d69dd9f934560f1aa8a762b11f1648bd1dd3f4eac0e31654ff98dce78bcbde7ae810793f616feadccb18e24f81ed7331233c7bdf75418588deec2c289e7d2576d314ea3637b35ca0f487f0fb6c4884f1598f3e7544ae151ab80fd68ade59419cba903db4aec05a7b935fb0000021c000000b00c02592d13c10469cce0457b28a6e98269ffc9522556cf879e18e7a14f94e8ab6a8e2252007eed37c34db7eccdc6d746d0f0cbe2bff25cb36d96f2369b537315008c88a68e6efb8cd07d2c80201d28fe7ef11cbc611741a745d1da3636829ed889542469e7b269cb751e10fc788b624728e02ec1f377aa177626f7e0be30be01be7f6e488f148307fe764f3578fe57d2303bffc5da72673ee3c64986b3759e50f58d427b5f152750e7c31eeb181affd2000000b0213f944813c167148c3e0100865d18f26d8f42733811515e1202aa92f763a989df0e3ddbc7ce1a982d93c5a4af308b2632ce6fd79c5058fc667e5c7cac57ac12899f0082db6dc12d284825bd2f527f05fb41f9bc6641841fa9be5446cacb117d788b5de736d02be4d84d09894c9957d62503063ebca5aacf3e30d8986f662c378711853e8e50e26877b65c80625a42d427976972a7ad19396a6054ef7b67e81c85889af12abcd4ea214cbc3ceab72679000000b01acae16a3306f9a265c6529161dd923e7afb46f5ae225a10d26cf7cfb4b12c76265bda2d4eed66260355a79c8206fd2019ee02b1d06b0d5e56ee6c929437144368561ddf31cc1e76345d757d81531a164447d19795029117e15299c8bd81063915587627230b8d591df1e0d1e40941ad1c5202ec52132f3b4a090a24fc436d3506a2a68aa8eb19a8054b6d3eb6c824c71ce268c378fbf22fd250dc5b887465f90fbe63cd232e5fe5d063cdd75b7c1bef0000021c000000b00c3c0b4428aa47fb79767fe15ab480ebef1fb30dda925607e1a57289d83c1dfcc7b847ba6776b8a2aec773599ea9d7dea9474a3bac9f992902b90256fb6dae48db820c3af8ca0e7d0cb7b0625c0eff03f085e78dcec7ea38b18b34d5f85b0db0cc74b92408a2c5cfe0f8d67a1ce2e90f2e87a86cfb59402c0772436bf6528fd9695c9ef40d9ab97189c759ccd05c35df149401bcc35d0daa61a28ef52c862a4643feca7f9d5645d91952a14e741ebd55000000b00509695038aa49af0f80ee9b65efcc71e09c0e15c66fc79ebd9e5b50d40a2db22b996989ac6e117f99c7eb5065e5023523c031055111c95e67ade3d23f32b8a04f41559121aeeea7b6cfdded0716b0c12490798db31af63410b6c66bf5e03798cc2494cc8f73227201530aec6aa39309177647f7c51d7333e14345d01f33908728d492b4900b92330d54b362550bbb6d11cdd03577fa5b5531b745b8c797bc1057ed6262ac847d71bd3348af7018f18f000000b019f66f860afd4c9847877fdbc362a649a0e12874dba0ee4dc1f4e4ec0fa31e1bd75e9011d57f5450f24d2deb02042c932cd9a04c6595a7d833497dafb90ccfd151e2b66e2b32e8a8191e6d64ada903d582b7ea6dadbf345b21fb10529ba9d29ef6f65fafc99cd1fbd5bc4c12dae89bc908dbf6b834246c0f43924992774d42040db9dfbd116f9857aaadb227060d0f1e1f0d521c561b9e2c52aa552915f79c3053066ffb7d8e9667cfc13eb08f43791a0000021c000000b001747bf730fe575f338616116e56ae8c3a569a0a2c781b7d666213db26fac82cd6fe00c843f13169b7c611a42de7606a08ce035edfa6817b6ef497cd7e72d764516e98c0bffb8e9747cacd7c1a4ea87e7e82c6329a76b6b6a0ea0f94bbc8f519095e6059af75b14896d93fe5e4f53fd70b2851d023022797656345e8892b90c3e1b7228bad32d2679435f9ce90e3137b2f81b1ae7c2124d026cdce1f1f0a6a253f9f0c285ded52cd9624c164736b726b000000b02b27cf02a4327a8c88ee7bf34531e1d6346f7670114410302ad65002db16b2e4c9f8d1204a9a1a79982b7b3ff3e019c7ec2968e641e83194c15473603a5995f3fe73a166ba7bd4974f03cf779bc29a4ef53b6d1ff0d367985488a92cdcdcb40385486389ce765786c56460e476f7bdc016581048e1d9a1abce146fec9300417bf606675de570406e73bc4cc0d8b6aef010599a5938cc215e36b8e954ac2f83c5affb0ac56370e0e5c968e14137a1d4be000000b00b7f6bb502e54901fe47ff03ce89ee8671758bbd3e71e0a55ef3d685596cebb2637006eff66c0401d3b0091873aa70ab1f6a54938a55dfcededeafda7a32aa4550048e92836ef675da517e419bd00eb469a531ba1c5f13b5c4215a1554a566c7d5905514abbc2f1cdb20b0378a491a99195471b56928558b41d72c4610a275fb8e642c2478fa3e5fd4625770da837db427fc9f66a6a93615d77cf7a8b63648cff9f410b31c4bccaa657d6b661adfa35e0000021c000000b0206637d6f71ccfb396789ddbdc5d66fa8abc73e26fdea35f30dbef5c0ea56c4c34bdff0df9cfe2705d2c24771e6c03c872752e137f9ef9e8d3390cfc02fef94e9bbc5ab11bd805228dd58c0673af0e28362c32af0e2b612cd691b7e9b4816299ab65d204e816c625f8a8ea42adbd47ba2dec49928471bc04b198cfcaf35934859a91231234924469d9dbe2cf1896d7221151eadcdc71e21395eeca98a98d0061f1f2a0ec058ddb897d293cf1c6b2841f000000b015a4376b3db67915ca6acd51f4840311b0c3a326fe3405462d294fee125791f5345d75b506054f02111bc76555fd0222a513196ec54a0007ee50e42612d9c9748c20499d4fd17aa995c9ac29911fe9d69b6fd23c89a26d11a851971e8c9fca623bf3de37c7d602663052923f4ad9b6e326e90e7a00ac578858e1bc7e7730ac32084db0de3c9b104194dcda934de7871722d570e3bdb936fa8ad0a8082ea363cb3a7b9d6d1934f6b10e06f76578439662000000b027a135dd79dbf3080744462c62c604a4beb9d99a835cd048a9768435a5e25c87c5524e7fa5e1bba0f1afd15adf23091383c0cbace6bcf51c45d339a81efe66ff3149cc19f732301caf92f2d302da5b125e6995573e5de655a0d55ec1ce9f29e81dd6b488cfb684687ceb7c8df77039d31b2e4187a0d49e6f68b3ddec61f8b4ba184eb262461580c3f7c7d2bdc324eb290ee82203c6bdc870564d3aaea89803860b1ee3ffacd1e8a69455c304bc5b01b30000021c000000b013486ce021b6a09b0b79450b76739b0f25569531bc532ae4031ab31e7d34c1853ae0fe346924d6997325fa657ec715222e8df30a837c2e03daf592e36139c4135f5a58747f29993f8e5e4f57a02cd5fcda99a28c6323fde9fe2a021303d3fab09e6312754aff2badaf22e9b68d7e97810116acbaa445c464a8f7e6cc6e819cbe9bd7c9645e47c7e5e55e0e240f1048ba1705d899b287d049e79b937a9092c569e8907d65a2d7f086eb1208f9c247c822000000b00dce7be2e35b165c634548962ca1e215e3df6a9c10bbe21a29e5ee2afa1b92786cb54979fea4b4618b1b8c8c54efcda5889cdd178f7d7c8e603e6729087418b5f95b80c88c7f5dab32c80ef9ba43bfcd1f865d7c9a213574f35cdda3e4a1458332ffefdb27a5ad129260ad1f0b531eea0f6fab4b465f7e07bbc32a161e56e1ba1bb7c7e81cf5376ba987be115cca320d046349d99b82997e22bcadc71e8367f0ea5bd8d046d807723e61f59ea240d1cd000000b023eb3fc8b0b52dce56d75ccbee16794d9a2bc85c73343e8227c851dceb60f2607f9619314389a8160089d87c3a1dc4a19dd451329d9c8d51e754b43822924a5c1142a98ab835b260acdd00a83a7d241d17eb10db121b17a1965e002eff452d132b528221cd8b51cced8b9ac14efff5520cf848f9626f582301891bcf38c6ed7ea7882977dfc80bc0d14050a440000e9c1c35e3a10d9f9f7b72bf203fcaf918d1ea33e9012c03d4c3ddb528341c21cd0200000fa400000168000000b014da65d37e0089a1fa3e1fb9c0e91b0e39e0b992ce845eff6ef2702ea2723476a51a365d0abcd73a17c6180528dee60c6bd9383f2795a7df25407dc06a16f4bd9b5b92b5e21db8cec5b964ce1c67220e7cee4dc3fe1757f6ee6b447605f565f3086a447c044b04abacbc8ef5c24f88261dd9f661d310ec37be8cbe291e533403314175cbf7e89bf800faa2fb0f350a3303965c29d0c94e9231a16b7ba2eabe0c55b1abcac336924fc7c80ecdad4ba273000000b01da48c9606a9902c8221302d80887715205408dbbe8953b1b5a03f0370f1431592a2d414b7bd0dbae2ff3a5fa926fdbc7679d2bf4f7409b282f7d3648f8ee118aab99a892b60501568c9f7bb48c656c925a307227326675daeb0d41ba3ceea86e812c79c0c6cc008c2220b94fb567b5729e29f11d32bf810d9458b3c17a3b581b75991e1eb8793730e1036556c581a76281c8b841d16636d06180682384262b6e4a6958cc311b9d12283b13a8fe032eb00000168000000b01b05eb462ed14083e68551e5383c62957360bb498dd4a81197a585acc8bb806063ced75b5b1cefa0d181aef3553d04e1af0174f3f05d5f69d5b1bb56100cd6f8c6681a2b2fae4a120e2012aa94a1e81d490ae03d912adc6fa1dd33a77b68cc0eb99cd87b25236088fe35cfb6a827c15f08fe0a4efb29a3b8d28d2affe07ac18a483cff8c4c77ba14559d809564c4805e09c9589d30d8ad48d9070e709814e3ed4f699009bbc95c148850ec306e01b3fb000000b00b12e4e02d8581d7af1b0d4cd0933d4a2d3f3e14220322869e762a8a646e45db5aef8ee78519b1cae2e8edffbc8333f8b78dfe880c1ceb9239c6ac3918ed4ec328679a0c20f9f299c12f2e371e305125e8298c9979d2489c303fc1df5cb5d83df18214705e32f85341ea2228b51337df280a7be6dd3d4d6980619dd7e402c015bb8097db2b3fe74cc4a27de9c5c5f9e818d400fd6107c0ecf4320194d9c7d4f635283db9d68d41a4c89933ba564500ec00000168000000b001fbb49f720cc4eda4de0d960372ab4796578b840b2c4d033ff2e81626ff16bf5325940b4049c386c0f7f73c4698ea834f3b55e95bbe4fc6020633af1decc519bacaff340a621217bf04ca2041dffbca008cb9a6190a188d16a74c38ad6254e304f82baaadd000fa11a21f60beb7281110b2f62f9c24ecc923784774fa7f8bf311dd8a2e75c0dbf02e4d0d2a9432d6772d6c2d159e2c6082b38bc9f2f9d1334607d1b4e786007f0188a14fc5dfd32569000000b0002fae336d5e06285d27aed31f12481da30cfabf84256324779191166b3fd0ad369260d106da474f804a5144147195227e20a7af05e2c68fcc8025bb33cd793382a2a64561a4341ef4f991b41339e0a920c1ace089549134742f59c2925c0bc22e1bef8ea6f26f9220ff93780928a78510b9aca6869aa696de63f623f80938f427bd4a620eca4167aa561cfeca66d6863056448822e15b03514d1496b3a98e612083a70922b9d8f29d495962e97581f300000168000000b0150e08d4284b39fb8f480eda60e1d6febca3fe2290cd3e281de43d3bcde60ae2cfb237c5d363b6b635e116637aa803a6ee5ea9686fbd5a21124ed97b95515d6662b2e636eb249db24fd7e2ef873d9c49dc3dcfc05b4a45877a6425a82091bde2f18d301a8e7581fc9ba543b23868b6eb28093e85ce5547596e073fbdae0b064d991dc67465311a8753802143234b783c1b88800367674247ed1fa6d865c3c926fa17a08cb9b444b5d8e655b8bd5fce97000000b0286d7398ba6d1f132c940e03aaefea276675a3277a8b0926c036842c54b3d96dfc13568b133c2a8d324b7db30807beffd7c994b73e112086ca7587934d752e339a01abe42bc761e7fc18c637825d6ea09d02706934f9d794578b1b7957e36bcd6b7eeb816b4c83640c29c778d7b912c922502abb46020135c3ef49631e756a1b69810c6b2822cdc3e6d65b6687429fb80f5d83055e57ed2b02f43346b5200c73c1ce3ca292b566aae73fcd45db002ace00000168000000b00d822361cab917af18efa93d524ba07bdc007858236e3856b10fc07707dd0f60f80a506ba69034874737734ab1b59cb4a3addc13067b0d025a48349777a39a451a434bb61fcb5d05e44154ef0dd50ea7275eb18704bf37d9d9ad0bd7b6ef25e36a646f8089ff097d45d071f4199d377f154e4fd05cd33613297373ef80a748049cad737a29e6ee82956cfbe6b3c037d020a62751f1cd922879ed153afdb3782ff824ce9a8a6a389709aaf7f6cfd98833000000b007e7df8633bd6b6145945c0c8eba8d47ad04d5f9f0f64678ba363827ce731dd69d5fe948041107d7f77da4a451d9e66ce9f8be7bb525458d35c2a45672b6d8584c8c7238702f7c5001e7f1c56dc2bae8d25acb22a165e5e8bdd9ac2f0d5ba042c28b65202059d8f93864d4e65e8e36a20baf432ce5f550853063fd533a8abf42826584675028fc601017143da45f0b5c0fd37cfd24d00f2b4bf793339393ef32ba67bc7097b00dfd40956751777d0aa200000168000000b01ad2667face3863200484ac3599d918e37f7a13ed6304ebc40016731861975ebe5b696033a3ff521fd977fc596f4c178075c75ed63360b07d62c8fe68f0b6b847f7973694ec8f449d8bbad38cf7a0c3880cb31d5b404fd833097a5f46a5ab8138dce89ea5713cd0abc5e86bed5de13f91404f1424fc7bf7e478e98c66d92fed6f218bdcebac31e628a73865159c1d305134c1a45505112950e361547c169ab94cd17c7426b9a5624c2fae9387d0de22b000000b007ee2b503f309ecb10976c398eff91bf93b717026f59aa9243c65d345d3cb90d7173f70112b45177c37e5c138370c69ea2fcbdae09e4a60246dc1b353836ce0ddf1a990df5c2efb5c47e72150dd395d084712400c66adb87d61b46a32d5a6c1ae7ecd615749a99f85defd924fbd2c5ce13856a83e4d72925d12eeef1918a8af268d3412d28432504275e63603289f1710b48229fa8fd779ad701700c99a9f244455e328d333df60df94ad59147708e7200000168000000b02d441ec6dcbf87acf52cca32784f8e255ba927f45cd34c80fd74a9f6fb0473f82dda38f65bd3519490a0e6065744c8dacd460c15ec0b82cc954bb7e6ef84da0c67081c90e5df0bc4a8a0b57d36d8596df023dc93f0bf5ad826fc742273a87b2a7e2f804d2b8f26c053cbe87f372934da199ff07ecbcec2b6d5f145136e7b7f00442847546b6688543ec0f9dcbecbb2de23328dda0237dc498263c1fdb71df92769789a4245a9eeb41f2e51b496671bca000000b01d50fb70beaa8197ecd7497dcc9c13c619e713f486a692ee311decf2341a780968315f6971640801416fa5fc7840cad8b0ac28b3b4de50520c23e5f1d5ee775ec2c3265acf69d84ed938c7ecb20a45c06348bcd2cb3ad0fbb08314766d72510a38782a628bc4e9ff4742275a7fd7442e1a0c7eba80ff2624f61f7b8ecc289cb5c89da215017482f17c6cbf1d7d835bc30eeaf2808a38322995be1e25ac46e3899526c03354bf2af053805f10ce76b98800000168000000b029017277394d239f2cc7b93bfe4f5fd71959254653135cdf908b2f8ba6971880dede3075ba9239ff045a248c46814cf75ab36d3887f0f9343b82dcc7200ef9d950ad7583671ab2fc41a7bc5bbe113b5680d9c5c6ac0ac7830a4ab31a440822fb60951e88ba79fef6f52e59d0cc0c79dd15d65309ad568a89ce0171ec2cfd2fa16dc0b20edb949b035cb75d869a0aa2a51965c385c87222d0f9a39400a42b473d20c746ccd9bcc3c2f8fda28664e5da54000000b02ebf93d38851a692d3b14ac04670efe5a0f4dfe92a9617983fb0b3aaf3b99ae85e4fd4975c3d285d978d5c70dc0feefc14f54909e95e659919b213af560c912c12e747028b728a4a192e61e192838ce86aee0cad897b143ec02eef0b7ab9826eafdac8fef1a05eb05922e260572188fc1e8a6948a5f78e7b4a8a13baede0dcd02205473b39f362dc2627764dd22a49ad286e14116475bcbb6d2e17ff877ddc66c78522809e222994bb7e159b63e3716000000168000000b027c3053f4cfeebeaa62ff3c16d5bfa5c7537b142a6a899a002c31fc4c074828ae45b237bed09880748471cb956ccd71792598317d1ed5b1329949695acaf3d7ccd0398e789b7742b03d7a73a2ca40a9bf5bd8acd7a35648d80a61e06ec162b8c1e3add6716a9b35ff62a2b2866c8842119f25f7c8daff661d02b0e7b1063629ec6ce2a03d3a1267a00ac30094054394e15fcc16e0c315a2b6b9617719bde5e8a2cdadf588f62a84452fdbc8727367e3a000000b015464d5d9b7ea2e9b17832d6bf762f40fc8740cba406a02ffe56d0743d3a3af3454edcc872b6a42a57d8b15a870de35e64933b79cbef570cc347d34e6cd3f3165064a195948142eaebda4c548aa20c0ddc6ef60ef8459f01982dde02fb173b4b7b846cc9f270f006d2991af8503512ed277467e3df7a7be8c4879c2d57e863af0285d0de2c3641300835a030a7999bdf0e38212160320bcb76f58ec5920781770cf83db9f3bb96d5751b6fe5b8b3d33b00000168000000b0050cf248782fd0f6ca2adcad98ba9973668d283444a0cc7334b97b7f493de6c43adc84a32401a3a3f8774e317f23ae4f3a7bd42ec640e301e56144d01a07e0a4d70105ca56c44f94cbf9b26c90ce1ec9f7cc656f05e641eec42e08f9e106478967626d23c3f2f76d7ee24c54b795e6791850baf38faf4bbfedf8da08876919d609961bb2ae56e3055811d4cb1d03d22c1256ae059a802106173d3c6d8ae72982fe7c6d76e8c4f8faa106beb0bad7e588000000b0254c22ab21ecd52ea1df157f49f3f9f14202d25972b645f7ee32976450679deceaa5c6d11a50f603941c6867a77d279b20cc86a44c13767e5d1037da294626e4c502b55b778e102a585d93936c31cb90042e9ce2af0edef395decc7c7303dbaa3b8b3e42bcb8d89f2f462e2999ba3e53185220a793fdf9c891a4111a74814942ae40a00329d69899a2ed8e5f0b150cdb2b94abc85882eb83780977fa1b940c5bb4371a70d7716de15e41c9a8c75f946400000168000000b027614171dcfe687a0e4984d71515293ddf97012116d9f28d418b70193b8261d4932a187eca22a0fcf3a8a0ccd425bd49a9cfb83dd1fd0dd3e113ef5445aeb3220651a06d5ea114d6ab2713b8027ce2aa68af6f985a31253ad748cf748ec3713c3eca6a7ecda3675365076325a8f94eb21c8d6c037ddcaf2d6ec023c0e50fcc1222b45dce118d2d364635f3dbf53c32ee124c769b2d03013a6b560da37da78e0f9f7e6af7a348bbf2e1773e21f758c402000000b00f7bbdf93787dceca73557e5a223827892bef02214a53c406ccc5e35d780d4de835f326956389e756c2e80d4362fc8231c126fecf2ffed14d2c288de37d78cfaa24140d6b1eac0ef1303b725a5263924bb18abd9328127b1b05d7768df98d7234f2e7f1da61cc83442366fe09dc6952327b61039b571e788d0bbe58597b13ad840aa19c870cf7331245eed71a65127f00c5310049248dbcbf345e9f50524622866f3b98e0d7ae850923001e194d1cc733800000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000001c100000000000000000000000000000000000000000000000000000000000001c200000000000000000000000000000000000000000000000000000000000001c300000000000000000000000000000000000000000000000000000000000001c400000000000000000000000000000000000000000000000000000000000001c500000000000000000000000000000000000000000000000000000000000001c600000000000000000000000000000000000000000000000000000000000001c700000000000000000000000000000000000000000000000000000000000001c800000000000000000000000000000000000000000000000000000000000001c900000000000000000000000000000000000000000000000000000000000001ca00000000000000000000000000000000000000000000000000000000000001cb00000000000000000000000000000000000000000000000000000000000001cc00000000000000000000000000000000000000000000000000000000000001cd00000000000000000000000000000000000000000000000000000000000001ce00000000000000000000000000000000000000000000000000000000000001cf00000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000001d100000000000000000000000000000000000000000000000000000000000001d200000000000000000000000000000000000000000000000000000000000001d300000000000000000000000000000000000000000000000000000000000001d400000000000000000000000000000000000000000000000000000000000001d500000000000000000000000000000000000000000000000000000000000001d600000000000000000000000000000000000000000000000000000000000001d700000000000000000000000000000000000000000000000000000000000001d800000000000000000000000000000000000000000000000000000000000001d900000000000000000000000000000000000000000000000000000000000001da00000000000000000000000000000000000000000000000000000000000001db00000000000000000000000000000000000000000000000000000000000001dc00000000000000000000000000000000000000000000000000000000000001dd00000000000000000000000000000000000000000000000000000000000001de00000000000000000000000000000000000000000000000000000000000001df00000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001e100000000000000000000000000000000000000000000000000000000000001e200000000000000000000000000000000000000000000000000000000000001e300000000000000000000000000000000000000000000000000000000000001e400000000000000000000000000000000000000000000000000000000000001e500000000000000000000000000000000000000000000000000000000000001e600000000000000000000000000000000000000000000000000000000000001e700000000000000000000000000000000000000000000000000000000000001e800000000000000000000000000000000000000000000000000000000000001e900000000000000000000000000000000000000000000000000000000000001ea00000000000000000000000000000000000000000000000000000000000001eb00000000000000000000000000000000000000000000000000000000000001ec00000000000000000000000000000000000000000000000000000000000001ed00000000000000000000000000000000000000000000000000000000000001ee00000000000000000000000000000000000000000000000000000000000001ef00000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000000000000000000000000000000000000001f100000000000000000000000000000000000000000000000000000000000001f200000000000000000000000000000000000000000000000000000000000001f300000000000000000000000000000000000000000000000000000000000001f400000000000000000000000000000000000000000000000000000000000001f500000000000000000000000000000000000000000000000000000000000001f600000000000000000000000000000000000000000000000000000000000001f73700000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000002c100000000000000000000000000000000000000000000000000000000000002c200000000000000000000000000000000000000000000000000000000000002c300000000000000000000000000000000000000000000000000000000000002c400000000000000000000000000000000000000000000000000000000000002c500000000000000000000000000000000000000000000000000000000000002c600000000000000000000000000000000000000000000000000000000000002c700000000000000000000000000000000000000000000000000000000000002c800000000000000000000000000000000000000000000000000000000000002c900000000000000000000000000000000000000000000000000000000000002ca00000000000000000000000000000000000000000000000000000000000002cb00000000000000000000000000000000000000000000000000000000000002cc00000000000000000000000000000000000000000000000000000000000002cd00000000000000000000000000000000000000000000000000000000000002ce00000000000000000000000000000000000000000000000000000000000002cf00000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000002d100000000000000000000000000000000000000000000000000000000000002d200000000000000000000000000000000000000000000000000000000000002d300000000000000000000000000000000000000000000000000000000000002d400000000000000000000000000000000000000000000000000000000000002d500000000000000000000000000000000000000000000000000000000000002d600000000000000000000000000000000000000000000000000000000000002d700000000000000000000000000000000000000000000000000000000000002d800000000000000000000000000000000000000000000000000000000000002d900000000000000000000000000000000000000000000000000000000000002da00000000000000000000000000000000000000000000000000000000000002db00000000000000000000000000000000000000000000000000000000000002dc00000000000000000000000000000000000000000000000000000000000002dd00000000000000000000000000000000000000000000000000000000000002de00000000000000000000000000000000000000000000000000000000000002df00000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000002e100000000000000000000000000000000000000000000000000000000000002e200000000000000000000000000000000000000000000000000000000000002e300000000000000000000000000000000000000000000000000000000000002e400000000000000000000000000000000000000000000000000000000000002e500000000000000000000000000000000000000000000000000000000000002e600000000000000000000000000000000000000000000000000000000000002e700000000000000000000000000000000000000000000000000000000000002e800000000000000000000000000000000000000000000000000000000000002e900000000000000000000000000000000000000000000000000000000000002ea00000000000000000000000000000000000000000000000000000000000002eb00000000000000000000000000000000000000000000000000000000000002ec00000000000000000000000000000000000000000000000000000000000002ed00000000000000000000000000000000000000000000000000000000000002ee00000000000000000000000000000000000000000000000000000000000002ef00000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000002f100000000000000000000000000000000000000000000000000000000000002f200000000000000000000000000000000000000000000000000000000000002f300000000000000000000000000000000000000000000000000000000000002f400000000000000000000000000000000000000000000000000000000000002f500000000000000000000000000000000000000000000000000000000000002f60200000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000003c11000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000005ca00000000000000000000000000000000000000000000000000000000000005c100000000000000000000000000000000000000000000000000000000000005cb00000000000000000000000000000000000000000000000000000000000005c200000000000000000000000000000000000000000000000000000000000005cc00000000000000000000000000000000000000000000000000000000000005c300000000000000000000000000000000000000000000000000000000000005cd00000000000000000000000000000000000000000000000000000000000005c400000000000000000000000000000000000000000000000000000000000005ce00000000000000000000000000000000000000000000000000000000000005c500000000000000000000000000000000000000000000000000000000000005cf00000000000000000000000000000000000000000000000000000000000005c600000000000000000000000000000000000000000000000000000000000005d000000000000000000000000000000000000000000000000000000000000005c700000000000000000000000000000000000000000000000000000000000005d100000000000000000000000000000000000000000000000000000000000005c800000000000000000000000000000000000000000000000000000000000005d200000000000000000000000000000000000000000000000000000000000005c900000000000000000000000000000000000000000000000000000000000005d300000000000000000000000000000000000000000000000000000000000005ca00000000000000000000000000000000000000000000000000000000000005d400000000000000000000000000000000000000000000000000000000000005cb00000000000000000000000000000000000000000000000000000000000005d500000000000000000000000000000000000000000000000000000000000005cc00000000000000000000000000000000000000000000000000000000000005d600000000000000000000000000000000000000000000000000000000000005cd00000000000000000000000000000000000000000000000000000000000005d700000000000000000000000000000000000000000000000000000000000005ce00000000000000000000000000000000000000000000000000000000000005d800000000000000000000000000000000000000000000000000000000000005cf00000000000000000000000000000000000000000000000000000000000005d9000011000000021c000000b01877731cdc9c16d3058b39767566e6cec9db017b029244fbbc127803fa5a3794b8d46e663a51210a5099e8c4f79a4f7d71515eaf2413a274f83a4f38aedadd9e6242bbfa1ed4e872f23be9d254eeb9f97a48c6f4e17db4dd9907cdfea6fed68082c8e9f729ae970a35a7f53aabb124a22ae27218530c654bd4e3f9c4c57e50a523577b684924ecd854ac04f273171a0f169ef0bbe15e0b8c12dbd2ec3663216491d930e69f41e09d8eee8f689c5abeaf000000b0151e6e47d698d5387e420079b388fd0cfff10b89b38fe1134920601e59e02f9cb68dc34fdb15e24e463b44c4d09757c8ff849eb251f169dffd5883f668b0c351223447c66e2bfc4cdcc2179f4690f0112d814ff8171232adffa3ba2f909d47170e4bd9bd98c78ebf74beb3b516c2970c15f2933a6aec9835ab22665058deb0d940e6adbf5fbfb0ec6a8889ac0e2305661675e9400cbcbd3673c63f673bd30b9ca01d3dac1e453da46b4b2d16cc065366000000b01b9c58a32db8f10b659a57e1179aafc1eca3730d4b7c5ddd67101f271aab9139733edc5292538d14d1d60a450ee2a5a2e63928ee0fc4a39269bf24ffdcca09f2f14a853b11640772c39b2682cac90a5b2dd78064eec7ac468dff5f9bf036aa6c29adebfe15af2e76601790766c36ced127f6e013e6db26db65d57610c39cafbf5d54eaa2f76cb8f6496fa5ba280a863e18ab58a5cd58c766b89f5ece34b643320e7a24f906f00302de885774a02265a70000021c000000b01898cd6ee29ba06031b379004bfdfb315cc5a9bbf7ef6ced87a8efe4c889afea33f68808e5c7ea35ff812ab5005249805f4abdb4980eb5c609346bbc7f63e8d5a9d26d3f74868ad4ffccc20a22c27f882c4224d389b2ca6a1e3bf8673c1d209adccb58c77517415e8ec8131ecf8fe0ae234bff3814d7f5417192ad10c7b4c7e403c480f8cfeda3e7dfe25ed4b7c2829203682d39659ebcccd0e4492aad4115454e5e3bf4a33a3b0f11c8f6dc46ac677e000000b00ad8ad136f00e5ae6936ce098e8f03eebe6ecaffe5f9482a97e17f85f53669f203a211a114db381248a5366b947f916f9cfd6f23849a6284c0b0069993d5604f23a2e0b01bb77f5319f874cdf59aac67cb096497dca061e6d3ee63136b02502e83f3e2a855d9c7a849968af96f2b852c0aea683ce79282a21e9e6e8f89fe18f2dd4c02eea851e2d86c21a80851a175432d8e875151f2b7e18dac6ba1c98c8a395b5bfefeda28aefdfe622781a3265d00000000b02ec94be2d3fe87595b5644a9277f6d4385a816266d0d65a656ea9a8b3ee89d43b79c55e874bf4e69e05cdfd6dffc512b6764d5bc6460d8d4340e5ce0a1a45dd713942d369ad57816f266968f6d68ec69a63129e5c0bb3712782884dbe90db559932593c1a0d943ba3d7e917c1eb1a6211d3d074809765cc28b320e064f2bac8147ce7f530ab59809001134e19ef541ac18e3e2a5a38babb607834b856a9d23865a2e855d9f45f2e5a3422fc930d7736e0000021c000000b00dfb89f6d51be4d86ea3d1bf684d7ff5f31b00a73670b846f241ec95cd3e889e065bfecc213d0fbd926b807894e75379ac22f528cbc97464afeed276c4c4f7a3fe3bc2add5cab402868e12ee2426a0df28490cc5b3565d8e5637a41eb21b066d93d64a21df3180ec0e4c618583066ee3064b752fa31fdc63cc57c895f54daa21cbdf1204ab35e4ed2f36a7ef722e666e12aaa04070e959ab41726f4d4c8f08ce8dbbf0ff0fe512e2a648a147989c3926000000b0148b284ef6f41359cfc4bf20b8330eee67cca2d053bfd868feaf319fca05dac88b7f45547afae08dcd6f1a48ea24be5a6094b1d9efcc73cd776d24d79a406c814a22f40f5b82d97d3df6211f03b31f859b39cf1c2354c20947f58b92d707a2f5c399e8758cb5726657950a0c0713e1812af0a7f7b05fc84921cf9cd9e7173e88fe8d81b6ffb6f4cde558e69178a79ba01b9e7f0775c8f23335f6962acefcba69a03d35307cd034c5e8ba0e8ea9dfc495000000b00b486bcaa3d5eb1f0fe83c9edbdbcc4505ade0dba94cfe3f0cccb438b6f4060cc64bbf95382aafa9d45c1d9aac7b3b43b8cedcf74fd8aa8ccb4d55048374d3fa7a0f56da038566845b99ac4ca05bdb813dcc2aaf41444f5a0ac42d647eb6643d0e1bcd159c70978ded524519f8628128109f21fb8c7be5f9f1abb7ba2ec43e52249296195770d43ac4764a8a1b7899b00d9f03f524d6b7f731a8d1637ebd4ae22638ede257604746cc04e351b71e310b0000021c000000b01e9db0972eaad190e708f0e3c7cec93281e04cf7de0b3713874a21fe50bc01ebc4a44ff13e6f4c4aac1ec3c52f697e4de9445fe3b932489648cf1d578781983d05de3b7372b33d4f2458c3a61cb757116631f6e858be7afdc78dd93ea926d32315d3be05eb05ea4a11699a6612780a2f27089fc38af46f63319f144049d3e00803ce3ab36213fe4122cc9e990f3bda381cb3919d0f44b1924512e2ec7138c89e9f8e5371cdf5847dda3c59d051045d8e000000b02062048a5c14e18c96b420cd102c403fed2295879d6f7834457b92c3540f256a21493e26f6da5b0376115bea5d940dd5cf40d1068a9c5e0480bd039b9023796c803d4102201abcada6678695398c921b0ce71121d8188f4eccd82a47c27fd6c3bf0f662d0c63083018f5ec1ffcb2465429fb4c5e6a367f2aa0ba89a67cbb7ce98f0d8a5da76341733994186327979b4811d20bb8464be2059b96f8027d85ab4feea0e2afc797fb02505e9d73cde6adb4000000b01b35f7b1a35b4590182bbe223ea23c0b4ebbf35759a19940e2ff9f040e1dd94ed59f64f165919b65227b6edf1f069761c95de2aa7a9b23d5a49480974322e1df3137f054c495d21dd4350b4e720a5725359481ee0238865140cf0cc624b76c3d159c1653ad7cf46643066bc226a79ac41a660a901be9c86e6b02a7ee978c710eca8d08b7d61f6488371b0735fb0c42b6137f5a25cde6eb55982e96809a20c400f326824c2d862cbee1c16e4fe5669ce40000021c000000b0231c551e021cceb24cf4707b109a09d7fe70bd4a5229fba2420d7a2bf31a4c368376bf04acacbd7f2dd3f7d82175bcd38c4af86a4286b2f75c7cc913ad30a26d396c24ce2a58b5a48c5f103430fd39182eab345d03b66f66c3893f415d532866a23f632d9bf5db9ae18f2dff085bc85005ac2f77f1887c349fc2d7ced6d636223103c46a3c38578d32b9abef39a19eab1d9311c3bef0a8c97ab01984db9f601df012156d806852ed33bf8d59f9b808ca000000b01be46c1d929c3df46de618863d3f2412a183f2c6d03a77023f47f842e309463732bbdb8b06a7d7a99e6ed6fb9385383df3b12978325f5df913ffcb186898d77fbccc5a23b2ec72b34bcf7479a15b56fa05b9cf82d0a4d9941fd1f2995599c0fd7350c0d1a3de4d0c9d6237f560b3c42c2398ca7fe1ad0dedeb90a272319e02fddd8e57bdcaf10c47f9f67b1eb897cd230bfadf1f1d37ab5f938ffd01ef55aa49034d49bfccf3d74dec538672afc57498000000b015320c7b6f365e77a247f3ed2d73241d01e7de3fd44b9c91f2d29997ec10345ed3fc60f510e1bd01b753ab6415951f213032f74bc890e7ca51ae0c5e9ed8bfca065ed93af0df63c1ed26c916c7a84e21bfaa1b86a3e1103d44f752a52b0a5c060c748ea55564444bf59cbfec290465f523df19a58e0654d7707308eaa3260737481783f1af8aad49faa98484c754907719949e2bd3df3ee581fa4bc3e4a8391bff40228e390617fc2991536554a156af0000021c000000b0294823b5eb17df7dea4d4f68d376c482211ea25eab5d92ec117debde8849e111fbb4b81aaf33b97b1a13b484a65ecc5d2db932989c52d3739d4b6f0d24b14a778b3b0e221f939fe58ba1ebc5b77200ee0eea3c118982c3fc50e7c73aa28a0f5147e0dda9e60d08fac8d6f10446a341090f179c118c514eb3a6c6e18e192c16279804e2e00270ef1fc09a8c2896082e6923e7f70867c81487edf495ed1a77d9fe59e74f185a03eeaf95437ad328ce9da6000000b0282e20486b163e959ed487e4c57f94529ed73e7d881f4fe4478fe89c9e9f3eb70ab79ef28e00e3dfc573c04f1b7d895a2b4eb92436d2925a99ac1402718991a6e86c0bb437f7b2dc1bb081f5eed3c5f88fe7c8c6da41bd59569bc3d693a23ea22d54f71ef689e73752c134c45c82e8c627da582584bff2d20f382f95d4343dfef28ee4e6375d64dc19499110909a2df627591b62f8cd551e0326c345f045fbf8934327015344bfbfe963a0921c243d2c000000b00f12fa329c19a39d9e0cdea4b5e782cc194ecda83a28f182abfdedea981061fff196f935bdf8fb8194fe8623f0c3921f3e03c18d0b39256121353c58ac1c864ca0fbc9ea4ba9133660ecfae52dca85205edf05f1bb1331ae199876bb2ec0ac0bb48232e6f40bb8d7cf4fcc142fcf88680f1061b4f424dcb800c56db802c6efd2d16c202e696103b057d6fef3b95383f0142034887a1ab2fbfee0f06d1396b54116fc7ee4dc513ac5624ddc2a5868a9cb0000021c000000b022d4bdbb153636e0c7b090b666e987238fd04fc7389559fed96601cedd357121b4cecb507d6b7a39a53b52df19a929fb287221225f10fd55edf4d0dae02c913932848337febf4efda1762249489d82b3d9125b8f8d61f6a3e6c9529e4bc246bdc79726f620f42e34f2737b5d3b50f1d51f0d0eb0b2be87d7e80b39bba84e526663fa38d9845031dbd53bbbf729ba116926817a00b5df82bf82b12882537649eacf59780d19d498ccc15b5c5694617277000000b02f0c6342e21bad4a1ceda4595a4389f654e0e1cf03442c320a1ed72593628795d89b003e7e212e18a825f38443a746a6f1641fae6f74a115546f0b469e038765c0b430a86cc1020ffa74e5a16f8e6038f712fb167b4519765143dd0670e140a7819c1866d874de032e9a9b568a12fe74294833a406a4e26e4e60387f6a4ed33cb660dba8ed7c12c23be5786405ece7ff12f14c14605394db771df1e6e1e1a26f1844969c528a439c1284a773810f558e000000b01df620cc195ab215f68e712115c84b0ce5294ec2e2990cb105ea1b8eec08909dd6ba9cefe849c769c79576c5147211c74c454887dbe09be31950836220a5883e6aae96e5c8c46938703ab820e67863ac2d2ab7ed5cd2120eae3147c108e749f91992af21229e6627fb467dc5ea7c00e51ea7ce27b104123f86f8b39c97ae97e14cb67c0226db06970dd8a527714f6e4529de8d03ac4ee4164c9eeab7d1f37cdfb031385c6bd26286b8f58930c7d249a70000021c000000b01e341c98ee4314ffc3941236b746bef90f448d03faade9227d238a78f787d9799d0a593a3ccd3afdab9f9dc308eebb4c2abd59f62aaa4bf038f8dbd445bf4b42084053fa0b404938b65e1ce00461f8a4fc4da989353fe846a3b22d219c58c481630345de32c55d48a4e60d9026c4ba8b2c706ce8ac116173a70ba8c53a428159faa274379cf6ec4f14dc800831429109194a375319f5afd4ac6b960e5a7e8f9dbf52cdec9e7c1f658772f1c3ebd10f3a000000b02069c483c462b3d4adfc7b73db71fa44bc19f26306c8d89aedc1f43b75940c7b88a052222b7a1cbb1f6421daa07540fd506c11c25103efb3addefbe58cffa56c4b50a8a8af520e6a368e385647afea96d051e6513be90cd17d73acf20d87138e2a968c951d1842840ae050f916cfe02a278f05d0247b7997e3da63eae70d0122effafedac97640ecc5a2838b740cd9f10e7ec0a3e919736f91fc9db7f2265dea8da0fd07e4b08c3510f665d2ce969087000000b024c1e6fd3dae4f5df81777986e382116b4ee5eb2810b7a3c8fa52aa4cf8d0d6a7a4d84a8ac11c845e46ccdb508edfcbcbfd10264020b1dfbe5289beedf71c87725b47420357556becea9616e3ebb09dac54ee7f22ac7e42d0ca3285f5ad3de50c85ef67584f12e3b029445b89ee05cbd17bdffb0c7d62813dbd8b5d09281170d970e022abe89dda22d5b514e7be304a22a311c1dfced78164e1336569f7f3c3c6f17acfc309cb796dd13a94d85b7f48b00000fa400000168000000b0161068c4d5f45dc15228c704e82f46af6a9df679326ddca8865de3883ca743bbecbd56c4497d28a6903b6b0c8829272015a7a69b794ed1b70b41a6e164d36c57105a19d37a904c15cd78818915e992fbe227888a3d76b204700fb09d9ba28a378533c9d33f91a14bc83b0224b32bb11f1d2140d049d13851d4bd341c61c7c11a6f4864d6461c6a30ff910a2b990909530faa6599400b5b2bc95b03348083a6a7d1709169120747c4ab87e8b57c602527000000b02aebcabecd32a81e9d7d9f4030766ec56e2865589b185b854ccb10ef9526d7be4731083b1b376f6a5a39008aae8fdd4ff0190bbc6c45d0d1e735113ca77188442e034b646c55dda4dc4088e590225fd1eb1493f6304ed088c7a83c92c3b36df5b0187f1836446a665c7537fa8b2469ee0311602180d874eee1ed4fba76f0a96fce17f63360a2ff4399a95fb2df4b0f2d0e8c7b7118e8129eeb23492e71b7f63cdab39baf178a9bd7ffa3441f64ed280f00000168000000b002afb5e304c168fcb250841f8c7be4001bf23a32ad5134f3b722033745ddeb0929cb2271c40a8d828a99012eeb980acef0ff6f16da910e078a9dcd769d0cb41653c4889e68b90b114f249cf59e31f4dc00b6bab9f5c2566658b6111c9ac459dbdc1101f97070f9f42b46d041ee7f69351c7cbe8006f1b1bc7cb54f692896398bd9c0f6aca4d0d80fc76ab21b60475d4314996a66af7148fd47ea131d5cc8db10b9f969aa59b38b7aa52ee07d8105ab25000000b00f466537270b41dacb22bf6bd3fd136576d579c8a16288861bfe92c21c1b1b2c12290e24a4e9d6bb16e332130f1c5bd9e9eb89cbb548612b751bbce38d9cf41db37854f774debdcd14fcdd67bae457ab58d8ebe9e3a531fbcd139549e2707a73f3b85a7e9970c778f414e3739bace278001b6cab78dac46888f7c2405e6f62f60e1d5c9f32f517feac691d73be7c60d6245485d17979bd590cd3662fde21731d49d5498907d780da8c6649ea8235a96900000168000000b01ad68a5550c1516ab721f32db7ff7469282b12dda3843943bfdfb8d52929a01d4ad8b8c7f44faebdc26cc708fc7afce1324e602a7049e6c04085f919542b442c2abc9dbafe5cfa55bc4e92aee9b675c0312001d1337102a30c51a5f894107254ca88b6299bd1504217fa92dfc3c6185d2e08314b76688ed54abfaba3cd291f33c5a7d1ca44461d69265b78b81bc030740e0e6d343bc3302527b7fc2f2c0132cd85b96a28b9cf10bcb03b709606b377cc000000b00be4e60acc790af1ae64dce2a943e543bca85158ad74dd74f8e3ed950304586501bf382cb00ef73ccd1e71105009389a95bc56c842b00612ae3d9700f71a04283818e2b2ce342362028a28d0b7fc0b6be3e6fcb73ecf39b23c87685e6a9534556d3bcc25be1ad72dfb0cfc3a8b85d400185a3ae8e69cb1cd7494939605ee7ba023dbb61f200f5df808ac3cda5fa875d8238054f9e79d31fe4d5bd4174d1dcabf9932929f09a56130a74a8959d199f05300000168000000b019797f7baf2c176f6c8429a484c93943718481679abd6d91b981292abb9539097169e120d84c3fc1917ca26e9a1e4a8834934b6c3ec9f2b93dbb81f333cdf253460ee59f4bb3996d971d486fee87076e6cfeb10e7d587926cb6251d126567b75cd898dbe6bd09a9f18683579506c0c4818486ba46258c8e1922df66b7b18992a8874557ce8ec17dce991a090cb07b2d22ed2538b14034d6676895321aab5095d53261c59bbb98d3350388e57d8bef92a000000b02e3b59ce9712197c965b38345570280a33de5e708a3c61be19be133d8add4de681fc05c44e5b977a743f81575b838680e45dd488dd433446858029a1de38a007c436960bd04e27f3dcf482fd958ae377c01b697d4971cc386171bb471abef0545641574308b958851be0d55828cec8552ebce1cb95653a558c57df4c1e22b86cb557bfe7c1ecf8550d85c4b09c32e0651ef7c3bce7a804f84728f37600283ed6d8639d4b3779a4e9529ea4c12138aced00000168000000b00310906472c705bd1abac61ff6eaebdf6d4a8ff90a95fb0dc8442d2a6509b08a8920fe9bae339cf906c9af5f4d410fed2774530ae95e235ac96529f82c99c4a1c7066628b64bc7517e0068ca598c043ecfa69b9053c8dfdaf234c402915a20c67b67f43ad7d2230b68168972fff670150d2efd9541cf7f1eb89fce1341d0e38b97790881727cfc2696cb0c9bf52e00cc24e739ffb0123752fc3ce92bad6a378e05cf2d905797cd6572cb1cadca0b16a4000000b02a3586809a105856f755cb8da675f32a712b1887f14a36405641a829322efebb8da9af50cdfbb55a05263211b4645b55e492fd2c38190276466fed0cd46f5dd00e670b82ac41d0e6fc902b80a98cf177b76cab01bae1f15b38cd9f459223bb406d6764bb90eb96d5ca40e7be0221f8c1220639e4742e160bc54e94fe1069e8cdeff07ec7ceb69a11340c508db9a7bac30c5d899da8d23976829f1e9e472baf1d7244c30fc92160aae66362b9920a076d00000168000000b02b836275d7c95e4bb0e2fdd633f533ee9790979e4c3c15db1cef203d780f2e85c09c8d38d92a2b70b113feed6cdba00fdd1755ccb13d989254af5117756313e6e5d6536da3e856ddc4f483d284f6acf6a8517727abffabdb668841df9333be2794e1a614e6c361d7e9d1991f743fded0210d04bfd50e8eeedad7c8ee208609228f0d2dedbdd15de9b838a60eea2e4af8006120236653e23adacb31cf7bafdadebe28eef520062e29c14bc55fa5e0bcd7000000b010372af75fb546d08b40e75f5bc7a0d5484fb1231421230cc65dc6a9ef3fa8b3f56f0cda837436688a16301dcdf9631ca1030368d65efded0af53f37640bcf0768a848985c31738e878c3dbe9c7739ff64bddcc8c4cf61e465e5f838bd7cacd780e62580e3feb76d9f5614229091dbe1206a802af83fbf027650c87addfa4adcdfcea7f8a8b17e7b40cd8b3eb3e72b551293a131697b74dc534bf42dfbdf28f82bd5299501fe8037aafa14554b56c52900000168000000b029ddb89d1e44e9bb8f10e5e079548e51a0e75695736010265bcda3ecce9030386250bbc02a77cac7e4aed562281a9ee243cb3daec9f940fb06573dc21fc2fd892a9d6c280783a0f8ab5282de0637154a57481879111a5979c168b88c5dba7417af5ce1b5cb9c5e93adb375c0e669211610d7e061f40cf5d0741e801011de02fa248353c6459db06adad42f586942dd7224b1dfd9ac16fd7e77ea9e8f8fb8058721050da2a9053343eeaff94936691501000000b010b14ef57c0a213c182448d31bed136779d596ffe91ffe451006b3087293ae3e70e42beb9a5832a9d61ee681b0232380d548c9961f3b31ed58a894489f45d00feb59428aefed0166e4f67aa812f883dc4c5ba02dfebf5eadd5ba22883a4d4501a25790f5e86fde4dbafdad2ee9b62cca293e799250f407e288ea9540c7962684ecb67f4f4b53d1bdc587f843e9c54d3c0053c0e5b4dbc844f9e146323495e308e0fdaad9b9170f4ff0ead3f1e1cc774e00000168000000b008ea6e2f54a87e80fd29790dc4e45186b9f4fdf58b01c9648a7048bf65d552d5ecd161ff343a746e46960cb1b7b337fe46cbbcc11bea4e810e38c4fb0bc5bf5a5e9007e066560ef313fc4be2b3acb9c2602b89f3f289327c089fd1160e99e7c8d7c7e86dad1c65e2f1458ee3cea4638e24dbec4ba798053231a8de405d7342224b5985bbd09b76ddbb4d49d7b00471af2c902e26496de585a91d5d835e1f8755f8a18b1735b64fb50b324579d0c0382d000000b02146f6a0749c44f3eef76bbfef8d07af656e0188c25959a0b257ce4e8aec58b44b1d1a6e99c376e3b246116af4432fd88a6baa64a8ed91defdd7d74c0df3ab069e08711d2c4c4a1731d95bfd0e5ea0b3fc5723d26006b74166ada80e7ac5dcd0bebfe34e01b1a7e668b48f722d5798cb14009167cb520baf45a46d579c8b5199aa3520f48a7dd62dec147c451e646a3d24fd09a9448c5118f6b596655aaba6f503e0701113c2363e45db00f4406f9b7100000168000000b011c34050dcfd0d56f1c9e1fe40a54b6ae6f8aaf3f1456fe40a1da7bcb17ff04eb8a06e0048c47912ac3a7837999f8f3467f9a8b3a8bf3d9c941d6ad1fab186421e34a00bd11000cd87f000f6c636f834cbb8f9b8318f6eeff10435d9f880f3663bccd1542dc8629c1596c51dd05c26e3002db6d0cb6dfa70eb4b6875e0ebc2c31119619ce254e7b320575f69623d092113a1f6c3f8be226b601aef8130ef628f8e81d117aa111bb83f71c8f7b5d95362000000b02f646312ba24784559401d07a9954d8d7f7b16d4fc883adea89f0414a2b7e13ea22c62c9032279a6e4fac3a1dc39280977be9f8a60807792879f0d4ee972b64786e426d525cec87dbf3ce5ef09604d2d8521183d71f1603986d42f0634e47a9e486d3195eedc66e5048bbcfdf0bf38830b823f85987351eadd993b7938db8ad2ddf1b4ed128d619e0e62c372cdd41a172660327bbdf6b904a0e152efaa99098dd095a697ba24c99387c5669b00a22aa500000168000000b01bd9581c48bd45d4276205e116cad87ea3041306d7441f02ada4724c5c5307e9a8c5f2bc605d4ffa4e5b9b6d05d5c2ffd05a09aa66dfae250e416063518a625fcaf18c4cc60f460e1f977d278705d7b3af4c159952253375b7f587d2399bbdc5415b4d5bbd9a3c13bc2d16a625e725cb1b2b51b6df4c8e279475bb987e619c84ae59e583cf6cbfac1a15cfd8f527ce98042dad44a7f4dee0a4261965fdd2d4f8a504e0815cee127c358f78c074ec4a26000000b01218107a7be2140568e4110657012199c7a00cabf67e91ba7bc3a4e9978b4b6066cd4c4364c691983c10393c148a8ca2d7c1f72fb6c2c389303623b1ff90340979ce448aff2b2504a2918590ce1184e95d48b2f70033b772fc98dd87ed80c8afdfc07c6536f60a2237d662c705508ef92b44272f6e0d756e6d995e8795960e3fabeff9dafbe4e2c094bcf4ac3ff85a22142e04db0ee5f05e3e3680a26a7a4f8f081cf1b1fd91ecb79d1d0ec14aef920f00000168000000b01799a5e23b859811295b69fa49757241b505e8d23f534e1240d32ddee8a519e005894df0292fa984b36044a3675ac356dd75b3319b8bc87a7b5ac1978c6bbda546e9f26f296fb0cfac59b91b2e028220d78e157a2a4804d22c5cc32d65209956feb2d73d26b63fe76a233930b1839ba023191e94fb491149906b934437b9e182454084e6c218a1056cdc4a1a0f86db011df68ab878442e0d414455332cd4fbc5dc96fd856fc7998831a9590fd96a9b04000000b01cfd027e5fb7b67dccb7c47aa83956fd43ae20939f4b09001e89aa28d107cab68a6167d9740005ffb83b701b3214879a2e10ce5654a302fa77bcc557b30be97442533c7b39b7784a61f5c71629f932766b39c657d6a04457bcfaab0af6dee3a5479e02d0344a451763ef46c9db7dfc052b1199d9771598e719f6877f9c9273ee79996f33697eb85274231c1f10ebbdea162914367c14ae8c95d9dfaf90b92eb85ec362ef8db9b80df448410478776bb5380000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020100000000000000000000000000000000000000000000000000000000000002020000000000000000000000000000000000000000000000000000000000000203000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002050000000000000000000000000000000000000000000000000000000000000206000000000000000000000000000000000000000000000000000000000000020700000000000000000000000000000000000000000000000000000000000002080000000000000000000000000000000000000000000000000000000000000209000000000000000000000000000000000000000000000000000000000000020a000000000000000000000000000000000000000000000000000000000000020b000000000000000000000000000000000000000000000000000000000000020c000000000000000000000000000000000000000000000000000000000000020d000000000000000000000000000000000000000000000000000000000000020e000000000000000000000000000000000000000000000000000000000000020f0000000000000000000000000000000000000000000000000000000000000210000000000000000000000000000000000000000000000000000000000000021100000000000000000000000000000000000000000000000000000000000002120000000000000000000000000000000000000000000000000000000000000213000000000000000000000000000000000000000000000000000000000000021400000000000000000000000000000000000000000000000000000000000002150000000000000000000000000000000000000000000000000000000000000216000000000000000000000000000000000000000000000000000000000000021700000000000000000000000000000000000000000000000000000000000002180000000000000000000000000000000000000000000000000000000000000219000000000000000000000000000000000000000000000000000000000000021a000000000000000000000000000000000000000000000000000000000000021b000000000000000000000000000000000000000000000000000000000000021c000000000000000000000000000000000000000000000000000000000000021d000000000000000000000000000000000000000000000000000000000000021e000000000000000000000000000000000000000000000000000000000000021f0000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000022100000000000000000000000000000000000000000000000000000000000002220000000000000000000000000000000000000000000000000000000000000223000000000000000000000000000000000000000000000000000000000000022400000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000226000000000000000000000000000000000000000000000000000000000000022700000000000000000000000000000000000000000000000000000000000002280000000000000000000000000000000000000000000000000000000000000229000000000000000000000000000000000000000000000000000000000000022a000000000000000000000000000000000000000000000000000000000000022b000000000000000000000000000000000000000000000000000000000000022c000000000000000000000000000000000000000000000000000000000000022d000000000000000000000000000000000000000000000000000000000000022e000000000000000000000000000000000000000000000000000000000000022f00000000000000000000000000000000000000000000000000000000000002300000000000000000000000000000000000000000000000000000000000000231000000000000000000000000000000000000000000000000000000000000023200000000000000000000000000000000000000000000000000000000000002330000000000000000000000000000000000000000000000000000000000000234000000000000000000000000000000000000000000000000000000000000023500000000000000000000000000000000000000000000000000000000000002360000000000000000000000000000000000000000000000000000000000000237370000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000030100000000000000000000000000000000000000000000000000000000000003020000000000000000000000000000000000000000000000000000000000000303000000000000000000000000000000000000000000000000000000000000030400000000000000000000000000000000000000000000000000000000000003050000000000000000000000000000000000000000000000000000000000000306000000000000000000000000000000000000000000000000000000000000030700000000000000000000000000000000000000000000000000000000000003080000000000000000000000000000000000000000000000000000000000000309000000000000000000000000000000000000000000000000000000000000030a000000000000000000000000000000000000000000000000000000000000030b000000000000000000000000000000000000000000000000000000000000030c000000000000000000000000000000000000000000000000000000000000030d000000000000000000000000000000000000000000000000000000000000030e000000000000000000000000000000000000000000000000000000000000030f0000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000031100000000000000000000000000000000000000000000000000000000000003120000000000000000000000000000000000000000000000000000000000000313000000000000000000000000000000000000000000000000000000000000031400000000000000000000000000000000000000000000000000000000000003150000000000000000000000000000000000000000000000000000000000000316000000000000000000000000000000000000000000000000000000000000031700000000000000000000000000000000000000000000000000000000000003180000000000000000000000000000000000000000000000000000000000000319000000000000000000000000000000000000000000000000000000000000031a000000000000000000000000000000000000000000000000000000000000031b000000000000000000000000000000000000000000000000000000000000031c000000000000000000000000000000000000000000000000000000000000031d000000000000000000000000000000000000000000000000000000000000031e000000000000000000000000000000000000000000000000000000000000031f0000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000032100000000000000000000000000000000000000000000000000000000000003220000000000000000000000000000000000000000000000000000000000000323000000000000000000000000000000000000000000000000000000000000032400000000000000000000000000000000000000000000000000000000000003250000000000000000000000000000000000000000000000000000000000000326000000000000000000000000000000000000000000000000000000000000032700000000000000000000000000000000000000000000000000000000000003280000000000000000000000000000000000000000000000000000000000000329000000000000000000000000000000000000000000000000000000000000032a000000000000000000000000000000000000000000000000000000000000032b000000000000000000000000000000000000000000000000000000000000032c000000000000000000000000000000000000000000000000000000000000032d000000000000000000000000000000000000000000000000000000000000032e000000000000000000000000000000000000000000000000000000000000032f00000000000000000000000000000000000000000000000000000000000003300000000000000000000000000000000000000000000000000000000000000331000000000000000000000000000000000000000000000000000000000000033200000000000000000000000000000000000000000000000000000000000003330000000000000000000000000000000000000000000000000000000000000334000000000000000000000000000000000000000000000000000000000000033500000000000000000000000000000000000000000000000000000000000003360200000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000401100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000060a0000000000000000000000000000000000000000000000000000000000000601000000000000000000000000000000000000000000000000000000000000060b0000000000000000000000000000000000000000000000000000000000000602000000000000000000000000000000000000000000000000000000000000060c0000000000000000000000000000000000000000000000000000000000000603000000000000000000000000000000000000000000000000000000000000060d0000000000000000000000000000000000000000000000000000000000000604000000000000000000000000000000000000000000000000000000000000060e0000000000000000000000000000000000000000000000000000000000000605000000000000000000000000000000000000000000000000000000000000060f00000000000000000000000000000000000000000000000000000000000006060000000000000000000000000000000000000000000000000000000000000610000000000000000000000000000000000000000000000000000000000000060700000000000000000000000000000000000000000000000000000000000006110000000000000000000000000000000000000000000000000000000000000608000000000000000000000000000000000000000000000000000000000000061200000000000000000000000000000000000000000000000000000000000006090000000000000000000000000000000000000000000000000000000000000613000000000000000000000000000000000000000000000000000000000000060a0000000000000000000000000000000000000000000000000000000000000614000000000000000000000000000000000000000000000000000000000000060b0000000000000000000000000000000000000000000000000000000000000615000000000000000000000000000000000000000000000000000000000000060c0000000000000000000000000000000000000000000000000000000000000616000000000000000000000000000000000000000000000000000000000000060d0000000000000000000000000000000000000000000000000000000000000617000000000000000000000000000000000000000000000000000000000000060e0000000000000000000000000000000000000000000000000000000000000618000000000000000000000000000000000000000000000000000000000000060f0000000000000000000000000000000000000000000000000000000000000619000011000000021c000000b005d3f35b85943fbddb15a2433e40e14bbffd0428ed377207d839681071f323671520817318228f81de9d553782e9d26938bc40c34fa0fba8075909f678683659288fe980bae96c9b33f338d0276829263fab2aa15135b34ecaefbc6800ad7673bf58e42bc531548e86e38ab0ee74d11c2c8349ee27c824cf11574c53343c188e0ea5e7de6e8914f8256bac61e905c40d28d7da4b60c66367f19692d4c3eb475e3bc500bbdbfe604536a22cae93540b64000000b0251f4ff3e7056e2cd64be5b370d3b4657853264dd8b85db8b4d196e0c54cf6b9b7635e9db67ea22335685be622b33ae73dc810f5b43bb72909f53d1c1ef654d0225e69c329f44e76b6e0c4a1560704e6f00ee5c2ee37f36ca92a6caa7083af86c1409e81bfcf68ea7d29df626991ecc81316758ec0a2677b4d755cf4c76c01207f3948714c711b7235e583c05d389a1e29aac544e0be25ee31f86f0025dcf64b92198a605039d9b6d19d6913a0885323000000b005c44bab381c126a1aaa7cc423a4e73540c8b2eaa330cb5bb5f7ab890e8e4ebd8cce97b392d1b37da1572a5b60e7d296cabc500d6a4fa907289a5e42866f31c31744d9cdc57c0ee65f799bb4e3ae7a78e7f7dd358c2be50d8a346169049ee355e207cf1715982a987fa663a5c822ce3721b934cfcad08dc006311c3ee41a95ff2e5dcca6a1b9efa3459d02ff2178c2d8131aac11ed23b259ad0f0d3bb9cec3011a889fe50104c4493c55a724dada810d0000021c000000b0282e8315ddbe1d28a43d3904391d7ff9e56157b7149bd3c023ff2ada27b3eb7917be4e5246ceac49f09aaf255a2ab89c549f771db9803e82087b99c894c5963d88d78b0a566ce1f208dec1f8619b072d5a52a7c57d84856beafe387e51955c0298512c4a245a62b0c3dfcd96bb44b6b80e4afd9df5c64b069c25b98db888b11b343198bdbafaba6e294307f07e5be6a52a08c1828cade61900748ed98e95e9d0face186a15824c40ea844afc2676e7e4000000b0018ade77027eb138c689ff99cac096bcd4b6c881b2e4a3af54dbeaaf44befcf70ff1eaa96b1507e46dc01c890b70e36dcaa7cae66ac6e8c56b416c885948d9997e8fabf97249fc97bf5d4a4bed2a8fc473db0de2ccc98c9252e8d674d918aeeb964a6e8e57709f15f12a471612c379782d8403e301ed90a7c524eb5e7e68e56d2c39aafbb22a57b352674afeeb994e600002089f989e04050f9378edfb65cb4b987ecb76bab125cfeeb31ca7d80fd4e3000000b0043f3ea34f10d219e2d82657bb66470238c8b9cdf618874b4210fb603f55de0895e301d7af4aed158f1e56b1204e106c4400541e07eeb3ae7eeec676c3e9b376aa38fe908b6011c0bdb5a1ec3cac68189bb84a274e2352706e3a330d341dcc147d6ba16e979115057e9aabf78fc4841907aa89d5f2cbaada3e9ba7319325c041425c3619826346837fde90c1519290c8126989fd205d93f66d053c53348e73087720579563033abe3e3ce9978a231b600000021c000000b02e3d38020059e9ca06f8bd85c7fdde9e19af4f8f817095a22b6a5590863dcf7681bc7516c4da2dd536480cbb80da07d7b640778e8e9a03be566f955538ae46dfa7f4a812a2a03c8df74f3d35dfec26f1738800fb5b13908292ee55e7bd4b7c5a2072626b9e9fbc18639cb8776e68c8921ad98f38fda58ed98480f9a0a79871249911480f3001466288f2cf69a8c705ca14045c6cdd68ad2888411a966bfcfca27fd1b1446bcbd89b325254243e1a1c8e000000b019e444b2ccf7a99dfd0431df726c31c61eea31376eb61d6b2b198a84ade14f12403bc37ab2948c4a574251f0e7c3269d9b642cb5557c580dba05e977bfd05e4e4fd9aad21cc73867507380217de6b8bf685656ab12711fe4e5b553ce8179c9b4e4455d61c7440beab993a277571a35891a10715ecea49885d99d7a4ec35ffd704445a84de6bc69d67bf72477461b868c2ceb9aa50b48c784235634c669bbce2cb8fed4ebeba3f53815a1cc0cf91c4991000000b017412f3ef5aaaae27aeed78c816f7b6805f5f68aba9e19015c79db98d2fd8e0689e6237eb9c704e6449d7601c686cacd3c154439d744e0b6708cf0d45f2c41ac260bc236a8d55d9a82eb7fdeaa683d1f83c57ccbe7a208bee5b3b97c6748f23382bf26cbff40086ca8fd8cfb99f3674e105e3e9ace826ceb5dd0105bb1c0b28ef0cb5a84082717d68aa52e27741739c71506e9ced83b2e799630e7b5ad49903b45f6748a4e140edbe97e21b556bee2d70000021c000000b01a7f0aa5df63a98ea42a755baa4bab2f9ddbcc01915321a6239f4898500524e108eb3b3781ffa853bec0989e7a9d344b1cfd7fb0e2ae9e471692e5d134e8554b6f80349d9db23258f8786b522a6eb6ee9e05fa922e441d74db2b1a6610244d74b32f610948a8bac7746fae34d7a9ae12143c22179472ee53e800fb2946b0846516ce59eb6c52e7085920a59cfcf8bf012581d09e63f2f4b1a226e9061c07a6716fe2e049cab0d43dc7b9ccff6d003eb1000000b027fc4265e0529d27fe1d1bcd486234e9e52ee1d185ac7ae023a4956bc16d04404d1b0a4143d0e427aea62aa2a828d488c4729c24fe74ba51403361ed886e65f4d6670ab1ad552c9dcfaf6fcdaed5bc8fbec2e074893f129e330ca403ea203bcfb568d35928457835eeab95b24f0f971b0bda55d51cb046f70d8b9972c3a0ec1a401b0036a23d757e66a6600c3c3f9c3d26670e478869c801e7ec94bd0dfad8ae1a217e6d8a7587dbcdf282a87bebe540000000b009c58f410b07d63948e62c2e8c3b5a153c66ce08bdd5997f98e40191ea7f044bc6af54453c666d3675d72b5f3a03f29bee37282430a84c1df10cff5fa50a8bad5479854836d586c189abe746181ac37136b110fc135635078175535312402a87d905d11d1a6217fc8fe4ec9b875a1922277752dcb9a8c3d03aabafef5d1c8d7e71caccb28e67528a0170c5dc6592340e283e14b66705f6c884067f743e4237a95b549571149557e7bf088da9cd77a27f0000021c000000b00144a2d285e971c143fc66d4947aefbaebf502fa15477c0c25cbf3b58f8f8e136c07c2a0a5d3e85903dbea20c1634d28390af1d9582dfd539274d09c1e4903d312824dafd88fe882f34eddb65647801715fab63a765c4124b2199bb9881d5df3d219a8166c04d596cdae6f40cc071041138057f790246370e51c738cd67099a13c3819afb8b128aba0ddd4fbe60c41ce0bf21298ba91f5256dfdec2a027dd40e9e8aa2384fd48569c31e24f539495788000000b001d6dc44133b025afa69a83eb3fa0effdd4e76ed857c98644909d3a7d95a52d67d3491a0aefe2dfa1b3260a8aa95ebfc4bb20a6344b64f4b579ffc9880ada0b41dd0d0e5b726cf58ec6420acfe895d2b34e6baeb3712a268f054479a1c03c3afbc1372dbcdf72bf6fb8e7ab9514810182374061678c2bf5d5d1767662f8932d120cdc6b40a1906c55ec59c200b4755f41b540d356b20cffe7bc890a01f7859f54313b2300f397d412c6617ec5a20bd55000000b007b58c154a2751fa894af555b59da32bf374dcd565820a8b1164c804138bfc149039abf4434f66e313bcf1c83764a87331add8bb321eb8505e9d61cabfd1dd4b910e99dcab2474737a2b8367d628b09a22a515829bc04cbdf69f65816451b447f8e5bcac10ac0c34201c12ce85a6735803e1799b5d7919032a515d870f4f39e28624d8ad85c19cc7755a794d4ed4de801ea030d0c9f44b706b08e648cd96e3200370a99e9ec87461d0c8ccc370380dd90000021c000000b00c2553dd081028b65fc72dba80b548db9e863a2016617b8e0d28d5b4d0e9645d659c3975ffe4f32eb160bee10c0df7b5bc44ea0ba4288c0ba87725b015f4c91a9cb6d40b7de35f7510b48d697ab708d8e79f0dd14467b782100907e329959603c3d6ae4aa1343ce34d4fe0f829a9681e2ca84ad5e2d325f0bc18dbffdc67137a58eb2a75911e8bc623499bc9b7a1a1ed00a83882e4ffef3b3dd9b73d885f3dc994c43fa08c04cf5227de287547837115000000b02fe0547a5253b04c89daa0bfd8aca7b3bfd62a6ac1dacf40d26ea819404d26b16329bf96897de345cccd0b346c6b611aca7255407340ab199d42d66e3fdefe33250f37a3490b5f2ce26d7b7333fb59d9c529c275092029d77366d5a911632133dffee2f5cbebb4af6460e5c4e5e82ba309e8d0fa345bd79883f7cba626e0fc625ebc9da458c6fb8f4f8a7c8ebff18e460046fd472ead15ad4571ff4a46ccab987ce83b52f4276a18a9b3ea319a1b314c000000b01131b52f5189b18b060bbb68a1a15eeb6de938d1b8079ddabf33468383fa3925d4e3e4f10a39b3dc10ec2a8065b7776eeef2d7343f07ce20b973db4734fa8d6bc59e52f847c23b399f9ee9d0dc38b7a9621cd554b2b9d4e5ade6149ed32c1c199b85d2d0278ab6009e36857ca9e8d8e70f307c41683e6102cb53cd945458f453532e861c6e34757e3ce988df99b943fd29372b868410c6c88035ab682a14307c357f383e8157f0d91756534ab2893ff30000021c000000b01a823a05f2011535a3dbcf3066177f9cdf04a3a43baaf955a2652d192a05449f1f17a7b8eaba84b0fce6e784a0323d7a6350eefb3009e5c1bfe3c0164e1624539b8756d4fe3481d6745cd9ee6267a8f9d8a8e19a31aea18762f2b7f6edd7172246be9772c004e0620c3521d166d8891e20d58f6aab923d8d852e8c8a2c649ffd3a647417e817ddb79aef2f837c1f67c3168dd42aeffa740696d6d6abd1d552fe030d77831ef4ce9534aeb1f30c0114fc000000b0017fed12cf69b0d286ffbee9f2eff931dd9fdaf49e2c818a575fe0b6514944d54ac2a0a670133e8f2120737dce958ba6c629bf5f30a8b132fcc7b9b457987b14ec7763c9414f3c9b6b8dcd3040b4752148934a77e11d31a3c8b0ff9c98a43e5b8ea7526adf63b5e76601ca091c33131b1208679b0d493e88e5520d32be673facf14ba14b76e3d1447bcf862282c165d71466281e34ed5cdeb3f6d158e322beeed2fbc530ccbc73bb61cd21928a34b182000000b01914716e86b01636d5ec2796b6efe1131cf1ae974201e9afc508ca6c0284971720b0448368da425adea2c56febcb229a6019a2921e8c3e7ba9ed45c795d25acc5bc7f23505187b057693d7db7472db8569996fe821ff87f6c64ffd30438f5fc8ca6109fe56484496833417c85f24c3261b1b6ad0d8f53d5577e83ac16666ddeae889ff4ee004734fd047b390c7d75cbc14f2dbf5f73bbf82c54e9a2b9047b6a8f137b8786791190a8e34bf872d3f59940000021c000000b02431b75ef991ae72014bc0ad40f6d92c7d88f74b846cb4c7acd0ba21d1425b04361073b7504573cea1522b866522843d8b85b6d4b680e293588c589f6bd95c01c9c2db71fdca13be9c862ddafdcc4a52fbdc092f6e63998c4bb84bc646813d29e2ba9b1f837190e88e5a8669ae63175e2c7e882f5d8d65d7ef896cdb8a55080b49d8acba4897390b30ce4d06babab5ad0cadbe790146c01d7d004225c26fafe7ffd7a34c31f96f0bd98d6ad348f13e92000000b00099068c6d39e682416b7e082f1b7fb92b00cce9dd7a699d7842920eefa97ad872f078899c5f79ad6f8150ea431605a993c5c727182afc4a5b8f5ecafb000f3f9e82ca715e02a65b152aece26ce95d6028863b52d68a589f375069bacb4e6409c18f886d8559b9a26a9a350de8c257760d6b9228a921f97d9912c67c9226b054c8d07cc3132018ad60367af3600a01e92df31888929232269dd99adcdb6c26d550f9a1466ed183934aca6a3c705945de000000b028fc048841ed315558d919c65471c040d9702ed0e84c517ac666c17d111527de876be4730dce5b02167eaf137c49948a253a7d9b834af2f51113829fe3bee5e55c230c2e2b88d2c679d45897f39da5b7a4affc9bc5e9bdb5276990a0fa32819ea7e3dc289f88ae8598a49b4ad31920f600e0da3d185294492ec6fc65d299b4c175627a13ed06908873acaf24cbc7a7eb162470f8664e5accbb13144b9658c12ce22725637b97d7e7c8975836f023a8e800000fa400000168000000b01a8cb98a41c762e3b623664376932da10773c35981e07e0697bc5b1c3a9d18512d0f727af185cd3cebbfd0ae4dd83b05907761012bcb8b3234490e8e5d2b1e5c42474c2486ca936b892b4ee5ef023b2fd5b42e9c622a11caf6d127033a8ee90e802b6b52a8e4f86d0902e715211566cf07b75486fb44b002dd502567ce5037d6cddcf57a6f399781e1d0ada1cfc979021c0cc8bdc99b3e782220cd3c4dfaedb3d0d2abacb0c2f615a3ad0e3b047f9bbe000000b001b8cac023ea2209df50ebf5096c203428441504b29cc88a2f37f3c536926804aa0a794a506738b4bf2dd6d54cc7fdfa61726a81c46b315671ae54e23736c201971c4081f85deae5e92fcb9d4182d31287c03f6037a638d657b1c383cc0a5e11817eafa2e6fd261f65d3ee9cadc2c1b5237071db3ab37148e405b5e966c269749696c982d442bdebddeb4108f0e733fa0fbef563259ef98478b3247edcb3ced95ff67f71c8fcf4adb9ccb7e8976a463b00000168000000b00926e8b58a6f84470914b3018d66a9c3eb2eded62c2589faf2983c88b532add1d2b419bce240fdce26c744bc1afd76910f251a4868b2539188e597f94134bd260f1a98faeca5c433f24c1c70f40862aa1e79b831fc9f44441908a13e4135b898758d4b9185bd588ce297f664a15820f00b86429ef1e60656fb59a60d09058c2e8c6935d020f2bf7f9cf332d6c92e99d00b137e0201a2d98c52c1fd84ef9966166dc58f658583e5feeed1caf9378a6bf7000000b0109ce1e31e822ac6756ea2c1f60454a45b59aea1d06f0ee46b63686db1b2e1a5a8d828f64b1c859d19d8c1be9ba4158637bc4475b6852e3868d123e2ca94ab82daf3843587c16b3ea7a8a1980f06348b43e520c8a90d923329cfeaebeaf80a4b720ea9a131dc5c5e2f1b466e33d55c600ad897890f3466634564e00170bb21ba1000eac0b6a6651f371bd9d7410e3aa003b839ec23b3d26546f930f3e4da30b16b584e0d40ce3e8c7c6e8011bbaeb88300000168000000b02460f48a085ae3e52bff12f74e129688cc1d0910bc945f4e361500a053822013a20fbf5a854eaa342d01b1fd650660e71af42c8b747a9e0ff26f509db1b596029f986112d7b98d2238e9cc481f3778d379dee19ca9b65c753b3da88c81a87b9be469ba78b6502193b892988b46f668560e002d3f8a64752d01465d6e81affab7fbdb24b59cad7b2aca7257f33f83236b104f211d1960ed1b5fae088c35bf91ca6ed6beff2867381225b9b6db84b31c9e000000b022c23bda86f0f30eed0b4f7f6c42b55231cd69895f7670a292742b1d769a0f06a4b6c9385111e140f0071d480c3d3ea1f5e60a122efadc18a648b568a93a54c9550ef7d80f49a8b68a8984fbbcac3d18ba11e640b6619e8a935c6df1fad31a87da57a18cebeec486a0331eaf304cfd12237e32e406755fd20216114bc86c2aab649cf79c01ffc7a87531efd358999a941fc0d8480ea13fe3f2ba8b7d6f7e2fba227e99aa4a206cb03b0dae664cfff49300000168000000b0156e084b89a04d30c4b4dce813ed6720a1a521a8273c599f402448cfa0604b571461f709e9b7c38e555360d1dd11e58fb81cd7f95696f62017feb0caded863c0a8ada19670c119c3c350c366996b37660d722bd57a12d1df8c652be09e108a3e133934be19c2fed4299cc97a9a7a3bc32aa16bf0e62e1052829721766b98c53a4d35f039eca22f160bf0784a7f1d205900c1f5b2799f49153eb1d1a2b91194683e77483c571cf13ed43b027a6057f35d000000b017caf09bc95753be87be3b475ec994efe7f11f98e22bc17d1996d3cd67904d161561d2a6262fd6daeabf41d2a8489625769d6ddd32b3d9ac7024963af9e630b5385748dbb49dc77ac0b0abd05060419402f6f6b909043c2c8f7d8e6717ac7f3eb57348c3f70f8f914218a513b0af1e732c1e466df42f6b7e76b871a862a1ef84c54b3e2e4ed0d881427335f9361ef37e1c79575fd21e3931c551e45b50571706338055b3502a88951ed41dd616b783ae00000168000000b01adbe6a8f903ca726e38b0b3db5b1acbc588ae7215996f8c2ccb04b3d71b3c8d456ecfe031b130d1e15bcb1c82f0f8678918e28792c7aa358cb9642ded68857cef2bb1d44d869f1b855bb10d550645bfda203e3f0ce4c33e8cf0881225aea493a12455ee2d31182f8e4a910870b21ccb0abac2efe192f70977c7d2797337a2644387acbda8665e4306d7492858b1385524cd4f9910ad0449d250b52e0cf48ed118a4a5fb3cd74cf99c5ac7b9375e377f000000b00ec7efe4d92653429e2bcee7a8b5ce815cd081e176ef6fe5b93e72721af0c282378915a5744be821d32cf8121593e5bcf9f69c36de4ba6a74e7723ccaf5aee57ce1678eb96fda3bb1b989a6d5981644f65624a19adbffdc4c9ae99f3284f3f3db9e2bb75e2d6cb9cf90d083dc0fc13bd0a4485d3ff89098b974ff01286fa7318b1b4ba0cf65b37baee89ddc1ca54e85313d981be599fd150a33825baee5a242bf04a4def8919f81068a8823e0b2aa39e00000168000000b018e65042e761dc1a9bae64e084a2163cc39616076775fad6b69fb90e6c72d3b91800847cf5ad4516e48a81aaf4126c0fde214583726b629b1719db4bbc0542c258b1d6e7cec44ee265b0e9f1102ec4b4fe15ae15bcfb5294b0bb8dc8e7063d12f1acfc8060678ab470b82a316a2fa8f606b1e96a51a7fb09cdc3013c930cdf272037d9412a996afbc34b59e7ef65441311b848c9ea5ad0e15de1a993e2f4da7fc4b548f033437bb6921be6a913b01b97000000b002987151fb2d92f8c7a2437313dd071b46e00b33590a7dfd1026008931d5a4d1a9524dc2a1c7ed51e292751a56e450b4d530e56275f48f28c283ce624515bb830b3d7c81815fcfad2b7ab3afc184e14da3c58949d91de44fe1d354c9bafbf244bd47513235e959718b2e5fa70b34a35501d2925505b444d7fa128297b15e40db76b96133aa8866ab3dacc236b806cca118787386f97e28c38d7e7d60661e35d850c1366fc43d86f81d18860d311478a900000168000000b02ffa4f52b24c4074c6b7478a0aebe6948e702061ca42eb43c4c8cbfc4b0ca3f847d796fc10551398a3624d7dcfcc39563e93d99542e6d023175ee687d8b76479498470e8829b73ae39cbc37e3e55fe164568184f5fe42be693a39981b219acd7c9291e8b908347e7fe19a6cec0f3e57412716593f3443f2a960b011df443b561818f1ba0e6572dc8fba690e5c003aebb2ed0df82318a629afa2b894abfc07543d893fe7ef5c038b48ec2c7999e9ef5a1000000b02328dbf75069d2627c701cbc32ce0ada3487a76a44d27aaf8ec6597d15fce511e82a94caa1c7229c68d0f84f242ce9d1db8a337b1d5ed662d78d0c3db783b86611fc0a94c960882ecc4a31ee14868384c392a9d30384954aa92603d7fe201bb150eeb4f33e6ca9c663e42ffdffafd6eb2659064574d5d3ce72fe778a6ac42fd95d7d61d852ee227780971f49a086a8e52a11b79f45af94ef2c954897490af4f0e32c89b5cb1cd80ad667c505e935bd1000000168000000b02086ac50475b8bc87df86efd06d485d696460b802499140cfa6b4defa72151255f94d710c2ae907e36ce807293d730eb14e62345f8e9f97770b594f7b458b497e17916b7164dae02d23247a0cee6447e282201ee42ac6ce8fc7cefc3579af54dd75980e7a81c3a3385f7c66bb4fca8fb11facdde32cece2dcab2041bee9bfcfee2bd0936b5fbd971a036b02be9280b161b1b4f64a97155cbd8f65ecff8b5a88ff98b7bc93036b377d9e1ff7f50b5fa8f000000b021ad6d960281f749ed8b77f5673dba1b3bbd1446082105eb024bee71fa911b602419e8c52d20007213228567afdb95235f8640e7491fa56c9a811df04166e88d4975678efddf90f52ca330f8ec71d20db9bf4f720d13df29841153c5e6eabeb3d4c6a49f36e56ec1d83ff105e6822cbf09168a64ad4e4fe37d6c0df93021b72d8da8f15c2bb94ec4bf87cc3379d82213123fe0f557a49014a2f3778cffd0ff0848dea45dd996ace2727998b04b81d28f00000168000000b02020b8481785455676c5ccaf3aea8a4c3d7ff3c5368e319fb6fe333afb391869d15d5c52bbf336e44134feeee658690c5f07e5925fd2a5887cd0439601dce3b3f5fb26e5bcf140be182a9589f59644d1eab5ecd26eecec4a80c2c3278aea448fda1232b5e480e3ecd881a4cbd8a97e4a04834e343d470a35d40f03b52b17bbd58d67d5e5400208a122fa268226b0c8671bde0ef732081c6e414db466776c7e5b2739f01927c43167056f9a2687c6aede000000b02a51498f711415acc4f100d1e844630c11895dd243061c6279bc6e2ea994b39d913cbdd90b8750896c9e9b809746e9f079bd4425c34d32747bf41905787cf5a346534d7f71fe5d5433f117524a141059dddaa3dcda5974e3a86a53f7a4e41e92b58e4583a6c186f9c729b5a4e44135b70bd8b6885b9e3a11f2103e32d5edc11ead0258cf068ef13d58c0fa34c5ce7aa22534f44ad95a2730d00c8b935a9f9741a808f5f7c6876bdbfaab7e87b218d37200000168000000b004793bffc2ac19df594a05c0460ccb7faacf7a211bd7d48650d7dc69d933c68714eddae34fa959502a52f2a76a537fc7ed939d0e9bc51e2f577c9718c81745696b2b7bb41812076ae79ae8afc83da298e2fcad45dbb07739f2d4e646cf7669fc472f17fb420b56c3079f3d6d79a3c6640393b33f50a403f3835af56172513f3456bc37dac40229eee3a7c429c95406b5000f121ec96c1c67d24ef753754cb31a485b8020381424a6e6f7ea45af5a4f21000000b0047d25ce9473cead86fb16e261eaf5ff059b786cfc970ceab262af3a29ea2db863bd267a7d31cb3a61c452cf7ec4bd4520ce978cad3ebe8eeac5987a73548848e777043f68ad4488a449244c549ec4f9642e89727c6bfc21fd9072c36e61f8d0db3b8fac510921a993965cbd0fe59f9b16e04d1279da683d9559e05825e65e13c48daaf24b71c3bf78cfd96ed8d134cf13146e620eaa44d957b52d34929356d82ee6fa15cd7fcef45545d124e87a919800000168000000b004f520e015b9fcf3514aebc3ff667485156ba99dd0283bcbd685f3d3e127f87097a73ff0c864f2d2033d782c7b02ad36848f4c5c189c15464c98c6a6c13b3f36ec61cbaf1eef7120044605e9fca49d174e82c496e620b95e7f3727869b117dabafbfc11e008768399f67753a54f1c3ad24b5dcde714db721bd64d03ef3849d4f905a0034fdf07765c62d77fd5b3a2a0b0fed5eabb0e7e855a5938e6ebc9c048cfa8ec5eba38a3ecb74d696497e75b981000000b010eb2ac1fbc595f33e14d97dcd7b8b1c6270b2d63cc5abd1aa495e1483e814daa3a7245dc8457c4a4e0e95dd52d5ebdcfef5631efcf686f647d6f95da3f7393b9c225488c29a14a25d593ffafceb21f0040528b1b297f378632aeec1a557242aef2da67c556c860c2b8322407ad51bf608710fd56d900efc3e73423c5f72e79926c32cd2fc79f730c2709d6947ba40850858eab1daf54733d52d5d11b34d636c7d804b2331c4a2a9720e3f67608846fc", + "txsEffectsHash": "0xb7e1130633f3173f7cb9b78fb6e82a99c39ada6ab719e96195d641ce2a4c2591", "decodedHeader": { "contentCommitment": { "inHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "outHash": "0xc2db86162c987f9328539ebf11947c30e3846f8bdb7a820aed2bbabd9544b9dc", "txTreeHeight": 2, - "txsEffectsHash": "0x96d6dd6caa42f221143e36451601ea093b69d59d2cf21ef49822ed185f9b8e9e" + "txsEffectsHash": "0xb7e1130633f3173f7cb9b78fb6e82a99c39ada6ab719e96195d641ce2a4c2591" }, "globalVariables": { "blockNumber": 1, "chainId": 31337, "timestamp": 0, "version": 1, - "coinbase": "0x2c4ed998adb9ea58602c2f521338d85e796983c2", - "feeRecipient": "0x08e3c9234b16ba719d1fa970253ee4631f0204c4dc25b86b46eef390ab581e80" + "coinbase": "0x65a2a896586e32034cb3ca843906223fc2cd313a", + "feeRecipient": "0x0b235aea8996db40f47d82e4c76f348b308348437410b47527d4c347ff70900a" }, "lastArchive": { "nextAvailableLeafIndex": 1, - "root": "0x0f045bd8180c4de901e18a10e9393ae42d9ef7928fe6b68568cb48b91d1355a7" + "root": "0x012a86560737adb075e12af8253fb09abf17aa841fb56d180bc89f0d2d473c7f" }, "stateReference": { "l1ToL2MessageTree": { @@ -80,10 +80,6 @@ "root": "0x0a241c83a063083fad29b6c333afcd968f71f8a875544ff1f1f08cae7f770f51" }, "partialStateReference": { - "contractTree": { - "nextAvailableLeafIndex": 4, - "root": "0x0135cf87b15a9f4b3deb2fde9d2c6f75620ae779c6b62f677c42aa70af9a50fd" - }, "noteHashTree": { "nextAvailableLeafIndex": 256, "root": "0x02c672a4d7bd90c4b6ba35bbc9906598862f626554be3cba05de19265a8ece71" @@ -99,8 +95,8 @@ } } }, - "header": "0x0f045bd8180c4de901e18a10e9393ae42d9ef7928fe6b68568cb48b91d1355a700000001000000000000000000000000000000000000000000000000000000000000000296d6dd6caa42f221143e36451601ea093b69d59d2cf21ef49822ed185f9b8e9e0000000000000000000000000000000000000000000000000000000000000000c2db86162c987f9328539ebf11947c30e3846f8bdb7a820aed2bbabd9544b9dc0a241c83a063083fad29b6c333afcd968f71f8a875544ff1f1f08cae7f770f510000001002c672a4d7bd90c4b6ba35bbc9906598862f626554be3cba05de19265a8ece71000001000ed22b14764d5756c4e97521b31e93e21192b98b3bc2e2559e07b1263ce7b1be000001800135cf87b15a9f4b3deb2fde9d2c6f75620ae779c6b62f677c42aa70af9a50fd000000041faf8e36b0fb8fb337acc1c32316e1fcbd0465d53c47a2dd73ebb031042566cb000000c00000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000002c4ed998adb9ea58602c2f521338d85e796983c208e3c9234b16ba719d1fa970253ee4631f0204c4dc25b86b46eef390ab581e80", + "header": "0x012a86560737adb075e12af8253fb09abf17aa841fb56d180bc89f0d2d473c7f000000010000000000000000000000000000000000000000000000000000000000000002b7e1130633f3173f7cb9b78fb6e82a99c39ada6ab719e96195d641ce2a4c25910000000000000000000000000000000000000000000000000000000000000000c2db86162c987f9328539ebf11947c30e3846f8bdb7a820aed2bbabd9544b9dc0a241c83a063083fad29b6c333afcd968f71f8a875544ff1f1f08cae7f770f510000001002c672a4d7bd90c4b6ba35bbc9906598862f626554be3cba05de19265a8ece71000001000ed22b14764d5756c4e97521b31e93e21192b98b3bc2e2559e07b1263ce7b1be000001801faf8e36b0fb8fb337acc1c32316e1fcbd0465d53c47a2dd73ebb031042566cb000000c00000000000000000000000000000000000000000000000000000000000007a6900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000065a2a896586e32034cb3ca843906223fc2cd313a0b235aea8996db40f47d82e4c76f348b308348437410b47527d4c347ff70900a", "l1ToL2MessagesHash": "0xb213c9c543fce2a66720d26a913fe0d018f72a47ccfe698baafcf4cced343cfd", - "publicInputsHash": "0x286d86eedc3f2ca84f8b763c6aefb535d85a9abc4c623407598493a4f0d7b513" + "publicInputsHash": "0x0f1c5cc2f7cf377db61e237f280f3902f15fcff51b70c90b3e0ca8919f65fa04" } } \ No newline at end of file diff --git a/l1-contracts/test/fixtures/mixed_block_1.json b/l1-contracts/test/fixtures/mixed_block_1.json index 194eb1d1b89..22ddcca1af3 100644 --- a/l1-contracts/test/fixtures/mixed_block_1.json +++ b/l1-contracts/test/fixtures/mixed_block_1.json @@ -52,27 +52,27 @@ ] }, "block": { - "archive": "0x17487022538c3227b4b891777c671e7011b13202dd570a112ec43e79eeab3607", - "body": "0x0000001012e5643e26da426570dd999e0e044e5f83d60f3cd813c55059bc0ea0f4a7c9d413b2d2cea949fa0876265cd8eee3a4dce1e243783562ea07e2de537f469f7bf627abb3d4560e786bafd52f77ac52dea36c50419f32386567bd969b0c38e1bd7405d339cecb99fa74bfd631917f965357f0341d8c4dfe6a8f4b621d8df54c82941d560ac24523012499eeca2594f20ce238b7d21b98ad5c638767d70ee05532c2183e6d64e69b005709dfc4771c7ca5981adc54f3e8bd1b00222461ae90e44eda2f1d4572fe0b0b23100a7ea6d4780b25e826e41ca9e71897e010bcb218887b3d036d44eb30a430b5cfc6660270eb5fb7f274689ac73dfa53ba9d0739fe38637f01f7130af8c5888d4c65ea68109a1d58fe8d7d1ae62098857b0a3a3dcd393ef80ed8bcba6eb5e3b4887a32c51c5853b97a5eb59c87c520f36423c6d7be06071821ca1719330de5e3c51a521778b49cbbc1d53f8ed42e0562bf21ed72e8cb9a410b0e82ef5f7276df41353faef675fb408aeb246b6e2f704cab99bf28d1427e7b0fec7b9929c6effdcd045d3fdcec1d1b73faed495444699fab936630d69b519f0bf4f1453db36439419dbfba703b849d1aa5774fe9a5325e5bf3e7cdda9d1f7f2a9c2a035c72fd4a3e383306aff03448f9accc08a2c665837560cec8675fe2512bfaef35a8fb7df08a81001a7fd4903849c0371dedd87f31295f46269c5205dd00000004380000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000024100000000000000000000000000000000000000000000000000000000000002420000000000000000000000000000000000000000000000000000000000000243000000000000000000000000000000000000000000000000000000000000024400000000000000000000000000000000000000000000000000000000000002450000000000000000000000000000000000000000000000000000000000000246000000000000000000000000000000000000000000000000000000000000024700000000000000000000000000000000000000000000000000000000000002480000000000000000000000000000000000000000000000000000000000000249000000000000000000000000000000000000000000000000000000000000024a000000000000000000000000000000000000000000000000000000000000024b000000000000000000000000000000000000000000000000000000000000024c000000000000000000000000000000000000000000000000000000000000024d000000000000000000000000000000000000000000000000000000000000024e000000000000000000000000000000000000000000000000000000000000024f0000000000000000000000000000000000000000000000000000000000000250000000000000000000000000000000000000000000000000000000000000025100000000000000000000000000000000000000000000000000000000000002520000000000000000000000000000000000000000000000000000000000000253000000000000000000000000000000000000000000000000000000000000025400000000000000000000000000000000000000000000000000000000000002550000000000000000000000000000000000000000000000000000000000000256000000000000000000000000000000000000000000000000000000000000025700000000000000000000000000000000000000000000000000000000000002580000000000000000000000000000000000000000000000000000000000000259000000000000000000000000000000000000000000000000000000000000025a000000000000000000000000000000000000000000000000000000000000025b000000000000000000000000000000000000000000000000000000000000025c000000000000000000000000000000000000000000000000000000000000025d000000000000000000000000000000000000000000000000000000000000025e000000000000000000000000000000000000000000000000000000000000025f0000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000026100000000000000000000000000000000000000000000000000000000000002620000000000000000000000000000000000000000000000000000000000000263000000000000000000000000000000000000000000000000000000000000026400000000000000000000000000000000000000000000000000000000000002650000000000000000000000000000000000000000000000000000000000000266000000000000000000000000000000000000000000000000000000000000026700000000000000000000000000000000000000000000000000000000000002680000000000000000000000000000000000000000000000000000000000000269000000000000000000000000000000000000000000000000000000000000026a000000000000000000000000000000000000000000000000000000000000026b000000000000000000000000000000000000000000000000000000000000026c000000000000000000000000000000000000000000000000000000000000026d000000000000000000000000000000000000000000000000000000000000026e000000000000000000000000000000000000000000000000000000000000026f00000000000000000000000000000000000000000000000000000000000002700000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000027200000000000000000000000000000000000000000000000000000000000002730000000000000000000000000000000000000000000000000000000000000274000000000000000000000000000000000000000000000000000000000000027500000000000000000000000000000000000000000000000000000000000002760000000000000000000000000000000000000000000000000000000000000277370000000000000000000000000000000000000000000000000000000000000340000000000000000000000000000000000000000000000000000000000000034100000000000000000000000000000000000000000000000000000000000003420000000000000000000000000000000000000000000000000000000000000343000000000000000000000000000000000000000000000000000000000000034400000000000000000000000000000000000000000000000000000000000003450000000000000000000000000000000000000000000000000000000000000346000000000000000000000000000000000000000000000000000000000000034700000000000000000000000000000000000000000000000000000000000003480000000000000000000000000000000000000000000000000000000000000349000000000000000000000000000000000000000000000000000000000000034a000000000000000000000000000000000000000000000000000000000000034b000000000000000000000000000000000000000000000000000000000000034c000000000000000000000000000000000000000000000000000000000000034d000000000000000000000000000000000000000000000000000000000000034e000000000000000000000000000000000000000000000000000000000000034f0000000000000000000000000000000000000000000000000000000000000350000000000000000000000000000000000000000000000000000000000000035100000000000000000000000000000000000000000000000000000000000003520000000000000000000000000000000000000000000000000000000000000353000000000000000000000000000000000000000000000000000000000000035400000000000000000000000000000000000000000000000000000000000003550000000000000000000000000000000000000000000000000000000000000356000000000000000000000000000000000000000000000000000000000000035700000000000000000000000000000000000000000000000000000000000003580000000000000000000000000000000000000000000000000000000000000359000000000000000000000000000000000000000000000000000000000000035a000000000000000000000000000000000000000000000000000000000000035b000000000000000000000000000000000000000000000000000000000000035c000000000000000000000000000000000000000000000000000000000000035d000000000000000000000000000000000000000000000000000000000000035e000000000000000000000000000000000000000000000000000000000000035f0000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000000000036100000000000000000000000000000000000000000000000000000000000003620000000000000000000000000000000000000000000000000000000000000363000000000000000000000000000000000000000000000000000000000000036400000000000000000000000000000000000000000000000000000000000003650000000000000000000000000000000000000000000000000000000000000366000000000000000000000000000000000000000000000000000000000000036700000000000000000000000000000000000000000000000000000000000003680000000000000000000000000000000000000000000000000000000000000369000000000000000000000000000000000000000000000000000000000000036a000000000000000000000000000000000000000000000000000000000000036b000000000000000000000000000000000000000000000000000000000000036c000000000000000000000000000000000000000000000000000000000000036d000000000000000000000000000000000000000000000000000000000000036e000000000000000000000000000000000000000000000000000000000000036f00000000000000000000000000000000000000000000000000000000000003700000000000000000000000000000000000000000000000000000000000000371000000000000000000000000000000000000000000000000000000000000037200000000000000000000000000000000000000000000000000000000000003730000000000000000000000000000000000000000000000000000000000000374000000000000000000000000000000000000000000000000000000000000037500000000000000000000000000000000000000000000000000000000000003760200000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000441100000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000064a0000000000000000000000000000000000000000000000000000000000000641000000000000000000000000000000000000000000000000000000000000064b0000000000000000000000000000000000000000000000000000000000000642000000000000000000000000000000000000000000000000000000000000064c0000000000000000000000000000000000000000000000000000000000000643000000000000000000000000000000000000000000000000000000000000064d0000000000000000000000000000000000000000000000000000000000000644000000000000000000000000000000000000000000000000000000000000064e0000000000000000000000000000000000000000000000000000000000000645000000000000000000000000000000000000000000000000000000000000064f00000000000000000000000000000000000000000000000000000000000006460000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000000000000000000064700000000000000000000000000000000000000000000000000000000000006510000000000000000000000000000000000000000000000000000000000000648000000000000000000000000000000000000000000000000000000000000065200000000000000000000000000000000000000000000000000000000000006490000000000000000000000000000000000000000000000000000000000000653000000000000000000000000000000000000000000000000000000000000064a0000000000000000000000000000000000000000000000000000000000000654000000000000000000000000000000000000000000000000000000000000064b0000000000000000000000000000000000000000000000000000000000000655000000000000000000000000000000000000000000000000000000000000064c0000000000000000000000000000000000000000000000000000000000000656000000000000000000000000000000000000000000000000000000000000064d0000000000000000000000000000000000000000000000000000000000000657000000000000000000000000000000000000000000000000000000000000064e0000000000000000000000000000000000000000000000000000000000000658000000000000000000000000000000000000000000000000000000000000064f0000000000000000000000000000000000000000000000000000000000000659010f3ce73a84170550a89b6327549f153857338cb67690d2d45e2208483cfd1b6f00000000000000000000000000000000000000000000000000000000000011400000000000000000000000000000000000001141000011000000021c000000b0156ef7e198d0ac477bd251338e3d1634241fa3f690038e7ba3ce71035969de15f3d565f48735eaafde8315a1fdef211f897fd579e26ab0a9ec1d67dae90dcea5e87977b0cacf9de21c0eee5e0de9c15ddba33b72908db0cf856c713606172ac30d7377c98c52f8d0d78153b9f0fd194b0b95b922e0d6e7f05784ac2b32b0cc0be8c925b114ed0e1cc1889a8de7fefad22b19c69aef9e37f7313cf1b7f85e8ebca9af757113c660c4401c8871feac4222000000b02e703de97d89a6d9de0e2e52db3a5f6655640bc1deafa21642ec1d09710b73cf9fb49f8a209bd1bcc83eeac46daac9289bb7cd4f11338620842352f30ee229340444a500d9cd1b7fea0b1a9e3e8cebeab7f8793b4588047d0617386effd575f1f0b27876aeb574f41fe8464e927a36380c6adbaee86efa34150dc8516cadf73971b7e8319fdb12472e116952c4a01f8809fa0f212a69bc7a59aecb31785446fdb6c717dbc798daf16ac27651f0dae349000000b005bad2516e877d9654cfc0e50ce0124b390a6e40919025dfb46fe8617645573e11d3cff4e17a0849320fd94b5ffb27e96cf49592933f818c4d8a1177bc14c7c8e4d8e2700678c8149c7605f6e4379b1fab1c4148429f25bf7aae4b28d8524a5238a5c2a95a2f8ec334b39e718f7257061caea22d109fe88e9f4380e22d2576f3420f0478e70dd692957030e005644d5514bd8f489ed3442395388afdea102f3696bcbead48a96c5288c31e21bdb2439a0000021c000000b02a098a1245c2cb63e4b1a6f2b572e1a276f496e73eb7334e720ce401bb06a791370e85ef1b02e4d9ed0b73cc638d3e4d08e158d694ed455adb56cd3b6ff08488c4092a9e3d2b6c9e9e390f97db697b152b23c74d7ebdca2387869d8fe3437f8eced36547cd5d5bf49fa18b24d00848a622aca6082ac01609f08da7885bd619face410d8582c2b0283b61ebce6454c4f70236b9904aec5aace24c756bb35860be5f0382f76bdf70bd983d5b1308c231ab000000b0141cb1b960426793619075b6e91af2c748970fc5d3e5e808f646cd25ea2a4d017b4b92d59f4bd0d07e882d2d271f6c74b4672eb7e62cd93a064d5aaf4195facbfbe04e1042580ac295af97eeda514d84714f03d0d203d3d012c7ecd595d6badf52f37ac3aca11d962711fe36b72118501fd881522cc110ef2637125af9c22b43db6e18ea6ecdf6dba4ffdb4e1f6e7e5e2f5fe346bedc236dce26542ceac8dfee8e88a71b5a0f5c1a4876bf2c2a401a72000000b00a150237add5af3ab0bd6cca6ed8b9d5b1a1b0e5968c6a0d9b7034afa6ac6f0cb79206339ffc5fa1034d93af473f0ca82326c78081a7dd5ecfcd87ef339e25e6cfe29d563ddef39b4da619262682b2bc5c7f3182d22395362d825035c9ba6082d79cd5c1b936d91a27af6d49552990651601a780a8766ec2d2b89466bd90c6199f1adc915746c533acbb85356100f18614fe4951b37a9e985cff9a4b5c89a7a5b06649ababff6754f9f6e2ac45facf760000021c000000b03054c2ab469fbf54b80831f917dfd88530ad4b3f3ea1c75b8a920d57fa488d7a2966c1a3ee24eae0db1576548a399ae5897fe4383fd636e113428802009be90b4919e2efe0313f53b1d41c69597b97424ece1b20e32a5972ad1071bf98c9a54e6efe071ba9754425d533589c8194454b23367fc0a4218bb711cd47a50a9fc52630d12256fcfd47248deee1778d622c801705056d1221d63f87268b54128c178aeada6ae10fa0959123d87fb90b79de8b000000b00ff16f4604021522f335fb332062f35b70a8915973051bd555ff0fe941972917488878918810d93d3209672e0d18f40f85b221d16b49ed0950075829590155993dcceff1ec0d9adc7880b84a49c35b425dd5835819cfdc358904cad92ba3d58282a40ebc164af2c73efb488318dfc92e2dc0fe1e6b815df02d194fe7338ea1eb28e11be885c94a0077163b8cfa811cc92b2c85fd24afc90d46c68980456e2dd5a5f308f8013718fc10315ba71376d022000000b000a1c5230cba8f1c4701369226bd894986d88bd65b73355d169ceee9f8792de5bd9107eb31313b24bfc68d5d3d7d7e2ac9a33d8413400bafacc31caa0d81e5bc4b3bdec30e64de90aebc511336c1e8c2096ddde0b1bca9851d3fa3b9a88109d081d39edcbdd876a7d4a6cbe7b1f045ec2a8d85b84e501ec0ed229f4a15dcfaa7d0c24d5ab7778b3209e4e68183cf726404555aa228f57121ac347fdd38f360c93840d4f279d30df6696bc632643438980000021c000000b0138da2e8a932143b7e2bad1843542c7cc7852225c6a324e855b27ece168bc36363b59cccdad0516cb62225f6cec064616ed6fd17d2b01e2529f9785788e67ab3565e4e89f173b2bcedf0913a878df28ea42c9f55413b41d8ec59232abd2b670c6e268358d449aabc4a6146a16d761b622d20885b5e90efeb5b61a50c7b31297b7598ec7c9cf546c719f2cc9c29a1151607a86267e9803d699e2d400891d13b9379a06ee51dba6d2be23710dce9c29232000000b00d3d54fc1772907cb9f1e4ec4376fa4f2724b53688758e5f2de099a85fd5978c63124ea6cf812bbb27e0d2d84355c49d8e6fe9cac7c8904163a7a33bc0d454b32d1967835b9565f1754444464e414dea4d7861add8c459ff644769a944429f4aafb448d989a5e05f95685dda98cb99c20e2437d8ffc8be1f9cab84f25902a187f45f7956310cb38cc4bc70551b326f472f93fc1cffcf777c1135304f4087071b68a52a3536a20c2b33bddda7424c89e6000000b0122070dd44dde48857057e6d37a997d57b8a6bfad519c8050d82acda690cd343ff197d6d6ce2c312f035a1fb40e99031b8804ea22ffce74a7af0bdc9fa31c86863c37a96e3bc39787740818a9d02f5b3d0a194f705169054f22c51272fd148492e1f3cff435299b4321324d4e7e3c84a1f4f1c8dd13ffcd5821f9998eecfa91c8959020a04b137589004d7e499164e8c0885f312cc427615bc02178eadb10efad58b1f5776c75c507cc32723667b08a90000021c000000b007c59b02039ae1f92477d3fc490e02477c4c49b17fcbbaecff7005df61e5caf5ffa55882f866b69046094c03ea4382b59fc34c2f33d9eefa8fc11d77b6928819a6b769468101b0d4a7751e08bce7b1d2da2598dabc5d17967ff9b1f7851abc7959daae09a84e9b78cb1e57633644c1341412de7b82b4bc12d68f7a3c0cb9621e2602803c8d6f7214f55c4e9c920500ff16fb48e92f887758cd2f9d68b5bc6844a625e110495470bcf8fff2bae8ac150e000000b0195ff628eb3f5dcd4421c7675a06b63fd5064285ad3d7186be6064eb0f093b3a7542624ad788e4318c5b219a26494c75e230ae0c0ecd340c2f1e379f692319c7f2bb030973386cd6e6a9dd5797cd199722735f1eaccf75898bcd8f04a1ce5444b6131d9b86c4d2ec3930fb34c829ecdf14b5ab6531174f6accd033cad6229a03ad9c28c851a318abd3d2bd52488b2ab12892e76f493e9b9fe5b53bd3a9b9735321becf5cb4397baa145eadb64497ef7d000000b0255165d66fab68885e340c460c86f5f7c706a9b1b3c5200996e32177a2f7cba279b12f1afce13d7097190a4cd436a83c2e3b6ca66dcc4e769f4f3c609ae9a9f5eb079db237d4ba937b23a43032293a4208dd58371fe606799ba3a3833fd664162707a4876688d2d7c838f07c632b7de1136e582d36186c7807c47f315b4bc61a74eca26a1fa8523cccbbf6c3bc5bf67117857a5c71c916ed62ebea426b072cef0588e9eae02142a1511e782d1544fd880000021c000000b02f40cbb4d14a3539dc1107c5afa180adaa7cd56cf452f9a1b35ca0696eb5f99e1e179cf46581bda23d61429a902c8805c15150de59f0210c12ecb3521f0719fca8af2b595c65c4748460ef121a3bd4abe22d0b6f0767a3821c2a77eb9bbfb6782c290b370e5efd59c46105d98a20c1ab1d5dca8ac4d99d01486d15e17c44224009b3fb7b4ee07e6ccd3e190da8400b7222d55e395ea7f6618618aa7e350d01c3bff8810ddc32050124df004561bb6eba000000b00b11de15af1d1750f0f6dd8375a7adffb365edb5184e1a312e5238a2954b598ee62e4a2a017c5ed85a72d6ee6d1ac9723f3fd8521e12d8c866f1b017b5cab84469a1c724cd69caca5aedd849f331afbc06c72628cd534b7b9de1fbd5462fc0e851868987a91683eab59c8337f981c8fe1506c94d3c47146f2979815591027b48bb7e15725a1aac43fd25069c92c42a451e66f855514f153d7f4b4afdcba42875245449fe3c2da7cb30c42eb7fe00b0e8000000b00997c7750644ec07ed6e7a355e0be515461aec2fc6ed7c3f39a92201fe35af673e1acc9931ca538e264b0605d8f19a785ed54f767c7ffdaca59ca7c950a781f0e620f2158310e309d2bb73bcee00269f9c29adaa4d61486a51d7dbaa95538bf0db47107e4da3a253ca30919d5278d8d0179db4ef28a11fca4837557b7e02ceca85bceee33e8c2b0a7b339bdb2649eee70cc81edfe7bb26575b2ead15c82ed7692a8658425226f2e5147a00fb598142b50000021c000000b0243d77d255022d810e154a33c440cc3dec3bbc65957995f132aef376435c5a46f04d520cf8a3f86bbf2f7988dd52049792a0373d842be6eb380c5c943cf915ad7d942a9a80abf56bcf5e9145fa89773121d5f800d3bb2e1f75546cbe89c84596ba0e8169ed6e4b10e3a908376714c6710d3b989a2c7098ade3252d9a4d8172a965bc5bb27dfe54fa6a467c7e2034701c0b2ffafe6b32ce22f220fb72cd425e2a0bc1e52a9e70842fce1ec95ee79b8e91000000b00a30e3e8eccf8d738606796e3eb72f8a92398655a6a72a9a4935639db0512fe8ee4bfc0a5ba980ef9fef4cdc48df4e14dcbee08909afef6fc48b399651559395f797b2a0d4841448fe8cc4410a2e315def3f1b2de4f42eb7656c2429b737cb2fdacc7155499a49e139ec1b726f12621b0f33c365d0e22438b15351adf84a65d6d1069bbe06a245818cb06b4f1a4cbc242a08cd05b2a96aa313b924b32d04a8df0e6f3bcb1004ca0909acd4220c9a00cc000000b02a1241423788f9b1b192b6f56174a0381c8b4fb839790dbd6513eb8bc2413319e5e1e6585d3d2a5db2812a666b310a62d4bb5d55d53948d26702f4287c606ad6f0c330dabe6f685979b578c49322d5eb6511b37b0b21cca812deb17eabb7eee865cdd2cae8f0791aa2ef199213d02a3002ebc46bb3b489f705a5599db0a49d64c83b84bb033aee1e684a4be427570028097cd135abaded10be9051c616224ab0fb383abcaf00e8ed7c705e86cce900840000021c000000b01f5f3e839df2a20b7debe1a19c4bf7edf5f8984ab05e19878ce1935e3876347be08405e1bcc18fcc1d99ccee6dbb19fb3b121b2042e570a432828c99afacad517439e7b44b20ad521ef4ff1474c395da07e3b4ceab373ba6d61ebc3d2192ff5e1b57ba4be6fab396388b39a81917cf9708a9d21f89ee3862e5ed3be64ed6229937cc10477f4bd21c5c7efbb117cef3a52bc2f4784c1d4a17a341a1dd93f6b8ff577bda2e1f1a0487fe8253950296754f000000b01a5652f8224e3e326b00f2a28a57befa267be3b85d5956357e6c580085f95db681bc8f67632dd8b4eb13b05bddd97ad7840613c72f31ea6984141fac0399d67c863c6137f998b9ede5ad5bae79eb1d0572778789b054c85b72090d7913288f39004bc67e6876f8288a921c314f6803ad1cb0a45f57adb8ff3fa54666f4e660d8243270b8ff24da60543f8d06184060b80986dc8fb54746756219532800f98a4ebbeec381666db6cdb9a76b78b069656c000000b02274ab167bc88b1b6c0a5b1c188558b59a40ca6d512e581f31488f1fef0df8657a8943b662605ab8ca2c0d2e635c3219ac8f2eae05e7ff83b263776c54447cf6313222aac59ae21f9929158bf93bd66747492b3f660d6196b0d73e353168f44cc20df5750ce4607d8fc9b31d9800678b2b9ce7ce4f08b822e696ec9a6d19627f7bc3943f95e8392a4c9dd85cebe3eb231855809a595bf9b06c671f08a3fc46ffdade54d36a6caefed7264a03da9d7d2600000fa400000168000000b02e74f55e874ae4075e437344895cd0e94daec8abd33ed6135c466291c2565da09a30eb596bbb8f33f03a1c02a3e2b8205e2647c784c5c8a9da7aaa0aff93ae470586b13de0a7b9a5474cb3cd37895111b2d42e7450c12a4fad724c546d11e884ad57aa918de78812394226072d40a27e262841146355b97c3e7f7947862d8e411288499beaa62102ff98807c7be9e21e2bc91cd7b03b09ec8565893f4a7b7ef726b2bc2b07a30d0703b456b6a06b909b000000b02f457eb53b46b6d62f456ef317edc4aecbd810725a0cc7a2f8fa614a8b0876e713a5a413ac3ea084c50a537b8d12e295fe4bd31522dc53ba2f19d43facad322aa5b39de43da06392bd1777c6c4b4b798adadb3d887d40b83c0dd86f3cae8c6ecf7132cb069e5c90343ada011d93942ff11af24164d24fb281fd879857fba926486549e0229c9da56d91d0ec4d66c12c815afc04f7b9502c8d7b8f3f4c066d426a9f63d1c1795dfb1bc341272f1769c4c00000168000000b01821c345f41e2ce547b3fe924cda82b069f4e8753639c9f74deb2e3d1066115ec5da118dddceb18a83a16cd784695198aafa7149acc7919b7a313e8c8a1037bdc44004e6895e478440ad03905e21e313a494fa46824de03884015bb691bd9abe0588e33cb4d644ded82b68613b1b5f1523ad547e0aa1d3f0316da99c8b2e82c9e0eb345780719718568ed29f2dff8389199af5e00d6770c90028b30b07bd516d51c1126411a4ace099e5a079f872b0fc000000b006e7d861cc676559b5d26f8855ffe0ff43d81c1ec01266fa326d325ad7effc99d83d2f5e090ce57068c0d7b1cde209c67398c63c490396792d41450888ccb187e0712658243adbf60cd9261cf1b17620ae95ed1f2dac2c8c0e1cdc7c481c5a4a7f209251790c6eaafb8c57f0b2085d5c296fa9ace7b0d44af429492d369dcbd8763cb28ae32341040c99702fb58fee30110544b56ef9146d33c29f5576fa288477075f5de4ebf0e908aa012a6d30bcdb00000168000000b0165da5d25963676b228b717ff4300e33c9fb4aeadd81424057cfaa5cc35adcff3631d678e81a10283b78d4c77e9976852c716fa8526e1b390a084fd6ebbcddea9a25f8eaccfad22ffd99289889eafb47ec11f90355727e737dd33d21cc08c651753e184d22b903e1998aa7313890e79d09c66d498ddc74bafdc153dbb06d5f1b420566118acbac40829a202082d86f7e24918b5efa8959c809271379f56ef72e96a0a7b480a2b5038ec71b6d511f3e86000000b00d67de64657b7705c01c36b506e634d0b96d7e8b5738285c13989dc0eea95ba32b7a5606bb934a751ab9442c6ce05a220b69843b7e9782df7a9db0f733e511573ad2c3b095139cf7b722f6fc9890391ae45487ad4dd44a9114f2b02f7750afa568c966c70f2ff3b4cd09dccaf3c56dc81a79f6d8c6fd8e04dcdae61a26a5b82e136c3dda2e1fdcaf244678bc253c9525131e7995cbab494daafa8427d9995d0bf3f98203dd77bb9c9b9fadffd38464be00000168000000b02502f8875593060d23ff8226a4c3a7ce3ea947dee20c3658dedb6b45d75d3588a231aeb8fdf8c307c653497bb28a157ac33082a1fe6ffa2acbe30192c68888d716e8e2e4d3ee5deb0ab183e290f3cf58930e5f54dfcafc33edd92b49b44d97cce55516550d7c2acd2c45c4815d062f27290bd0cbd8ab6ee6d2a13cf4471e16127c3271c5a9d8ef296d4015a17cb4ecdc29f49bc7b5ac1eae69b6970f938cbe05e9a519df9c0e001731e6dba6038c0291000000b0222840c7fc5fcb864ae6065c4c2f515770b4de93143d94b64a8b21fc52f149d54d5f571cba43943a78e8e2b8abf5f97728a368af0a9120fef8db064850d664b28d9d0d4840974550570faaf83f0d5e63684913a3024e1aae2051c9cd063320ae08cd12b943751929b3284921f585465c13043395c9f140e10172d1400525aa30780a4f9e1d44ddd2064e285e25f0d1da169843ec0bc3c3d985caced5387b49027456454fd78fb6bbe9a215031271934900000168000000b02504cbab85ecbe5e44cdf35db50d2dba847c16a403c266e91ce91db5c82fe4c625acee63a3d293936036bebf6b3a48c1586e312d66b659058d94896203aae6151e7f2cdaa9e15925388bf3ed502765d277d7f103d965dd4f8b07704960449f94491a8955f2c3e1a2544b4e2de8330b4713a142bfd030c12b02f07050770905df5a4a1aa2f446de70f635dd799aa6689714f3e71b46c33c6313445a2978ef8b3d5a170412ccb4c15451cc23bb30274cc5000000b01e0a9e1557f7e038f14869926e33f5833b7d90a004eeb4767083b86cc77a0c5a1df1cb458c2863f5495aca4c98d5ab4357cac4e5c495463374b6b82e86249aa048c8eba9ad5924f8afc61aadf6ac82b860539969f09ca62613696aa91c96b5eaf60e2c3480704f0d5f90102d02b050681776825a14e2d61360e6b900c09ad40e92a91f0e08c240b4f7c964d0afdede5825c6caecb09b85a02bdf95e0a7d044670bbf5b541becc0ff6853485fc87cd98a00000168000000b02dd505c110f248420061bf547f7d52cea42a32d87ee06a66242b0a5ae8faf7ff21d204045af4b66ba68a4518d9f764cc56c791a61232bc02a877c5a7e828376a0d74c06210e6ca7fd319820b6ce4d0ff4fdc539564611d08f724ef0c9b805c81fff0e8222c62f2f2aeb6e95aa94259d5016d774721281af0abe1287ed12f6e6b46918ca734a590a6074d8180e506ac9d28638cc01807e32d84d2b30a98322597de8f3a6c770c23283c9fb58ddab17f4d000000b00894f45367c6d343c4835bec6a3cd0473357bdd1e9fe8231c4b1ca507cdae4f4d60f1c15dc15b3c9401cbf72d1d22956d332e92b074a151f7c2417b403bed3e7d85f757e7eeb73e82a22b12ef55abc5ea2e3e59c745e655a55a1c564a7d85dc039d86c88d37cb6d81a613a4c880cb4762ceddda1c322ea035006bbe564c0607b8fd49ba03cd431fef3f19677e543756f1dcb164b61e764ef59bba18d6092d077f6acedbe73c3f5c6c7477023aa0fc51900000168000000b0166666f36b9cb2fbca469145de80814dae532156feaba766db94daf7f4e8da61adef57d2bfd66c96e427f156d80c68c05ce28aa06a96de7be34cbbbe6e1523104070121266de0b7f829dac814aa551f0f883e26feb0cd1acfb3e118eea2f2590c3e51c887f60db4a8dca0d5beb8bd4a52d114d9eaf57e1405c7d9ac5f56bad50a6bca38b70e64b25296b077d044647a20301b7fec717e3f43266ff992ed6ed119ef789daeda6561bea8ed6f78c8bf56c000000b02ab7c3c1df06867e99c47ab2fa5b6602bb455b47fc1f81c48fa2fff893218e6f40d3a0edb2a628a3954f17b4de96998f4cad763ed128a390d9d21b5176cb8f2b4d6330306d682ac775915fd90eac34cf76f17222ea41b9d86ae2b4c0a76d102c9993919bfbf0cb2e4de72af62b828c720ab8e1bbac62b15f07f0556ba3f28310ca2b3013d4b5a89fc81bfaa5a0dda311074aafa6940fbebb18eb8d4f146ad2bf726e606afc0db4cdf68711abc5e6504900000168000000b00459843125fd5cfb60ca6cc90d7f1fc63629074092fd168d44861a03647d40034f94caa19cac1ac545dd3ef685731b194d6a7db884ad03407cbc0f901875eb60ba74d49ef453bf31944482f7b40f8135d983937cf4f779d0d193dba883e2b7cd7abd7aa040947735f2aa5a84d5320d930bd7b150151940a8159c35dba72885af12884547f30c13f2e5728bb6c24a94970fd7347547d50235353266aa9c135d1057f3e3251bad7c49aea391dc131367b2000000b01793788d2ddc6dcfc81ac915e375d776aae3cd91d206fc9fe778ce6966515fcb6a86f75e175c018a3130ef9b9d96c46f0467e4677ab43c5c378d8be49d71dac34678c766b115c9e226233caeb6d4ab0550458931616ce65bb423e4ac7099bc7a81265149efca0e15cc69108ffdef7ef60987867b92ecd973c122c4f24297698bf45a8d1da3635b521e240fbe5aedd37a14d8929ce23e523a63885a90e979407d0b0dbb6d7c765f3889a11126f849a0c600000168000000b0025d153ac41a0a16c3a4e29ffd0529df94c3ad34a84fddfde15330c5ac4a4ddc7870f4498af6e8bc395edb697684bf9b2207f69b79e5eabe21acec4280434687e1a76cbdd4944a86092f6b620567d6f95df525309eb7eaf7eed747c57da7f9a3f8526c9e0c88edeb5df4db1b7f16522a0bc69f651ea7ecb50fa05830e05fdbb66dc8f28f5fe6af80e541a0ae98d80370073740c0061e4b504c7fd50423412ba8fbc65a66c0f80da0e6a49703514a013f000000b022f57e3739dc3e1128f672ea0dda488689e4f0ed80f697efefae6160f60be8ca87eac6dc1129d63825b37cec171de19d0223925da0a7dbbd8facb44256aa58fa614de68481a3a83ee1d6128d4c24f3c616fb40618df35f5d876d6d5c4537dea41fd7829445eb1cc90cffd0078ae068ea10327400757411fd6bde433f63f75ef849facbf62e1e8d36674713eb2a50ce7d06996890e9492f396e89a494d195cf0fc1a6d89ee123e1eec90c667b81e4671800000168000000b0109b416055d26f395833d8632f165395055ecbf7b9b17a3c994fb7a9c6a321cbdbcad2781e91e2069d1bf855db15047b579c3fac68b8847ed99ef991b47d044e53e0991ea77d0fb18a3f67fc7893958780f8c3cace4a31e6b7df74198703dced6b6b189e2bf9bce6a01811644b51bca0258ee94a47d5e6beab595673898168b30735f4ac8adcb387baefd80c68a29719138e4a764e1c77f6bbe8fbc50a667049327f3028561f7e797552db6d951bf2b6000000b021f927f8cbcc2545aa5baa84e1383d03492298871cc18f3fff2750decc1ad9665b981ebc48d4d811b7c3b13dafa74acf5b015115597b5a19fc94e8cdc10a7cfa979d1fd5908c548362636597d292ac7a4deb73edc35da2185de4876935e42a9d0a977d1188703045a37866263ad62aac2f8402dc4581d5df0fcd46acb53a10605f8e5a9f54811cfd9e46c77f0ababd3a0c0b332b6ef5dcea6bb1d4b914304f3e52645380de052f396e2ca92ddbcc593d00000168000000b005bee4a31ad70291c4b5aee56ee6758db8478b3add450d3fd66877f24e4ac6aee38d1a76e986f4a8fa71bd96db122ca250f0740a2d367ca055ea1db9c37a7a1ac06bb2af58737cc6db647b564b635ad261be2335a7f6b70caad5bf03dfe055660a6d5a927de4fe40f9ad8feee7f7b7e9202b6ba74d0dcd7c6a7580cd5736559f61ce5e3461c6badd7cc71622ddde6109091200abaf30b6cde42b592d6a5045dc9b0622006736cc5156c756a980a2c6aa000000b022d9dbf23914d39b3d11d0d9a1d31075ba1404ff5b7ae90ed00e769243c1b674c1a31a060a82b963019199565d25d7feaa0294caa54f60bd3ec945a601a3b6e4d1a10e5b1a022199ffbdc341e4c4f7af0dad791bb1ca5101b6808eb3835e77981f681c47b24ddcf63939c44b497fe201070c3f28db60f4aff78fb3c65557fc7afd65c1a82bb266e906442456a217de280d7b82074e23ba294cbbfc0b51ae12e3f2bbd21a73672432e3a708e308db9dab380000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000028100000000000000000000000000000000000000000000000000000000000002820000000000000000000000000000000000000000000000000000000000000283000000000000000000000000000000000000000000000000000000000000028400000000000000000000000000000000000000000000000000000000000002850000000000000000000000000000000000000000000000000000000000000286000000000000000000000000000000000000000000000000000000000000028700000000000000000000000000000000000000000000000000000000000002880000000000000000000000000000000000000000000000000000000000000289000000000000000000000000000000000000000000000000000000000000028a000000000000000000000000000000000000000000000000000000000000028b000000000000000000000000000000000000000000000000000000000000028c000000000000000000000000000000000000000000000000000000000000028d000000000000000000000000000000000000000000000000000000000000028e000000000000000000000000000000000000000000000000000000000000028f0000000000000000000000000000000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000029100000000000000000000000000000000000000000000000000000000000002920000000000000000000000000000000000000000000000000000000000000293000000000000000000000000000000000000000000000000000000000000029400000000000000000000000000000000000000000000000000000000000002950000000000000000000000000000000000000000000000000000000000000296000000000000000000000000000000000000000000000000000000000000029700000000000000000000000000000000000000000000000000000000000002980000000000000000000000000000000000000000000000000000000000000299000000000000000000000000000000000000000000000000000000000000029a000000000000000000000000000000000000000000000000000000000000029b000000000000000000000000000000000000000000000000000000000000029c000000000000000000000000000000000000000000000000000000000000029d000000000000000000000000000000000000000000000000000000000000029e000000000000000000000000000000000000000000000000000000000000029f00000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002a100000000000000000000000000000000000000000000000000000000000002a200000000000000000000000000000000000000000000000000000000000002a300000000000000000000000000000000000000000000000000000000000002a400000000000000000000000000000000000000000000000000000000000002a500000000000000000000000000000000000000000000000000000000000002a600000000000000000000000000000000000000000000000000000000000002a700000000000000000000000000000000000000000000000000000000000002a800000000000000000000000000000000000000000000000000000000000002a900000000000000000000000000000000000000000000000000000000000002aa00000000000000000000000000000000000000000000000000000000000002ab00000000000000000000000000000000000000000000000000000000000002ac00000000000000000000000000000000000000000000000000000000000002ad00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002af00000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000002b100000000000000000000000000000000000000000000000000000000000002b200000000000000000000000000000000000000000000000000000000000002b300000000000000000000000000000000000000000000000000000000000002b400000000000000000000000000000000000000000000000000000000000002b500000000000000000000000000000000000000000000000000000000000002b600000000000000000000000000000000000000000000000000000000000002b7370000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000038100000000000000000000000000000000000000000000000000000000000003820000000000000000000000000000000000000000000000000000000000000383000000000000000000000000000000000000000000000000000000000000038400000000000000000000000000000000000000000000000000000000000003850000000000000000000000000000000000000000000000000000000000000386000000000000000000000000000000000000000000000000000000000000038700000000000000000000000000000000000000000000000000000000000003880000000000000000000000000000000000000000000000000000000000000389000000000000000000000000000000000000000000000000000000000000038a000000000000000000000000000000000000000000000000000000000000038b000000000000000000000000000000000000000000000000000000000000038c000000000000000000000000000000000000000000000000000000000000038d000000000000000000000000000000000000000000000000000000000000038e000000000000000000000000000000000000000000000000000000000000038f0000000000000000000000000000000000000000000000000000000000000390000000000000000000000000000000000000000000000000000000000000039100000000000000000000000000000000000000000000000000000000000003920000000000000000000000000000000000000000000000000000000000000393000000000000000000000000000000000000000000000000000000000000039400000000000000000000000000000000000000000000000000000000000003950000000000000000000000000000000000000000000000000000000000000396000000000000000000000000000000000000000000000000000000000000039700000000000000000000000000000000000000000000000000000000000003980000000000000000000000000000000000000000000000000000000000000399000000000000000000000000000000000000000000000000000000000000039a000000000000000000000000000000000000000000000000000000000000039b000000000000000000000000000000000000000000000000000000000000039c000000000000000000000000000000000000000000000000000000000000039d000000000000000000000000000000000000000000000000000000000000039e000000000000000000000000000000000000000000000000000000000000039f00000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000003a100000000000000000000000000000000000000000000000000000000000003a200000000000000000000000000000000000000000000000000000000000003a300000000000000000000000000000000000000000000000000000000000003a400000000000000000000000000000000000000000000000000000000000003a500000000000000000000000000000000000000000000000000000000000003a600000000000000000000000000000000000000000000000000000000000003a700000000000000000000000000000000000000000000000000000000000003a800000000000000000000000000000000000000000000000000000000000003a900000000000000000000000000000000000000000000000000000000000003aa00000000000000000000000000000000000000000000000000000000000003ab00000000000000000000000000000000000000000000000000000000000003ac00000000000000000000000000000000000000000000000000000000000003ad00000000000000000000000000000000000000000000000000000000000003ae00000000000000000000000000000000000000000000000000000000000003af00000000000000000000000000000000000000000000000000000000000003b000000000000000000000000000000000000000000000000000000000000003b100000000000000000000000000000000000000000000000000000000000003b200000000000000000000000000000000000000000000000000000000000003b300000000000000000000000000000000000000000000000000000000000003b400000000000000000000000000000000000000000000000000000000000003b500000000000000000000000000000000000000000000000000000000000003b60200000000000000000000000000000000000000000000000000000000000004800000000000000000000000000000000000000000000000000000000000000481100000000000000000000000000000000000000000000000000000000000000680000000000000000000000000000000000000000000000000000000000000068a0000000000000000000000000000000000000000000000000000000000000681000000000000000000000000000000000000000000000000000000000000068b0000000000000000000000000000000000000000000000000000000000000682000000000000000000000000000000000000000000000000000000000000068c0000000000000000000000000000000000000000000000000000000000000683000000000000000000000000000000000000000000000000000000000000068d0000000000000000000000000000000000000000000000000000000000000684000000000000000000000000000000000000000000000000000000000000068e0000000000000000000000000000000000000000000000000000000000000685000000000000000000000000000000000000000000000000000000000000068f00000000000000000000000000000000000000000000000000000000000006860000000000000000000000000000000000000000000000000000000000000690000000000000000000000000000000000000000000000000000000000000068700000000000000000000000000000000000000000000000000000000000006910000000000000000000000000000000000000000000000000000000000000688000000000000000000000000000000000000000000000000000000000000069200000000000000000000000000000000000000000000000000000000000006890000000000000000000000000000000000000000000000000000000000000693000000000000000000000000000000000000000000000000000000000000068a0000000000000000000000000000000000000000000000000000000000000694000000000000000000000000000000000000000000000000000000000000068b0000000000000000000000000000000000000000000000000000000000000695000000000000000000000000000000000000000000000000000000000000068c0000000000000000000000000000000000000000000000000000000000000696000000000000000000000000000000000000000000000000000000000000068d0000000000000000000000000000000000000000000000000000000000000697000000000000000000000000000000000000000000000000000000000000068e0000000000000000000000000000000000000000000000000000000000000698000000000000000000000000000000000000000000000000000000000000068f00000000000000000000000000000000000000000000000000000000000006990129168fcfe5274f558a5417b7d6529443729da9a806ebe13e3875a1325062ba4c00000000000000000000000000000000000000000000000000000000000011800000000000000000000000000000000000001181000011000000021c000000b029ff470af339a233c01b75d57b8afb9fdfceaf8325aeb470c4f78b5243427c64025f61e7d698834f71708aa4affe80c7cc193288708803823cb2e4e82d702e22f699c374c54fa5edfa1689b43e6b1d75657945328068e99869a31f7f53f6b5c58b124d8d1fff86dd573374a74e087f8a2bfa55924d3dacb1e0e308c377846484f31727db942214c6c4cc3c3cce02e77f18b947e5b497375da280356ae193de7fc8492d5c655ab05f617fbcab89b511c8000000b01530a457af4010eb96775c49f55e42258b00e3a4a7ec4707112d5662d6a8c45afa0f1b03bfa54fbbe75fbff201b404a8e5a7f2c2ce9eed5740f55dc65e3d0de6b5950738b5c818c982ef079a6c51c1dd6b8a609f52134fd9c5f1e2a785e5881c4d4b1ee551302dfe442734db7851dec02166a62f1f3473e0e222b01a47aa69f9aebe3490d1947d09c78f361683c5e5be2cd5088c01d1db34e3c4f21654924b13539c9a41cd279092073be04068f8d5e3000000b0210fbde139cee973acdc441a63ff155c06ca0653e1e86ec57b1981e954cef5bde85fd648912020634b8b505f55295668ecb9a109286786a3e6ba39946b7a8601b1cffd236c172628fcc38054cb193f668e7fd53a5a7cf2781fad752b40da7d7786870487dd93d7e0b2284eb1362972a21b13ca64f4586722c1398878c63645dd86b58face22d26bcac38ede43f05ff95254c560666a36a932d653035745e8149885f58adee3f5714098d974f2ac555660000021c000000b00bb94894ce04b7e73c57d4fdf581f0ff23e146c649c6f813b758f88bb13fcee4bbf1eaa450c554d61d28266bb5f1e5a0270243efafc5b586938a0f9fa442183c10b3d3ac6a67b9dcda97d46a78a55d6e8ef84e81a2bffe4b467cfe28640be9d9a4a2c93c0a5cbad2fbd2f51c1700f0cd1b837a35cb4ab414b643809e609496f5b829a4c7831b331536c8ee8d760e610d016c541568c97de2e7e981236d7c51539245886d3e4a71b93ad56d979845360f000000b0197fb0299157d50c0b265659d56301cc979b30aa121ea487645636acf97295a93bdcff70a14a604acc7430d69c2743c67bd8c8bf1473048de2eff215cb23ece82e7321608397792a835b310862b6f5e55c8b17014338832daf5872631fbf7991d8df9c04b9042971f89ea05369ec4f7d00eae8bb2141ccdd8c1d63780b5ddef4e0582d7b11fa932d7c2ba7d7ebdcd64026202d16acbce6650e80547037750c4905ec8b6ac91017a40cfc348c1b6b7155000000b01bc8ba525c7413d8fa2b83be84d4cd993f1665901321abb6c3445091b5050be0a6a7a1e4767bc7faa874d7c93472b9d7a6e8493d8c38c5cac460e5467431c20b9aa3cc6e60ddaed8c208bc285211dbc4d187e2cdd227ebb6f5373355ab6766fadf286a2f8cb06851d5add346bcce3668292c8910ff2a0651db149e4db522c03fa4eaa558139382cd5880046ada8fca3929f7707cfaea5620f0f024ed745f1cd9cd19eea017e2d64169188592f775b1310000021c000000b02debab64aed9bb6cfd92542f2d16adc28408790534c5ff3d64dd4a6e5b98bf7155721b84512f4e40819d2d41b3c0c91e38d0770bc7878d5c291f3c4eac83c166e86d13436f96c8540d2cc150ec6bbf840a3b26baf8abf40ee5b8b2f7e3705860206956d28ea7d399b820400d1fc55aa33004c5dc5a8f3c23f68d42c8c9704637013ad30777ba867b7fd74758fabf90ff1220e5e6a99e001652497ce3356a970ca7441aa90045001fb3adf760a80f5517000000b0304578a608199de21aaf531b242df2b9f775aac0dd0964aea0224460bcaa00ea17db449f729a2af6524e888baf99de07fd2e01da07d3e6508414385f0b94f88021fc4ddc323c605997ec0d51b5fdd02585df7c13a5a08f5f2da7fab3855ec1904b9e836510788fdc8ad1629493a5730d270d35b1dbfcc1114f5d31163a902c546fbaa258852d03886862c963d446d1562a247e48d4981047c2bcfc62fbcafe341f000f2ec8922535dbc2028a11e69050000000b013c9e8c54b0062b9397346f485146eca129b683d3e29ee6878a52c12fdfe9e44e86e612a217d95d555c0b46e1e4280491642022305c773f881b0a5522451f82ce684b49fe335862fba67543cd44dd26276d8be419c9bc65b4e447617bd2b3689cb8865d32853b322b18b604583f9f90022881629007cd9d4b90c980eeae4badb7888d2a244267be0597d15ff2c8a51f124b3e8bbadf0b24ff2c0ce6c99209bb3a1a614a61b4fa0e86804a3c1cf15f43a0000021c000000b00d2df21ebd9585fb6e9e948f21255f3ef0df7572c02056596450f68cba9f4275d319524a1beef6105354464568c0734836197302e1f27821bea3144318e233dcc51cd4d1403250a2eedb994517e2d07c9b716006fe64e0bfafb5f9d186a57b7fd3fa6fa048839c9522b55c4c1adb1b2e0699a27380ff6ee736e1c1af2881b8113dc11a5f7c9ba97d5f6e7091d148e5e619ec39228eb80bebeda894450d7747805e2784439c968b13695d217a37100a83000000b02c352f794edde6d62de27f27649694ab259760478ffd61a002be7afed4d38ddc99222fb69541b1b0c5beffbc111f7aa8195b7bb7964b2e87a4d648c4852b2cb743ba7762d1bbf49cdf71c3dd685c676839353e9a86a57390bffe1262a66ace1f3a98a1570b94f0339048b8b7a7cf67d906b3fdcc226021bc4577b3a1d14c01d8bb4054fe05ab5f1f314ab367572675232e53434aeefe9a37de1112e259ed0c482976e4a93163d6dad256001c2c8870f5000000b016631cc31a7d12a09395b6ef087faa26bf0b83e5feede71a6dfd8e15cb06eb8338b9aa211e0f6c6ff158b2c098419ac38f8db7cb747636dab269c12ea5555417548cb3c88befb21b4a8f36da387da86231363904fd844bb8a4e08ea7fa864b59620c2114dbc563a4e008e45b7908abe5044d542268fc23bc7ec3d3f8b4e60564b0bbfd29dbc8b35d8c13e9d639614a7d0096216b27dda5d804135938806666e1da059c41596ff8614f5000c61451046a0000021c000000b01df5e505d8291947966dab52e0d6f3e473916e89cbf1e22d52cd40daf9b0961ab18e629435706a7eed130b4f26b8b79fe7033f4335f0db4a94d0ec88312255e8b57e395edf17757683b5db13bfef62dcb7d108e4151ce00d7cbf1eaa518c61a4f559a0a3ac52b3ab649ab56670fe292d0c0b8ae558457f0123eff9553d7de4afd2711c4f6e570f5410ce6e39b938afc82c6fea153c9063960989e7b9672eaff7521aab804df88e3ccd8fda0ebb3e21e4000000b029f5623f6e8134afe1a3b8c07fb671891d40f9c21614ff8d74c39175621924b85216498e5c50a38b16a74fb61473d485048cfc271a377977a3344a1acd30dd7757eaa1cce0ca690a17cfedfa89b2e2382054dfb6230b6d4007aef5d9a1ebad7a2b5be893af6f9e62781446124b2b5b7319a659824690e300223c8d26cc5c0e58c00a1082fb970a20e7859d5985da1ef32a6dce14d33ee532c0c6ae8f3cfffb0310e4d6f9c7a5d561b2d3e506b97cf0a0000000b029485bdb314bdb1d50f8b85725d29f8fc6fb9dc1873080dc060de95f1de664832cd32ded07a26a07ebe0da2657adc9219f7e3b1f64ee3d056e678f3b3d51c40ffc9443f4ee47e992bc91ccbd47b19bf1b70e54c0f10d34a611046dbdb919312e47070839c71a752d3c634510151932922bbfa653fdb33e982e3c8f132c4f1f781a81af432e94fdb80b0e161789d13cde175ba1a91212c8e90388e4d166095e6b92594862144f8143f678918082fe155d0000021c000000b002d2e86c27e308f08704cf1f9f67e0dc32bc060dddb9a594945b6995d8c158844d135e3fadd4ffde05364d09de9008ca3e88a69cd2d066810d7a4810160f0574e444de2195f6034fffb6b04ab13f2da9b4802a4974be0ea65a76bdd88669836aad80a0c79b5f5ac594d9db4f996398920894cf79662fd0d674bd7f662dba48a19d4e23a88c2653a8229752c524594cb828acfd1613e8e49591178036a3c44aa57325e05c0b862a292314c36b5e50813b000000b0125a4d33ee508a9f46579af5b50d6f6dd0da28aeef00636f7330dedd1c6d41db3093166b2acdcb53fa3f37646269868355f2f17b3ee531b6adda4fae42e64930ef9f1d0dc07ca336694b23f9b22612aa6e6a494c9d559799d1e08d144360625c93d35dbfbb789c2729fd53110677131625547e0f26e3333d378a39918711d7f94081a1875b90a354f07cf683f47ae8571114eb5245a364e19501fcbdba6fb566329fcaca7a4f3ce138eb1c5cd678b5fe000000b0248a01f28cc2749eab9188da0eca7ea55af5a7dc27bef95a13dc92a7e89d70071075e8d7887f9958c6a0591bbc336e786304dc840a19944ecd3a69a8ccc19b2a8fb71fa0a82bc3ba6c638ece5343e0b0c5079aa3b3c058833a52afc36ecf44b7b8e7d3a037108853865eaac498a30ea225b6a3d7d2fcfd3cfdd45d1bf01b86ebf67acc168b7c81fe4c7e0d1ab176407302156ccec310512a7e6c69ef6de0a921d4997fd15df8c234d5c6ad1d3923c8430000021c000000b005ee93a8b015a2009541e2381f032c7eb258884dd514cb7876b51e9412eae82d68067990b35b0c35bace49206a3dec25a5a5cffff938a0eba6ec3e3b5484e4bc5f971b79d1bb2fe68ddf63c5e91cf79455e255ca050dae380ab321a4ef1ff7124b262ac4825fa16e4f342b540ca9d5ac00dec75469cfc35ab5e71dba98618906401bffb0f5f446018c566efb6a12673d152552ebfbe55594929a75966b5af8be794a659292ce736dcc4ad51d15d45521000000b018c10bfd3645b65f838c8575859f3d1b127026031670685a06287a76e45477bd5debef359bd902e736fba47b3994209cca028f63ab42e6ccbb721c37972fff9b17c7331c52725ec4a299688084fe5896cde3a39397a15b9d1ffd3ee637d3f79b0f534acb68cb32dc35e9708064b108e5152a282137ab64c57f7e7d127f5689a5ae91ddaf6ebd6828bef866fdfe6fa65e0e065ae60c2907bfc687fc5819338628a83aa81ffef0313621abf1c4d66113fd000000b002f554f6a03300afebf14434a268df25a58322b279ad53863561784a2b6458c2894c91a598a119ac00f8dc5c7915a7326e2ee021b2f3bc78f13527aa9d677c3126d6c8f663a268377d7de99d7484f69a64a11b7c8db7c0f60cb8c36239c886486e7c6aba47f76177a01659345f97a26417f6e0dd52a1767d985a965fc97bd83e8e3f50c302f45aa0707324653deadea00a7cb8f79bb1f44d54e8621be33aca2aa5356049de600963b6a7c69bafbf17190000021c000000b0300d819b74a8a2e66be7edea16f40b7c02ec694dcf7f2d8ca28fab351d3bd7edacb8d0da97a556421f7b2d2bc0991b71413d3e38534cc0ae2dedabb2cf78952a88561c0e6a089ffb126cb60d2d4aedd7c4c43311c3e1cc223d6f88d95562eef376a5321dc3102a584f38373d80eff2040694fdd54ee93fd9a6b274fb83c3c49ae5634a8d79f01292a18631d046e043f42a7a4ee9b84018eccb2cfa75b2bd2c1ef4009c4545ff0cb737fdff55e49dd99a000000b02abafa40e07c1ca19300c6f89cf6fa5b96c9fa603e2c3d197f9b0496c1100b9d52ed3958b1c087291684015c2dbe75c05338bd6bbb550f03b882b6d8d592e8dc5d91858fb653e948aba26d1ac7f8879e8c25670c3851501abb2e1d52eccc3c5770c90f25ae659aaaed6c49ee1865d3d1233a68bf786fa5f617303eb551b7d784c4d3f39fb2b3b71858e82d2689ce0907053489b48b19b9e25dbc51dbd2ced7f784f25fff3dce3c14a9025efc0ebe4639000000b02b2d9d78aa1656235f67eac8362c8112711fa3b6052907895c901af7d140ec61a68b2981f78c37e65fda8ec784724459e34b6fff2f9043c819b96888fd0c574fe3e2f185dbde5154adde36981252db53f8117ab264628cfc77f41be2959548ab87680bc9b6a1973baf528f63d3cde1a1236b63e71199d197906cbea9a758959e4d5da3b73d8cabe1ac579e71b508a36c1eac8c835fdd2dbe720282cac8d4989edf59b28314c131ff4fb4750871ffa11900000fa400000168000000b0060745ed826f680a97c26937e257670a4b019c2bd39d85c964f81972c5ac3e1c986cfd7565e290e6f2250ad1ad2669659749d9753c12f1595bd1396002663c58499492fb16268ad49529cb59447f7cf6f560e4bea83463937597be747572a5b9650f0cff64bd6a2a32b05324b565c5272a9d1d2a65a41b27f68f73804a47bff87396924775b8c08aab10020e8d9b4fb82c267c4db3104c914189395eca2fd4a62efc4dbfe3dd11313911ccfe869502ca000000b01f6d2bc8df0708d18fe874969421c41d4cd60236e78f6621919ee15a11596e579b5906110923e949cdee8446121f1f2ac6d731f3b0cae22da83b7eeffda4b41d70fb166dc475ce9060b61b41805b0ed787f9f8e6d97ae720d8a37042527c9793e3de02bd163489234e943b496ef7876f2b0b208320ac57354102b9040346d049399d23ba6b27795126da6cf56564f4b22a1e4eb4f3e49faa22f6b56c94ba9472c4044d73a6d85efdbab694ecafe465e100000168000000b00dd7f62c3dc151db7e8bf7e877a46dab2943ce59eef04d284aadb6b7b84f7a2c5ebaa85ace43a27dc6bcbc8c8edab517de6fc7e78bb40deb3c366cad092d40457ab2dad3184835e4d1c2f36f2b7c1444418f799391a94e4ec1673b92d5329491b5d90e2122b64e7eece7a77264c302ba20031995ab485665de8e37ecd4f93d8b80f400a590857af18fe0ada5444e0cb30b67c8d23b2542d54c96359f1d2279d8b61679fb1f7dbcaf69551b4c38c4752a000000b008bd6297050a8755d008302ceaf4b59c435c0d1bdb61f185868bf8f3e9ebe7969f31a67dd97f25107ef6ccbea0e4db671559126e9aca2aa205ce0c95315812b140eb750871338d47a604b00c7b69e6e6c9431a6474e6768b713b2ac7c43c632fd5c35de5cf22d5972e9f6afe477dd09f1a0e1984881baa1a8816124c9ac38dc9fe04851ef52fbb1c95a3425eb8802834240d0f2bb41625de05c69173ec5f03952a8b549c7f30beca6b50fcb7358fca5900000168000000b02f79d55e4626bace308344b7573bbbc07d0a35202336c3057bf48aeafdebcf6d75ea2ee7006b1ae1829f636f1e2c7cdb45ea912f7e8afea8987266463b26335070bef5fdbafae7efc21df2dd66152be7cae26c8699cf277b3421081f757e2e686b9b357e6b6bdff9d80a61641f419a140e4960adff16175afde9150633baa3950e9bb35567bb69d57ed5694f3ec1ec9510128fee1da364d154d5900579a470459a349f4d70f9c09fab0a19683a0548cb000000b0297a77160c3c322aaccba3c10aa4cbaf985fd823e99170d22294f172cb8024dd11f430434521db5f4e860af23711c4be315fd853822f1e7e4da42faa94399d63f60600fb8e8b494606d201bc24cd95b67cf63bf5ed7fe17292058b6ac635fce749379397ddda177f9bff32a569796ef6225f9639a41b0991d6d9408cd6ab3ddc9b082eff65b0300efcc20fc513cd96b303ef9fa262bbee7fb48eccd349a809c978e28c0ca1c44899cbbc8cfd7f6924a800000168000000b00c6fd167e6b96cf240958d753fc6022c1bfec6b5129565260d1ffa9712579e0a4245344a8274e9098836d65c049a70ca6a594f84fd3e7eb68a0671189481d0d591f6d8bbfa9af725f1bb12ad6d36aaa46db2094ef4a08f0705d066c78a372875862e2a863603db442a7b8378e960bd0c04fe4a0edabd483672df8e1baf11397ec04b7eb73159c5c38e6d19b65398de262839e30c50285ee367328788504a1daad79c84787af94377ee214313aaf48208000000b01650270a0bf39922ca13530465e145bc633e253c5bd91e625b95441a60e8033439637a73be41b239d4678d90bbb9d902781659d131c8910255adf858b0b5d8d3ca679f6c327758ba29e8ab525d61be761cd1d6cefa7452ec810e0a5feeed9916f7d4eb0460282f1abcd41af6e0bc05241b4c6d2db20de209063c7d2179bdb7f68749d999a643ab56fac780ce130d6dca2ace93c66a7e407652a337349f8ff66112d8c9f6c28bac5a0e2dc2d2cf2f399d00000168000000b0243bce4f21427524e188a88055c5520a545689d13aa33b01c05704d933879f7b26925d60b594a7e2a4d9d9eed0370fde137c11aaaf82a7811750ea4f477ccd4befa74025c9bb262ea1933d52ef1b0def63200b0d3d81bd56e0c86dc16964d63686b3020e2b60e06800dad04ddbcafc0c2c0a630f600059c1a6e961e4cb5be9c5b65e3623e7e4b64f8fc592ef14236706122f44ef066de3f1bb4234f98090c735ddf679401091c6f313f462a2728143b0000000b02070ee8df59f226517c736101cf8c5478d45f9fad435df2c477c2ef55c4061734fc99a117db2badea1939fed8c066c37054e196e63d06e289b7002019f061c8bad57dde2645046514e476b96c4dc80adec24aa6d85ed336afb7329558e55d6902cf3432ee37d4337d186e0f4a5b350ce29a6d0718529d7f524e001fd6c51ef611ccc59b2b0ac89b675c3574cdc85f4fc27cbd57ee4e6e2cbd4efbde6f1c6144ec501d6f101e220909b028d1819c2fe4900000168000000b02d24237dbbd3eb5fae97b87c806a44a8341567cf954810420cd8c5258effb6d6d947f2c06b3540dcbedd4f265e7a3040ddbcdf9f35bf6ae21e1645961a1fe16d34f795d4832d266e06220bee1dc986ad08f9bf938d3899c26e9270bdb72f471f149a509eaec6ac4310db29417643972312a5c50ed09ba30980f51a6534829bcde1e48b150f4d3f282ae1de4034a8270d2ff72fceecd56606f0c5cae7fe5de8e0ec594ddd392def05ac06074fc6edff79000000b0140909916933e594806340bc054c548dc5545ad41d6335c4ac6fd4664ac14865d08cbcccd7020ce9a66937d6f24b5e585188939b4180e2787f2d0d40067ad98aeb034bc324a64bb01f17c0e9109bcf72659220fd9078e464b271da8cb3397081d37db31d9e5e503ac78104acbe13483b2b7e7b82ff6a47db09c5f73435cc142f5211b7c6d3baf55cb72d2c69e8296cad128fc7ff2dfa616907ff5c10e2bd4c397bd1b9b7eca93bf772fb1a318ce3097700000168000000b0294f28b4b6b64f55d5fe494fa287a85049198ffb5781160dccbc2e7dd9f0a7d027e9a361b5ff701b832a6fd1bde0ec070314508bf26b33bff84a7858267117a9f4eb302c454fc515a0c2f36b84b77ea13426fd8fb387c300c1535ef0a4addc4c5b92c6d3f8e77d29e854293be86cd4221adcf0face66dfdb6c33c2d4417ec9617472705a8fdfb424cfe5f08b831657bf1775e410007349207701607dff9de9b7afc94e907c0a9d3a574e6ec5f2061ed9000000b02e126113e2cbc987779f3ac444186d7356c0cd6a353a129105f7ff2f1e43f6382a9d73a2a5b9470ed0187d4b6f63deb355402f750ff39dc8682110e6782b838cb32d357cafaf77b7dbd8c89a4a9c2661156c9be1562dde56910627d109b44fd32af868308e3440be216bc8e4fb979a5414898660aba6082429981567194accec5e161aed52741c868257779b047e4e7f29d52b0c146125288f14d46891a71af0bf1c98d87012044d3ebde6ac4dca3d9000000168000000b01afa44dfa813c728c605e1fb71205b342ac6f0fb83f2def879e539ce4671395b9689c716d798550130fe59a04761672ece0a2504a685a8deaabb469a11a94e5518f85092e86086bf3422c8850ec191e075991af558f0e317ffed54d6ea924ca6f09cb002c18cb67f8c0e6bc13699a5611a59c55662336b3e01f1179d36b76b248662448dae259d7fdcace1b2dba53f052d3dba5aac532145296ac23e5d5dadd783448868f3a5d19b5158a51a2c9ebd93000000b0234f544a78c83defd972bb218cd0f7ab375fcbbfd3e83da6cdfaa2a830ab5833f4e7f3fc5a387be6b7f1b7e1cca7e564f1cbaf2fd5875b90f4635d3648dd4fcfde8f1cc33fa757356a3df63c1a0c6a3f6b857cafe28a93b3463b41de290709595b48ab261f64ffb2772bb3bf28ec068809bdf95962ba88374e80e25d89ae72187d58f0ec393874d03f8e3b147539bfec1ebcf7531c7525badf073e8092089a8022d231492b75b1adc4da5ace41e8a54100000168000000b02030f99c664d14900c82bee750d0221aa0d463ff0193b4372d99c96ec920f82aaba3224548b8c18b7a6e4ab66a90c3deccc67725c20542e332b5677a671580120b6e3a153211fa41b85c9e18df75329538599305d65ad150ea3c40a485bffde52e0a90f74030d3a5097fafa74ce462d9003c2cbfcb541c7080b432f8ef40caaca62ee990217541f528a359ef51d7714a180778c9b6222b561fde976037f03adf0e426fdc509fa1912dc36162e339edd4000000b02e59d3fe7a1040da857889373b427265c1a00adcbe30ac30568844310843ddc8efc67eab5f6ab2ed5dc94a5a4cb29718edd26ec7eb8224e3fd23c26cbbac2f84db4506bbe4df6d78b180106cfbdf21f645d44604b75c6b0caab38175a0b686a12859f827e1b03988ccad52e1d292d53e300929b34a6f7983eb73b2c0747fdc1b19c837b249a3a23d3f08725cb718a53d275beb3234686c09084a3a5e332c46686d226fef5e3e2cfe84aafc91835e9b4f00000168000000b01ab6a45727c1d3f09d58707aafa7f18a7ff8d6715687a6e9cbc96af586ed9dde19b8226cb99ca41997352bead500873caaccd9165ca7c87d7ff9bac937f94b79549b6ca1dab5d1beae116968b50b5d5958eca947a0e7e12a7cc5a6ac9cb116f38990f0a2d3a2befaeadebd8d6078de812cd3174f1013c01af484947938e8e3779781fd8e6933821736dd5650a872946613202face0ff87088534c535d4772e7767432055836b73f3e9ff61a84c55eef8000000b03023242a91c9d5fcc63f1af813b82c8c0148eeca01b10ad98f1938d23eb504cb2e7864e139469a01f83ee62e3ba10cb09fe1ceda38e0ebe7d6e5ba207093dbae3a35a20fccca6d42ac5dd335a9f84218a6f0f436a63181131d8550e624819a5fb51fb738126e5179a8fe71e0c0350fea081bdbaf2f54f27d8606e22cbba3dba5f2a4550cd3735651e535a1493afd395e095e8e93e661a0dd83b3c096c8daeaaef428d9a5409b393d173a3c8d5e06a6c200000168000000b00d4b11b777cf7cbe2958e28aa229241335124176a837c4d0e60a9b657e485e97d6a34e274bcee69017bb1b2effbdc44840d274ca9e4a93316990e747d98f17199c8ea7154f5371a6797fbb9629816f70ecf7d0320cff4d19a88215e2c6db908a3dfb5dca9d426a6712f150223428a5f71a7e052adea11254923c41d4329c494378301b984746d21c6d964d5236a7a7210b1fb647368cc9cec10d96ed2d4592ad662cbc3d9b68cd280e88202c711a4e0f000000b01d554ae932464ff3a1058572abe7e6911468e7c1f5554b68f89d3ef13e74f5420cd3c33c1b2a226c997170257fe15b5a946b0175668ea211761c45f652250c0e6bc6823138fe82da4f46ab7762d951428792ede670aeb2f3351a207899b3cbc2b6c4021fb96b8281598c2953b6b35ed71cf9282807f79cc09c6c23068c0ef1dc7e7928969a9e7aaf4ffa724ebdb9ec49276bd340359f269ba8b0ec09aeaee4a72c6d70d430b744cbadeeb257d69c646f3800000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000002c100000000000000000000000000000000000000000000000000000000000002c200000000000000000000000000000000000000000000000000000000000002c300000000000000000000000000000000000000000000000000000000000002c400000000000000000000000000000000000000000000000000000000000002c500000000000000000000000000000000000000000000000000000000000002c600000000000000000000000000000000000000000000000000000000000002c700000000000000000000000000000000000000000000000000000000000002c800000000000000000000000000000000000000000000000000000000000002c900000000000000000000000000000000000000000000000000000000000002ca00000000000000000000000000000000000000000000000000000000000002cb00000000000000000000000000000000000000000000000000000000000002cc00000000000000000000000000000000000000000000000000000000000002cd00000000000000000000000000000000000000000000000000000000000002ce00000000000000000000000000000000000000000000000000000000000002cf00000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000002d100000000000000000000000000000000000000000000000000000000000002d200000000000000000000000000000000000000000000000000000000000002d300000000000000000000000000000000000000000000000000000000000002d400000000000000000000000000000000000000000000000000000000000002d500000000000000000000000000000000000000000000000000000000000002d600000000000000000000000000000000000000000000000000000000000002d700000000000000000000000000000000000000000000000000000000000002d800000000000000000000000000000000000000000000000000000000000002d900000000000000000000000000000000000000000000000000000000000002da00000000000000000000000000000000000000000000000000000000000002db00000000000000000000000000000000000000000000000000000000000002dc00000000000000000000000000000000000000000000000000000000000002dd00000000000000000000000000000000000000000000000000000000000002de00000000000000000000000000000000000000000000000000000000000002df00000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000002e100000000000000000000000000000000000000000000000000000000000002e200000000000000000000000000000000000000000000000000000000000002e300000000000000000000000000000000000000000000000000000000000002e400000000000000000000000000000000000000000000000000000000000002e500000000000000000000000000000000000000000000000000000000000002e600000000000000000000000000000000000000000000000000000000000002e700000000000000000000000000000000000000000000000000000000000002e800000000000000000000000000000000000000000000000000000000000002e900000000000000000000000000000000000000000000000000000000000002ea00000000000000000000000000000000000000000000000000000000000002eb00000000000000000000000000000000000000000000000000000000000002ec00000000000000000000000000000000000000000000000000000000000002ed00000000000000000000000000000000000000000000000000000000000002ee00000000000000000000000000000000000000000000000000000000000002ef00000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000002f100000000000000000000000000000000000000000000000000000000000002f200000000000000000000000000000000000000000000000000000000000002f300000000000000000000000000000000000000000000000000000000000002f400000000000000000000000000000000000000000000000000000000000002f500000000000000000000000000000000000000000000000000000000000002f600000000000000000000000000000000000000000000000000000000000002f73700000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000003c100000000000000000000000000000000000000000000000000000000000003c200000000000000000000000000000000000000000000000000000000000003c300000000000000000000000000000000000000000000000000000000000003c400000000000000000000000000000000000000000000000000000000000003c500000000000000000000000000000000000000000000000000000000000003c600000000000000000000000000000000000000000000000000000000000003c700000000000000000000000000000000000000000000000000000000000003c800000000000000000000000000000000000000000000000000000000000003c900000000000000000000000000000000000000000000000000000000000003ca00000000000000000000000000000000000000000000000000000000000003cb00000000000000000000000000000000000000000000000000000000000003cc00000000000000000000000000000000000000000000000000000000000003cd00000000000000000000000000000000000000000000000000000000000003ce00000000000000000000000000000000000000000000000000000000000003cf00000000000000000000000000000000000000000000000000000000000003d000000000000000000000000000000000000000000000000000000000000003d100000000000000000000000000000000000000000000000000000000000003d200000000000000000000000000000000000000000000000000000000000003d300000000000000000000000000000000000000000000000000000000000003d400000000000000000000000000000000000000000000000000000000000003d500000000000000000000000000000000000000000000000000000000000003d600000000000000000000000000000000000000000000000000000000000003d700000000000000000000000000000000000000000000000000000000000003d800000000000000000000000000000000000000000000000000000000000003d900000000000000000000000000000000000000000000000000000000000003da00000000000000000000000000000000000000000000000000000000000003db00000000000000000000000000000000000000000000000000000000000003dc00000000000000000000000000000000000000000000000000000000000003dd00000000000000000000000000000000000000000000000000000000000003de00000000000000000000000000000000000000000000000000000000000003df00000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000003e100000000000000000000000000000000000000000000000000000000000003e200000000000000000000000000000000000000000000000000000000000003e300000000000000000000000000000000000000000000000000000000000003e400000000000000000000000000000000000000000000000000000000000003e500000000000000000000000000000000000000000000000000000000000003e600000000000000000000000000000000000000000000000000000000000003e700000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000003e900000000000000000000000000000000000000000000000000000000000003ea00000000000000000000000000000000000000000000000000000000000003eb00000000000000000000000000000000000000000000000000000000000003ec00000000000000000000000000000000000000000000000000000000000003ed00000000000000000000000000000000000000000000000000000000000003ee00000000000000000000000000000000000000000000000000000000000003ef00000000000000000000000000000000000000000000000000000000000003f000000000000000000000000000000000000000000000000000000000000003f100000000000000000000000000000000000000000000000000000000000003f200000000000000000000000000000000000000000000000000000000000003f300000000000000000000000000000000000000000000000000000000000003f400000000000000000000000000000000000000000000000000000000000003f500000000000000000000000000000000000000000000000000000000000003f60200000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000004c11000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000006ca00000000000000000000000000000000000000000000000000000000000006c100000000000000000000000000000000000000000000000000000000000006cb00000000000000000000000000000000000000000000000000000000000006c200000000000000000000000000000000000000000000000000000000000006cc00000000000000000000000000000000000000000000000000000000000006c300000000000000000000000000000000000000000000000000000000000006cd00000000000000000000000000000000000000000000000000000000000006c400000000000000000000000000000000000000000000000000000000000006ce00000000000000000000000000000000000000000000000000000000000006c500000000000000000000000000000000000000000000000000000000000006cf00000000000000000000000000000000000000000000000000000000000006c600000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000006c700000000000000000000000000000000000000000000000000000000000006d100000000000000000000000000000000000000000000000000000000000006c800000000000000000000000000000000000000000000000000000000000006d200000000000000000000000000000000000000000000000000000000000006c900000000000000000000000000000000000000000000000000000000000006d300000000000000000000000000000000000000000000000000000000000006ca00000000000000000000000000000000000000000000000000000000000006d400000000000000000000000000000000000000000000000000000000000006cb00000000000000000000000000000000000000000000000000000000000006d500000000000000000000000000000000000000000000000000000000000006cc00000000000000000000000000000000000000000000000000000000000006d600000000000000000000000000000000000000000000000000000000000006cd00000000000000000000000000000000000000000000000000000000000006d700000000000000000000000000000000000000000000000000000000000006ce00000000000000000000000000000000000000000000000000000000000006d800000000000000000000000000000000000000000000000000000000000006cf00000000000000000000000000000000000000000000000000000000000006d901052f4f7d40d5985bc4bf36583cd2403eca7c9073a6c3b904d5532d6d7253f7b300000000000000000000000000000000000000000000000000000000000011c000000000000000000000000000000000000011c1000011000000021c000000b002026457c3c1372a36033e11c1ddc0a6f9c377824ee0ece6c4a96788c566c65fc67c514ff1548f3f8c1f1fbf73742604dfd0ac82bd358047c97f5ecbe8cec79ddf97a664fb4e42dbf0eeb87ec5ec7a8a0157b8aa5b8c80edf069b606ea16424ba5d5e3d54289756b3fffc62ebea5305f25a538f5dd8eb2ac4cff3eaf614aeed5d73c3efbfc071a9f0ac2b2a904d598e301069eececd576cccba937b213617fe9c6d570f0cf10907462b0187fc5664fd1000000b008ac45da22dd17f11470160bc063ba9cf0a866c77ab5b8b606e3381d63125da3ef141804ccfb4244eae0b60b34d37ca3d8fe6c7dc3cff7acf6ccb9cd3dc1a26dd3b7a59223439dfdb9134d745964bf9b2397722fd1bbe46a4b148a3b1924c0d56ede8443ca21492a9062b70572c3d4d315ef06e40e7d1a61c2bade241e8aa457f5e56bc27e904f9ec5048d3607ccd92e22cb9f61a828d16add7998ec408f7496eff283b744b4394f2d2defd0f11ce35b000000b0186c31498c6ec2cd77f030d4b688eda3aa628c605d5e769bc72505040c1467bf78da1a5bdf4e3ff3f9303b0f8527b6645838cc46b6a952cfa7120df1fd84709852506dbfcdfcff4af7736687af0b9b178e074f11402be212d2ec02540b079393f440b777983b4b7863ee73c3ba719fb706f7b71aea2eb7c3fef46548f7cca6998056361d67bea856943bed590f46fdbe135a30914e7dfcbe56731c423f3cd6e786ae6abe4dd01938181a976f9b0ab9d80000021c000000b003d2adc633f6941b38c7be0eb5fa81605b7689a31834c3624f64f59e30a655ec1c185aa76917d8db8f56985e5223eebcfa8374cd9766eb19b5fac6fa02163fcc5a74df921ba892440a0e25fb2cf51799b59f3a61de4f7d5f7da333d0e3abc2dee2e1cc954df4a59e5bbe7ebe52ea6e6802b92e10aff1ffd80379342713f9816bae3569465bad3bb664136a6e99f974d21aecf8956ca4ad5a88d4f16f7407b609d221002a635c57857256314ba47857bc000000b02229f00bbfc33a665077e4702b66a1b4d57963400c3db31142104564bccf7c84fd14437d4556d5d87fe8c362201ee562a4bc4bd990cd81badf08626a5d225601161c9fb021800610c8f8f6145bc01a7a8c800125afe43dc8055eba1de51e31cf0eb432ce147b2f2a0e493ec4051ac7041c7da677cf43cb11216be87d2501b73403b3ee8d541dcf414e684743c900faa6004bd920ea1d5d0d2a6a5f0277a18363a07e5b5898cd319d35bb4aebda8b8cb1000000b0293de40cd671f24764214eb8bb23fe75c223c991c2ddac3f71afd05d2fd98eb1cf0c50c5691db381e6f0998dd7124890399fe632aa9379e64b4550e8801cd57f28164f088d9f50cd405e4331bca9823b05a4ae8ec4044c4b27bd3d25438b0339458cd0a9e950ed4fbb53b7b08838472812cdf00b9afd106bac6d1eb4f7f377f37eb4a46b82fd98effd5f68b483e08ffe02e488544923006b03d20ce207bc5315715980adba505608f81f1eb4d4d783600000021c000000b00df7099b50cfaa4eda6001ebd9eb465ea6dd094a5746ad86c8f3b3577a04d0ed20a608d3505e58dfac9a9d6487ca6f2923b423c9d6dd9ab504e1365513e6b8159a16603acdecee72b7bf03672a279cf31e23cc95db478659714db913497a820a7d1a797cc4f3064bb53b4481ba28a29d04725e26bba39f58c366627f3cb42496f1948f679c2278b722d4701716566f771dd81369371cb9f636d16de505d4d1f54b5ccaf7604065fe4431379937d9b6ba000000b02aacd0e1800ac6abe2d49e6467f4a8ca74aec93471e64662220d48700f835e6a73ec360261c343cc6b289d8a61eeab90bc70fff878359a21bf6e2a49a897448045a21bced30f11c856734cce75ce6d44952b72a075864436780a809a89f92881391afc301ae9b08488141cb0982cf65022063605c8d4959bf47afd8376329f3426b18a2a6706e61b78bc20f7c2098de51939aa0d966ed75ee58d4188c5be6051fc71d4739fd727209eaec202dcfc6953000000b011aa043857f8913a9016d092c50d20af04cab429f2a5e8a6fefe93a0bc60b0ab4c1b739df959b1f43dcab433b923663870966713eb9ad2259b08f12a2582ef1f1ebec261d2529f7697ce552e93fefc36a52116d753bcd4888addef503b13c28232f4434065743ca69fa927ba1a81fe2825f4a1ab5c35c9c26a4706d8d6e8b6ca139ff7092aba6e384ef09342e6509ca111244ccd5e2bab8e5f889be332a56fd6c3bb266597381dfd0e0a2026e57109230000021c000000b02b32f89fd0d0d2c99de724ab00783d796d73b4f4068055c3a6c4bfc9f4151093660fb545ef5e710edd953db75dc9e60e1d6d17f69581ece6bb7612414ce3a4925e319665a933ddcdc29cc3666a83b4febac3bd77d6f8af72504f498ddde2af7d00e394d4063a0b778758d59c57889ed8205ede8df36f0149b21aee3990ea1444c4a5156cedd82cc3f031fffc2317f7f120d72d09cce01e98dcb27a2e69bf920f9271eb68927a06d611969853487ce2a4000000b015e7e4f62c93bab8be77887abe447420435440f6f0a6971f44d6693579068a623107995ee9eebe2d1d1d671074848a2fb5a1334a7dd13cd7abbf4d9ef75dca7e890e7194510b9e69f490b7c55e156d53e2a0ea6ca203bc8b25480df12313dfd95b93be5e4dda8efbfacb378db6acb3da0d8fb244a4bf3893ad6bf5e641166530114e6e95cdfdd56e84423ef43516c6d72d5adce3cdd9add761394d034c2b6b36623967de6ec45f8750114cd88cf4c420000000b02a9231477517009d33ad2a1196b17d71fb2fbf646901243f0a5d51f9129f332bb5789461d5a26305d676d2293e12750dadeeb44ec5bac804751e8fa757f676d70e09d208133ea929c683c07c419023ca65e3882fc1a9b7e4cc090a543f6b5504c286e58b43344b3bbda63cbecf98b3aa01703f2b5d47b5788bfdcbba8bc7c5bb812eaf7b9b278141d45ab1b87f28c36b0aa98b4f4307de9133b640d1b6cd7cf5cebb8f3d8996c251f8ece26d3bc2467f0000021c000000b0027f2aafeb81b9ede1af3d8c205e21308580c8a93068715b935c117cd4b800fe13423c860992c091c4f1fdd3a616a9c8cc2425f660e4f39bede422819115185d23880c3d6a700204535b89c266c34c1638ec4460f82786e3112bf9bbbf2f9629ac75469d747b30bad037f271a26e853500f6058de2e860b145811a49e75c0efd7a6a638b016f00b90a70f9409c2f47e024b484958daff0b28cfeff3ce4f16afc80daee3b028ed004c5cc114c4e3c1b62000000b009e7e9d9647b8331078f368201f6ebc36c46f533eb7932096c66be9b35bd0b4db48863c7d663023e5765f79a94c82d6409dc0e683cd617fd8cbcb9862141ec5c9947058699f7de84d12bde0aaea217a9b317d3ffeac91be8f76aa43aa9b13585a36b8a8ed362c6dac04051fbe530f8431c397f3e09a3d7e7b84ab0d1403679cdc966cdc85867a39126662800e10160f315c7607b8f042f83f0ae9442f9c4a5508abfb0e296724b071d9b755228a55c04000000b0040fc6cd6be8686b2c2ae2bc5360524cdd2eabca1d8bca004f699459933a9189134868ad4f56d8ff4ca73bff01245c187bb5068ff33145afd85adbd300e6245275a19e5aeafcbbed68a7b176e418eec9a70fde0962af0294196724257e8933ad407ee9739fac336ee762e67fe3915b16121a88e26807be2264eebdbd9c08be8ee4f2c4d5f8a02cff6500b2a4b09ec59b10ba9581fc3a753a5cd4ab1b1e6449339e6d21b3226e5d1a30dc342145c92ade0000021c000000b0096fca2236db4a4d779d051fe77a9a0c0bee14cedc168888adf2f649558e4e07e07c9f44c8adcb5f01b6618f2986a7ffb72249716465f3694c4b7323961909a9daefcc5cdc11ede4d060322606940ce221e224dab2143e57279659751122cbf5ecc31b05aafc278a57e098869c6002e10d1ffc623ca2e01efe2f4ecf376f99c33fc5245124a870cb16e5ff6cee3d8742177a9d7728c8308903ea39d7cc228670a8448bf84547841df98328979289dd72000000b02e2a3389944fa6bcb2455cd8582f8d2a5cbeffea6c195b198d4eceb6e1b068c627c2b81953473b383cb789bda7effbaa4756fe560bb323557ed355c4cc2408944dbfb80d804b641b39e939e6caec70a04d71a9e5d86fcfee53471d886327bbaa561bb6ca01e6c26412ef7bfaf14cd2052a4522537310569cd7390ba2bdf738b83ed06ddb4bb9d87d28cfee9e6fd6a8ce0fa8b9d3cbc6ee000eca76e3a840f843de6085f7a330fef98fdd03064ed26ceb000000b02cd9f63f0040f72d509ad6682aea5e9ed09c336b6f7445b9e6b9e94fb047aa70eedde5b3e450371ecb1209ebbebd6c1c64ef33adf2e8f6f7997db2eb7073638196ae32cbabc04faf5ac26d79109deb7e0d1aec5587984a44f1f811e9c433408c0dffecbec32cd03368941673866f0b1f175427bda5406ca7c291be00d6e626562387e7def45cd235f044bdd3f7871cbe1444013b26d41773aa5b3633d94926378f1499ecaa8d2327f050c2391a0cb0d40000021c000000b00a688d2486efe81c1cb379f2ed744c912a17a6d9d013adb8c7f573956843f0e2eb6f11f8325a5efa60888d15bc47a5a4ddc9034d2844fec6cdec914b0d1039b26399cce3670d70f06bc1f94dbc02fd11bbcd84d204b58590b217164dec1857361a57796e77f4237826972d5d5015a59d1e60107eabe092164bef48cd281dbbd24464600115a1433df09ec70602f263f006430703f94f9c498bd5d1472b723ce9fbedd4bbfaa3c5cb26dfa2f4079e3842000000b02b8c2dd52facdc49b17158d81e6b190561a8167a13cccc5fd991cb141241f64d3bd24529d17140fd9bd3b2222a9daf62c939614a5362204b585e5d6ba8b3692be23836a0a1b5afccca5063dfd6463cffaf3b3c4ca949a01d6b9c6624656d81abecc3e131839b5d119807154a3c7e4f781ebae7d4c8a903d6664df3a62d59fd9bdbd789aba6c5dae05f17ed9e964d14dc2db5386e26c919ffc736a06576d9eea5cc62a8f9658297a2f4c346a64b102099000000b01f43eeafeec20db45f78579ccdac95338d6a1b3bed7c0866edf19f345e6ac9b8e4e5fe5d1cdf5653a869982fbddd63d695452d34742fa606258966cab72251ad914e35927206affaeb386f15ea39a5ae6ff30a399bead0c3cd6fdaa51adb595a97de28202b6bed30f075b491e111c3d729323b14db9caf38912b9eaf89bd65c2991927c0285e9263c732141776ee41761211ddfae0f82557b23fb9bdec7f49ebcac1aaf0a7e7e76a1c2b199e277332f00000021c000000b02a42a996804ffaf76b7b8101020211d9a64d50b0890de6cdc21af2428b32c6d775f5a7a14bc35245794a6abc3b47577d075f44bb49bb04b9ade5010bb1a0a3edbad3b14d61ba1c0392cb9ea7ba65da28fa4b6b5c42e1a965f971c8536ccd59c90774085d052c40f8d4632a8f94ddc80b2e0d0f492a3cfb6ea3f52055d1d5133b131c2a34ceb05d0f81636025c933e1f311d91b9893734bb6aa77bfd7e3b903c42ece3dbee72c7da9fcf11738bd6b6c6f000000b0235a7700a786361103bf74fec6ec6cf705a5f06c0324c61a753cab7d99be9e95c92e530fe0fc022ad49551c1ccbbb6eec9773e2b3fc382080287b0e9627ebaf1184ab1029debd9fd612b63adaca59a931702d380ec37cfd8892a7ab9f3d9861c4eb08f953924a19a737c427f490d6e5e0e21984c896abb4b063056c71891d3db30a68fa46538243ae6c9c13c1d29021020c3b8d22070f7e7ee3c1b3e51c9cfd465db63697a13dc307c953367dbd2f1e2000000b00ad84b23d81f681722f42ed27a55e66e743c98b6d24c6cfff1ddde321241cba3b73e124adfcd422931b23756e92ce3e4f09ed09949ae12566a9993e9c738eb20cd373f07adec61bcd9d92270356c5fd360cd24374da9cf781742ff0c24327582196b7663d8eb1c992d0ea58f55d25b100f146f7eb115bde84ec76ccc90965e4944f1bed4e38a33ed6227b7936346a7801ec7cad52d556160a35ec406c760ecc6a3d4b13ebf369f0383e2eae46c2812a900000fa400000168000000b009be2e5499142d4fca414be527855c4fc5a97ef0b3f6892e36cb295c42b532eddca6e9055018726054dc799c381dafd525e275d48a9aac97980c6846f4eb1031cd31112b93aeed54f46a361033bb250e2a2235f73bac9819e8400eae8c7d763b49f6d69d470c50ec5f8aa1f871cc69e8190180374ec0e1aa07a3504f19c1f77050a86f160a55abf9ff3180678b6bc4c42da63127ebba1918dfc6bd9359474e1b66ff457b88e8d43e3a75e3a2ee82beba000000b00e8438d85c245fec782641a8a41b46614189fcf07abb651f121f515cb760ab160f32174b8d27a9ef30968bb4ec5381ffc89015345bb7d52abdff35bef8ddabef24f374533ba508de8a2322df836ee8ea26618329057ea29820f73f983141bdd8e9b812ee0fc7c6eedc35eac838e6d01a2d171f152ef0ca5514b7b2ffc55247758a8c18d6ee54936652ef6a8a326b6d1103ae2ec3c4beb024ab007343e85d304b23560cebd84e10c9adf5c27e19a0cc3300000168000000b00a5112d62522f07cb57bda6fe73215e3fb6e65fe2b1f219da1c975ed0397b599041a6f774b4897e56f520901241538c974142c6f1124382d371088dffe12b840fd22f04922c8481c2288232fa15a96147bf9a9f987d1af0bad1ff1e271835d624c0ba6e7af7def9014c3741ea1b4bbe1298336e9c9169ac59feda8925e45fc7f695522145546fff93e95bc1ad6a5b4a313e0c366208d50f312b8d09e22773ee11eff239fc0cef7f40bfc39af59ae86fe000000b01d252e811e1d2319db11e44a415dc95fbdd2a2cc922237e89f89539e108286ecd97b4bddde52fee5b3242e7d50729e847f58d31943d04a3db85d40c335ea94999c171b1ad95c76784b5e9d41cc5943acae7eabfe3ba68a3bc058e658848c7611b5707c05ac3195458fcc6e352b636ce806cee79100ed5d60997c8570a14f293fde1c2ed156fe02897c062e918b5a26411922a5c09778b6a105a4c3608819da6aab09ff2c37963223ea63c56c7f573f5300000168000000b013bb67893a9a38717dc6e85ec20b99a0860da1449a39c859e0e0078ed7ba838241c90759470fae00c43b5070b84d48dbc19f4016a7f7fe2b6edb19e50585f009082ec7bd0971b5bbc0c4ac93dd9422f8d8c6fe913eae46f1d47b79028a4fe3a642faa3c3e62623bcd873dab2b323d58a050f303c0c93a8f696a9467c1d17fc21660dd93d70792b14188701e66b99ae100c3af8415bbb49486073605232ca872f5d2b7e25252d2a18de2de9be5a560afd000000b024e7081b5718edf7c075d43b7351863efd82e5ed5aba61793e7a4fa189a2661a4fe63f7dfd6bb76fbce019938506515f2c6bfe2c4c6240773bc72a2ae07a1bdddbab15bf1d51830bf131bf5749030d7bfa1bd0fcd39f2750c3185def8a7da707b226169c9a310afa4b2e27acc507e08d123abb7dc899941caa7396efdd43d306cbd2cf2377d359840bef9ec610ff41052f64113427604d4dde3a726ad8809b89795a9d632d2bc70408b0c3cad9b8e05b00000168000000b02ba9fb4f380a624ec77e2e19706906e3a028b368de3374a618fc6ae779efc80505510a68c28e189f315404436ec00f7b74d155c46494004abe0cb85992b7c44b9dcaecea5b78e9af5b28c2c252eeba431af8e9499a94534f26490f9d14d2b83ea17213c5879a98f48813f23d98bac2c42a384b324cc9c9fd9feb131f179d87d5c1d4bc6edda103a07d051d48aa45058912562ab0a4f560cdd29e6e1e70573e2ea5118d18fccdf2660994eed4499f1f93000000b01d2e2ac9e040fbeaddcfa0e451f6bedf9afe4190220eff30674d9937c95517a9f150365e339be7317edc3fccd4ebfb91983ba5a827087013ab43805e4efa2d4a5759e58604b31dae04ca20d78734218cd298f6cb3b0b7c045f40e55ab6da56e0ef6349a6aed0aee67a327da2a0e303841f90f2c4cd59023d4d5ad39688a0154e50198e7d937fb72ece7324606207ea8c00e6ba257cc86bf49b228304ee6284d7456d78eee12158da71973c53f9cf1b7a00000168000000b02990e66dc377d27a467405b666c9e957a5726be7a9e08d2a86f60b5b2a3f6e3f2a59189b047add3c17926a87a4b3de6ca6cd5610f9929be2551f2e145353be892caf499aeee96b9f8a28ead4b7ccc8b0c18c111ef95845caaf8e42cd1c6eeef1c8d0b089ad723e939c6bae47a18ce91a013868691d995f9532a7b0d45b3e283d502da0c1c5091db2216d05cfb973db25137cfa1c755383c0ce3cc86d703eb91421a148a6dab3911e5e8ec24298a59708000000b014d1d6d25acca05790cf2e689ad54a4357403244cf6f93adb44daa4b147cc59fac5d6f50dbacb12e4a71ebf35b77b50749bebae22a65ffa9bc0efcc52a3429bf1c947e16877de8b8f5e2373b884fc7a927d2946d5d26c7cc8045ef6e236565a9831e5b7e2ebaa4305bcaac709bbf5a982b39acd52fcaafaab9504445b9f9cf2719646242f560bb23c178db4e05a773af24f8ec201dfaeefb229a4a028bf9ce36d8d11226754f66f59441a1b37131f75b00000168000000b029dd0ee8e4c12cb3611ffa96454fd082750f274d9c34279a4d3da04071ebbc2cf52067ef67432be70f96058a3d2a01575277c5f955f0951cb84bb2be8b86bf9ca9de2463f1fa5dd5041572afef124c9253e4850866c4afd96c0b8660ed11c6b9131698ec4db3bae4bacd52e1bff981c516d7041c4101a21544036c62311058fd7ebeacec11b17c8316332ffb27d03bb024d2a6c727bd0c7ac75c95ce417cba483143dbb8ae93ad86e45550e2ef9edb32000000b002410db7d8737b105bf11b8de773d48e91c229e305af4c31626c4065457db2f44f320c6b568a1d115ca0325619fd5bd0d14d72cd355c6cfc9c3bd435a1dee8e7481e3250740ce975ae98e39828a063496ea54444455678bbeab1f3f297e1ab58b68b0edddbc26632ea38600a186d8d3111d5f62b20a394edb6c468080d34fff5e04bc0ed2a404eff80ad08bcc3df209500c9877e01ddea6941e9abe79f13ee528651db9af3895cd7eb68d8f5932aba7800000168000000b01159aae8fd1c6208c67c2fad7fb984a3b8e47a70c6d42861bb2e405b6ff4e686f07428defa294846705685b9d8d6b7a7c8959fd8f56e913a2b48f442dcec55a9a3ec569021ebe3bfbc09384be2e54e6360dfbe9013c917c08c37fd55196cbf0205475118c2603b2d25e51fe69fa3a7711a2f2419873e0be35b06321c9c08e1a4d9dcd3655c4d692697297e7c7ed1e40b0c11cde0cde7f82d2e7b6463cf5217dbe4d1ac8be27b7270da3974eafaae8837000000b01e9eaf12887ccf57d6666c94b23803a67a8df7fef73048021d83ebed271047e2c47ab8b2447290a602967ce34270a10dd45c20beaec45753bdf95fdb407f09e3932afa25a450f5445d74d4b7d3100b28fb93a18db2063b29babd1928c41c91a87314b461936a778ef9ea23751916e71102a75ae7b3b22c6d661c7773f9e9463ca59f26ac336be7d55516cbc6905e1a470d2ab4ad240dd8f5696c2da168fbb20b6bccd8cdb8fe1620ea21ef7cf40c61e400000168000000b008dd889a261affe3e169e621fbf61f461ce1ba11963d93c264887ffab0fd155d8744436ca3dfbbf2c6ebf539c6a4e1d7a53547ea73649b2a329770025b91733df937101126b8c203b9b80bc415e667ae5f9d84236b5a30d14d2d5244d7cfd9f122a09fadabb2da96d94a2a49426dfed60c39fee7037a7acc7bdb572912434ad24f26c1ff571c6bd2fabb6f5c03738d55202bbc178a84267c48590efd86711a162d2fe16812b595e2061e717642a02f05000000b028148e4958f95384ffc3f1fdef8a8d388b09d298f317d14c27b05fa8f9b52c2df656a924287dfda9eb18f1bfd6307d5e56fc90d2470944f3ca31df5589372b380f68d1a076d326dd16420ab7c232995711fdb251753cc66ce608ea1cfe39c90cdd1be4d428bd27b210662561afc98677259a6fbb209fe972d6da4d6f791972b04f97c007c8bd0dcc7b61ad05c0ea43242437055e5596582ca3ea2242206f7e37ffcd55cb1fe44e9dd8162c4889478b9a00000168000000b0193ff9fc02d479b09786ea9d59c9f5f43e744e7b11b26c3b423223ca049f6b5e5230dd2c15a551c7a3263dfd18dd691a81487db67806c52a17ce3d0c58b387e1a49003d52546a02ec226f10663651a7833cef03e0c6e9a801b4085e30932601f6a52819943e86d0bdab482844393d4c20cf2fa502e5036fc55419704f22ea2523d84e1db9c314fefd0459ccb1b7a90782359ee51c493e966ffed23e582a686846ec9f5045bd359c260caa1923564cc6c000000b017ab8e622a4218c95719ed08dd6b0266413074bafc000ac146d95fd982e804ec4cb3307da970930511e3221ad29b374df2e94bcf32f57065d6ac1d161617d6532840038e08403a3285497d1876fe1fe2171afad9662f2c3d9e8ecfd34e917a64ff02a6fe0281b4faeb8f854742a17f0018010a8bdbf32d92058600a8244e70847c2fde2640b0298815188312d95b80bd08103f90e98234a3e3b5a53a7e7cc78efb6e2c6346880049b2c1e0bcfd21ae3300000168000000b01948988fb9b87b4f1f8609020cf1c36f1bab937a5a2219b45c4d4038a2666b87667b66806359f262cab68ff53edb6d84f25f1601f641ddf2a868d9fd7e37d9d62e80d3704f2676f6423931717c406d9605aedcdd32bf5db0818a3658511a372464482ba76e116124babd184d1ef8b8e518ffae8d202795b898550b28eabeaeae43f0995ef9f173b4ea5abeb88c2720721ebeb0abd56364d0dbb758c20c50d8e607433fdd302368fab6b99a0e8a407afb000000b00afcca13564ab1e2bae806dd3b249c8b8cdaf2cdddee80bc7ba212ab76744cf2d8796f678b3b73e68567dbd8bbd9352387866ebdff99537821d98190d8117adc15b67c333e14a14a340f883efe1bacd5628d10673f16c706929838d040d7675c04061cd5ebb2fbd360cf6e3599fc48ff15839ac9798fb5a7e588f62c4316dfb770a562308c672619d257ebd8dff80c571317663f59a6620cfdfd25c33ec3aaf6ce7f6b3f3cf159fe4465010d364f70bd00000168000000b008f5b7f88a369a0edb78824463502097a31c37241914c29cb3d39a362be37f6a5d88a77a5692ca94494b2072200528ccc0e0b1c742251e0669d585eb73ac5b2665d476828abd237ebc3041769949dbac08279118c8a78a9a12faea40e6c2c3bf251c70f348c9493b55472f0242533a681e0bbce8497fecbf20db7a410535f71f54f5e651ceb3496da40eb6d17e53294b2fd22ff47f0fa660705f454c8976412b06a48b4b5f22441fc0aa3434bd797e50000000b01a32878d134a7bdf7178eda37664979432d8ea62dcf4ca828ad952b6f5a3adc45f568b113e4432b78826d55c25c6ac65011197a7c5499e0e4f7a86bcf5b87c843a565db02cd0749cc6a1b01b2d0d5facef12ec079bfdd2729b3d4c61c6a9e669342bab5bd68900aba107fd475c152cd404cdb3ef402d386bbb31ccd46a4442e241bf28e682b34f5b5c3eecc9b293ad3f08382fd7efd0b91555de64ae18df4921682f5a84bcb1428cfefbc12537da8fe5380000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000030100000000000000000000000000000000000000000000000000000000000003020000000000000000000000000000000000000000000000000000000000000303000000000000000000000000000000000000000000000000000000000000030400000000000000000000000000000000000000000000000000000000000003050000000000000000000000000000000000000000000000000000000000000306000000000000000000000000000000000000000000000000000000000000030700000000000000000000000000000000000000000000000000000000000003080000000000000000000000000000000000000000000000000000000000000309000000000000000000000000000000000000000000000000000000000000030a000000000000000000000000000000000000000000000000000000000000030b000000000000000000000000000000000000000000000000000000000000030c000000000000000000000000000000000000000000000000000000000000030d000000000000000000000000000000000000000000000000000000000000030e000000000000000000000000000000000000000000000000000000000000030f0000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000031100000000000000000000000000000000000000000000000000000000000003120000000000000000000000000000000000000000000000000000000000000313000000000000000000000000000000000000000000000000000000000000031400000000000000000000000000000000000000000000000000000000000003150000000000000000000000000000000000000000000000000000000000000316000000000000000000000000000000000000000000000000000000000000031700000000000000000000000000000000000000000000000000000000000003180000000000000000000000000000000000000000000000000000000000000319000000000000000000000000000000000000000000000000000000000000031a000000000000000000000000000000000000000000000000000000000000031b000000000000000000000000000000000000000000000000000000000000031c000000000000000000000000000000000000000000000000000000000000031d000000000000000000000000000000000000000000000000000000000000031e000000000000000000000000000000000000000000000000000000000000031f0000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000032100000000000000000000000000000000000000000000000000000000000003220000000000000000000000000000000000000000000000000000000000000323000000000000000000000000000000000000000000000000000000000000032400000000000000000000000000000000000000000000000000000000000003250000000000000000000000000000000000000000000000000000000000000326000000000000000000000000000000000000000000000000000000000000032700000000000000000000000000000000000000000000000000000000000003280000000000000000000000000000000000000000000000000000000000000329000000000000000000000000000000000000000000000000000000000000032a000000000000000000000000000000000000000000000000000000000000032b000000000000000000000000000000000000000000000000000000000000032c000000000000000000000000000000000000000000000000000000000000032d000000000000000000000000000000000000000000000000000000000000032e000000000000000000000000000000000000000000000000000000000000032f00000000000000000000000000000000000000000000000000000000000003300000000000000000000000000000000000000000000000000000000000000331000000000000000000000000000000000000000000000000000000000000033200000000000000000000000000000000000000000000000000000000000003330000000000000000000000000000000000000000000000000000000000000334000000000000000000000000000000000000000000000000000000000000033500000000000000000000000000000000000000000000000000000000000003360000000000000000000000000000000000000000000000000000000000000337370000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040100000000000000000000000000000000000000000000000000000000000004020000000000000000000000000000000000000000000000000000000000000403000000000000000000000000000000000000000000000000000000000000040400000000000000000000000000000000000000000000000000000000000004050000000000000000000000000000000000000000000000000000000000000406000000000000000000000000000000000000000000000000000000000000040700000000000000000000000000000000000000000000000000000000000004080000000000000000000000000000000000000000000000000000000000000409000000000000000000000000000000000000000000000000000000000000040a000000000000000000000000000000000000000000000000000000000000040b000000000000000000000000000000000000000000000000000000000000040c000000000000000000000000000000000000000000000000000000000000040d000000000000000000000000000000000000000000000000000000000000040e000000000000000000000000000000000000000000000000000000000000040f0000000000000000000000000000000000000000000000000000000000000410000000000000000000000000000000000000000000000000000000000000041100000000000000000000000000000000000000000000000000000000000004120000000000000000000000000000000000000000000000000000000000000413000000000000000000000000000000000000000000000000000000000000041400000000000000000000000000000000000000000000000000000000000004150000000000000000000000000000000000000000000000000000000000000416000000000000000000000000000000000000000000000000000000000000041700000000000000000000000000000000000000000000000000000000000004180000000000000000000000000000000000000000000000000000000000000419000000000000000000000000000000000000000000000000000000000000041a000000000000000000000000000000000000000000000000000000000000041b000000000000000000000000000000000000000000000000000000000000041c000000000000000000000000000000000000000000000000000000000000041d000000000000000000000000000000000000000000000000000000000000041e000000000000000000000000000000000000000000000000000000000000041f0000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000000000000000000000000000042100000000000000000000000000000000000000000000000000000000000004220000000000000000000000000000000000000000000000000000000000000423000000000000000000000000000000000000000000000000000000000000042400000000000000000000000000000000000000000000000000000000000004250000000000000000000000000000000000000000000000000000000000000426000000000000000000000000000000000000000000000000000000000000042700000000000000000000000000000000000000000000000000000000000004280000000000000000000000000000000000000000000000000000000000000429000000000000000000000000000000000000000000000000000000000000042a000000000000000000000000000000000000000000000000000000000000042b000000000000000000000000000000000000000000000000000000000000042c000000000000000000000000000000000000000000000000000000000000042d000000000000000000000000000000000000000000000000000000000000042e000000000000000000000000000000000000000000000000000000000000042f00000000000000000000000000000000000000000000000000000000000004300000000000000000000000000000000000000000000000000000000000000431000000000000000000000000000000000000000000000000000000000000043200000000000000000000000000000000000000000000000000000000000004330000000000000000000000000000000000000000000000000000000000000434000000000000000000000000000000000000000000000000000000000000043500000000000000000000000000000000000000000000000000000000000004360200000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000501100000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000070a0000000000000000000000000000000000000000000000000000000000000701000000000000000000000000000000000000000000000000000000000000070b0000000000000000000000000000000000000000000000000000000000000702000000000000000000000000000000000000000000000000000000000000070c0000000000000000000000000000000000000000000000000000000000000703000000000000000000000000000000000000000000000000000000000000070d0000000000000000000000000000000000000000000000000000000000000704000000000000000000000000000000000000000000000000000000000000070e0000000000000000000000000000000000000000000000000000000000000705000000000000000000000000000000000000000000000000000000000000070f00000000000000000000000000000000000000000000000000000000000007060000000000000000000000000000000000000000000000000000000000000710000000000000000000000000000000000000000000000000000000000000070700000000000000000000000000000000000000000000000000000000000007110000000000000000000000000000000000000000000000000000000000000708000000000000000000000000000000000000000000000000000000000000071200000000000000000000000000000000000000000000000000000000000007090000000000000000000000000000000000000000000000000000000000000713000000000000000000000000000000000000000000000000000000000000070a0000000000000000000000000000000000000000000000000000000000000714000000000000000000000000000000000000000000000000000000000000070b0000000000000000000000000000000000000000000000000000000000000715000000000000000000000000000000000000000000000000000000000000070c0000000000000000000000000000000000000000000000000000000000000716000000000000000000000000000000000000000000000000000000000000070d0000000000000000000000000000000000000000000000000000000000000717000000000000000000000000000000000000000000000000000000000000070e0000000000000000000000000000000000000000000000000000000000000718000000000000000000000000000000000000000000000000000000000000070f00000000000000000000000000000000000000000000000000000000000007190118ed29009967db1af193f6fc8620824c8bc6022956acd33bfacbf6df3445226400000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000001201000011000000021c000000b023075b75e16b5ef19ff7f1570175cf7ea5ad5342a9690073bdad113c53a85a373283317e54423625761919fcf19f36a8c5d294ef5a289f6d1402355e301f446b89405da6aa5e2383b52103aed60940e7cbb8b29530e2e9c1279d9522f4eaf7da858f842609ec97666ababe5fbef942a02f50553bc087cfe41ca97b27bff3f820aeff48fbf6bc47adb074be5aeff523ac2ea79d0c891791679da6a3de3173ae0fa5cfb06a5a14748d9b7e283b6cdd271f000000b0004eaa1c71d991e62ecb815f1853d04df3f8dcd50cee831db1dbd7fad0f0238df6d2187cddce56924d8c6bf9675884b4d27c5238bfcc1ced1a4971be5501bd70de34cc1954ec5669c7c5d5a0350c5b6e59612980c3af3a1b7e448b864fca7ae9faaa3999105ccce803c1c6991bb0bdd7239bda12bbb669836588a8b3ad68e12c8bda4182292b859f7a05790b85a525361bf395b5dced9d9dacb40fcb34d37613460c4ff48111afa7b7290ef5b8ec99b9000000b022c41bff66543b1ba36328c8137add29c277bcd62fa95654640440256335731666ff61ef49e479d74295860efc358724d085cbb839b3fb97b3d40a383aa977129f35fac7cbe26dd81a1b9ce7fae9765e1b0b8fb1284a5778a71e6afc90e40936ef0dfbd3675386d339950f3fc3bf0e591c8cff9cafd37650266f3acd9a75ebcd9f615f5b39a41e70e6e7d4fa4b39dff00653cdd3449eaf11a2700281e06f8173d55ea5dc34d5cce5339a3101f623e2650000021c000000b022bd15a2375aca3a58e841d5df60ba11b7d39a11674422caa296e4c59e290983f9008b4f4dc79f450d3111724d604186fe769daf2cd9f91757dcc9f91eba1ff84edbf06d0ccaa9b2ef0153e8bcf2968e67653b106ab0c7636019adcba5ccda098354f9701146c8491aa4656673a2b3eb1ba69381af5b5aafdc0c1f06e245a53c4227d9d22e42646fb0e31835898f519b1d9c047d8d3c092b597e40b206343f872b47be0313fc08d7d9bbfd05c3334977000000b01d13155720e6080de5fb3d1c84962080923ab33f07e1c5db6208c3f29988e471a6bb24361b36ae49198dea79d467e5a4f70b5fb5ea11a824b06c36c5b4463f02bad39efae4d2d28efe8cf541886d511fa3106a144a013358459e755334cf34a8c682d5523aa5d941be32d365488717da20e4d58b4bdd57a32f300f87ed5cf7597ed0da94fc3579c2ab19700d6bdc752414d7d440eae8a301279de3778ca1610b5cbd284396968c7586c3e504f2c37742000000b022da6b6248874b32b886bffbdfb8feb1b7ed62ea3da734636a110dacbb0a006b81c61864de1c1201893bf70ff174a7b59694b263f278bdecf86d8add6adaaae9969542216985327124850775e9c5a425a3173df7959555cc7c26d7eb756d4372a9485eea18de2bedcb0a066011c6b1f60ee42bbe96268ec39a9280f16908c869206927d66287c612a53dfc16ea3b72e80dd4f813dab60f2ec1e5166801419c35b643bf53f453164febcc1e38b15c9b120000021c000000b004c6f3c0e6c2365f15d0ad4b3e943403bb7d71436c5d681bfb27ef80435c8679433a0ccc0b7c1723c70571288452e2cffc0b7a7a98919a6fa6e18e86b82e50821a907a06a116c8bfe9e2bb040e9bed15f322ddf88d210c966a592be689be0dcb35782fade01e8269d47d95ddfe7298fa1742b17a18bfd1de0c6b60c3c6bb3b213ff9defbb88e31a2c2e6ab606df391bd0b7d86058d41934f72eccf5ac87b87a9cd4c580b2465356540ddcb1673564085000000b004060208bb47bdb23d28e8b3505ec08de41f32e4305011af643b89e8642fb97a6ca2e9fcfe8245c2aea19cb7c47fd6113dee06ba0b0e6f320d9cfccae3aaca4db3d61e671970aa31e63996c924cc7f72ec9083b7210ccec3cbf80bb94d82701ffc68fe620b1bbd914d5d4dbac9925b2f285c1b68d8ed3d98e7e83d9df1a432700779839100052df048cd159a09b8fbdd2be3be7dcbef32c8e4ea45ea454efb1db0f163bb7c93fdb6cc21d7cc3b50ab77000000b02ac90edd38b53b50ae6a17b5e066c96e430b06607f277a1e8d131fcc0d624569b3bd8e2d1e016f299e388ad556f7f5a62d9b42d32cf27a3f4c48e9df58915f42e1ee98f2709d616701a0fb736bab728f6a2499510df5ad6f62c679e918d022e97ace20b6e586ff0f83cb27b2c268756310b6f6da84ef1e30b2ebef928f3b3ce16f84a2f58c5c617b746da8800281adb313d542e2aa1aa8ab89fefa785a65c769b75bca77bc296aada6257e6fba5d8cba0000021c000000b0210d26e1d8fa484fdf271b1d827980c1cf6c5eb57d44689906473d943831cae1173f0eb120c094b65c313393e84d1b4136ea5ffdfd8f9f9e55362c8945a1f576490c2b94fb9b0f6ea91fccb050bd3e062c234d6eb408beabdb9937e5209ad9cb3e967c2c6d9f550583e410b7e4ee12830d8d7042c4794ff3359a6c3e2bd595f2c695a993d0e920598f44ee657165ee752a178e37436d60b10f6538e430ec0b71fa5ed2659525e12f3c1b8a5c944a70f2000000b0095f944e3fce7701799409fe8b76ed07558ca79f7eaec68a08a0829d1b84b0ec75d52f8825696a4bf08d825ddff6e43336612090d1191781737e25bc72dfa86b1a369046db3eab346c6f0a49a1cdee44d53174c2217f58b21b4849db245f44dbe4d02aa7df4fc9903827aea33e6e40be23c3eeee2c6b9b9ce644a3b856e1b0cebac13d78f289c728f908d7cda5ae2b232629df6320271698e96a937197596ae3ce96d745bf89d7fa70381d3ffcd8d035000000b0211c974520e0a431f6264d011cb800d5b9e4e08636b244f2210f9601e19e3f9c3eb72b9e959d0bf590b58456bdcbc5b9d3ccf20935dda7b5d66399e07413d1fdfb62d7f822c89767d1f818f99e4fe66a2d08ad18d886bed7ecb4de5185afc479b5eef92758c224d679d13ef7cea736230e9b6cfc578424a34b897a2c1cbe3ee61958548c7343e87a8f776de4f2f7e1f811826120dd0ad8f2d4063fd3b08329827b62ccccc1ca48b199dc08585619fadd0000021c000000b018b8b2ccb20a32b16ae0d08e6f7f970eccbf63bcb95cd1d410c29fb7032263956a2809c379fd147b0e8c66ca90d468d920903fb0db2711793e7f4f628a81abd0873c857c092e0ec78c060668366ced1b74573aa1b5b2a23134d267980235e762e8ac5d398cc1b47105e309935ea6e43d180ad93049a6a1056ebabdb1e9bd8c8a35e993495f25d5281be61f2b68bbb03e099107f4060c4702ba27885c5b06f43d309875e15507bd50f45647eb62b11e1f000000b017f264dc8cf5019511f16ea700c877c08445152d6285e326dd1cdaaa612c35f5e585e2601d7ed9e5bfc958dfe2f978a78c9fdc6b1aa6ba8614861986a4b9b259ef834c3114a50ce12a053c370664fd81f1a112bf16c1f362bea3b60925181761a9699e006fee3fe88564a8dce9a647fb0f84fd427ef7501727494b38b72d179498fb198a0b6d735767a2c235e92b317e225c68889d32962f61196892e84c5753b4b2ca996cfbb2b1a117869f25c07d54000000b019bc923f9e78ad19d8f1348b2cbe9079ee44987ba5d504aa97c6432d2fdc11d9df883a36bc15ef0a5538aebd0185bd8b5bda268080e8729f9a64b9ef723670e5fade19155c5a3ce2414b450b673a746a524753b0990a645fca32cd197b7cfebb696097967cc915008a3ab35430a439082cb9ab012c910376602709c51c8aab418fe90377f4197bd9dc4a7b3045b706c11421b4206871293b2b4e6d4e04a4dff385d3974dc2f603587d8e7606a2387db90000021c000000b029e175aefb82d4deb081f4e31e8aa2bc9531afb5c56097f7c62534ad1ec57c7078ffb6c097f3d4255d5e5b00ec93470d97a208821628aa634b1fb555ef68e111386a4fd6f8eed5fb1b7dc6397f33623b80ab320ffd4a59179ad5c3d31ee437a9100a26246a597b28ad0e028f67f375871a4172b7e96b8e1bf1a1d813269f6c32e1a05c7220cb254c0fcbc85b4173962c0ce6ec7b875d9e20090532defc79ea005d46090e4e7dc3d186c1160cd091e74b000000b02f91757bb58d172d48f9bfa581fad83f0c43f0b4eb58fb95d89e6bb0992c1bcf3af56351c93cc6d73e360c8700c8d9ed4a8fca78365301e71a9d82af89e5f9ec7ec390406748856cf9a3c8be24f0c2cc70f127ffccc21f82e7bfc4726efadd82c185445fcb26f7a636ddb32720aa164115e708582c9b0addccd6919c9b6c7f03bc784ec7cb3c31582c3dfb7c1d02027b02eedfad95c751a69df243c1fe4e055c8de9c2fd0693d4176c4930f14e0133f1000000b028e8a8fdf116f463e15389649ef388b92042fb88999aba018492ef6cfee2eabae28cdda37224aeb3d1b94c74c04e14a79d83489e2c4d204bd9ad28eb21064fbba56698f5739a18798b054da7491bc1ca8c9f7adfb824ec9324d8ddee98b55d8313d6dd681b31fc953ae3cfa1cc4f60c615cdb54faeea3636fb41352092e6ab1f2a0c2fbfb33ecad9f78b1a4d02dface71091d367de7e0f7153b87a195ff971d169bb68725578b394f22fc9fd41a20bb00000021c000000b023949a6c487e9e6d6a36b0e0105bba8b88c62e405d4bfb394d7219434876145a03e633d9fea9702d857613690be3f90d0bceaa8fc45f084aa19a1d7ccff536e6431aa1e9f9d18563faf491ffc08bdded11cac110d5bf40a98f86fb4356586abb22d73fab3140d0feefda08faba7e1e930d4cb587b399bee7350f5c7d02277c46dee62a4aef73a88114e9913a25bb298c17a00a20173646241d2e4bb0d23af15df312aad1ce7f2462af8d6d55b1599e5b000000b02f5e1f632d8f87581f95cff082f25df2214cd47b6f0897dff00156d56ab941927fcc4bb40964d1acb3f865f8da0b577b5b495eaaa457267a191c48d5c2b181668009c7dd5a4f3916e80b7e63decc0458ea719ead281a52935f138d99f2f16a892aad6cca07e238db2734ed9b5689d2d8202ef014ea6cc9663da75918e2766e36552820002d97fa793469cc767edd5c79294a3f0d5b78d3b4d38704d1765fec754e83df82bbcc959fb16e569ee42d2b2b000000b00c1f1b376d4bea2751fb9b04dfe2e4581d575a4eeda2ed9a7690ca384dbf113e052dc280cc5928b1d62f3cea14239f2779054463b2bc5f2a0f9abce76b06af9a2a175fd25cfe980e4d996510036db691cf72a60a201441ae68117d39892c62218f60e4d813842c720303d314a34181370347b55a72a6e6d668f198fdfcad223f31dd44203a404b5fa5693880614a792010fb39bb28938307de0596149d67d8fb6da9b988023f96857c68f300e2a207370000021c000000b022f9a7a5621d202a6bdce5d2f99e560af5267d2a5a03c3864116b7f860506023975d7e2911ef6db687a7389e2289cb89fecbecd0d96d169094afc28d990420448e293e794c4ad537cae64200ed40d8b14d4a8c6b6be14692f12366d4a4493e4004a57c22f95342b7c865fbf959cf905816268cbf0903f242d9cf4610f1fc18a5f1a025d5f726a2df58a88b3107ff0ad118af540065528f0a46d50f9a8976d1029baab42ef54f226c4ea7f0ec91b3f31b000000b01f977c7e636234e7e56a8d2c791719665c87cb37345a7e89c15f69df5176c1d46028370a0bd5474d11b9be345285aa8efaafd425c18dcab0e21c8a8c422e29106a805b7cc3bed503a4225e8a1a026f6a90e9153856232bcadaa893cea9d4549f296ff38a3cd5ddaacd5ef8839e7f650a06ffc6d0d7fed02b1ea404d7170a7135a23f2be5072660c5e3ae66c280ce85a12f36a8e188bd5e118a124233af07a222e63505997efc28724aae2c5beebb2780000000b02924214e7f395321876fa87594ee20b16530e799f5f2d3157ca02da6f937045259dc2415ad85b5a8e345fe77dd00e6ccab2aabc7d5b8f548deb2a2d9c49ec0fdfd5ce183eb263d05c7a5cc4984be5f4d5c44276ca62735725174befdeccf9a3075af3620f56616c36a4db6e73b73e49b213c6a6c055414796e59f46accda35ab2e049d8d2a521bd3bee34fccdfd97931182b811f19c7247788426e4817babef294e07dbbea009af607ae357cc10a3b5900000fa400000168000000b00374356b15049409e77891746d3ef80550dfbc0d0ec44b814a6b381106602824677c31069cd53c0b4376fa271df9d555e9465d92eb6694fd20aaffe40d4aee9203f0eafb627ac3af196cf42b1cfbb7cf9670d148a8939eba40872dcafc478e9e7ec051894d46e5884df53bcba93b6d692444a8e5eacd7b467320f651f47bd5b796be15187c865a11bb4f33b97b6ee3ca2b3aff992d25291fe40a23f8324ff8af30cdb0f042f36e505686c0b46d59e8f4000000b0050a89e80f33f0dc5bb334e246c236f83620dd7f1e0abd090cb835e6bab8b0e7a8c18563203f3cb43497bf69fea3a7b434cc7a70100ff2cc6b5108d6c117e2ef112a1e81af9743a7a7b7e9c0563fe9086f9be7b69056f961a2a8fc00288df4e508ea8943409018f733ccf09a9dc68dd222749f2f207e4e5a1097f6b576eb4d7648b4c2abde74e2a43c22b7216635167a236c50c4b16801ccedb5ce9005c0954e1d560dc17b62fbe6615145ba74b9413c00000168000000b00b91c84a2688c18221854cb6896a680b8fd09be28a81bc089b65f436d5136a675523239d764ce9c4bfec04a8242572429d8de4822e7c8046986a348b2fe45327f4a8629fc6ed0f7e446e63cee346f2f99407b8a3668371304bb6bbfb2c12090087ab0f0be4aff65949893b9e6e74d53a0c2941329fa7189271cf82b319bdb7878b573228164be84f9b34e865d380cb4c281a54cf8ca16f9be3b82bdefd1c14c61c19cfe92d3472bcc85c8a7c496f1798000000b00c731b83ce694d8a0e4dc47d67dd2a1096460886b090833547a5298f8f49cea3ba9033ff2c68f8f4250239dba4b6c43afe54eb5433fdf84064368cdf2cdb18c374762f67ef4d143181b532f1fba78b154002b232cd8cc2d0aa28f805056acc738d4e4cdb98fadb3fc778a6a123ecd234075d3e8736f3246bf45e071bb0a72a64d73c7c1c807078bcbc7dfdaac14a5f1e00729cc1b9fffdbcc48596d6503146259d5507f65ff511ee367ef0b940466cd700000168000000b019a89caf500406c3572b276a088ad244f2edd93b56594ebab5e0673634aef8cf6e0770d4fee96407f82bdf47fdb1116e0ca112647fa0d4d711e9ca8425621a94e8c46f718fdc066a8bf9afaf37248eae7f58cdfb24a743b5cb357ce13b8195c75f6dfb471e84168c95544bc5a410517f259224a67da56e80d247342e987131b7814d5d9d5f01a32822e6fb5e72e867411caa7dbfe8e088d3debdcf6f4f3055035a33d28e86f2714a55997de8ddd0ec64000000b01f2b4ac6f959c8be301dac938b0c0ec088deae2a864dbb5c8789345386b282b2233d7e5da1f1b0ff2395524a318f1dc2061da63abf03f5c3600b0834546e4051a74effe14270dd7b1bfef63ee39c5d1a379e66c5448bbca44254fc0b6f4b9ff49e5934209e1b82475bb7721c040223250cc65897e4786294139311b955a5ccb2f17350cb675e8154e2badba5c497d34625054950df73cffea33886125b4779a81600979b3e6695a211f0d5393a367a1a00000168000000b02a41229c020fb028c80aca250f425a521272f637ec699629901c3fc37b8824ebb2756395431b5366d8b81d2e3d65418ae06cd890843733b2786f327f650e65f5df9c58fec4afd221869b74d45dea6ab154c2ffe03a2a9faf1eabcc39f4b80f15f35ec0eee13f88f19cea556398eb1dcb2de7848bc44f8035c4bceffa732db33f290bf6db352c66eca02e098d5e6237dc22ef5417af21becac9e32b4042b9c08144bb4488f3b3cc23fd64eb8bab32e1ee000000b0185a94325a07b1216ef6efe8a495dca76733b41fccfbbef1efd10227ca125799bfe78d8c7238aea310a59d96c34735453a5997b184d5edd74236064e29e5516cddf625656efd59aa67ccfbce44e41742469523c2399c74128e6967f2124aed39732a2d2be6f4c6f3109ae6cfe406f746120be9d9e32f22174dc8a5a0f9de5e9159dd194a9a74237657a9a37c018ee1c70170e8ed4f0ab7e348408aa98d573ba097f566c72f5a33a19852716fe661cf3400000168000000b0187e17a6b3a6119d3b9db1ed5d002b00847bc65111cd34df5213a928600bc1edf31a1e8293baad8b9e056dd1be82fbe39f94362f5f8cb2aa49b089625d1e556de75965f4722f909e26302099d816e56d7d9d4ec2f78eda9830aa2ed4df467ba4b5268b797a6516aac22a61b1974a628c06533b3e0ddd690f27995586b49290353cc9e6007f7125c49635eacae5bb0bef0f126ba0bfebce814c19a4f5bea5584af551be8ab15e89e606ee2f0052f04b4f000000b02593757ff3a32eb78b9fb53c7057d550de83dd2cc59a47747b392a7e46e626eec6e893ef0e3da1db0f1f561033939e8c3497e252992968db862be26c0447e63d6e3995b4f5cb492d43191516ffc41094ddef34f516e6453ffe1f277a89578f3f6c57f5e8fa5f5af7b9fcda0a7f2a97e20d8df7d6cb4721f77c89d871dc9f4685e479ed1b7d49b9de99520ad64e7c5ba81ecc31bbef3c2be91e401b665159eec65db72cfea17d28bef920eda61e4ce43800000168000000b020e2b5cc89751a1e2c9c49d5afcdeca20c66cf06c499e0a5ae08f8dd95c4ca9f21ba9cf8c8893a550d9f2451f8d73be90dad51bb98c90ea69efd81933be1dfd36df50e3be0803bda3fca1d9429384d41d4e4da05471cd7f398fab7d8734f50b4c9ea7102e99ec37ffb302178894bc597172c7847f836f2643cc0b5cf5cdce9253dea0251beb4195f74b77610e668362100dc06756dd5f706fbb1c0be979c3a413c15a002d08d3b94354fd6c7e405dfc6000000b01f49d61125dcad1eabe6f25759a1d55655fa3aae6c56f6c9a0c8f0695808603211b93e78d3ac4fdfebd4876f2891618d6651e69ee85f0efb02c28d58f92c11080122a834c0919d51d3b57d8fa06fbe200e23cd41fe87e97da8f7c01c7e5188163c2a3579456bf5f7d4c0b3685648ecb7096a605423839d34628698175e3f23a35a279460d73eabddb326091b7934eaad07dc2ae6cf4c2a9ff9296d481db7beb782076046287de1b15d6a325c4245593d00000168000000b02a12c23e5bd37562f9847fdc4c1c09135aea5db0df398b90d974b741be86bd722620b4a1da243da2227b91f6655c9192f869283669a667b6132772b1cb4d222356bb8ddfe47c83603c3b8e56b667f74ad8b9a8b8491f5398dc8fd1457a63394ce5ae70fa4c5561fa29e237032be77ae01e9b9db80ef4727cd6af3c96b25c5b79ba523bafa8bc0e9d1cc55b0a954f4e99233cd7d873903b6c05b76920672f6c8ea59485c7ef5b8982eddcf2fbd6227426000000b0253abca76472edce5835d43f60a41f13038ccb56b9a11bba143e2da880d6193e48fbf19f166c78c160b3a46ce5755cab8cfb8f8d5bd72c9323aa72284e2fca49726ac9148051170ce99fd78a7bea0c75d96560fcf74d42608c51105b82e337334765af81fcb8fc8f6b0e691b6780d2810ec986c4019b3923b03cd598c070b0deb5d5df68642cb014ba5cb540f691f09d00cac6243849f1fcac74f68ee7f0068682d0e1176d42d400af3a3a945a482f9300000168000000b02cfab6044a71ace9d14d825df34dec4bd24ae7d3bf274cfbfdc867ad067cd5ada2cc5afc00aec678e5abe6461e5cea11649a4b7ded96cf7eec1d66a35b0643e3f0111cb789346488e923fff1494835649556b1ac91e865a8e61b7ac3ae928c06d5a29f8eda4de57da71ab3083643a9b0057b438302e8afefc9c31eef4cf7d0335cffe0e632de4ca4c4269196fe77afdc245b46a8542565c9d702ab1143d592fd9a5a7732b29d25f2cdd3f8d16cb51dee000000b02e4f05c72684a4a56e7ede063c5cd039aa5937ed0b218712e428d33f6c9e71152968da71564658b17bf16853cd5434c967f93759c6aa55356b01f3d730b69051231fff565eac03214e96402c46f7d17c620f9e03a224da103cbc78902d67c52831f8f397594c066885028c1988c8a21912580ad3f2490b7347c20f934f589f89bcbcc0af8a8003ef961c020da62893fa1fa98879d1f5cc45767791b4559945861c1ca0c345116565e507fac9f3a7097b00000168000000b014334e973ae9e5d3597c015480ffc99bc091a8482e6f72960c25b4ae171282c39bbc932f5f646d85a3c52e84c0ced3422d18525db664fc5f48a0089eeed6df29deecf0e7d315023140d2ee7d58a58742b64ae8bc6426eeae8e953560a128820d5fae7d76836afce83a946a82e698d3862ad657328747ef4417343938ce9b8c6eecbe3674dcd383dc6a8f3af21ca8988f0e505ea6c56e4b75d54ac02cbf4cb0d87ec596e4d2eaf56e7f7eb49cff38dfad000000b01634c4bd23ecfbc73cf274c0c679bdcb1fa90964eecebaa1bdd4b4ad2802b83f63e8721340652611152e8c1aa95a7ab59f8eb5ac078757ed447ef75bed55ff58d11e4ce18c072971a7f40eeaaf43a1b3c1359633ae30586501c70f33e834f216d7840afea9f0d37d052f30b4be6f373105e8f063da1989bf62ede892e87f3ed028a5b331a1ba0ae7f834a2e2de188ed01d49705fedf840695e74fe8f1551bc91a3d496e5b16a1d7661ac43497061f15800000168000000b01b42ecaeb1306e59105db6124802b48395c9199ca5f8d2c71e896dd0ea723501841a6bd6d9f65436c9e3395e7c6f247296d638540e38c624e14f3bef11f37c68bf6a20f07570188f499a51a20f94017265c0e5fef5e3ac4d5299f9c752ff01d71824669283c9b3e02214d1047b3658a81fbd5eb08f95d0a9d078c79d5947502878b798209bac4a787abe9b976c52bfe0088e6adc0c330709a573372e58f72b1dc07ef9482b7eb8fe1a208ba28113226d000000b0150a21b51f59ee54a524d5689bdce2dff209f27ccc87bc9b069fdc15dfff9e76ab5ace83eb999321c74dbe7189c3506a1d6d63869a315f0e2e75138518f4800a983f9a22071d52e56b2c1f954f78eca55f1c0d45a5fea97c3cb886af5f0553c879a3d9da7e9fc295b3500fb06116c8b12af802d84d7178decef1507268ed734e5c442553c90ab3cfd3c47423e758bf78296397bce95900368a2a62fc50fad0e94438a54788b4b3057e7e01c13dc4002100000168000000b01b321a3d3637cbedc355d0a1d0d567f4da0069bbd47ecde84a1de2e091ec460e7c354fd00f2c28246d797de56e9d9a7e75b6d6d591cc55aebb4a176e7abb7484f2614564e0f2ba90e1eb1db629b6255a666634bd4a906522ed274f7512d99e626ce63f3d3744eb5d495edbd0329a9dfd24f265c34650389a2f6db734de14cfc711afcbc22c8a8cbf9ca1cacaf0151d9215376ce7c70d95ba00c77fa3ba56d7da0bf4358e3dca1a383134ea110430151e000000b029d30f1a2747fd1b061457668d08a8265469297b970ce0dbfbab71e7f55274a7e75479a3f7cd4f923b12cc8f7ccdd3c3dfd0e41458d61db508df64eaffa1dae58cd2df33fd64fcce954ca91696491f75363d7be034abc8c32146dfb8d7d189c89e0d78b86d1034999103b33b87d9b149003b8451db9f9035d531facf8fba219b1249d01ceca523b7c8bada258e4180402572c7e0b0b952eca6506e4c8939cbc1f41ea7880d74fd0b5a387ad6fedd5115", - "txsEffectsHash": "0xba6c2a6d813750dc256f667c3ba6c1c791bc56020496c7b490d00cccd40fdb69", + "archive": "0x2b2efee3df02590ec97d0e2ff47c7fdaafbe9ba8e703de44bb71a64867cffb97", + "body": "0x0000001012e5643e26da426570dd999e0e044e5f83d60f3cd813c55059bc0ea0f4a7c9d413b2d2cea949fa0876265cd8eee3a4dce1e243783562ea07e2de537f469f7bf627abb3d4560e786bafd52f77ac52dea36c50419f32386567bd969b0c38e1bd7405d339cecb99fa74bfd631917f965357f0341d8c4dfe6a8f4b621d8df54c82941d560ac24523012499eeca2594f20ce238b7d21b98ad5c638767d70ee05532c2183e6d64e69b005709dfc4771c7ca5981adc54f3e8bd1b00222461ae90e44eda2f1d4572fe0b0b23100a7ea6d4780b25e826e41ca9e71897e010bcb218887b3d036d44eb30a430b5cfc6660270eb5fb7f274689ac73dfa53ba9d0739fe38637f01f7130af8c5888d4c65ea68109a1d58fe8d7d1ae62098857b0a3a3dcd393ef80ed8bcba6eb5e3b4887a32c51c5853b97a5eb59c87c520f36423c6d7be06071821ca1719330de5e3c51a521778b49cbbc1d53f8ed42e0562bf21ed72e8cb9a410b0e82ef5f7276df41353faef675fb408aeb246b6e2f704cab99bf28d1427e7b0fec7b9929c6effdcd045d3fdcec1d1b73faed495444699fab936630d69b519f0bf4f1453db36439419dbfba703b849d1aa5774fe9a5325e5bf3e7cdda9d1f7f2a9c2a035c72fd4a3e383306aff03448f9accc08a2c665837560cec8675fe2512bfaef35a8fb7df08a81001a7fd4903849c0371dedd87f31295f46269c5205dd00000004380000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000024100000000000000000000000000000000000000000000000000000000000002420000000000000000000000000000000000000000000000000000000000000243000000000000000000000000000000000000000000000000000000000000024400000000000000000000000000000000000000000000000000000000000002450000000000000000000000000000000000000000000000000000000000000246000000000000000000000000000000000000000000000000000000000000024700000000000000000000000000000000000000000000000000000000000002480000000000000000000000000000000000000000000000000000000000000249000000000000000000000000000000000000000000000000000000000000024a000000000000000000000000000000000000000000000000000000000000024b000000000000000000000000000000000000000000000000000000000000024c000000000000000000000000000000000000000000000000000000000000024d000000000000000000000000000000000000000000000000000000000000024e000000000000000000000000000000000000000000000000000000000000024f0000000000000000000000000000000000000000000000000000000000000250000000000000000000000000000000000000000000000000000000000000025100000000000000000000000000000000000000000000000000000000000002520000000000000000000000000000000000000000000000000000000000000253000000000000000000000000000000000000000000000000000000000000025400000000000000000000000000000000000000000000000000000000000002550000000000000000000000000000000000000000000000000000000000000256000000000000000000000000000000000000000000000000000000000000025700000000000000000000000000000000000000000000000000000000000002580000000000000000000000000000000000000000000000000000000000000259000000000000000000000000000000000000000000000000000000000000025a000000000000000000000000000000000000000000000000000000000000025b000000000000000000000000000000000000000000000000000000000000025c000000000000000000000000000000000000000000000000000000000000025d000000000000000000000000000000000000000000000000000000000000025e000000000000000000000000000000000000000000000000000000000000025f0000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000026100000000000000000000000000000000000000000000000000000000000002620000000000000000000000000000000000000000000000000000000000000263000000000000000000000000000000000000000000000000000000000000026400000000000000000000000000000000000000000000000000000000000002650000000000000000000000000000000000000000000000000000000000000266000000000000000000000000000000000000000000000000000000000000026700000000000000000000000000000000000000000000000000000000000002680000000000000000000000000000000000000000000000000000000000000269000000000000000000000000000000000000000000000000000000000000026a000000000000000000000000000000000000000000000000000000000000026b000000000000000000000000000000000000000000000000000000000000026c000000000000000000000000000000000000000000000000000000000000026d000000000000000000000000000000000000000000000000000000000000026e000000000000000000000000000000000000000000000000000000000000026f00000000000000000000000000000000000000000000000000000000000002700000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000027200000000000000000000000000000000000000000000000000000000000002730000000000000000000000000000000000000000000000000000000000000274000000000000000000000000000000000000000000000000000000000000027500000000000000000000000000000000000000000000000000000000000002760000000000000000000000000000000000000000000000000000000000000277370000000000000000000000000000000000000000000000000000000000000340000000000000000000000000000000000000000000000000000000000000034100000000000000000000000000000000000000000000000000000000000003420000000000000000000000000000000000000000000000000000000000000343000000000000000000000000000000000000000000000000000000000000034400000000000000000000000000000000000000000000000000000000000003450000000000000000000000000000000000000000000000000000000000000346000000000000000000000000000000000000000000000000000000000000034700000000000000000000000000000000000000000000000000000000000003480000000000000000000000000000000000000000000000000000000000000349000000000000000000000000000000000000000000000000000000000000034a000000000000000000000000000000000000000000000000000000000000034b000000000000000000000000000000000000000000000000000000000000034c000000000000000000000000000000000000000000000000000000000000034d000000000000000000000000000000000000000000000000000000000000034e000000000000000000000000000000000000000000000000000000000000034f0000000000000000000000000000000000000000000000000000000000000350000000000000000000000000000000000000000000000000000000000000035100000000000000000000000000000000000000000000000000000000000003520000000000000000000000000000000000000000000000000000000000000353000000000000000000000000000000000000000000000000000000000000035400000000000000000000000000000000000000000000000000000000000003550000000000000000000000000000000000000000000000000000000000000356000000000000000000000000000000000000000000000000000000000000035700000000000000000000000000000000000000000000000000000000000003580000000000000000000000000000000000000000000000000000000000000359000000000000000000000000000000000000000000000000000000000000035a000000000000000000000000000000000000000000000000000000000000035b000000000000000000000000000000000000000000000000000000000000035c000000000000000000000000000000000000000000000000000000000000035d000000000000000000000000000000000000000000000000000000000000035e000000000000000000000000000000000000000000000000000000000000035f0000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000000000036100000000000000000000000000000000000000000000000000000000000003620000000000000000000000000000000000000000000000000000000000000363000000000000000000000000000000000000000000000000000000000000036400000000000000000000000000000000000000000000000000000000000003650000000000000000000000000000000000000000000000000000000000000366000000000000000000000000000000000000000000000000000000000000036700000000000000000000000000000000000000000000000000000000000003680000000000000000000000000000000000000000000000000000000000000369000000000000000000000000000000000000000000000000000000000000036a000000000000000000000000000000000000000000000000000000000000036b000000000000000000000000000000000000000000000000000000000000036c000000000000000000000000000000000000000000000000000000000000036d000000000000000000000000000000000000000000000000000000000000036e000000000000000000000000000000000000000000000000000000000000036f00000000000000000000000000000000000000000000000000000000000003700000000000000000000000000000000000000000000000000000000000000371000000000000000000000000000000000000000000000000000000000000037200000000000000000000000000000000000000000000000000000000000003730000000000000000000000000000000000000000000000000000000000000374000000000000000000000000000000000000000000000000000000000000037500000000000000000000000000000000000000000000000000000000000003760200000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000441100000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000064a0000000000000000000000000000000000000000000000000000000000000641000000000000000000000000000000000000000000000000000000000000064b0000000000000000000000000000000000000000000000000000000000000642000000000000000000000000000000000000000000000000000000000000064c0000000000000000000000000000000000000000000000000000000000000643000000000000000000000000000000000000000000000000000000000000064d0000000000000000000000000000000000000000000000000000000000000644000000000000000000000000000000000000000000000000000000000000064e0000000000000000000000000000000000000000000000000000000000000645000000000000000000000000000000000000000000000000000000000000064f00000000000000000000000000000000000000000000000000000000000006460000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000000000000000000064700000000000000000000000000000000000000000000000000000000000006510000000000000000000000000000000000000000000000000000000000000648000000000000000000000000000000000000000000000000000000000000065200000000000000000000000000000000000000000000000000000000000006490000000000000000000000000000000000000000000000000000000000000653000000000000000000000000000000000000000000000000000000000000064a0000000000000000000000000000000000000000000000000000000000000654000000000000000000000000000000000000000000000000000000000000064b0000000000000000000000000000000000000000000000000000000000000655000000000000000000000000000000000000000000000000000000000000064c0000000000000000000000000000000000000000000000000000000000000656000000000000000000000000000000000000000000000000000000000000064d0000000000000000000000000000000000000000000000000000000000000657000000000000000000000000000000000000000000000000000000000000064e0000000000000000000000000000000000000000000000000000000000000658000000000000000000000000000000000000000000000000000000000000064f0000000000000000000000000000000000000000000000000000000000000659000011000000021c000000b00f4564015c4126045b0940eefe17a35078bed7b6bb1465747e7499bdcd0076da4e13d3c62831838ec6f069036fffc8a05353f00c015453f6ccbb4d6dd701bdfacb382e327af092374ee59d44ccdef62de25539d93150a58a87a04c35174370dfa5f0bc0eb10364e61cb74b184f76c76224be5d1068a6882965025c73f7908aafcd5e84ff3141228ed0cb6324b6f2204b2613fa06d85fe749dc7834998a1b2cacafc5e14ed6fd26ea67afd009e3a03d09000000b01404a46cff8742e3655eb883785f82bbe9d36b45fbc92cf8170ca1963742082d4cccb417084bc8e9a7edde4319ea75e9f2e00013d7fe9ca267de4b39f2a5d682eb81b95568b66dcb229fdb16e778610ba2f9ecd9ac0a6d29be073c889cb69e5c849533b9f30de94948733dc97ee8096e17f480d5a1583ba401adbd412665fd962e7c993a3abae658f11a7414b4e0aea628bc3cccad16f4659889a7214a83a525fb42d515df3ff1949c60ff7a7daf051b000000b0109df5a5cc2ffcb152024dd1e51599011abe7c6f276f32e7195a235dbe4d158eed4073743a03f815aff0602df153b47ab956055d6111d906cdff067fed3d82f979bcb07a9d5f76219c20eebdd067b62f48232eda686b778b4c6ea89f999991480c70d256038f8dc0733627d3858da873066b8a332f5222fdef4ba36a15016bcf85e75631c81cb5584cf7bb2d37e11b0d2f33a16aa59f16b6ee0cd626e406ad3a96363035fb88b6028daa01f5613d60910000021c000000b024f5047759342c0743b1f786b05d93aa30147f51709d304e8e3e517f08604b096fdd11a05d4f178a98e2e986cb6d56272d20a32aee250cbe8b27c701795952e86ae9528806ef52b0692ad29170a075115b9d7e442bd8d0bfd66b9d47203e941710af0cf37739c825d65ba454c65a81cb199faf8221bdc5c622190213f1e8da460f8ead18c489b0f3fd1e07f816a88de104ebfcaf4fdd4efda302d5d64ff5bb87265df8dcf0479acd19a62cdad79d5a9a000000b02657fb4b58990513b2857c9d397999e1c8e54f2fc58f9fb2e27daf1cf857bef2eba2d65d2da53c2713322c4d1f968760e690f775cc14f96bf5b9c9680cb6fbf93a5c48434605ac11f6ed8ff6f7d5a1e2dddcd223812dc6c9efdd12aa57357af8f2f8ffa779b9ccf632007b734bf21a0d1184428f84476eea3c7e488605b0100ec0d56454783d528ecbd156b9e0c93ad71663deba05827979bfeb26066196d22bfc568198e117ab04dceda45164d03222000000b02b2edb80b1caafc3f7513926d5221ab1ec44349c8d7622b4ac9569a4610a13dfdbbe2b445f3440e85fc5600f47c3dea403dbfeddea85627a55e4f1ad4cf379a3bffb6a3829470a036d354bd1432cfe1a67aa45dd89eb92b43d0b0078bee3b3c0e4fa29f92b313ca0c6e2a4ac1938e38e0a21e00f80bbb8d0a21f20b873dfa3314d703d4da9be08a719450b9efd3e3ecb0f7d0f7886f37c902ec4159b43e1cfb66cd084759e9704516d98523c495af7df0000021c000000b005b98d9ad3d65af257214f2e36acf4745a58500a87425e07774994c9aac436691eca7a7c8cebee1e550309af3df8cbbf7629a6c0fec5655ed318ad14a186119c2fde0692ea4f28f76dd43654c1c05ab10d99ea9ef1fbcf770152fc598e0e4ed543083b600c2570bccaf63977e2cb7ca31b972b6ffbafcc78e72d279615744eaaf1d51a1fedf56811b37cc0366ecfc4fd054254c0f4487aedbc090388bc70c10d0e8e2d59c3b180f398a97020a6c4956e000000b00484d61be068511cbbe2e8c318e0ccf633b24a34233df99b839383993ad8f4001a15a9261a4eb5028de8c6611c0e87f628bc0f23480e3b33209d66ed95874fc31d29a436b745eeb83d92de8e5b416756feba46320deac038f6f4a86c19f6af24f29f6cba9cb2866cc032f9e97e0b5eeb1ff760177e6709b67b8d962eee4f37c245c1471ecaf0ebdd126d35e11014277901e497a877aa128343bf6e418ce8f212ddde95a02ca17061f9d8c5fdf11b476f000000b024d1e28bd4f8b1e213b9e02a4567b57eb56943b46ef2b4654539d1f28f2876a4694f67cb001f972d38ff57b0d20105daa457be8a3b8c3c772179133cc52bd486d47f05394c1fef5a846fed47db5161ce0c3eb4bcc4764a13705e25ace7cb66be3e038d9faa6dbd38a077dd5c741289812e2c080150c941af74e79cb86270eb106050fad650c3af45a6a4c3a9192ab53618f5d23c217e239c10e126e00c0dddfa08928d5997293260d1e71b1b8abb99e30000021c000000b01d2b38648d5d360d5eaa5d02fff0de4631d77b8dd30e011a89dd31292099fdf16b73b48a033cfd4eab3034377d5d58c45562c97ddbe5d635159eb48d184c29598234e4746baa318948bdc56deb17a36bd5a092c131059e7dafcf250874997e63acf5302e14eef9f1dc6142cfb194424f2d4467677e74dd97d4698bbc8e880687266c1335aaa59090ad45594bfae5884323df4636093df981cbbf34a40fa06c8b6598a942d827402b96e3985e2349cfb8000000b0241fe5e2232cd87de77ed4c69b234b7547eb8dcc6789f90796f963eb093f6b2435421340e4aa4befa9d8d48c0363e429497fa857f55ed5f8e66f2f27e37a91a4f4b905270bdb18b049a7d039e75a486d2151c256df7eb91ce0cd89e41f156f26967e91e047723968c0fe012c4984291124fca5221700683c5bb6344b7d6c51eced18af48beac334a070ed82f996d196e29e41dbd2c1ce8d41328cd508112b8fac76df9a68929996612c492dd82bd4639000000b02a39ecf0f2fa16b55488a2d08b1dce12f13e94bc3bda380550407d72a37f1495448cfc26a9299b556f4c48abfda06d082146e5ecd7c0219bc605d7d48c1e34685d24c0337dec19c262b2c85dd5786f0cfcf2bef9a4a65f59fd9d3fc0dc7b8312c3cf0ff903caa9192b26d5963dc5760b26935547f3f7ed75b27682b6bdfc25e8bcb8d3640b85e9c765be9d99e73a7ebd2d4c45cecc1861c6b8115c6ea486e215262761d6a7b68f3068eeda31b3005d360000021c000000b0179a4272687445902584705396a4d52219f530d181aea6d92715c6971fd306d9a1512a7de13ff405be8e5997087111523a4c5cad8d399c6f441cbce7af449059562b745c4161de80db57b4868584998eb97f295443db228f5f79340e4ef8d94f80734be6418bf7bed1ed1712e8d04b2006079c68af8a05eee0936e7b6c317f152c29b10720215d4ed38d20847c5fa95118163d1562593238ff4f16bcdb9c22ef9197737c4a203a5129b6ca0cd7458c05000000b004ae3c969210dfd0e45568d444e3d22ed6df89fa95ce83187542cdd4832523915d0b9977a841d45d551c222c7ab0ad7cc8a36f21447836aa3549ac07a4c52c2d2b2e400804eac6010f8910a89a4e0543c146f093b2c4cd4906eadcde63ce576844e2471bfa9c2adbdabde41f885a5e7803e2fb6eb45b10b1fad8768eb999fbd30780a2961faf8be3226a0a361320687e04ba340cefa24d8f6ba5a0a434a42df5c0131776f0f076914312e5ec6824bbfd000000b0291ebc18806d63b68bfde691ceac7fb67931245115458c5f8535f6ccb699e60d731b236dc7a8f9451339496ab1f830c47591243a3acd27de8c4ddc37e4757e49feb0e417270497b948611eca7b4448986df6618f4be2dd3e83922c91d556932ddc5aac98839c8154bc264ae8711b8ef805322ec6933e87266210609b74c9f2667e19f0d8f8d0d9513986cbad2cc7c627154dc96e274962caaa783c95e557adaff9e773302197b515d16fa4f204b7bfe40000021c000000b0255bf97eb90624daf54cf422796103bd28250d3745872c0fd336d33eeac9afa7446f4ce4788a1ea021c1b220e95407a8cd57f55b69ef91990f26b4a8643128471fb44f83f31a074c7a3ace400766c39189f6b60ae7370f0e31e5ae99afaae4accd5152fa18dba375d030ddbb960cfd6728f3eaac44ce8a877cb0f6d44e56c951dac58f78bc3c714dbc324db0972bda4118e571963cb5529f233ad6a257377996b71e07bf6d08557fd40015953383806d000000b018aea6b55477b58bb2dd0acb61549873b9a5b46a436685b9881acf717e7fabe84a4875c106aa12490948651852b9981dcaa67b45982ff30987e6440c2454964e28e2b262adf4d19c02dd4ff286ab15ec790513d8364fcf125ccbd1da2c956984274e7529606f4ee1d1be89f06dc1c3a719f370dc275df61c98734026c588b168eedb73fa46058e675ad455bfb967d9220708ad76988739ba21c87755710195dbd0fd042e089905c3647d15286d920229000000b026b95d404ae61896b46a503e203f54d381f482a413e727ce90e2da7d8e79f6776b212d81a8fb712eaef81301ec34291e18fdb765eacc571190e9d4576d6d2fe1505a1c323997de01c399418ffa52127a77bbaf751a074654438d51c57e4555632229ef6461c713b033126f8cfef0d58a2b06d060b6ff52dbe3585536e31c9c1596df6bf2933f300a45263edf02d4e0cb1fc6c5362e4b05ab097d130d8aac1982932576ba7dc70fce0a32defddc0ea65b0000021c000000b02859032ef5856a8b30826a4caf6a6ca7347ab2839daa861dff4523ac2cbc21a0b4af1804a26269b4f468eddb4cb1a92899c33d55e44db3c93bdc7db2aa5b8f478ed829fda397f10f4b06c4d2a318a91d951918e6139e3ba57915e65602c854d70c60a297a4ff855365424fe73be6abdd29eb7caf24ae97eaf371811c2c1fa8feb4de278ace1152a7b8dc876b385efbd60ffad8d81e995808a53d5c81cc21c1addcf74205d9b4bbcbf73423d23c0cc1f8000000b0303abdc8fbaf14cae63a94e035c22a71ab9d4cca63aa42525e782079d723318c676277821236a5b8f51b21faa55bac60fdaa23adcfc2ed43d419f44ca41a6e1ae8949cce3673743a81b9bbea7327c67891c20a55ebd296a75e3df54d94fc1c01470eb43c35dfd2ac89dfe05920b8585c179218a32ceee4066bd6ee5e9a6698981fe26fb327a95c9bb66b96dec92fe3e82f27deea1dd1a998704a9d85acb96a5a8c50c235578ed9f424b256b0e1651438000000b00a3a150306181bad1033cab86c5cfba0f1279ada102fb4aa36c69baf71e2618a10ba83f79d3694dee88bdf8d6155662073494d9b39c1d5640b8f8114320bc62a73415d144e4d38de5217bf36b255f669316b1bee841a9bb22e8c716ff0f6cfe894bfd767921b76a9a679aad2927aba9d183f0dabb8d9418c8e8c1aac556646a7662a5204a0e65df29472136198db45822c172edea5fb7d30ac1863db13e3ef74203993cf2a99c4982e5c86f289aaad1d0000021c000000b00d2cee3c052fb81ab24a8602bbe161fa6f6d3a6795475f9877da08648d9a3efaf2a2f94df9bfadc4e89709812c31440cf963f128eeb2d5667ad6ae9aba7c30a1db3837385ae2d93db77ea8bcaa3d9bdf8b7f739d2f3cb6210e4f350188c7c9f6dd80652f2ba6f6d8e87d9bbe28741115009483bae4e4aaf5a1906f873db321dda82a68ca9df1333cfe469284853662351991f1627409da989f2a06b8c5b1401d6e3bbc97cb866680fd207302c5bf68a6000000b0120961ce1c7495b8c8666f5788fa3387d1e8ab9f14f2a8e8a0cf8b74e3c55ed77391fd6572b7b506f794da770ddb359a7786d301709516462372a5e2f1efe1a920687d65f63b4ae1c0307a1a3063b4af49198955e0c487bfdd730d09d37481ffed33462dfdaf30e09fa2585f20096f19032ba5d86bdaad23a7b486fd77a316982937339c9c3c32a403bd82e3cd524b8a2a04ed06db90ed23f5b0a02a6c8cf0681b80eacef4bf29b6667d4bad2e434561000000b017f392ff59eabcf862ac75bc4710aa0aa976c5fddbfef1d201001412ae1215fd959cbe87eded88708a4cd6fb5e500e3658c5d39816dcb227108a0b17f7bffb154a77e9a04e6ca09f4642263f286b35ff0fd4111730621775ebf464e4147d1f5f04d903e487c21cc796fd6279762b8eb11b46198093e319f0c29e8660de39fbe10c26fcda370648a8b861f6026daeb29401e85c8dd61a9dfa6eff5866c407e87d87f6a5d326553ac6e7e81deee2cbd1b600000fa400000168000000b02e25ba0e54bf5f22ea491b7e445c626f0861f6806c770f1120c8c753a09fcc20bf018f615c9d796e615282f6d58b51b196968c57ea28ed6b71383328426631c709761491cc1e8e8a6101563267ee3ca5e2b631daeee59c76e050d404a59658c443633250fc488fcb8749c6f93486f2342d81c65ec68d2a75e636bc697da7cb517a293afe165e2aa02a4fcd468d4a51662a579dde37b1a68f17a8fdb78c407833d98b6fc98237821a5bb9f0d34ac62ee4000000b02aad27fff7ed333d420226a84c5fed1a4b9a8acabb17c3687838d489e6e441c1f19d1c82ec5885d02a714978db22963406c070f94040218d087431ddb21ab04a89110f282bf7239bbfef516a8c17a1e368d782b5d47d24a2694d0f2046c8d89d62eae471229260320028fce162c4bba52d43cdd2236c51117cb7dfb66722ce55bb6f4b9b0fbc03de89cc8b2a6594851213a81f6b1e75818c69849226f0442f7eb81e667620163b8b2791db21b7e2098000000168000000b02d4ac80bf2bd5c115e85eb094e0c2626b7e299bd292bd36c77c0cb9dbe7c357e18426627560e932a79ee0a70ae54615a945dbe45376134acd33a24757add9101dcf4219e9f43b6247c3ca808e268ee899296851a5c80bfccc95f29c1dc08aefdb18ddf8308d0a3d0067fa9d97e058149188f53fcb6a9c66e6d4aaecc9448b0e5845eb639152187144ce176e0311f4c2d1ea399b2269ab683d669a1154d865d32a8bee152693178d05563a54112d3d97e000000b02fe3f97ac1ca3f4768da50f585abf8e90f1d6537f9e5ebb46b9ad126d49a4ee00df9cd34a000fa7f33f6f17ef97536d7c003bb31334f90febd0ae422c1c751036dd84db50930644ea1b4aac42fc3b172af4909dab4ce0238b3b5dcd2482634888c3023772cb696415ff8304c01fab74a29ad30ae2391217899a4c74c1fa3d173a436abe2141252186acdabcc4b5360731e6b46823c8e8b8919f6f1f7cfd3fb6a6b30ea1c04a9741e270ae1087231b05b00000168000000b02e99a804c1b6d1b3a56964cf0da0584200e5488f5ad59ec7b39269e96b03b735acfc952c811603dfd80c6794ac5e0be614acf98c7040604a801d5f3b507a45319b7b0c241a2fbd5062e3a2476ab3595b9f5a877e81af62ef416683387693c0088cd01a40098e6eaca60ec79e7838e18006083e689c62b3029df3ee9e8fbfe11cc373d2ce0daeba5972a2b2aae5f380e30e87169be1b35b1c673b5254d78bfadfba21311c55bc1a5c414c9c52c568f10a000000b0273f8a13c15a175517bccfe7fc8ce3ddd0990ef6ed817bd456d42f986b020a0566605a71cbf462a25877ed96c092a391fe16cf200b546bf3d80761c3ec3798606c3b07f805a14cf04f88b18b174136252e4ecb65f540554434b677878e3e1a3a98e5536708f7da7204de0ba813dbca931ca5f26bb21698b804c190d716c0cc3a7e713a777a816a917ddaa743b99d4fc50509a557b81a5f69e2b02cc349d262e50135c9b3dbc064f0d8f6b1bcd745fc0000000168000000b019ca2b2a244c36a6bcb191ac523ce18d1ccc505602798dec0699dbefb571e3ff6b96db01b240b4fa5cde14be691edb923cb19584733c75a763f126595af3d3138e78a16a341110372709c21eee23198f14c45c277e66524c3e5d401f02e432c960cd681cbed8f51a67a770999cecfb8d22760518b2018dee1a406772ff447ea44e8940994ccedfc4dbfb09eb55e4d38c0b5a091efefc0f53189dacfa0b4d6e9ea8655c0d0e71d737fbdd1d86c9eee08a000000b025c343e87854e6eaf143090bc67509dd1b730c79cff20b63f7d3cf856d7a458c4ce51a3138bae5c931162c0e6448995e99a4380d6d7e7ca7a9cb011532afb3e7cd63dafdd6cbc581f87d3943539a3636c0d859c0ad6841a26b91a5123c4a850c54c53d01551f9eb9ed4b3f52f5147c1f1f632e83a875faa90ae905bb356893fdd8943bbaa8a0c717aec9132aed85e3ed2c5388238132ba55c2225bb5782dd3810948a3d4d09b614f2c6252fe0cda631000000168000000b009df9aa893fd978db179b39a53fbacdc37f16c4971df0b2c3bce8fb21c168d49a08e0d09fae2575470469fc2ec892b7e82f47631ac6b3fda7c9933d57a902859cf476ab75984c3ebc28e7b3f9ed81bebaad13eb21f128fc5a98394e4abebf1b022c5a68b5067eb909b3dbd52e51a1c9022568ac5b2612ea38c66b7a98d119dde4a0d18f5188e6ca30dbb30758260f23f229a315330da696cd65388354b902e630be0b9a0527a614679aead6d79ed73fa000000b00ea438d75931ebdc092c055703f089496bdb04f7d68ac48c8ad6001ec742b1f240b0584707fd7cdee76108ae6118bebf9476de0e68632f3dde2df4668aed36074bd7d2d65f904d6115616b97a1eb46ae8aa3785b05b3c87f516480b1e99c10001ba2605b7f2de6fec1c3c96abe93498e035b01149408a104a154d36bba5d745d529a31ac66e4de11319cbeba2ef5fbc51e3f18ab824986dd6cec6e3d66a25df6faa64c5cfcc16e9f4dc17b4de8840d7d00000168000000b025edb7036e514870fbf90e9d74f724e793355aac704ea032323d295a3dde7290516c154f085174fda15f75432e2c0e52059108177e6bd75bb82ec62bbb44868aac9187934392a5b482a986053ddfbb06305a5dd2069f4d3043b9cbc6c75c50f8494cbc5e84abaadf7df139d29303c20e2317a75af1935f253099503b7e23b483383126b273d67df760ed1b3b4aebd22c00ff6083b8c879be588a3520c36692dcebfac5e1015b00aa0de8ea6683ec4016000000b01da7e3e47a4418afd8416889249db7bacc8501a108aa7c38fb8f5ad2e29ae86f24496185e9d0d5045e504e97497da1cd08448709496e70af690de685d0d0a75225b20a7ca4f3b219184be43dc31df8c4e27dcd2643bf0c52f67ebd03eff7cb29601d0982fa7cdcd9bbac0b3911b652a7275c36525ba975ef25572e0766604ebfdcd0a2c21c482cd11584697ad959d4ae13743120b5f8900885e22a2cac37c456fe2c93d0e51574e37ea4aaffa7900da900000168000000b02244317b3fcfa4d0a9f03d035f581c4dd984e1a37f7a2113b1be7a078c1be8373bb495af41f5d7c76380a7b64edcb8ac52bde75c91766016a26fc41974555286acf7bbf3fd60aa65a69606785f52fff5f4ea903e5a4ef6d6ffce6dd66b4bbe39ceec106059ec071a53401c94f7a0a38522decfea45536bb31ed4485c791e18892dafd883112bc82cd0a1c70c78c828f22110d8af7e0d60036bc5d81467b14732537c8bff3a9ebca3a45ca0308bf44581000000b01729ff2161cef6caeb12f59afb169bc75e78969607def973a26b22ad9e53c13cb74f66a9b306b1efacdf21c7f3222c4a68d96fa7bb75ae02a8dcfa8a934e483e6028b1f2a5dd38737d6aef4dfc9bd5d80f8777546bd90162fbf17be04bb846058ac8450ee72367cab020af7b68dc188f166df042c9e35002aed8c5d746474baa2e531bd552135c8ad6851dfd532654a520adfd75d611abf86628f670fcf43575c41817674313a1c109a75b999e6d935a00000168000000b01524226540709a1d63206210659f2aea096deb676a09e7eb53c64e7e2daf34afd3c3600d029931c2bdfe3d4d04cc6ef8fde703db54dc6b5f8719a818028ab61a41b02e500944fcd9bffa35a5fae5c6ff36549681101dd9dc895d93dcc668cbe3500e96c696368487ecc5a3537e72de1f288deeeb5fda4667dac447105a564846e31007e7a3dd4cb7dc0842c65a34c9681f83d0895990c6d8844cb4ace314521b85bfa835c8a4b4d96eb5e146e0610399000000b0019465e5c2572a6691cdce3d5580056014212ba0bff5cd3c77f9fba7623237d6cd93363b0efa44e176adcba5d76bdf68466e2319c4418f1679ea804b6e179160b944f767a45126bc71d87c7669e10b4094fba7cee2fe34228680591da627a80a5809781cc5623e6b77f8a9b119253dcf2b9bd723dec99f94376e68ab65d04aa33d4b6d8f96f0cc74168388c24b30bb4a0fdec8aa702f49548d2227006143aa1a80f608efbd24550512fd2dd78deb610400000168000000b006334e44b07d07e3954b7824d9b8ab531b43b7e91cf6513a5a3d48565db2f78c3e3892b5d3b372e91cdcf8141dd191b2fe3b831df042347a0c17c83ad97a07a3980340cf9d0e20f8d5ed22273fc36aa68711d74ea2890199f8accdfc14e1f45f8ffa02ada14cf3d7f88aa7cdb2864a96164577d9c44c14703f46d31d65507def7ea7c380d31f784c1531aebbbdf26e3c239e3f398b7fb112d8dabbf4ff59be9339ad47910f415d6a4cbed5e1fc6eb5c7000000b0175a9434ee489315d4de2e4fd920660d2f1432101c4e52ff457c35a314c773b2fee8176c998ed644731e2d5619302f152db69af1ad50dc8eb5de722601cffc942955cf3b5d5b6373435b5f4473d628b049d097ffd358b291893705e57c8bfce40fa177ae2fb6f562d74d18a316aef90c117850026037ef691dce755acd9f84f543fe86892652af4de57e1fb2f18e96801489aa9beb5d8b2dfb3c1aba1d09469cdc04882f3b1c4f59db5904186f1112aa00000168000000b02f6664a4a1877f836a7bdb77bf704b622e056640d54b4eb95b04bcc27c2e343437e2e1347053b7b4054ea826da8b08104f88b6e39ee73951e1d6b4581610561f16600948645068d632c9a1ea6f719bc38e2ee317af92df48406c64e8ea8bc903a180fb79ef4e3c1bd86f210c5f7905f00af405653f662a9073fcd2dbd566e4ef28247d05e2cffbc2ba9dd7fec17890a606c69e41036221ba273576c9c964bd66f1c1d38029b1249b8d08b423a0d9f647000000b026716c91c7d5524b31fc682b86dfe12e70e21f330a4e195f4f8c9ad0e5211ece45f29ccb29af3da517e03a2299b09b649e6563245ef25423f759730e11b954247f6d486543efee496aab29c86157cdcf98263dc19c44e276db1d21a21a86c03ee466583ce78d43d843a66481355783ed1b59850fed1b1e4377da89727e78fd899e0c5b762a2e1dfd5c3ddf02bec0e6d31e9785a82592488f5a776814281991186ced0019b0ce81919c7fead80087b17a00000168000000b00c3808297aa96d3cdacb7efe8f5dc2265a6d06d78e715b8f4b9d1373de019b9858e6870860ba7e7eb6a6e3c11819297b6c0bc980e379112700c7ca976496ce63446ffec3c6dada32f29343b026244e1f7cd52b342b98b740f0c1665d841b0be78e8b5779d53cdfa782c62b0da4b0c0b01c56721ff5f60a4634616321e879683087ae9ec88c8869d6f6f13c29303ae3ab023b5af850d07161096830e6492b20c0e78878b0339c48048f13f3c34c0e1028000000b02b2c071cdb533678d459975d135a06b8a1cafb6547cac2eb49c1efa3df4fdc3e12d4491d265ab3a39851207a8cacd79dd472e879098a4376f9351b4f1d43ff3a6d9aa468dbdffd69208e6c886a0dc374429fcb96d2d40e029f939ad91776c025a04a440a1546729b3c6a3ba85aa3a31919b36b41c5711482f25c29066de21066048ec0820082d0cfe2a5e35341e10685284cde53bc0f400e586074e2cbee1e00d4ddaf2122a8a9c0e8cd7ee22802e685380000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000028100000000000000000000000000000000000000000000000000000000000002820000000000000000000000000000000000000000000000000000000000000283000000000000000000000000000000000000000000000000000000000000028400000000000000000000000000000000000000000000000000000000000002850000000000000000000000000000000000000000000000000000000000000286000000000000000000000000000000000000000000000000000000000000028700000000000000000000000000000000000000000000000000000000000002880000000000000000000000000000000000000000000000000000000000000289000000000000000000000000000000000000000000000000000000000000028a000000000000000000000000000000000000000000000000000000000000028b000000000000000000000000000000000000000000000000000000000000028c000000000000000000000000000000000000000000000000000000000000028d000000000000000000000000000000000000000000000000000000000000028e000000000000000000000000000000000000000000000000000000000000028f0000000000000000000000000000000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000029100000000000000000000000000000000000000000000000000000000000002920000000000000000000000000000000000000000000000000000000000000293000000000000000000000000000000000000000000000000000000000000029400000000000000000000000000000000000000000000000000000000000002950000000000000000000000000000000000000000000000000000000000000296000000000000000000000000000000000000000000000000000000000000029700000000000000000000000000000000000000000000000000000000000002980000000000000000000000000000000000000000000000000000000000000299000000000000000000000000000000000000000000000000000000000000029a000000000000000000000000000000000000000000000000000000000000029b000000000000000000000000000000000000000000000000000000000000029c000000000000000000000000000000000000000000000000000000000000029d000000000000000000000000000000000000000000000000000000000000029e000000000000000000000000000000000000000000000000000000000000029f00000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002a100000000000000000000000000000000000000000000000000000000000002a200000000000000000000000000000000000000000000000000000000000002a300000000000000000000000000000000000000000000000000000000000002a400000000000000000000000000000000000000000000000000000000000002a500000000000000000000000000000000000000000000000000000000000002a600000000000000000000000000000000000000000000000000000000000002a700000000000000000000000000000000000000000000000000000000000002a800000000000000000000000000000000000000000000000000000000000002a900000000000000000000000000000000000000000000000000000000000002aa00000000000000000000000000000000000000000000000000000000000002ab00000000000000000000000000000000000000000000000000000000000002ac00000000000000000000000000000000000000000000000000000000000002ad00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002af00000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000002b100000000000000000000000000000000000000000000000000000000000002b200000000000000000000000000000000000000000000000000000000000002b300000000000000000000000000000000000000000000000000000000000002b400000000000000000000000000000000000000000000000000000000000002b500000000000000000000000000000000000000000000000000000000000002b600000000000000000000000000000000000000000000000000000000000002b7370000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000038100000000000000000000000000000000000000000000000000000000000003820000000000000000000000000000000000000000000000000000000000000383000000000000000000000000000000000000000000000000000000000000038400000000000000000000000000000000000000000000000000000000000003850000000000000000000000000000000000000000000000000000000000000386000000000000000000000000000000000000000000000000000000000000038700000000000000000000000000000000000000000000000000000000000003880000000000000000000000000000000000000000000000000000000000000389000000000000000000000000000000000000000000000000000000000000038a000000000000000000000000000000000000000000000000000000000000038b000000000000000000000000000000000000000000000000000000000000038c000000000000000000000000000000000000000000000000000000000000038d000000000000000000000000000000000000000000000000000000000000038e000000000000000000000000000000000000000000000000000000000000038f0000000000000000000000000000000000000000000000000000000000000390000000000000000000000000000000000000000000000000000000000000039100000000000000000000000000000000000000000000000000000000000003920000000000000000000000000000000000000000000000000000000000000393000000000000000000000000000000000000000000000000000000000000039400000000000000000000000000000000000000000000000000000000000003950000000000000000000000000000000000000000000000000000000000000396000000000000000000000000000000000000000000000000000000000000039700000000000000000000000000000000000000000000000000000000000003980000000000000000000000000000000000000000000000000000000000000399000000000000000000000000000000000000000000000000000000000000039a000000000000000000000000000000000000000000000000000000000000039b000000000000000000000000000000000000000000000000000000000000039c000000000000000000000000000000000000000000000000000000000000039d000000000000000000000000000000000000000000000000000000000000039e000000000000000000000000000000000000000000000000000000000000039f00000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000003a100000000000000000000000000000000000000000000000000000000000003a200000000000000000000000000000000000000000000000000000000000003a300000000000000000000000000000000000000000000000000000000000003a400000000000000000000000000000000000000000000000000000000000003a500000000000000000000000000000000000000000000000000000000000003a600000000000000000000000000000000000000000000000000000000000003a700000000000000000000000000000000000000000000000000000000000003a800000000000000000000000000000000000000000000000000000000000003a900000000000000000000000000000000000000000000000000000000000003aa00000000000000000000000000000000000000000000000000000000000003ab00000000000000000000000000000000000000000000000000000000000003ac00000000000000000000000000000000000000000000000000000000000003ad00000000000000000000000000000000000000000000000000000000000003ae00000000000000000000000000000000000000000000000000000000000003af00000000000000000000000000000000000000000000000000000000000003b000000000000000000000000000000000000000000000000000000000000003b100000000000000000000000000000000000000000000000000000000000003b200000000000000000000000000000000000000000000000000000000000003b300000000000000000000000000000000000000000000000000000000000003b400000000000000000000000000000000000000000000000000000000000003b500000000000000000000000000000000000000000000000000000000000003b60200000000000000000000000000000000000000000000000000000000000004800000000000000000000000000000000000000000000000000000000000000481100000000000000000000000000000000000000000000000000000000000000680000000000000000000000000000000000000000000000000000000000000068a0000000000000000000000000000000000000000000000000000000000000681000000000000000000000000000000000000000000000000000000000000068b0000000000000000000000000000000000000000000000000000000000000682000000000000000000000000000000000000000000000000000000000000068c0000000000000000000000000000000000000000000000000000000000000683000000000000000000000000000000000000000000000000000000000000068d0000000000000000000000000000000000000000000000000000000000000684000000000000000000000000000000000000000000000000000000000000068e0000000000000000000000000000000000000000000000000000000000000685000000000000000000000000000000000000000000000000000000000000068f00000000000000000000000000000000000000000000000000000000000006860000000000000000000000000000000000000000000000000000000000000690000000000000000000000000000000000000000000000000000000000000068700000000000000000000000000000000000000000000000000000000000006910000000000000000000000000000000000000000000000000000000000000688000000000000000000000000000000000000000000000000000000000000069200000000000000000000000000000000000000000000000000000000000006890000000000000000000000000000000000000000000000000000000000000693000000000000000000000000000000000000000000000000000000000000068a0000000000000000000000000000000000000000000000000000000000000694000000000000000000000000000000000000000000000000000000000000068b0000000000000000000000000000000000000000000000000000000000000695000000000000000000000000000000000000000000000000000000000000068c0000000000000000000000000000000000000000000000000000000000000696000000000000000000000000000000000000000000000000000000000000068d0000000000000000000000000000000000000000000000000000000000000697000000000000000000000000000000000000000000000000000000000000068e0000000000000000000000000000000000000000000000000000000000000698000000000000000000000000000000000000000000000000000000000000068f0000000000000000000000000000000000000000000000000000000000000699000011000000021c000000b0147c62faf20a05190c9e0fcef810f478a98e73d1af0fbb1019a063aa9706e8cfa04eafbfe0c4e9cfb169a336fd5ae92fb3b46e13448f24d139ec13e5c07b4477b910b84f4dcb48c3bbef22eb5d4955695df137522431b5a8f5148e0e9e1ac230bf611e1a1cd6e8f849ef8b91bbd950ae2c9ec11155bc09c85f4942cb90c1fcc9e901d739ec6db766b40379fb75bdca6d21a537bc35ee0d8c5af859c785a37800925332e98de0df6417a5456e483a1d2e000000b01f05172956fd910fe097b9f6b6918754f1be721bfaaaea2fd2a9cc55610e5cbd9ec455ca84bb2212fb831b55c834de3ddad73095b9bdaa0c9b9bf60e48769adb153c6625c8ef9095d9f1949da53f00426200dddfd31d234e2394fb46b5c2212c992080b46d600e15b9df6d773bf91fac0ba69a6790c47617c9e9d46e7a6c5937e81ce5f54ede6377e5c9e104b1b4163d021969d830cc47c463666ead35f80acc40809f68cf7f21415b88b422a5c60370000000b010f43ce2f9b618f841f44adfd782750a723df95c5ba9d56a25487b79f8557684b228a0448914aa4a0e607e2ffba0d3217f9a4bed4a18c9a59fa9cba606690b70ba7c6b1ce45f942f4d1ce08bc613a83bd2d4f8ae024c4d0bed2cc1da23121d68529585c7671de9a2e4f88436b99b69db03cf29528617c7999cea561b3e03e7a182d0093c1160252e78043a8ee78d5c500463ed750046dcc4ceb41c6980a282887f29545810d32954dd0ad470f6609af40000021c000000b02e3cff407e49b6b82f4bda45eebb5ef8dcae5d7befbd749fa2d0f0812a7f4b4f14eef37091738fc0115ce55589326d71ebf622ce61a82e9ce80a145905cae9d213610dc7c6bae58a77ec6708227d95430ef0875b57d4baf0c54414e717e5cbf77fb2a4e3fee9b7fa9bbe6b177c502fda2958e2f92d9a0f2668bc3f07924db30df52cf166fbe222c2aadaa5d92b6da0ff195aea90d4fcb24b883c837bbc1a0024f1462d2222a13b2a7c257ce9fd64d79d000000b00bc4c52a51e4d38babbf90ee0cf234773158579eb471f4d72f2fa863d6b684e3ece450ade15d6aa323a0277fc8b6d00a900bede23c26d3be742158d8bcba21e820fd80b0e4d75d4cf20b663efaa0b94bb8fde137c00a8a015ee5539481dc320a584d8bb1696104b4ee92ee911906668221f53679e7b883e8cba4d64664bb35c310cde4f8cbbeadc72f3a2ef87270ee6f0b9b8e06bd48128ce497a3e7fed18583f8a56ca732e3b92f7a83b6a591e2e74f000000b02e029f5ac75041c3b5db0ec867b16665abbda3414a0f2fb1b5cc6b1ae67e4567ac6051f00c7552948fdbc2020fb4793dab5cae781aab93602375bac15a7cde69c3cfaf45f004eb7f2fa10f58f8dbd11bb0b976a50953aa971a667ec89f7e602679b0ac1f5674807860ea04a6e1ceebff191242a611239564ac6ea7d446590c4c4722b6d887dda38b06e8d8bb62d03d3f0ef87d528b3f2f552feb18a80e82f15b42a7f1b18b9c57a3e4e229886af7e6e00000021c000000b01608dee241df503afb2ae835f97c28472ec9ea6aed494fd463b513bd5af880b0bc87b7e70e7dfdb1890642d08f373cde69949860ff024c95fb3bba8f4b8ec59fd960f3e11d99a92976f24e2d71ba6baf1d1fa352f924e6bbbf856f8ab6979a14519189aa95c82047492d77bfdbe7ad2a268258119f91f934b4f95000aadbe60b3aef0c9644555f80f645aecbf824c47614c64d9df6dfce421ec65f3d7a339f70e21442b0c5dd7d8b1a4ec994383640c6000000b00fbba55407aad0bf1a16a8332294ae9d92fbd627f83b5d5d58b2f2d9fd281791c5feb4a7f7fa216df28bc4d598fa079e9a01a1068ba16770e23f897438237ae36f173dc1beca8afa863b9950ed9b52d6a6362c948d61e9b52bce891e3caabed35aa0aa88618f2a1bf05a09ce6c4e05740cb4388a797fabab3def2fe267e2809604a1d3f985ba7770d7addec588a9f7ab15680e31c97d2f98c7a6c3b072f40edc79f535bf445f2673bc2c779d89a57d12000000b022e67c1facd38e81f1b69a2192ef19b8e1de2aceb412b878a9443818d6ef1e24f85485d6821244703cb9ff913a76c7f6a624c974cebd4108cb7d43547eeeaa050736f8fefd2df7ede830ec2d47c607765b802d4fbbb9a5b324d259f2dbd909fe6ba47993e949370b6cb98ff098d38c9d0ec4661290fd68f79002debf33787c4ef4ad37f2b2029d700eac13207f6ed7fe29dfa2558f416c351e2574dd33a02cd985d865c66acce3a6a796a3c05481ead90000021c000000b0052cf71bd3fe69120e2c1e5041b4b11659c12fc12fe65d5c804fe3aba36a0afcbc1ff0a234e5b9aef5d5336456707c77feac0b1c92d717873d68e5294700003cbee97ba10462365098a39653482f4ec9f5c3f9c098599c73c2b87daec73b3558ed8d529e82cbf4ae1855d0f77e1fa30f1f28e54460289e8abcd953f8445d31552b37685290e3d88b72b54084d087fd3e2101c36e4c7edad9ed93379bf43fa70024e76bd4ff4f5e05db5d86ac83f9383e000000b029b8143344395426a1a41208707e5b3f1855eb4aca47c469b4fe4f9fed97078124d9a1ef750bea7b430f715cb409db9eaa8f501ef14e6fc79b39750a36cb5e745a104f23d393891db2d020ec4cf833037bd683b2deb1bd4bb9361c3d25bf752e56ed2419b1b56da372120e1b05fb64d41734b51c3188aace74612b83b689eee11a912d3a5f2cf862f38651cf52f00bf81962a22bfe9d7ea1128d11c91a0a04b8020797c242d11aa08f5bd5da94c6cb3f000000b01598eaa9016862d4ee62a2cd7f90c4410b5e64cab8bdbd16d90d01341577610828dd6fdfa9230f2391f3c5336fb20cb1e8fdd27b4af416d70b5f8eae5b824af241b306a5c8b5e2eae711abc235336e16264fcd2281e71997dc9b416d7c452595dcd99965b5ef4e82ee251ca3f33e018b1f901800e7bd4f00f64334e576ed7c02a68aa68e54148977eefaebbb953ca9fa1a5d84c56732b8b323e66188b9a2fe439f07292c2083fe0c016a5156fcf5b28f0000021c000000b01cc7c67ad4d6f6330f021e82254dbadd0a2ab438bfb3efccc78daef8fdeb80a014db916c8ee9179e4616540a873381274dbda745beb7fde9307a2a4d57d0dfaf6183a0dbf6a8d77c687ff762675a245309cf48577cd0c434e4f0075869c927b0a787fe704c8464943c24a355719b9d871341a8a311656361418171b63dfa5446707e33f41abea14deb15cc4c4a9ea7b303ddbb1095310c956ff171b50f0445d328ed6408e4282e58bc39b17b8fd02120000000b00ed39bc01c872f7d1f27fa128d891739bbcb42baeb804d64cbe1a26560ff25b7a73093365fcc73e1135b6b380f5d68f21840eb6a0a3aa3c09a715f5cbc13d912cffb8c313423942b376fc06d397c302eca4367e91678c1a222133b193e6863ac151976ee2a6fa66714b80a477c4356be19563ad8beaf546ca5225548580428c8f1417f12a7fe0c586c9235090785eb3c0350b165a07632b9143eb75ef31b51ba714427b163e56326a1e0fda86ea837fe000000b02a586546b52a837c6fa6cd97c5975fd31b8bbd61c060852086b5419e7b3fd9d65a32d270b079a7066120f979f3952add4f3919ac548e047aa4fa9c22fc430f080a5a3eef189d9175dceb09557d26882454589ce7d30afcca0cb81b4cdeabc31856c280c4bc626c7ec97989aeb9f2f29b0dba58e066931a32f7e39f378b7e1d1c65157335caaf24102b4dcb50faf38d3d28c438851106cf9c424880396ac2ea80331688acbc2f36e970ebfbe85e3a5b670000021c000000b001164b463479daa493c28d6ba62adb70f074fa0d9c842e6af6a4caf3b1a26cfadfa699e6abd2842e19ec65518d1f27790321c965c1b25cacc2fc87a483c931f9cc483519a5463eac5f2f4ce6d75bee4f86790528cffcd16ddf0135bbcf2ac6a068c1ccccebcfb9fe2f2261d117e63d2f05dd27ef1bfaf3a0e259323d13b660eb7823776e3b2d6006920f4619e12ad995077df2a4f955ae550d49a9d8f341531e72ef5dc825d9a15c5dbc7f326266793e000000b02e3367f70b8668e42c267812ed2a0b03afe49fef64b6a673c3e56eed488c1468dc99ae0b08bcaf77ecb75c9e33245fa8c512e9420b3682fce6f22a58d51506d8c0ea5807ef9de52c27f98fd4d6449bfe3d2cb6b405e9277601458150e0638876cd4381fdb3dc4d7e68cfc3bbd40a27f11630af9ce99a5f5b0f5d99482849c9caacf0bac2beeb7469c40f973f4255140c028b8e3766511dd6389d7daf4f336ed6c46bcdbfe1d2df264d861c38eee168f4000000b0196b520958be09fa01e663617a79325d2a0953bce4cc53b369573ef21b879f53323b45f2077458e0f3b38fa749b183a2a206bbba18c306a077f82498c403f746558520355e7cbaaeefbdedb441a43df05892db176a843247e230d11e281a70d0914ad889e2c3c8973084f714ba9bca220e450c49b42c2d4b0a85bb55e6a867a498b9c8c2b4a29a5975fab68feaed26aa17259a3907e9b3c56305ae720dad0d40b58bbc482e237d8f839bcc7d3fccbfbf0000021c000000b02d462766fd2618f41a63871bf09de2208cf1318fd2d793c1e76b862530720bba628026bb86aaf5006b2858df882a29b3268e195a164bec783c977cbf0929ef0bd1a0a1ebafd1660e89296e5415ad0446fc6dd058d381cea33d64a445b6586c72d34e938a00073f97578b2eff8d1f948c290aa52c49d328fa1ff124a3d73b97395f34f916913efb65a92d5dd0a952037626deef90d9e34b0194041630ca35c273e6bd7a72772b0c23ce8a6dc9f21f4057000000b0178049c40830d8faf672910c66d83b0dec0390ec14db454dd76aaf4291b3f24fe659edaa20b31fb8ad15c329e3c22e85ef27ad150da7520e3b5e18f2bf3ffa303955a7abfc39413409c6917facac100330e1061b8e4d16e0763f088e2c377e07ce24232b52efec1c489e5c7299d06bc11a2c465b405b20532f031d2b7a5a0351a9942d0d49dedfbf6ee5b9bcbeedbd7b1f6a0b71f977ce29bd17415f43fb8d1e2e5214ef82abcfc4d4b2a7bf33c2c478000000b02afcceed13ae33c142cea80f6b52353259ce2c309426fa452399776058bdbf4a681d49985f090eed0ba0321585520936ad2d4400f74f70827edee8a8524ea62508c6d4319a6bebdeffce530133dea50c7f53008d4e5fcaea7c7cc2a5f35c5d7ff52a51cea028b67c2cd180e1dbde22f61f644dfdb1bd8b4ce3529003ba095fbab37301904b5f16340031649e1d02c23d0380ee559f57a1d8f2424451b2e1ea5015bc3003258bfc778a921f8a61535f710000021c000000b0174888b6ed2e5fb26b5a0d7638780ddb748d05e92f1871421e8320efabea23cfbb9d5d799522d7bbd5d1bd82b46da0f311f018df52365f0de7138e2a159d3070b1bff683430d06f8c6b2205e5d5a3cf376e8553658837f01c0ec9c94114d778e43cb388cadc78bf18ab32e72254cb653031947890656bfac221bc3701c09eb8fdebedf0ac309565744edf37962ff18581bba8c6ff221fe61947d446685a996ae0d17884a87bfd6d3eca768b38a3173a8000000b02b6c4b6a4b5e3677b4b2ca07653ab3820744b9c8cc118323b240d9368777e2530833fd31c8a1c2a2f93ea5a93d11dc42003636542d45ec46427ec02b844aa6558ad46d534c8a7264b3d0ecafcc80b9f88ce65d41f6b970dde34b8d5cf829cf38661b8feb9f866deff82d6f6dfaff973a1b3c8258007b7199c1cb429f94dfb3e97e1cd4733e6278982697c932f7871edd26697711c589510075e62d15b0e1044d7b7d4c54ba270aa476329e6674d6da1b000000b02d938ad06abb131b3d669d02c940d97cd06c72af37e87d53d432f90ca4add9b0c1a60a9150f01fb487a58cef5ba3b3916a2e9d515e1665e550bf3c34464afe624744e399b02a57cbf2aadfe623a68602caf37f49b8906013b0a57ac5a9c8d9d72de22537b80380d2f553bae9c82a386f2945e0e636d423f7e1cffe4347c91d8c0238e116225bb3e60e9a3352d2b014bd2090254e41579d7aaaf92c3041267e3f92959a2f029c8454afd66a1521180c5b00000fa400000168000000b0179d3adee291aeda72b57c82d081f5bb001ba8be2e6e44ca54cc7a707a3e9a0a606a6f3a706e88019bf0151f7d47513040685b92e12e7e53dc95c2e7bd3e359896352af11f6aa0bf9661cbe59da07839473e9430a913c8daf54a565b5bc58b017af041e942bc7cc07eabe7abcb92fc160cb430cba0d8fb8bd44e58e66bc5b6c8c0921183a927f53b87f49b23b275ba021d1adc8541df9927bdf694b4257e917683b9df09c9f5ebadfe9df2db9b15e958000000b02bf2d88e9526bdbb2ad1eee7155f7b4c02ad86f7f67de9d8a878a3b8fd9e67ff7db4f2d75a140651c2d33f23f2e77d248c45fb2e8f5914ea486442040527377cca6f9d244ba23050299a7b510ccfdb21b4f2317175b81fb09af6f68a7a5a0bced6592b3ddd321a884caaac1117c7861e2c6b00509f8a91e789eb3dcabbcaab26782cee029cf4f32bd8cbb7e27dbd0eff0727d70f8ea2a5ec41b5055a0475dabc3b531fab630b165367b6a3342a9fd40f00000168000000b01dd962013a1869e7c54130602930c5821878b48c0a5c68be70b898ade73850f554edbeebd809a247ab7a8edb1d7cea7c72d4a8c920cb1cb7205b3c788af815eaceb2daaaab03e9abe643835890344fc5d1ec1b3d6a5f5bad99dbce3e6a7d49379043aca1e6bc4a86c5c49d8a0c274d5a1733e0a65a9ce71c58e5d7046a55dc92f706823c802b6fe2d441b0a0d4e573a5246a32365839bf1d458de790b3d24ac7a7ba9799a588f3ac29337fb251d26680000000b0148495292e69a4fd9245a7593c9adb20804f5724573136ef02059cbb44bfb048dbf25eae0221b5e2d3e20e273bc650bfa6deb970833d018a1925cb60446100ae058631b03d51938b763e193ca54924845806746701f8fc31b0f9ea530824c9d9cae0055f7a09097ac751ade752412ccd25aa4049005c178ba8fe7ae73df94129eb28b82e6e9ea6da2d1924e5277caac21d1dcb885b954a4a920fb18d9ab745cda59475afb9114f01c83c4f448812583200000168000000b002186ac65b3fc3204deb25a9d373f7e134bb3db5a9cf7f3a5ee5efaba479d980fa4ed99bbc8062129fb9cc10721521110fd2137f31ca6860fab7ee0779582d2eccf9d0e2dd84f978db49bd6aece1e1fb2e997e67ba87971aac873ca843286c4ef6388afe03f3078f78974d50fbbc681223bba7154f1053e3f6b7c0719b2334bac7d5d7f3b2c490c58887579538db72570f92b00d1f2a22adf37de3f7af5208a24f15a2d877c24af815456c7714c7d114000000b00e7f3289c063b6ded2650cf97b4eb0a0bae37b7c1bc85706beca4d074538336c79be0a9635502e19a628f3dffa9c3f301afdde789036af777f4374ffcf2590beef567577be8be06267024daf83fbcabc687b6ac4ba318b43f31468a6b3694117c7c8ae32624fbe09f220a699e569f1e804ae77fa892293ad3759ed99a43d435d25e9cf8231f54ee9848cb35cecf13e2800abe4f881f8d372d18923e3b5ff8bef7fb5991db1731488975f3d267bfcb8e400000168000000b00581c8a7e49bfe387d8a4c47978336ceb02f28c588020d073be44657af8c494e06f4fbf078d028b029a0506ba77293c0b7dfb1c23dede4fea84fca2b0a1ef30864b65baf716be47c505b1c078314b67ab30f19de63c7014abd02c937876d45fdb10c1a66083bffb2ddc159ee4a4e10f306a584c19c7715f223e22198cea067be2006e852f34595b64f513ad5d42bafec24f207797ffd1892ea22c5e779d228fec4a283107ee6574a94bfbc6c6ec011ec000000b02e22300c0fca392df7c4b79c29bec3480e481195858850e90ed002f972e4bb49f3dae2922402d7a6d7f7280ce620d5d97dbeb1f4506947ea8e223d87e48e839e7b4f1640da7a48d15ef7abe42b4ff8bd7273949da5409978fee83b5780be170d30b6131da6cea48b42f2c95459b4123717b7d11f03d0ec76209a6671da34ea32b5b084ebdd2ff85dc5e6fd41758b43371f8ee687ba688a0c622cf5e7b9268c822ab54125a36e34f1c82ee8d547a5d0e200000168000000b01e63a8e7c934a3039f4a35ad9e8e84458f9b491f85189a3ce7aa7eb4f2ab110821c112c3d902b9b4e19ea7111353bbe7b5c137e75b5032623569232ed1abfbf14caec554508b9ecb1c07a353f626acf42c24a5f8ed513e1ddde0d64847cceadbadf86e4ca8a0c0a7d3829de7f017e9e018d45896e5d3447309a51dabf947989ebf4a5d3417e090009ce7c19fb4aa7484267a2a5ed75618f080cfa1280fefdd1f8c02cbe3662550b5dad0e40cdf808e6d000000b01ca73bea4ffa404143fd4c82b907f38ce95ba53d575e156df8c71eb73f96a4869787b3219112c1ccc6fc2c7c3b5a38cab8cc16ab89440bf130e45fbe629c46114fbf3efa6e59fe0df8e19ff1b1ac019c8e7df482227baaaea2cfbc37adaba48df3f32c9f80a2d406418ddc6a784f1f891d141572467651320cbfc3d5de598d43981ef177153195eebd57111b2335b2790157b6145e3f31f116c85369e5c688266875ff6445e283590e8001d9a49fff9700000168000000b01e93ae3d009ffd0856a72506e17471c717d97bb96cf508e868ae2f4e877713334d058eb24357ac98100e39a0a38140f5945c039bdd44a1d58225d4c90695d666599c23d596c7e0ec1c983be7ed4a6c65e3b69238d47dab6b685f074c5e315d4e4402125fb7740ec4856812d1710b207e127d2f822ed2d409d75a11150e0a206635802dbcdc1a6b0cef09c8ab7cbdb20604629cdd163914985968345d3bf542fea7e71f8cb9f65326aee1b068b21b89b1000000b01ebe03a5f95192030033a5ead92aef867f40f29158cd0c45a6b7f49b0c7af151add413f079da71cb763c1836e2426ba557b724e11a6521f3ce7351716d3896d0310c99d109cfef33d71d01935be7828b5e412a1ec4d81dd5323e257606524a84d143a769f3f1e694dbb07eb4892eb21d03003251d8e120bf7da8c42f77fad9ca2fe3d57794c9f2a8f3d3ef636545ce540b1cafa57453f7cbca2fb6239713a6adad2d78d3d5c80c4f62f3116bac4b0a0800000168000000b00041d77de94635232d2e472ea74629ec477e6f67724fd2bd412f83d5617167e4f0617ab6ab17cbfb4bacc1c97981ebb1cd547edc7654a39e7706e518dcce704c313161154031fe14208041f011185ca07f953fe426f57fc14ffae01dcad5a925da5a9f9c770529769c28e767720c155221c89e946ba10acabd82e39bb636263104db5e06b50dfa1f79e1143451e19bb51a672fe455411f9992d84aec343538eca769158fd36063fbf3a173900ee3e8b4000000b026a0b5ab5bd66f3e0ee000e26db6da9fe4133015d136f4d7d644c02bf440085d05ec0615f9964ae6721c3f427b71e2c95d4f8870d5581acac34218ce5644599d71a1573c3daee4af16a0a01e49068e031c65966e47aeb635e62b97d7f6d7ab7531499cbf36a65727ba40097ed7c03b2f02545030e38bb017fccec9d741dba5aee8a33b825674f5115d4530c9a17a486b17cb5b6cab58542edb7566a351285d772064a9963ea0a90805bc6026f29c1cc700000168000000b020605052fefecc042c30bdf5c6f61ccc8bc52b7868583e9bf5be6a5b98bb792827d9dc4dae1cc5fff23b5e80f96b8599f4cbc6f744c50cd7f9264892199c1ebfd0da2dba6a1b83dc8521c4bf2ec56d2b62e609773dca9096ad6b0175ac02bbbacd7a9985e89fb5f0387ed9a3b3d6dd2124b47aa9c3118027890bff8a5f5af5b63b8e3f984a7718680fd971d7da20fcf01e87913d6e5841fdcc471a0df1a01572d7fcee0288f10689c7a94d1fc57a0074000000b024a433a1058206a11f6d667c05978ee412e0923907774ab82214ce1ea9ff55fbb2448150712263687b7126b48e05b5ab8fe00a5b2d2f7822d46621dc549b3482f56b0f9a21e3a3f83d4b9e32e04bb26f297ffc6051cfe0ceaafe9dd9b5eb178fe7c0430466dbe0b571a0270c8a685c9e2db2ba33af11ef276857e48d40bbd2dbb85eeaf0a5e716078cec82c5fa68b05b1057207150828babf98df986437c97fc1f7d6944428a59e46d7ce241c95017ee00000168000000b02e304d99afbbaaf86f152e8b8709b837575aee9bf2d26f8066b37d56121bfa7d2092478357b1526c7d0602a0fff7b3ffa3fb6f8caefec773ece7863960926bb6a4b7384ea3f04c5dae2676d95e7fea2ece48291d95b56d3cabba0d65c7a67255af6e0ba4d6ef2d53c45b3353912fe9c61b7a8c3fb5d7285004b915a9d520daba6313f1a5b33aaf2ba850742bb84dc0762f9570deffa1d8194ec0e2e55b3e816501e7e983b77910380de225a144aec7b7000000b01396f436ba4ff089bf3cd9c2ed3a5a7008b86e6eb08175c19e13aaa809448a547c742b18932dfb52aa7d9b61326cf999f4bfe072e8e3d105df18f378c64de85f14d85e23979786312d40844a444a51e0bbd718c974f8a73eaffb3b6f9d1b213ab7e6342fff2ded666f7885505aa12fa2132fbb6238c66043491778f0913c357ac6d20b71e5116527c790f1dd9c5419b9238c6697f453f5eab5dcb86ff4ba702e7f03c47ffb5fb40d2b0848bdc709e86000000168000000b02e08b5d9b92ba5bb5b41a3f5437fef7df65f5e2726d92712fea12d2400a009a976d172a539e1ec6c71122364a2c0fad277451360de8da0f859a6da1766ab381f9f02c0e604c4a7f7a060065973db7de2760fad2a2e5d8f543217adeadf1ba76bee576c292663586ed440aeaa1a623af01a88d505a81959f21c53b303cbdb106c4605add07071b1745a7900a5772980d112d1bc6ef6e07dfee0197b8bd16b5b81a9e24680013fc431d1dcd4ffcdf57a6b000000b02e4a5416ef8d4fd5f46329d250efc573630f42ef1fb2422b20b1ee17c989246e16b9074e59656cc25ee02095d2cb0116a0e3f968a75b4884be6e3ff631603edd93312a1b9ccd9351432b5d9fc5603eabaecf0ad19fdcec88d2a0e1c11023813e206a64a2c64d65b3b1675896c843050901173437be4bfe5a3b23c44f808485ad115d1c97e137cea45f082a3d0796d4c325f3927456ca9c1333a92f5b21046b2a294a435e9eca501d0f2532b600786c8200000168000000b02f7769b8ecbf31c936ad2ccade02b992df94d4cd4256125f0a97eca8ff06e2c3a0d8026a0a7f2cb50f7906183316e7bbde281e2312d68ddc161b5185a3555b2e98ce4f28d29123edcd29a52006b3f5bc7610f84509fa561e0ef4f3e8f64e3cfdacf9e4063da92a6d63e6977363ee500408edf09f79a2aecee3a5a004be46c36aa6c7f6a7e8fc5d0bc0517924745a7cb8104b96c03c01e22e59c64fa762f30e6240a3c07782233bbd0399fde29777afa3000000b001a1136c923965befca6faed336643e0c2f3502ea02150c9b4460b10c4b21f45ba019641dc975ae436c0a13c19cde14086e351cb5c02865b27abbb4f700c446e7481eee3e21ac5572ae5ef834aa90fce7572d6e55757530c7514707db973f24493455dec8efc85ec70218696ff74a4472db21c1f5fed090c7d5250dd0f96f134d2fe1ac2c151296c3685c5f5961f67fe0a8a07aa90d608aacc5576a525f75db8fba2a287ee727048c19c1c74f076007c3800000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000002c100000000000000000000000000000000000000000000000000000000000002c200000000000000000000000000000000000000000000000000000000000002c300000000000000000000000000000000000000000000000000000000000002c400000000000000000000000000000000000000000000000000000000000002c500000000000000000000000000000000000000000000000000000000000002c600000000000000000000000000000000000000000000000000000000000002c700000000000000000000000000000000000000000000000000000000000002c800000000000000000000000000000000000000000000000000000000000002c900000000000000000000000000000000000000000000000000000000000002ca00000000000000000000000000000000000000000000000000000000000002cb00000000000000000000000000000000000000000000000000000000000002cc00000000000000000000000000000000000000000000000000000000000002cd00000000000000000000000000000000000000000000000000000000000002ce00000000000000000000000000000000000000000000000000000000000002cf00000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000002d100000000000000000000000000000000000000000000000000000000000002d200000000000000000000000000000000000000000000000000000000000002d300000000000000000000000000000000000000000000000000000000000002d400000000000000000000000000000000000000000000000000000000000002d500000000000000000000000000000000000000000000000000000000000002d600000000000000000000000000000000000000000000000000000000000002d700000000000000000000000000000000000000000000000000000000000002d800000000000000000000000000000000000000000000000000000000000002d900000000000000000000000000000000000000000000000000000000000002da00000000000000000000000000000000000000000000000000000000000002db00000000000000000000000000000000000000000000000000000000000002dc00000000000000000000000000000000000000000000000000000000000002dd00000000000000000000000000000000000000000000000000000000000002de00000000000000000000000000000000000000000000000000000000000002df00000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000002e100000000000000000000000000000000000000000000000000000000000002e200000000000000000000000000000000000000000000000000000000000002e300000000000000000000000000000000000000000000000000000000000002e400000000000000000000000000000000000000000000000000000000000002e500000000000000000000000000000000000000000000000000000000000002e600000000000000000000000000000000000000000000000000000000000002e700000000000000000000000000000000000000000000000000000000000002e800000000000000000000000000000000000000000000000000000000000002e900000000000000000000000000000000000000000000000000000000000002ea00000000000000000000000000000000000000000000000000000000000002eb00000000000000000000000000000000000000000000000000000000000002ec00000000000000000000000000000000000000000000000000000000000002ed00000000000000000000000000000000000000000000000000000000000002ee00000000000000000000000000000000000000000000000000000000000002ef00000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000002f100000000000000000000000000000000000000000000000000000000000002f200000000000000000000000000000000000000000000000000000000000002f300000000000000000000000000000000000000000000000000000000000002f400000000000000000000000000000000000000000000000000000000000002f500000000000000000000000000000000000000000000000000000000000002f600000000000000000000000000000000000000000000000000000000000002f73700000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000003c100000000000000000000000000000000000000000000000000000000000003c200000000000000000000000000000000000000000000000000000000000003c300000000000000000000000000000000000000000000000000000000000003c400000000000000000000000000000000000000000000000000000000000003c500000000000000000000000000000000000000000000000000000000000003c600000000000000000000000000000000000000000000000000000000000003c700000000000000000000000000000000000000000000000000000000000003c800000000000000000000000000000000000000000000000000000000000003c900000000000000000000000000000000000000000000000000000000000003ca00000000000000000000000000000000000000000000000000000000000003cb00000000000000000000000000000000000000000000000000000000000003cc00000000000000000000000000000000000000000000000000000000000003cd00000000000000000000000000000000000000000000000000000000000003ce00000000000000000000000000000000000000000000000000000000000003cf00000000000000000000000000000000000000000000000000000000000003d000000000000000000000000000000000000000000000000000000000000003d100000000000000000000000000000000000000000000000000000000000003d200000000000000000000000000000000000000000000000000000000000003d300000000000000000000000000000000000000000000000000000000000003d400000000000000000000000000000000000000000000000000000000000003d500000000000000000000000000000000000000000000000000000000000003d600000000000000000000000000000000000000000000000000000000000003d700000000000000000000000000000000000000000000000000000000000003d800000000000000000000000000000000000000000000000000000000000003d900000000000000000000000000000000000000000000000000000000000003da00000000000000000000000000000000000000000000000000000000000003db00000000000000000000000000000000000000000000000000000000000003dc00000000000000000000000000000000000000000000000000000000000003dd00000000000000000000000000000000000000000000000000000000000003de00000000000000000000000000000000000000000000000000000000000003df00000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000003e100000000000000000000000000000000000000000000000000000000000003e200000000000000000000000000000000000000000000000000000000000003e300000000000000000000000000000000000000000000000000000000000003e400000000000000000000000000000000000000000000000000000000000003e500000000000000000000000000000000000000000000000000000000000003e600000000000000000000000000000000000000000000000000000000000003e700000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000003e900000000000000000000000000000000000000000000000000000000000003ea00000000000000000000000000000000000000000000000000000000000003eb00000000000000000000000000000000000000000000000000000000000003ec00000000000000000000000000000000000000000000000000000000000003ed00000000000000000000000000000000000000000000000000000000000003ee00000000000000000000000000000000000000000000000000000000000003ef00000000000000000000000000000000000000000000000000000000000003f000000000000000000000000000000000000000000000000000000000000003f100000000000000000000000000000000000000000000000000000000000003f200000000000000000000000000000000000000000000000000000000000003f300000000000000000000000000000000000000000000000000000000000003f400000000000000000000000000000000000000000000000000000000000003f500000000000000000000000000000000000000000000000000000000000003f60200000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000004c11000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000006ca00000000000000000000000000000000000000000000000000000000000006c100000000000000000000000000000000000000000000000000000000000006cb00000000000000000000000000000000000000000000000000000000000006c200000000000000000000000000000000000000000000000000000000000006cc00000000000000000000000000000000000000000000000000000000000006c300000000000000000000000000000000000000000000000000000000000006cd00000000000000000000000000000000000000000000000000000000000006c400000000000000000000000000000000000000000000000000000000000006ce00000000000000000000000000000000000000000000000000000000000006c500000000000000000000000000000000000000000000000000000000000006cf00000000000000000000000000000000000000000000000000000000000006c600000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000006c700000000000000000000000000000000000000000000000000000000000006d100000000000000000000000000000000000000000000000000000000000006c800000000000000000000000000000000000000000000000000000000000006d200000000000000000000000000000000000000000000000000000000000006c900000000000000000000000000000000000000000000000000000000000006d300000000000000000000000000000000000000000000000000000000000006ca00000000000000000000000000000000000000000000000000000000000006d400000000000000000000000000000000000000000000000000000000000006cb00000000000000000000000000000000000000000000000000000000000006d500000000000000000000000000000000000000000000000000000000000006cc00000000000000000000000000000000000000000000000000000000000006d600000000000000000000000000000000000000000000000000000000000006cd00000000000000000000000000000000000000000000000000000000000006d700000000000000000000000000000000000000000000000000000000000006ce00000000000000000000000000000000000000000000000000000000000006d800000000000000000000000000000000000000000000000000000000000006cf00000000000000000000000000000000000000000000000000000000000006d9000011000000021c000000b0297e0b305512920de9397b9390478ec7afec3230e2f9a3d3b06af3e2cfd1b2b530a88a70b8a4dfaca7713a8743435c931a303dc90bee2139ad27cbd4911f5e1506231bed74dda194b883b91f9823e95b8615ff887f7d030265406dd7fbd9337c00203d78b37a4f3645e3c9fe83abddf9099d61c78265a75604765c7de5cffe1de682ceb30cdb15fafa8388cbe3d321802300f544da9789aa4ed43617b8359d3c9cb7a9dd8fb9a4fde0f1fae70809f704000000b01f3eb517a543728eba4e2696db87f11bd479d31cd5a177e1a1716432ed6f977470341ad1b90e5623e3349d9b4d9daed244764d7fecedee5a04c584419f2a21f1176ed01837a0d66259b5fb7bace33a8cdb65cfa8e1caf76029ee5b4d064577b1f47ac1e694a5cab4ec0ae1e83079fc291a49a99d597dfdd66745ddd3f96a1ea3684856a11c34d394f17793189b01ce0e246188829b7af14c0775ae03b22c533ea209d2619342f5d934ef1f35f2b3ef30000000b01ca63ce4dece74d56da9ff0c963a990ef09b1b9bc8bf0c02fc40bba725b6f1558021783f318e6656a42cd9d1b8fe8a574018cb9bc932d1e66124ef9623a1a36aa5b3729456d4adf250b67143441761a576a1c9bed2600ba798edf8f0610fe94f46bba273d6abeba1d5c0489a74566f772905fdc7fb7c77fa302b108b2f9837afe42b1ab08e6fcb5693bea25bacb000761bcca34067ca2182a0c185ad78aa20e536f804722d5a5c9c1b2381b18bcaa9820000021c000000b0276c2f153bbe771b252b37d5f4bed85d47d9a8744476b64201a36c523a909c900a87c9e12ccf3f82a1a0f05317e22380ce980e4e17c0c3609caec5c6b47690fbb2ff82f18a38bc5ea31816fc08f5b2d797e3c99797e8a28dd68142d2b9da0a17d4292e50061760ff066b22e147cf709c182ae184973da4fd92d54f1609aa66ff6dfdf22d1c7223ebab7c2c1797877c0700520230ba0f23aa0422387c20d51a9e9a3a0d42aad1fdb676b6f586a4763ee1000000b00401d4d2ed743d2be2971041131c926f44d652a38848f747b9e047a26a01c68acda37adf5bd8db1ea91b9f14993e891212ed6c65b8ec17fc2511bd5332f9e99e008515881f4cfa093f6e6674ba7b1164b40cadfa017cb278487abcd3a4ed9692b8bc910cda307044cf562a594e0f204a06e586589dbf119d41c29f1d1bada13eab34cf84257fb8d607c5b17059242d12038c20fa35edff88fec71e75c616225cb942c5d12c1a4125b02001946150a455000000b01cabdc33886882884a91ea8c71862b9b396d10042d122cbe905ba1c7a9986f9b41eaf5bd63d8d22ce293183f21aa0b37e665553e76a921e17731e733825719e57b4246ab0ad7221708abce5d045eadb4845cdee8cd802ee89a050768d11a0027a5d6bbf5aa88299c8faa06f6e64818b42592df7d06e0c9819e3d4ee3a4875cb618e4e01a2d115b591a83110c329603551416c85c88e8744fd690e4ef98d22de79c22dc23932a2ab41de62473cd7e3a890000021c000000b003de80bcb3d6359fd40074fea0e1dd95831e031d60789be01dc264f223a6422b8cdeca2dfa2e5485f83d85f781e5078269091a40ee03d706d1556c8ed36e8824c869c7cbb35ad547b6cc0636863d3fab3b3c4d2f5416e033aa83152f329acae85aab4ba869d48e79b18335af9b5e54f62495b41c8fc3521a3fe17d87512062459d976758c3948819391e651ab87e8d9725a9cf922e6f710618d6b39d2f173bcf40f3817ca32ed4a24bbb8421b0697eab000000b00e3e63b3de11328b757d3aa49a1557242dea85f236bc7d6be5a50a60fc9c907bc928df7952bfb3c1a0b2b51f7cb6c4b896b77822635697ba70f1fe103813958a05cd86ca8e727b6bf5a80b388b37f16ebe8b7155821c5f39a810f79fc3a4704fdc41de49b61bc746dcc086c221a8d7680b19ad368d52b0809ee9a3a9dead3494b7b2135ba5de947a42b6b2a5d07ce0592cd72234074029d8832b74e593341dec59762b5ae3ed51d18ac47f4ccc61f9ee000000b0077803cac38000fc338507bfccdb025661a69d20a26788f50bab628826baeb0687a45431b334ab7f25d5a23d3129272a56762e4eefde7aaed6992ea0678254226ea4e002f07ec7529f25cb93f3fbb9ad32e43f0c07d38371ba2c610e37fdc08d468e1140d5d3cc032d3968e0f73df34c0ef8c73f3f9e290c729be4ccab70f649c4d93fa8c73e10edf7bec4d09f62dd4c184145f013ede3e392ce3fb74a6d2c45c1ee85dd258206fdc6eea69c37a0a6bd0000021c000000b028dda3c41c35d4120ed7797cc60df2e86310aab6d1a5f523adaef226dc79d717baa90727c64397c39968807e01393672986e89ec440f24c3c0c3a39f92fa33583eb9c5e6c168de8480db09dbc2cde4202ebe0f7dcc5aee14439fb32be754005d3f4e1c1c1ee1e77c75c81fb82c5b19840b0da172f09193a3c58c15a449b2e58f5064ca0bc2a53920ac9c3dc3bd3c04ec18f346f8e0dde1dc4dbb5dfa8e6b94b739c139411e5659481496164ddfadf05b000000b0233887a2252a62fc47865d03e643dbc014358d2c27e0cc9636d07abcaebb28070ebe173908176dd2f310f18d52e45964362ef1780f29c1b82edb4f674850ec6c57bc80dd1510f051478e9294c02a1ce1fdc2371fd410411e42f4f8f2155a3e29c499892663d02f72f67757e475bc84b927b07ccf354b60bbc59aecbf4fa8e3fee23af396d07484c2f14215be35c0e4110ed187e8d4d3e053ad71e10e6ead7c9063cdf69a8d579b7d58cd785b9f1b5a18000000b00256dd87dbf53a87ee21e14f3555a6c6de2eb0634063f04bbeed0d2201b3696bc210bf8dcfacf0fe0f116566828b3a1f36098f8c3b1f287ddb403a2680b4d8f6e89641980fd56778a183d511292bff54961696e61312aaa1eff417e7f139d1545ff4dd88e7f811ee389aeb7bc41158e80a77664d22392d20e230650830eafe8135a97cdb2403504bb93132115563f5992d9d865b95bef196883646035a38efc9a46bf1fdbcd72ce1ab28e53aace42a6d0000021c000000b02248674ff4cedf387f6f32be3e401750f0daeff8213b55a9196ce914280eed8ffa03b4bc1c24939aaf788403cc17994ea40690b6b51cddd4670f2c33b42734300b7b804f2b2bb91d8fd6cba53f0224b6bedd9e2133c6153b0303a7e3918e69f8cfd69ad10171673230e34d248d54beab20d433ce81d78233a2b0c761e7d63bffc9a3cee78ef95f591911e081b744426a062589235e4ed2968040ee01835cd12d58a6a2af946716fdfb608be021389834000000b02e3a65a02db851cb84f634fa45b46be6739dc98308f7142ae246ca44c7632ba8bd09bafff55502d6b6d0f26b74d6640edbe3a3c9f21b8b85260cfbef9e8b46d7c98ccf9ebc088e83f3c6793e00945b1c5df4387bdcc1180f62c4307abc8be5470e90c3380c46332ac57b8f5ceb1a6244163c858665386d8c51d3b473e4fb432028fb3e0e870a3a78d2eb5a2b32c3c8f002d1fe0246fab3ab36870145f98fbd4be04e5f91fd7f43fd68c7e382cbea8715000000b01064e323510b6ce3619ef12753f4c4281010071b41604daf8bbdc0a35c8bd613c52b45192f9d61b448c8c7760ac95884334773c4fb19ea9bda16c817adc9aa85945e2b6b1e89cc49a4d6e81318ef14c15a696f58d9e0f5af1400e6082406f4242e81f3f606361780818f7bc1f32879d52f511c46b96ab62faaa55ea4bd3bde6af6de6c66ef3520bc58e62c7b5d0d8fd6060a188bf6089c27290bfd9d0ba910ba3a2396e070255d09eeed49bec439e9090000021c000000b02353e4bf8f5586f6758becae8cd700b8ba8b5a2c6af40374181996243dfb2670b571e210fea0e8eca79330f9b683a93c1e44743333345faa1dfe6d1132f38edd07a0a8056387db9397549cca97b256ccff9b7a351aaf826af97f129036b7085a38dd37105d7fd6b0c9c6f9a51eef68ce276f6cf083a356897f45a6f71b28e6aa9bc24b27606b58b4402e03cc1d9893de010e1f5275e99dec63fcaebbab7a32f090fcbeeaba7cfd97c43c497ee96f121c000000b02e41e659591f170762b021dbb766a5ffa6915ceb24800daff68b2c209b9471e79acc134d4efe9628495442137a89f6678cbb4050ac202688fafdedf8d17a0ab3bd6a181d762fe3ae0eb5ef6b708792f28443dab8329738db9241e1efbe9497692a2a9787b3ce38a8db01e5221cad74ad0cb27bfc1ab4f332e496faf135f9fbd7102be755ab326bf83611441a346b7fe714cdb47bb19bbd99cb9369850dc11372d46e43f6c0df73ff898111c8e573e944000000b001b75d9f8ab8f000a8e8d2dafa17c48330a913110b24cc02b3b0318398b0ecebd05865ad2aa23e3a6e8874fe82e650802a484ed0d1d9ea2cc70cfb4297c7ab35744f8e4c2b83a24123b3e6e12d47fecc69e9b78c8272f93eccc82cd88856577089f1c3d4100362491726c53923ab16092c5e917dd5b7d8e0c71096baa87ec13851b494e5e4300e300170dd138392044815933c2aa6bba63ca5d41cd2969426243ef9cf67a3d60156380292a802f5cf1e0000021c000000b00d2d519bd16ddc3ba583c97e1c88be350225962a907d7016b79949b1c7adefc395466edcd02224b4d057a18d6c79a77b28e6deece19cf9b973ac6ab41f628aa468329b8f81c86d1595dcc7415895fd716c8d882646d454f704cb2e4dda40e3b38a9c0e68cf08622488524398e5a15440222e618d3ac054f834f7a93952a76f9e8c871bf7527064683aad39911543e890248c1024effbbca949260eae75b6730ad9b70e0f5176e4b44f24933bdefd096a000000b02cd378829872bdec57c2390d594870a5cbdf0f950ca8950bcac291164c1c8732d6645708ac959847c75212c3c55affbf7c3c8ce81f07f46804a4150ec430ef2392fc69f1ac1df36964d74a8ea52a55dfc9d271e556a2ec2baa96a190cba683bd173d36b5fb77cfe9580e5442f2e7314c239df5fdb15a9594db38cc63a0d0694fe3a40c9624c0193cd77551868b2071de2cf1bcd480a8f78f71f02acbf696e47b1e743d453f78673d669118486d1b4e01000000b00035e9217fabdba65d96bdccf3fcafe34951a1a25afa264c64d3ff82fc47f5da310b0c0e7650f41577cf689b1a6abbed20d64a4f57997cb8eb1302ce0e5d6534f8a67a36a0012be9fa8f85e7ca21ecdeee616f14531bcc434b05f4219865202c74b4710cf37b075a62fadc5528f720c2192fea383d6ba17e50bd0261ad86c369a03998cf0800f574581ffc43a9b594c6027ffd211e7b56d355e0734c2a7e16cad90391369bb49524e8710ecfd681551c0000021c000000b02e67f8bc017edc2e17f5cfc4cac60ff34e0ebfa16475d81eb0a94a01f47d9f16c935c9faa603651cff8e777be9b17d609bc7c0d5cc1d5b2f1c99f5d7983797758e829fece2ef0518545bfecd8f171dd4ef337b929d6553449c06f2b6b52f749f315f476239579ed38e51a290279d79a01e87744006807470aa331da0ea77537254f048a2d55fde1f1a525c085c9dcaee108e3ecabbc5a7a2d33714ec944ffeeeac36d44d106dfd8955b52db3230e2e44000000b02be794eaf74957a7a4adacb9707969bf9914116b39c1e27908c12ec57d0e70deec6b6743ea608c605afde6e6f00cec11b2c7f9bcb47a4b48876f7b00a2078573c003026d9f8457566d0be197304211c720b73350fb88aa99e8a576893083ccbef36b91ded47d2e7fcab62a88f9e0e7c51bb83ef10e385e381d48b2eca639a2d1fbd9637731fd8d787dd94b464469ce0f07fb5ebf2521e76cbb5b9de793dad9094b4be26cb1e6d52b6997da2ec2673327000000b01ff25d2f3361d8d0b689c7730656106221cc463cc5385ca268b2963b7fea0313302ee268fc7f1f6124442d58ee863d968d90bed2022a2a13e1f86e1598b4cdca6d3821994f82f7bb3c5e96a287dbfb2888293bb3a03ea096a6e4aef54bb3210ed6e5fb7bd42a0a1efa628f5703a2eff80bdd83fa724fcea02fa9da067ba8f1cedc6c3de0842ffd0fe07e4103659bd8742278b6005bc442b7e93363342203ba799664f34dd1668754f76099171af683fd00000fa400000168000000b01ca3dfc1ce3c3b3cd51d22f12c5a8d69fd8fdb3af770ef5fae36c03635a6bfb2c1da41bee10f9f60e4c9d801d22f2bb4f1ccece0111f5ef0b030d4ffb5574e63695e056cfd601a92f59edee46eefa49d8258220b04afc9f4ddccbfed8948b96a0e0577f7b035850a7b717712f8ef7ef20db9b0809bb38a25ec46d80dd536a70239218be2939c3befe01f454400131bb92bbe5fc6d12dcec8714bddab5a5f0e5d5ebaa65e4e7a8d46efff25314cefc598000000b0187b661c3b4c38a38c455eaedd18e20df77d3058e54a40b8a2d133810514000a2ffd79ba86290e9d60e4f55cedbac233c4abb9c6a8605fa8637958bede2e8c554a9212c80a6966a31e62ede09724699444899dd4cbcae7b4b57e9f38c18d93cbc19cddea3eabef7dc544d71ad7a0eec60cf8376d1310bfcebfdbdd94725fe94065b9c31ca7e85bf319f3a2f956e157ae21133127c66a12fc78295270f0e22c63c51483b668fd75c825c36637de5afff300000168000000b0263482a428f76c715b1d6de0a3d92492d7cdd878026391896280df5e9a7b927f24fec44b28fcd13804728aecae50048788f5499408329593c5dcda78c531f10c048653643860b67114772726125bdb73c2d6b35c49f2ff2ddb0a76f6a62d844e0d2329bfc2a31982c26f522231c2d03d2535995ac11ff115720e1e5798f48b9c9d2e8b60c1d610c67df81df78681c63725eb5d1e4df1f878d34c5d2cfc3fdb2dfb14c6c86eb3ffe1d282e2528e4d4cb7000000b01d1c0e252f4e5f7c2a6d3f75b7fc0a07c7763eaf2a2d97befa7451a72848b42c9633ec379d7fb99a6d5b9895d5965039fc15834bbcc4ec50aa98f80e6e26b57bf55b3dc98795ffa996a1b9d879af39014abc47cc0b0ccc918a0cd4a549db4c53e447d42a1a41a958622841ca61099bbb007a92c324661940dbc3567b1e5d3a121af59a486e1b58735f6207e57a4a5cd802c5ed6d68696fcad3193d0f52b7eec71934bcffe8f8b61e1fb55dd68d7b09fd00000168000000b005314296d12a845d7ea6f0a5a5fadf9463148dc355c0d1944a742b3cc54dbf776a18f37c8e0e0e5c81c601cc420c5f01d8d1d621c352dcdd914a2a49f23d60c6c96d6c4648eb75b7e561b61a1bd22096ff47d51adb9a28c33d4533f6b2fd4ebef7b9b7912ed017d01e2975d449f055071cb2bbf9f0e80e8e6eda2c129c3f74877f2b25a39a3d8307a94dea57ef10930f29f7fd3b16977a5f3baa414b113a1821f8f2eb44c9447bec04a75c02a798db59000000b00fc19242da1769fc57134ef0607187744ed5199653255ddd4c74e879f72def196837b97c019cd599cbd6660cf92b671b263accb45ffbdac4dc284f357f85f238c1784253a8b10d0bc280f3a309bc6d4575d744747b18768e4100338f181d77b1f1db842fbd384d799383abf032982b3d208962eea3a2b8006ce56926f158d436e2f5286230bd17ce67470b8b50f909d7216a29d281795ebc4c76f2b59c438a24bb6fd13b5746fba1d4750e701bd9299400000168000000b01f3f99e9f86a7c92807b30a09deae45b425fd73f3879e30561bd64ee94dfb5fdbe35de9dafba1bf58cf2361544f932eba44162d3529211ab6e586ae85dda280bffb76462284c40b3d8f2b2b6be6423fbaec55aae89581dfc6629c9b0d94b604aaf4d82c9b59ff3f62dbff3f05dd1d9972d5385bede69db7da6dc59800e5f358b1e38248234be232b34f1cc4945acdea11cecc28ff637eb3f4c9ef7b6ce6c64dcc86edd886b6208dd45a06b83f94c2221000000b00e15e40ef9f23a4283d2ab653cabd95fa2d5f6f127746c6ae94b7a01938ef07ad5a80a9843a69fa8960c6e5ab968a5cf24d9893567f377bf02a61b4b2c7e1e7a74b97497892de00a924b8c9de06da09eb14cff0689ec39e971a6650a420fca13acdc08aec97265b778e5b920271a8e20001d9ffc4bf95740619ad27434b3d09070ede826dd7077fb4aed156177336ce30236060ae3525f2150196c1e33b93f4c4e25404e35e688ee98aa3cf9f35b927b00000168000000b00cf21dbcba1c0f92b0b9ec9eb4e8367b59b720be887753a5dad467a033a10295b6c307b9657c781c7576e32fdcbb6dc99f2b351ada4c11f5bbe3ee40003dd5c71ab51f0632dff51c120ee774ebd439360cf34b1a121a958fbdc51bd3cfb22805320c40712d3f44eb71e56268ef4f99de23aea50f01e91cd427faade42a3bb2fb0dcdf7f2d4bd08169fc9a5cac6097f6613322b19b59a7b13a6cb370d8df81b219f430c0c34f741aafe7118426065dc75000000b00203f9dde4b9b3ff331892b6e67c02028d98e0f9ef75e042de68ce184b1a4d78b59c336b5c863299d9f839e4d549fb1f35f7c916206829ae27f8eed3d633e6da05c7baaeed04d2a50e03b0cfc3102b67fe3be956707984ef86c0c129d6c377dadc458cef17dbfd2837fe150e38a4343730543faec85e421d4f7f58660d131b91d49478762bdbefd843716ecf6057ba562f0a8ce8f42afcdfb4f73102d8ba6535f785896fcb28dafd8b60f8876270a6e800000168000000b02168273ec92713a3e47c9072e60083241d13257656a91ce4db207d24dcb66352b3b9180d6db373c0ba7c5cadb7ae3dce465e497fbddf0bf387c8d12017943cf82fbb80f69b43207081ecabe21b90dbeca4549e2552fc9dca52e320fd36f51eefecf268b8a64c3b57344f5e696beced4e1b9e5b487ca9bfe4a7bb3f2a9f2625bb1ebcec12fa1020c75d6ed4a457222a5b00a520b9b437d3262ac2ef71e7f5470132262aee54f9c5d396649993357cf217000000b00764e577b8f2b3e0d3c9100a5f5290aa3d7f6b042c1f3e1112fb7030a9a5956045ede2d38f263ce91ccf91b22647610a11e0d23f1a54836a6f32cfd0af4551f3a1896f7e0825b49d7d6732da21a2cfd3fe5492abaaaa0ce92f6894de4f548a127c03a2c155692557865e204e467cb5052bccb2e35bf0a751129811a75f6e5f2cadafee9c3ed90a37af31a33ca141a5d219cd34df2d72c51b6954893de6493b11f00b98d8845757b21479b9a76f2ee3b700000168000000b02fecdf0f5d21477f574c9314241f29b64460f668ba72acd46e7f77cc59ccf12ddadb6b6b9e374058246b9d2e1572c61c845d46b62cfcabc33369da591bc6401f941e3ffcabb4346ea5a028f1d142003b53c91e37e127a3919734497efdb23fe0924999eef94ddfcaab133d30767982051c792cea085a7db2b566d6fd52eb363574df79d8c76912a137a52fd1483afa0f287fe6e76f420c6e1fb4a1e01512c1e855bd27f21fef72fd3bbadb91298aed47000000b010988efd953245cf2710e8edb5f92a9036e9e457f2ffa525219355752db33a268d9d8efb6409674ade743ce521a21882e601cbb720ac9283128213efeb55246062456b11f58c61a045cfb139b122db5dfdf343ab4831ba69454d078c54053bbe327be797d201f99cef50a17df7fc740a221c9a37b612204a7ea4acab026c6c2df6877f6b9a2a713757764f4f7378f4e10095dcffa3b40c813e24d643a30b36989b028a0ea4157998c28ec74e722f98aa00000168000000b0248ff6586b97b152b09496aeb30514e5c91c12a243ac233d6e63b93028f94ab433cce44e86faa934a95bccd335742e9b7701a5d35844185c62623f8f357ae298751a18458aec111b23b44223cefa068b64af29d42b081f2e4bdad9c826bf64e3dae846afe4f6315e6a6f1a52652f2f4f29f187dc06dfac268a1371a0926348e19e49b13c334d583a587600636c8b836c072738acc738a0a5609b1b3fa8982afd3a8e9ea4da29ed2cac65f1ab5116c1e0000000b00bced993d9a93add3147067485c4d908d192271026857b58d50f8ced6ed0957c56c66d5b3e00ef6b39c1cc51bf7bd77cb849a7ed2f2a9d178f89b181dfeb38d3e11c7257046c7da27345753b0ac8290952f10317f2dc1cbd434768d0667de0842d594b0754ec017d53bc080bd3d7cb34188f667729ecc6419c2531017dd60f39a9f9ddd9fef22be47ad5bd3cd1bc4102273c12b82612e4a51f260650a080717ffa6cac65b868be541e39d7caa78656ca00000168000000b01fe272b5b01568e6c92942491499d5189340e017d1113c2d2382f91d39aee3ed3bdf04d80995d20998699c4484c1ddfa632d381c285c04432e9fc438e71ee533de3fb7a51eb3948ce8f0ab3c16f457191e474a113eb78a7ca65e43cec59a8c961869d6fbd8c6abfa95ef60e18f7c47dd07574a3d5eeec87aa0816e933c1034fe21b62ddfe3f859d9f805e97bc6d653d414a82aed94d66a99dfe640c8de9412197cfaf631b1c5d3e4c9fc23479d05c3ac000000b00cf93c2f39012684f3625dfb28490dabd33f70477006a718c3d360675e964e8f8c751d1a904be180aa25a5c0bb31e3586a29396c2994ecc657a4af438542d9fae3da2dbf8fd8b3d0116605f793132b59408138608f15faf2f0bd27fea1540263ef59b37046558bab9cbf8868e6d66a68275bbd4f2a54f6e743bf5153fef84eddf0c9fa4107855ecc40bdd5dfd5d7bc2e084150942c3af36bdea07a1bf5f3fe1d38c0493ba3371a119d7d51055297ef9300000168000000b0213e92e971ffcb083b866dd4955a0f3f9183f54dc7fb1268a9335b119744aefc3853433f43af57e7b4c3d8a9d177bf0a92af1747e3af49e094bffc995d7ddc4eb245a2e221245ad984b231ca8d88d597bc856d412e89c42e76ac25d86bb431e6e6358e6ffc90f121b7014977f089cb7a04063978ee2c11d19fea1ad103ca8d9371fd6535f491639fb128d4afc1065c1f106d59d9c3be981ae779512fc8fe43df86a724352f11f044444b96231777f196000000b0267210212891b7ab5042f830ed5b110f23b4575d2597da72a2b5adf1d0510a65556c70390eaf280b9055cdd495a751ebf669bce3a23563a99a93e2d9853cd63fd19c9abe52e4291e8b686daf0ece9d28849ca40e2d090e208a03b3d126d1b28e1650def5ca9357465b31e8beb54e0f652589acd3122b0650d8d466160e8497971fd5cfc6fb0bed0352023ef546981d0517857e4cd3e9c9ea4070f475d398a5dea68661ee8446cef9e7442a1a443c329800000168000000b021356eb91ff7591f6243d993c6a46d64f87b021eb4276d270584168c8aaf937cb249c6560453c4f998f78218b3f2fbe7e2f75b5af9b637b0c5d79db309cc96827da0407ca9fe26f5efe73f951d552e9f71c76800c21dd398cc3afbb8e15dc136beeb27e5a8291e71121352a9e6ed14411114d1d42ec6eac7210c25be51b86e377d4f4881b65bdd1a6020a543d4d66e8d2fe863f5b579fba43c02d95a3f76c53bc1ff7b3019096f1d5df44f3c63922cc3000000b0055bca670ecbd5ccbc4cf69326255027dede97372017a7b6f8c38c218d3a161acf932166d9d9a0560ff252b8de3020cb7dbbf8f950030e52bf9b7e4d2ab1fa590ee369a2f0f6d3761abd6e6f1ca2971c89562eae13b47cec247a9590b120ba09b3719ba9a98fc227d668ea9157f03af81d9617ba09a95e902fdc1a6fb4b3981ee2cf1789956bd67b994d7384886f886a2c18cdcdef9743e8473be2978f2118877a5c07b8015c31823550cc8b01b6ab60380000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000030100000000000000000000000000000000000000000000000000000000000003020000000000000000000000000000000000000000000000000000000000000303000000000000000000000000000000000000000000000000000000000000030400000000000000000000000000000000000000000000000000000000000003050000000000000000000000000000000000000000000000000000000000000306000000000000000000000000000000000000000000000000000000000000030700000000000000000000000000000000000000000000000000000000000003080000000000000000000000000000000000000000000000000000000000000309000000000000000000000000000000000000000000000000000000000000030a000000000000000000000000000000000000000000000000000000000000030b000000000000000000000000000000000000000000000000000000000000030c000000000000000000000000000000000000000000000000000000000000030d000000000000000000000000000000000000000000000000000000000000030e000000000000000000000000000000000000000000000000000000000000030f0000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000031100000000000000000000000000000000000000000000000000000000000003120000000000000000000000000000000000000000000000000000000000000313000000000000000000000000000000000000000000000000000000000000031400000000000000000000000000000000000000000000000000000000000003150000000000000000000000000000000000000000000000000000000000000316000000000000000000000000000000000000000000000000000000000000031700000000000000000000000000000000000000000000000000000000000003180000000000000000000000000000000000000000000000000000000000000319000000000000000000000000000000000000000000000000000000000000031a000000000000000000000000000000000000000000000000000000000000031b000000000000000000000000000000000000000000000000000000000000031c000000000000000000000000000000000000000000000000000000000000031d000000000000000000000000000000000000000000000000000000000000031e000000000000000000000000000000000000000000000000000000000000031f0000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000032100000000000000000000000000000000000000000000000000000000000003220000000000000000000000000000000000000000000000000000000000000323000000000000000000000000000000000000000000000000000000000000032400000000000000000000000000000000000000000000000000000000000003250000000000000000000000000000000000000000000000000000000000000326000000000000000000000000000000000000000000000000000000000000032700000000000000000000000000000000000000000000000000000000000003280000000000000000000000000000000000000000000000000000000000000329000000000000000000000000000000000000000000000000000000000000032a000000000000000000000000000000000000000000000000000000000000032b000000000000000000000000000000000000000000000000000000000000032c000000000000000000000000000000000000000000000000000000000000032d000000000000000000000000000000000000000000000000000000000000032e000000000000000000000000000000000000000000000000000000000000032f00000000000000000000000000000000000000000000000000000000000003300000000000000000000000000000000000000000000000000000000000000331000000000000000000000000000000000000000000000000000000000000033200000000000000000000000000000000000000000000000000000000000003330000000000000000000000000000000000000000000000000000000000000334000000000000000000000000000000000000000000000000000000000000033500000000000000000000000000000000000000000000000000000000000003360000000000000000000000000000000000000000000000000000000000000337370000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040100000000000000000000000000000000000000000000000000000000000004020000000000000000000000000000000000000000000000000000000000000403000000000000000000000000000000000000000000000000000000000000040400000000000000000000000000000000000000000000000000000000000004050000000000000000000000000000000000000000000000000000000000000406000000000000000000000000000000000000000000000000000000000000040700000000000000000000000000000000000000000000000000000000000004080000000000000000000000000000000000000000000000000000000000000409000000000000000000000000000000000000000000000000000000000000040a000000000000000000000000000000000000000000000000000000000000040b000000000000000000000000000000000000000000000000000000000000040c000000000000000000000000000000000000000000000000000000000000040d000000000000000000000000000000000000000000000000000000000000040e000000000000000000000000000000000000000000000000000000000000040f0000000000000000000000000000000000000000000000000000000000000410000000000000000000000000000000000000000000000000000000000000041100000000000000000000000000000000000000000000000000000000000004120000000000000000000000000000000000000000000000000000000000000413000000000000000000000000000000000000000000000000000000000000041400000000000000000000000000000000000000000000000000000000000004150000000000000000000000000000000000000000000000000000000000000416000000000000000000000000000000000000000000000000000000000000041700000000000000000000000000000000000000000000000000000000000004180000000000000000000000000000000000000000000000000000000000000419000000000000000000000000000000000000000000000000000000000000041a000000000000000000000000000000000000000000000000000000000000041b000000000000000000000000000000000000000000000000000000000000041c000000000000000000000000000000000000000000000000000000000000041d000000000000000000000000000000000000000000000000000000000000041e000000000000000000000000000000000000000000000000000000000000041f0000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000000000000000000000000000042100000000000000000000000000000000000000000000000000000000000004220000000000000000000000000000000000000000000000000000000000000423000000000000000000000000000000000000000000000000000000000000042400000000000000000000000000000000000000000000000000000000000004250000000000000000000000000000000000000000000000000000000000000426000000000000000000000000000000000000000000000000000000000000042700000000000000000000000000000000000000000000000000000000000004280000000000000000000000000000000000000000000000000000000000000429000000000000000000000000000000000000000000000000000000000000042a000000000000000000000000000000000000000000000000000000000000042b000000000000000000000000000000000000000000000000000000000000042c000000000000000000000000000000000000000000000000000000000000042d000000000000000000000000000000000000000000000000000000000000042e000000000000000000000000000000000000000000000000000000000000042f00000000000000000000000000000000000000000000000000000000000004300000000000000000000000000000000000000000000000000000000000000431000000000000000000000000000000000000000000000000000000000000043200000000000000000000000000000000000000000000000000000000000004330000000000000000000000000000000000000000000000000000000000000434000000000000000000000000000000000000000000000000000000000000043500000000000000000000000000000000000000000000000000000000000004360200000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000501100000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000070a0000000000000000000000000000000000000000000000000000000000000701000000000000000000000000000000000000000000000000000000000000070b0000000000000000000000000000000000000000000000000000000000000702000000000000000000000000000000000000000000000000000000000000070c0000000000000000000000000000000000000000000000000000000000000703000000000000000000000000000000000000000000000000000000000000070d0000000000000000000000000000000000000000000000000000000000000704000000000000000000000000000000000000000000000000000000000000070e0000000000000000000000000000000000000000000000000000000000000705000000000000000000000000000000000000000000000000000000000000070f00000000000000000000000000000000000000000000000000000000000007060000000000000000000000000000000000000000000000000000000000000710000000000000000000000000000000000000000000000000000000000000070700000000000000000000000000000000000000000000000000000000000007110000000000000000000000000000000000000000000000000000000000000708000000000000000000000000000000000000000000000000000000000000071200000000000000000000000000000000000000000000000000000000000007090000000000000000000000000000000000000000000000000000000000000713000000000000000000000000000000000000000000000000000000000000070a0000000000000000000000000000000000000000000000000000000000000714000000000000000000000000000000000000000000000000000000000000070b0000000000000000000000000000000000000000000000000000000000000715000000000000000000000000000000000000000000000000000000000000070c0000000000000000000000000000000000000000000000000000000000000716000000000000000000000000000000000000000000000000000000000000070d0000000000000000000000000000000000000000000000000000000000000717000000000000000000000000000000000000000000000000000000000000070e0000000000000000000000000000000000000000000000000000000000000718000000000000000000000000000000000000000000000000000000000000070f0000000000000000000000000000000000000000000000000000000000000719000011000000021c000000b0263f1f6710a880b65786a6d27f2de87f6a9eb67f05351f863c6c2f26c9edb7256e1f7a4c2561a86322131a92a676ce823fc41e6337a61f1dea2caf92daf82ab3fdf6ae0956422cb5b9119f4571ed7047d525b08fed332d9ab448f695ed78f46466304eb08b7afc91d4b77e744ae8b3ac203d4ea99c224bf6802dc0013288b8fed4e53dad3ee10dd8bba126fb35c0dcee0f5e3187f276c2497e25f6b28616572ded95ccc9c1ceb348e3ad889fd8212d79000000b00c96cc8ed00fd809a9c419db7ccc18ca38dd87f5049dc296838c6fa711d63b911cb758815415c3022c34bbdf2009d807fbbe4b8cc99956092347fc0725dcecc0c2e32f5a2a3b4be700f7a516830a832756adda65bbf1ca84a3adab3e4ee03e263e4989c7572cf41acca2a5760adda1622ff3ae0eae6388ab49c41618ee00ce79d5f4915991ee69c299a61fe971a9b0332d5c7aae099bc5e181554cf9d673111b8925f5f62bfab220408ab40f9cfc100c000000b01b247dd9e52bf41e38c9631f4b54bdb35cc5f33746ed2b99df4f978c33f60f57a5c700813d9a27fdf5d2ab1861b03202061a11c98a9e8aad6dc70bb74df288c8014e13393e2cfea7e5ea45b7105790c92c6fa5fa3dc3ed7161329c75de56836cafecd257f594bac7f90351c37829c59f08367d990d7ee0c02318e3ec6f5ea54b6772236430a18cf5882856df8a9da5d900586b818672190094db21c33bcf8c5ff79080ee6ba9f99dcb33f8e90138f8740000021c000000b01756f4bde109022d44a7bdaa82ec4b18f3cbcddfcc4eef1cfa1e93726729b9bfca1538f3f773c0aa3bea781e007804b1e45d341bdcd596da4a4eb0fe543ee584112df78d8afdfbb8cced21bb254038559ff306e23f2514f403340e21ee93a37470c2fbefd5aee4a2b8bb2c765622322a248f5460ea21512fe206d6bae4f04e65142df2c643f03fea41345b009e4a3c1c305459838840adcc778607da2ecee786b6ddacea652512432db6db3a39e9ce96000000b029ee91989ef37f742d1d4b3ddee3d50eb760cf07d3aa0cc83ed9208a9b85aa243995b800722b077e9ce861e4ff4a8d653e069e5bdf555218702ab0052330add49a4279cbbef328b77df5be715b9b2468e8f13ec645cf82ef8e15b84c0e2105b59deef3387c8e56b9df36a086d9c2cb751e7b4198216e247a2e26a7616607995d57b2f4306493fd66d80442e812b82ba80307649c47d8d9022b895d2a1cd03bbb7e2c2855d7e0d99b572af02633f2b622000000b00dd3893bb42a23de84259eb3653db9a0246f71ebc96755c9e27092aa47324cbc2144a936c35d936014e4f0e35013f4e9e46e1caf6142d399aa373770be59e9852aee2d2948d03b5d16ca83031457f69fbf7586f7efd6ded61f34e839630c4872b250439b0654226407abcca836f7b3da2ff87635534b0369a9fc5c74f766ac7b36978d104208ba95608ed640b35ad87a0ef31291aa02c93f7dd61365ccc629c57cda031dd451f64f4efe500a8bb692710000021c000000b00e2f45dfde50fbb81715b088efde5d220c336e5489a3a774f3d8471474baf62b3931810894f1f8d1639e9e7653f146b8139e58da3274c887864d6c23125690a5db4089af6c5645f6576a01aa1da58b6c8fefa2485e1041ab1a16acd210711d07d6f474cb2b6da548cca9b877dbe1883c2d9155ebf7e683cacd9c92e1ddac052332031799e2e3bb33f70779ff3c09e1291c0289f049442b48d1ad927d9cf5e269e163f4a1c681b1c1c0f68fa51a6881df000000b029e12d9577679d9bba41e943b419bc67b88d1bf99e651075e87ff5feecc8b4d0f1f862397905fbc83dcef030171add27122d554dda1bafc3b0cca494c97c21313e60793aa498af25cb2444c24c28028fec31553b8370a4ccf61cf921f15afbf0a15aacd8eff09687fe9817b6b558832918a155d29a634f5860601140e28363f3c6c60b2a43fb4d3059771882b1076e4913fb588dbe37d0206388b5eabeccaeb9d691a07d849fdfe79ba86a648690187b000000b01764c24f54846ec8bceaf9f820f7267da97bc7324664c828b01434df702550d5e8966e08f54e95f0cd5c73a2aff618f29b90a41f3285aef0601e6c9de1205bb7f56e9a074b0dbf99349022df0a92901c0b22f59c8ccfe33caa52443c8461c3090eee7fe60a6fb68a4b2e8bd30035bea211a91f9cf5b7431a7700681b30e9b75d5eca819ffc4d9df0d4b0098e4096e07d0efb9b41da3c80853cf1075f8bfb255ca0a05f9bedd91e413f742c0529991d950000021c000000b026d6ea5e9fc0cb3993a1274f1769d8cf238c11432a9fe5f010dd7763e956b7a37dffb0c07fa03c5680095003b9e3036935e8aef1556c3a86ebaa9deedac93a4780a3232d85d06775a9747736dcb15fcfe9e3bc3aa269b9ddcb743c4738713628e5e37c7a1aa5c4068f93bc127fac65cf0f2cc74aa9a3ded9a9e6cb8304dec89f796dd082a7a1a578a4c432ee7f865bee143f5b5c643f14d43106f3299ce9bc2867c04cc32a0f7766ae48ef1b7e880e5a000000b007ebbdd7e14f7924264bc1caea06930653da4ca4f1d501ff6c40aa164baa5d6cb1b9d7ab56bdcd9295ff984ed8203da106f8d63a20d3732880a01221f148c20828f60dcfeeeeac56dea9d70fdc8755f5a483f2aa717b46c17f160040690400b3ec32d51666b9ae1de202aa88519b161213a872dab090f61cdd2eb1f7299348ec043a1e1490a403e7a2ababaa687644e2275e7b4a57968ecf06c207e3880830c3f8c238d0412d827c3fceba41705cf9d7000000b00ce47f2da6a69447e86e76d3fe970cfea4834d5e4eb7c867127f99d460690d8fad89ec6ace045370d6f788185585b33811ef48bede47f2686cd001233981b60e2624b01ec65132b55de6b2bd6e8518dfd06908a8e1a54c07990d69aae8c8cecbc85ae290768591f230532c386259e1ba271ed6d44a45eeac04a4f05d1c81481c50188b12753c8b611734b419d62532ea0e15267df97ee2af9a320af67db28e78deca457ac794064182fcb3ec183235660000021c000000b006e4cfa4e4d51610204648661d01a7a0176fdc097168bfb014d9a72e561d38ac76af6b884b4b196854f0665b8243acfffebe7c646dfc99ac7a7a2ae8b2a3400c8a1895564b0e61594e375829dd568e78baaca23497a3e78e63f0a6a9697b4bf3269a82c2f736badd3890f7e50e4a1cfc023dd8c5c254a7ef08eb18e1986f3f5ffb5568ab5afb7d3c633dc765fb9ffceb213ce880335f944815d44e5e3a996ff9d2a4619c1febec3b85ed823ddf5b18c7000000b01d122dac317878630c5d2d51834e4553a5fd140d4408a9b28af5b74aacd730a2e529b26ba0ffa6dd0d41fd9ae7ba201f25d985af69a4ad05f160cab52a074551babed78762d457634aeffcd3d327f11294e907c7bc3134520962935bad952615cf78cde6831b93bfd7fafc6c57f5cc97190c871e9c23393998da73e1510e04c76acac9879abf27617d180bc1e849f9ec1d96ba1e0fee99c3adcbdc061f97200d562df829b90b6e120bbd56c376432c2a000000b00ce65595c9aa13441a5a03e95c87192712ac8ba43fd660b18ef9ac07da192781bfb5169a52bc0b8ec657139dce6bedac3d931f2aab125f0fd12d42be56e6a3b04bfed21e46eb53a75ee46343f29da96acb44599e3c29360843c9ec8f36b06451160c045a29f257052d7c8cccbddd7c6709e957eca8425aefaa90af4d5e7211b5378ade7295c3522998fd43c00a9e23212d548b5512732c8121488a5d3c75ef1228fc104332c841ecf6c413dee02061b20000021c000000b001bb13ceb6f7725ecfd43b33158d05fca5d3e53c77ce4c0846553e6bb18ab4dc805b4b4a17048949f4a9cb3455483fd4b0120918b9370ca2679ed50a75b2a2738621ed8b373f822cdd388ecf52849d87fbf8ccddf961f92e80a4b0038038d1b1d0100b0bdbe93ada6a1c221e4983ee3626ef64a5b291d0e4a6e2d652430a559a2db886208e0a71853ff627144e1b403e0263de633a542184867f7106b16836de014943493d72cbf5b64bcbe75b1650bf000000b0167a2ddc276090ffc56cc249b134cd66fca183cc74ae725a84378c8fe4b9da7f526807e42c37a4272e92c6c6a86ecfe17c26234dde7dba18d719b9e806e386318ae98aa2e76500f1ef46c7108645427475ab80469593f26d7231a4355ad3c76faa630e3f68006d95629628d5e54bcebd1214a194187087b3813e236f6a8d588328f6ee745b64b435d3629a3b291b99c90af449a5db04c892cbc8ab77cbecc1bfcda37b249c345ae66ef38429a5b8afdd000000b01743f521fcbb264eb61d290d4dc6541de206b6dcf93d7ff2c68bfa533d07d31f52f8cea8babb55a0e3b084708db2ec2ffe25b02483f09799804ea942ca31236e6c69a00baba8663889490d304b471cdca42d67065912b3d03c6fe3a430dd5512003860c309184f0f86d0a23eb5234f8e0914cd8cd41da83b517cafdbadd29874039146e6ca5b9949b1d49c80b8cb17be2ee6323d052c6a04f4780bd66793b0288be6705d5d3947a4c4159da931f7502e0000021c000000b011bf9278cdf1c4f8d0f9babb149f0a4e6cbb5243865cb9d0fb0e93b3cb658f7f7070a63dd1b2a4af68a4b36241e13fefb8bb6fc4b9892e57e2a293b7fcee72a1293c3c6b65f790e076943fd6740ca4e209305a00badfb9facf559781918e76da32acec482163326cd147d010ad2b7fc91e2cde3df3de439daed0ec75f451975ddaa86dd6f744d6ba3eba5a811f42b2550962baafb23c86df2965ecc4c7de277084ad196c5ae023efb40131855217468f000000b00db21ee4c7db07ba61f09054a349a4429aabf5bf30a6fbe6f0faa3ed94a39c5293267cb1e71ad9ffb5a30a098362cb02bc4254aedcc45d485dba205bbcea72fbad08b7296803d4280c3e82df251fbf36edcdafd4082986e3088c2be31da89502f4ed2067bb25484eb72dd7b9f121b7e3030a27d5ed0f2d1f4af948fbcf5e1b37a161cc9c50b5269c2b107ef2eed364eb25f1522af71e61ab959ed840c35037529a73914a6ed1f28790e4666d998048ca000000b0059844e0ca74310fa86241d4aa21c98699855657ef9ba1b14dd87a3916554c9d025531f8efbaa449d0662342683328e9a2739c3ae599e57161a1763482a2d75de50ffc295b38afe322ec39fd085df8503cb17dbd309ca33e5fb0da5a82615303bbe1eb53da01819710d22e3dbcb6a5e926134ccaf01340e90d371f735d4410df3d88eea834bb70e623068113f1a2739c1bb68f25c8e7d8b8b2e5f9ed909cc8e19bb40ec143bab2e1da9f8ad951140c390000021c000000b024c476408b5456de6abca3842e49a8b01f99aa4c5fa93f709be6ffdbe69e225f9e2a52d00db0222418280f638c3adb8e201cd742f9773f253808e39d617d47f9adcb5c662c4e2980ab2a908984f0d0016337ba4e830069f43abc77909c14019a5c28faffe4283a67c04f9a0868266dc812e8c0f4d174618ffc8eb4eec6f8910d2e1cbb7544da4e72e9a44c9e021172c11c0e92b2049696b7981107819d033439d9af693ff5219d52d8222cd357705330000000b01bf02febc1a99505511735b449d2c7c0fc770b87073091359753d4647db0f9bd80a79b18ccbfde2d4a033187099c7f47f40c0666a4715654b0bf0ce8bcefef785eb54ea262b0e09cd8da72a6616931f0d8bb91c93f85b2ffeb3f929e972bf04455d070bed2b0099e363612589c7a4f5f2c4992454c55310c2dba66f8a37c094857180a7d9b90d35482b413c2c35eed29038d8b61c2eddcecbdcaa2ca5c8f9babf3c67fcc40f5cb0a28486cbf9007e7c2000000b020e404e795a3feb9b8cb2db14defa93dde4b00e5938dc66bb15fa3dd31bd97c4d35ead661dfc3b679317b7ba6757dfa1c6d12d76c42d66b81b43849cd44239d962027695924e7bd2c47cd18be251d9494164fc4a3d840443eac09a1eb27b5f2139aa7c147b8b6b1c9d98e33538b517c1097a54eb45c241eb1c89d463f982016a0d57b1baac4b615b60b2d1c512f8e55f2d60e48627c70a7e46e47fbff146ada2157dee6b18596da705cd815245f19ddf00000fa400000168000000b01411261f214a0906d59e55dd6187736d099067a910414238f5d1f5a840e3df8a806e38ba5dfc5c3db5809e96912e93e967872aa4bf0e7ca856290365435520d03f88e3dd14d489d4e899187d164215c053380c9f222375289f80a6199a0efd2dbeba14a1a92aa38741aa633332ea0a01075d652ddc4bb31e7d2e686825777566c6527a40580aaba20b751c5dfb15898b16161e6a71a6deb78990bfa3ba252a64913251d9796d7d29fdce0600c3a62943000000b011bc1877b0e3bd8f73e4a1f15bbed87f215d4845f55c3975be3751218bb05445efe1f4213c662476896ff7d0515eb5d0e21518942ae524a483fae72491374f6f6b34bf9c74ac1bbd76e89c442e558751d60f118f40599776f7c4f213a1195e80b5c259315f8f10596175b621e0ddda600b1afb0b1c97888e15988e8e49dbafc24c1071653511251d97bb01b4603407a52a53eb2acae93b8012e95feaa7060b06ec431471991982aac8fd50f5c93c347c00000168000000b00cb1c977afad1c6f26ab5d437b1cb3d89951682fa4349dab51507c313f201cc90876d67ba3adb720f1dfd0d2a7d82816267f2ab72baadbf8d897d9239bbd1f0058131ddfd91fcc7f18d25ec9803c63fea45b52d9b5d17dff4eee8e6e0107e272f701005efc2e242581f7c0500f0edc780e0cc10649ad4c3439cc5ccae18c9cbcad367503983ddedbf0435d6dac48f4ed11a0c2809f25822c300dbf4ef8b9b020e76b1bfcea3b6198389a0d407c225083000000b00758f3a97e6ec5c60ff75558c0583ecdd52d1ae789eba35ed4a1bd868215251c37aa3357d39016f1e52965bafebf5e875a34a8a64edc5b91eeffed49a40fb0e35ac8acc22b558a15e24900b38bdea8d3a72724bbb9e4cb005a635a508b696805fa91fd9d1b8682574d55462f0e12fb091afd00cd443473789f381813b03d4b98a3b6208d37eb2ce4802f46257d802eb609666b0eaed3e111646d0092226f4cbbc3d72240362c159090f27f426dfe70e300000168000000b02a52ad6e931629dcb2f9130f75ad353f64842fed5f45a059cc2f679fd524e155b07a23eed876bb786cb2ca9cdbfcd750f98e54bca216a549e84dd833b8a7bd81675c49087c7465be74e5082581de519509cb41d70c7ef0fce02758e4b425f4ec5adbce3854eee43b7c311101214d73d718e76dd18d722bbf4e421e281371d153072118177ee12fdb9b833bd22a16cc9603f1335479976739426a0a6b566388a590ed4337f048d35c5ba46effeaaa36f3000000b02f513dace6c27e95f7d4a8de4bb1b37e02d0b282edcf02b675f5c0ff73caf2a7ec85ecbedc1915d9e69c970cd04d99e635e3ba49aa7621e943eca5975e04b82d46827bcb36d370c77d60ce0e24fab001c7a31ecf426d6b41686fda7713200b5d689472bc0c5d22708095375fcedf9e6a19d02f943f96081fe68530fa9f88fc33a57b9fd45516ad791ff6c3b1cd4cedd32dae5f16ddcacead67a22e1776b326816e4e7f1a8c5a83552e924035e983137600000168000000b020d65b6a8c5a80be25b1ee319b6e5965cd77ccdb6b8e23a28192c03b1a4df416f65d75a13639c3226248aaa3c0c0bca7f98559fac9f107e2f2167acb8b4bd10c1a1aff4adc283056551e5c438097b2fbf5ebc35dd3733a049b199dccfd3919e1179fabf59af099255d50296df09f0681181b895f5846ec0de4c0bca7795c336a57c6fe32b71f8be1ae58e533b26944800a48f46ee45b335a8d99ac4bfbdaa743d125754abf94173dc5e5e5b4fe4016d4000000b0271c41df882f455bc0c74112a172406a7dc3b27ed25399e2f29034b0098172cb120c564307bbf1967d7bfc938b0fbf8373ba5e06e252d9aacb3d7ba23b082706756389e63811ccd8dbd0fac04f1e4686c23c2efa24370607b5cf9c6fee3422669382d97bdde2f3e424e2a24e5c6ea3702de3c50fca441b75417ae95f6f8f248469a3b49314c644b651ce6b4cea4c60bd150526e7f241f9a894f14a491a570cb8a69ad161295c0dc289a6cecb722bf65c00000168000000b005e4ef826260061484024b591ba906a2092853f10a399c9e451ea411de22d00b9aae4cae64858af6538112be88bcc41de2f7ad1c4fa291c0a0d66dadb758d121eda171c427a4d03bea6873e659412f5dc6199da170ea44c58c0c926b643e601da304ead697ff3ff73733d6fa25ab0327080bae373f74d1fb2aaab903eccb99aa357ea85495e4181ba8204dd67eeaec5f1c6c6167b594810d53685afd5d793a6fe2396f0e06d8f57dd31bcf37754dbd1b000000b02fa868628d3dcb202156e3299fe8ce01a36e7b38799d01229c1b8c658b08a69df3bc3b2d21add3d2c7b8246f76c3bc0657501b19c662132c25f56dae819b9aa3df7ec55baf3e05395e29adf6bc5f6c5903d0c10afebf7229e43ad308f6b35a69c3438ccf923a61876cd53412678c5389152b863efdc13c23ef4c223a0555a36697ca8b41fe6f8533c7ca029869da90700c842c104c2dcf20dd82527c2178e2aa130455298481c20f92ff6f628a42efb400000168000000b01cbbea48e65803945155731bde28ac07efdb3349296ee82fbd3873ebc9f18c2f64cf8e3d6885e06352a10f9b6c807083b6cd796c7cc166a4916c6d078e6813ac2eab727c6bf24da1d75a9c42b03e181ff998e3363b95a35ea4e02c50114a2a9f1ef94cf3aa79c254208beaeedc6fcb5e15f1db3e7f4dccbf7fb1bb29d258ce0ececc774ecf2fb7d99dd94ea1a4c9aee91e1d85dfb3358958dedc2da096c199b1615d1f3376f5951533c5f0c85ab1ce52000000b019b8936a60d544580a2e55c1d68f54c427c3f854f947498760215dbcc0deb24f97c12b2acc8db60c72058aef57a5e2710e1e38b2d55bb547511d2803509b9e708bdf0a6d4809ffcec1cb06144492c593b879dbe4fa0279f18827ba3d40c9a68d59187c7a743582bc05acdc62396f2fe0221dfc4cbfd8b1c6dfab12ec88b2ca7237d30f21feb61a58ca3d34cdfeb7e12a26eea59ba9e4e0985c1c7d3ccdb11c29a455dfc5674531058fdec1fa54688f1e00000168000000b01a5a128ea7829b707c90e58bac4754fd273ac2728504295564b3cab2fa44733fcb63d283105cf0d80e033090d2c25e85996884f4b868694703e685bb6633821601050ba05d2f9130ca7e3f86de480f7a14918ee0e4aba55c430a9b8b100315f647ae88ac1764548a5cd6a4e6c483f22e1fa63f2d356c14120ceb9ecb711237c03b868a298c171a0e57378ff0c8e9372a008a4820f4a2aff05a1bec904e13fe4c5505b76b016f29ecb20b3f1d6ed97bc1000000b02ca68b651678eddb4c2b04e6d8b770b7bca054ebdcbc9862908e86234ccccda3305b1443417e76237333832b8b680ae77553431d38bb9416975cb414b032872b370371ef7c633ed4264553431c0eaece13fdac2e2cc018ea41b18fb7d38e012960d90299e6dcf812395ce65900c17f8603168b5448e270fd3c0796795c15f91d8a00f9342f0817f7b491c5a72bee7d29050afc7cd5098f619238130c4ab9e9aff3e6c9fc95d5f1f36d2f5652c2ce433100000168000000b02bdf1a7fb75f3f876b808982a24492ab03c00aa23c6234e9a4fafb40e1e590b38bfd24efdd2e309f1991067855c6de83697a9bfef96d958d358679331fb940a62139426c982bbe82e19b3584eadffc1ff9c24b29a31eb431817cd4fb65ea1d10807582adb1496bb8dfb30b5017d1a17e1cbbe22973cb8c77f9fdf832274a335228cd0c7b60b8d49b8c9c6000a12005982cce23f4382e959e6e8deb7eed7c980430bb0f3283c60ef5f62d1d71c6e9b514000000b01db63e7d47d803e2d820f0365cdda336c506e4bf0c8a14189442963bbad25df95f33556b82527046284c6c8008b826f63b65f6baa08f019f8b2d019966d9fde98301f1738ab878ab15ee81c0daa98b42e53fa91e1237a088ea1592f2d52771b229e0e94483a8db6631dc6ae55a081317067cff4d1a22aa73f18ed480f56b1e32309fb75d08e803ddcdaf64aa3f16bde2239fdacb35e628f4af2d90e94a5e08abffaa90a84000756f6a5c64a1f90c961200000168000000b01163967a8b4c2271b51c53f0ecc982643eb4ed5e691bed5b2f59f98aa329df803146177073f8c15c81daa69d48e5c8af2d2ac4c57d0de3b82c028c4ed622882f9993465aa1a9cb631a37d4db9b10f743278e404858681ea74ecacd975116eb35f020c1ce9696589d743ed64a2bbe82fa09697c7c1f440f178684c95bdff27e208d6e795bd34c47e40ac09c6f464da0712762f0463fe83019f0a5ed7b390ee80469117261e00ef4e34f8144edd04abc72000000b02f435418343859bf56de4fce2cd1e6fdf54cb50a2c8535d7a51946c483609b803fee6f4dd2e3f57551f1160c79699968277feeb36a6ed8f0d093515c73fdb6eb3f374cb5701893b584bad341a4c4470d052b6710b58af703844eee0917021049b603b6b88fb0b38f1a99db52d973376e17d39c38222617fb5b1ee78ac8fe868b4cea899f5c9b80334bc1ed88031a48c40e4e516f55cb767c76c554e92a035e350f916cba2174fbbf8afa397b0982233400000168000000b0213a5edd2529cc5ce7161bad1feb144e1c9a3bb2b017ba78244453da94dd764330c689b03eeeaa2f9eb99f9f10a8cd0ef19730283c07baa844df8d09299c635827e7d6836beaadcf23360b41d64bd8ec668e819bf12e8dafdfcc6479288854c90de5f18b9912e6c4688d3053ef10fc4f0345f27164b9be977a43216451fa8665f9d58cdebb6367eec2ee85f6e0ab9b140462156d5a986a3f71aac00b002f0c67af40e00e9e6961e18e8ff83325b7b0da000000b002b2e79051ecdefb755c3a6f7c424fc51a3e3f2a9bf0f19b5cbb78c1012a2c2f248d09b004ae21f2896a56497f5841908e633b00eeda030082ba2a75fc8958cacbc27ced4e5c286d746cdf15bc462be1ac7c7bab27619dfad12c7c9b429863dae7be206ac491bf48a11c09493f4b4fd914a6deec0f89f117dff547cf4c004f2e25365e80918ebe0ec5a0fd292b0b9d2a01f1ae4652b911551049b0a4078d7e9d68faf7d652e7cec3ef50d46064610b7f00000168000000b01a1a5594349f72a17e85e7c9d36d447bae53962b33e5c6f08a6eee5fc203b8c1f25307381fd7896465e4dcd08793ae5d3f8b47f200726af452a8a1fcac76efbe2d1bf21b346a099d66156cfac8825a45467b1b3ccf4a3410d8c908797f6a793cb25c4883fe51ad762abae0685efac41210a59986509d5a5f50911a4772485814c8a7b01ca0bb3afc32c3dbb06ffd54e82d6516698cea90c614e1b567f77895b6cb2794a9f7a43efbbe4ef4d4e2f9c37a000000b022e564e8172514d2bf6fed10a553f523c2c6d6d4d252cdc35455a063ae2544e947fc48ac76f516d79eb8e0a61b7c8a0a5967b19cdb8dad1e3f9d6c5df2bc519f4577688c127c1c12925363f1abe13ba2d1ffc4e3774d0f3b4ffb292657eeb2426cdcf666b9a41e924e564a865ce487cc21e720dc9813d8db88ba94cc024dd1d851f320735aab4e0e94557b24607f06912056f7927ca2c518496fbd7117e5e1d747d6800393179082a85f6a8d0360be3b", + "txsEffectsHash": "0x9357b004f1ab95bd0ba8f146aa6ec4f7fde65b327f9067081838250ee330f020", "decodedHeader": { "contentCommitment": { "inHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "outHash": "0x3c00faec8dc481e71433eb21f1dd016134bf403950c146783ba1928cddcb315d", "txTreeHeight": 2, - "txsEffectsHash": "0xba6c2a6d813750dc256f667c3ba6c1c791bc56020496c7b490d00cccd40fdb69" + "txsEffectsHash": "0x9357b004f1ab95bd0ba8f146aa6ec4f7fde65b327f9067081838250ee330f020" }, "globalVariables": { "blockNumber": 2, "chainId": 31337, - "timestamp": 1709733970, + "timestamp": 1709933308, "version": 1, - "coinbase": "0x2c4ed998adb9ea58602c2f521338d85e796983c2", - "feeRecipient": "0x08e3c9234b16ba719d1fa970253ee4631f0204c4dc25b86b46eef390ab581e80" + "coinbase": "0x65a2a896586e32034cb3ca843906223fc2cd313a", + "feeRecipient": "0x0b235aea8996db40f47d82e4c76f348b308348437410b47527d4c347ff70900a" }, "lastArchive": { "nextAvailableLeafIndex": 2, - "root": "0x136a8f7d7909e8b294472fef24dc3a6187259aa5005e2e0c32bfd1f49b80b5c8" + "root": "0x0906ec56c4b26551de28a357993a893da99366977732263a996dd928bd232fba" }, "stateReference": { "l1ToL2MessageTree": { @@ -80,10 +80,6 @@ "root": "0x06c76caee115a61eeb6788977c68a3bea359061b678a1a4f5ffde13e0451717b" }, "partialStateReference": { - "contractTree": { - "nextAvailableLeafIndex": 8, - "root": "0x05cc2e9c54598a9b5cdf0983d442311b0b963c93ce46c5930be845b12d616b9a" - }, "noteHashTree": { "nextAvailableLeafIndex": 512, "root": "0x023ef973dbaa366409f7a01a4ced696227685ce75e57b510d0e7015ebfa72c50" @@ -99,8 +95,8 @@ } } }, - "header": "0x136a8f7d7909e8b294472fef24dc3a6187259aa5005e2e0c32bfd1f49b80b5c8000000020000000000000000000000000000000000000000000000000000000000000002ba6c2a6d813750dc256f667c3ba6c1c791bc56020496c7b490d00cccd40fdb6900000000000000000000000000000000000000000000000000000000000000003c00faec8dc481e71433eb21f1dd016134bf403950c146783ba1928cddcb315d06c76caee115a61eeb6788977c68a3bea359061b678a1a4f5ffde13e0451717b00000020023ef973dbaa366409f7a01a4ced696227685ce75e57b510d0e7015ebfa72c5000000200231b77b7e0311a71fae5cec0f0281816950f94a24bfc2e67c5ae8619c6ed4c880000028005cc2e9c54598a9b5cdf0983d442311b0b963c93ce46c5930be845b12d616b9a000000082ae3a1bf2752c8c8bd6741bb3fd0d9e3811dbf7681454436125ccb7afeca31c9000001400000000000000000000000000000000000000000000000000000000000007a69000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000065e878522c4ed998adb9ea58602c2f521338d85e796983c208e3c9234b16ba719d1fa970253ee4631f0204c4dc25b86b46eef390ab581e80", + "header": "0x0906ec56c4b26551de28a357993a893da99366977732263a996dd928bd232fba0000000200000000000000000000000000000000000000000000000000000000000000029357b004f1ab95bd0ba8f146aa6ec4f7fde65b327f9067081838250ee330f02000000000000000000000000000000000000000000000000000000000000000003c00faec8dc481e71433eb21f1dd016134bf403950c146783ba1928cddcb315d06c76caee115a61eeb6788977c68a3bea359061b678a1a4f5ffde13e0451717b00000020023ef973dbaa366409f7a01a4ced696227685ce75e57b510d0e7015ebfa72c5000000200231b77b7e0311a71fae5cec0f0281816950f94a24bfc2e67c5ae8619c6ed4c88000002802ae3a1bf2752c8c8bd6741bb3fd0d9e3811dbf7681454436125ccb7afeca31c9000001400000000000000000000000000000000000000000000000000000000000007a69000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000065eb82fc65a2a896586e32034cb3ca843906223fc2cd313a0b235aea8996db40f47d82e4c76f348b308348437410b47527d4c347ff70900a", "l1ToL2MessagesHash": "0xa10cc8559615be5a44cfb608374b1f84fd11cdb5844ebffafd92a77c068350f1", - "publicInputsHash": "0x08bb34a501366d5985915c898cd411d7ca1658821088cff7a52b696e96470b74" + "publicInputsHash": "0x00f4d89cc8b3932ddb9a9b7690d8acf4fe1c5b3f0fb4e4a0028ad6cb8e46651e" } } \ No newline at end of file diff --git a/noir-projects/.vscode/settings.json b/noir-projects/.vscode/settings.json new file mode 100644 index 00000000000..7c62ffb0edf --- /dev/null +++ b/noir-projects/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "noir.nargoPath": "/home/santiago/Projects/aztec3-packages/noir/noir-repo/target/release/nargo" +} diff --git a/yarn-project/end-to-end/src/integration_l1_publisher.test.ts b/yarn-project/end-to-end/src/integration_l1_publisher.test.ts index dd11721fc19..994f829115f 100644 --- a/yarn-project/end-to-end/src/integration_l1_publisher.test.ts +++ b/yarn-project/end-to-end/src/integration_l1_publisher.test.ts @@ -97,7 +97,7 @@ describe('L1Publisher integration', () => { let feeRecipient: AztecAddress; // To overwrite the test data, set this to true and run the tests. - const OVERWRITE_TEST_DATA = false; + const OVERWRITE_TEST_DATA = !!process.env.OVERWRITE_TEST_DATA; beforeEach(async () => { deployerAccount = privateKeyToAccount(deployerPK); From c5b0335ba30dd9f137442a762b132b5deb09d8dd Mon Sep 17 00:00:00 2001 From: Santiago Palladino Date: Fri, 8 Mar 2024 18:49:23 -0300 Subject: [PATCH 03/12] Remove references to the contract deployment emitter --- .../getting_started/aztecjs-getting-started.md | 15 --------------- .../sandbox/references/sandbox-reference.md | 1 - l1-contracts/README.md | 6 ------ l1-contracts/scripts/ci_deploy_contracts.sh | 3 --- l1-contracts/terraform/main.tf | 9 --------- yarn-project/archiver/src/archiver/config.ts | 4 ---- yarn-project/aztec-node/src/aztec-node/server.ts | 1 - yarn-project/aztec-node/terraform/main.tf | 5 +---- .../aztec.js/src/contract/contract.test.ts | 1 - yarn-project/aztec/src/cli/texts.ts | 3 +-- yarn-project/cli/src/cmds/deploy_l1_contracts.ts | 1 - .../ethereum/src/l1_contract_addresses.ts | 3 +-- .../pxe/src/pxe_service/test/pxe_service.test.ts | 1 - yarn-project/sequencer-client/src/config.ts | 4 ---- 14 files changed, 3 insertions(+), 54 deletions(-) diff --git a/docs/docs/developers/getting_started/aztecjs-getting-started.md b/docs/docs/developers/getting_started/aztecjs-getting-started.md index 9fa784129dc..330f9a787a3 100644 --- a/docs/docs/developers/getting_started/aztecjs-getting-started.md +++ b/docs/docs/developers/getting_started/aztecjs-getting-started.md @@ -137,9 +137,6 @@ A successful run should show something like this: token outboxAddress: EthAddress { token buffer: token }, - token contractDeploymentEmitterAddress: EthAddress { - token buffer: - token } token } token } +0ms ``` @@ -182,9 +179,6 @@ Now that we have our accounts loaded, let's move on to deploy our pre-compiled t token outboxAddress: EthAddress { token buffer: token }, - token contractDeploymentEmitterAddress: EthAddress { - token buffer: - token } token } token } +0ms token Loaded alice's account at 0x25048e8c...70d0 +4s @@ -233,9 +227,6 @@ Running now should yield output: token outboxAddress: EthAddress { token buffer: token }, - token contractDeploymentEmitterAddress: EthAddress { - token buffer: - token } token } token } +0ms token Loaded alice's account at 0x25048e8c...70d0 +4s @@ -294,9 +285,6 @@ Our output should now look like this: token outboxAddress: EthAddress { token buffer: token }, - token contractDeploymentEmitterAddress: EthAddress { - token buffer: - token } token } token } +0ms token Loaded alice's account at 0x25048e8c...70d0 +4s @@ -350,9 +338,6 @@ Our complete output should now be something like: token outboxAddress: EthAddress { token buffer: token }, - token contractDeploymentEmitterAddress: EthAddress { - token buffer: - token } token } token } +0ms token Loaded alice's account at 0x25048e8c...70d0 +4s diff --git a/docs/docs/developers/sandbox/references/sandbox-reference.md b/docs/docs/developers/sandbox/references/sandbox-reference.md index 04048676ccc..408572796eb 100644 --- a/docs/docs/developers/sandbox/references/sandbox-reference.md +++ b/docs/docs/developers/sandbox/references/sandbox-reference.md @@ -133,7 +133,6 @@ REGISTRY_CONTRACT_ADDRESS=0x01234567890abcde01234567890abcde INBOX_CONTRACT_ADDRESS=0x01234567890abcde01234567890abcde OUTBOX_CONTRACT_ADDRESS=0x01234567890abcde01234567890abcde ROLLUP_CONTRACT_ADDRESS=0x01234567890abcde01234567890abcde -CONTRACT_DEPLOYMENT_EMITTER_ADDRESS=0x01234567890abcde01234567890abcde ## Sequencer variables ## SEQ_PUBLISHER_PRIVATE_KEY=0x01234567890abcde01234567890abcde # Private key of an ethereum account that will be used by the sequencer to publish blocks. diff --git a/l1-contracts/README.md b/l1-contracts/README.md index 183ddf0404d..ddae20c94ed 100644 --- a/l1-contracts/README.md +++ b/l1-contracts/README.md @@ -54,12 +54,6 @@ It is the job of the rollup contract to store the state of the rollup and progre Currently not running any proofs _nor_ access control so blocks can be submitted by anyone and can be complete garbage. -### ContractDeploymentEmitter - -Job: Share Contract Deployment public data on chain. - -For now, this include bytecode for contract deployment, but over time this will be verified for public functions. - --- # Linter diff --git a/l1-contracts/scripts/ci_deploy_contracts.sh b/l1-contracts/scripts/ci_deploy_contracts.sh index ee8d3a987a4..e2a4bf74658 100755 --- a/l1-contracts/scripts/ci_deploy_contracts.sh +++ b/l1-contracts/scripts/ci_deploy_contracts.sh @@ -57,9 +57,6 @@ while IFS= read -r line; do elif [[ $line == *"Outbox"* ]]; then export TF_VAR_OUTBOX_CONTRACT_ADDRESS=$address echo "TF_VAR_OUTBOX_CONTRACT_ADDRESS=$TF_VAR_OUTBOX_CONTRACT_ADDRESS" - elif [[ $line == *"Emitter"* ]]; then - export TF_VAR_CONTRACT_DEPLOYMENT_EMITTER_ADDRESS=$address - echo "TF_VAR_CONTRACT_DEPLOYMENT_EMITTER_ADDRESS=$TF_VAR_CONTRACT_DEPLOYMENT_EMITTER_ADDRESS" elif [[ $line == *"Oracle"* ]]; then export TF_VAR_AVAILABILITY_ORACLE_CONTRACT_ADDRESS=$address echo "TF_VAR_AVAILABILITY_ORACLE_CONTRACT_ADDRESS=$TF_VAR_AVAILABILITY_ORACLE_CONTRACT_ADDRESS" diff --git a/l1-contracts/terraform/main.tf b/l1-contracts/terraform/main.tf index adf899760a1..9a337e1580a 100644 --- a/l1-contracts/terraform/main.tf +++ b/l1-contracts/terraform/main.tf @@ -55,12 +55,3 @@ variable "OUTBOX_CONTRACT_ADDRESS" { output "outbox_contract_address" { value = var.OUTBOX_CONTRACT_ADDRESS } - -variable "CONTRACT_DEPLOYMENT_EMITTER_ADDRESS" { - type = string - default = "" -} - -output "contract_deployment_emitter_address" { - value = var.CONTRACT_DEPLOYMENT_EMITTER_ADDRESS -} diff --git a/yarn-project/archiver/src/archiver/config.ts b/yarn-project/archiver/src/archiver/config.ts index 9c83ab13072..daddf75df06 100644 --- a/yarn-project/archiver/src/archiver/config.ts +++ b/yarn-project/archiver/src/archiver/config.ts @@ -58,7 +58,6 @@ export function getConfigEnvVars(): ArchiverConfig { ARCHIVER_VIEM_POLLING_INTERVAL_MS, AVAILABILITY_ORACLE_CONTRACT_ADDRESS, ROLLUP_CONTRACT_ADDRESS, - CONTRACT_DEPLOYMENT_EMITTER_ADDRESS, API_KEY, INBOX_CONTRACT_ADDRESS, OUTBOX_CONTRACT_ADDRESS, @@ -74,9 +73,6 @@ export function getConfigEnvVars(): ArchiverConfig { registryAddress: REGISTRY_CONTRACT_ADDRESS ? EthAddress.fromString(REGISTRY_CONTRACT_ADDRESS) : EthAddress.ZERO, inboxAddress: INBOX_CONTRACT_ADDRESS ? EthAddress.fromString(INBOX_CONTRACT_ADDRESS) : EthAddress.ZERO, outboxAddress: OUTBOX_CONTRACT_ADDRESS ? EthAddress.fromString(OUTBOX_CONTRACT_ADDRESS) : EthAddress.ZERO, - contractDeploymentEmitterAddress: CONTRACT_DEPLOYMENT_EMITTER_ADDRESS - ? EthAddress.fromString(CONTRACT_DEPLOYMENT_EMITTER_ADDRESS) - : EthAddress.ZERO, }; return { rpcUrl: ETHEREUM_HOST || 'http://127.0.0.1:8545/', diff --git a/yarn-project/aztec-node/src/aztec-node/server.ts b/yarn-project/aztec-node/src/aztec-node/server.ts index b9933d2c9bf..956bc5582bf 100644 --- a/yarn-project/aztec-node/src/aztec-node/server.ts +++ b/yarn-project/aztec-node/src/aztec-node/server.ts @@ -92,7 +92,6 @@ export class AztecNodeService implements AztecNode { `Registry: ${config.l1Contracts.registryAddress.toString()}\n` + `Inbox: ${config.l1Contracts.inboxAddress.toString()}\n` + `Outbox: ${config.l1Contracts.outboxAddress.toString()}\n` + - `Contract Emitter: ${config.l1Contracts.contractDeploymentEmitterAddress.toString()}\n` + `Availability Oracle: ${config.l1Contracts.availabilityOracleAddress.toString()}`; this.log(message); } diff --git a/yarn-project/aztec-node/terraform/main.tf b/yarn-project/aztec-node/terraform/main.tf index ce2e3b42bff..5bf9187d744 100644 --- a/yarn-project/aztec-node/terraform/main.tf +++ b/yarn-project/aztec-node/terraform/main.tf @@ -215,10 +215,7 @@ resource "aws_ecs_task_definition" "aztec-node" { "name": "SEQ_PUBLISHER_PRIVATE_KEY", "value": "${local.publisher_private_keys[count.index]}" }, - { - "name": "CONTRACT_DEPLOYMENT_EMITTER_ADDRESS", - "value": "${data.terraform_remote_state.l1_contracts.outputs.contract_deployment_emitter_address}" - }, + { "name": "ROLLUP_CONTRACT_ADDRESS", "value": "${data.terraform_remote_state.l1_contracts.outputs.rollup_contract_address}" diff --git a/yarn-project/aztec.js/src/contract/contract.test.ts b/yarn-project/aztec.js/src/contract/contract.test.ts index d2b27f15070..474cf57ede5 100644 --- a/yarn-project/aztec.js/src/contract/contract.test.ts +++ b/yarn-project/aztec.js/src/contract/contract.test.ts @@ -28,7 +28,6 @@ describe('Contract Class', () => { registryAddress: EthAddress.random(), inboxAddress: EthAddress.random(), outboxAddress: EthAddress.random(), - contractDeploymentEmitterAddress: EthAddress.random(), }; const mockNodeInfo: NodeInfo = { nodeVersion: 'vx.x.x', diff --git a/yarn-project/aztec/src/cli/texts.ts b/yarn-project/aztec/src/cli/texts.ts index 6d203edb071..4c37b30ff9a 100644 --- a/yarn-project/aztec/src/cli/texts.ts +++ b/yarn-project/aztec/src/cli/texts.ts @@ -4,8 +4,7 @@ const contractAddresses = 'registryAddress:REGISTRY_CONTRACT_ADDRESS - string - The deployed L1 registry contract address.\n' + 'inboxAddress:INBOX_CONTRACT_ADDRESS - string - The deployed L1 inbox contract address.\n' + 'outboxAddress:OUTBOX_CONTRACT_ADDRESS - string - The deployed L1 outbox contract address.\n' + - 'contractDeploymentEmitterAddress:CONTRACT_DEPLOYMENT_EMITTER_ADDRESS - string - The deployed L1 contract deployment emitter contract address.\n'; -('availabilityOracleAddress:AVAILABILITY_ORACLE_CONTRACT_ADDRESS - string - The deployed L1 availability oracle contract address.\n'); + 'availabilityOracleAddress:AVAILABILITY_ORACLE_CONTRACT_ADDRESS - string - The deployed L1 availability oracle contract address.\n'; const p2pOptions = 'p2pBlockCheckIntervalMS:P2P_BLOCK_CHECK_INTERVAL_MS - number - The frequency in which to check for blocks. Default: 100\n' + 'p2pL2QueueSize:P2P_L2_QUEUE_SIZE - number - Size of queue of L2 blocks to store. Default: 1000\n' + diff --git a/yarn-project/cli/src/cmds/deploy_l1_contracts.ts b/yarn-project/cli/src/cmds/deploy_l1_contracts.ts index 86e6cea47bb..a7a5af57fe1 100644 --- a/yarn-project/cli/src/cmds/deploy_l1_contracts.ts +++ b/yarn-project/cli/src/cmds/deploy_l1_contracts.ts @@ -17,7 +17,6 @@ export async function deployL1Contracts( log(`Registry Address: ${l1ContractAddresses.registryAddress.toString()}`); log(`L1 -> L2 Inbox Address: ${l1ContractAddresses.inboxAddress.toString()}`); log(`L2 -> L1 Outbox address: ${l1ContractAddresses.outboxAddress.toString()}`); - log(`Contract Deployment Emitter Address: ${l1ContractAddresses.contractDeploymentEmitterAddress.toString()}`); log(`Availability Oracle Address: ${l1ContractAddresses.availabilityOracleAddress.toString()}`); log('\n'); } diff --git a/yarn-project/ethereum/src/l1_contract_addresses.ts b/yarn-project/ethereum/src/l1_contract_addresses.ts index 147b2ced618..be1c3af72fc 100644 --- a/yarn-project/ethereum/src/l1_contract_addresses.ts +++ b/yarn-project/ethereum/src/l1_contract_addresses.ts @@ -6,8 +6,7 @@ export const l1ContractsNames = [ 'registryAddress', 'inboxAddress', 'outboxAddress', - 'contractDeploymentEmitterAddress', -]; +] as const; /** * Provides the directory of current L1 contract addresses diff --git a/yarn-project/pxe/src/pxe_service/test/pxe_service.test.ts b/yarn-project/pxe/src/pxe_service/test/pxe_service.test.ts index 43048e9e31f..01588b0e3ba 100644 --- a/yarn-project/pxe/src/pxe_service/test/pxe_service.test.ts +++ b/yarn-project/pxe/src/pxe_service/test/pxe_service.test.ts @@ -31,7 +31,6 @@ function createPXEService(): Promise { registryAddress: EthAddress.random(), inboxAddress: EthAddress.random(), outboxAddress: EthAddress.random(), - contractDeploymentEmitterAddress: EthAddress.random(), }; node.getL1ContractAddresses.mockResolvedValue(mockedContracts); diff --git a/yarn-project/sequencer-client/src/config.ts b/yarn-project/sequencer-client/src/config.ts index 0c6eed374ae..e0e6a9c701a 100644 --- a/yarn-project/sequencer-client/src/config.ts +++ b/yarn-project/sequencer-client/src/config.ts @@ -44,7 +44,6 @@ export function getConfigEnvVars(): SequencerClientConfig { ROLLUP_CONTRACT_ADDRESS, REGISTRY_CONTRACT_ADDRESS, INBOX_CONTRACT_ADDRESS, - CONTRACT_DEPLOYMENT_EMITTER_ADDRESS, OUTBOX_CONTRACT_ADDRESS, COINBASE, FEE_RECIPIENT, @@ -64,9 +63,6 @@ export function getConfigEnvVars(): SequencerClientConfig { registryAddress: REGISTRY_CONTRACT_ADDRESS ? EthAddress.fromString(REGISTRY_CONTRACT_ADDRESS) : EthAddress.ZERO, inboxAddress: INBOX_CONTRACT_ADDRESS ? EthAddress.fromString(INBOX_CONTRACT_ADDRESS) : EthAddress.ZERO, outboxAddress: OUTBOX_CONTRACT_ADDRESS ? EthAddress.fromString(OUTBOX_CONTRACT_ADDRESS) : EthAddress.ZERO, - contractDeploymentEmitterAddress: CONTRACT_DEPLOYMENT_EMITTER_ADDRESS - ? EthAddress.fromString(CONTRACT_DEPLOYMENT_EMITTER_ADDRESS) - : EthAddress.ZERO, }; return { From cc08cebfad56ca4d86c9b69a0c578cc15c3be075 Mon Sep 17 00:00:00 2001 From: Santiago Palladino Date: Fri, 8 Mar 2024 18:51:05 -0300 Subject: [PATCH 04/12] Fix noir-protocol-circuits-types tests --- .../src/__snapshots__/index.test.ts.snap | 1826 +++++------------ .../nested-call-private-kernel-init.hex | 2 +- .../nested-call-private-kernel-inner.hex | 2 +- .../nested-call-private-kernel-ordering.hex | 2 +- .../src/index.test.ts | 8 +- 5 files changed, 531 insertions(+), 1309 deletions(-) diff --git a/yarn-project/noir-protocol-circuits-types/src/__snapshots__/index.test.ts.snap b/yarn-project/noir-protocol-circuits-types/src/__snapshots__/index.test.ts.snap index 4db3b7a346e..51925ec4695 100644 --- a/yarn-project/noir-protocol-circuits-types/src/__snapshots__/index.test.ts.snap +++ b/yarn-project/noir-protocol-circuits-types/src/__snapshots__/index.test.ts.snap @@ -230,38 +230,38 @@ PrivateKernelInnerCircuitPublicInputs { }, "outHash": { "data": [ + 219, + 86, + 17, + 78, 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, + 253, + 212, + 193, + 248, + 92, + 137, + 43, + 243, + 90, + 201, + 168, + 146, + 137, + 170, + 236, + 177, + 235, + 208, + 169, + 108, + 222, + 96, + 106, + 116, + 139, + 93, + 113, ], "type": "Buffer", }, @@ -307,38 +307,38 @@ PrivateKernelInnerCircuitPublicInputs { }, "txsEffectsHash": { "data": [ - 205, - 51, - 138, - 49, + 12, + 173, + 4, + 195, + 160, + 108, + 95, + 151, + 214, + 208, 148, - 182, 175, - 72, - 51, - 165, - 57, - 247, - 87, - 9, - 133, - 91, - 204, - 161, + 34, + 138, + 74, + 123, + 118, + 26, + 29, + 56, + 223, + 54, + 101, + 151, + 138, + 13, + 118, 45, - 52, - 112, - 246, - 255, - 218, - 120, - 164, - 73, - 204, - 71, - 149, - 238, - 103, + 196, + 105, + 201, + 66, ], "type": "Buffer", }, @@ -348,47 +348,47 @@ PrivateKernelInnerCircuitPublicInputs { "chainId": "0x0000000000000000000000000000000000000000000000000000000000007a69", "coinbase": "0x0000000000000000000000000000000000000000", "feeRecipient": "0x0000000000000000000000000000000000000000000000000000000000000000", - "timestamp": "0x0000000000000000000000000000000000000000000000000000000065dfa8d7", + "timestamp": "0x0000000000000000000000000000000000000000000000000000000065eb877a", "version": "0x0000000000000000000000000000000000000000000000000000000000000001", }, "lastArchive": AppendOnlyTreeSnapshot { "nextAvailableLeafIndex": 3, "root": Fr { - "asBigInt": 5969944478967194141388904584480353988461619538833868682217715714162104866329n, + "asBigInt": 7322819193862672845855299016595543950408743368146079195180485227953652981062n, "asBuffer": { "data": [ - 13, - 50, - 222, - 107, - 206, - 117, - 42, - 64, - 25, - 77, - 235, - 87, - 127, - 201, + 16, + 48, + 145, + 155, + 241, 69, - 103, - 47, - 3, - 182, - 242, - 10, - 163, - 66, - 227, - 65, - 196, - 110, - 214, - 78, - 254, - 22, - 25, + 238, + 71, + 52, + 249, + 140, + 121, + 183, + 175, + 194, + 91, + 204, + 106, + 147, + 14, + 29, + 192, + 76, + 114, + 235, + 92, + 75, + 158, + 9, + 195, + 93, + 70, ], "type": "Buffer", }, @@ -439,87 +439,44 @@ PrivateKernelInnerCircuitPublicInputs { }, }, "partial": PartialStateReference { - "contractTree": AppendOnlyTreeSnapshot { - "nextAvailableLeafIndex": 6, - "root": Fr { - "asBigInt": 19268439499695681738128610275388603494001746813417330117124952063327879457040n, - "asBuffer": { - "data": [ - 42, - 153, - 140, - 223, - 16, - 111, - 52, - 30, - 132, - 96, - 209, - 148, - 219, - 30, - 198, - 76, - 179, - 27, - 201, - 185, - 135, - 11, - 228, - 78, - 176, - 109, - 82, - 169, - 243, - 126, - 105, - 16, - ], - "type": "Buffer", - }, - }, - }, "noteHashTree": AppendOnlyTreeSnapshot { "nextAvailableLeafIndex": 384, "root": Fr { - "asBigInt": 3465039335176256862253437740363938814226646564972974663280802681105950370836n, + "asBigInt": 15644062648431913457206137031849750974794557569646297107673432037868504991595n, "asBuffer": { "data": [ - 7, - 169, - 36, - 140, - 36, - 227, - 125, - 251, - 165, - 49, - 229, - 97, - 111, - 182, - 145, - 182, + 34, + 150, + 57, + 197, + 249, + 24, + 127, + 60, + 68, + 250, + 14, + 178, + 232, + 166, + 70, + 70, + 226, 159, - 119, - 89, - 72, - 69, - 129, + 18, 104, - 52, - 69, - 216, - 203, - 245, - 159, - 214, - 236, - 20, + 54, + 55, + 64, + 103, + 28, + 130, + 30, + 145, + 149, + 133, + 199, + 107, ], "type": "Buffer", }, @@ -528,41 +485,41 @@ PrivateKernelInnerCircuitPublicInputs { "nullifierTree": AppendOnlyTreeSnapshot { "nextAvailableLeafIndex": 512, "root": Fr { - "asBigInt": 6067156592360049447774272880746506121082222923352663084907772779978044188583n, + "asBigInt": 4565145541213149289299174715950271983027481937306311118570492849321817793425n, "asBuffer": { "data": [ - 13, - 105, - 227, - 145, - 126, - 227, - 85, - 20, - 14, - 73, - 114, + 10, + 23, 199, - 52, - 112, - 62, - 0, - 195, - 211, - 93, + 227, + 51, + 215, + 189, + 214, + 38, + 232, + 102, + 41, + 103, + 68, + 71, + 186, + 176, + 123, 55, - 175, - 151, - 106, - 25, - 220, - 183, - 85, - 198, - 131, - 167, - 167, + 62, 167, + 61, + 214, + 69, + 131, + 24, + 250, + 234, + 76, + 37, + 227, + 145, ], "type": "Buffer", }, @@ -655,239 +612,6 @@ PrivateKernelInnerCircuitPublicInputs { "type": "Buffer", }, }, - "contractDeploymentData": ContractDeploymentData { - "contractAddressSalt": Fr { - "asBigInt": 0n, - "asBuffer": { - "data": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - ], - "type": "Buffer", - }, - }, - "contractClassId": Fr { - "asBigInt": 0n, - "asBuffer": { - "data": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - ], - "type": "Buffer", - }, - }, - "initializationHash": Fr { - "asBigInt": 0n, - "asBuffer": { - "data": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - ], - "type": "Buffer", - }, - }, - "portalContractAddress": EthAddress { - "buffer": { - "data": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - ], - "type": "Buffer", - }, - }, - "publicKey": Point { - "kind": "point", - "x": Fr { - "asBigInt": 0n, - "asBuffer": { - "data": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - ], - "type": "Buffer", - }, - }, - "y": Fr { - "asBigInt": 0n, - "asBuffer": { - "data": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - ], - "type": "Buffer", - }, - }, - }, - }, - "isContractDeploymentTx": false, "isFeePaymentTx": false, "isRebatePaymentTx": false, "version": Fr { @@ -1055,117 +779,6 @@ PrivateKernelInnerCircuitPublicInputs { }, }, ], - "newContracts": [ - NewContractData { - "contractAddress": AztecAddress { - "asBigInt": 0n, - "asBuffer": { - "data": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - ], - "type": "Buffer", - }, - }, - "contractClassId": Fr { - "asBigInt": 0n, - "asBuffer": { - "data": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - ], - "type": "Buffer", - }, - }, - "portalContractAddress": EthAddress { - "buffer": { - "data": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - ], - "type": "Buffer", - }, - }, - }, - ], "newL2ToL1Msgs": [ Fr { "asBigInt": 0n, @@ -6581,41 +6194,41 @@ PrivateKernelInnerCircuitPublicInputs { }, }, "value": Fr { - "asBigInt": 7099803906405316731155190465507726995860977202683126152628181404682873070911n, + "asBigInt": 12936328288332864699403994288650572304816082296892863392647210216623240289974n, "asBuffer": { "data": [ - 15, - 178, - 88, - 187, - 46, - 225, - 186, - 36, - 144, - 217, - 181, - 174, - 143, - 100, - 52, - 185, - 163, - 160, - 198, - 184, - 77, - 45, - 36, - 189, - 149, - 45, - 9, - 128, + 28, 153, - 141, - 229, - 63, + 179, + 204, + 139, + 64, + 236, + 248, + 160, + 70, + 126, + 145, + 58, + 29, + 169, + 39, + 223, + 253, + 203, + 30, + 46, + 117, + 195, + 177, + 91, + 70, + 2, + 72, + 195, + 218, + 158, + 182, ], "type": "Buffer", }, @@ -35964,49 +35577,6 @@ PrivateKernelTailCircuitPublicInputs { }, }, "partial": PartialStateReference { - "contractTree": AppendOnlyTreeSnapshot { - "nextAvailableLeafIndex": 0, - "root": Fr { - "asBigInt": 11033938207523021649122316027295742559227608161317650429835019071130941169536n, - "asBuffer": { - "data": [ - 24, - 100, - 252, - 218, - 168, - 15, - 242, - 113, - 145, - 84, - 250, - 124, - 138, - 144, - 80, - 102, - 41, - 114, - 112, - 113, - 104, - 214, - 158, - 172, - 157, - 182, - 253, - 49, - 16, - 130, - 159, - 128, - ], - "type": "Buffer", - }, - }, - }, "noteHashTree": AppendOnlyTreeSnapshot { "nextAvailableLeafIndex": 0, "root": Fr { @@ -36180,239 +35750,6 @@ PrivateKernelTailCircuitPublicInputs { "type": "Buffer", }, }, - "contractDeploymentData": ContractDeploymentData { - "contractAddressSalt": Fr { - "asBigInt": 7311030382399597338163861050252213120062382238748931123802938997328081077437n, - "asBuffer": { - "data": [ - 16, - 41, - 229, - 132, - 159, - 98, - 47, - 239, - 16, - 243, - 88, - 76, - 228, - 253, - 225, - 211, - 122, - 230, - 2, - 70, - 67, - 253, - 214, - 192, - 63, - 91, - 30, - 182, - 138, - 120, - 68, - 189, - ], - "type": "Buffer", - }, - }, - "contractClassId": Fr { - "asBigInt": 11261402799649960560055000010277762683410792601251733926790783605870480450198n, - "asBuffer": { - "data": [ - 24, - 229, - 186, - 101, - 76, - 93, - 129, - 216, - 77, - 248, - 70, - 35, - 140, - 108, - 124, - 28, - 165, - 28, - 107, - 182, - 1, - 227, - 79, - 193, - 238, - 229, - 78, - 162, - 188, - 61, - 226, - 150, - ], - "type": "Buffer", - }, - }, - "initializationHash": Fr { - "asBigInt": 3884686677032078163997642338925277146524405337138768470479362501814185729076n, - "asBuffer": { - "data": [ - 8, - 150, - 167, - 157, - 40, - 207, - 1, - 80, - 166, - 109, - 36, - 234, - 213, - 25, - 10, - 104, - 19, - 150, - 27, - 33, - 153, - 252, - 65, - 127, - 75, - 183, - 160, - 143, - 246, - 213, - 156, - 52, - ], - "type": "Buffer", - }, - }, - "portalContractAddress": EthAddress { - "buffer": { - "data": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - ], - "type": "Buffer", - }, - }, - "publicKey": Point { - "kind": "point", - "x": Fr { - "asBigInt": 10877683337198452447572828431295314307935837383103134363936023229320737992362n, - "asBuffer": { - "data": [ - 24, - 12, - 140, - 243, - 101, - 74, - 89, - 224, - 70, - 151, - 91, - 83, - 159, - 210, - 134, - 195, - 226, - 246, - 219, - 66, - 226, - 180, - 19, - 122, - 58, - 217, - 28, - 91, - 195, - 118, - 46, - 170, - ], - "type": "Buffer", - }, - }, - "y": Fr { - "asBigInt": 3455974765174171425005393027783108758891497964940554641728595773967640820666n, - "asBuffer": { - "data": [ - 7, - 164, - 3, - 44, - 142, - 89, - 0, - 9, - 7, - 207, - 135, - 144, - 192, - 241, - 229, - 102, - 126, - 157, - 252, - 36, - 201, - 140, - 252, - 233, - 203, - 111, - 146, - 176, - 24, - 167, - 251, - 186, - ], - "type": "Buffer", - }, - }, - }, - }, - "isContractDeploymentTx": true, "isFeePaymentTx": false, "isRebatePaymentTx": false, "version": Fr { @@ -36459,7 +35796,7 @@ PrivateKernelTailCircuitPublicInputs { }, "end": PrivateAccumulatedRevertibleData { "encryptedLogPreimagesLength": Fr { - "asBigInt": 280n, + "asBigInt": 312n, "asBuffer": { "data": [ 0, @@ -36493,14 +35830,14 @@ PrivateKernelTailCircuitPublicInputs { 0, 0, 1, - 24, + 56, ], "type": "Buffer", }, }, "encryptedLogsHash": [ Fr { - "asBigInt": 304961715322094719555589373722999098792n, + "asBigInt": 130210556598837376398362507325313920703n, "asBuffer": { "data": [ 0, @@ -36519,28 +35856,28 @@ PrivateKernelTailCircuitPublicInputs { 0, 0, 0, - 229, - 109, - 125, - 108, + 97, + 245, + 164, + 24, + 196, + 40, + 251, + 25, + 117, + 194, 232, - 104, - 91, - 8, - 42, - 49, - 179, - 39, - 30, - 123, - 141, - 168, + 183, + 111, + 72, + 46, + 191, ], "type": "Buffer", }, }, Fr { - "asBigInt": 136897649095513224144746737282190647814n, + "asBigInt": 152596136500134802847689942599355739094n, "asBuffer": { "data": [ 0, @@ -36559,138 +35896,27 @@ PrivateKernelTailCircuitPublicInputs { 0, 0, 0, - 102, - 253, - 135, - 54, - 53, - 184, - 16, - 83, - 173, - 31, - 167, - 250, - 250, - 195, - 162, - 6, + 114, + 204, + 242, + 101, + 246, + 174, + 238, + 77, + 44, + 136, + 145, + 255, + 41, + 30, + 43, + 214, ], "type": "Buffer", }, }, ], - "newContracts": [ - NewContractData { - "contractAddress": AztecAddress { - "asBigInt": 21544707939378960316433445764943485561122552040387269174561235639352922598468n, - "asBuffer": { - "data": [ - 47, - 161, - 223, - 96, - 8, - 251, - 94, - 166, - 209, - 190, - 16, - 33, - 8, - 72, - 169, - 219, - 48, - 139, - 28, - 212, - 243, - 51, - 57, - 80, - 175, - 115, - 0, - 252, - 61, - 241, - 236, - 68, - ], - "type": "Buffer", - }, - }, - "contractClassId": Fr { - "asBigInt": 11261402799649960560055000010277762683410792601251733926790783605870480450198n, - "asBuffer": { - "data": [ - 24, - 229, - 186, - 101, - 76, - 93, - 129, - 216, - 77, - 248, - 70, - 35, - 140, - 108, - 124, - 28, - 165, - 28, - 107, - 182, - 1, - 227, - 79, - 193, - 238, - 229, - 78, - 162, - 188, - 61, - 226, - 150, - ], - "type": "Buffer", - }, - }, - "portalContractAddress": EthAddress { - "buffer": { - "data": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - ], - "type": "Buffer", - }, - }, - }, - ], "newL2ToL1Msgs": [ Fr { "asBigInt": 0n, @@ -36776,7 +36002,7 @@ PrivateKernelTailCircuitPublicInputs { "newNoteHashes": [ SideEffect { "counter": Fr { - "asBigInt": 3n, + "asBigInt": 2n, "asBuffer": { "data": [ 0, @@ -36810,211 +36036,47 @@ PrivateKernelTailCircuitPublicInputs { 0, 0, 0, - 3, + 2, ], "type": "Buffer", }, }, "value": Fr { - "asBigInt": 4921006138425954289239931824112847627978176763443183116545252407591448418403n, + "asBigInt": 3244449209969103038010139715921379878419591732986621843762878165143845271874n, "asBuffer": { "data": [ - 10, - 225, - 48, - 214, - 92, - 185, - 53, - 99, - 229, - 40, - 149, - 153, - 67, - 71, - 49, - 184, - 167, - 148, + 7, + 44, + 75, + 13, + 166, + 240, + 63, + 241, + 136, + 209, 80, - 179, - 169, - 139, - 51, - 211, - 113, - 50, - 103, - 110, - 134, - 73, - 24, - 99, - ], - "type": "Buffer", - }, - }, - }, - SideEffect { - "counter": Fr { - "asBigInt": 0n, - "asBuffer": { - "data": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - ], - "type": "Buffer", - }, - }, - "value": Fr { - "asBigInt": 0n, - "asBuffer": { - "data": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - ], - "type": "Buffer", - }, - }, - }, - SideEffect { - "counter": Fr { - "asBigInt": 0n, - "asBuffer": { - "data": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - ], - "type": "Buffer", - }, - }, - "value": Fr { - "asBigInt": 0n, - "asBuffer": { - "data": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, + 148, + 79, + 84, + 84, + 173, + 43, + 220, + 243, + 49, + 101, + 121, + 43, + 81, + 44, + 26, + 150, + 250, + 34, + 142, + 249, + 66, ], "type": "Buffer", }, @@ -41366,11 +40428,9 @@ PrivateKernelTailCircuitPublicInputs { }, }, }, - ], - "newNullifiers": [ - SideEffectLinkedToNoteHash { + SideEffect { "counter": Fr { - "asBigInt": 2n, + "asBigInt": 0n, "asBuffer": { "data": [ 0, @@ -41404,12 +40464,54 @@ PrivateKernelTailCircuitPublicInputs { 0, 0, 0, - 2, + 0, ], "type": "Buffer", }, }, - "noteHash": Fr { + "value": Fr { + "asBigInt": 0n, + "asBuffer": { + "data": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + "type": "Buffer", + }, + }, + }, + SideEffect { + "counter": Fr { "asBigInt": 0n, "asBuffer": { "data": [ @@ -41450,49 +40552,51 @@ PrivateKernelTailCircuitPublicInputs { }, }, "value": Fr { - "asBigInt": 2235505794528283094820486688568040133162370705176549719754391397044877345626n, + "asBigInt": 0n, "asBuffer": { "data": [ - 4, - 241, - 64, - 94, - 109, - 251, - 93, - 153, - 47, - 243, - 125, - 4, - 161, - 88, - 143, - 42, - 242, - 216, - 160, - 244, - 156, - 38, - 103, - 194, - 194, - 133, - 84, - 17, - 46, - 245, - 67, - 90, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, ], "type": "Buffer", }, }, }, + ], + "newNullifiers": [ SideEffectLinkedToNoteHash { "counter": Fr { - "asBigInt": 0n, + "asBigInt": 1n, "asBuffer": { "data": [ 0, @@ -41526,7 +40630,7 @@ PrivateKernelTailCircuitPublicInputs { 0, 0, 0, - 0, + 1, ], "type": "Buffer", }, @@ -41572,6 +40676,88 @@ PrivateKernelTailCircuitPublicInputs { }, }, "value": Fr { + "asBigInt": 7341864562237713531925686799163967342563902521837388286542567663423132264559n, + "asBuffer": { + "data": [ + 16, + 59, + 89, + 27, + 234, + 235, + 219, + 112, + 147, + 64, + 214, + 238, + 140, + 250, + 246, + 154, + 204, + 11, + 120, + 92, + 129, + 115, + 116, + 127, + 42, + 236, + 3, + 190, + 24, + 63, + 232, + 111, + ], + "type": "Buffer", + }, + }, + }, + SideEffectLinkedToNoteHash { + "counter": Fr { + "asBigInt": 3n, + "asBuffer": { + "data": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 3, + ], + "type": "Buffer", + }, + }, + "noteHash": Fr { "asBigInt": 0n, "asBuffer": { "data": [ @@ -41611,6 +40797,46 @@ PrivateKernelTailCircuitPublicInputs { "type": "Buffer", }, }, + "value": Fr { + "asBigInt": 2851366260941688976553707715310093175833892854125911078959003905290181320318n, + "asBuffer": { + "data": [ + 6, + 77, + 208, + 236, + 186, + 190, + 224, + 238, + 131, + 88, + 27, + 236, + 239, + 97, + 149, + 149, + 28, + 249, + 114, + 246, + 230, + 128, + 35, + 237, + 65, + 193, + 71, + 87, + 213, + 92, + 158, + 126, + ], + "type": "Buffer", + }, + }, }, SideEffectLinkedToNoteHash { "counter": Fr { @@ -52242,41 +51468,41 @@ PrivateKernelTailCircuitPublicInputs { }, }, "value": Fr { - "asBigInt": 2085978395838630903138509509608442216338599373364944549224860426572052415435n, + "asBigInt": 13949581956730028246332147915785320128385392828104141992864037122221381866072n, "asBuffer": { "data": [ - 4, - 156, - 159, - 54, - 245, - 224, - 135, - 162, - 37, - 138, - 154, - 200, - 13, - 140, - 155, - 224, - 246, - 110, - 195, - 182, - 121, - 63, - 125, - 68, + 30, + 215, + 46, + 255, + 239, + 40, + 148, + 142, + 97, + 92, + 61, + 219, 36, - 180, - 180, - 162, - 75, - 29, - 195, - 203, + 12, + 31, + 142, + 5, + 217, + 159, + 114, + 164, + 152, + 21, + 38, + 137, + 199, + 215, + 49, + 61, + 61, + 82, + 88, ], "type": "Buffer", }, @@ -52284,7 +51510,7 @@ PrivateKernelTailCircuitPublicInputs { }, SideEffectLinkedToNoteHash { "counter": Fr { - "asBigInt": 1n, + "asBigInt": 0n, "asBuffer": { "data": [ 0, @@ -52318,7 +51544,7 @@ PrivateKernelTailCircuitPublicInputs { 0, 0, 0, - 1, + 0, ], "type": "Buffer", }, @@ -52364,41 +51590,41 @@ PrivateKernelTailCircuitPublicInputs { }, }, "value": Fr { - "asBigInt": 15588520419822240287766178447960259909304026659317837370954464410240843027039n, + "asBigInt": 0n, "asBuffer": { "data": [ - 34, - 118, - 202, - 54, - 54, - 149, - 2, 0, - 139, - 167, - 160, - 185, - 67, - 176, - 242, - 40, - 35, - 12, - 13, - 113, - 205, - 88, - 221, - 174, - 153, - 136, - 33, - 2, - 70, - 104, - 146, - 95, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, ], "type": "Buffer", }, diff --git a/yarn-project/noir-protocol-circuits-types/src/fixtures/nested-call-private-kernel-init.hex b/yarn-project/noir-protocol-circuits-types/src/fixtures/nested-call-private-kernel-init.hex index 6f67c2d5fae..6492d3c7b53 100644 --- a/yarn-project/noir-protocol-circuits-types/src/fixtures/nested-call-private-kernel-init.hex +++ b/yarn-project/noir-protocol-circuits-types/src/fixtures/nested-call-private-kernel-init.hex @@ -1 +1 @@ -2fa1df6008fb5ea6d1be10210848a9db308b1cd4f3333950af7300fc3df1ec44af9f8c440001011124c94143e0599b7c02fbbc7efe5c82b4a9fd4cd42e1c504042e6aad8c2d072000001180c8cf3654a59e046975b539fd286c3e2f6db42e2b4137a3ad91c5bc3762eaa07a4032c8e59000907cf8790c0f1e5667e9dfc24c98cfce9cb6f92b018a7fbba0896a79d28cf0150a66d24ead5190a6813961b2199fc417f4bb7a08ff6d59c3418e5ba654c5d81d84df846238c6c7c1ca51c6bb601e34fc1eee54ea2bc3de2961029e5849f622fef10f3584ce4fde1d37ae6024643fdd6c03f5b1eb68a7844bd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007a6900000000000000000000000000000000000000000000000000000000000000012fa1df6008fb5ea6d1be10210848a9db308b1cd4f3333950af7300fc3df1ec44af9f8c4400010100000000000000000000000000000000000000000000000000000000000000002fa1df6008fb5ea6d1be10210848a9db308b1cd4f3333950af7300fc3df1ec440000000000000000000000000000000000000000af9f8c44000001000000021124c94143e0599b7c02fbbc7efe5c82b4a9fd4cd42e1c504042e6aad8c2d0720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002ab7c7cbe0c74f1a820cc839e9cfb4211de764e2838d0fe9a2e2276d349f527e000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003579f468b2283611cc4d7adfbb93b8a4815d93ac0b1e1d11dace012cf73c7aa000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000002091787b9330916da83946762ff9a8360000000000000000000000000000000014e39cfb57281e6bb0f622f4d24da33300000000000000000000000000000000e3b0c44298fc1c149afbf4c8996fb9240000000000000000000000000000000027ae41e4649b934ca495991b7852b8550000000000000000000000000000000000000000000000000000000000000118000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f800000000016642d9ccd8346c403aa4c3fa451178b22534a27035cdaa6ec34ae53b29c50cb000000000bcfa3e9f1a8922ee92c6dc964d6595907c1804a86753774322b468f69d4f278000000801864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f80000000000572c8db882674dd026b8877fbba1b700a4407da3ae9ce5fa43215a28163362b00000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000180c8cf3654a59e046975b539fd286c3e2f6db42e2b4137a3ad91c5bc3762eaa07a4032c8e59000907cf8790c0f1e5667e9dfc24c98cfce9cb6f92b018a7fbba0896a79d28cf0150a66d24ead5190a6813961b2199fc417f4bb7a08ff6d59c3418e5ba654c5d81d84df846238c6c7c1ca51c6bb601e34fc1eee54ea2bc3de2961029e5849f622fef10f3584ce4fde1d37ae6024643fdd6c03f5b1eb68a7844bd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f05d15d0248d5b7b6527f94f0ebf3dcd5cab2c92289d6b24e52c5e32d3afb23881b80304b483b90bc161c8777e275813d54198bdcb91799c205a4259e79a8fc342d542c018dc7396aa42ff0eb4280d5644510d5130c09acb863d9ca58a95f89de205f55504647dd32569dddc7f7c77eae94a46166b96a37120c5c15bc42d0754400000000000000000000000000000000000000000000000000000000000000011d81e3a46dc51e14eefa4573af363bc3075d859d28d9ee73c545eceaf429ccc91fd163e98c3058b28c0c78a7cea427a8d86699c79c4cf9eeeeca2dc63288c0850bcd1f91cf7bdd471d0a30c58c4706f3fdab3807a954b8f5b5e3bfec87d001bb06e62084ee7b602fe9abc15632dda3269f56fb0c6e12519a2eb2ec897091919d03c9e2e67178ac638746f068907e6677b4cc7a9592ef234ab6ab518f17efffa000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 \ No newline at end of file +16dc92860e90559980ac4a51c162c75bacd7d5c68627ca4f842aae790ad3267caf9f8c440001012ba0471a69c76696ed57b252d4dd871bb33031380b53e8053ad87bc1eb0c500e00000000000000000000000000000000000000000000000000000000000000007a69000000000000000000000000000000000000000000000000000000000000000116dc92860e90559980ac4a51c162c75bacd7d5c68627ca4f842aae790ad3267caf9f8c44000101000000000000000000000000000000000000000000000000000000000000000016dc92860e90559980ac4a51c162c75bacd7d5c68627ca4f842aae790ad3267c0000000000000000000000000000000000000000af9f8c440000000000012ba0471a69c76696ed57b252d4dd871bb33031380b53e8053ad87bc1eb0c500e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004dbb23d59a9f7374c26afbc5049b1b8b32129f11f5fc4d9daae20d7bc1a745d000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003579f468b2283611cc4d7adfbb93b8a4815d93ac0b1e1d11dace012cf73c7aa0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000116dc92860e90559980ac4a51c162c75bacd7d5c68627ca4f842aae790ad3267c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000056ae3b292dde3653fddebd0e2e58e45000000000000000000000000000000000818a8354b5a18267c5dd284c5a48ad900000000000000000000000000000000e3b0c44298fc1c149afbf4c8996fb9240000000000000000000000000000000027ae41e4649b934ca495991b7852b8550000000000000000000000000000000000000000000000000000000000000138000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f800000000016642d9ccd8346c403aa4c3fa451178b22534a27035cdaa6ec34ae53b29c50cb000000000bcfa3e9f1a8922ee92c6dc964d6595907c1804a86753774322b468f69d4f278000000800572c8db882674dd026b8877fbba1b700a4407da3ae9ce5fa43215a28163362b000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f1371c1aa479d7cd2801b0f2203b6889a051b10f7c1195df845cc1985c12039b61760928ccb58e1add32fff9de1789f9590f8525a9d3b3489da5ae198e9c3a34d1cab56c2964198a1b67616dd6bee80971cd6c16f1a0acdeabe618a92d81392aa22240ffc780baee02f15e2c96fd74a2f4ea19932966225bc9a4f8598ca6309d400000000000000000000000000000000000000000000000000000000000000022b09ad2b1765e61b2203cd359f9b833c9c611271e5c80df92c35ef522d3731e42706fc59cda1c448173c4a7739dca4fd4325c970e6f035ed9929fd84719533bb0bcd1f91cf7bdd471d0a30c58c4706f3fdab3807a954b8f5b5e3bfec87d001bb06e62084ee7b602fe9abc15632dda3269f56fb0c6e12519a2eb2ec897091919d03c9e2e67178ac638746f068907e6677b4cc7a9592ef234ab6ab518f17efffa000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 \ No newline at end of file diff --git a/yarn-project/noir-protocol-circuits-types/src/fixtures/nested-call-private-kernel-inner.hex b/yarn-project/noir-protocol-circuits-types/src/fixtures/nested-call-private-kernel-inner.hex index a15ed703c0c..68498cfeaee 100644 --- a/yarn-project/noir-protocol-circuits-types/src/fixtures/nested-call-private-kernel-inner.hex +++ b/yarn-project/noir-protocol-circuits-types/src/fixtures/nested-call-private-kernel-inner.hex @@ -1 +1 @@ -0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000001000000bd300000bd400000bd500000bd600000bd700000bd800000bd900000bda00000bdb00000bdc00000bdd00000bde00000bdf00000be000000be100000be20000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fb258bb2ee1ba2490d9b5ae8f6434b9a3a0c6b84d2d24bd952d0980998de53f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001cd1176371a8a323858dd5afe8d2be97ab088dfeefbf6dbb0679f71f88188dcc28db17e55aa2aee25bb126e1264aec3cf0223257e668c58bc9b1e31ce32329c800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d3735899d9fa7162447ca631f0ba2cd500000000000000000000000000000000eb57d0965a756d78291da33072610eb200000000000000000000000000000000d3735899d9fa7162447ca631f0ba2cd500000000000000000000000000000000eb57d0965a756d78291da33072610eb200000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d32de6bce752a40194deb577fc945672f03b6f20aa342e341c46ed64efe1619000000030000000000000000000000000000000000000000000000000000000000000001cd338a3194b6af4833a539f75709855bcca12d3470f6ffda78a449cc4795ee67000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f800000003007a9248c24e37dfba531e5616fb691b69f7759484581683445d8cbf59fd6ec14000001800d69e3917ee355140e4972c734703e00c3d35d37af976a19dcb755c683a7a7a7000002002a998cdf106f341e8460d194db1ec64cb31bc9b9870be44eb06d52a9f37e6910000000060572c8db882674dd026b8877fbba1b700a4407da3ae9ce5fa43215a28163362b000001000000000000000000000000000000000000000000000000000000000000007a69000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000065dfa8d7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007a69000000000000000000000000000000000000000000000000000000000000000101000000000000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f000000002ead99235b90e9c2d13627770d805e8337f639ea69d2c4f769f65bafa9daf6b507694224920d263a002dca02b3746882f8d222a150c28785978f9255c3cceca40b142544847554d75f2546c160023eaeaa60b4d9d6d0c14e37922c7d7853ae211cd0403df7845c5ce5cf0afa77cf73b6a173a6cf3e8bca0c736c5b308624a5bc0906bca100010028db17e55aa2aee25bb126e1264aec3cf0223257e668c58bc9b1e31ce32329c81cd0403df7845c5ce5cf0afa77cf73b6a173a6cf3e8bca0c736c5b308624a5bc00000000000000000000000000000000000000000906bca100000000000003173812cb2d7243dc1f635ed13d44b8e073ca8d9471192fa4b324986ebe9595100000000000000000000000000000000000000000000000000000000000007a6a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000e3b0c44298fc1c149afbf4c8996fb9240000000000000000000000000000000027ae41e4649b934ca495991b7852b85500000000000000000000000000000000e3b0c44298fc1c149afbf4c8996fb9240000000000000000000000000000000027ae41e4649b934ca495991b7852b855000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040d32de6bce752a40194deb577fc945672f03b6f20aa342e341c46ed64efe1619000000030000000000000000000000000000000000000000000000000000000000000001cd338a3194b6af4833a539f75709855bcca12d3470f6ffda78a449cc4795ee67000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f800000003007a9248c24e37dfba531e5616fb691b69f7759484581683445d8cbf59fd6ec14000001800d69e3917ee355140e4972c734703e00c3d35d37af976a19dcb755c683a7a7a7000002002a998cdf106f341e8460d194db1ec64cb31bc9b9870be44eb06d52a9f37e6910000000060572c8db882674dd026b8877fbba1b700a4407da3ae9ce5fa43215a28163362b000001000000000000000000000000000000000000000000000000000000000000007a69000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000065dfa8d7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f1be487bf00306769c092fff7aa7542f6e2e555b2b8f368355da674b74a34dd291dd9b12727a1e0dfb9e94af2718bd6eaadb7489ca6a5381e43dad39ef1c10f8c27b1d0839a5b23baf12a8d195b18ac288fcf401afb2f70b8a4b529ede5fa9fed2a6f9aaad465e3cb17d121b9e461d332c0b1998bfd59a957ab4c8f3a502ea40a00000000000000000000000000000000000000000000000000000000000000001e53e2a4a2ea07593ada9539cab59e6f37d7a01d7d402c51c3d2eb337a960dec2daefd8c101018a4a3a076131a4d44d9ed900dbe3b3bee5f88d8de8ba4bcb76a1696a166ff19126c9aae06722ae10ebda42f3638167ae5c0597e1a290e3bc7ff06e62084ee7b602fe9abc15632dda3269f56fb0c6e12519a2eb2ec897091919d03c9e2e67178ac638746f068907e6677b4cc7a9592ef234ab6ab518f17efffa000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 \ No newline at end of file +0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000001000000bd300000bd400000bd500000bd600000bd700000bd800000bd900000bda00000bdb00000bdc00000bdd00000bde00000bdf00000be000000be100000be20000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c99b3cc8b40ecf8a0467e913a1da927dffdcb1e2e75c3b15b460248c3da9eb6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002de8ea3cb67cbf05163d48efb6a1768bbd1fcba5a7b360f59c6d6a69b72d7b51065f52c09cf85a10f47ee62f69fb617d521db6331931a1a49401db2b772cd6ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d3735899d9fa7162447ca631f0ba2cd500000000000000000000000000000000eb57d0965a756d78291da33072610eb200000000000000000000000000000000d3735899d9fa7162447ca631f0ba2cd500000000000000000000000000000000eb57d0965a756d78291da33072610eb200000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001030919bf145ee4734f98c79b7afc25bcc6a930e1dc04c72eb5c4b9e09c35d460000000300000000000000000000000000000000000000000000000000000000000000010cad04c3a06c5f97d6d094af228a4a7b761a1d38df3665978a0d762dc469c9420000000000000000000000000000000000000000000000000000000000000000db56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d711864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f8000000030229639c5f9187f3c44fa0eb2e8a64646e29f1268363740671c821e919585c76b000001800a17c7e333d7bdd626e86629674447bab07b373ea73dd6458318faea4c25e391000002000572c8db882674dd026b8877fbba1b700a4407da3ae9ce5fa43215a28163362b000001000000000000000000000000000000000000000000000000000000000000007a69000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000065eb877a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007a69000000000000000000000000000000000000000000000000000000000000000101000000000000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f0000000029f6c6d02864676c3a735e198bdc062963b5c014299f0924fafb461717a354cd2950ce30c5f8cc743c2303ae0e2243346d9c31a2be86222c580561c4a0b85d4327c5d1425c0b6373e02e74c59332e350bab948f6042193da67960c26463215b212c4c71c3a8f8811738ddaa42174a013c6125ce135b501c0548394eaf92da4ae0906bca1000100065f52c09cf85a10f47ee62f69fb617d521db6331931a1a49401db2b772cd6ec12c4c71c3a8f8811738ddaa42174a013c6125ce135b501c0548394eaf92da4ae00000000000000000000000000000000000000000906bca1000000000003173812cb2d7243dc1f635ed13d44b8e073ca8d9471192fa4b324986ebe9595100000000000000000000000000000000000000000000000000000000000007a6a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000e3b0c44298fc1c149afbf4c8996fb9240000000000000000000000000000000027ae41e4649b934ca495991b7852b85500000000000000000000000000000000e3b0c44298fc1c149afbf4c8996fb9240000000000000000000000000000000027ae41e4649b934ca495991b7852b855000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000041030919bf145ee4734f98c79b7afc25bcc6a930e1dc04c72eb5c4b9e09c35d460000000300000000000000000000000000000000000000000000000000000000000000010cad04c3a06c5f97d6d094af228a4a7b761a1d38df3665978a0d762dc469c9420000000000000000000000000000000000000000000000000000000000000000db56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d711864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f8000000030229639c5f9187f3c44fa0eb2e8a64646e29f1268363740671c821e919585c76b000001800a17c7e333d7bdd626e86629674447bab07b373ea73dd6458318faea4c25e391000002000572c8db882674dd026b8877fbba1b700a4407da3ae9ce5fa43215a28163362b000001000000000000000000000000000000000000000000000000000000000000007a69000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000065eb877a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f083bb29cf968271b4ed555fc44929b491efd595175d7796a072873c1aa5407f00108ae65293fa98abe82d32e39bb59ff3c38fb56692e03364d1fb9f76e1d2f7827b1d0839a5b23baf12a8d195b18ac288fcf401afb2f70b8a4b529ede5fa9fed1c4d584bdd1c82ca3fa7f288682776d2159650f421a3f0c6fc465d9013fc0ff000000000000000000000000000000000000000000000000000000000000000001e53e2a4a2ea07593ada9539cab59e6f37d7a01d7d402c51c3d2eb337a960dec0f88b6aae0852d85238cb5a6714acb2d60d0326c43879b53bd86b20d678d364d269ea59eeea8c4b06aaa8ff5f0f116fc129ec221fa0339888f69490bcecb620a06e62084ee7b602fe9abc15632dda3269f56fb0c6e12519a2eb2ec897091919d03c9e2e67178ac638746f068907e6677b4cc7a9592ef234ab6ab518f17efffa000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 \ No newline at end of file diff --git a/yarn-project/noir-protocol-circuits-types/src/fixtures/nested-call-private-kernel-ordering.hex b/yarn-project/noir-protocol-circuits-types/src/fixtures/nested-call-private-kernel-ordering.hex index a1fc053755b..d77d42d73c7 100644 --- a/yarn-project/noir-protocol-circuits-types/src/fixtures/nested-call-private-kernel-ordering.hex +++ b/yarn-project/noir-protocol-circuits-types/src/fixtures/nested-call-private-kernel-ordering.hex @@ -1 +1 @@ -0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000001000000bd300000bd400000bd500000bd600000bd700000bd800000bd900000bda00000bdb00000bdc00000bdd00000bde00000bdf00000be000000be100000be2000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004e75d21b5f1f78004ea3c470c4e935dd566aae467f4f7175081cde2e0da87d50000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049c9f36f5e087a2258a9ac80d8c9be0f66ec3b6793f7d4424b4b4a24b1dc3cb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004f1405e6dfb5d992ff37d04a1588f2af2d8a0f49c2667c2c28554112ef5435a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022276ca36369502008ba7a0b943b0f228230c0d71cd58ddae998821024668925f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e56d7d6ce8685b082a31b3271e7b8da80000000000000000000000000000000066fd873635b81053ad1fa7fafac3a206000000000000000000000000000000001c9ecec90e28d2461650418635878a5c0000000000000000000000000000000091e49f47586ecf75f2b0cbb94e897112000000000000000000000000000000000000000000000000000000000000011800000000000000000000000000000000000000000000000000000000000000042fa1df6008fb5ea6d1be10210848a9db308b1cd4f3333950af7300fc3df1ec44000000000000000000000000000000000000000018e5ba654c5d81d84df846238c6c7c1ca51c6bb601e34fc1eee54ea2bc3de2960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f800000000016642d9ccd8346c403aa4c3fa451178b22534a27035cdaa6ec34ae53b29c50cb000000000bcfa3e9f1a8922ee92c6dc964d6595907c1804a86753774322b468f69d4f278000000801864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f80000000000572c8db882674dd026b8877fbba1b700a4407da3ae9ce5fa43215a28163362b00000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001180c8cf3654a59e046975b539fd286c3e2f6db42e2b4137a3ad91c5bc3762eaa07a4032c8e59000907cf8790c0f1e5667e9dfc24c98cfce9cb6f92b018a7fbba0896a79d28cf0150a66d24ead5190a6813961b2199fc417f4bb7a08ff6d59c3418e5ba654c5d81d84df846238c6c7c1ca51c6bb601e34fc1eee54ea2bc3de2961029e5849f622fef10f3584ce4fde1d37ae6024643fdd6c03f5b1eb68a7844bd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007a69000000000000000000000000000000000000000000000000000000000000000101000000000000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f0000000013b6f5321c6a82e4bad2481d029eab76cbae772f47b81ef94979734f5fc960402ead05dacacca344f741faf74423ffa51a5c4764d96cb68e3530de6774d42ce1298a146f3b6558ea1be6f42b48d3854581fde967809ab90376742fcad1db6aef04e75d21b5f1f78004ea3c470c4e935dd566aae467f4f7175081cde2e0da87d50000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f000000100000001100000012000000130000001400000015000000160000001700000018000000190000001a0000001b0000001c0000001d0000001e0000001f000000200000002100000022000000230000002400000025000000260000002700000028000000290000002a0000002b0000002c0000002d0000002e0000002f000000300000003100000032000000330000003400000035000000360000003700000038000000390000003a0000003b0000003c0000003d0000003e0000003f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049c9f36f5e087a2258a9ac80d8c9be0f66ec3b6793f7d4424b4b4a24b1dc3cb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002276ca36369502008ba7a0b943b0f228230c0d71cd58ddae998821024668925f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104f1405e6dfb5d992ff37d04a1588f2af2d8a0f49c2667c2c28554112ef5435a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000001000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f000000100000001100000012000000130000001400000015000000160000001700000018000000190000001a0000001b0000001c0000001d0000001e0000001f000000200000002100000022000000230000002400000025000000260000002700000028000000290000002a0000002b0000002c0000002d0000002e0000002f000000300000003100000032000000330000003400000035000000360000003700000038000000390000003a0000003b0000003c0000003d0000003e0000003f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000800000000000000080000000000000008000000000000000800000000000000080000000000000008000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 \ No newline at end of file +0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000001000000bd300000bd400000bd500000bd600000bd700000bd800000bd900000bda00000bdb00000bdc00000bdd00000bde00000bdf00000be000000be100000be20000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000199eaffab9a7ddc1a75f8acf0681fb95d53fe00ff26430f05b0472bbf50ad53700000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ed72effef28948e615c3ddb240c1f8e05d99f72a498152689c7d7313d3d525800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000103b591beaebdb709340d6ee8cfaf69acc0b785c8173747f2aec03be183fe86f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001064dd0ecbabee0ee83581becef6195951cf972f6e68023ed41c14757d55c9e7e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061f5a418c428fb1975c2e8b76f482ebf0000000000000000000000000000000072ccf265f6aeee4d2c8891ff291e2bd6000000000000000000000000000000001c9ecec90e28d2461650418635878a5c0000000000000000000000000000000091e49f47586ecf75f2b0cbb94e897112000000000000000000000000000000000000000000000000000000000000013800000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f800000000016642d9ccd8346c403aa4c3fa451178b22534a27035cdaa6ec34ae53b29c50cb000000000bcfa3e9f1a8922ee92c6dc964d6595907c1804a86753774322b468f69d4f278000000800572c8db882674dd026b8877fbba1b700a4407da3ae9ce5fa43215a28163362b0000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007a69000000000000000000000000000000000000000000000000000000000000000101000000000000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f00000000200f9f6318b491e09a817e936f44ff81e6553396538244f5b61bd427d68eec401ba8742d972310ca9efeea5bb67505d7d300e0c6451232af6df21fe058c384f304a2d2e1c35566adba51be66f949ee51a2b8d9c7f6f9ec18e76fe44d087dc62d199eaffab9a7ddc1a75f8acf0681fb95d53fe00ff26430f05b0472bbf50ad5370000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f000000100000001100000012000000130000001400000015000000160000001700000018000000190000001a0000001b0000001c0000001d0000001e0000001f000000200000002100000022000000230000002400000025000000260000002700000028000000290000002a0000002b0000002c0000002d0000002e0000002f000000300000003100000032000000330000003400000035000000360000003700000038000000390000003a0000003b0000003c0000003d0000003e0000003f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ed72effef28948e615c3ddb240c1f8e05d99f72a498152689c7d7313d3d525800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000103b591beaebdb709340d6ee8cfaf69acc0b785c8173747f2aec03be183fe86f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001064dd0ecbabee0ee83581becef6195951cf972f6e68023ed41c14757d55c9e7e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f000000100000001100000012000000130000001400000015000000160000001700000018000000190000001a0000001b0000001c0000001d0000001e0000001f000000200000002100000022000000230000002400000025000000260000002700000028000000290000002a0000002b0000002c0000002d0000002e0000002f000000300000003100000032000000330000003400000035000000360000003700000038000000390000003a0000003b0000003c0000003d0000003e0000003f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000800000000000000080000000000000008000000000000000800000000000000080000000000000008000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 \ No newline at end of file diff --git a/yarn-project/noir-protocol-circuits-types/src/index.test.ts b/yarn-project/noir-protocol-circuits-types/src/index.test.ts index 623b6ca6e25..0a8635a989b 100644 --- a/yarn-project/noir-protocol-circuits-types/src/index.test.ts +++ b/yarn-project/noir-protocol-circuits-types/src/index.test.ts @@ -1,15 +1,11 @@ -import { - PrivateKernelInitCircuitPrivateInputs, - PrivateKernelInnerCircuitPrivateInputs, - PrivateKernelTailCircuitPrivateInputs, -} from '@aztec/circuits.js'; +import { PrivateKernelInnerCircuitPrivateInputs, PrivateKernelTailCircuitPrivateInputs } from '@aztec/circuits.js'; import { DebugLogger, createDebugLogger } from '@aztec/foundation/log'; import { fileURLToPath } from '@aztec/foundation/url'; import { readFileSync } from 'fs'; import { dirname, resolve } from 'path'; -import { executeInit, executeInner, executeTail } from './index.js'; +import { executeInner, executeTail } from './index.js'; describe('Private kernel', () => { let logger: DebugLogger; From 732c4d0af3fa523569fcd2c3966e78e11cee594d Mon Sep 17 00:00:00 2001 From: Santiago Palladino Date: Fri, 8 Mar 2024 19:23:29 -0300 Subject: [PATCH 05/12] Fix simulator tests --- .../src/core/libraries/ConstantsGen.sol | 1 + .../src/oracle/enqueue_public_function_call.nr | 17 +++++++---------- .../crates/types/src/constants.nr | 1 + yarn-project/circuits.js/src/constants.gen.ts | 1 + yarn-project/simulator/src/acvm/acvm.ts | 2 +- yarn-project/simulator/src/acvm/serialize.ts | 12 +++++++++--- .../src/client/private_execution.test.ts | 3 ++- 7 files changed, 22 insertions(+), 15 deletions(-) diff --git a/l1-contracts/src/core/libraries/ConstantsGen.sol b/l1-contracts/src/core/libraries/ConstantsGen.sol index c50bd7a4085..d7b51b36c73 100644 --- a/l1-contracts/src/core/libraries/ConstantsGen.sol +++ b/l1-contracts/src/core/libraries/ConstantsGen.sol @@ -117,6 +117,7 @@ library Constants { uint256 internal constant STATE_REFERENCE_LENGTH = 8; uint256 internal constant TX_CONTEXT_DATA_LENGTH = 4; uint256 internal constant TX_REQUEST_LENGTH = 10; + uint256 internal constant ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_LENGTH = 13; uint256 internal constant GET_NOTES_ORACLE_RETURN_LENGTH = 674; uint256 internal constant NOTE_HASHES_NUM_BYTES_PER_BASE_ROLLUP = 2048; uint256 internal constant NULLIFIERS_NUM_BYTES_PER_BASE_ROLLUP = 2048; diff --git a/noir-projects/aztec-nr/aztec/src/oracle/enqueue_public_function_call.nr b/noir-projects/aztec-nr/aztec/src/oracle/enqueue_public_function_call.nr index 3cf9edcdc85..61e3bbc4256 100644 --- a/noir-projects/aztec-nr/aztec/src/oracle/enqueue_public_function_call.nr +++ b/noir-projects/aztec-nr/aztec/src/oracle/enqueue_public_function_call.nr @@ -1,11 +1,8 @@ -use dep::protocol_types::{abis::function_selector::FunctionSelector, address::AztecAddress}; - -// contract_address + -// args_hash + -// crate::abi::FUNCTION_DATA_SIZE + -// crate::abi::CALL_CONTEXT_SIZE -// = 2 + 4 + 8 -global ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_SIZE: Field = 14; +use dep::protocol_types::{ + abis::function_selector::FunctionSelector, + address::AztecAddress, + constants::ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_LENGTH +}; #[oracle(enqueuePublicFunctionCall)] fn enqueue_public_function_call_oracle( @@ -15,7 +12,7 @@ fn enqueue_public_function_call_oracle( _side_effect_counter: u32, _is_static_call: bool, _is_delegate_call: bool -) -> [Field; ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_SIZE] {} +) -> [Field; ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_LENGTH] {} unconstrained pub fn enqueue_public_function_call_internal( contract_address: AztecAddress, @@ -24,7 +21,7 @@ unconstrained pub fn enqueue_public_function_call_internal( side_effect_counter: u32, is_static_call: bool, is_delegate_call: bool -) -> [Field; ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_SIZE] { +) -> [Field; ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_LENGTH] { enqueue_public_function_call_oracle( contract_address, function_selector, diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr b/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr index 8e78d6db6d3..765252a0bb5 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr @@ -172,6 +172,7 @@ global STATE_REFERENCE_LENGTH: u64 = 8; // 2 for snap + 8 for partial global TX_CONTEXT_DATA_LENGTH: u64 = 4; global TX_REQUEST_LENGTH: u64 = 10; +global ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_LENGTH: Field = 13; // 2 + FUNCTION_DATA_LENGTH + CALL_CONTEXT_LENGTH global GET_NOTES_ORACLE_RETURN_LENGTH: u64 = 674; global NOTE_HASHES_NUM_BYTES_PER_BASE_ROLLUP: Field = 2048; global NULLIFIERS_NUM_BYTES_PER_BASE_ROLLUP: Field = 2048; diff --git a/yarn-project/circuits.js/src/constants.gen.ts b/yarn-project/circuits.js/src/constants.gen.ts index 5b7285ae4a9..7c98dd7f086 100644 --- a/yarn-project/circuits.js/src/constants.gen.ts +++ b/yarn-project/circuits.js/src/constants.gen.ts @@ -102,6 +102,7 @@ export const PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH = 196; export const STATE_REFERENCE_LENGTH = 8; export const TX_CONTEXT_DATA_LENGTH = 4; export const TX_REQUEST_LENGTH = 10; +export const ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_LENGTH = 13; export const GET_NOTES_ORACLE_RETURN_LENGTH = 674; export const NOTE_HASHES_NUM_BYTES_PER_BASE_ROLLUP = 2048; export const NULLIFIERS_NUM_BYTES_PER_BASE_ROLLUP = 2048; diff --git a/yarn-project/simulator/src/acvm/acvm.ts b/yarn-project/simulator/src/acvm/acvm.ts index 178ccbee21d..ffa53b6ad05 100644 --- a/yarn-project/simulator/src/acvm/acvm.ts +++ b/yarn-project/simulator/src/acvm/acvm.ts @@ -110,7 +110,7 @@ export async function acvm( } else { typedError = new Error(`Error in oracle callback ${err}`); } - logger.error(`Error in oracle callback ${name}`); + logger.error(`Error in oracle callback ${name}: ${typedError.message}`); throw typedError; } }, diff --git a/yarn-project/simulator/src/acvm/serialize.ts b/yarn-project/simulator/src/acvm/serialize.ts index 1ddcf1ea98d..c35f16545b1 100644 --- a/yarn-project/simulator/src/acvm/serialize.ts +++ b/yarn-project/simulator/src/acvm/serialize.ts @@ -1,4 +1,4 @@ -import { PublicCallRequest } from '@aztec/circuits.js'; +import { ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_LENGTH, PublicCallRequest } from '@aztec/circuits.js'; import { AztecAddress } from '@aztec/foundation/aztec-address'; import { EthAddress } from '@aztec/foundation/eth-address'; import { Fr } from '@aztec/foundation/fields'; @@ -53,12 +53,18 @@ export function toACVMField( * TODO(#4380): Nuke this and replace it with PublicCallRequest.toFields() */ export function toAcvmEnqueuePublicFunctionResult(item: PublicCallRequest): ACVMField[] { - return [ + const fields = [ item.contractAddress.toField(), ...item.functionData.toFields(), ...item.callContext.toFields(), item.getArgsHash(), - ].map(toACVMField); + ]; + if (fields.length !== ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_LENGTH) { + throw new Error( + `Invalid length for EnqueuePublicFunctionResult (got ${fields.length} expected ${ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_LENGTH})`, + ); + } + return fields.map(toACVMField); } /** diff --git a/yarn-project/simulator/src/client/private_execution.test.ts b/yarn-project/simulator/src/client/private_execution.test.ts index d8c08b9bae8..7eab890fad0 100644 --- a/yarn-project/simulator/src/client/private_execution.test.ts +++ b/yarn-project/simulator/src/client/private_execution.test.ts @@ -788,7 +788,8 @@ describe('Private Execution test suite', () => { describe('enqueued calls', () => { it.each([false, true])('parent should enqueue call to child (internal %p)', async isInternal => { const parentArtifact = getFunctionArtifact(ParentContractArtifact, 'enqueueCallToChild'); - const childContractArtifact = ParentContractArtifact.functions[0]; + const childContractArtifact = ChildContractArtifact.functions.find(fn => fn.name === 'pubSetValue')!; + expect(childContractArtifact).toBeDefined(); const childAddress = AztecAddress.random(); const childPortalContractAddress = EthAddress.random(); const childSelector = FunctionSelector.fromNameAndParameters( From ba448100bcbf37e9fd1f0d586dd5d23675d30c84 Mon Sep 17 00:00:00 2001 From: Santiago Palladino Date: Fri, 8 Mar 2024 20:02:25 -0300 Subject: [PATCH 06/12] Fix sequencer tests --- yarn-project/archiver/src/archiver/archiver_store.ts | 1 - .../archiver/src/archiver/archiver_store_test_suite.ts | 1 - .../src/archiver/kv_archiver_store/contract_store.ts | 2 +- .../src/archiver/kv_archiver_store/kv_archiver_store.ts | 1 - .../archiver/memory_archiver_store/memory_archiver_store.ts | 1 - yarn-project/circuit-types/src/mocks.ts | 1 - yarn-project/circuit-types/src/tx/tx_receipt.ts | 1 - .../src/block_builder/solo_block_builder.test.ts | 6 ++++-- .../synchronizer/server_world_state_synchronizer.test.ts | 1 - 9 files changed, 5 insertions(+), 10 deletions(-) diff --git a/yarn-project/archiver/src/archiver/archiver_store.ts b/yarn-project/archiver/src/archiver/archiver_store.ts index 7a224289841..f39399bd663 100644 --- a/yarn-project/archiver/src/archiver/archiver_store.ts +++ b/yarn-project/archiver/src/archiver/archiver_store.ts @@ -1,6 +1,5 @@ import { Body, - ContractData, ExtendedContractData, GetUnencryptedLogsResponse, L1ToL2Message, diff --git a/yarn-project/archiver/src/archiver/archiver_store_test_suite.ts b/yarn-project/archiver/src/archiver/archiver_store_test_suite.ts index af2f0c26e71..52a94986982 100644 --- a/yarn-project/archiver/src/archiver/archiver_store_test_suite.ts +++ b/yarn-project/archiver/src/archiver/archiver_store_test_suite.ts @@ -1,5 +1,4 @@ import { - ExtendedContractData, L1ToL2Message, L2Block, L2BlockContext, diff --git a/yarn-project/archiver/src/archiver/kv_archiver_store/contract_store.ts b/yarn-project/archiver/src/archiver/kv_archiver_store/contract_store.ts index c9195ebe39f..8278d75bb13 100644 --- a/yarn-project/archiver/src/archiver/kv_archiver_store/contract_store.ts +++ b/yarn-project/archiver/src/archiver/kv_archiver_store/contract_store.ts @@ -1,4 +1,4 @@ -import { ContractData, ExtendedContractData } from '@aztec/circuit-types'; +import { ExtendedContractData } from '@aztec/circuit-types'; import { AztecAddress } from '@aztec/foundation/aztec-address'; import { createDebugLogger } from '@aztec/foundation/log'; import { AztecKVStore, AztecMap } from '@aztec/kv-store'; diff --git a/yarn-project/archiver/src/archiver/kv_archiver_store/kv_archiver_store.ts b/yarn-project/archiver/src/archiver/kv_archiver_store/kv_archiver_store.ts index e0e8ee3b639..477c0692926 100644 --- a/yarn-project/archiver/src/archiver/kv_archiver_store/kv_archiver_store.ts +++ b/yarn-project/archiver/src/archiver/kv_archiver_store/kv_archiver_store.ts @@ -1,6 +1,5 @@ import { Body, - ContractData, ExtendedContractData, GetUnencryptedLogsResponse, L1ToL2Message, diff --git a/yarn-project/archiver/src/archiver/memory_archiver_store/memory_archiver_store.ts b/yarn-project/archiver/src/archiver/memory_archiver_store/memory_archiver_store.ts index a783b4c5330..444db95ff7e 100644 --- a/yarn-project/archiver/src/archiver/memory_archiver_store/memory_archiver_store.ts +++ b/yarn-project/archiver/src/archiver/memory_archiver_store/memory_archiver_store.ts @@ -1,6 +1,5 @@ import { Body, - ContractData, ExtendedContractData, ExtendedUnencryptedL2Log, GetUnencryptedLogsResponse, diff --git a/yarn-project/circuit-types/src/mocks.ts b/yarn-project/circuit-types/src/mocks.ts index 462f92d0d93..743a0809168 100644 --- a/yarn-project/circuit-types/src/mocks.ts +++ b/yarn-project/circuit-types/src/mocks.ts @@ -13,7 +13,6 @@ import { randomBytes } from '@aztec/foundation/crypto'; import { Tuple } from '@aztec/foundation/serialize'; import { ContractInstanceWithAddress, SerializableContractInstance } from '@aztec/types/contracts'; -import { ExtendedContractData } from './contract_data.js'; import { DeployedContract } from './interfaces/index.js'; import { FunctionL2Logs, Note, TxL2Logs } from './logs/index.js'; import { makePrivateKernelTailCircuitPublicInputs, makePublicCallRequest } from './mocks_to_purge.js'; diff --git a/yarn-project/circuit-types/src/tx/tx_receipt.ts b/yarn-project/circuit-types/src/tx/tx_receipt.ts index 0f7a9dbf278..4a64176de9e 100644 --- a/yarn-project/circuit-types/src/tx/tx_receipt.ts +++ b/yarn-project/circuit-types/src/tx/tx_receipt.ts @@ -1,6 +1,5 @@ import { Fr } from '@aztec/foundation/fields'; -import { ContractData } from '../contract_data.js'; import { ExtendedNote } from '../notes/extended_note.js'; import { PublicDataWrite } from '../public_data_write.js'; import { TxHash } from './tx_hash.js'; diff --git a/yarn-project/sequencer-client/src/block_builder/solo_block_builder.test.ts b/yarn-project/sequencer-client/src/block_builder/solo_block_builder.test.ts index 2afb4e66f12..21b73c3f3b7 100644 --- a/yarn-project/sequencer-client/src/block_builder/solo_block_builder.test.ts +++ b/yarn-project/sequencer-client/src/block_builder/solo_block_builder.test.ts @@ -311,13 +311,15 @@ describe('sequencer/solo_block_builder', () => { processedTx.data.end.newNullifiers = makeTuple( MAX_REVERTIBLE_NULLIFIERS_PER_TX, makeNewSideEffectLinkedToNoteHash, - seed + 0x200, + seed + 0x100000, ); + processedTx.data.endNonRevertibleData.newNullifiers = makeTuple( MAX_NON_REVERTIBLE_NULLIFIERS_PER_TX, makeNewSideEffectLinkedToNoteHash, - seed + 0x300, + seed + 0x100000 + MAX_REVERTIBLE_NULLIFIERS_PER_TX, ); + processedTx.data.end.newNullifiers[tx.data.end.newNullifiers.length - 1] = SideEffectLinkedToNoteHash.empty(); processedTx.data.end.newL2ToL1Msgs = makeTuple(MAX_NEW_L2_TO_L1_MSGS_PER_TX, fr, seed + 0x300); diff --git a/yarn-project/world-state/src/synchronizer/server_world_state_synchronizer.test.ts b/yarn-project/world-state/src/synchronizer/server_world_state_synchronizer.test.ts index 5549ba2705f..86923600b4d 100644 --- a/yarn-project/world-state/src/synchronizer/server_world_state_synchronizer.test.ts +++ b/yarn-project/world-state/src/synchronizer/server_world_state_synchronizer.test.ts @@ -1,5 +1,4 @@ import { L2Block, L2BlockSource, MerkleTreeId, SiblingPath } from '@aztec/circuit-types'; -import { Fr } from '@aztec/circuits.js'; import { createDebugLogger } from '@aztec/foundation/log'; import { sleep } from '@aztec/foundation/sleep'; import { AztecKVStore } from '@aztec/kv-store'; From 932e2916036d2c3b4aae005260e2cd35eedc6306 Mon Sep 17 00:00:00 2001 From: Santiago Palladino Date: Fri, 8 Mar 2024 20:05:48 -0300 Subject: [PATCH 07/12] Fix l1-contracts test data --- l1-contracts/test/fixtures/empty_block_0.json | 10 +++++----- l1-contracts/test/fixtures/empty_block_1.json | 14 ++++++------- l1-contracts/test/fixtures/mixed_block_0.json | 16 +++++++-------- l1-contracts/test/fixtures/mixed_block_1.json | 20 +++++++++---------- 4 files changed, 30 insertions(+), 30 deletions(-) diff --git a/l1-contracts/test/fixtures/empty_block_0.json b/l1-contracts/test/fixtures/empty_block_0.json index 6112dafd791..5769185f450 100644 --- a/l1-contracts/test/fixtures/empty_block_0.json +++ b/l1-contracts/test/fixtures/empty_block_0.json @@ -35,7 +35,7 @@ ] }, "block": { - "archive": "0x0d4cd37d38039b4184c4b1bb3c7ac5175ea704b5921c79b14c162d1d44fa1718", + "archive": "0x12e61edc1dad6fb9e81e4157d0906a171a2d2cad5daa767594eb07b7e7c1c189", "body": "0x00000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "txsEffectsHash": "0x9139297703640b243028d35c29ae8c0667886c4edc8db5f879c260d2051bb8a9", "decodedHeader": { @@ -50,8 +50,8 @@ "chainId": 31337, "timestamp": 0, "version": 1, - "coinbase": "0xa25fcdbc69bb83c7e6184cb7a93d35841760637d", - "feeRecipient": "0x013a8e44ae7bee1dad2d8c88bddca98035b3fe32796a14d581f4280b3c6b5720" + "coinbase": "0x837ac4b411a7a5911031e82d3f8799bb21c34795", + "feeRecipient": "0x1296779221953ecf9e3c115440521940f216ca20b860f64f13af55b8cdbdb9c7" }, "lastArchive": { "nextAvailableLeafIndex": 1, @@ -78,8 +78,8 @@ } } }, - "header": "0x012a86560737adb075e12af8253fb09abf17aa841fb56d180bc89f0d2d473c7f0000000100000000000000000000000000000000000000000000000000000000000000029139297703640b243028d35c29ae8c0667886c4edc8db5f879c260d2051bb8a90000000000000000000000000000000000000000000000000000000000000000c78009fdf07fc56a11f122370658a353aaa542ed63e44c4bc15ff4cd105ab33c1864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f800000001016642d9ccd8346c403aa4c3fa451178b22534a27035cdaa6ec34ae53b29c50cb000001000bcfa3e9f1a8922ee92c6dc964d6595907c1804a86753774322b468f69d4f278000001800572c8db882674dd026b8877fbba1b700a4407da3ae9ce5fa43215a28163362b000000c00000000000000000000000000000000000000000000000000000000000007a69000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000a25fcdbc69bb83c7e6184cb7a93d35841760637d013a8e44ae7bee1dad2d8c88bddca98035b3fe32796a14d581f4280b3c6b5720", + "header": "0x012a86560737adb075e12af8253fb09abf17aa841fb56d180bc89f0d2d473c7f0000000100000000000000000000000000000000000000000000000000000000000000029139297703640b243028d35c29ae8c0667886c4edc8db5f879c260d2051bb8a90000000000000000000000000000000000000000000000000000000000000000c78009fdf07fc56a11f122370658a353aaa542ed63e44c4bc15ff4cd105ab33c1864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f800000001016642d9ccd8346c403aa4c3fa451178b22534a27035cdaa6ec34ae53b29c50cb000001000bcfa3e9f1a8922ee92c6dc964d6595907c1804a86753774322b468f69d4f278000001800572c8db882674dd026b8877fbba1b700a4407da3ae9ce5fa43215a28163362b000000c00000000000000000000000000000000000000000000000000000000000007a69000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000837ac4b411a7a5911031e82d3f8799bb21c347951296779221953ecf9e3c115440521940f216ca20b860f64f13af55b8cdbdb9c7", "l1ToL2MessagesHash": "0x076a27c79e5ace2a3d47f9dd2e83e4ff6ea8872b3c2218f66c92b89b55f36560", - "publicInputsHash": "0x1fb9d50c8c46ba7fb9e4827d38e389e90f85f83ce81fd2f27b129f01de3c7607" + "publicInputsHash": "0x14d3a7d947fc1660f01d5f41f7768d9bee4a74809484cc80535183daf0346d1f" } } \ No newline at end of file diff --git a/l1-contracts/test/fixtures/empty_block_1.json b/l1-contracts/test/fixtures/empty_block_1.json index 8b6a29ecce8..94c96156ebf 100644 --- a/l1-contracts/test/fixtures/empty_block_1.json +++ b/l1-contracts/test/fixtures/empty_block_1.json @@ -35,7 +35,7 @@ ] }, "block": { - "archive": "0x0c67e240abf1f98b3e8624dd39f29a3f1df77d688680ba96c770fbe170f3b3c8", + "archive": "0x2eb0c375f9f387ef03e8f470f7f976a8213cf31a514b72cf3499a8dd251deb57", "body": "0x00000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "txsEffectsHash": "0x9139297703640b243028d35c29ae8c0667886c4edc8db5f879c260d2051bb8a9", "decodedHeader": { @@ -48,14 +48,14 @@ "globalVariables": { "blockNumber": 2, "chainId": 31337, - "timestamp": 1709933340, + "timestamp": 1709939104, "version": 1, - "coinbase": "0xa25fcdbc69bb83c7e6184cb7a93d35841760637d", - "feeRecipient": "0x013a8e44ae7bee1dad2d8c88bddca98035b3fe32796a14d581f4280b3c6b5720" + "coinbase": "0x837ac4b411a7a5911031e82d3f8799bb21c34795", + "feeRecipient": "0x1296779221953ecf9e3c115440521940f216ca20b860f64f13af55b8cdbdb9c7" }, "lastArchive": { "nextAvailableLeafIndex": 2, - "root": "0x0d4cd37d38039b4184c4b1bb3c7ac5175ea704b5921c79b14c162d1d44fa1718" + "root": "0x12e61edc1dad6fb9e81e4157d0906a171a2d2cad5daa767594eb07b7e7c1c189" }, "stateReference": { "l1ToL2MessageTree": { @@ -78,8 +78,8 @@ } } }, - "header": "0x0d4cd37d38039b4184c4b1bb3c7ac5175ea704b5921c79b14c162d1d44fa17180000000200000000000000000000000000000000000000000000000000000000000000029139297703640b243028d35c29ae8c0667886c4edc8db5f879c260d2051bb8a90000000000000000000000000000000000000000000000000000000000000000c78009fdf07fc56a11f122370658a353aaa542ed63e44c4bc15ff4cd105ab33c1864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f800000002016642d9ccd8346c403aa4c3fa451178b22534a27035cdaa6ec34ae53b29c50cb000002000bcfa3e9f1a8922ee92c6dc964d6595907c1804a86753774322b468f69d4f278000002800572c8db882674dd026b8877fbba1b700a4407da3ae9ce5fa43215a28163362b000001400000000000000000000000000000000000000000000000000000000000007a69000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000065eb831ca25fcdbc69bb83c7e6184cb7a93d35841760637d013a8e44ae7bee1dad2d8c88bddca98035b3fe32796a14d581f4280b3c6b5720", + "header": "0x12e61edc1dad6fb9e81e4157d0906a171a2d2cad5daa767594eb07b7e7c1c1890000000200000000000000000000000000000000000000000000000000000000000000029139297703640b243028d35c29ae8c0667886c4edc8db5f879c260d2051bb8a90000000000000000000000000000000000000000000000000000000000000000c78009fdf07fc56a11f122370658a353aaa542ed63e44c4bc15ff4cd105ab33c1864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f800000002016642d9ccd8346c403aa4c3fa451178b22534a27035cdaa6ec34ae53b29c50cb000002000bcfa3e9f1a8922ee92c6dc964d6595907c1804a86753774322b468f69d4f278000002800572c8db882674dd026b8877fbba1b700a4407da3ae9ce5fa43215a28163362b000001400000000000000000000000000000000000000000000000000000000000007a69000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000065eb99a0837ac4b411a7a5911031e82d3f8799bb21c347951296779221953ecf9e3c115440521940f216ca20b860f64f13af55b8cdbdb9c7", "l1ToL2MessagesHash": "0x076a27c79e5ace2a3d47f9dd2e83e4ff6ea8872b3c2218f66c92b89b55f36560", - "publicInputsHash": "0x162f1283e9286bd320ece105c07c15059c55f8da5da77b8892e0b2e328c39e8e" + "publicInputsHash": "0x18091cbbf29dbe3cd4e5387ea7cfa360121b458b5fb9229ff822cfd32288436e" } } \ No newline at end of file diff --git a/l1-contracts/test/fixtures/mixed_block_0.json b/l1-contracts/test/fixtures/mixed_block_0.json index 63328a25a61..d128737e1f0 100644 --- a/l1-contracts/test/fixtures/mixed_block_0.json +++ b/l1-contracts/test/fixtures/mixed_block_0.json @@ -52,23 +52,23 @@ ] }, "block": { - "archive": "0x0906ec56c4b26551de28a357993a893da99366977732263a996dd928bd232fba", - "body": "0x00000010151de48ca3efbae39f180fe00b8f472ec9f25be10b4f283a87c6d7839353703914c2ea9dedf77698d4afe23bc663263eed0bf9aa3a8b17d9b74812f185610f9e1570cc6641699e3ae87fa258d80a6d853f7b8ccb211dc244d017e2ca6530f8a12806c860af67e9cd50000378411b8c4c4db172ceb2daa862b259b689ccbdc1e005f140c7c95624c8006774279a01ec1ea88617999e4fe6997b6576c4e1c7395a22048b96b586596bd740d0402e15f5577f7ceb5496b65aafc6d89d7c3b34924b0c3f2d50d16279970d682cada30bfa6b29bc0bac0ee2389f6a0444853eccaa932b2a60561da46a58569d71044a84c639e7f88429826e5622581536eb906d9cdd25a2c0a76f7da6924e10751c755227d2535f4ad258b984e78f9f452a853c52300e212d8e2069e4254d81af07744bcbb81121a38f0e2dbed69a523d3fbf85b75c287ca6f33aadbac2e4f058e05924c140d7895a6ed167caf804b710d2ae3ba62b1b51297b3ea37637af6bd56cf33425d95cc5c96e9c2ee3077322fbec86a0c7f32c15d2a888c6cc122e99478c92470a1311635142d82ad7ae67410beeef4ae31f0902ba2fb964922a4610bb18901f7b923885c1d034da5769a48203ae6f0206a92855e2c01ddb3d6553386b5580d681b8230fa4062948668f834f23e0636eaff70aaa64519aafdf4b040bd2f9836e76b9dc13cfec8065dcdf2834d786e06260d100000004380000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000014100000000000000000000000000000000000000000000000000000000000001420000000000000000000000000000000000000000000000000000000000000143000000000000000000000000000000000000000000000000000000000000014400000000000000000000000000000000000000000000000000000000000001450000000000000000000000000000000000000000000000000000000000000146000000000000000000000000000000000000000000000000000000000000014700000000000000000000000000000000000000000000000000000000000001480000000000000000000000000000000000000000000000000000000000000149000000000000000000000000000000000000000000000000000000000000014a000000000000000000000000000000000000000000000000000000000000014b000000000000000000000000000000000000000000000000000000000000014c000000000000000000000000000000000000000000000000000000000000014d000000000000000000000000000000000000000000000000000000000000014e000000000000000000000000000000000000000000000000000000000000014f0000000000000000000000000000000000000000000000000000000000000150000000000000000000000000000000000000000000000000000000000000015100000000000000000000000000000000000000000000000000000000000001520000000000000000000000000000000000000000000000000000000000000153000000000000000000000000000000000000000000000000000000000000015400000000000000000000000000000000000000000000000000000000000001550000000000000000000000000000000000000000000000000000000000000156000000000000000000000000000000000000000000000000000000000000015700000000000000000000000000000000000000000000000000000000000001580000000000000000000000000000000000000000000000000000000000000159000000000000000000000000000000000000000000000000000000000000015a000000000000000000000000000000000000000000000000000000000000015b000000000000000000000000000000000000000000000000000000000000015c000000000000000000000000000000000000000000000000000000000000015d000000000000000000000000000000000000000000000000000000000000015e000000000000000000000000000000000000000000000000000000000000015f0000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000016100000000000000000000000000000000000000000000000000000000000001620000000000000000000000000000000000000000000000000000000000000163000000000000000000000000000000000000000000000000000000000000016400000000000000000000000000000000000000000000000000000000000001650000000000000000000000000000000000000000000000000000000000000166000000000000000000000000000000000000000000000000000000000000016700000000000000000000000000000000000000000000000000000000000001680000000000000000000000000000000000000000000000000000000000000169000000000000000000000000000000000000000000000000000000000000016a000000000000000000000000000000000000000000000000000000000000016b000000000000000000000000000000000000000000000000000000000000016c000000000000000000000000000000000000000000000000000000000000016d000000000000000000000000000000000000000000000000000000000000016e000000000000000000000000000000000000000000000000000000000000016f00000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000171000000000000000000000000000000000000000000000000000000000000017200000000000000000000000000000000000000000000000000000000000001730000000000000000000000000000000000000000000000000000000000000174000000000000000000000000000000000000000000000000000000000000017500000000000000000000000000000000000000000000000000000000000001760000000000000000000000000000000000000000000000000000000000000177370000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000024100000000000000000000000000000000000000000000000000000000000002420000000000000000000000000000000000000000000000000000000000000243000000000000000000000000000000000000000000000000000000000000024400000000000000000000000000000000000000000000000000000000000002450000000000000000000000000000000000000000000000000000000000000246000000000000000000000000000000000000000000000000000000000000024700000000000000000000000000000000000000000000000000000000000002480000000000000000000000000000000000000000000000000000000000000249000000000000000000000000000000000000000000000000000000000000024a000000000000000000000000000000000000000000000000000000000000024b000000000000000000000000000000000000000000000000000000000000024c000000000000000000000000000000000000000000000000000000000000024d000000000000000000000000000000000000000000000000000000000000024e000000000000000000000000000000000000000000000000000000000000024f0000000000000000000000000000000000000000000000000000000000000250000000000000000000000000000000000000000000000000000000000000025100000000000000000000000000000000000000000000000000000000000002520000000000000000000000000000000000000000000000000000000000000253000000000000000000000000000000000000000000000000000000000000025400000000000000000000000000000000000000000000000000000000000002550000000000000000000000000000000000000000000000000000000000000256000000000000000000000000000000000000000000000000000000000000025700000000000000000000000000000000000000000000000000000000000002580000000000000000000000000000000000000000000000000000000000000259000000000000000000000000000000000000000000000000000000000000025a000000000000000000000000000000000000000000000000000000000000025b000000000000000000000000000000000000000000000000000000000000025c000000000000000000000000000000000000000000000000000000000000025d000000000000000000000000000000000000000000000000000000000000025e000000000000000000000000000000000000000000000000000000000000025f0000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000026100000000000000000000000000000000000000000000000000000000000002620000000000000000000000000000000000000000000000000000000000000263000000000000000000000000000000000000000000000000000000000000026400000000000000000000000000000000000000000000000000000000000002650000000000000000000000000000000000000000000000000000000000000266000000000000000000000000000000000000000000000000000000000000026700000000000000000000000000000000000000000000000000000000000002680000000000000000000000000000000000000000000000000000000000000269000000000000000000000000000000000000000000000000000000000000026a000000000000000000000000000000000000000000000000000000000000026b000000000000000000000000000000000000000000000000000000000000026c000000000000000000000000000000000000000000000000000000000000026d000000000000000000000000000000000000000000000000000000000000026e000000000000000000000000000000000000000000000000000000000000026f00000000000000000000000000000000000000000000000000000000000002700000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000027200000000000000000000000000000000000000000000000000000000000002730000000000000000000000000000000000000000000000000000000000000274000000000000000000000000000000000000000000000000000000000000027500000000000000000000000000000000000000000000000000000000000002760200000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000341100000000000000000000000000000000000000000000000000000000000000540000000000000000000000000000000000000000000000000000000000000054a0000000000000000000000000000000000000000000000000000000000000541000000000000000000000000000000000000000000000000000000000000054b0000000000000000000000000000000000000000000000000000000000000542000000000000000000000000000000000000000000000000000000000000054c0000000000000000000000000000000000000000000000000000000000000543000000000000000000000000000000000000000000000000000000000000054d0000000000000000000000000000000000000000000000000000000000000544000000000000000000000000000000000000000000000000000000000000054e0000000000000000000000000000000000000000000000000000000000000545000000000000000000000000000000000000000000000000000000000000054f00000000000000000000000000000000000000000000000000000000000005460000000000000000000000000000000000000000000000000000000000000550000000000000000000000000000000000000000000000000000000000000054700000000000000000000000000000000000000000000000000000000000005510000000000000000000000000000000000000000000000000000000000000548000000000000000000000000000000000000000000000000000000000000055200000000000000000000000000000000000000000000000000000000000005490000000000000000000000000000000000000000000000000000000000000553000000000000000000000000000000000000000000000000000000000000054a0000000000000000000000000000000000000000000000000000000000000554000000000000000000000000000000000000000000000000000000000000054b0000000000000000000000000000000000000000000000000000000000000555000000000000000000000000000000000000000000000000000000000000054c0000000000000000000000000000000000000000000000000000000000000556000000000000000000000000000000000000000000000000000000000000054d0000000000000000000000000000000000000000000000000000000000000557000000000000000000000000000000000000000000000000000000000000054e0000000000000000000000000000000000000000000000000000000000000558000000000000000000000000000000000000000000000000000000000000054f0000000000000000000000000000000000000000000000000000000000000559000011000000021c000000b01a5568558c12530da31799aa88c869ca032222166bc108860f6811683ea22f4f39b931529fc806daa67640ffb924d9780172bc7552300b5daa3844337d8d6fe72803872afd995690e66e60754811dbed7e92f45bbca263a00ccf7177fac6cc90bbc65bdc1d1eeaf82eb1b3466b536f1b0b97f3fb0b650851fb1f4cde5ef303d689a0de66a799b5dfdbb86483dbc5a7070fc810b52aa50729d8e85d6ddce7f28e75444e6c22b26b31d75f075f51ae8a63000000b000c26f7e694358457ebad64680f0520aa891119ef7788ccb76618a48ff13b21a94be66c30931eb69eeec76ab6cd4d44e71e20fabd663210ef6da9110df68c310d4cf2103d896c3e39ea25d2f10d91518a64f85b0d34e52db7214bedaf639a8ca9d4509fd4c8f5fa4177720bf460d892b1c25dc28d946c99b374aa251947cfd89e08947a6396963a9d627e1dfee30eef802d3307ced1b67402a7e8c17c6f3953909fde0abb7c25bd5ae0065455d5e5c8c000000b01a39502351a62e09c4054fd038dcc9b4e2ca809e059a5891b9120c1f97088363a15f27593d63fb63bb5ddae21b3dd4c413957754d1253b313bf9aedcbc3f29c8464c3314a0bb2784994e87e1ada171a34aa02069a4d8361b7b4626fc3367c421bf85c685463faef18a400ded6ff81c12162ceaffbcfa555d62180e6ec59739a07d0546d107ef07d5c04fde75e6d0b3641b620da8863012d7e38c68ec3d6bd0049c1d6b4f8115e2ce3daf3124437c143c0000021c000000b0295919cb2a8fb7184356130b60ca4342f4ef90311b9656cd07a11443e261b6ed0abff9099e9d4116de3d89d806b38216267fd032d95b9540c7e47a07066a0f10bb8646803942f53f46d7f8668d02d0491fe25dbfde564e152e6e4b3007351038ea79547010a0f5b7bcd76d60bd94d9d522c5ee7fb5673442f2badc2a22157f0c6d68507ddb3636cb4f8fa65d7c5d2fd113898f5e80d0b48db0696e7fae2c7714389cb349523937632a69f863cd18df3c000000b02ee2ecda6910d9e71379853e825f688b96e1b0d794b9fd8c51f688eeef326406ecbd969d5a538d3b1283fa9c83d569090189889555b58961a7dfae7790c2b002404739a5c02d2907125c8d6c779ed1d2efd0a5b0f26bf85521be64837cdfbad95d8049cb5890906dcb99843b202f65e510e989a3a22951485bf7d186d345f3d468067deb077669ce1958b8a22e843d5f1de8703d0ac4ea1d2e9d7c1da0ee099a22f990d2cef9e7c9526044bb747ac199000000b00645d668b18af55d7b2529011743650140e6e1d583f49a8de9eb3d3b89d283cf26571a20ac490d4ddc4c872b5faa568568538dcff8ec068d2d0296de107a71a811864065ea1060320ed401f5a8febdd1dba1fb177003c56081d9ee4f17948ed7348681cd51c06198377769ee1d68afa42ce51af6248e963e8e8e86d7f24e5472341c1351fd59fa7f9e5207c3d6e9519527ba1b1837c6e665d4b34b34121c6c5a8ed74a475c6a16955ee9e668467cef3d0000021c000000b00d0932f4c988acdd1b78cfcd566b6c167fa6de5560e351e5b81202d8ae867956d93287b9e988be11a72f830d40d6dc0639a78b8f86b83103f4084fbf009cc469337aa0188ba8ffaf895927fc33b34362087de4a5ffe82a14bc59b23e47cc64c2d65dc59d7a50be54e9c500af1dc1bc930b52a49d2ea4df3e9c845f376250ad98be8cf9205fc1a4cd52ef26b0e8bdf0ec29457264e0962bff8ba5c0a94e611034bd6f9ec8a10b44f90aba042c59917254000000b02883646d2dd6a4cf34b39b65c59da91588e3953642868292367894af8f06206c5a744ed832f8cc6dea898e5ebb8320c13b7ebf038d6cf4b0bfc0d816224a387feffd62811b7801e6d205fa3a89f38e054984f971baa16c45773a9de518f01bf7cbd717aeaf81cdfc4e7b5738a1ce7e3b1177fbc13344e5662aa58056414a37841fa4776279a4cf488890964248aeee340018f58d80c44afd9f639cdff4d81fadfcb1d097a97b6bb22ff32bf4bd6822ae000000b01544a9eaa63352f92e07dba2eb7ed3ddc15a57d716f29e56cd996284690df7f48eaa31b2c3ac8ef4c2c505263718cac51cc0b0ac1ecc6006921b660f3a77407d322db7af97bdff2b86a74258739145308ddcc641f2181b116c5e5a6e70c75f4038fac614b56603769a5090c301bb4ecd234c0864af10bc906bb5ae28eb893b3d1a20a7bd3b5b556367480d20cb36bc2901dcd6f4170dc46272404948fc51142b593e42544ff35b9f8ca091163fe6fc460000021c000000b02979dc27bfc5121a9b1c62b2c3eae5aa19237909a3e937524d05a98c838fc7d5c175367a4dedc09661cc38c8518b09444e36a2c96706459868316814b6d023b9d10eefb529f49d500dfbf526461dcea9af6cc54a78ae62cb9a9cf73cf2900244d95834d6194277b48c3dc11e1dd64edd0065088a3f7d6c03e404a7f6b500d2eecc894651872c4714952eda1502f512cd133c0ea809fb7152dc8338f79feb749a0ef64be9c13752752e2d719fc79fb3cb000000b00158816d22fa520231393b1bde4d24d6f6417263c40dafc70e371951f4ea629d1bc9aea38603ebd47bf478cb86e413e0bc74dcf44423b86878a8655724ef9cfb06f6f5216c2a56f3483b40067c7ee5d12cc3b2b89b944f01d122c202b9c6afaca588b523a7c8e617ddb0271225469f061f3d14724e45ca1d33f49d3d69a909f8b4242cd50e22a30ec4f58d42160e704116ed831f75b50267eb485606e0e66962bedb4ec5be3208e68f7bff60bfe55150000000b00dcde2ca2a7ecd3764a65ba5b37802c1b92e844412340fbcce08c402affb1424aca56ff63db2ce654dd9ad9c766cb6cc772dbfc253f2448fe6e27ba68e86fff2ae320fae8b08e192872a5bde4201cdb3dd0b3a703d52b50a5b3c8d086894ee7d28ef1ab51109e49be12ec06a69ae7f6727b830255ceb30b7d7474b0354dbeb7e7adabe079775abc9290d6fc4c2a3c03e2681c7d50563c64e09d5fd354b56098a1850b84cd521f8a7b1c42cfc485f8dda0000021c000000b0215fd22ba7b99075370219dce247f9c7b234c14cdc5917232d360557937e4016722ee2d383b03f8f814720b01da02fac6b8ad1e4414b7829f115d6a522065dec46f2414516675dab0511ee03ccee700d52486724b7db90012e2b7adc19ffd43a631b3335cb92f86d4531aad9be85a281051fc0483022b3df4caee0538fb1882517ccabe814a18a4fd7262ac195a14abd27bb74d9dadbed6bff555f8d69cfd1b2b28a07c7475d011f30a168ea65477947000000b017cccb424a8f9fc1e0bb8d18368ed51d56ded42e7698eaba8cb8f33239c91a14e6cc075d25aece387e32a4d36fa8e0fb236c3a856e8e4c1be56e89e4453d847eeb1a73a4a50b217159202a8d59e331d36bfe761b2694a79994f9c7d3635318b3658324e154d749961d9f43799756838201305cf00216e778f655e16c9283fce5af1d4e304a489994fa6c57bf0eb9e99208f013d58b2799de2d04a57e283a47a7cc32d98eb3dba49dfbadee8cf62c7b46000000b0109e957b39080c8bb69d6ae4c9fa9e39df8325e109b3ac57f913ee2ceaa499549dbe55c410cfc7f75825f052776e97df0df784602f9f1eb46d232a7c397b21b78b762e341c5bc928fb6f8a774bce30dd298783922435c4d5f9f1569b133b5fca84cf3f78ecf2985f730bbf44513d7a9811f672a057822575d675282ac7e8f8d5ea15f64b4be6e44e4e9faf5bea03d1cc1efe88bf1a564f3ba4e4be4841c2da0b9967e8db3459d9cce8b8eaabda8438630000021c000000b02242ce84431ddfbb9bed8a1c490a8ffdc7e8082e9fe48767a1ecb85153f137701c1883b17e8da1183e7d169d0c95ffdc6d156d9cc336192412adf771648ae74015794f03b09b7e714586fd9aaa261b302de8461681adc47a4cd62ab2f448c6b5a7e4e8021e3d3f2d6d47199a8a9cec5f28f9f90fa6ce970eeacab31911c5fcc7e736e961d7f3bf52ac8f81e6c626e3a407f511569068bc37cd2022b30bb07f189a621c5afa0ca3d38dea20df474a7513000000b0176083ba9d702ff813d58ae969a244fb5ddf4fbcfebe958fcca2ab9cc519b4f19321e5947c907de087f1962e285cc1997bd64f26a4dd570d11f05b6d5eaa0b7b5b1cd648b767e03f9da9a370a45c04c4fcfde5dda4e91c52e23b2b74917a7c54d962aa00d8aa4009e5f5894291ab245124dca69335a1e4deb5d2261374277f80d80cde1cb3efcd5cba147b87db7e48662bc3bab63482724ebdc290bd56d899a446e45edf7ff6cb500fc7c42c20c5a76b000000b012f7dda46a5455a27435ddc17e28ed68b2b453b535bea9951103c653532eca3f1482d33e12c338543b66434b9cfa97d7258dd4649e4bab6477eb0bc495629f63505d4f2cac9db65f7b26dc550cc078b5557e2fd7c16944ee32817cd01360068e1f48041f42ee58cc1433a7f728e528270be336b184013ecd3e6a9864c064fb4dc6bc04fbf8343132a65f993c23a1905f155a5e27ea21a532d181dfbc0fbbb98b4350259e1a959606848dd8e3913fe9b10000021c000000b0087fa6bb44faf0e4adf6c2f94ba12e825c76b0349fdd8f35abbd5bb2acfc8fd080d08c9e7cfdc807254d34a562434e746fc44a2d1d9108b5f27c60f4d71e030f1c64aaaf8a7faccf3db38bded6e00b56dd09854b2778d070d236adeb799b0f9c95ab733a13924693a8e8f8d691e7e5a51816173878716b95a6e01a8ac83be643704a7fc46fb53a1008ec9bd84d4e4ff0160e960cddd01b8307610a7d58907e46196cb55fe01f74e8ae7f0ea0a02bd8a5000000b00ab73e1ee85dc9dd35a66a0c11cd1835f01693398fd642891ac397de22cb69d611eddada0025f62ae14441af47730e8909f206c91ae33864714abb5c8cc4ecb25f59bc9b780e7b40a0395dc06623618c4885677ace7d05cc262ae99f0fa96d2b8ff4c37674bc4c415e9048ca9ccb31980ae21fff96735d2fa6d52a4e6d495c8ee3c18f5b597fcd305c01304222bff41816cc3464d8e8edc278b59186f33101898918e31d2e8a290ef7a0d163d84ab5cb000000b02ae3d1db0a0cc3035c6f57c054627fb7fc997b8f097ac5369fbdad51317120ddb6a5190684b6e9f50d1ab7715c7dffba029baa20ef7f7b97e69a90f15ab6af1f6ccfc001d367d7411790e8b09d767e13a8a679a0bca2d010a6b5009bdbf0b10dca420868de5481c3e16cadfeaa82cfad2c14e0df51d9b897e3f07a4ee20c64e80aa3892defa02605a24ebd43a21570180d0c8e91b356059651a6b2c782302546a44603791a5e788127b9f859461ab77a0000021c000000b00447f275e5c1d0a18fca17c99a9809ebc951d6ad8d8b8aa910edf999c178069fd1db501f29765f7403de7a5516055b48a93ca8d368478add185e6009fd2a53606e4066f8a4b03cf5ee4053acdb973485099edfad97b47a06889a9d1a5a6ebf01ebbf1fde830ef00c35bd7574d479299e03b85cfccabef36df8fc40128409c029413c98ce2a715e900c804e050cbc96ad2e7c8237f7bdaab5ca389962be8482e62b12b0ebb9e24dd6d122c6d697314abf000000b00912ff270c000e6867fe3aa3b49cf2b91ada813dc5949709361cf45390ea436aff8a13bd48c1c18fab2979da9eece6edae35390e73e344d565e6f14dc90b36066a59edffab3ffb0ddfa6e5aa5cee3145ea806ca59b1a79f5ea63efc993e9673b54dbe14a65c73f7002081c439ceb63fa0910f281536433c9daca6e2f139cb10693db9fae024e78c7008316258880c8b22ca5ad798eab727600b6a72f41ac6a6c267186b9dc5ab883e1ebbc399fd53820000000b02116c7fbbe2babbbd515d152e6abe084c0b2b6ee8bc8ca9358c5ab884f533f333697d45868a8eb589273fe1b32a4c1778f93b75176616130f0e8ae5404660f813caea57337d5f9b0d416c811f79ee99a4f3e948dbd9f0c6b8940773d6d64ae361a60f8d0ef78d42c8ccc01490417201b0b0087f47cea8e6d0787a90e9aa0753cb9f0306f4b67c7cf2601f2d561a6fec415a10675552041e81f14e1dbd8cc37fb64f79519f879a6eaf5535369150b6c8b00000fa400000168000000b0044389cc8dcf3d6348524ea264445e043eb548dc44808512893d7251501f61f683a661b49d995ea8dc61648800b50655c20ad3f2c6d638b0bbfeafd34685b3567f5617ab56f3eb9c978e2bc520695edb90d7062b02ae30738c4e6369a5e11b93c3268d46f8503bb609f9b5edc017b7b8173b7ef48eb50538bdc5892c733d4ad6b16089291a2ba06bc6dfba96981eca22216401df580e34f6023f6c84548137cd7aab076361e4d1a36e639867095e0965000000b027cbc7b6ed8e3fcf44579f7e0b4cb0a09cc7b10e07a646ac0cf1dd6f5be6692569e83310be29c9fb164f261cfcd109b130f5b3600ceae3420148fa1625e2cf84b13035bfbe7adfa5930fbfd1ceb0ac68a52dd77f0ccadf894550919b1def5e812065fe3a97a1521656ed192a3239e1710ac774ac64142e7193937e87d877af4b2f369d4e8651052d2670a4cf6c48709306b99cfc5f5bb67d679d8d1d9231a9b36919bbea0c2b4e21cd1bf07cbc5f9a3b00000168000000b0155efcfb94071c840d1cc0af0e51b153e5a6210ee3141fb1597377ea320e74001fc6db79f4e8a7e1bd57a089143b9badd04c7d89025b7c20947ddc9c62af7a9b7f561c07c16d9427c0fc27d7fa43574b7fe3818f917d97ba65d20e6eebfbe02b05d122c1a9c6844c76eec3e8865bd5930fdab60d4ccc357aec664f9cb92cd1be9564adc9b229240b6b10d3785c623c6d1961eded46f5bd56992ba5764fa7f06013b97d684db809e62c2380b30254e0e3000000b01eed34a3547661edfe0399e0030c8c29daa3226059e371f50c41afcce40becbff42c32b558e3529795230f6f3082131d75ea383f5df387112b6ed6383c58a5727d86087ed14fd5eca548dd46a19a01ec9d4979f747d2bd6c0bbfc466fa91dc2c7e4b5564ad2705b190437444351b040002b8469f608c07b1e7bdfa105c92bbeb9fb2072408d0944cd7d2e203a5cd7d7709410a42c09780d254bb15deaf4a4ca0f3ecf8d6d96afdd2cb373afe93a8ec1d00000168000000b00c1a07f1940179af2aed89f43def74322b67fef29c7dd1e8cd0d932c2c84dafcec55f63a727a544500d886f0fec4d7563c0f1f5ac79cdc6adda98fd4f3696641cf34baa4c42fdee50b4f76e9651829c6ceaab93f2c0ec650486d7a7fd3736754606ec6016c50b7ec031adf60a812bd0307742ac003f927ef04204f0db6695156a52c17d664ed2009d0f2d5d6e5928492149879cf90d926d9b9822d7bcaae3a1fd063c066df40eb7f96994f5dbe070cc5000000b012851a6b29e839538be0360dcfe52bd0a4252a5630c8406b7d32492a444b55e635e986d3ffedcf083003745dd643f13046ca0ccacd9fe93843d46b1063cfa9787be6b88ff1cc815edb513185821922e1872cdc9ecf486f83f86df4fa49fa2688d5ac048d9d9013158416246e41aa023728593408cc660cb5896ef694d4c30bdb3982599286e655e065f8567f7ff19c05270859a1e667fe6d01d7240fdfcd21d3a3573a10672bc6292b1382cde7671ebd00000168000000b01ba847254f1a3ba4f275ccce9764ff3d8be1161e42f5335de8523dce0eebd4b6effe16c244e517d1d95272bf915ce7841540843a4552b9e8ed2d884bdc71389c0b8bbc53daaa7e2e3fd02927979d681be6272020ee57326e42ee380c530577f3f9b6f7ed47b37e275de608b1adb3f9502b8bc7183588d913c4804bebc8b9ba7f040f3e1727b0d55958b7d128a8fbe5631e278b86f9b06a5ade93cc1e010bd90b508417a7b73d0bb0f82c6a2b3c35e953000000b0276a33ea28f0b9c977c266e32090bd55c4c9aae4029d72861ea436965029da6083bf372d9ee913cc5cfd307b312baabf3cf1624d2ec4ad63fd028f26886dbe9230307f59e7fe3ef1a2cc9622ca8427b1dbaf7e97127956f9ee017d2a79efb5972d0242786b0c2a9d7813be5223c745e22b927915f1cea90ae558d9e0d9ed4a064a89f5993dd209a95fa9156998f509161ad895e68ee32a4200b4311899f1d72425bfeb9120538640b6f55635c877cf1200000168000000b0195e6f16f14e98308c3ebb08b80e89b70d9b71d864ddc3213454500980219e5fdfdf533a89f8999223c5c7d082b54e2c5c0d98aa10c596c20be6d82b3ab3db91538b23965825dce3ca1b59653fb5ba7f4971dec683be78c764c5580e04b6ab3712a31f1a850f197464357e9ea89c2df6079c82c0f0a6a6e052c9102b829bf0cf676a1d34a7cea3a9704cbf41d574999326614ddbd28e78178b0d267b2d1e25461b80ddaa80420af93fa42a51a10a8b59000000b019279468a7ae0584b6b5ae253516a5e88b9228365ac497e6402511eeb4c00c9e3e21141798c081b47c5a778872fced9961c8d7aa055eceba002d9ec8f69a294f1b5247e959a33a939a4b5b6ca2478ffa4a72bf1002158bc0973f4027a405b4a275e3163af5f43188ee37a58115a5159108dce88b108d15b77f5bbf306b01b9d921f6310bb0b76d9c90bc32fc73299b532f1f6875e880c9c6f1e1a1c85473b7682d1bef34aeb08e9706452bf8a65f523e00000168000000b020c20c343d86d8196bb550d076517e50b991ed7a05aba59093a15c8484956b8838686c71b54f2aa5395146fc829073b7c40b12bc3864dcf31c66ea8c10d436e027523427acfe13b34bdb4c583d9a42b5184ca52ed2e8d60b6319b9e25ec8edf286c4b0e5bd27b62d7e21ca95559fc6ff2cd8f4d6c6acfce0d538b9a33e4784844c0659847098e1b5947732c82d9fb04725493139748613d8d1dcfe59e069556ff498a58fa3c1ec9e7e3959c4937fdbd6000000b016acf374b1f51a9c4721c36605e8bff3fefcfb46cd0415271acf9b1200164a4d7d0168939ecf4df91f9e6b7025c8d4b2e063bf2e6e6b432c1542f1482f18b34511036b4cc38cf9fac723536f2a8c16d92cbdccbb714daa16bf8fbd69bcb0a69d1a7c96e9ca1b0cd714b95dd12eb020100d984b949463df584f209f649362a18a548d04044c57d6f59533886c98c9ad1507f274c2df78531196f455e5f1b4915307c79887199db28a7acbef65cec063dd00000168000000b025c816dadd113d871bd93144f564e0de51717ed7ed3a708183408fbc00793492c0c309f93fb14d5198a247cc74921f2f87cfa62b09b0feaa63f7d1d89c0cc4dac2f6a6b735dc3f6de4926c7491f36969510e9497d40678b4b0e617926132346e421a6df1f0a0e88146ff877f1f32ec53137a3085f1c38b0e672a41768b76b399f0df964ff392107d2cd128c852c51630132c63e22eee655505b173903d81764fff34828c0cd771cd335e2af11bfe9eb8000000b01c5044d896a7f1d9f5cfe004ff5bc3513ce5f4a0940cdaf3b98fd1612d2702a796e8354b2afbb45758ec3cb56217e6ea7297b9c9e21fb6b9e194b66465c686c9682cc9a379fc17daf8698cc1ae3dc1a7a16bd058a55f5f1d27bc7e83e708768cc3774f43ff30ceb00551a01717f10bf601d1f38080a88fe5b2fabc2b503d5c46511edbc5b24402d011bf5e9913c796ad05e4570a9aa6c73187cd4a99c1ed8de96f2f773c8949c4816956457a0d333c7200000168000000b0280c253972d8bf40f92930c202c3933b01975956111307da311b4b036fe2d1574157ad312aa08c6c5f61e8489557ccafe3b8eacd4b35e6995a259800932d4284bcf9020fe300999c1b7c925037092f28a2d34bf8e6c023fa71bf7988584270e643b34ee02d7b9eada2f294ab3360ddd11085c5fca5614b4eda9365e65ab46dc6ae02ee1fc284504ad59e38986e62aef81e34b1ec759f11ef88beb1d3077968bff2a7644f00045665b1de9153a2f921af000000b004b54d25a215b801ddaaf3cf79ff40d8fa56335c1070544c3b11c580a6f5e506f393c90db78b3e4e9e0e2178d48bddcb9c93d5501412de7f84b96db22ace8b04a9cb1dd15cc0c8ec3eaa19a4f368b074a59520d9fd8bff8633d166ce0fb7a8e8c139f911023fdc99fc4c16f357dc57000f03d528f1ebca620923388a99470b0d8b31ca201549ce78373799da159892c62d25b2ee5b136f88a83063e740cfbc8a682df459c58f9bc30c8d22a378236cec00000168000000b014cfbd81b784ff14e8cbc1d7eb587789167efe215a5228d65f0dda2beb2c60bd4072bea6640165a5a8de537db53d4bd65dd552b7bc28f351a774610aa8104f70d5f3aa449340a8103375a9c9dc6bce4380f0604c81f2de931b8076dfb6dd86ea5d04c802def72a07e9c48c6a3df20fdd0b33167b32ae55e3399fb7017830b29cdb4c878a446fb81cb28983019d4531842e90a4e316088fab472c78255b90dadc2e82e332ae267baef71ab7d89ffe122b000000b00d0f03370278ed8812c76872052e048f293d5bf2c52633d392f33f8fe2fe405927e53c92f17f4624c586215e1265bf89004e6ba649509279dbe43e5756f03e76def64550cc47dd6d37a4586bac64eac816c27c18cc01e8e9752f88f1a7d1074eef73fcdb1c4c90f1c860a6f2eaafd0f51ffbede2e83dfe26d81eec2015008f6c064bef21388b587549273dd129c3db00101c96ce957b6c1501f43d8d1936416b734918856a4a8476e93fe31a1f4d616d00000168000000b015d6dc07e6193518d60b1f6c493cd64de7db6706456c951db1490327fc114776200783c8e99afe79894e85602e6239a1324d5cff7adbe732d230f59345f7e2747fbc799613d92657878cae468c6d0e996b0473b4f783a9cd04ccfea3a7decf2994a4dd806afdc0e78332849ff80b8d2f0068f436e2c6c70119045ba0bea2e6a6e6750c571243c8277500b11df57f7ee925cedb4c61172c0bcfa6a66c1a3d557e008fdaaea719859735b028f0b3d8476a000000b016e595a2e0cb056836a9eeb433a31212a8caa46c48a1fb8fb1a7baade1cfde5fde29b8c19db34b7c33a5e53e94eb0c8f85a40975a2ec4b7b49cc8775fdc6cac49888ea4562fe0926633cc9cd993e1530dddd86ed48c4ba5788703cd1ed52f2b63116699fc825c582855941a80023a8281cca34b3e195cc0c01322a551921e2f024911d43dd03d14a06863824d900cfe72724458a2565a6793315972bc707a53bc6a7597313d98abdde7cbe6f07d1ff9100000168000000b01b43dedfe36d7906eac9c76ea2a763f0955e02e54507b290f14064791a4cd1639d66c6bea86ed1c05e6a9b0aa46d163d0d913bdd0c139da417299cb66049d6416d5371ec877bdf1813ecf8097619bbf2452bf7a22b07138f86bece82179ba6da931d76063fa6b20cbd9ee91c1a93b6f315b57d73b329c92d4a3014b3e0d62b3e9bf7dc5933b809c6371cf6aac4a5526c07fdcb281ee48a71792e7dfab762821c66c042e4f7bbbedc0fe9db9ca7112487000000b028e01ab181711e0cdc12b2b39d5e5ffab23facdd821533e3d76e4a769e994dcefb412840e7eba96319dc07e59327b2c92c2272127dd850a122ed420fa22191e440e2c66057f3f7b5bcb78d774b608f3fa3378084d134a0f7a8424494025857a7b922d8e8a77118c8983546f06583ae9918655a8b72d259c9398f742503f97258a6054f63ea85700eb1073615513556df04c948c185e69ceb3c26b17830fbcf626820b4291406bcc983eca24935880315380000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000018100000000000000000000000000000000000000000000000000000000000001820000000000000000000000000000000000000000000000000000000000000183000000000000000000000000000000000000000000000000000000000000018400000000000000000000000000000000000000000000000000000000000001850000000000000000000000000000000000000000000000000000000000000186000000000000000000000000000000000000000000000000000000000000018700000000000000000000000000000000000000000000000000000000000001880000000000000000000000000000000000000000000000000000000000000189000000000000000000000000000000000000000000000000000000000000018a000000000000000000000000000000000000000000000000000000000000018b000000000000000000000000000000000000000000000000000000000000018c000000000000000000000000000000000000000000000000000000000000018d000000000000000000000000000000000000000000000000000000000000018e000000000000000000000000000000000000000000000000000000000000018f0000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000019100000000000000000000000000000000000000000000000000000000000001920000000000000000000000000000000000000000000000000000000000000193000000000000000000000000000000000000000000000000000000000000019400000000000000000000000000000000000000000000000000000000000001950000000000000000000000000000000000000000000000000000000000000196000000000000000000000000000000000000000000000000000000000000019700000000000000000000000000000000000000000000000000000000000001980000000000000000000000000000000000000000000000000000000000000199000000000000000000000000000000000000000000000000000000000000019a000000000000000000000000000000000000000000000000000000000000019b000000000000000000000000000000000000000000000000000000000000019c000000000000000000000000000000000000000000000000000000000000019d000000000000000000000000000000000000000000000000000000000000019e000000000000000000000000000000000000000000000000000000000000019f00000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001a100000000000000000000000000000000000000000000000000000000000001a200000000000000000000000000000000000000000000000000000000000001a300000000000000000000000000000000000000000000000000000000000001a400000000000000000000000000000000000000000000000000000000000001a500000000000000000000000000000000000000000000000000000000000001a600000000000000000000000000000000000000000000000000000000000001a700000000000000000000000000000000000000000000000000000000000001a800000000000000000000000000000000000000000000000000000000000001a900000000000000000000000000000000000000000000000000000000000001aa00000000000000000000000000000000000000000000000000000000000001ab00000000000000000000000000000000000000000000000000000000000001ac00000000000000000000000000000000000000000000000000000000000001ad00000000000000000000000000000000000000000000000000000000000001ae00000000000000000000000000000000000000000000000000000000000001af00000000000000000000000000000000000000000000000000000000000001b000000000000000000000000000000000000000000000000000000000000001b100000000000000000000000000000000000000000000000000000000000001b200000000000000000000000000000000000000000000000000000000000001b300000000000000000000000000000000000000000000000000000000000001b400000000000000000000000000000000000000000000000000000000000001b500000000000000000000000000000000000000000000000000000000000001b600000000000000000000000000000000000000000000000000000000000001b7370000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000028100000000000000000000000000000000000000000000000000000000000002820000000000000000000000000000000000000000000000000000000000000283000000000000000000000000000000000000000000000000000000000000028400000000000000000000000000000000000000000000000000000000000002850000000000000000000000000000000000000000000000000000000000000286000000000000000000000000000000000000000000000000000000000000028700000000000000000000000000000000000000000000000000000000000002880000000000000000000000000000000000000000000000000000000000000289000000000000000000000000000000000000000000000000000000000000028a000000000000000000000000000000000000000000000000000000000000028b000000000000000000000000000000000000000000000000000000000000028c000000000000000000000000000000000000000000000000000000000000028d000000000000000000000000000000000000000000000000000000000000028e000000000000000000000000000000000000000000000000000000000000028f0000000000000000000000000000000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000029100000000000000000000000000000000000000000000000000000000000002920000000000000000000000000000000000000000000000000000000000000293000000000000000000000000000000000000000000000000000000000000029400000000000000000000000000000000000000000000000000000000000002950000000000000000000000000000000000000000000000000000000000000296000000000000000000000000000000000000000000000000000000000000029700000000000000000000000000000000000000000000000000000000000002980000000000000000000000000000000000000000000000000000000000000299000000000000000000000000000000000000000000000000000000000000029a000000000000000000000000000000000000000000000000000000000000029b000000000000000000000000000000000000000000000000000000000000029c000000000000000000000000000000000000000000000000000000000000029d000000000000000000000000000000000000000000000000000000000000029e000000000000000000000000000000000000000000000000000000000000029f00000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002a100000000000000000000000000000000000000000000000000000000000002a200000000000000000000000000000000000000000000000000000000000002a300000000000000000000000000000000000000000000000000000000000002a400000000000000000000000000000000000000000000000000000000000002a500000000000000000000000000000000000000000000000000000000000002a600000000000000000000000000000000000000000000000000000000000002a700000000000000000000000000000000000000000000000000000000000002a800000000000000000000000000000000000000000000000000000000000002a900000000000000000000000000000000000000000000000000000000000002aa00000000000000000000000000000000000000000000000000000000000002ab00000000000000000000000000000000000000000000000000000000000002ac00000000000000000000000000000000000000000000000000000000000002ad00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002af00000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000002b100000000000000000000000000000000000000000000000000000000000002b200000000000000000000000000000000000000000000000000000000000002b300000000000000000000000000000000000000000000000000000000000002b400000000000000000000000000000000000000000000000000000000000002b500000000000000000000000000000000000000000000000000000000000002b60200000000000000000000000000000000000000000000000000000000000003800000000000000000000000000000000000000000000000000000000000000381100000000000000000000000000000000000000000000000000000000000000580000000000000000000000000000000000000000000000000000000000000058a0000000000000000000000000000000000000000000000000000000000000581000000000000000000000000000000000000000000000000000000000000058b0000000000000000000000000000000000000000000000000000000000000582000000000000000000000000000000000000000000000000000000000000058c0000000000000000000000000000000000000000000000000000000000000583000000000000000000000000000000000000000000000000000000000000058d0000000000000000000000000000000000000000000000000000000000000584000000000000000000000000000000000000000000000000000000000000058e0000000000000000000000000000000000000000000000000000000000000585000000000000000000000000000000000000000000000000000000000000058f00000000000000000000000000000000000000000000000000000000000005860000000000000000000000000000000000000000000000000000000000000590000000000000000000000000000000000000000000000000000000000000058700000000000000000000000000000000000000000000000000000000000005910000000000000000000000000000000000000000000000000000000000000588000000000000000000000000000000000000000000000000000000000000059200000000000000000000000000000000000000000000000000000000000005890000000000000000000000000000000000000000000000000000000000000593000000000000000000000000000000000000000000000000000000000000058a0000000000000000000000000000000000000000000000000000000000000594000000000000000000000000000000000000000000000000000000000000058b0000000000000000000000000000000000000000000000000000000000000595000000000000000000000000000000000000000000000000000000000000058c0000000000000000000000000000000000000000000000000000000000000596000000000000000000000000000000000000000000000000000000000000058d0000000000000000000000000000000000000000000000000000000000000597000000000000000000000000000000000000000000000000000000000000058e0000000000000000000000000000000000000000000000000000000000000598000000000000000000000000000000000000000000000000000000000000058f0000000000000000000000000000000000000000000000000000000000000599000011000000021c000000b00591a6c2e0cc57621c6ba62f9003996ec2a0abca0f0e48e0d7f2c31e64fe5bf3914f81930015049cff8097278e6e2bbb491e461049bbfee07b2b1d6763661b2e13c708e0ae1664fb48c7ddcbf36e0bb54e566e5780c543c3e5b8e499ad4a1d19f09f180510d2c5b5b18584b64698ba671d663559c106711f8b368a319504359324bdf96422ce1ae5f173538c41ea5254087a34878e1c7e282f5fc846b9310e9873231d19ed4dd1f6c3d131f95d0263c6000000b02cf8ad6984a7956ad793684b48062ac68f844f9a5e20b6ba35bdc7cd2cf9426e15ca24509967d125b17377aa5598a9a786b231f4ae26c6f51a7248c4a7784b21c7fd92fce191d9fb6b117733ab6e1606521e73a5aa77f45793547088f48ebe8dc9a214f8ef526030b1e7d7adb7f7f0a92433ec5689906dfb789f568eed706d0a3df4f7de2a88c83adece99566346282f0eea86499f1f4337ab0a193f474f21e2b955a4092f80e59918c6ecefed4991b8000000b00c41f784005fca771d1c9cfe7fe49c434f74988fe23949ce9d6e035500069b67e25a5eb27d3658b8baef31384d06ca62fd5f9129aec0a66be801b3154431f005bafa7a976c1716d8e73031770e4fb8d86f3fa41371e4ea88b38a303782b2cc6c8c0caf8f6a4ddda58b509f58b885282b0704392833b1fdc8dd1d64cc5311af330820abad977e5d5e04a8791b724d85fb3011a96c8a3b9ada51d35344f2934e8134ad9f5ad8e4a96d27ffb970726662540000021c000000b007516ab869abd30b8ce814820eafce24b741bd295102e8ad0d5a65b688058a51beb6065e78f8bb311f5435a85af387ed27a6424d51399d40d1a8a11f264bc136e22249cfc2f67e342e0255c8ff86bc95d852ff159f3a03d6442024f19a2a9688a373dc402283cf33877886ef8a5438c214ddc3bad78b277381c39d079b16ba1f099aaaf792c7272aa96ec42fb26751cb13075ffc896900919cc3f6547ff63798307d6ff5340dc03ae4136c7468529031000000b00eb5342f8849a4285e5cfcbf54ef6b54e9c18d979b58e7c388118b77b22bb10604f0c738bfdf935efb2837a483abbb78a052a6d7f935f7e8a81ce1345fe58b0275f36892ac4b89ba6e5dc971c341f9ee297d5ca4fd538dfc786f0a0b14704e78400f234984e865b32c9d26d6d0475dfd14d808b3a77b71f272d0725d1b6d110a7d33176dd8c965332c9329443add6a921d98bef71be5d4810865d2d39f192893d35e3ab2fec680e473d499fd01b663ed000000b017802ea836c5ca0c9f90e176aa45c348d5c04d0503ce588cb6983377fdf0327dd0e48fde6d5cd75102eba2dbb46493bb6edff001cffc2cfcc642e6331766fa06a699eb3fe28ce1a0fa3b7e47f2591591005ddeb5a0e30b3dde152216f0c7458494dd7ce1e30ee20f7e101d01efcbcf34186b2865d9fbb907f89492659c5789f2671f85cd684eec03883b26c79de37c720067ad5be0cae41e7b0144a9d928954a95517127936d91aa34cb822a6b7adce20000021c000000b005e36155228a1e28c98bd83775a53a4c6bad1a9b9fdc79af64a25d153a1b25825622eb60e3e7ca250afc1607d518601cb033452932d956f7f00b3980cb782b22a55bcdb70b3ba051e5ce9098a077b491c84312e7ad156b1b3d3ad2d368f1e430576632934f5f4a05bb6eda9f6ab7d3940c61cb1e6477109660849e30647c0549fa9fe32622d28de9043f0f5d7a1ce1db2cf6aa5ebba15970b077b2527a89afdfa8e7a0982b00f4d2918071f3fa9b4667000000b027d2c420e58ead293de2b24a019f0e3e27140458511a0cb0a2199d2b68577e883eacef69484dec79749995761fa0d1b962acd49ca554f3c5c73f88d370a43b45bcf763c58ba26ddc66b0dc915ff1c40eade23ea062347ecdf2b3c16da0b3f002f0a42cabe7fbf2a87015fdba7657f33523283ea6f5de828e62b8aded2d21bfca3210617c7aeef2907b0cf66dae91f96e0888a2c69206f92032dcb50c1b39d9d36dd3334fdf10c96018709e73353f12e5000000b0037bd3947e0cc48dc5acd19091dd0447dd5cbb4888f6bd71b98a6c2deb337d14ba812b299c2b5ded77f9b28f4ef4e547a3f8bfb797f5225a444c02cd3c3326adf29fe988769d69dd9f934560f1aa8a762b11f1648bd1dd3f4eac0e31654ff98dce78bcbde7ae810793f616feadccb18e24f81ed7331233c7bdf75418588deec2c289e7d2576d314ea3637b35ca0f487f0fb6c4884f1598f3e7544ae151ab80fd68ade59419cba903db4aec05a7b935fb0000021c000000b00c02592d13c10469cce0457b28a6e98269ffc9522556cf879e18e7a14f94e8ab6a8e2252007eed37c34db7eccdc6d746d0f0cbe2bff25cb36d96f2369b537315008c88a68e6efb8cd07d2c80201d28fe7ef11cbc611741a745d1da3636829ed889542469e7b269cb751e10fc788b624728e02ec1f377aa177626f7e0be30be01be7f6e488f148307fe764f3578fe57d2303bffc5da72673ee3c64986b3759e50f58d427b5f152750e7c31eeb181affd2000000b0213f944813c167148c3e0100865d18f26d8f42733811515e1202aa92f763a989df0e3ddbc7ce1a982d93c5a4af308b2632ce6fd79c5058fc667e5c7cac57ac12899f0082db6dc12d284825bd2f527f05fb41f9bc6641841fa9be5446cacb117d788b5de736d02be4d84d09894c9957d62503063ebca5aacf3e30d8986f662c378711853e8e50e26877b65c80625a42d427976972a7ad19396a6054ef7b67e81c85889af12abcd4ea214cbc3ceab72679000000b01acae16a3306f9a265c6529161dd923e7afb46f5ae225a10d26cf7cfb4b12c76265bda2d4eed66260355a79c8206fd2019ee02b1d06b0d5e56ee6c929437144368561ddf31cc1e76345d757d81531a164447d19795029117e15299c8bd81063915587627230b8d591df1e0d1e40941ad1c5202ec52132f3b4a090a24fc436d3506a2a68aa8eb19a8054b6d3eb6c824c71ce268c378fbf22fd250dc5b887465f90fbe63cd232e5fe5d063cdd75b7c1bef0000021c000000b00c3c0b4428aa47fb79767fe15ab480ebef1fb30dda925607e1a57289d83c1dfcc7b847ba6776b8a2aec773599ea9d7dea9474a3bac9f992902b90256fb6dae48db820c3af8ca0e7d0cb7b0625c0eff03f085e78dcec7ea38b18b34d5f85b0db0cc74b92408a2c5cfe0f8d67a1ce2e90f2e87a86cfb59402c0772436bf6528fd9695c9ef40d9ab97189c759ccd05c35df149401bcc35d0daa61a28ef52c862a4643feca7f9d5645d91952a14e741ebd55000000b00509695038aa49af0f80ee9b65efcc71e09c0e15c66fc79ebd9e5b50d40a2db22b996989ac6e117f99c7eb5065e5023523c031055111c95e67ade3d23f32b8a04f41559121aeeea7b6cfdded0716b0c12490798db31af63410b6c66bf5e03798cc2494cc8f73227201530aec6aa39309177647f7c51d7333e14345d01f33908728d492b4900b92330d54b362550bbb6d11cdd03577fa5b5531b745b8c797bc1057ed6262ac847d71bd3348af7018f18f000000b019f66f860afd4c9847877fdbc362a649a0e12874dba0ee4dc1f4e4ec0fa31e1bd75e9011d57f5450f24d2deb02042c932cd9a04c6595a7d833497dafb90ccfd151e2b66e2b32e8a8191e6d64ada903d582b7ea6dadbf345b21fb10529ba9d29ef6f65fafc99cd1fbd5bc4c12dae89bc908dbf6b834246c0f43924992774d42040db9dfbd116f9857aaadb227060d0f1e1f0d521c561b9e2c52aa552915f79c3053066ffb7d8e9667cfc13eb08f43791a0000021c000000b001747bf730fe575f338616116e56ae8c3a569a0a2c781b7d666213db26fac82cd6fe00c843f13169b7c611a42de7606a08ce035edfa6817b6ef497cd7e72d764516e98c0bffb8e9747cacd7c1a4ea87e7e82c6329a76b6b6a0ea0f94bbc8f519095e6059af75b14896d93fe5e4f53fd70b2851d023022797656345e8892b90c3e1b7228bad32d2679435f9ce90e3137b2f81b1ae7c2124d026cdce1f1f0a6a253f9f0c285ded52cd9624c164736b726b000000b02b27cf02a4327a8c88ee7bf34531e1d6346f7670114410302ad65002db16b2e4c9f8d1204a9a1a79982b7b3ff3e019c7ec2968e641e83194c15473603a5995f3fe73a166ba7bd4974f03cf779bc29a4ef53b6d1ff0d367985488a92cdcdcb40385486389ce765786c56460e476f7bdc016581048e1d9a1abce146fec9300417bf606675de570406e73bc4cc0d8b6aef010599a5938cc215e36b8e954ac2f83c5affb0ac56370e0e5c968e14137a1d4be000000b00b7f6bb502e54901fe47ff03ce89ee8671758bbd3e71e0a55ef3d685596cebb2637006eff66c0401d3b0091873aa70ab1f6a54938a55dfcededeafda7a32aa4550048e92836ef675da517e419bd00eb469a531ba1c5f13b5c4215a1554a566c7d5905514abbc2f1cdb20b0378a491a99195471b56928558b41d72c4610a275fb8e642c2478fa3e5fd4625770da837db427fc9f66a6a93615d77cf7a8b63648cff9f410b31c4bccaa657d6b661adfa35e0000021c000000b0206637d6f71ccfb396789ddbdc5d66fa8abc73e26fdea35f30dbef5c0ea56c4c34bdff0df9cfe2705d2c24771e6c03c872752e137f9ef9e8d3390cfc02fef94e9bbc5ab11bd805228dd58c0673af0e28362c32af0e2b612cd691b7e9b4816299ab65d204e816c625f8a8ea42adbd47ba2dec49928471bc04b198cfcaf35934859a91231234924469d9dbe2cf1896d7221151eadcdc71e21395eeca98a98d0061f1f2a0ec058ddb897d293cf1c6b2841f000000b015a4376b3db67915ca6acd51f4840311b0c3a326fe3405462d294fee125791f5345d75b506054f02111bc76555fd0222a513196ec54a0007ee50e42612d9c9748c20499d4fd17aa995c9ac29911fe9d69b6fd23c89a26d11a851971e8c9fca623bf3de37c7d602663052923f4ad9b6e326e90e7a00ac578858e1bc7e7730ac32084db0de3c9b104194dcda934de7871722d570e3bdb936fa8ad0a8082ea363cb3a7b9d6d1934f6b10e06f76578439662000000b027a135dd79dbf3080744462c62c604a4beb9d99a835cd048a9768435a5e25c87c5524e7fa5e1bba0f1afd15adf23091383c0cbace6bcf51c45d339a81efe66ff3149cc19f732301caf92f2d302da5b125e6995573e5de655a0d55ec1ce9f29e81dd6b488cfb684687ceb7c8df77039d31b2e4187a0d49e6f68b3ddec61f8b4ba184eb262461580c3f7c7d2bdc324eb290ee82203c6bdc870564d3aaea89803860b1ee3ffacd1e8a69455c304bc5b01b30000021c000000b013486ce021b6a09b0b79450b76739b0f25569531bc532ae4031ab31e7d34c1853ae0fe346924d6997325fa657ec715222e8df30a837c2e03daf592e36139c4135f5a58747f29993f8e5e4f57a02cd5fcda99a28c6323fde9fe2a021303d3fab09e6312754aff2badaf22e9b68d7e97810116acbaa445c464a8f7e6cc6e819cbe9bd7c9645e47c7e5e55e0e240f1048ba1705d899b287d049e79b937a9092c569e8907d65a2d7f086eb1208f9c247c822000000b00dce7be2e35b165c634548962ca1e215e3df6a9c10bbe21a29e5ee2afa1b92786cb54979fea4b4618b1b8c8c54efcda5889cdd178f7d7c8e603e6729087418b5f95b80c88c7f5dab32c80ef9ba43bfcd1f865d7c9a213574f35cdda3e4a1458332ffefdb27a5ad129260ad1f0b531eea0f6fab4b465f7e07bbc32a161e56e1ba1bb7c7e81cf5376ba987be115cca320d046349d99b82997e22bcadc71e8367f0ea5bd8d046d807723e61f59ea240d1cd000000b023eb3fc8b0b52dce56d75ccbee16794d9a2bc85c73343e8227c851dceb60f2607f9619314389a8160089d87c3a1dc4a19dd451329d9c8d51e754b43822924a5c1142a98ab835b260acdd00a83a7d241d17eb10db121b17a1965e002eff452d132b528221cd8b51cced8b9ac14efff5520cf848f9626f582301891bcf38c6ed7ea7882977dfc80bc0d14050a440000e9c1c35e3a10d9f9f7b72bf203fcaf918d1ea33e9012c03d4c3ddb528341c21cd0200000fa400000168000000b014da65d37e0089a1fa3e1fb9c0e91b0e39e0b992ce845eff6ef2702ea2723476a51a365d0abcd73a17c6180528dee60c6bd9383f2795a7df25407dc06a16f4bd9b5b92b5e21db8cec5b964ce1c67220e7cee4dc3fe1757f6ee6b447605f565f3086a447c044b04abacbc8ef5c24f88261dd9f661d310ec37be8cbe291e533403314175cbf7e89bf800faa2fb0f350a3303965c29d0c94e9231a16b7ba2eabe0c55b1abcac336924fc7c80ecdad4ba273000000b01da48c9606a9902c8221302d80887715205408dbbe8953b1b5a03f0370f1431592a2d414b7bd0dbae2ff3a5fa926fdbc7679d2bf4f7409b282f7d3648f8ee118aab99a892b60501568c9f7bb48c656c925a307227326675daeb0d41ba3ceea86e812c79c0c6cc008c2220b94fb567b5729e29f11d32bf810d9458b3c17a3b581b75991e1eb8793730e1036556c581a76281c8b841d16636d06180682384262b6e4a6958cc311b9d12283b13a8fe032eb00000168000000b01b05eb462ed14083e68551e5383c62957360bb498dd4a81197a585acc8bb806063ced75b5b1cefa0d181aef3553d04e1af0174f3f05d5f69d5b1bb56100cd6f8c6681a2b2fae4a120e2012aa94a1e81d490ae03d912adc6fa1dd33a77b68cc0eb99cd87b25236088fe35cfb6a827c15f08fe0a4efb29a3b8d28d2affe07ac18a483cff8c4c77ba14559d809564c4805e09c9589d30d8ad48d9070e709814e3ed4f699009bbc95c148850ec306e01b3fb000000b00b12e4e02d8581d7af1b0d4cd0933d4a2d3f3e14220322869e762a8a646e45db5aef8ee78519b1cae2e8edffbc8333f8b78dfe880c1ceb9239c6ac3918ed4ec328679a0c20f9f299c12f2e371e305125e8298c9979d2489c303fc1df5cb5d83df18214705e32f85341ea2228b51337df280a7be6dd3d4d6980619dd7e402c015bb8097db2b3fe74cc4a27de9c5c5f9e818d400fd6107c0ecf4320194d9c7d4f635283db9d68d41a4c89933ba564500ec00000168000000b001fbb49f720cc4eda4de0d960372ab4796578b840b2c4d033ff2e81626ff16bf5325940b4049c386c0f7f73c4698ea834f3b55e95bbe4fc6020633af1decc519bacaff340a621217bf04ca2041dffbca008cb9a6190a188d16a74c38ad6254e304f82baaadd000fa11a21f60beb7281110b2f62f9c24ecc923784774fa7f8bf311dd8a2e75c0dbf02e4d0d2a9432d6772d6c2d159e2c6082b38bc9f2f9d1334607d1b4e786007f0188a14fc5dfd32569000000b0002fae336d5e06285d27aed31f12481da30cfabf84256324779191166b3fd0ad369260d106da474f804a5144147195227e20a7af05e2c68fcc8025bb33cd793382a2a64561a4341ef4f991b41339e0a920c1ace089549134742f59c2925c0bc22e1bef8ea6f26f9220ff93780928a78510b9aca6869aa696de63f623f80938f427bd4a620eca4167aa561cfeca66d6863056448822e15b03514d1496b3a98e612083a70922b9d8f29d495962e97581f300000168000000b0150e08d4284b39fb8f480eda60e1d6febca3fe2290cd3e281de43d3bcde60ae2cfb237c5d363b6b635e116637aa803a6ee5ea9686fbd5a21124ed97b95515d6662b2e636eb249db24fd7e2ef873d9c49dc3dcfc05b4a45877a6425a82091bde2f18d301a8e7581fc9ba543b23868b6eb28093e85ce5547596e073fbdae0b064d991dc67465311a8753802143234b783c1b88800367674247ed1fa6d865c3c926fa17a08cb9b444b5d8e655b8bd5fce97000000b0286d7398ba6d1f132c940e03aaefea276675a3277a8b0926c036842c54b3d96dfc13568b133c2a8d324b7db30807beffd7c994b73e112086ca7587934d752e339a01abe42bc761e7fc18c637825d6ea09d02706934f9d794578b1b7957e36bcd6b7eeb816b4c83640c29c778d7b912c922502abb46020135c3ef49631e756a1b69810c6b2822cdc3e6d65b6687429fb80f5d83055e57ed2b02f43346b5200c73c1ce3ca292b566aae73fcd45db002ace00000168000000b00d822361cab917af18efa93d524ba07bdc007858236e3856b10fc07707dd0f60f80a506ba69034874737734ab1b59cb4a3addc13067b0d025a48349777a39a451a434bb61fcb5d05e44154ef0dd50ea7275eb18704bf37d9d9ad0bd7b6ef25e36a646f8089ff097d45d071f4199d377f154e4fd05cd33613297373ef80a748049cad737a29e6ee82956cfbe6b3c037d020a62751f1cd922879ed153afdb3782ff824ce9a8a6a389709aaf7f6cfd98833000000b007e7df8633bd6b6145945c0c8eba8d47ad04d5f9f0f64678ba363827ce731dd69d5fe948041107d7f77da4a451d9e66ce9f8be7bb525458d35c2a45672b6d8584c8c7238702f7c5001e7f1c56dc2bae8d25acb22a165e5e8bdd9ac2f0d5ba042c28b65202059d8f93864d4e65e8e36a20baf432ce5f550853063fd533a8abf42826584675028fc601017143da45f0b5c0fd37cfd24d00f2b4bf793339393ef32ba67bc7097b00dfd40956751777d0aa200000168000000b01ad2667face3863200484ac3599d918e37f7a13ed6304ebc40016731861975ebe5b696033a3ff521fd977fc596f4c178075c75ed63360b07d62c8fe68f0b6b847f7973694ec8f449d8bbad38cf7a0c3880cb31d5b404fd833097a5f46a5ab8138dce89ea5713cd0abc5e86bed5de13f91404f1424fc7bf7e478e98c66d92fed6f218bdcebac31e628a73865159c1d305134c1a45505112950e361547c169ab94cd17c7426b9a5624c2fae9387d0de22b000000b007ee2b503f309ecb10976c398eff91bf93b717026f59aa9243c65d345d3cb90d7173f70112b45177c37e5c138370c69ea2fcbdae09e4a60246dc1b353836ce0ddf1a990df5c2efb5c47e72150dd395d084712400c66adb87d61b46a32d5a6c1ae7ecd615749a99f85defd924fbd2c5ce13856a83e4d72925d12eeef1918a8af268d3412d28432504275e63603289f1710b48229fa8fd779ad701700c99a9f244455e328d333df60df94ad59147708e7200000168000000b02d441ec6dcbf87acf52cca32784f8e255ba927f45cd34c80fd74a9f6fb0473f82dda38f65bd3519490a0e6065744c8dacd460c15ec0b82cc954bb7e6ef84da0c67081c90e5df0bc4a8a0b57d36d8596df023dc93f0bf5ad826fc742273a87b2a7e2f804d2b8f26c053cbe87f372934da199ff07ecbcec2b6d5f145136e7b7f00442847546b6688543ec0f9dcbecbb2de23328dda0237dc498263c1fdb71df92769789a4245a9eeb41f2e51b496671bca000000b01d50fb70beaa8197ecd7497dcc9c13c619e713f486a692ee311decf2341a780968315f6971640801416fa5fc7840cad8b0ac28b3b4de50520c23e5f1d5ee775ec2c3265acf69d84ed938c7ecb20a45c06348bcd2cb3ad0fbb08314766d72510a38782a628bc4e9ff4742275a7fd7442e1a0c7eba80ff2624f61f7b8ecc289cb5c89da215017482f17c6cbf1d7d835bc30eeaf2808a38322995be1e25ac46e3899526c03354bf2af053805f10ce76b98800000168000000b029017277394d239f2cc7b93bfe4f5fd71959254653135cdf908b2f8ba6971880dede3075ba9239ff045a248c46814cf75ab36d3887f0f9343b82dcc7200ef9d950ad7583671ab2fc41a7bc5bbe113b5680d9c5c6ac0ac7830a4ab31a440822fb60951e88ba79fef6f52e59d0cc0c79dd15d65309ad568a89ce0171ec2cfd2fa16dc0b20edb949b035cb75d869a0aa2a51965c385c87222d0f9a39400a42b473d20c746ccd9bcc3c2f8fda28664e5da54000000b02ebf93d38851a692d3b14ac04670efe5a0f4dfe92a9617983fb0b3aaf3b99ae85e4fd4975c3d285d978d5c70dc0feefc14f54909e95e659919b213af560c912c12e747028b728a4a192e61e192838ce86aee0cad897b143ec02eef0b7ab9826eafdac8fef1a05eb05922e260572188fc1e8a6948a5f78e7b4a8a13baede0dcd02205473b39f362dc2627764dd22a49ad286e14116475bcbb6d2e17ff877ddc66c78522809e222994bb7e159b63e3716000000168000000b027c3053f4cfeebeaa62ff3c16d5bfa5c7537b142a6a899a002c31fc4c074828ae45b237bed09880748471cb956ccd71792598317d1ed5b1329949695acaf3d7ccd0398e789b7742b03d7a73a2ca40a9bf5bd8acd7a35648d80a61e06ec162b8c1e3add6716a9b35ff62a2b2866c8842119f25f7c8daff661d02b0e7b1063629ec6ce2a03d3a1267a00ac30094054394e15fcc16e0c315a2b6b9617719bde5e8a2cdadf588f62a84452fdbc8727367e3a000000b015464d5d9b7ea2e9b17832d6bf762f40fc8740cba406a02ffe56d0743d3a3af3454edcc872b6a42a57d8b15a870de35e64933b79cbef570cc347d34e6cd3f3165064a195948142eaebda4c548aa20c0ddc6ef60ef8459f01982dde02fb173b4b7b846cc9f270f006d2991af8503512ed277467e3df7a7be8c4879c2d57e863af0285d0de2c3641300835a030a7999bdf0e38212160320bcb76f58ec5920781770cf83db9f3bb96d5751b6fe5b8b3d33b00000168000000b0050cf248782fd0f6ca2adcad98ba9973668d283444a0cc7334b97b7f493de6c43adc84a32401a3a3f8774e317f23ae4f3a7bd42ec640e301e56144d01a07e0a4d70105ca56c44f94cbf9b26c90ce1ec9f7cc656f05e641eec42e08f9e106478967626d23c3f2f76d7ee24c54b795e6791850baf38faf4bbfedf8da08876919d609961bb2ae56e3055811d4cb1d03d22c1256ae059a802106173d3c6d8ae72982fe7c6d76e8c4f8faa106beb0bad7e588000000b0254c22ab21ecd52ea1df157f49f3f9f14202d25972b645f7ee32976450679deceaa5c6d11a50f603941c6867a77d279b20cc86a44c13767e5d1037da294626e4c502b55b778e102a585d93936c31cb90042e9ce2af0edef395decc7c7303dbaa3b8b3e42bcb8d89f2f462e2999ba3e53185220a793fdf9c891a4111a74814942ae40a00329d69899a2ed8e5f0b150cdb2b94abc85882eb83780977fa1b940c5bb4371a70d7716de15e41c9a8c75f946400000168000000b027614171dcfe687a0e4984d71515293ddf97012116d9f28d418b70193b8261d4932a187eca22a0fcf3a8a0ccd425bd49a9cfb83dd1fd0dd3e113ef5445aeb3220651a06d5ea114d6ab2713b8027ce2aa68af6f985a31253ad748cf748ec3713c3eca6a7ecda3675365076325a8f94eb21c8d6c037ddcaf2d6ec023c0e50fcc1222b45dce118d2d364635f3dbf53c32ee124c769b2d03013a6b560da37da78e0f9f7e6af7a348bbf2e1773e21f758c402000000b00f7bbdf93787dceca73557e5a223827892bef02214a53c406ccc5e35d780d4de835f326956389e756c2e80d4362fc8231c126fecf2ffed14d2c288de37d78cfaa24140d6b1eac0ef1303b725a5263924bb18abd9328127b1b05d7768df98d7234f2e7f1da61cc83442366fe09dc6952327b61039b571e788d0bbe58597b13ad840aa19c870cf7331245eed71a65127f00c5310049248dbcbf345e9f50524622866f3b98e0d7ae850923001e194d1cc733800000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000001c100000000000000000000000000000000000000000000000000000000000001c200000000000000000000000000000000000000000000000000000000000001c300000000000000000000000000000000000000000000000000000000000001c400000000000000000000000000000000000000000000000000000000000001c500000000000000000000000000000000000000000000000000000000000001c600000000000000000000000000000000000000000000000000000000000001c700000000000000000000000000000000000000000000000000000000000001c800000000000000000000000000000000000000000000000000000000000001c900000000000000000000000000000000000000000000000000000000000001ca00000000000000000000000000000000000000000000000000000000000001cb00000000000000000000000000000000000000000000000000000000000001cc00000000000000000000000000000000000000000000000000000000000001cd00000000000000000000000000000000000000000000000000000000000001ce00000000000000000000000000000000000000000000000000000000000001cf00000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000001d100000000000000000000000000000000000000000000000000000000000001d200000000000000000000000000000000000000000000000000000000000001d300000000000000000000000000000000000000000000000000000000000001d400000000000000000000000000000000000000000000000000000000000001d500000000000000000000000000000000000000000000000000000000000001d600000000000000000000000000000000000000000000000000000000000001d700000000000000000000000000000000000000000000000000000000000001d800000000000000000000000000000000000000000000000000000000000001d900000000000000000000000000000000000000000000000000000000000001da00000000000000000000000000000000000000000000000000000000000001db00000000000000000000000000000000000000000000000000000000000001dc00000000000000000000000000000000000000000000000000000000000001dd00000000000000000000000000000000000000000000000000000000000001de00000000000000000000000000000000000000000000000000000000000001df00000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001e100000000000000000000000000000000000000000000000000000000000001e200000000000000000000000000000000000000000000000000000000000001e300000000000000000000000000000000000000000000000000000000000001e400000000000000000000000000000000000000000000000000000000000001e500000000000000000000000000000000000000000000000000000000000001e600000000000000000000000000000000000000000000000000000000000001e700000000000000000000000000000000000000000000000000000000000001e800000000000000000000000000000000000000000000000000000000000001e900000000000000000000000000000000000000000000000000000000000001ea00000000000000000000000000000000000000000000000000000000000001eb00000000000000000000000000000000000000000000000000000000000001ec00000000000000000000000000000000000000000000000000000000000001ed00000000000000000000000000000000000000000000000000000000000001ee00000000000000000000000000000000000000000000000000000000000001ef00000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000000000000000000000000000000000000001f100000000000000000000000000000000000000000000000000000000000001f200000000000000000000000000000000000000000000000000000000000001f300000000000000000000000000000000000000000000000000000000000001f400000000000000000000000000000000000000000000000000000000000001f500000000000000000000000000000000000000000000000000000000000001f600000000000000000000000000000000000000000000000000000000000001f73700000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000002c100000000000000000000000000000000000000000000000000000000000002c200000000000000000000000000000000000000000000000000000000000002c300000000000000000000000000000000000000000000000000000000000002c400000000000000000000000000000000000000000000000000000000000002c500000000000000000000000000000000000000000000000000000000000002c600000000000000000000000000000000000000000000000000000000000002c700000000000000000000000000000000000000000000000000000000000002c800000000000000000000000000000000000000000000000000000000000002c900000000000000000000000000000000000000000000000000000000000002ca00000000000000000000000000000000000000000000000000000000000002cb00000000000000000000000000000000000000000000000000000000000002cc00000000000000000000000000000000000000000000000000000000000002cd00000000000000000000000000000000000000000000000000000000000002ce00000000000000000000000000000000000000000000000000000000000002cf00000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000002d100000000000000000000000000000000000000000000000000000000000002d200000000000000000000000000000000000000000000000000000000000002d300000000000000000000000000000000000000000000000000000000000002d400000000000000000000000000000000000000000000000000000000000002d500000000000000000000000000000000000000000000000000000000000002d600000000000000000000000000000000000000000000000000000000000002d700000000000000000000000000000000000000000000000000000000000002d800000000000000000000000000000000000000000000000000000000000002d900000000000000000000000000000000000000000000000000000000000002da00000000000000000000000000000000000000000000000000000000000002db00000000000000000000000000000000000000000000000000000000000002dc00000000000000000000000000000000000000000000000000000000000002dd00000000000000000000000000000000000000000000000000000000000002de00000000000000000000000000000000000000000000000000000000000002df00000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000002e100000000000000000000000000000000000000000000000000000000000002e200000000000000000000000000000000000000000000000000000000000002e300000000000000000000000000000000000000000000000000000000000002e400000000000000000000000000000000000000000000000000000000000002e500000000000000000000000000000000000000000000000000000000000002e600000000000000000000000000000000000000000000000000000000000002e700000000000000000000000000000000000000000000000000000000000002e800000000000000000000000000000000000000000000000000000000000002e900000000000000000000000000000000000000000000000000000000000002ea00000000000000000000000000000000000000000000000000000000000002eb00000000000000000000000000000000000000000000000000000000000002ec00000000000000000000000000000000000000000000000000000000000002ed00000000000000000000000000000000000000000000000000000000000002ee00000000000000000000000000000000000000000000000000000000000002ef00000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000002f100000000000000000000000000000000000000000000000000000000000002f200000000000000000000000000000000000000000000000000000000000002f300000000000000000000000000000000000000000000000000000000000002f400000000000000000000000000000000000000000000000000000000000002f500000000000000000000000000000000000000000000000000000000000002f60200000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000003c11000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000005ca00000000000000000000000000000000000000000000000000000000000005c100000000000000000000000000000000000000000000000000000000000005cb00000000000000000000000000000000000000000000000000000000000005c200000000000000000000000000000000000000000000000000000000000005cc00000000000000000000000000000000000000000000000000000000000005c300000000000000000000000000000000000000000000000000000000000005cd00000000000000000000000000000000000000000000000000000000000005c400000000000000000000000000000000000000000000000000000000000005ce00000000000000000000000000000000000000000000000000000000000005c500000000000000000000000000000000000000000000000000000000000005cf00000000000000000000000000000000000000000000000000000000000005c600000000000000000000000000000000000000000000000000000000000005d000000000000000000000000000000000000000000000000000000000000005c700000000000000000000000000000000000000000000000000000000000005d100000000000000000000000000000000000000000000000000000000000005c800000000000000000000000000000000000000000000000000000000000005d200000000000000000000000000000000000000000000000000000000000005c900000000000000000000000000000000000000000000000000000000000005d300000000000000000000000000000000000000000000000000000000000005ca00000000000000000000000000000000000000000000000000000000000005d400000000000000000000000000000000000000000000000000000000000005cb00000000000000000000000000000000000000000000000000000000000005d500000000000000000000000000000000000000000000000000000000000005cc00000000000000000000000000000000000000000000000000000000000005d600000000000000000000000000000000000000000000000000000000000005cd00000000000000000000000000000000000000000000000000000000000005d700000000000000000000000000000000000000000000000000000000000005ce00000000000000000000000000000000000000000000000000000000000005d800000000000000000000000000000000000000000000000000000000000005cf00000000000000000000000000000000000000000000000000000000000005d9000011000000021c000000b01877731cdc9c16d3058b39767566e6cec9db017b029244fbbc127803fa5a3794b8d46e663a51210a5099e8c4f79a4f7d71515eaf2413a274f83a4f38aedadd9e6242bbfa1ed4e872f23be9d254eeb9f97a48c6f4e17db4dd9907cdfea6fed68082c8e9f729ae970a35a7f53aabb124a22ae27218530c654bd4e3f9c4c57e50a523577b684924ecd854ac04f273171a0f169ef0bbe15e0b8c12dbd2ec3663216491d930e69f41e09d8eee8f689c5abeaf000000b0151e6e47d698d5387e420079b388fd0cfff10b89b38fe1134920601e59e02f9cb68dc34fdb15e24e463b44c4d09757c8ff849eb251f169dffd5883f668b0c351223447c66e2bfc4cdcc2179f4690f0112d814ff8171232adffa3ba2f909d47170e4bd9bd98c78ebf74beb3b516c2970c15f2933a6aec9835ab22665058deb0d940e6adbf5fbfb0ec6a8889ac0e2305661675e9400cbcbd3673c63f673bd30b9ca01d3dac1e453da46b4b2d16cc065366000000b01b9c58a32db8f10b659a57e1179aafc1eca3730d4b7c5ddd67101f271aab9139733edc5292538d14d1d60a450ee2a5a2e63928ee0fc4a39269bf24ffdcca09f2f14a853b11640772c39b2682cac90a5b2dd78064eec7ac468dff5f9bf036aa6c29adebfe15af2e76601790766c36ced127f6e013e6db26db65d57610c39cafbf5d54eaa2f76cb8f6496fa5ba280a863e18ab58a5cd58c766b89f5ece34b643320e7a24f906f00302de885774a02265a70000021c000000b01898cd6ee29ba06031b379004bfdfb315cc5a9bbf7ef6ced87a8efe4c889afea33f68808e5c7ea35ff812ab5005249805f4abdb4980eb5c609346bbc7f63e8d5a9d26d3f74868ad4ffccc20a22c27f882c4224d389b2ca6a1e3bf8673c1d209adccb58c77517415e8ec8131ecf8fe0ae234bff3814d7f5417192ad10c7b4c7e403c480f8cfeda3e7dfe25ed4b7c2829203682d39659ebcccd0e4492aad4115454e5e3bf4a33a3b0f11c8f6dc46ac677e000000b00ad8ad136f00e5ae6936ce098e8f03eebe6ecaffe5f9482a97e17f85f53669f203a211a114db381248a5366b947f916f9cfd6f23849a6284c0b0069993d5604f23a2e0b01bb77f5319f874cdf59aac67cb096497dca061e6d3ee63136b02502e83f3e2a855d9c7a849968af96f2b852c0aea683ce79282a21e9e6e8f89fe18f2dd4c02eea851e2d86c21a80851a175432d8e875151f2b7e18dac6ba1c98c8a395b5bfefeda28aefdfe622781a3265d00000000b02ec94be2d3fe87595b5644a9277f6d4385a816266d0d65a656ea9a8b3ee89d43b79c55e874bf4e69e05cdfd6dffc512b6764d5bc6460d8d4340e5ce0a1a45dd713942d369ad57816f266968f6d68ec69a63129e5c0bb3712782884dbe90db559932593c1a0d943ba3d7e917c1eb1a6211d3d074809765cc28b320e064f2bac8147ce7f530ab59809001134e19ef541ac18e3e2a5a38babb607834b856a9d23865a2e855d9f45f2e5a3422fc930d7736e0000021c000000b00dfb89f6d51be4d86ea3d1bf684d7ff5f31b00a73670b846f241ec95cd3e889e065bfecc213d0fbd926b807894e75379ac22f528cbc97464afeed276c4c4f7a3fe3bc2add5cab402868e12ee2426a0df28490cc5b3565d8e5637a41eb21b066d93d64a21df3180ec0e4c618583066ee3064b752fa31fdc63cc57c895f54daa21cbdf1204ab35e4ed2f36a7ef722e666e12aaa04070e959ab41726f4d4c8f08ce8dbbf0ff0fe512e2a648a147989c3926000000b0148b284ef6f41359cfc4bf20b8330eee67cca2d053bfd868feaf319fca05dac88b7f45547afae08dcd6f1a48ea24be5a6094b1d9efcc73cd776d24d79a406c814a22f40f5b82d97d3df6211f03b31f859b39cf1c2354c20947f58b92d707a2f5c399e8758cb5726657950a0c0713e1812af0a7f7b05fc84921cf9cd9e7173e88fe8d81b6ffb6f4cde558e69178a79ba01b9e7f0775c8f23335f6962acefcba69a03d35307cd034c5e8ba0e8ea9dfc495000000b00b486bcaa3d5eb1f0fe83c9edbdbcc4505ade0dba94cfe3f0cccb438b6f4060cc64bbf95382aafa9d45c1d9aac7b3b43b8cedcf74fd8aa8ccb4d55048374d3fa7a0f56da038566845b99ac4ca05bdb813dcc2aaf41444f5a0ac42d647eb6643d0e1bcd159c70978ded524519f8628128109f21fb8c7be5f9f1abb7ba2ec43e52249296195770d43ac4764a8a1b7899b00d9f03f524d6b7f731a8d1637ebd4ae22638ede257604746cc04e351b71e310b0000021c000000b01e9db0972eaad190e708f0e3c7cec93281e04cf7de0b3713874a21fe50bc01ebc4a44ff13e6f4c4aac1ec3c52f697e4de9445fe3b932489648cf1d578781983d05de3b7372b33d4f2458c3a61cb757116631f6e858be7afdc78dd93ea926d32315d3be05eb05ea4a11699a6612780a2f27089fc38af46f63319f144049d3e00803ce3ab36213fe4122cc9e990f3bda381cb3919d0f44b1924512e2ec7138c89e9f8e5371cdf5847dda3c59d051045d8e000000b02062048a5c14e18c96b420cd102c403fed2295879d6f7834457b92c3540f256a21493e26f6da5b0376115bea5d940dd5cf40d1068a9c5e0480bd039b9023796c803d4102201abcada6678695398c921b0ce71121d8188f4eccd82a47c27fd6c3bf0f662d0c63083018f5ec1ffcb2465429fb4c5e6a367f2aa0ba89a67cbb7ce98f0d8a5da76341733994186327979b4811d20bb8464be2059b96f8027d85ab4feea0e2afc797fb02505e9d73cde6adb4000000b01b35f7b1a35b4590182bbe223ea23c0b4ebbf35759a19940e2ff9f040e1dd94ed59f64f165919b65227b6edf1f069761c95de2aa7a9b23d5a49480974322e1df3137f054c495d21dd4350b4e720a5725359481ee0238865140cf0cc624b76c3d159c1653ad7cf46643066bc226a79ac41a660a901be9c86e6b02a7ee978c710eca8d08b7d61f6488371b0735fb0c42b6137f5a25cde6eb55982e96809a20c400f326824c2d862cbee1c16e4fe5669ce40000021c000000b0231c551e021cceb24cf4707b109a09d7fe70bd4a5229fba2420d7a2bf31a4c368376bf04acacbd7f2dd3f7d82175bcd38c4af86a4286b2f75c7cc913ad30a26d396c24ce2a58b5a48c5f103430fd39182eab345d03b66f66c3893f415d532866a23f632d9bf5db9ae18f2dff085bc85005ac2f77f1887c349fc2d7ced6d636223103c46a3c38578d32b9abef39a19eab1d9311c3bef0a8c97ab01984db9f601df012156d806852ed33bf8d59f9b808ca000000b01be46c1d929c3df46de618863d3f2412a183f2c6d03a77023f47f842e309463732bbdb8b06a7d7a99e6ed6fb9385383df3b12978325f5df913ffcb186898d77fbccc5a23b2ec72b34bcf7479a15b56fa05b9cf82d0a4d9941fd1f2995599c0fd7350c0d1a3de4d0c9d6237f560b3c42c2398ca7fe1ad0dedeb90a272319e02fddd8e57bdcaf10c47f9f67b1eb897cd230bfadf1f1d37ab5f938ffd01ef55aa49034d49bfccf3d74dec538672afc57498000000b015320c7b6f365e77a247f3ed2d73241d01e7de3fd44b9c91f2d29997ec10345ed3fc60f510e1bd01b753ab6415951f213032f74bc890e7ca51ae0c5e9ed8bfca065ed93af0df63c1ed26c916c7a84e21bfaa1b86a3e1103d44f752a52b0a5c060c748ea55564444bf59cbfec290465f523df19a58e0654d7707308eaa3260737481783f1af8aad49faa98484c754907719949e2bd3df3ee581fa4bc3e4a8391bff40228e390617fc2991536554a156af0000021c000000b0294823b5eb17df7dea4d4f68d376c482211ea25eab5d92ec117debde8849e111fbb4b81aaf33b97b1a13b484a65ecc5d2db932989c52d3739d4b6f0d24b14a778b3b0e221f939fe58ba1ebc5b77200ee0eea3c118982c3fc50e7c73aa28a0f5147e0dda9e60d08fac8d6f10446a341090f179c118c514eb3a6c6e18e192c16279804e2e00270ef1fc09a8c2896082e6923e7f70867c81487edf495ed1a77d9fe59e74f185a03eeaf95437ad328ce9da6000000b0282e20486b163e959ed487e4c57f94529ed73e7d881f4fe4478fe89c9e9f3eb70ab79ef28e00e3dfc573c04f1b7d895a2b4eb92436d2925a99ac1402718991a6e86c0bb437f7b2dc1bb081f5eed3c5f88fe7c8c6da41bd59569bc3d693a23ea22d54f71ef689e73752c134c45c82e8c627da582584bff2d20f382f95d4343dfef28ee4e6375d64dc19499110909a2df627591b62f8cd551e0326c345f045fbf8934327015344bfbfe963a0921c243d2c000000b00f12fa329c19a39d9e0cdea4b5e782cc194ecda83a28f182abfdedea981061fff196f935bdf8fb8194fe8623f0c3921f3e03c18d0b39256121353c58ac1c864ca0fbc9ea4ba9133660ecfae52dca85205edf05f1bb1331ae199876bb2ec0ac0bb48232e6f40bb8d7cf4fcc142fcf88680f1061b4f424dcb800c56db802c6efd2d16c202e696103b057d6fef3b95383f0142034887a1ab2fbfee0f06d1396b54116fc7ee4dc513ac5624ddc2a5868a9cb0000021c000000b022d4bdbb153636e0c7b090b666e987238fd04fc7389559fed96601cedd357121b4cecb507d6b7a39a53b52df19a929fb287221225f10fd55edf4d0dae02c913932848337febf4efda1762249489d82b3d9125b8f8d61f6a3e6c9529e4bc246bdc79726f620f42e34f2737b5d3b50f1d51f0d0eb0b2be87d7e80b39bba84e526663fa38d9845031dbd53bbbf729ba116926817a00b5df82bf82b12882537649eacf59780d19d498ccc15b5c5694617277000000b02f0c6342e21bad4a1ceda4595a4389f654e0e1cf03442c320a1ed72593628795d89b003e7e212e18a825f38443a746a6f1641fae6f74a115546f0b469e038765c0b430a86cc1020ffa74e5a16f8e6038f712fb167b4519765143dd0670e140a7819c1866d874de032e9a9b568a12fe74294833a406a4e26e4e60387f6a4ed33cb660dba8ed7c12c23be5786405ece7ff12f14c14605394db771df1e6e1e1a26f1844969c528a439c1284a773810f558e000000b01df620cc195ab215f68e712115c84b0ce5294ec2e2990cb105ea1b8eec08909dd6ba9cefe849c769c79576c5147211c74c454887dbe09be31950836220a5883e6aae96e5c8c46938703ab820e67863ac2d2ab7ed5cd2120eae3147c108e749f91992af21229e6627fb467dc5ea7c00e51ea7ce27b104123f86f8b39c97ae97e14cb67c0226db06970dd8a527714f6e4529de8d03ac4ee4164c9eeab7d1f37cdfb031385c6bd26286b8f58930c7d249a70000021c000000b01e341c98ee4314ffc3941236b746bef90f448d03faade9227d238a78f787d9799d0a593a3ccd3afdab9f9dc308eebb4c2abd59f62aaa4bf038f8dbd445bf4b42084053fa0b404938b65e1ce00461f8a4fc4da989353fe846a3b22d219c58c481630345de32c55d48a4e60d9026c4ba8b2c706ce8ac116173a70ba8c53a428159faa274379cf6ec4f14dc800831429109194a375319f5afd4ac6b960e5a7e8f9dbf52cdec9e7c1f658772f1c3ebd10f3a000000b02069c483c462b3d4adfc7b73db71fa44bc19f26306c8d89aedc1f43b75940c7b88a052222b7a1cbb1f6421daa07540fd506c11c25103efb3addefbe58cffa56c4b50a8a8af520e6a368e385647afea96d051e6513be90cd17d73acf20d87138e2a968c951d1842840ae050f916cfe02a278f05d0247b7997e3da63eae70d0122effafedac97640ecc5a2838b740cd9f10e7ec0a3e919736f91fc9db7f2265dea8da0fd07e4b08c3510f665d2ce969087000000b024c1e6fd3dae4f5df81777986e382116b4ee5eb2810b7a3c8fa52aa4cf8d0d6a7a4d84a8ac11c845e46ccdb508edfcbcbfd10264020b1dfbe5289beedf71c87725b47420357556becea9616e3ebb09dac54ee7f22ac7e42d0ca3285f5ad3de50c85ef67584f12e3b029445b89ee05cbd17bdffb0c7d62813dbd8b5d09281170d970e022abe89dda22d5b514e7be304a22a311c1dfced78164e1336569f7f3c3c6f17acfc309cb796dd13a94d85b7f48b00000fa400000168000000b0161068c4d5f45dc15228c704e82f46af6a9df679326ddca8865de3883ca743bbecbd56c4497d28a6903b6b0c8829272015a7a69b794ed1b70b41a6e164d36c57105a19d37a904c15cd78818915e992fbe227888a3d76b204700fb09d9ba28a378533c9d33f91a14bc83b0224b32bb11f1d2140d049d13851d4bd341c61c7c11a6f4864d6461c6a30ff910a2b990909530faa6599400b5b2bc95b03348083a6a7d1709169120747c4ab87e8b57c602527000000b02aebcabecd32a81e9d7d9f4030766ec56e2865589b185b854ccb10ef9526d7be4731083b1b376f6a5a39008aae8fdd4ff0190bbc6c45d0d1e735113ca77188442e034b646c55dda4dc4088e590225fd1eb1493f6304ed088c7a83c92c3b36df5b0187f1836446a665c7537fa8b2469ee0311602180d874eee1ed4fba76f0a96fce17f63360a2ff4399a95fb2df4b0f2d0e8c7b7118e8129eeb23492e71b7f63cdab39baf178a9bd7ffa3441f64ed280f00000168000000b002afb5e304c168fcb250841f8c7be4001bf23a32ad5134f3b722033745ddeb0929cb2271c40a8d828a99012eeb980acef0ff6f16da910e078a9dcd769d0cb41653c4889e68b90b114f249cf59e31f4dc00b6bab9f5c2566658b6111c9ac459dbdc1101f97070f9f42b46d041ee7f69351c7cbe8006f1b1bc7cb54f692896398bd9c0f6aca4d0d80fc76ab21b60475d4314996a66af7148fd47ea131d5cc8db10b9f969aa59b38b7aa52ee07d8105ab25000000b00f466537270b41dacb22bf6bd3fd136576d579c8a16288861bfe92c21c1b1b2c12290e24a4e9d6bb16e332130f1c5bd9e9eb89cbb548612b751bbce38d9cf41db37854f774debdcd14fcdd67bae457ab58d8ebe9e3a531fbcd139549e2707a73f3b85a7e9970c778f414e3739bace278001b6cab78dac46888f7c2405e6f62f60e1d5c9f32f517feac691d73be7c60d6245485d17979bd590cd3662fde21731d49d5498907d780da8c6649ea8235a96900000168000000b01ad68a5550c1516ab721f32db7ff7469282b12dda3843943bfdfb8d52929a01d4ad8b8c7f44faebdc26cc708fc7afce1324e602a7049e6c04085f919542b442c2abc9dbafe5cfa55bc4e92aee9b675c0312001d1337102a30c51a5f894107254ca88b6299bd1504217fa92dfc3c6185d2e08314b76688ed54abfaba3cd291f33c5a7d1ca44461d69265b78b81bc030740e0e6d343bc3302527b7fc2f2c0132cd85b96a28b9cf10bcb03b709606b377cc000000b00be4e60acc790af1ae64dce2a943e543bca85158ad74dd74f8e3ed950304586501bf382cb00ef73ccd1e71105009389a95bc56c842b00612ae3d9700f71a04283818e2b2ce342362028a28d0b7fc0b6be3e6fcb73ecf39b23c87685e6a9534556d3bcc25be1ad72dfb0cfc3a8b85d400185a3ae8e69cb1cd7494939605ee7ba023dbb61f200f5df808ac3cda5fa875d8238054f9e79d31fe4d5bd4174d1dcabf9932929f09a56130a74a8959d199f05300000168000000b019797f7baf2c176f6c8429a484c93943718481679abd6d91b981292abb9539097169e120d84c3fc1917ca26e9a1e4a8834934b6c3ec9f2b93dbb81f333cdf253460ee59f4bb3996d971d486fee87076e6cfeb10e7d587926cb6251d126567b75cd898dbe6bd09a9f18683579506c0c4818486ba46258c8e1922df66b7b18992a8874557ce8ec17dce991a090cb07b2d22ed2538b14034d6676895321aab5095d53261c59bbb98d3350388e57d8bef92a000000b02e3b59ce9712197c965b38345570280a33de5e708a3c61be19be133d8add4de681fc05c44e5b977a743f81575b838680e45dd488dd433446858029a1de38a007c436960bd04e27f3dcf482fd958ae377c01b697d4971cc386171bb471abef0545641574308b958851be0d55828cec8552ebce1cb95653a558c57df4c1e22b86cb557bfe7c1ecf8550d85c4b09c32e0651ef7c3bce7a804f84728f37600283ed6d8639d4b3779a4e9529ea4c12138aced00000168000000b00310906472c705bd1abac61ff6eaebdf6d4a8ff90a95fb0dc8442d2a6509b08a8920fe9bae339cf906c9af5f4d410fed2774530ae95e235ac96529f82c99c4a1c7066628b64bc7517e0068ca598c043ecfa69b9053c8dfdaf234c402915a20c67b67f43ad7d2230b68168972fff670150d2efd9541cf7f1eb89fce1341d0e38b97790881727cfc2696cb0c9bf52e00cc24e739ffb0123752fc3ce92bad6a378e05cf2d905797cd6572cb1cadca0b16a4000000b02a3586809a105856f755cb8da675f32a712b1887f14a36405641a829322efebb8da9af50cdfbb55a05263211b4645b55e492fd2c38190276466fed0cd46f5dd00e670b82ac41d0e6fc902b80a98cf177b76cab01bae1f15b38cd9f459223bb406d6764bb90eb96d5ca40e7be0221f8c1220639e4742e160bc54e94fe1069e8cdeff07ec7ceb69a11340c508db9a7bac30c5d899da8d23976829f1e9e472baf1d7244c30fc92160aae66362b9920a076d00000168000000b02b836275d7c95e4bb0e2fdd633f533ee9790979e4c3c15db1cef203d780f2e85c09c8d38d92a2b70b113feed6cdba00fdd1755ccb13d989254af5117756313e6e5d6536da3e856ddc4f483d284f6acf6a8517727abffabdb668841df9333be2794e1a614e6c361d7e9d1991f743fded0210d04bfd50e8eeedad7c8ee208609228f0d2dedbdd15de9b838a60eea2e4af8006120236653e23adacb31cf7bafdadebe28eef520062e29c14bc55fa5e0bcd7000000b010372af75fb546d08b40e75f5bc7a0d5484fb1231421230cc65dc6a9ef3fa8b3f56f0cda837436688a16301dcdf9631ca1030368d65efded0af53f37640bcf0768a848985c31738e878c3dbe9c7739ff64bddcc8c4cf61e465e5f838bd7cacd780e62580e3feb76d9f5614229091dbe1206a802af83fbf027650c87addfa4adcdfcea7f8a8b17e7b40cd8b3eb3e72b551293a131697b74dc534bf42dfbdf28f82bd5299501fe8037aafa14554b56c52900000168000000b029ddb89d1e44e9bb8f10e5e079548e51a0e75695736010265bcda3ecce9030386250bbc02a77cac7e4aed562281a9ee243cb3daec9f940fb06573dc21fc2fd892a9d6c280783a0f8ab5282de0637154a57481879111a5979c168b88c5dba7417af5ce1b5cb9c5e93adb375c0e669211610d7e061f40cf5d0741e801011de02fa248353c6459db06adad42f586942dd7224b1dfd9ac16fd7e77ea9e8f8fb8058721050da2a9053343eeaff94936691501000000b010b14ef57c0a213c182448d31bed136779d596ffe91ffe451006b3087293ae3e70e42beb9a5832a9d61ee681b0232380d548c9961f3b31ed58a894489f45d00feb59428aefed0166e4f67aa812f883dc4c5ba02dfebf5eadd5ba22883a4d4501a25790f5e86fde4dbafdad2ee9b62cca293e799250f407e288ea9540c7962684ecb67f4f4b53d1bdc587f843e9c54d3c0053c0e5b4dbc844f9e146323495e308e0fdaad9b9170f4ff0ead3f1e1cc774e00000168000000b008ea6e2f54a87e80fd29790dc4e45186b9f4fdf58b01c9648a7048bf65d552d5ecd161ff343a746e46960cb1b7b337fe46cbbcc11bea4e810e38c4fb0bc5bf5a5e9007e066560ef313fc4be2b3acb9c2602b89f3f289327c089fd1160e99e7c8d7c7e86dad1c65e2f1458ee3cea4638e24dbec4ba798053231a8de405d7342224b5985bbd09b76ddbb4d49d7b00471af2c902e26496de585a91d5d835e1f8755f8a18b1735b64fb50b324579d0c0382d000000b02146f6a0749c44f3eef76bbfef8d07af656e0188c25959a0b257ce4e8aec58b44b1d1a6e99c376e3b246116af4432fd88a6baa64a8ed91defdd7d74c0df3ab069e08711d2c4c4a1731d95bfd0e5ea0b3fc5723d26006b74166ada80e7ac5dcd0bebfe34e01b1a7e668b48f722d5798cb14009167cb520baf45a46d579c8b5199aa3520f48a7dd62dec147c451e646a3d24fd09a9448c5118f6b596655aaba6f503e0701113c2363e45db00f4406f9b7100000168000000b011c34050dcfd0d56f1c9e1fe40a54b6ae6f8aaf3f1456fe40a1da7bcb17ff04eb8a06e0048c47912ac3a7837999f8f3467f9a8b3a8bf3d9c941d6ad1fab186421e34a00bd11000cd87f000f6c636f834cbb8f9b8318f6eeff10435d9f880f3663bccd1542dc8629c1596c51dd05c26e3002db6d0cb6dfa70eb4b6875e0ebc2c31119619ce254e7b320575f69623d092113a1f6c3f8be226b601aef8130ef628f8e81d117aa111bb83f71c8f7b5d95362000000b02f646312ba24784559401d07a9954d8d7f7b16d4fc883adea89f0414a2b7e13ea22c62c9032279a6e4fac3a1dc39280977be9f8a60807792879f0d4ee972b64786e426d525cec87dbf3ce5ef09604d2d8521183d71f1603986d42f0634e47a9e486d3195eedc66e5048bbcfdf0bf38830b823f85987351eadd993b7938db8ad2ddf1b4ed128d619e0e62c372cdd41a172660327bbdf6b904a0e152efaa99098dd095a697ba24c99387c5669b00a22aa500000168000000b01bd9581c48bd45d4276205e116cad87ea3041306d7441f02ada4724c5c5307e9a8c5f2bc605d4ffa4e5b9b6d05d5c2ffd05a09aa66dfae250e416063518a625fcaf18c4cc60f460e1f977d278705d7b3af4c159952253375b7f587d2399bbdc5415b4d5bbd9a3c13bc2d16a625e725cb1b2b51b6df4c8e279475bb987e619c84ae59e583cf6cbfac1a15cfd8f527ce98042dad44a7f4dee0a4261965fdd2d4f8a504e0815cee127c358f78c074ec4a26000000b01218107a7be2140568e4110657012199c7a00cabf67e91ba7bc3a4e9978b4b6066cd4c4364c691983c10393c148a8ca2d7c1f72fb6c2c389303623b1ff90340979ce448aff2b2504a2918590ce1184e95d48b2f70033b772fc98dd87ed80c8afdfc07c6536f60a2237d662c705508ef92b44272f6e0d756e6d995e8795960e3fabeff9dafbe4e2c094bcf4ac3ff85a22142e04db0ee5f05e3e3680a26a7a4f8f081cf1b1fd91ecb79d1d0ec14aef920f00000168000000b01799a5e23b859811295b69fa49757241b505e8d23f534e1240d32ddee8a519e005894df0292fa984b36044a3675ac356dd75b3319b8bc87a7b5ac1978c6bbda546e9f26f296fb0cfac59b91b2e028220d78e157a2a4804d22c5cc32d65209956feb2d73d26b63fe76a233930b1839ba023191e94fb491149906b934437b9e182454084e6c218a1056cdc4a1a0f86db011df68ab878442e0d414455332cd4fbc5dc96fd856fc7998831a9590fd96a9b04000000b01cfd027e5fb7b67dccb7c47aa83956fd43ae20939f4b09001e89aa28d107cab68a6167d9740005ffb83b701b3214879a2e10ce5654a302fa77bcc557b30be97442533c7b39b7784a61f5c71629f932766b39c657d6a04457bcfaab0af6dee3a5479e02d0344a451763ef46c9db7dfc052b1199d9771598e719f6877f9c9273ee79996f33697eb85274231c1f10ebbdea162914367c14ae8c95d9dfaf90b92eb85ec362ef8db9b80df448410478776bb5380000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020100000000000000000000000000000000000000000000000000000000000002020000000000000000000000000000000000000000000000000000000000000203000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002050000000000000000000000000000000000000000000000000000000000000206000000000000000000000000000000000000000000000000000000000000020700000000000000000000000000000000000000000000000000000000000002080000000000000000000000000000000000000000000000000000000000000209000000000000000000000000000000000000000000000000000000000000020a000000000000000000000000000000000000000000000000000000000000020b000000000000000000000000000000000000000000000000000000000000020c000000000000000000000000000000000000000000000000000000000000020d000000000000000000000000000000000000000000000000000000000000020e000000000000000000000000000000000000000000000000000000000000020f0000000000000000000000000000000000000000000000000000000000000210000000000000000000000000000000000000000000000000000000000000021100000000000000000000000000000000000000000000000000000000000002120000000000000000000000000000000000000000000000000000000000000213000000000000000000000000000000000000000000000000000000000000021400000000000000000000000000000000000000000000000000000000000002150000000000000000000000000000000000000000000000000000000000000216000000000000000000000000000000000000000000000000000000000000021700000000000000000000000000000000000000000000000000000000000002180000000000000000000000000000000000000000000000000000000000000219000000000000000000000000000000000000000000000000000000000000021a000000000000000000000000000000000000000000000000000000000000021b000000000000000000000000000000000000000000000000000000000000021c000000000000000000000000000000000000000000000000000000000000021d000000000000000000000000000000000000000000000000000000000000021e000000000000000000000000000000000000000000000000000000000000021f0000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000022100000000000000000000000000000000000000000000000000000000000002220000000000000000000000000000000000000000000000000000000000000223000000000000000000000000000000000000000000000000000000000000022400000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000226000000000000000000000000000000000000000000000000000000000000022700000000000000000000000000000000000000000000000000000000000002280000000000000000000000000000000000000000000000000000000000000229000000000000000000000000000000000000000000000000000000000000022a000000000000000000000000000000000000000000000000000000000000022b000000000000000000000000000000000000000000000000000000000000022c000000000000000000000000000000000000000000000000000000000000022d000000000000000000000000000000000000000000000000000000000000022e000000000000000000000000000000000000000000000000000000000000022f00000000000000000000000000000000000000000000000000000000000002300000000000000000000000000000000000000000000000000000000000000231000000000000000000000000000000000000000000000000000000000000023200000000000000000000000000000000000000000000000000000000000002330000000000000000000000000000000000000000000000000000000000000234000000000000000000000000000000000000000000000000000000000000023500000000000000000000000000000000000000000000000000000000000002360000000000000000000000000000000000000000000000000000000000000237370000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000030100000000000000000000000000000000000000000000000000000000000003020000000000000000000000000000000000000000000000000000000000000303000000000000000000000000000000000000000000000000000000000000030400000000000000000000000000000000000000000000000000000000000003050000000000000000000000000000000000000000000000000000000000000306000000000000000000000000000000000000000000000000000000000000030700000000000000000000000000000000000000000000000000000000000003080000000000000000000000000000000000000000000000000000000000000309000000000000000000000000000000000000000000000000000000000000030a000000000000000000000000000000000000000000000000000000000000030b000000000000000000000000000000000000000000000000000000000000030c000000000000000000000000000000000000000000000000000000000000030d000000000000000000000000000000000000000000000000000000000000030e000000000000000000000000000000000000000000000000000000000000030f0000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000031100000000000000000000000000000000000000000000000000000000000003120000000000000000000000000000000000000000000000000000000000000313000000000000000000000000000000000000000000000000000000000000031400000000000000000000000000000000000000000000000000000000000003150000000000000000000000000000000000000000000000000000000000000316000000000000000000000000000000000000000000000000000000000000031700000000000000000000000000000000000000000000000000000000000003180000000000000000000000000000000000000000000000000000000000000319000000000000000000000000000000000000000000000000000000000000031a000000000000000000000000000000000000000000000000000000000000031b000000000000000000000000000000000000000000000000000000000000031c000000000000000000000000000000000000000000000000000000000000031d000000000000000000000000000000000000000000000000000000000000031e000000000000000000000000000000000000000000000000000000000000031f0000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000032100000000000000000000000000000000000000000000000000000000000003220000000000000000000000000000000000000000000000000000000000000323000000000000000000000000000000000000000000000000000000000000032400000000000000000000000000000000000000000000000000000000000003250000000000000000000000000000000000000000000000000000000000000326000000000000000000000000000000000000000000000000000000000000032700000000000000000000000000000000000000000000000000000000000003280000000000000000000000000000000000000000000000000000000000000329000000000000000000000000000000000000000000000000000000000000032a000000000000000000000000000000000000000000000000000000000000032b000000000000000000000000000000000000000000000000000000000000032c000000000000000000000000000000000000000000000000000000000000032d000000000000000000000000000000000000000000000000000000000000032e000000000000000000000000000000000000000000000000000000000000032f00000000000000000000000000000000000000000000000000000000000003300000000000000000000000000000000000000000000000000000000000000331000000000000000000000000000000000000000000000000000000000000033200000000000000000000000000000000000000000000000000000000000003330000000000000000000000000000000000000000000000000000000000000334000000000000000000000000000000000000000000000000000000000000033500000000000000000000000000000000000000000000000000000000000003360200000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000401100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000060a0000000000000000000000000000000000000000000000000000000000000601000000000000000000000000000000000000000000000000000000000000060b0000000000000000000000000000000000000000000000000000000000000602000000000000000000000000000000000000000000000000000000000000060c0000000000000000000000000000000000000000000000000000000000000603000000000000000000000000000000000000000000000000000000000000060d0000000000000000000000000000000000000000000000000000000000000604000000000000000000000000000000000000000000000000000000000000060e0000000000000000000000000000000000000000000000000000000000000605000000000000000000000000000000000000000000000000000000000000060f00000000000000000000000000000000000000000000000000000000000006060000000000000000000000000000000000000000000000000000000000000610000000000000000000000000000000000000000000000000000000000000060700000000000000000000000000000000000000000000000000000000000006110000000000000000000000000000000000000000000000000000000000000608000000000000000000000000000000000000000000000000000000000000061200000000000000000000000000000000000000000000000000000000000006090000000000000000000000000000000000000000000000000000000000000613000000000000000000000000000000000000000000000000000000000000060a0000000000000000000000000000000000000000000000000000000000000614000000000000000000000000000000000000000000000000000000000000060b0000000000000000000000000000000000000000000000000000000000000615000000000000000000000000000000000000000000000000000000000000060c0000000000000000000000000000000000000000000000000000000000000616000000000000000000000000000000000000000000000000000000000000060d0000000000000000000000000000000000000000000000000000000000000617000000000000000000000000000000000000000000000000000000000000060e0000000000000000000000000000000000000000000000000000000000000618000000000000000000000000000000000000000000000000000000000000060f0000000000000000000000000000000000000000000000000000000000000619000011000000021c000000b005d3f35b85943fbddb15a2433e40e14bbffd0428ed377207d839681071f323671520817318228f81de9d553782e9d26938bc40c34fa0fba8075909f678683659288fe980bae96c9b33f338d0276829263fab2aa15135b34ecaefbc6800ad7673bf58e42bc531548e86e38ab0ee74d11c2c8349ee27c824cf11574c53343c188e0ea5e7de6e8914f8256bac61e905c40d28d7da4b60c66367f19692d4c3eb475e3bc500bbdbfe604536a22cae93540b64000000b0251f4ff3e7056e2cd64be5b370d3b4657853264dd8b85db8b4d196e0c54cf6b9b7635e9db67ea22335685be622b33ae73dc810f5b43bb72909f53d1c1ef654d0225e69c329f44e76b6e0c4a1560704e6f00ee5c2ee37f36ca92a6caa7083af86c1409e81bfcf68ea7d29df626991ecc81316758ec0a2677b4d755cf4c76c01207f3948714c711b7235e583c05d389a1e29aac544e0be25ee31f86f0025dcf64b92198a605039d9b6d19d6913a0885323000000b005c44bab381c126a1aaa7cc423a4e73540c8b2eaa330cb5bb5f7ab890e8e4ebd8cce97b392d1b37da1572a5b60e7d296cabc500d6a4fa907289a5e42866f31c31744d9cdc57c0ee65f799bb4e3ae7a78e7f7dd358c2be50d8a346169049ee355e207cf1715982a987fa663a5c822ce3721b934cfcad08dc006311c3ee41a95ff2e5dcca6a1b9efa3459d02ff2178c2d8131aac11ed23b259ad0f0d3bb9cec3011a889fe50104c4493c55a724dada810d0000021c000000b0282e8315ddbe1d28a43d3904391d7ff9e56157b7149bd3c023ff2ada27b3eb7917be4e5246ceac49f09aaf255a2ab89c549f771db9803e82087b99c894c5963d88d78b0a566ce1f208dec1f8619b072d5a52a7c57d84856beafe387e51955c0298512c4a245a62b0c3dfcd96bb44b6b80e4afd9df5c64b069c25b98db888b11b343198bdbafaba6e294307f07e5be6a52a08c1828cade61900748ed98e95e9d0face186a15824c40ea844afc2676e7e4000000b0018ade77027eb138c689ff99cac096bcd4b6c881b2e4a3af54dbeaaf44befcf70ff1eaa96b1507e46dc01c890b70e36dcaa7cae66ac6e8c56b416c885948d9997e8fabf97249fc97bf5d4a4bed2a8fc473db0de2ccc98c9252e8d674d918aeeb964a6e8e57709f15f12a471612c379782d8403e301ed90a7c524eb5e7e68e56d2c39aafbb22a57b352674afeeb994e600002089f989e04050f9378edfb65cb4b987ecb76bab125cfeeb31ca7d80fd4e3000000b0043f3ea34f10d219e2d82657bb66470238c8b9cdf618874b4210fb603f55de0895e301d7af4aed158f1e56b1204e106c4400541e07eeb3ae7eeec676c3e9b376aa38fe908b6011c0bdb5a1ec3cac68189bb84a274e2352706e3a330d341dcc147d6ba16e979115057e9aabf78fc4841907aa89d5f2cbaada3e9ba7319325c041425c3619826346837fde90c1519290c8126989fd205d93f66d053c53348e73087720579563033abe3e3ce9978a231b600000021c000000b02e3d38020059e9ca06f8bd85c7fdde9e19af4f8f817095a22b6a5590863dcf7681bc7516c4da2dd536480cbb80da07d7b640778e8e9a03be566f955538ae46dfa7f4a812a2a03c8df74f3d35dfec26f1738800fb5b13908292ee55e7bd4b7c5a2072626b9e9fbc18639cb8776e68c8921ad98f38fda58ed98480f9a0a79871249911480f3001466288f2cf69a8c705ca14045c6cdd68ad2888411a966bfcfca27fd1b1446bcbd89b325254243e1a1c8e000000b019e444b2ccf7a99dfd0431df726c31c61eea31376eb61d6b2b198a84ade14f12403bc37ab2948c4a574251f0e7c3269d9b642cb5557c580dba05e977bfd05e4e4fd9aad21cc73867507380217de6b8bf685656ab12711fe4e5b553ce8179c9b4e4455d61c7440beab993a277571a35891a10715ecea49885d99d7a4ec35ffd704445a84de6bc69d67bf72477461b868c2ceb9aa50b48c784235634c669bbce2cb8fed4ebeba3f53815a1cc0cf91c4991000000b017412f3ef5aaaae27aeed78c816f7b6805f5f68aba9e19015c79db98d2fd8e0689e6237eb9c704e6449d7601c686cacd3c154439d744e0b6708cf0d45f2c41ac260bc236a8d55d9a82eb7fdeaa683d1f83c57ccbe7a208bee5b3b97c6748f23382bf26cbff40086ca8fd8cfb99f3674e105e3e9ace826ceb5dd0105bb1c0b28ef0cb5a84082717d68aa52e27741739c71506e9ced83b2e799630e7b5ad49903b45f6748a4e140edbe97e21b556bee2d70000021c000000b01a7f0aa5df63a98ea42a755baa4bab2f9ddbcc01915321a6239f4898500524e108eb3b3781ffa853bec0989e7a9d344b1cfd7fb0e2ae9e471692e5d134e8554b6f80349d9db23258f8786b522a6eb6ee9e05fa922e441d74db2b1a6610244d74b32f610948a8bac7746fae34d7a9ae12143c22179472ee53e800fb2946b0846516ce59eb6c52e7085920a59cfcf8bf012581d09e63f2f4b1a226e9061c07a6716fe2e049cab0d43dc7b9ccff6d003eb1000000b027fc4265e0529d27fe1d1bcd486234e9e52ee1d185ac7ae023a4956bc16d04404d1b0a4143d0e427aea62aa2a828d488c4729c24fe74ba51403361ed886e65f4d6670ab1ad552c9dcfaf6fcdaed5bc8fbec2e074893f129e330ca403ea203bcfb568d35928457835eeab95b24f0f971b0bda55d51cb046f70d8b9972c3a0ec1a401b0036a23d757e66a6600c3c3f9c3d26670e478869c801e7ec94bd0dfad8ae1a217e6d8a7587dbcdf282a87bebe540000000b009c58f410b07d63948e62c2e8c3b5a153c66ce08bdd5997f98e40191ea7f044bc6af54453c666d3675d72b5f3a03f29bee37282430a84c1df10cff5fa50a8bad5479854836d586c189abe746181ac37136b110fc135635078175535312402a87d905d11d1a6217fc8fe4ec9b875a1922277752dcb9a8c3d03aabafef5d1c8d7e71caccb28e67528a0170c5dc6592340e283e14b66705f6c884067f743e4237a95b549571149557e7bf088da9cd77a27f0000021c000000b00144a2d285e971c143fc66d4947aefbaebf502fa15477c0c25cbf3b58f8f8e136c07c2a0a5d3e85903dbea20c1634d28390af1d9582dfd539274d09c1e4903d312824dafd88fe882f34eddb65647801715fab63a765c4124b2199bb9881d5df3d219a8166c04d596cdae6f40cc071041138057f790246370e51c738cd67099a13c3819afb8b128aba0ddd4fbe60c41ce0bf21298ba91f5256dfdec2a027dd40e9e8aa2384fd48569c31e24f539495788000000b001d6dc44133b025afa69a83eb3fa0effdd4e76ed857c98644909d3a7d95a52d67d3491a0aefe2dfa1b3260a8aa95ebfc4bb20a6344b64f4b579ffc9880ada0b41dd0d0e5b726cf58ec6420acfe895d2b34e6baeb3712a268f054479a1c03c3afbc1372dbcdf72bf6fb8e7ab9514810182374061678c2bf5d5d1767662f8932d120cdc6b40a1906c55ec59c200b4755f41b540d356b20cffe7bc890a01f7859f54313b2300f397d412c6617ec5a20bd55000000b007b58c154a2751fa894af555b59da32bf374dcd565820a8b1164c804138bfc149039abf4434f66e313bcf1c83764a87331add8bb321eb8505e9d61cabfd1dd4b910e99dcab2474737a2b8367d628b09a22a515829bc04cbdf69f65816451b447f8e5bcac10ac0c34201c12ce85a6735803e1799b5d7919032a515d870f4f39e28624d8ad85c19cc7755a794d4ed4de801ea030d0c9f44b706b08e648cd96e3200370a99e9ec87461d0c8ccc370380dd90000021c000000b00c2553dd081028b65fc72dba80b548db9e863a2016617b8e0d28d5b4d0e9645d659c3975ffe4f32eb160bee10c0df7b5bc44ea0ba4288c0ba87725b015f4c91a9cb6d40b7de35f7510b48d697ab708d8e79f0dd14467b782100907e329959603c3d6ae4aa1343ce34d4fe0f829a9681e2ca84ad5e2d325f0bc18dbffdc67137a58eb2a75911e8bc623499bc9b7a1a1ed00a83882e4ffef3b3dd9b73d885f3dc994c43fa08c04cf5227de287547837115000000b02fe0547a5253b04c89daa0bfd8aca7b3bfd62a6ac1dacf40d26ea819404d26b16329bf96897de345cccd0b346c6b611aca7255407340ab199d42d66e3fdefe33250f37a3490b5f2ce26d7b7333fb59d9c529c275092029d77366d5a911632133dffee2f5cbebb4af6460e5c4e5e82ba309e8d0fa345bd79883f7cba626e0fc625ebc9da458c6fb8f4f8a7c8ebff18e460046fd472ead15ad4571ff4a46ccab987ce83b52f4276a18a9b3ea319a1b314c000000b01131b52f5189b18b060bbb68a1a15eeb6de938d1b8079ddabf33468383fa3925d4e3e4f10a39b3dc10ec2a8065b7776eeef2d7343f07ce20b973db4734fa8d6bc59e52f847c23b399f9ee9d0dc38b7a9621cd554b2b9d4e5ade6149ed32c1c199b85d2d0278ab6009e36857ca9e8d8e70f307c41683e6102cb53cd945458f453532e861c6e34757e3ce988df99b943fd29372b868410c6c88035ab682a14307c357f383e8157f0d91756534ab2893ff30000021c000000b01a823a05f2011535a3dbcf3066177f9cdf04a3a43baaf955a2652d192a05449f1f17a7b8eaba84b0fce6e784a0323d7a6350eefb3009e5c1bfe3c0164e1624539b8756d4fe3481d6745cd9ee6267a8f9d8a8e19a31aea18762f2b7f6edd7172246be9772c004e0620c3521d166d8891e20d58f6aab923d8d852e8c8a2c649ffd3a647417e817ddb79aef2f837c1f67c3168dd42aeffa740696d6d6abd1d552fe030d77831ef4ce9534aeb1f30c0114fc000000b0017fed12cf69b0d286ffbee9f2eff931dd9fdaf49e2c818a575fe0b6514944d54ac2a0a670133e8f2120737dce958ba6c629bf5f30a8b132fcc7b9b457987b14ec7763c9414f3c9b6b8dcd3040b4752148934a77e11d31a3c8b0ff9c98a43e5b8ea7526adf63b5e76601ca091c33131b1208679b0d493e88e5520d32be673facf14ba14b76e3d1447bcf862282c165d71466281e34ed5cdeb3f6d158e322beeed2fbc530ccbc73bb61cd21928a34b182000000b01914716e86b01636d5ec2796b6efe1131cf1ae974201e9afc508ca6c0284971720b0448368da425adea2c56febcb229a6019a2921e8c3e7ba9ed45c795d25acc5bc7f23505187b057693d7db7472db8569996fe821ff87f6c64ffd30438f5fc8ca6109fe56484496833417c85f24c3261b1b6ad0d8f53d5577e83ac16666ddeae889ff4ee004734fd047b390c7d75cbc14f2dbf5f73bbf82c54e9a2b9047b6a8f137b8786791190a8e34bf872d3f59940000021c000000b02431b75ef991ae72014bc0ad40f6d92c7d88f74b846cb4c7acd0ba21d1425b04361073b7504573cea1522b866522843d8b85b6d4b680e293588c589f6bd95c01c9c2db71fdca13be9c862ddafdcc4a52fbdc092f6e63998c4bb84bc646813d29e2ba9b1f837190e88e5a8669ae63175e2c7e882f5d8d65d7ef896cdb8a55080b49d8acba4897390b30ce4d06babab5ad0cadbe790146c01d7d004225c26fafe7ffd7a34c31f96f0bd98d6ad348f13e92000000b00099068c6d39e682416b7e082f1b7fb92b00cce9dd7a699d7842920eefa97ad872f078899c5f79ad6f8150ea431605a993c5c727182afc4a5b8f5ecafb000f3f9e82ca715e02a65b152aece26ce95d6028863b52d68a589f375069bacb4e6409c18f886d8559b9a26a9a350de8c257760d6b9228a921f97d9912c67c9226b054c8d07cc3132018ad60367af3600a01e92df31888929232269dd99adcdb6c26d550f9a1466ed183934aca6a3c705945de000000b028fc048841ed315558d919c65471c040d9702ed0e84c517ac666c17d111527de876be4730dce5b02167eaf137c49948a253a7d9b834af2f51113829fe3bee5e55c230c2e2b88d2c679d45897f39da5b7a4affc9bc5e9bdb5276990a0fa32819ea7e3dc289f88ae8598a49b4ad31920f600e0da3d185294492ec6fc65d299b4c175627a13ed06908873acaf24cbc7a7eb162470f8664e5accbb13144b9658c12ce22725637b97d7e7c8975836f023a8e800000fa400000168000000b01a8cb98a41c762e3b623664376932da10773c35981e07e0697bc5b1c3a9d18512d0f727af185cd3cebbfd0ae4dd83b05907761012bcb8b3234490e8e5d2b1e5c42474c2486ca936b892b4ee5ef023b2fd5b42e9c622a11caf6d127033a8ee90e802b6b52a8e4f86d0902e715211566cf07b75486fb44b002dd502567ce5037d6cddcf57a6f399781e1d0ada1cfc979021c0cc8bdc99b3e782220cd3c4dfaedb3d0d2abacb0c2f615a3ad0e3b047f9bbe000000b001b8cac023ea2209df50ebf5096c203428441504b29cc88a2f37f3c536926804aa0a794a506738b4bf2dd6d54cc7fdfa61726a81c46b315671ae54e23736c201971c4081f85deae5e92fcb9d4182d31287c03f6037a638d657b1c383cc0a5e11817eafa2e6fd261f65d3ee9cadc2c1b5237071db3ab37148e405b5e966c269749696c982d442bdebddeb4108f0e733fa0fbef563259ef98478b3247edcb3ced95ff67f71c8fcf4adb9ccb7e8976a463b00000168000000b00926e8b58a6f84470914b3018d66a9c3eb2eded62c2589faf2983c88b532add1d2b419bce240fdce26c744bc1afd76910f251a4868b2539188e597f94134bd260f1a98faeca5c433f24c1c70f40862aa1e79b831fc9f44441908a13e4135b898758d4b9185bd588ce297f664a15820f00b86429ef1e60656fb59a60d09058c2e8c6935d020f2bf7f9cf332d6c92e99d00b137e0201a2d98c52c1fd84ef9966166dc58f658583e5feeed1caf9378a6bf7000000b0109ce1e31e822ac6756ea2c1f60454a45b59aea1d06f0ee46b63686db1b2e1a5a8d828f64b1c859d19d8c1be9ba4158637bc4475b6852e3868d123e2ca94ab82daf3843587c16b3ea7a8a1980f06348b43e520c8a90d923329cfeaebeaf80a4b720ea9a131dc5c5e2f1b466e33d55c600ad897890f3466634564e00170bb21ba1000eac0b6a6651f371bd9d7410e3aa003b839ec23b3d26546f930f3e4da30b16b584e0d40ce3e8c7c6e8011bbaeb88300000168000000b02460f48a085ae3e52bff12f74e129688cc1d0910bc945f4e361500a053822013a20fbf5a854eaa342d01b1fd650660e71af42c8b747a9e0ff26f509db1b596029f986112d7b98d2238e9cc481f3778d379dee19ca9b65c753b3da88c81a87b9be469ba78b6502193b892988b46f668560e002d3f8a64752d01465d6e81affab7fbdb24b59cad7b2aca7257f33f83236b104f211d1960ed1b5fae088c35bf91ca6ed6beff2867381225b9b6db84b31c9e000000b022c23bda86f0f30eed0b4f7f6c42b55231cd69895f7670a292742b1d769a0f06a4b6c9385111e140f0071d480c3d3ea1f5e60a122efadc18a648b568a93a54c9550ef7d80f49a8b68a8984fbbcac3d18ba11e640b6619e8a935c6df1fad31a87da57a18cebeec486a0331eaf304cfd12237e32e406755fd20216114bc86c2aab649cf79c01ffc7a87531efd358999a941fc0d8480ea13fe3f2ba8b7d6f7e2fba227e99aa4a206cb03b0dae664cfff49300000168000000b0156e084b89a04d30c4b4dce813ed6720a1a521a8273c599f402448cfa0604b571461f709e9b7c38e555360d1dd11e58fb81cd7f95696f62017feb0caded863c0a8ada19670c119c3c350c366996b37660d722bd57a12d1df8c652be09e108a3e133934be19c2fed4299cc97a9a7a3bc32aa16bf0e62e1052829721766b98c53a4d35f039eca22f160bf0784a7f1d205900c1f5b2799f49153eb1d1a2b91194683e77483c571cf13ed43b027a6057f35d000000b017caf09bc95753be87be3b475ec994efe7f11f98e22bc17d1996d3cd67904d161561d2a6262fd6daeabf41d2a8489625769d6ddd32b3d9ac7024963af9e630b5385748dbb49dc77ac0b0abd05060419402f6f6b909043c2c8f7d8e6717ac7f3eb57348c3f70f8f914218a513b0af1e732c1e466df42f6b7e76b871a862a1ef84c54b3e2e4ed0d881427335f9361ef37e1c79575fd21e3931c551e45b50571706338055b3502a88951ed41dd616b783ae00000168000000b01adbe6a8f903ca726e38b0b3db5b1acbc588ae7215996f8c2ccb04b3d71b3c8d456ecfe031b130d1e15bcb1c82f0f8678918e28792c7aa358cb9642ded68857cef2bb1d44d869f1b855bb10d550645bfda203e3f0ce4c33e8cf0881225aea493a12455ee2d31182f8e4a910870b21ccb0abac2efe192f70977c7d2797337a2644387acbda8665e4306d7492858b1385524cd4f9910ad0449d250b52e0cf48ed118a4a5fb3cd74cf99c5ac7b9375e377f000000b00ec7efe4d92653429e2bcee7a8b5ce815cd081e176ef6fe5b93e72721af0c282378915a5744be821d32cf8121593e5bcf9f69c36de4ba6a74e7723ccaf5aee57ce1678eb96fda3bb1b989a6d5981644f65624a19adbffdc4c9ae99f3284f3f3db9e2bb75e2d6cb9cf90d083dc0fc13bd0a4485d3ff89098b974ff01286fa7318b1b4ba0cf65b37baee89ddc1ca54e85313d981be599fd150a33825baee5a242bf04a4def8919f81068a8823e0b2aa39e00000168000000b018e65042e761dc1a9bae64e084a2163cc39616076775fad6b69fb90e6c72d3b91800847cf5ad4516e48a81aaf4126c0fde214583726b629b1719db4bbc0542c258b1d6e7cec44ee265b0e9f1102ec4b4fe15ae15bcfb5294b0bb8dc8e7063d12f1acfc8060678ab470b82a316a2fa8f606b1e96a51a7fb09cdc3013c930cdf272037d9412a996afbc34b59e7ef65441311b848c9ea5ad0e15de1a993e2f4da7fc4b548f033437bb6921be6a913b01b97000000b002987151fb2d92f8c7a2437313dd071b46e00b33590a7dfd1026008931d5a4d1a9524dc2a1c7ed51e292751a56e450b4d530e56275f48f28c283ce624515bb830b3d7c81815fcfad2b7ab3afc184e14da3c58949d91de44fe1d354c9bafbf244bd47513235e959718b2e5fa70b34a35501d2925505b444d7fa128297b15e40db76b96133aa8866ab3dacc236b806cca118787386f97e28c38d7e7d60661e35d850c1366fc43d86f81d18860d311478a900000168000000b02ffa4f52b24c4074c6b7478a0aebe6948e702061ca42eb43c4c8cbfc4b0ca3f847d796fc10551398a3624d7dcfcc39563e93d99542e6d023175ee687d8b76479498470e8829b73ae39cbc37e3e55fe164568184f5fe42be693a39981b219acd7c9291e8b908347e7fe19a6cec0f3e57412716593f3443f2a960b011df443b561818f1ba0e6572dc8fba690e5c003aebb2ed0df82318a629afa2b894abfc07543d893fe7ef5c038b48ec2c7999e9ef5a1000000b02328dbf75069d2627c701cbc32ce0ada3487a76a44d27aaf8ec6597d15fce511e82a94caa1c7229c68d0f84f242ce9d1db8a337b1d5ed662d78d0c3db783b86611fc0a94c960882ecc4a31ee14868384c392a9d30384954aa92603d7fe201bb150eeb4f33e6ca9c663e42ffdffafd6eb2659064574d5d3ce72fe778a6ac42fd95d7d61d852ee227780971f49a086a8e52a11b79f45af94ef2c954897490af4f0e32c89b5cb1cd80ad667c505e935bd1000000168000000b02086ac50475b8bc87df86efd06d485d696460b802499140cfa6b4defa72151255f94d710c2ae907e36ce807293d730eb14e62345f8e9f97770b594f7b458b497e17916b7164dae02d23247a0cee6447e282201ee42ac6ce8fc7cefc3579af54dd75980e7a81c3a3385f7c66bb4fca8fb11facdde32cece2dcab2041bee9bfcfee2bd0936b5fbd971a036b02be9280b161b1b4f64a97155cbd8f65ecff8b5a88ff98b7bc93036b377d9e1ff7f50b5fa8f000000b021ad6d960281f749ed8b77f5673dba1b3bbd1446082105eb024bee71fa911b602419e8c52d20007213228567afdb95235f8640e7491fa56c9a811df04166e88d4975678efddf90f52ca330f8ec71d20db9bf4f720d13df29841153c5e6eabeb3d4c6a49f36e56ec1d83ff105e6822cbf09168a64ad4e4fe37d6c0df93021b72d8da8f15c2bb94ec4bf87cc3379d82213123fe0f557a49014a2f3778cffd0ff0848dea45dd996ace2727998b04b81d28f00000168000000b02020b8481785455676c5ccaf3aea8a4c3d7ff3c5368e319fb6fe333afb391869d15d5c52bbf336e44134feeee658690c5f07e5925fd2a5887cd0439601dce3b3f5fb26e5bcf140be182a9589f59644d1eab5ecd26eecec4a80c2c3278aea448fda1232b5e480e3ecd881a4cbd8a97e4a04834e343d470a35d40f03b52b17bbd58d67d5e5400208a122fa268226b0c8671bde0ef732081c6e414db466776c7e5b2739f01927c43167056f9a2687c6aede000000b02a51498f711415acc4f100d1e844630c11895dd243061c6279bc6e2ea994b39d913cbdd90b8750896c9e9b809746e9f079bd4425c34d32747bf41905787cf5a346534d7f71fe5d5433f117524a141059dddaa3dcda5974e3a86a53f7a4e41e92b58e4583a6c186f9c729b5a4e44135b70bd8b6885b9e3a11f2103e32d5edc11ead0258cf068ef13d58c0fa34c5ce7aa22534f44ad95a2730d00c8b935a9f9741a808f5f7c6876bdbfaab7e87b218d37200000168000000b004793bffc2ac19df594a05c0460ccb7faacf7a211bd7d48650d7dc69d933c68714eddae34fa959502a52f2a76a537fc7ed939d0e9bc51e2f577c9718c81745696b2b7bb41812076ae79ae8afc83da298e2fcad45dbb07739f2d4e646cf7669fc472f17fb420b56c3079f3d6d79a3c6640393b33f50a403f3835af56172513f3456bc37dac40229eee3a7c429c95406b5000f121ec96c1c67d24ef753754cb31a485b8020381424a6e6f7ea45af5a4f21000000b0047d25ce9473cead86fb16e261eaf5ff059b786cfc970ceab262af3a29ea2db863bd267a7d31cb3a61c452cf7ec4bd4520ce978cad3ebe8eeac5987a73548848e777043f68ad4488a449244c549ec4f9642e89727c6bfc21fd9072c36e61f8d0db3b8fac510921a993965cbd0fe59f9b16e04d1279da683d9559e05825e65e13c48daaf24b71c3bf78cfd96ed8d134cf13146e620eaa44d957b52d34929356d82ee6fa15cd7fcef45545d124e87a919800000168000000b004f520e015b9fcf3514aebc3ff667485156ba99dd0283bcbd685f3d3e127f87097a73ff0c864f2d2033d782c7b02ad36848f4c5c189c15464c98c6a6c13b3f36ec61cbaf1eef7120044605e9fca49d174e82c496e620b95e7f3727869b117dabafbfc11e008768399f67753a54f1c3ad24b5dcde714db721bd64d03ef3849d4f905a0034fdf07765c62d77fd5b3a2a0b0fed5eabb0e7e855a5938e6ebc9c048cfa8ec5eba38a3ecb74d696497e75b981000000b010eb2ac1fbc595f33e14d97dcd7b8b1c6270b2d63cc5abd1aa495e1483e814daa3a7245dc8457c4a4e0e95dd52d5ebdcfef5631efcf686f647d6f95da3f7393b9c225488c29a14a25d593ffafceb21f0040528b1b297f378632aeec1a557242aef2da67c556c860c2b8322407ad51bf608710fd56d900efc3e73423c5f72e79926c32cd2fc79f730c2709d6947ba40850858eab1daf54733d52d5d11b34d636c7d804b2331c4a2a9720e3f67608846fc", - "txsEffectsHash": "0xb7e1130633f3173f7cb9b78fb6e82a99c39ada6ab719e96195d641ce2a4c2591", + "archive": "0x00f4e742fc0ed23e57b5bdbabad8806c1fc9f51695dadc9fe2dda7a6dd16e830", + "body": "0x00000010151de48ca3efbae39f180fe00b8f472ec9f25be10b4f283a87c6d7839353703914c2ea9dedf77698d4afe23bc663263eed0bf9aa3a8b17d9b74812f185610f9e1570cc6641699e3ae87fa258d80a6d853f7b8ccb211dc244d017e2ca6530f8a12806c860af67e9cd50000378411b8c4c4db172ceb2daa862b259b689ccbdc1e005f140c7c95624c8006774279a01ec1ea88617999e4fe6997b6576c4e1c7395a22048b96b586596bd740d0402e15f5577f7ceb5496b65aafc6d89d7c3b34924b0c3f2d50d16279970d682cada30bfa6b29bc0bac0ee2389f6a0444853eccaa932b2a60561da46a58569d71044a84c639e7f88429826e5622581536eb906d9cdd25a2c0a76f7da6924e10751c755227d2535f4ad258b984e78f9f452a853c52300e212d8e2069e4254d81af07744bcbb81121a38f0e2dbed69a523d3fbf85b75c287ca6f33aadbac2e4f058e05924c140d7895a6ed167caf804b710d2ae3ba62b1b51297b3ea37637af6bd56cf33425d95cc5c96e9c2ee3077322fbec86a0c7f32c15d2a888c6cc122e99478c92470a1311635142d82ad7ae67410beeef4ae31f0902ba2fb964922a4610bb18901f7b923885c1d034da5769a48203ae6f0206a92855e2c01ddb3d6553386b5580d681b8230fa4062948668f834f23e0636eaff70aaa64519aafdf4b040bd2f9836e76b9dc13cfec8065dcdf2834d786e06260d100000004380000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000014100000000000000000000000000000000000000000000000000000000000001420000000000000000000000000000000000000000000000000000000000000143000000000000000000000000000000000000000000000000000000000000014400000000000000000000000000000000000000000000000000000000000001450000000000000000000000000000000000000000000000000000000000000146000000000000000000000000000000000000000000000000000000000000014700000000000000000000000000000000000000000000000000000000000001480000000000000000000000000000000000000000000000000000000000000149000000000000000000000000000000000000000000000000000000000000014a000000000000000000000000000000000000000000000000000000000000014b000000000000000000000000000000000000000000000000000000000000014c000000000000000000000000000000000000000000000000000000000000014d000000000000000000000000000000000000000000000000000000000000014e000000000000000000000000000000000000000000000000000000000000014f0000000000000000000000000000000000000000000000000000000000000150000000000000000000000000000000000000000000000000000000000000015100000000000000000000000000000000000000000000000000000000000001520000000000000000000000000000000000000000000000000000000000000153000000000000000000000000000000000000000000000000000000000000015400000000000000000000000000000000000000000000000000000000000001550000000000000000000000000000000000000000000000000000000000000156000000000000000000000000000000000000000000000000000000000000015700000000000000000000000000000000000000000000000000000000000001580000000000000000000000000000000000000000000000000000000000000159000000000000000000000000000000000000000000000000000000000000015a000000000000000000000000000000000000000000000000000000000000015b000000000000000000000000000000000000000000000000000000000000015c000000000000000000000000000000000000000000000000000000000000015d000000000000000000000000000000000000000000000000000000000000015e000000000000000000000000000000000000000000000000000000000000015f0000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000016100000000000000000000000000000000000000000000000000000000000001620000000000000000000000000000000000000000000000000000000000000163000000000000000000000000000000000000000000000000000000000000016400000000000000000000000000000000000000000000000000000000000001650000000000000000000000000000000000000000000000000000000000000166000000000000000000000000000000000000000000000000000000000000016700000000000000000000000000000000000000000000000000000000000001680000000000000000000000000000000000000000000000000000000000000169000000000000000000000000000000000000000000000000000000000000016a000000000000000000000000000000000000000000000000000000000000016b000000000000000000000000000000000000000000000000000000000000016c000000000000000000000000000000000000000000000000000000000000016d000000000000000000000000000000000000000000000000000000000000016e000000000000000000000000000000000000000000000000000000000000016f00000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000171000000000000000000000000000000000000000000000000000000000000017200000000000000000000000000000000000000000000000000000000000001730000000000000000000000000000000000000000000000000000000000000174000000000000000000000000000000000000000000000000000000000000017500000000000000000000000000000000000000000000000000000000000001760000000000000000000000000000000000000000000000000000000000000177370000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000024100000000000000000000000000000000000000000000000000000000000002420000000000000000000000000000000000000000000000000000000000000243000000000000000000000000000000000000000000000000000000000000024400000000000000000000000000000000000000000000000000000000000002450000000000000000000000000000000000000000000000000000000000000246000000000000000000000000000000000000000000000000000000000000024700000000000000000000000000000000000000000000000000000000000002480000000000000000000000000000000000000000000000000000000000000249000000000000000000000000000000000000000000000000000000000000024a000000000000000000000000000000000000000000000000000000000000024b000000000000000000000000000000000000000000000000000000000000024c000000000000000000000000000000000000000000000000000000000000024d000000000000000000000000000000000000000000000000000000000000024e000000000000000000000000000000000000000000000000000000000000024f0000000000000000000000000000000000000000000000000000000000000250000000000000000000000000000000000000000000000000000000000000025100000000000000000000000000000000000000000000000000000000000002520000000000000000000000000000000000000000000000000000000000000253000000000000000000000000000000000000000000000000000000000000025400000000000000000000000000000000000000000000000000000000000002550000000000000000000000000000000000000000000000000000000000000256000000000000000000000000000000000000000000000000000000000000025700000000000000000000000000000000000000000000000000000000000002580000000000000000000000000000000000000000000000000000000000000259000000000000000000000000000000000000000000000000000000000000025a000000000000000000000000000000000000000000000000000000000000025b000000000000000000000000000000000000000000000000000000000000025c000000000000000000000000000000000000000000000000000000000000025d000000000000000000000000000000000000000000000000000000000000025e000000000000000000000000000000000000000000000000000000000000025f0000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000026100000000000000000000000000000000000000000000000000000000000002620000000000000000000000000000000000000000000000000000000000000263000000000000000000000000000000000000000000000000000000000000026400000000000000000000000000000000000000000000000000000000000002650000000000000000000000000000000000000000000000000000000000000266000000000000000000000000000000000000000000000000000000000000026700000000000000000000000000000000000000000000000000000000000002680000000000000000000000000000000000000000000000000000000000000269000000000000000000000000000000000000000000000000000000000000026a000000000000000000000000000000000000000000000000000000000000026b000000000000000000000000000000000000000000000000000000000000026c000000000000000000000000000000000000000000000000000000000000026d000000000000000000000000000000000000000000000000000000000000026e000000000000000000000000000000000000000000000000000000000000026f00000000000000000000000000000000000000000000000000000000000002700000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000027200000000000000000000000000000000000000000000000000000000000002730000000000000000000000000000000000000000000000000000000000000274000000000000000000000000000000000000000000000000000000000000027500000000000000000000000000000000000000000000000000000000000002760200000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000341100000000000000000000000000000000000000000000000000000000000000540000000000000000000000000000000000000000000000000000000000000054a0000000000000000000000000000000000000000000000000000000000000541000000000000000000000000000000000000000000000000000000000000054b0000000000000000000000000000000000000000000000000000000000000542000000000000000000000000000000000000000000000000000000000000054c0000000000000000000000000000000000000000000000000000000000000543000000000000000000000000000000000000000000000000000000000000054d0000000000000000000000000000000000000000000000000000000000000544000000000000000000000000000000000000000000000000000000000000054e0000000000000000000000000000000000000000000000000000000000000545000000000000000000000000000000000000000000000000000000000000054f00000000000000000000000000000000000000000000000000000000000005460000000000000000000000000000000000000000000000000000000000000550000000000000000000000000000000000000000000000000000000000000054700000000000000000000000000000000000000000000000000000000000005510000000000000000000000000000000000000000000000000000000000000548000000000000000000000000000000000000000000000000000000000000055200000000000000000000000000000000000000000000000000000000000005490000000000000000000000000000000000000000000000000000000000000553000000000000000000000000000000000000000000000000000000000000054a0000000000000000000000000000000000000000000000000000000000000554000000000000000000000000000000000000000000000000000000000000054b0000000000000000000000000000000000000000000000000000000000000555000000000000000000000000000000000000000000000000000000000000054c0000000000000000000000000000000000000000000000000000000000000556000000000000000000000000000000000000000000000000000000000000054d0000000000000000000000000000000000000000000000000000000000000557000000000000000000000000000000000000000000000000000000000000054e0000000000000000000000000000000000000000000000000000000000000558000000000000000000000000000000000000000000000000000000000000054f0000000000000000000000000000000000000000000000000000000000000559000011000000021c000000b02f18afa46b98b711a77e21c2968a4ff69a25c664ef3f785df0cc7f8cba63d51eb45eff48bf8c76435053018127111de453b2fd00414f5703143350a769bdaa5576c1439e3861e7359e1da58054981a9f96ebf2f282fc835d16ca9c6249479e79a76b600a9d827d0f433d1a327510fc420ffe235712caebf2e24ee44113105a7c153f1b5edb0dd23609cbb50491c2154a007ca2df022474bb61bd006282e1fe845c8c800d5d31728de410e03b8d4e7e67000000b00c6ee596e46c31b1f667c29e83ada67849b41de622709f161e4c9577965e7f5e5130d3bb02b250e4e7311bb8e54225676efec2c117c7c2cecfa67ee195695be1e8089980536f38c9d196633c76938ba701ccc7125b84c9cf88285ba42a0064b1b49427277b31be1824b9e6e1aecfc3a613a6973828d958a7ad5c275aa06a1449f8b72def723d7d80d20009986b1f04e71ae19fca71dfb32cef076637f95f1a7fe3e3c8d2a0450d8cd2f172aba5ff2125000000b01c1f37edfe0e7c544e967cd4d0cc6c802358565e66bf2599bb6ad9aedc4b786c7e70427d5f1a5c536b27969f4fd8d81ed5a9486863ab81c0c71a7a505e3bd984ecd579a162e481afec69deac5ac1a58554350b29974ac2c3c069baff5a43b9faf2686000caf06a29593a5e07d78fbf8b08d67df02fa1cbc6b13991efb823a5cd36c03eed3dc8c81b3f84b052df9b08bb12aab8f7dfca0486e323c7081e7c904a56fbbd77c1fe72afd40325c3674ef2250000021c000000b005f953479bd63e87e184b15375cc6476758fa6c183aca9433e4259a340a046222f032be7d0ca38c398e84b39fbb893b9e99d77a0bfc461cc2608b8ad4e54626511d2956b5d6ea94b01af332ced30b99227c5c5fb9ab32d8a00bafd3fe69e3f022b620ad6befc153571cc0d65eaf6c44c08935b3d344ba0d029ce37ff84a6f89106690f840c765b5dfd4ab83797d054b72713090d4dc357aaff123cf660e550f1743a6070c645c8912c5500b64506b32b000000b01011dd9f25d0077c59e794022eb70fdae43a8c743746995fd7554bc6f76441abd637cd671338b2acea446dffe88b0712cf0001f6333da0e7c6e69891893d86ac7b64e60f7916b8d8e77defff9a43295c8f7b30ba3f6eff07c71643822a2088b9e12e3811077fa52d59b079217822f3c3088d303cb38ca173e665846d192ec41d505c80fc4c2187718b44e088fcfabbd709a6cde2315959bd7cc6f7431193f656586537e797202ede791e0785fb2fdaae000000b02a7d3559922d8358dd4e451ea1b2f170493ad131b1cfc0eaa92f33205e6bc6b14e8c5e2952913b1431c46217cec89ebb946a5eb0d4e55a4e2c36db836162a20d5974ed0782625a2c689157d824aa779c5b630c8ddd9eed145ff95fc87408f099ec77a76dea03379822734416e52063531f8942cc037d3d7bcd2c531be676a9e9348d5ef939910b39c779b6c461936b38150c2f31156eaefee74e19008eedac87ee73a90508bcfe08067acbea1567845c0000021c000000b01896f05ae29197911477be7fad45e7bfbcb46b5bf396eec69589a2e6a7b0c870814ea0c2dceee51bc013b3a1bb34b34102bbc5f6359d037edc93e5d813a2921259a451bd286cee6e1aa5263383125314edcd886aaa511b4010def1a629e0b166fce69eaa36327e46b86674506f8f6c8026bab62a1b2ed0de2c7844217a5fa3919980250811e176fba2f462285f6204920366e70a88ef7b540398a48ca82b9057348aabbe0636dbaf9787ba72d19537f4000000b00c7f903fa979646fa9bbbf9623d9c160eeade75673040c2d893ddfa94c1a6b9ea3be4f23c84309fbd77a67c27866403253b8f2a2fc99b9322666926f79c408df0255277f3d4c2ba1739b0facfb21f1c6795f08c9cfdd1c06627f2982954fb8365c47dfcc26cd444879a5b45652a5520d023de432c71d4b89123b50c7377e20293df9370c2597d9d923ce49e6db93660626d773e904ee686cc3dfb839561d156b88acac2831fd3edf975048729a5fd67f000000b02bb3891589315dcc2761b6b489069dfdcdf04701e3f1266f70988531cfee8ff32172b50c869bf167edbd40b3c478e9eae676002aa714f6c7c57b8541f62ea123fc9cc973b714cafdaf99bc1f5fdd144ed61b6513279b5ca009fafe81be32d0f4732324ce4b5e71e1e4becffaf35372bc031d8cc79c25bfba6d600261f890b1cfbef2265a6f8b0ad2eef198aca0f1272c1ee6eed5d9b835752150c53520b9bced77e0ec7340916ff076d63456590f782f0000021c000000b00df5b70c823aa57f7d3405a913b778a8ef593b6d4f67f34a6472d76586d2bae6892e32c68dca0c35b890343eb5058340a73223cbfbc497e9412d6e155dd3afa668c548edcbd4ea0e6a853e41def9e40a60e2f2dfa0f0a2a64e7bf62c90dce17472f6f20edeb4a1087a182ca1bcaf5e6b0ab4057b829e3afaf667ef44f1033d400caf0ae944944ac5bee2fa5d8544a88a09e15f1ed3bf1cc240ff8f7fc27ac0bcd944bd162658b3fa6d5d2bbc1e6d0a5a000000b0267c7b67e9762a3deb02b049465233d16d5224025c7e7eb19ef72b96807900869f9cc2a2c554bb764459e24b04f017ab82a999e359facfd9ba741d51e13f9e91f7ecc883775905c55f5e14bd70c541d245a97c55e6447dc78471ec292eab827a125320fd7f1a9f61e2d795e69466c7ef1d70cc63fccbfb8c5fc40f0848d70c80042c6e5bb3559b84f2b7d8ba49728d850adfe3b1b9560f3d1a97ce4b42eca41525d0d8e084ddfbe68f4059a222aed7a6000000b0126b797b50a23045331c9931d025338f2f2389d5e650638dd0f009e8f78441a862f34b1a461cce741128aeae064d5880bce3fcffe9a999547c1316ff907640302d084ab3c26760e164be684ee9eeb77ca8b4c2ceb4530a3e545c03d8be4caeeb00644fd3ce0d46653e4c158c31d926750195023a33a125b0317090a21106e59c3fb03b4f5cbc0c2a895ae2da2f5a407b2b2adad74953dd8992dfe2667154131d81fd5b7a2ed282025a94f91f348ef9820000021c000000b0007b98538d7c184df59bb96f5a36572d754d2f88c3d281cbce9a6689df308d533185bec36308523944c1188d14414f16332b75d2ceb397bf65cc04df7e1cd1250da85395441c92530c084ffa0347734026aa6235e6a1aae67288261aedc6e2bd4742f9f6d7d1dc1619478737f6d90ddd14fa066eb1a94f9d62e3a55b737edb31265d1122bf475f1cffe313ea8301a4592b3a2c5b72acf492e669dc9d36cfaae850499643788370eb1dbfd22401c36f8a000000b0206063d67d6c900d2e539fa9ce1e0bcbc3232299c2b0b091f8d800ede3ae1a3ffa526c8bd6ced3ed5ab263789de1359e71c94966a3a72cc1e2a8a8412033524b57f0a86bf9fae42cc04975db1040c951f671ee8a246508dbe079e88c7b50de9cebce74b03235ab7381458f84710c26d92bd54cf1c6a50e4234aa8fc02392cf94674dc06ec6fd1fa6790f4fc7ff6fb06e1398116f15533f98f76265c06313445ab984a08f69dd31dd6e76ae7a21621a7d000000b005d61644b31d6b53ee88d09652bb6b1ba55bde34b499ac43ff6458df5ce5b39bf72342d5caf40d5846acdb10cc425733c60602317c450aff3ad84c38e5678568b68c8df63f8ffca5972c54f7a4dfc8f7f439b12018860001145b3a778f9971beaefcb1edcfc05394f4cdd92f566292830db14f172edd2ea3884f88780558ea3cc94fe936b4da474aa53fb4b7f6859b590b93927f6295de38bedae520787dc850ac04918b595724f8c1ad560fe67c32fe0000021c000000b01cff3e84aacc8f3b0db0da2817140b8d6a18c71b6824abe2afc8803ba68b6ebd09d61eec82e88c686c30bc0aa5c39bb6afff0ce525e08f8babe6bd6ffdf479055de5bdb93fe30d32ef8adefa2c7f51844e1c8dc4ba324a90676b8c74bbf7ecbc34d8adda63849debe03273d36eae5eb30c97bf93b0cdeac68636410af6f825fbbf2cb2759d5bc21f8a267c2a463bb7720352d1fde856dcafbf714c5eb8935da48cc210f7095f12425ac7981e824a3606000000b0043351b36f2b70487ae3d9f97f7e793478da11a29044e07f27b25457e434e72da61fab7e2e673e2c4ba1dc275ac0384106ff337348110d2a1732d8cd9b8388180f099c44354b3de5370375f315cf048e707939418998800805afa1bb1be66723ecc9b33b38facb03a7baf5f9e7ac6262038a3b5d97bc5c1544c3014fdecf9015134d13a68a6d7817085c1468f89202310ff2e6f86dcad2593461168f7b75f36a650382a96fef8d666f9b5bf523d8ce81000000b0271b1074b6f78369cbe1cbf05c615ff5e34014eae1aa3ab6fe0382a169df040b70d0a9fa68b7aeba09192fdd72f48b82c10547e6e286fdf5c5a91e425f07373bc6072b68acc2a6a529a16487ca867c7351e7a3fd09e47224aa6241e6d6afedcac0990580f90397be8dae9849f17580892e8870c3e8b3e6e965d64baed3919849af4d028bb76eaacfee7472c1a17b310d108759de00f2e34fe09d11e454a9a880797435939cc369ef1018da35a89a80220000021c000000b01dfe7ce6b28a182787a9ca9178b9c74ad3c6392aea2422ba96feddbabe4f3d2d036652648e6a25372daf63608ae875c3826896691854b2bcb886131b432947670d7c6671c4f6c1aedca70c08606e082fcc01b18af3c9347d2dcf6ac449d02a1829c73f26a917067d5b819347576d9e4924c07c676128ada7902114123970cf0b4221cc553e449a12dc7099950c0b055d21d3031de77c48b06e77c81f6330c3d38662aec1f9277a09f5faf50140833aa3000000b01d25544976bc9b9dbdf500c6b1486dbf7b3acffc33796abe2461fa6a6d544b58b2de58514c94b159d3193e8b3163517be0b18c5e9c231d4a245b678aa3b5402750b77c3be577b1ed7bb396f7fd5817dd67ea004cdb45fa321f0f6e2b3cd7a6e4a34b982571311f168ed5b4d4576a733a10b35e61525cc403e9c4bba6440b1c84e14d8404d6e5c01adee35e340530e12b1f38d0890b7ddcfcaa8b10531a9b9eeb1c7a333fca7d998d76a92072eacdc2a0000000b01b9c0176f60970432c3ca5330880baf4f0c974635d3b2156549da294fbf3fdc6e2ddb434fb51c561c2bc065c8f49f57bb5bc90f45ac71c6c342f08ef58a59726505258b8354a1817779b753fa36627344bfbec174ffd97d71f7b42a5fc83b62b320387798a94ae26c3b185b540226f80215733a1f67478432dde3dc2917ee1964770b7c3c45e35022d1e38afab9833da0958ce53a514bd1a6f67be91c1f1a42a01f0fba82d0f1f2ea6f60623aa8f80930000021c000000b0277785bb796161a7c51617e1bd3dd18c46b4e1de913ed3afcc8a84c7959bba4feedf65972afc77d7a080f9655e708403a366f96b385733342e6b186af6dd3623683caec4c667a8510156279f7c2e552b4619e9b0291ceaba651560e44782133c885db32adee4d838e480fa207e3bd97125a851caf46f7f0adae74c85d93557c1e37b22cf07c75362c076248770eb06f424f5018b6d11a465708439c3b746427069106e2b7e8130e43e92f9b0a21a80dd000000b0024eb61442a41adf0f97b2264b0e432c677064d27d4f8cea1942eddf2f59375ee5d5d6fe3b99fd6b7352f43d49cd9e47a7333e03943f6f68c6fdda486995f360138ca14103c157b997cc5f3f3d0a9584afe367300830a0593fea9d4d45d7d7ac94c4131a75ddd47779152ec52218263d0b245eb982a0b80616dc1ab64d2e3789eb484e24113a8a5ab29b6989f46d0b80121318a8bf0fc6e77b6e226852840be92ba83cf68752e122a7293906d65ee850000000b024310fcdacb531986be837cea8c7a7c7599a628f84b51173737b1784c028dcf51fe5255d04d28f44b40d6005f2b522bbcfd56e8f867d8c23db5266a3312feefa0f2dc56d42eddeb39a10944c7f54a5bd341bb0b02042181c24e97c177d2254f2c229b07aaaf6e9dc1d3ac7bb742bcb1c2e5f64bbfcf989e0d0adde4f597a6755cf85bdda2bd19a1f9f5186f82f50f87028d5580ef3f3ec71a5aef0a9fce89930b6a21ee7bc53c80e38c3cc2161ec118500000fa400000168000000b029a8a5e352efceda35bb64fa23398aaba4adc5d1d80b0cc041532f15a2f601063189e65197f166ba617bbc118f926d9421e82ade5e889fbff356d1ea40a1fff1b496263ec2d35d048bf31f39554e27af766d4fa75bdc711410bd302cc6a4d9d4a0c121343c681b2115c1b4f4e2396a642f5f77e1c644e430e843e4077a1c774d0964ab3cd4cce964dafeca02dff27ee424266367e4f8af816dadbc3eede83f125eda5d2cb1725aaa8eb8ec98650cb642000000b019ea407948f88707b1c893929f02b533f8149963edae604da62ca1108f7b9a22cda0be3d56f81b0f6fcabc955fe00ea72d95b44c784cf184a63df57dc92ced5d769988ea74ddac183ff29b3f71f6e9a5f2a7baff5bf657e3e70707a450535ae0ff152e0badc6917cb245030c0c2876301fbe2dd2c168ebe2f97fe79d1103529f9fe011189bb2bb51a36d938458ac7a020b4a05eb9c23cd14209ae55923d53502c536f30acf4f219f95aa3bea8ee07d9b00000168000000b024c57e99f1f47f9cd1bf3540df0b45d53cec8c74b2c0ab74252edc1705b7dc4a051bc039fb40b67832885f471a14ff7c3c11df4de8915eef6d39ed7bb3efa797ce02e07d850201978f6793787845ac1f1e29181852aee5c4fc5aa6b37a01b61d9e55c7cd24a3c09a86474d3e7bc1485a0de300b1073f92984341bb81507ecb113d5e6270b2d7af618e578629b2bdbb542b30726e8268d2359c33cfcab231fbbcf823849958a0389e1292c0f69ea07bca000000b02c091d6d14ee1fa1196464453cc1ef06fa3f173416b98275abe86d05f8645e32cb8421197fbc0f9f763b1a08f557b7dfc95a4c1fc4d47efba0dc97eb9c7dc917008acb4d6ce152393096a8ef2f725ff8a3cddabcce392dd43c1c51431c6e6a39c649cb55a719c6c5e103f9c163956339179dcfacb3fc5a6fb435844e0ee40fffb879a7b770575f3ab5dc80560970983a0626156bfc9b1d7a68d6612176dc964d2e7e040958ca76bb82f120587819836d00000168000000b0040058e3f256296e38dddb3f547411fedaa62980533a7fccd89f20c0bca57f2ad0eb27a82e01590c159a14e68c35c1311a44c35206705b59bd0f200cebbc7ddfbca7aaf8dc0db3604a176882065502d7e340a01a086f0291038d1875f45fea3b2897031cfe598986430e879856c0d8f0229a9c7bc36273212b5ea418789aa376b95da1cd411a8b7b5f52fe91d366885d2564850f0ecc95dfa5e2f888d8c9c2c8569d10f1f5599f87dfbe7be3b5c36181000000b00b8c6324bf4fbc1f29dcb8c7a4bc5bc5aeb3614f92a4a3628f558149b06cc25707a21e23fbf1f712fdb4c169f1f7315ae65f3e1e81cad0abde00833c31bfb71c569008fab1e99a59ad6b0dfc3d608ec788b5f21ac986b013d7f145f6836d7791ba24229ee854f66d1f59c0a92d6d7ff92ca4bcf1454ee54a04b23c5d925bac830c87463f3cc55ba2494446cc8c80e17609799d95fe732856c74065ac985f86cc66a428ff84cf7f93d99e2e36fb7840aa00000168000000b03015e3d996be8d3ad7bb6e4658ee866d0cd54536e40b74957fe8e5b7d28971fffec818718c8844567c0641f7ba677cf1b8d1791639b47c82918c9f63a80b50e823ec6c63835e76b1771b49123eb43bcfd1409cb9746257d8931c5da05b5c5a43f98bed265f7dc74067c81a9d65f43ed3033c9a857f97416683e31d6e946f072641e28759d1e459948f6035051ee27ad81c24ea04cc8f7506dbcbf68e87221e011d7a5b117e32fd5240fdd00a5b602853000000b011d629e39e3c4545ef6af1325a76a8c13fb5419eee406eb0e495fae3e90ceb0b282fa956da209dbe7bd216815f1799877c7b72dc31f52b457b9568ae46058c40100db7bbaed53c6a85f18f908f98dbf85db31fe0cc7924ca044d115ebaf190d7b96e10c490e3519cfaaabf212eb36f60304df9f26f5ae1684d3596c6d742d9c9791bdae9d9c64419db885895ef18fe9702ea9149a0e20d76b8aaf89c921acbcc0a86af6cdcfab8570603db910a3969be00000168000000b0176d6a526f026d71d59bcd767f51ef500b090442f53bd98de56d419ca882cb4d0f8614a3b1756f748977a8941db7c0433e0ab2b7fce9ec715f633a51532ea37c71c4872644ea53e7f465ed0000d2609b61ed5c7ee18bb12f645aca89481eff5104fd5757c34756885b06d3a97dd55f2114c5456a648f51bae034589fc9c9328898f04695ee7fd6772bdce980c9ebcf8c28dd35dbf7463bb637215545cb0989cda41872bfddf5a138bc0032ce987318bb000000b006f90513e32e6daa50a34f9873c7786f052b738ae7fde3a68cd730c0088b8545339db01f894d5419acfe945cc0c571045e39f0ce1d68bc0a8500a6b0a7519641353628c77caed8cb418b5503d94b19a8bde7e970965405a5ae3e12cabfa722e8b8b45848ecd7b4a0d972881d31a3616d207327b54673da2ba934e792ac8c933a446ba690e1458ccd5b93f475446580871b174776e24d5181cbadb96d6459381c2a87f6e2c86959af98804b92742181b200000168000000b007c42ef0e91cedad3984b5beec63a66237afd8d31716ecb98dadd3b0e68d5dda53286d42a811c30a7a83dd2e1739f44bc32ef576ba3fb4d8d41362974abd0ad191aaee0a11a856b035f28987c1351f961968ab86638cbdf3e57ca2652faafe9f1aa44711b902bb8f14a8c03aebea348e1f00f0592531e6dd2547887c96f41eb06830fa187eda838721b679e7dadae73d167f706d68e571ffc4c5a136954e1b9ee353ff9eb6df2c84a9b84b31c184a9f2000000b017bafc1fc6f31cef6ed6dd7a5e2495cff182d7530cc6f7d47fc1664fa519c660b9cee734dcd29cf8284f47e97eb4ed7b9f86a012fc29f74c5ca4c47ed4dc9a64c02b6e900bbc69b3fa101270e2d0ef08fcb190853a42e187d0c96a4136edeb23ffd0b1fc17b3c4399076bbf2f9085ff42e2bd439e374fa6c90ae2d13ad659c91c7b392f55293d518b302c35836e92250015f9c5dd7020feae8a9813ceaebaaa1dcf46000b72a0eb7b1b7b0ee9caf4b0700000168000000b017980b81f71abd837810414a656c8e5bd6e42e8d15582cd71be20324c3471e4223ef65557648a2c310aed207d19aa66aa065a0ab4a53b520a1713a492b4b6a15bde338531dd6a508e75119eccba9df2fc6466631a2224d054d636faf56a636f23590d8d22b32b143224b9b6d09d719ce21f2007c54a074b1549b14b2b6616b7923f2b996eb374a6b7d33dceabec0016f12d7665cfe1d54be8988b9ab8cb6cf9addba8bb7ce8059a6bd8c8d4504496a17000000b023f08210813da5c79f903fa205235155e34c59577962f15f92e4926969a6a8e0e538e19d97f5e620bf86d5705f8cfe0c62f22116ac58d57436470d2c26f7081867e31823128d6828a7eab06947c6882d188447a583b9b8fd3db50205673e774dd3d83061d0dfb85aa839a711cd1538071ada9bdd30b1a6f48ad6707f2cf48f05e6984c6c0647db25edc769eeeb06b517160f321eafce9b83d3f5e1614eec03710ffb47ae33a68a51d0223271560ea87600000168000000b00d9392756f21d6ef53110c18aa9e9ebed92e01be9818d5370024242a2f8780eb8c70628b1eda5bf5fe991a11ae810a6a5a35fe8766ac38dbe42ce339e25227b8db7053770f9da03054b511042ca62cc3d9a767573215d9956207a0ee9b6747e3935a894f3118125c85a712fee4dc9daf0b6f6fbb593e2917d6f695d10c72a2465b0bcee37e22576fd2db6eba526d4dc222e74bbee9c6472a3606daeb4d98eb2d26238e151945e3f74387cae7ba712cd9000000b01c575eef72134886f4bdec5d0e997d754074844363385cac0ebfe55e1bb4ca6ce4ccf10854af9a0d4161040b21539c7c4f6d308c146a4c33d3d980481a174aa62d5ec895e6c3cd1d057593b6f71fde55e15bfa2e5b0d25f2246f59d2479298bb1068075cac8daef2fdc3ada6e6ec530327106aec6e4393ba6df304f4d692aaee0059daf7ea0b0bd4419cdf2e1e0d156c2daa6ad02f5c187a33cbd7069c465f99c3f380b9536acae56ed6e73450d9959700000168000000b001843f8e391a7bd395be524b25dd7cf7d90323d50f8da74759102ed26f170c6100463b2dc7f96d1a767c721aa2aa58837dd46eebbd6c1d732a99090d55e972a3c7273efb41957a608d3fe50c0f61afee191d029f94e0bdc8ba2c7cc44c8a30baad653717cab6a5f1d2fdec30dfeed71406a5dba4660e614ddb704340515bfa3b65976b97f37dbef441fe1fc9c1bb849b0904e899b07c061a7d3d7032e9c242e6515c65084863c2eae5b9464d487afce9000000b000dbcbfe9b9a4e0822e70744639462b2375ef52af7ede2996f3bd708d62a14015ce0082379def0ac88e39fadc121c3518d741b216c2d7f6b84162093ed1461d41057e04a9bbad351158cd763bcdfc2e14c0116f81a8f1c17bb95d71ef3200df0b236f05a7c371b7731f1390ca53c6542287872544ec7e98bd9631e41d5cbd099517a64b525b02b3b1f89046a0da79ec3136fe594b8687a7fd9f5da9ff4e0ee8a5b6e3e96167b514463d3094b55ee2b0e00000168000000b02091959594a6fe435e017d14627875c05d60237a5698de9bde70bdad418c72d83a3ad0d0a09ad22240b228b117302d7ee4453f3cddd92f8184b5da701332743e9089ab6afbb4988293265916f662cec62e5104b0a4a5e24ed65778a1d241f97c4ce2ad9d24da91cb0bf7a5f7f6a8cd491c8d207bdffaa150ab68fcef994911546358ff0aa56c1626eda10bcfb358a118170ab67c2cd70f0ee6c6f754a4759780fecd5562da70e12bf87144eab45f8d7d000000b00c918205b12609cbc72f8d4ce95e3a5083c56cde97aeca16153848052eeadd124fc043e36abdd47691a9d6ad0f7a7bdf1e5e0609a672cddbeab41eaa60a909034e54a5f32eb0620b55923bec293edc5873f79d8d4db02ba65f5c61a21fbffde44b8c218826b8624ad0cccb8d80f951852e29e0bb71833e8ad3701286dd45a1328d71ed8060d11e804b24e389c6fc8b4d1c632c5691674b72bb452187e9792087a9140ec57779cfaf6c3421481f692b8900000168000000b02eada1a909467eeb9eca913dff605dc0cff056eacf37ba89fcb1c7c5eb768d77cff040668c797ac1cf019d01f314dff4f259c3d73f19d82752ab5b0488b0bd33003996e185c199f9d7e83ae21133310b64678326f23fc6a385725a01704e22eab96737a47f0e2e055a05ed01c0921bb8031ce5b1d0132cce25bce1f8e98edb296902352ae5992866f16cbee08d40aeb31c6223156e40861f865393002116692a301b4617b7aaebe24269906473a2cd14000000b01b57e2e264fe3b82399ab36c30fe7a53bed097ac0f92dc84fc88c2e63c614c3b7791a49953835e7d5082c6165ed250bfebbf6b1cffccadae77a8a712e0c8b4f093c5aea43f38b85b57a08bf783b5acd5613691f9d6e002e5f7dfb2c909b4ed9395f1c56de47549149caaf3cb7c6622ea223b60829d20fef24cfa2ce642280c2568dc615b69ce110172c9fff356756b152ab2090ea5ecbb8e833339b6d37ffa3c85b1daeaa90e303addbddd3243cfaa09380000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000018100000000000000000000000000000000000000000000000000000000000001820000000000000000000000000000000000000000000000000000000000000183000000000000000000000000000000000000000000000000000000000000018400000000000000000000000000000000000000000000000000000000000001850000000000000000000000000000000000000000000000000000000000000186000000000000000000000000000000000000000000000000000000000000018700000000000000000000000000000000000000000000000000000000000001880000000000000000000000000000000000000000000000000000000000000189000000000000000000000000000000000000000000000000000000000000018a000000000000000000000000000000000000000000000000000000000000018b000000000000000000000000000000000000000000000000000000000000018c000000000000000000000000000000000000000000000000000000000000018d000000000000000000000000000000000000000000000000000000000000018e000000000000000000000000000000000000000000000000000000000000018f0000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000019100000000000000000000000000000000000000000000000000000000000001920000000000000000000000000000000000000000000000000000000000000193000000000000000000000000000000000000000000000000000000000000019400000000000000000000000000000000000000000000000000000000000001950000000000000000000000000000000000000000000000000000000000000196000000000000000000000000000000000000000000000000000000000000019700000000000000000000000000000000000000000000000000000000000001980000000000000000000000000000000000000000000000000000000000000199000000000000000000000000000000000000000000000000000000000000019a000000000000000000000000000000000000000000000000000000000000019b000000000000000000000000000000000000000000000000000000000000019c000000000000000000000000000000000000000000000000000000000000019d000000000000000000000000000000000000000000000000000000000000019e000000000000000000000000000000000000000000000000000000000000019f00000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001a100000000000000000000000000000000000000000000000000000000000001a200000000000000000000000000000000000000000000000000000000000001a300000000000000000000000000000000000000000000000000000000000001a400000000000000000000000000000000000000000000000000000000000001a500000000000000000000000000000000000000000000000000000000000001a600000000000000000000000000000000000000000000000000000000000001a700000000000000000000000000000000000000000000000000000000000001a800000000000000000000000000000000000000000000000000000000000001a900000000000000000000000000000000000000000000000000000000000001aa00000000000000000000000000000000000000000000000000000000000001ab00000000000000000000000000000000000000000000000000000000000001ac00000000000000000000000000000000000000000000000000000000000001ad00000000000000000000000000000000000000000000000000000000000001ae00000000000000000000000000000000000000000000000000000000000001af00000000000000000000000000000000000000000000000000000000000001b000000000000000000000000000000000000000000000000000000000000001b100000000000000000000000000000000000000000000000000000000000001b200000000000000000000000000000000000000000000000000000000000001b300000000000000000000000000000000000000000000000000000000000001b400000000000000000000000000000000000000000000000000000000000001b500000000000000000000000000000000000000000000000000000000000001b600000000000000000000000000000000000000000000000000000000000001b7370000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000028100000000000000000000000000000000000000000000000000000000000002820000000000000000000000000000000000000000000000000000000000000283000000000000000000000000000000000000000000000000000000000000028400000000000000000000000000000000000000000000000000000000000002850000000000000000000000000000000000000000000000000000000000000286000000000000000000000000000000000000000000000000000000000000028700000000000000000000000000000000000000000000000000000000000002880000000000000000000000000000000000000000000000000000000000000289000000000000000000000000000000000000000000000000000000000000028a000000000000000000000000000000000000000000000000000000000000028b000000000000000000000000000000000000000000000000000000000000028c000000000000000000000000000000000000000000000000000000000000028d000000000000000000000000000000000000000000000000000000000000028e000000000000000000000000000000000000000000000000000000000000028f0000000000000000000000000000000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000029100000000000000000000000000000000000000000000000000000000000002920000000000000000000000000000000000000000000000000000000000000293000000000000000000000000000000000000000000000000000000000000029400000000000000000000000000000000000000000000000000000000000002950000000000000000000000000000000000000000000000000000000000000296000000000000000000000000000000000000000000000000000000000000029700000000000000000000000000000000000000000000000000000000000002980000000000000000000000000000000000000000000000000000000000000299000000000000000000000000000000000000000000000000000000000000029a000000000000000000000000000000000000000000000000000000000000029b000000000000000000000000000000000000000000000000000000000000029c000000000000000000000000000000000000000000000000000000000000029d000000000000000000000000000000000000000000000000000000000000029e000000000000000000000000000000000000000000000000000000000000029f00000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002a100000000000000000000000000000000000000000000000000000000000002a200000000000000000000000000000000000000000000000000000000000002a300000000000000000000000000000000000000000000000000000000000002a400000000000000000000000000000000000000000000000000000000000002a500000000000000000000000000000000000000000000000000000000000002a600000000000000000000000000000000000000000000000000000000000002a700000000000000000000000000000000000000000000000000000000000002a800000000000000000000000000000000000000000000000000000000000002a900000000000000000000000000000000000000000000000000000000000002aa00000000000000000000000000000000000000000000000000000000000002ab00000000000000000000000000000000000000000000000000000000000002ac00000000000000000000000000000000000000000000000000000000000002ad00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002af00000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000002b100000000000000000000000000000000000000000000000000000000000002b200000000000000000000000000000000000000000000000000000000000002b300000000000000000000000000000000000000000000000000000000000002b400000000000000000000000000000000000000000000000000000000000002b500000000000000000000000000000000000000000000000000000000000002b60200000000000000000000000000000000000000000000000000000000000003800000000000000000000000000000000000000000000000000000000000000381100000000000000000000000000000000000000000000000000000000000000580000000000000000000000000000000000000000000000000000000000000058a0000000000000000000000000000000000000000000000000000000000000581000000000000000000000000000000000000000000000000000000000000058b0000000000000000000000000000000000000000000000000000000000000582000000000000000000000000000000000000000000000000000000000000058c0000000000000000000000000000000000000000000000000000000000000583000000000000000000000000000000000000000000000000000000000000058d0000000000000000000000000000000000000000000000000000000000000584000000000000000000000000000000000000000000000000000000000000058e0000000000000000000000000000000000000000000000000000000000000585000000000000000000000000000000000000000000000000000000000000058f00000000000000000000000000000000000000000000000000000000000005860000000000000000000000000000000000000000000000000000000000000590000000000000000000000000000000000000000000000000000000000000058700000000000000000000000000000000000000000000000000000000000005910000000000000000000000000000000000000000000000000000000000000588000000000000000000000000000000000000000000000000000000000000059200000000000000000000000000000000000000000000000000000000000005890000000000000000000000000000000000000000000000000000000000000593000000000000000000000000000000000000000000000000000000000000058a0000000000000000000000000000000000000000000000000000000000000594000000000000000000000000000000000000000000000000000000000000058b0000000000000000000000000000000000000000000000000000000000000595000000000000000000000000000000000000000000000000000000000000058c0000000000000000000000000000000000000000000000000000000000000596000000000000000000000000000000000000000000000000000000000000058d0000000000000000000000000000000000000000000000000000000000000597000000000000000000000000000000000000000000000000000000000000058e0000000000000000000000000000000000000000000000000000000000000598000000000000000000000000000000000000000000000000000000000000058f0000000000000000000000000000000000000000000000000000000000000599000011000000021c000000b012a3f87c10a7085c68d23808b7aa0151d0f16ddcb0f5f45177d41f9371e0d0fafdd67a5f00654611c564f8a125464dfa3e9bd1e241df1ab3905e8861786377065822bba1140e2e16a2312555c109faa480feb832494a75fbdbe8d621819cd888893b3b20f9f84e7292da05bb98b3d71c0059a97ddbc203a4c634c2336e2d5e62299934b787998463cbe580616c70e79e24f809f09b9945caca2125a7d2eb85a053f4ce81e90f30a7a0b8c4deeafe71b5000000b00da468a1cdf29d9142e48b11723a65686b6428432fc8e076d8b62eeca823f5b3d6222843c81eb5b414567fa96761cafe4f4ff7d5af58fe1d784fc2b50c5e24ef6d378d66b0360f526ef1243982198fa5669f7b83f731282a4e74befb8a70c6eb6228bcb9e1e2e0fbfbd7a556292697b31298aeedd0d734a9e93fdce453ef9a047df1e11dbcf37425da3fc37b8238eecb20eaaaa83498d628552d4c3a3ed1b05a3c3207b74ea84a4944145b3bff4afe90000000b029c93b534d1d50e3c13eaa70996ecc84ce67bac3b4bf16943686970ed0b0b147e859ea3ac36eda74a8c81814546bb2a2f98affd0e43a637d5dd96cbda118739363faef1f3a9f1622ee45196fb95fa5317f9bdcb0a0eef07130a5d0dcd6c575b96f6b5d9f2032f44bdfa395380cdb75cd1595fe8a35d117cb7119cded4737b9072ed89e2ff237d535775750ceb6e8a7dd1b6c59a904096dacb27c219f551aacf31d67c2276f79cd909cb3eb12bb2ffa3b0000021c000000b00d4acc67de53fdc88b4afa37fa3166acb3b0ba1dde8ddc423a7f3642e8a1ea202f87aa56a589f42c461928643b773f8bc4a02ce0366f679c014606d9372e35d4b923b77ef2c7909c2c352ac7f64988264b444b5155814e80721168d01947225f93b090fa72cadf66d46dae8608d400d820257b28fbec8d52fe5831ebc2be47861692475c6e78bb621dfb64a520ec10ab0b2d1f9278f82c607cbb447f9bf6502883c7a76fd7b3ce04e0203b37ff91b98b000000b00d527573d2eab0e2b3ae35d2c49f3bc1b1b60ddb042cfe2583fac62ed7146497099685b8c05e51e131e171113240de9ac8d0b02f82dd4854bef9a288acc7bc184abfcb875e8a09e7103c9d09f69cd5baa0ce999ce1b46011a9396669e7f63c5afa2d34f7e693441bf080c5d20b300b912e05a675f05236326b8ef26408159f7606c70ee3eb0ae94d714e61521dc38204290caa1672acb70851aa2deb8ac496f552230a672ca3e059a9a070c616d7b0cd000000b003d21b9fbfd59a88e7330b52b0019167fb87490b46da878b1d2b786024b1294cb7f12e1748b878b5b07c584358864aaae235ba68ae2f914203a1d2ad37a309b5b329853a59b831eac42881064ecfae61da2677b0a48dc626fc4efb1df94b434cf1e8a9dcac23ee5debbfb17741d561190b823316ff9736a4e3f6514216c445e3143f5aef76e39ce8997a03a2065dfe0706f061c9b32fa932c71760b362825f60e36d2404b5a2aed8d90b38762ccce7980000021c000000b02db2851bfa29c277f368c283652d551e1a5f0d8b9eabc4715b9f50a58f738930989eaba66a8c300c29080d4cd24874c2c67421ab868e9fcce682df982eec8775ae545ae9e8f249031836a59e749c34ddf0d75ca1302995d9569097444d3daa9bbb72934581e9ee5005fc8d09cac021cb2c18702bcf5a34f5134558b37a2866c30690ca3aa3d3b7dbd7da472a35ced6b0067df3516dce4c99423bea87dba218b282ec177ae7229f01141c6faf862e2be0000000b0305d96bbef86cc073eb1a6da98c34f04dd5dada5e60761ae129c2c7cb8034b2fe252bbf2efc0c8661082318758df8986c328d9e35b4a7e793d85c15e839dc8e2ebfbe80499da857a0773aceeae76649a6e58b4f22b98562dcfcef7630a7be298f8878502c3be3d4b7df7263428eae9651497a3acd84e272f258408f58053a7209ea6552863bf08fd83cbffa00cdf383d20e973ff01352c307ebf269bef04ef4133338f8f40639a0cc0391eac6e40445a000000b00e28743d825775e2f982d16eb4174afbff0fa3963bd8449d408d0ef1682f6ea1413438aaebbee85cf7f2af25b8910929ffa415177c2eaa8ccb39eff015a20a1f066e374680ab935ee964b20382852bdf5ee8706188ce8af288464acb0844c021ffcffe9134bbf8edafa2a7c67472a7f52e09058476902388024ee4c949f5f2eba1045cc7d3c074244dca0c80c6a58de71188692df77b0cd39e417d1f2df721fbde067594a92becae923f8e698c64088f0000021c000000b010c2dc102305c2451c4e0c6b16ae6451e931c816003fddfc830e18218ca773c76516e278156f38a60bd2c6804a0816c5e15a70fccafe84cab867051ac6cece1ed2248f77d5b8f2054d5f210d3f621dced0af32be5c8ee32cf931894e4f045987f49ecaee86d1b79da6cce794956f70d40cbc9dc8879a75a3b0978590bd95e37f0b9684c09a543425f841c0608174ec960e055bb395f224000d2096dc544e8932ff5d5e6dd944073e3041692e53714998000000b01d59535bdf054a28238537f889e77a9471ca056015d8e9f0f2d7792e125c214cbcdd91f497d2417a14858d60b5f33528421df56cee41bd9f1970fd80aaa01772d83582cf9af6acf96759c93eef39448589806dce0e5f3bae287a57340825489ba21294ffefb3ce151b9df290d3c14601041f5fa0f3847a19b2842df5e33d1f410cab967035f33490441f0d8b81b30aa11425a6cf0dcff952f41954156541e190ff4ef3fbb07fb2df64f3d841565b8156000000b00ad06d592e336a11ea592c474796ed7876040b566276900b5d087cb515f46ad3aa9cc44376c94c5d0cc2e989f9cb66971e46489df061df16c875b0abf936440095026865dd355537251f842280f3cc50c0a1a990f112e5b90da92a1cdebecd188e22dd0b5c05d6b43c5120688d5914950cea57861aae3a55069efc932c3217aa8c159d5837a3b12bcc28457ae15abb242f364c79c54d9efefb1140dec742dbf851531b5f6c93d656642a1368b9b0d2950000021c000000b020366fc61784ae37844f953a7cb95299dd2a5b1aeee3e34c4a14fa7bed250b98bf7ba10913b22e9c12667884d38ed93bbf3fa8f2804f528112852cf05e84455a5606f47cc5ebc006f592ae0a3791bb14a0a140c7b158f77ac00eb8d7104ad3c4dbbf1256de4b9a422902b2a8517c65ac0984b7c91c9810ecf28d10d75006267e879a61795107748d05c01a85d8417cd40a9d6bf6c449550826b41da00a7ca2cb5a3ff5678ebac13fd217e55412fbd9cc000000b00fab2486ce2a7fa8e9718e6c728a026f1a11137549db145a963d3ed6693daabc207da96dac2232a1cba68a410c869d7895be6042629890bec398b8f864725ed92779a751f121ada409626fdd1194aedc70b9d4599e9668815f0b7fcdea040069ea88e13f64ca258c025c0fe7aead52f62159e81e1479929b331bac1298b86e4f6936fafac7348e7875fe7fc90c6f73402266192233a635bf1d50524f33a996fce3815e87c76981b8bd121f4c76c7e999000000b0068c6b24aa6e74d9802766735d5612e549b547c98f9e6223d49caf11f9782ad0332934acea7674ff93238e797e14f3b4f2cbf42873687b89e63234c5981341e861ee0e6109a02f0ed2056e3f14c5a7c3fb10baed29d55c0f2e6934548322af4676c8e7fb8fc2ad547007ebd00ceb64a424d7c2c0264b272c88b27a6a773ad83ffe5a29110fce7b7488b3a5abb96eeefb302600ae16f70c626a3e1bf4011cdbfa1e1d8b43c48ced52fe4d7e6acdff063b0000021c000000b01eccae51d8df3df22847b6be5c0e93d36064b7518f1141c7d063aa904d2ec94749f817a58b60d01963f517acd1fa58fe2642f2333773c6643ea6de4980a8365c1537d47abcc62d71181d0ce9c373581faa6df7bd080921f1ed04b1776a1d35120dc0421e90409e95faa818ad4ae7fa2310e60bc92304c8ed9a04e4e470cb2ae54a488eef374d302534ff97daa8abd7bd2da3f55930f31388ce59dd429b85feda2cce2861f8ecbe4729cddd0f3179e9fb000000b016ea5b7b0281cc1d443e4e87551ebe5b90f61b73d79bc1e65508b3ad0fdc7f2e544559e9016744225a804bdb3bdc3f1f0ec7c7e7aff017d30fdc3d8e52307752f80edca83ce5d20ee2ddb3622dbac1dcd4920c07999724bd009e92dbb62aa100eb228d6f2cc873848919c7d58def55ca1d58797417534bcd3b5601c2f349a73d1db9f8641698ed126e3703bd5898267a0999d8892957fd565942eb409bf2367b5dd7f102940bbfa4818d25d8e03cf011000000b02769f2363aa7150e757a77b2cc09b8b3ddfdeb80d915e154df2db5bac3c8227363c8919f9c6d102eae3634bc5e1b7361df11ab6df5976b18d9bb5f3b0c96fc2b6d74e675906e76b8dc112cd2afa1f8f3181df9d5c8c9fe6ab3c38e370a76ac08b52925de0fcf5caab567987e5a7ceabd13438e09e6cc091795bf2066b33d4d13e6214bc1431fc72ff5f1fbecf7fbfa6e084f30e3807363448a95458c95c539884bd4e01a43e065b496e0ad798bf988bd0000021c000000b01a00e0fb2a70132791f3f83d7964ac64b14962b42f903b81ffec8bae3a8369df51c28ee179eb937b7e70494b9d000aafdcf25d5fe717f23a7bb262c07e323a409d898d297f187c46962a718b4ce424c2c499a4ef1067be0b71fb3f66a72c6915a75169b75f3fcab2f453021612b5e0d926c089c3ce491623416d469e3e046e019c1c37cef764b3baf276b81d0977638e0c0dbfcf2a029ae75491464759deb7250db22ce58a88c58e8d1f05e8686d591d000000b00a530fce049b064e007695c74c64c8f889ad9c2b8fc4ce028a5b346263e081097b4826e388363d20626a4fe59a6c537e5c66baf984fe37124931b43933c513f20df575388251bbc0a26bfc24879a61aba612851ee3fe699d44440646ccfc37e8856529b85ed4d33c53f56ac903bd99ac2813c01f07d9661f242bb9edf10ad966a5b24d644c8c38bb52f5b8eeee3ecf4002fe1ba26aa2766b358d673eae8a3325f0f5e3f1cfa53945f0447c812f76fa55000000b02bbb7719ff4fcc5a45f2801005153a0c0e921f7a6992ade1a27883b45a763ae75c22edcff1cbb3d0c3a7cf7b0631224e80f250e50627a69b05e0526f822e39499f749591de51681de265fac24c1174f5cade4aa061d6ce0d7b2c6930ac0b25b35c658d65eb6e1d9663cbea6a8cc203fd1d5462c956f72c06bd8a7ace7b6296cab59e8cd6caad3f18c22a90e73af18ac40f05871aa59cc20b9536218704c87de9247ca282ad77ba3cdfe75733576687aa0000021c000000b01450c5e09a47449c430446c00501abd44bc39eb24e7a82c21c30e7451f1161834173a930991b8ec038d6629b00e226e2303f38ca43c2177899409ffa3554ee2faaa71e56abfd2dcad7f49e8b1f25f69582a227e30ea8657032bfc95b8f2574e536d47064ff53e5ede573618b50bb7fac1a14cbf6e8856faf29961e1c9b0abbda7302d94516447398b5fd13c6cbeeb5a81e99e2bca57891761826d51585e3a5525c62a4a4ba789c4e16340a521cff415a000000b03060c76e031e41ffcaa4ca44496eea5be4de4358eb32fa6523fb8ed9a71417c1d43eeb5d988398cb3a298a5c33a182a54dd51b741d1256a76fa7ba9f0da67eb1e6f1e2bd76d4dfad2e92b1e3f5b1e1bd1604251eaa4ea640107411b22614c555654fcb94514471736a9e205c9685de8007e94b57308098218084fea2951d1ac6082fa84233d03ea4a2eb49186eeab7fd2f6452e17bfdd661b25c23df62555eb467806ba64d51cb145fb3dd20ce1f786d000000b01baffaf3041a0e3f5e7c51c972eb0c910d64347aea8f70710ce3ee2627ed94b0fb9a7a06d8f8def76312b18327f69c6cd323246dce323cfdd0ce9c516d8730cea6894fead38ded01abb9457cf78244ff9df7d8da5dc8d1ab21a950e523bbdab94caafa228bb8727f905349bb16ba36a621f74c64379e38e67c1d21b28f4bb62551abc84ee253a9aed45b55f1897f950609d171b9d2fe61d9ab85f9c7a0dae75fb72f8e6587af4d669264ce2edec03ab500000fa400000168000000b00989b064739aaf94d5d372ae71683312cbde5fa0dc4b34fae0475c0209872bce196420edeb3b24fac24054be2109e376157c636cdea02d64de2d4147ce020a27571562eaa57ecb84c665a7a58ff672e8c5bc1dd613669dff6edeabf40cf39b3e64672e4777fc275da2f9df55415099f71d2b8564a1ee5d084c6dac27f63b542bd6f7a5a898d8ec7d3c5a9dc1443336102f7e099fa97a38a9a9ab2e723cdfe8394e7d2f9c50af7b7257a067f314d7a417000000b018454526df46509b536a8fb23666b14130a897e5363e700218bd2286517e71c6298347d2678be8e2b61fd4662fb23a9721601e28216624e9bbdb6d247a187cb994575ef43fdc1128bd3bf1c86f3f7d4165521c40ee6b3f027c1bc3393ef18c6eb2040d34b4f8065734e1b549351fea101577541dc1e2c7581783cbb5ee0848a416da2fb7e9e5298cb64448affd5950ff2bd9ae4efb64336e66e61c2e1028b1573a16d4c07daea8b063928e8891446c6d00000168000000b001011005ced7cad91b09477a598e4d04b3fda6e3737779758c76bd61859d809313f74e58c8988b5d05c8b885a96c4087cae3590f930bc2c2a85abdd8ae508ef55f715e152c0c5a87d4ae195e443ae75f1e8ad56b7ad2b5670b143fd47d8886ff058b20429b3c983355ed1da3b6f103090b1dd15218e59bd6c3fd08d2a25c70b7524fcb258afcdec28b8f98f078d2e6de15ce8dad72904861bcda1a34557aa39095588899a40ae19583b06301656206ef000000b00d5c20276f84de35fdc8a6e8fc208be8fa5a9e53992e72a907d761c83c9e9e35071a7e6d51c7d524f093f4c44879d595ae4b4464867697de912abdcfb00388bb2cb18b3110e64ba8518c412589377425850868b93d8e722d6fe71c159596215b5b99aea874e765406895f3dcaddcb18a262e12cc2dff979bbe8588af41a0981cb3bf748c0c7d64803a2e722087ba16f81e72b2a2838ac79043b5f7645386870f3c4556da99b32c4aaf00b471922bf8cd00000168000000b0184a8a705b4925416181754dd51861893072d7eac9cf8977a20b1881aeb26fa7e448ab0bd9ce69ee031d5ff30d24e9f16a245cfc89018b25d92a9da8d4f8a11c63ede162aec623c45a6f0a7e0b080538f20fe4da1d17e77a5dd3567dc4f1e3445667a33c5269b41165d0b0483d0488a71652d54c54e55ce046f0f6a6fc8d56145ede63219c451d2b6bd81f38e966e4ec181306870310146a103fa789fb08b7240ff83ba85afb94df5bda3f36af4a95e8000000b0035c31e222424d27caacdf6cda15a73055a33872025ea9bafa6795c92fca289bafd8c8b99c776fddbf2542649a1e582df571bf5964e5718355bda2ba38754bc2713c4f6782e6e8633152c1a789169df9bfe0cc4340b3efd4611c951802614400a24567922c36008bfb0b590a751c5a29051b7222ee8257b17c969f36e1fa6b0f93c237d6d80a01c2a7752de1c66bc315134384a4e62ef32124f3123651bc4e8cf89384ddfe25f434755dcf7f6128367c00000168000000b0095a121cc0de8d43fef6082372c5592fd63b7169ceddcf97eb4ecf9e4b7088ddedfff238ce82f8fb87c4a00bb661330c4e1f2cd1c795fbc4de044999d40624954b7e610a3aa4771171b5e2fe1936fec22d942d31f947424950f3301f964779e3002f18f2b970db0525915381c56fb041030896e342d4d48ffff2b9d159e9c6f12dae6a42f40a557f1c0fecd4396a618528b853bf3a4c2deaa4831574774150136960648aeb3473cb31eec4fad88b729a000000b0109af4ed14239937055a96291e07a12ea8a5790a515f68783006409a278be08c55a6971baa3f4e966ce8534488bb2dacfa42171cee8693e3041141d878022edb6db26af90444034405eb72ea66bb5c73a17c5dedf81118d149ad1e909046dddb64cd0465aee8924f7de281b41c29f6f60bfef8e8eef28abe5bb124b400965c582f2d031f7174173e036078f9d0f9761c1d39dcc054cb2725c875b3b9ab9a46e39598c9fd5440dae3721420dacaed26c000000168000000b0118d64419ab2278e315d5280a4a9652f1b4de6ba43666830173118b4a7f54f2f7a0b57f325438f7aed6a66325e59f29c552b1da95ab8226a187206dad190e6a5f95628468970bbd2bcd0989db95c19707614a514b15f8f093440331bca16554ee39966283d52c92859404ebec309ea321fe016ac5b8cd21d4ece1fa8b59420c7bbf719c0b72b41d103c26e7254a8879b0305665afa220ffaab43bf38bf46a0d7dab3f0fbb111d9bc49af21c963631950000000b02254cc0e551e0134c3f95525ad81ba64e9736975ac6ae5ae6ff8c048d6b268c846601fcf2c1b07cda51a82979df5de987668b13b96e83c8d3e8fdd0febff58480f43034a410c3c65063fdccf546e9fa8e586f0849ca0d3bda8a244655b65337467f76d904ab4be0fee01f469c4765e29114b8c02beb037dead44ffa618a8f7750fa5d0cd29e7627ef53200e6fd1a8d30264843d48db9b3714afd5d2350ead23cd7bfeb515934dd8c6678c7f7af4bc86100000168000000b014fe6fcf29d3e25f0c5923b865f798e197b9c86e231b4990c8ef29d381efe488eaf7f293d58e1a4f4224f74352d70f2393d3a4e0d19ed5098d5c901a144ac3841fb2f50f78fabcfaae934ec48bd13b553034a03499bc2c89a5077ec4ab94cb50a72888f39a7faed249e67e03553d9fbb105fd04d032e88b59411ecc137cdd3978fce43314dbfe863d584b42433489123158774fd2100834670bc15d3dd662a11f74d1a594e2062f3fc75a24ba93ac2e2000000b02009451141c2b97cd7a4684196bc7dd1b855c6e353cc37e5beaa00fd7f382ca19378f6d852df1b2e23eb5fa7a704f8ccfa098f9675177ac7d65bfa9b57220c178495c26ee9c498fa6368b277e28d672fc64244c4e5b88792c0d5d3e8b0e06b24477db358c924ce65ba481efc5c582d3813067c009ba4946e078e05d95d717d041fafc0648a49d31ce80c382f30d99e9c070d8da68fed27289d2fdccebd7465dd9ab70bd4c4a1d3077c83d268c30cb47b00000168000000b020cb7a629cb55e93ed0057c25f71bea43cb22fa6a0b9764c2457c975b9924684c2afe317d069cc59e223cb05d190ac5b15bcd93fd7899070d4682442e50e27e259eccbb27da265efa2e1f494f1f4344c9b73594b5761247a4f3d835bce175ff460db37257448c7fe8e0f12a339ea898729152941f8a0cb9e83dc0199a6022dafbf57bbcdd472e5fe45faaadd1b557e9f0b682dd080518ac6ce7f82941fffcaabf9bee4c12c10668bc96db689901b680a000000b0220fb3d8b9ed67296b01972d6d12aa167c6cf635813beb8a68e225bda53eb249acfff52f77dfd375a1ecf988e83d2311d2c64d6806a9c629db4ee062af5657cfd32ae6c25c956cddc360f1de570f11bdb6fa833094acfbdad38935bb0dcad4ecbf9bfc338be0db31c6bff7778b8921602e53a726da76c19d778af0eb9ad83a4bb10cf7ec6d3f43145c88fd611f9a63f824316c0ac5e320356e0ca3ff06c03bcf4167f5e38ce5257886ee8f65b23a726d00000168000000b01a1ab305715f2e086510c5e9cd41213a5140da819b0e038ef82e1eb1f70ae77551a45d91a1dd1af5fab598c0cfe65660ec5bbb88aa31e8042a5a39d410ff938e6232dad82b4d08ee1ec75634b1283861022b0b421d906fec5e0f6c310715ba2331ae0213886f90152966c3a7c99899ad2e23bd5adff4d7e46cae3169f672f61f1b94ad95fe1847512957787b2d9d4b6123e30b0856a9df7cc0e73bd225f965ca76bb354cb19394f3b44144910ed20928000000b012d38ae1091a52eee982d094d7ae9db36cd99b918adbfbcaf212b7d103b20d43686d129eae91ea64bc6ac3a600ec6711bde9ffd93806bc37d7d905251e9f464ccaf2c795227ef0693e721fd8f64a5e98edaa07f02310b6d974abf554e02c1a99307d85f9a74fc6ed9b3b41e8908231b8001993dccf3988798315990ef1530461964f3a0e5162edb7572d0168d538673f0121b0faeec7e927b3acdf22e84107f90066a4393dec07fab506377145be7ba900000168000000b028701208ac1b2a58e07bd56b5b30af2be82e4264e44e60871e52969fbd1b889c4de3f27c5672e65708a248d960493ee8e9c71dd0376784b2f8787930feb12d9409b276cf06384717d4084157f7caae3ddbb8b69c0d609faea7e2163a8906670334fc7a92d67cf038d32561d8f627551020f5e05a1758fcffcadbb47ea5a76933a89e28db89b5928c988b868c1f6b2de22bc4cbbc05743c2ed32e3a53b2fcefb8d54a75d7303fbb8bc5653c2da0ea1cb9000000b0245d99fcd38ba6c8f9060ab1e90dde684934d030cbd9d055cac0b6359b246b1c72413d2017615d23661da391e2097341cdae610c99a2aa512d28ede12be74baec84d5d85db815af0166ac6ead604473afa65bc9bd910160aae6458508e7190b0514f5db5726044ad80538bfde9e158610e32480d2db0324fa487f21349d6d3999df10f27d9ec23a45f25125bcd28b9510932d699e160f223f426ae8cc0a419fc936814c8387ac39b0ffce7d771e0abd700000168000000b01262c923d54e8d22ef2d948e9002e4fde85537fc2942475a63b03600050ba0243193519cedef7523b330cb7343233041d2616a7784ba812ef5332f864ec7192e1e6930ce9a37a4476f61f17dbbf6aad7cf431d9d5135cd99c12ac65ad02905bf012eff5c78dc34f864641b7a3c17ce691001c5e6bc8aba25fb98459de98b6b22a7345a95997cd102c4bbfe4f0c5b2aca2c02e113938c2313acdf5e068006633f012406319d7b05b2ed357ccb8edea790000000b0100535b0e6828087550d03a38b9bcc43931b5d6568a3c3d153376d3d813647c71b0c446394acc02ecf80603e54f18758997f78f000dd0ff06110d237d8bf2e95cbf204f55213fa8cfe232a75b3f36267295166b0bbffc54bf19044678ebd07aad05cb1c407ad308cffc49ba407702b67028628632192b31a2ddca9043f6c6a5f790384405ec06b2c024bd1348cb2fb67253241c5f2c14d4760ce1f97ec64969fb36069ca8463a3d55a151a669f7d719500000168000000b017f75a7483e2720636ddafd22be9015900e18417ae8671907eef28a87fd347a126c977cd13f53c112a9dc87f377a0d26aa0265fb8f219507787fbf1d26aff7e5636e22fa282513727382df172700301befc742654bed65cae59fb57e884fcb6fe0295e0479a77789b6378fff86cb7498277caebc69835f55ea6afdef9dcc9bbd1de2541edc49a48bd1e1ffe1d4fa977505207caa9189410a79d9159d8d1db726ccdfec01e3874b17ce742768285fcb43000000b0098f30ffd2f5058e272539a955ba702865f77113c5a7ab3c81b245ac404cfcf8526d90c2a8ae850b8489a8f57a88e3d5e980e20d13f0982d0d2427ffd3d422f7c5213803163a94fa14b1bfacfee4d4d950ddae0e162db490058175a68f70751f6ac7b4efd4bb5a17012db0f0552d6f880527097f58b629b3bdabbb7419d695ae54a15ad5ee1ab0e6db74e49c3cb46b191dd03740971118f118fc27fa89b1e3d36b8ba81af3703f4d2b1724927c76e79c3800000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000001c100000000000000000000000000000000000000000000000000000000000001c200000000000000000000000000000000000000000000000000000000000001c300000000000000000000000000000000000000000000000000000000000001c400000000000000000000000000000000000000000000000000000000000001c500000000000000000000000000000000000000000000000000000000000001c600000000000000000000000000000000000000000000000000000000000001c700000000000000000000000000000000000000000000000000000000000001c800000000000000000000000000000000000000000000000000000000000001c900000000000000000000000000000000000000000000000000000000000001ca00000000000000000000000000000000000000000000000000000000000001cb00000000000000000000000000000000000000000000000000000000000001cc00000000000000000000000000000000000000000000000000000000000001cd00000000000000000000000000000000000000000000000000000000000001ce00000000000000000000000000000000000000000000000000000000000001cf00000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000001d100000000000000000000000000000000000000000000000000000000000001d200000000000000000000000000000000000000000000000000000000000001d300000000000000000000000000000000000000000000000000000000000001d400000000000000000000000000000000000000000000000000000000000001d500000000000000000000000000000000000000000000000000000000000001d600000000000000000000000000000000000000000000000000000000000001d700000000000000000000000000000000000000000000000000000000000001d800000000000000000000000000000000000000000000000000000000000001d900000000000000000000000000000000000000000000000000000000000001da00000000000000000000000000000000000000000000000000000000000001db00000000000000000000000000000000000000000000000000000000000001dc00000000000000000000000000000000000000000000000000000000000001dd00000000000000000000000000000000000000000000000000000000000001de00000000000000000000000000000000000000000000000000000000000001df00000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001e100000000000000000000000000000000000000000000000000000000000001e200000000000000000000000000000000000000000000000000000000000001e300000000000000000000000000000000000000000000000000000000000001e400000000000000000000000000000000000000000000000000000000000001e500000000000000000000000000000000000000000000000000000000000001e600000000000000000000000000000000000000000000000000000000000001e700000000000000000000000000000000000000000000000000000000000001e800000000000000000000000000000000000000000000000000000000000001e900000000000000000000000000000000000000000000000000000000000001ea00000000000000000000000000000000000000000000000000000000000001eb00000000000000000000000000000000000000000000000000000000000001ec00000000000000000000000000000000000000000000000000000000000001ed00000000000000000000000000000000000000000000000000000000000001ee00000000000000000000000000000000000000000000000000000000000001ef00000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000000000000000000000000000000000000001f100000000000000000000000000000000000000000000000000000000000001f200000000000000000000000000000000000000000000000000000000000001f300000000000000000000000000000000000000000000000000000000000001f400000000000000000000000000000000000000000000000000000000000001f500000000000000000000000000000000000000000000000000000000000001f600000000000000000000000000000000000000000000000000000000000001f73700000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000002c100000000000000000000000000000000000000000000000000000000000002c200000000000000000000000000000000000000000000000000000000000002c300000000000000000000000000000000000000000000000000000000000002c400000000000000000000000000000000000000000000000000000000000002c500000000000000000000000000000000000000000000000000000000000002c600000000000000000000000000000000000000000000000000000000000002c700000000000000000000000000000000000000000000000000000000000002c800000000000000000000000000000000000000000000000000000000000002c900000000000000000000000000000000000000000000000000000000000002ca00000000000000000000000000000000000000000000000000000000000002cb00000000000000000000000000000000000000000000000000000000000002cc00000000000000000000000000000000000000000000000000000000000002cd00000000000000000000000000000000000000000000000000000000000002ce00000000000000000000000000000000000000000000000000000000000002cf00000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000002d100000000000000000000000000000000000000000000000000000000000002d200000000000000000000000000000000000000000000000000000000000002d300000000000000000000000000000000000000000000000000000000000002d400000000000000000000000000000000000000000000000000000000000002d500000000000000000000000000000000000000000000000000000000000002d600000000000000000000000000000000000000000000000000000000000002d700000000000000000000000000000000000000000000000000000000000002d800000000000000000000000000000000000000000000000000000000000002d900000000000000000000000000000000000000000000000000000000000002da00000000000000000000000000000000000000000000000000000000000002db00000000000000000000000000000000000000000000000000000000000002dc00000000000000000000000000000000000000000000000000000000000002dd00000000000000000000000000000000000000000000000000000000000002de00000000000000000000000000000000000000000000000000000000000002df00000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000002e100000000000000000000000000000000000000000000000000000000000002e200000000000000000000000000000000000000000000000000000000000002e300000000000000000000000000000000000000000000000000000000000002e400000000000000000000000000000000000000000000000000000000000002e500000000000000000000000000000000000000000000000000000000000002e600000000000000000000000000000000000000000000000000000000000002e700000000000000000000000000000000000000000000000000000000000002e800000000000000000000000000000000000000000000000000000000000002e900000000000000000000000000000000000000000000000000000000000002ea00000000000000000000000000000000000000000000000000000000000002eb00000000000000000000000000000000000000000000000000000000000002ec00000000000000000000000000000000000000000000000000000000000002ed00000000000000000000000000000000000000000000000000000000000002ee00000000000000000000000000000000000000000000000000000000000002ef00000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000002f100000000000000000000000000000000000000000000000000000000000002f200000000000000000000000000000000000000000000000000000000000002f300000000000000000000000000000000000000000000000000000000000002f400000000000000000000000000000000000000000000000000000000000002f500000000000000000000000000000000000000000000000000000000000002f60200000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000003c11000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000005ca00000000000000000000000000000000000000000000000000000000000005c100000000000000000000000000000000000000000000000000000000000005cb00000000000000000000000000000000000000000000000000000000000005c200000000000000000000000000000000000000000000000000000000000005cc00000000000000000000000000000000000000000000000000000000000005c300000000000000000000000000000000000000000000000000000000000005cd00000000000000000000000000000000000000000000000000000000000005c400000000000000000000000000000000000000000000000000000000000005ce00000000000000000000000000000000000000000000000000000000000005c500000000000000000000000000000000000000000000000000000000000005cf00000000000000000000000000000000000000000000000000000000000005c600000000000000000000000000000000000000000000000000000000000005d000000000000000000000000000000000000000000000000000000000000005c700000000000000000000000000000000000000000000000000000000000005d100000000000000000000000000000000000000000000000000000000000005c800000000000000000000000000000000000000000000000000000000000005d200000000000000000000000000000000000000000000000000000000000005c900000000000000000000000000000000000000000000000000000000000005d300000000000000000000000000000000000000000000000000000000000005ca00000000000000000000000000000000000000000000000000000000000005d400000000000000000000000000000000000000000000000000000000000005cb00000000000000000000000000000000000000000000000000000000000005d500000000000000000000000000000000000000000000000000000000000005cc00000000000000000000000000000000000000000000000000000000000005d600000000000000000000000000000000000000000000000000000000000005cd00000000000000000000000000000000000000000000000000000000000005d700000000000000000000000000000000000000000000000000000000000005ce00000000000000000000000000000000000000000000000000000000000005d800000000000000000000000000000000000000000000000000000000000005cf00000000000000000000000000000000000000000000000000000000000005d9000011000000021c000000b013ab5c2778c7ca7a7b3dbfb7bc1d569d323bea79da7b979ed4a927f2c689585258ce736a9a0ca5001625d02a6be4f35e870b2f491bf552b371c707d4e3dd421666c5b95aef56d631b9a49552d10783dc7fb5f1e200e68acbb255f9ef91735aee20cddaab908331023fa4f8df19f67df3119874f0539d9f9fb2b98c4db3a41a39c8deb35144e9a5a5b3f70cdca098234727ad55af3dcb069dde4690cea492030b285c062af52a63db28c65f437733c329000000b014ea42e70e10b3e80d11dbed267c24e153c76955317cd3c6753d6ba43e8136d519260060bbd4e721c7435fdf3924d598783425dd41d3d5773981df21fa6c5a1aa67777de1b42636c0a003eac4ffd0b7f89dfbbc9b0f3c8140f70ac39e65595303caada3d712e1bce17916cd4edc127ec2188ae3d52183ced6006677c68b84692aa845f81b9976ff961a18238835e6b661ec46329644b654876f4dbc4c4a24f22b82d85c47574210795a5a5a61c3db9f7000000b02f87cdd11c9ededcc00ff4c04352f60ed50998708452044bc440202746ff8391f2814b8cd2eb4dc02d0dd672e87aa2de6f15f14303e995678f55426f67e96c426cbf40cd4656ccc029c0525a0a6e48e38ae8c31c40477b123515957e3d583bbef7e86a38a4ab9abf34b0ee46a32f5580001ab81301303ca99d4b72a0ce50906314a455c36389ebe12be53ca2d8a8e3b10e8ad95bf22f8fa258f6b777f9a0274e0f0c5dff3696e7b2bd5b119f61a09af60000021c000000b03006f3ef3e028220752ae581c9cf555f07906d7578410a8385efdff756722c4b84e7034bbb1feb64eab16e089521bcf0efd5259901851410b6a34618a41b0adb446f424758d91dcd1d68196139d946b2c49b31659e7c589deb914d7960a7a2788643cc179cea6a66e4bff777cda3812b201c795ecbd78c4eaf280059e4881ea0577dc63d41412811356c7613816e9d481e59052e63f4249200f503373930ad5f5ebd16e9c9908e0556dc05cbb2c708ad000000b0149cd3fc07da9a84fba095b389925cbfc16f8bed3d282d1d88b2e6dd213636ffc4fd4b7a09db779c95fbff81c14fc2990c4a7226d3bcdc3ff4b048778425e13050aacf403d1fb990a764051c58799f3c49a6d7e83b4ae769695943d3267d5be96e9eca149e22ad07d4b27ca679ff86791cd16b99f4c5b6707314aaa443f3028c9307e5789a0fe8f6b1e78ff90e5c7bae1bf2e9a15ddc3d6276167d0d4dae3c18655b2aae28077aaf364098cc57e22895000000b0271f93e0a111b067367595f156ae92e2af7daa555714edc283e6fa4419b632d7b81795bfa5ec0e7dd0a456426f7bc4f4850953afa427913355d150ee16e0362c63bdebdfc0b829931add34e6d367bc2969c2efa08236847e71abc5fe9c98dbd6e800c45aac98fb34c781ee869812bcca26c63effa7c3992d18d4b05d9e83870a4b3bf8646f6fcb7213e47b69b62dcd5c2b4a3ed49a0366f9c225247872e781539cf5b178c013c033ec0d35fb206b189c0000021c000000b006e2c1c637884ef909d2fc5cb582a6d49c20da897125b5cacf1918674104b99cb1fa5720c14b98f2d9df077737d818f21948e804268f8c3f69767d8b345a4b01d97da2b7bc3c95315f17eeb91212529bd68fe7db648a56d2b245b3559e9547a8e778742564902b675a779771f9ab520c0df36e4a73d491b97dd25914473264d23ef30df306f0a096ea984dc259993d381c156289f1a72a244701c6b48dfc4ebd0da3f0c3545f1d1c494ab3e004f3fb96000000b00cfbc2aec8e2b17c3b46625eb9b6c2775fb89d270d609fcf9686617b33ce9f3c83c3ef6da6b22444127fa75effe4ae396dc31ecb038d340ead18b08f4b1250d9280b69ab614437f3da1d3402642b224cb833583a1e3832aaa89e7315c2f591d685e320fde57f47a513b727663b6f51322dc648bb5f51c6ef87f76932fb945318c03fd1a02ca52641c0fb6fd65f855c880d868d01aae11dc304d53386c9e5afe99b326968e5f1630f6b3a0cc1321ab494000000b00889da7b7c65ffa75df4eec9dfff353747df40801cdf84bae8bb3a2ea28887042d13d9b99cebb9d09d351797dd15c09a3fe11e77ecb39f13a807e2af33c50884538ef784ef25693db3b38b99802c70a53dc04f097522db19349c3e3c0d6480a44db3d5d47c365de1f4f85a2c33a21ac91dda282f10dc7e9f0f5e471b5ad3f196f12302cf166801fbad84fc42b3b8b09c100da5b6554ba7b57116698d53680e449d4ee966589d66939b2e07bee7c4cf7c0000021c000000b02038bfae08889c2313f6b9583a23f158d8d5645775d5e4a11c6358c7406836b415a789d6a130ef8756a2e0b47e1b5c1aa1ed8ce6f217f1369318fd019f53c3c62a508bf54c09c7f911c55398321942b40405dc8c7543437b1b75dd60898992b93c568e9d8780db4c6388d39aae83083319db423f228eaaab09bac5f1116e00d3daee409b0fc04af0c9586e28e1f02c0c0b13629bf51cf467f3e0f25357801260c13f20934a9b354ceb57c00e29446e05000000b02db929fac21282254aa50b05fef8fffabf180ec589e608c26a11d1b94482e927c9f91dc747e90d938a1665ba3f45a589524af9e34a5b2a03f409f600132eba92dc0f0c21de7925b66ae07baf255c36161c21f2f6c4541891855e5c35ad254d5ad19211c6df036d39ca537c7f340b4fd311d76e2ade53ed1ac7107d38a16e786579239aae09776a61f99983e0fe9bc82e1e7dadf22596c9efb7a85bb6aeb8f16a87fbdf0de40901b6a135dae53bb0e5b2000000b019d9211edf5074403441e55ec69960259ff3e74e401de521291fcf8ab290607c3c113ecc027414fd03cb262a7db883521f261d72cb3b8c0ffa17a913816fdeb1ba2a937387a75a4b6a990a7761ed16fb5b265decefa9d9fb27daeabd79ef91b87bb93f517540964fff31043f00e4500c06790c70c73b15a2fd0c685bbb451408ab14c03fe5e82daf2693798fc618b11211d94ebb4dfc4e274e2af46028fd7747cff0b48111356b9b891cce731d61ab4d0000021c000000b00f04b1b37491bc0eefe2f022af7e9b55843ce4bebf9d08efc42ac49f67410387bb8899e0f60ab0783ffc9858e107d0653255ad6f7180af3e8d7da2ac6e4edada6f8fa3c801b5f4fa09d244b48ef6af9972480561133e78641340e5ab3cb7f939acda7e07919103fa60c8132d757176582ab781d91288aa3a1a61d6abd4eb110b5899dc8509d8b64328c0fca13765ce1f2bd0988a1f974e2d808f5f51da72d15e6ecb5fe08482afb002c6c30c209fbb5e000000b02fe8d2ea9d6dc45cdc3a74b2c69b7c0e86c8cb376da89e079ad58787cbcea184bb068235a10feb9203923c50ab2f69ba2fa3b995dfa9c975c744fe31e50609de2b8a70d056d00e1da48cc7d951dd9bd77424648f4eba819a21ca77d19d83ce8e29623ad8bbbbdcf0d6e20f98f9698f6019d337e7ec539860549e7067cec91ea01e3f9a5c210dc456f20377be262b0fa80b904910d69d1f39c70c26e3784a3617293aeb3dc790d9c2ba519d17fd812386000000b00347657189e836595bc74ca7010f5ea2e62ab4b15fe71ab1aafddb3407e1b8ef531266964ff4b5e7c160058c18d7c2fd2b2964a00b8e68d9eb5b5e8bfa23cdac3d025954794257d0c51b1bdeeb401f023a565a133cdd7cbb97f58dec2f9e86bc17c78669b5c62e4c7f9fd81a3d60cfbc1f5ae6a00007b59c59b4f28687fb6fd87eb873e8bfa133bbfc0a1c2316ccaad82b35b97ed3854da7640cab45709a600c53cc639b7f6b1e69eeff36655fe68a620000021c000000b027e66182ad7ba06bebeefd74b9826074f77422dbc0bd480152bce15312000340b474b176cd1fd2f2f690811f322d469eb41d40ba325cf3e6286b8cb3be873a427505e2f0868fa8f370945b4d5a98fefaa396d627f8c8964028c47ce2472cad137413e3726e02af50a7286ee2d9c213b3296d016e8f4eadab5466761daacf82e1f76b68bccd566521ea9c1df731716e530437a2d0d7a3f4c2760e8e70f80246b12d3c6998c5722d8ebfe57f3cc4ca8d01000000b00239a40fc769c8bb5fccd6f08e97bbac03dc655456a06baf219eba3228a607f82d3e85a99f2be2038a6a94b3367210f4c6787d359964923d42806673a67350af8cc10ac22e666647e3afb7e8da2f342cbd430c368f724fdfcd53e75ab35ddbe84e14ccd7f453294bb4f0f661d750d0ab26f6b1c4dcd497864d219cd9d43ba44e229561ef50ee5578bfb8d57df91e73cc0bbd1398378221fc51836de6b551f139ca6be360ac4d80b29a1881a1675ea862000000b01f60d75c036c2e228c9f93eae0696a60f683b90a0cc8507cf8faefffa6fe4439478a1dc6730a07a728dd6f72ed08a6683998554cd77ea5bdc32a7abc159bd3e3d15457bdf77cf87afe70bc091855a3775a805520bbdbb88e4438e82c8e1134af41251604d5c858216b90b2ce1728fd991ac1496ea8e42da531d6a6f34c9a0b9e1dbf1953bb57fbdb47641dc61fdabe7c0866bec6cddcd5f269531c1dc8c575e97975569a2dc8856236e0b85050409c8a0000021c000000b02773acf5db5c64f285581c9f9338a7f4b56fb7a84000df95539c79a7e1dfa7e7b9744240f6401d77ce1b5e080d883829c750086e87d31ddf91493d610ece440dd57eac0ed104ba5b8c482773857ba8559a6595dfed494516acb440a790a15f08ff8b387d1b16637c4e386d09a86ae7221a92b7a0c3b15e11f2b96807009c32e64c940b4f805ded3df520a2704cd7a6820e3ddde553b42d52a9d089aaeefaa6995d6af6a445c49323157d200db83615f8000000b002900c5aaba7f2030cbb53bbb438c375da6e64fda36e929a55c4820ac2b848bb077048e516a4c63b90579223d6e9617822e9724dd284bb55d7919bad02667e9a208fd426b148d7b474f0d8d48dbd0c642a4f48f584245ffbc89efc815ba6c096fb5a3ff51452b70dda458dbf2c62997503a624b5b81893c8421c0028fc8fad3199f7f9452edb8eb0023073730d626379057c8958c90487cc49409c63df8e3657d50f250fb8917c92182366918391ed21000000b007eba9e332441b9b6fd57c138d1a52a1290f4dd4e823974e4174931559e7a90d134cf49e391642294da2dbcb23811775bc8cd5df400eb9f23546582b8b0853f2806e875de7ba19d4bcc81e6747282cde0bf0197e84ae1d3c7d18dd54e6c1da851e457428a3fcaf3b3c0c38a4493f39191a2ff9c76339f11e3f8ae575ca6c16d4919768595753f8df5142e3282426b39b1306b5041ceebe13ce47ceffa09aba57db2607090cf0dbcfb1661e958dcd731e0000021c000000b028854bc7c947ece43b5826965b80e87110ceda6eece2e9b97a972745af64acd3287a6da08f043dd69043bf1ac6514a9da7dc842510600a6b8dcf6db7b03aeadf8bd2d6f55ae74985ca30ed6727d4fd7fbf2c3a3ccd62221effd4a88004b60c81e87cf639622448d4177522ab9b0faa310c4b27f44480dff929aa00517d30b645b1428f4d8a0e3435aa7bb02484c4367b090442223dc4bd14490a4a421863351023ee1b835233fd5b45b0e4f508a6921f000000b01d289673d72956641a8810addf1d76825cc9a76f8ded8fc440838534dab43c7b1285c39b630822a4b27dc027deb8bbd9b0424e0406eb083981c0b4299f836039e40fbcf9d82916474df5165f875acdcc22e73b2d881bf313260da7ab1177b524ee86df5095578f4c688005406aacfa1a01ab301e25aab9b407e821e11d84a90d286362a5787b7912a4546a8573aef62a1825f5452122bc0069856a7f6a7a83bc9e018d7609a7f35e0d4b449655047f8e000000b00c86b2e04c827c1f40af92aedd3890fed59bc53ebc6beaafb24da022d06eb8ebc067bfe724b573dc107eb79e01358618cafa1fe5724a2b9c108a1a3d55c88bad1ef345e6e3c44fed1070e416f58830d6c3050ad44a67042553ba761049ae9f0b10804f119cb28bc08acb5078370e6f7428a92204841674d4b0a30895ceadc5115749d4bf7f8f200c4425e0b50e8edde01eabbd8829576bfbde0226b608a71de7536d7ab9c292f0ccd1f77102bb6394a100000fa400000168000000b004a58010e4a9c895545099329a3b9c8476fcd5d51476a997c4cd0fd8ac5a883e2cdf75d217ae486db3699b6b926565bf1cb24ee3c898303be400bea8bd7fbfda6415e5662c1171c2fd6fb7931be1bb26eed30a43524155ff85a281750cdebc17b8b2ec848a4dc5cc340f46f21f1a0bd400fd16c3c44856820ce3d028b2d11cbad640096ec6e7e049178a0fe15c8ab8660bc4aaa188a47b2330263cd4fff122e53bde2d0d7ad623a8ca8ed98520bda017000000b0130829b3be71be10eb6942f2c61bffb1b0cb0a3fc08df95633255c39550f8d8a880377d559f24bfb973c4e638b9ccc4540850d3043f202aceb21d05cdd27d5808fe7a8d60789bf328b5b41630f831492236e1f8b3584a305183eed615d57f41915710c23e6633b9b5a3452fbb821e91524c18425348848739dbf261d59dcf8c22c8cccfa6b7a91c0f88fc6608c8c156c05ceee202e23c0e9b91c6681011c690791b6c5701a03cdf71c2c53ad7928643400000168000000b0143d4a0673588953b5a3234068f17fe317ce34ff574481eb586645ede4fd0a1df1a8c91f39275ebe57054f6bb83a0669c0cc56705bd905ef77fd475e44f4ae7c27b9e4192517b46a8d68b282e5b2379b17d09cd5bee00b2c1f3e7823a0cf3d8ba7798d9a5262b7d8d9c53f46afb4824808c8739ef9b1057ee0e19c06f0cf1bdd15423e2da726a94959cf5722054773db0b6fca123605cc984b63df7528fca9a2bc0bf2938eaf14c83dcc6154dfd1cf1c000000b0109896d77097bbfe7fe016db0e314524ec31814eb76bac2483a759b9c3fa753f8d7761a1ddfd476db2946b92ef3e02b43b56ea19b803ebd59c5b19c8d2c91aaa6378a95be226e049386398b4426f92319858fdbef18a3c3787bd13c68ac19e3ccc1539eeffc60452935062e4f60667e514d2f38cfc194bcde9531a706e8b19cc6d104d0e9facf03704319e9ec523e0d710fee0cf3681f3bc62ea93721479d7a77007e9c3dd959388359fb1eb8b5c5c9500000168000000b006120e5cceb39e219c320896babbeff32d67b5176d1dd49e03e07652e716d4ee4d3ca2a8b3eba96aeb35d5be4edf7424abdf912ff7b634c8566404e53790f3b770e52a932b4edfae70820536f314b7f9b5db0fa4e61fe310db3e922666d087273ee86ac95121bf22ed2719b307eb17c72c38d6a4a44718e55f162351ed5aa075e0e03a2a1542dad1eba0472b1309ceb527003679f242e2e84ec4bf7118a3015fbba017003e1dce0ecd6a1e86a4e49078000000b02202e8dbc3ec209cfacb74348c631e2b18dfe4532a5068d6bb169c34129c56ba46a53102ef6b476e932d7072289bc21db57a1d1596b0d704ca4fe809cd27dcdd3746d16eb828e19ae40d847804282fc3fa4e39e147bac06fbf6d9a07670e613ee833516e6a5832834a1e45f18bb3a1e32a79fae69cf7c721413bf0c519577156ad8f88ffaac98f612d11164d3a3b24500687a73e92256f6d814bc30e75c8bd3b1e906eb6ba74cc99e9379b60d292832200000168000000b00b5ac8d74cbc940a82aeb181034352c6ded256e0a627ae0a2130f8c133e685d31cfae28643f9b42c92097b4a07afd9119005796396f5e7af55fe37f941f14a260ae596686a28d72e49902dd36642c3440f6c19d99ac4371d25bfd40d28a68c230eca92cb2bb9d67cfcca540c822ab8c5116805d71114ec69d77089d8bf6172a2a1cbd4f0e38602fcc33d4d71abb8bbff1fe1980800011495525260d11dec1959b18e749ee9370e44145d8e0f2bc4642f000000b0082502dcd86ba86f14e86cac47610305c78146ba45b7fd2dc4b732243a2d78f7ad9824a69fb37b768c1b079f7a22dcdebc78ea020597d3fde2e4937a5fb5a3d83c0f4720abb7bed891e2f5d3e92f6e3b1d867d0df9e4d9a932fc8591e8752c50a03c3d992c58c86e5e275417413ea6a72b8584039cb4e2083257579bd2b19850dc2c01998b4d5fcf8897e0e4f0fac17b2705240fabd4bedb3447f0996d797952ba06efc2a2dfb0f1448dedc5eed3c02000000168000000b006c8762ef60d5a13d7a23b41566ace258c08dcab4fe9697188533d31da2050e092c8899e969072d40c339e9f43c3d9be608330ee516bb6d46b34bc858e3761df558eb0b289c9b0e456fdefe0bfd92805b8268c3e42df1866ae26c45157759b6aaafc7a59ebfdd12b1368e79e8213bd2c14825ead864e4c258d7a5b7d632ade94ba1244b7272f06045654f4647a7671041b59e9e159b3895aa6d362dfa104e3247c95fda3955aeeb31a900a1ccfdb096a000000b01c11347469543444dda7f55d3ae0266438ba1582deb533f0cde1993b30c3d38928fc7bcda4834632f4ac5e127f81e0d2301fa9baae913037c64d1e45b18cc659f1257c26eb02ec639836bace4c742b28b8ddd589ca8f94959cbf7240a01bf46d2fc8a2a5a4e6a89f552437ea317d70b922c0e1629bfa84b0f5021539c298389765e87e8260bc07842e0d286ca86b962f085a0416b3ecda7b35703840b03ea2591aa75e97baa5fe69abff13a6f532f93200000168000000b02210472cc6ed4160412013a51cff729e804156efe2f751dc7ed17db930807e5dbc4dbfabf178344d4853695659544f504e0f05cd9330dbdd6df7b0dce109f438c18cf79a3c9843466d7d3ab9eae596f53452bb565c0eee23a092dcff54ae48c069120991de177362b420442045b5f4902e33d24d44e65580b99ff30ff975e264682bb0ef344c4d05f0b53979966a1ec7098a319738c263ca6c4058761daf65a83dee06fde5ef3c2cd94d581d51239a49000000b02697d6e0e76125dbbcc891508207d9a188f1d51f3369ab8686beeab0745b77006a045f66f36a0362a70a2c96096390f96baa6830d23524b857dd4b4e761d446810da54647dd363f5d66501c34ec0d7fd0da50934785d219766747e66f4ccd928e28f152653cb9e69a80eff375de3edec040db5b4dcc36bc0b4bea870cfaacc72e7f212e29d1d79f24a4c69b791fe4b9d14d5848b15d8010b9b49ab1b732e3a6f8b857efe892776fa95d6a3057a76a46500000168000000b00f2a12e340eb2bbe6f97461220bbf5119f830351e61cf12b17fd0b00391aacdedd9dd17a4e87447261cf9f0378138a89e2f6ef3ee7a4e32f741822304556554cca2db48651ed7f092a4b00606c5114a1e92e195c927c4f71509c610517b0fca61d963abe8642c4240d5a16d4eee5917a02785c28bdaca56816c413619492752ffb2930e553f96b81f645ea78fb910a99138cf0164fd1a13bee23127e420f20d260f388bc36f09b1a7b88839a15b2950d000000b003d8e3db7e1cbb67c8b60dbf90eec442ccef888d337a58601c6d8009879c37b10a0664b1c023b4cd5cac3473306e2cc19a6e34696ffa7ebb1498cc8c3e6b438e2692c45af154d8d1c4a0c8c0a8f5808c97f579b91afa5ac860b7a2803b2581090176ddd3b47cf8d5eea4ccc3064d50f91e0adf3c60de9af0cc86196e9262c7e937901d43a9146c436744878e2f8dcc50197be3290b465600280481bb56b2c6a5359e12c9322caa87ee1cbc2635f52ee100000168000000b0010c5d5146573bc8b8821de0c0a7eb0a31e49bbff679126b271ca35ccfed3618055a5f23112b3706526f172c7fd6f597079b8f4b3d088abbb72c4bbd091964b04360bb8dedcb3e91f75db4833aa9277f6794b7a4b084ba82de05ee6303dfc10e4f924e771151f41c25ae0cab55454cf525c4fe38894f2633eb1314311eab5c4f7f120509032df3b46dd47cbf0c55b9a4011a839d024d83e895ca8dbcd0056a52202ec9c477bafa378a7f7eee293583aa000000b02732698e7342a864b0f38eea3a2570e64db4daa68bab0e8114b52a4785984e468ac79add7dbb82520629114658d8cf0576642fe2ee0f8ed70f0578c25a7075f7978e44bc565fe69eae22e65713e20c4940bef76c945cfd24e1bdc2cb1cc2484ebf8151a3256f003247394ccd1fa3630d1136c0e323304f35a14589baf05b04a8e994346672ac207c6cdf0d0341df06500a51b384c3118673c03c3f321f36fcb36333de813b88647b221e4e332e928ac200000168000000b02e2b48b77e43e4633f59f05527731cabe7330dd36fb11e102826e8ff0213e88da0e0b3a315e19407167bb25a391a30b4ddc4332fd8f3a549be710a2790469785364a1cb7eb0d34766ad968879d3d85ac4325e25cbcacebe6e0897a7bdfb3e8460009ba3bec53ba84704b1fb418d434131320ee1c2fbc07bb171aa02f5d50190887a9d492c74420f1549d7b3c065f7cf61cc33d3f2bae369550f7a143a87b6470fcdee5755c8383d7dfed7f4620a13420000000b00d2cd99691695b7c0c005684f89cdb45d09f31a5297987df92da3247718f6fdcdfc575700f78a08724043548aaecdb3926ec2b0529fc5e47020ab857754c833f9e6e2bd69f73ec164368c1081a21ebe8b03518251aa7c42963ff565a9b83e33d948044c5d47855480b48c334d4bea9a815c84f78376aa59fdc19eae7aa76cb70929c51b99bcd08ccb4dde63da30d790a06e2c2aa4336f4d01dcbfe174ceb0fa0c73c1131edb7ef3a75d118f45d8051d800000168000000b0035ac97a3c6b9b126df9f9990098c2a33cbae168f5077e19e0aa70a1f8db9b4945779d24a8c240471a87fe7b9c7f183af904fd429be713b70becffd3205fb6ea562078545b7ca842b9f2f9ecff5d0c6c45fbb6134df98f9138639687a57dcbdf5e0981f5ecfcb1e7e83498dfc810a229092e8e4c4b2751c905661ed1ddd6549cdb69c1dd5d16b14988c39e9f453a89292f956bc328b6db1b9f76218532d64c48c7f0059a2feb88cba473f78f888aa14c000000b01dcf6c414cf4960a64ad7239e42ab58d339714500a6c2f4e7e2c9a0315a43ee41d6d667da600995bfb6a2340bd3bf33108d0fb8dbfb60b58ffbd6f570f1984c83174c7d51199aa0f10889bdee590f7ebc3d43ab25e4f98044f9f80f111c32255f85547c22c142c0b3f558c43c889ff1e0d0db4025527d6def35cbe1eff9fccb827f28a3035ee2241cdd568167d837bb9157be0ec642fbbbea76bad13dc8f8f0d4ec0845f2990f72b01cc71a72dadc7d200000168000000b00740ddc37add5b565fe35fa39c3ab05628b0fe7b57bdf943ea94a47071c9af0efea2e018fd8afec9c389cd6c7bee368a9acaa1b1be75ecfb929bed5511a352e4009a9f72a91eb7f430136ab601aa96234081e07517d15b15ca63dd4a194e9adc25c7fa71366f065d1938cd6036ccab0f1cdd036807f226cddc03190bb50b1f9c089c2bbfa69b3a6e8c88f8f68200b38023510b8896eefbf0079862f1e4647c6768bd0a4d81c564ea3492fc56d1fe1008000000b02683df584c5b959fd910966414adbd00b499ea3d08772f19c877a937e487d2e8bce521c5ca40de064d9205a3154e24583e4ffb7e6b9a0ddedc20a60382fb401ea49f26705761200461ca7dbe84176b9099dc58c4a7f10054abc9e7411b0efeeb4f2feafbfc3812c5c7a29948f1c00cdc068e3823aa7652fd2a7aac2102e3a937f7723fc6d768784aaa7b9b68323a25e72a0f9e866898ce028dbfee842f900c5968e27e5d0c1ebad62b48c54fded64e6f380000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020100000000000000000000000000000000000000000000000000000000000002020000000000000000000000000000000000000000000000000000000000000203000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002050000000000000000000000000000000000000000000000000000000000000206000000000000000000000000000000000000000000000000000000000000020700000000000000000000000000000000000000000000000000000000000002080000000000000000000000000000000000000000000000000000000000000209000000000000000000000000000000000000000000000000000000000000020a000000000000000000000000000000000000000000000000000000000000020b000000000000000000000000000000000000000000000000000000000000020c000000000000000000000000000000000000000000000000000000000000020d000000000000000000000000000000000000000000000000000000000000020e000000000000000000000000000000000000000000000000000000000000020f0000000000000000000000000000000000000000000000000000000000000210000000000000000000000000000000000000000000000000000000000000021100000000000000000000000000000000000000000000000000000000000002120000000000000000000000000000000000000000000000000000000000000213000000000000000000000000000000000000000000000000000000000000021400000000000000000000000000000000000000000000000000000000000002150000000000000000000000000000000000000000000000000000000000000216000000000000000000000000000000000000000000000000000000000000021700000000000000000000000000000000000000000000000000000000000002180000000000000000000000000000000000000000000000000000000000000219000000000000000000000000000000000000000000000000000000000000021a000000000000000000000000000000000000000000000000000000000000021b000000000000000000000000000000000000000000000000000000000000021c000000000000000000000000000000000000000000000000000000000000021d000000000000000000000000000000000000000000000000000000000000021e000000000000000000000000000000000000000000000000000000000000021f0000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000022100000000000000000000000000000000000000000000000000000000000002220000000000000000000000000000000000000000000000000000000000000223000000000000000000000000000000000000000000000000000000000000022400000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000226000000000000000000000000000000000000000000000000000000000000022700000000000000000000000000000000000000000000000000000000000002280000000000000000000000000000000000000000000000000000000000000229000000000000000000000000000000000000000000000000000000000000022a000000000000000000000000000000000000000000000000000000000000022b000000000000000000000000000000000000000000000000000000000000022c000000000000000000000000000000000000000000000000000000000000022d000000000000000000000000000000000000000000000000000000000000022e000000000000000000000000000000000000000000000000000000000000022f00000000000000000000000000000000000000000000000000000000000002300000000000000000000000000000000000000000000000000000000000000231000000000000000000000000000000000000000000000000000000000000023200000000000000000000000000000000000000000000000000000000000002330000000000000000000000000000000000000000000000000000000000000234000000000000000000000000000000000000000000000000000000000000023500000000000000000000000000000000000000000000000000000000000002360000000000000000000000000000000000000000000000000000000000000237370000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000030100000000000000000000000000000000000000000000000000000000000003020000000000000000000000000000000000000000000000000000000000000303000000000000000000000000000000000000000000000000000000000000030400000000000000000000000000000000000000000000000000000000000003050000000000000000000000000000000000000000000000000000000000000306000000000000000000000000000000000000000000000000000000000000030700000000000000000000000000000000000000000000000000000000000003080000000000000000000000000000000000000000000000000000000000000309000000000000000000000000000000000000000000000000000000000000030a000000000000000000000000000000000000000000000000000000000000030b000000000000000000000000000000000000000000000000000000000000030c000000000000000000000000000000000000000000000000000000000000030d000000000000000000000000000000000000000000000000000000000000030e000000000000000000000000000000000000000000000000000000000000030f0000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000031100000000000000000000000000000000000000000000000000000000000003120000000000000000000000000000000000000000000000000000000000000313000000000000000000000000000000000000000000000000000000000000031400000000000000000000000000000000000000000000000000000000000003150000000000000000000000000000000000000000000000000000000000000316000000000000000000000000000000000000000000000000000000000000031700000000000000000000000000000000000000000000000000000000000003180000000000000000000000000000000000000000000000000000000000000319000000000000000000000000000000000000000000000000000000000000031a000000000000000000000000000000000000000000000000000000000000031b000000000000000000000000000000000000000000000000000000000000031c000000000000000000000000000000000000000000000000000000000000031d000000000000000000000000000000000000000000000000000000000000031e000000000000000000000000000000000000000000000000000000000000031f0000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000032100000000000000000000000000000000000000000000000000000000000003220000000000000000000000000000000000000000000000000000000000000323000000000000000000000000000000000000000000000000000000000000032400000000000000000000000000000000000000000000000000000000000003250000000000000000000000000000000000000000000000000000000000000326000000000000000000000000000000000000000000000000000000000000032700000000000000000000000000000000000000000000000000000000000003280000000000000000000000000000000000000000000000000000000000000329000000000000000000000000000000000000000000000000000000000000032a000000000000000000000000000000000000000000000000000000000000032b000000000000000000000000000000000000000000000000000000000000032c000000000000000000000000000000000000000000000000000000000000032d000000000000000000000000000000000000000000000000000000000000032e000000000000000000000000000000000000000000000000000000000000032f00000000000000000000000000000000000000000000000000000000000003300000000000000000000000000000000000000000000000000000000000000331000000000000000000000000000000000000000000000000000000000000033200000000000000000000000000000000000000000000000000000000000003330000000000000000000000000000000000000000000000000000000000000334000000000000000000000000000000000000000000000000000000000000033500000000000000000000000000000000000000000000000000000000000003360200000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000401100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000060a0000000000000000000000000000000000000000000000000000000000000601000000000000000000000000000000000000000000000000000000000000060b0000000000000000000000000000000000000000000000000000000000000602000000000000000000000000000000000000000000000000000000000000060c0000000000000000000000000000000000000000000000000000000000000603000000000000000000000000000000000000000000000000000000000000060d0000000000000000000000000000000000000000000000000000000000000604000000000000000000000000000000000000000000000000000000000000060e0000000000000000000000000000000000000000000000000000000000000605000000000000000000000000000000000000000000000000000000000000060f00000000000000000000000000000000000000000000000000000000000006060000000000000000000000000000000000000000000000000000000000000610000000000000000000000000000000000000000000000000000000000000060700000000000000000000000000000000000000000000000000000000000006110000000000000000000000000000000000000000000000000000000000000608000000000000000000000000000000000000000000000000000000000000061200000000000000000000000000000000000000000000000000000000000006090000000000000000000000000000000000000000000000000000000000000613000000000000000000000000000000000000000000000000000000000000060a0000000000000000000000000000000000000000000000000000000000000614000000000000000000000000000000000000000000000000000000000000060b0000000000000000000000000000000000000000000000000000000000000615000000000000000000000000000000000000000000000000000000000000060c0000000000000000000000000000000000000000000000000000000000000616000000000000000000000000000000000000000000000000000000000000060d0000000000000000000000000000000000000000000000000000000000000617000000000000000000000000000000000000000000000000000000000000060e0000000000000000000000000000000000000000000000000000000000000618000000000000000000000000000000000000000000000000000000000000060f0000000000000000000000000000000000000000000000000000000000000619000011000000021c000000b018cb2223bf954f5fb43f08dd1f904dd028e015e2232a7f777b02eb8c19bbef0fe551b5968053b93ac2c7226e607aadc162d1e4b9c49a3efffd71c8e90eba8472c357f5fd909597a150c4ecf1057f03da54f0db275c51863bfd08a7d316b5b2100c4e5e0c698f8d22dac3910ef60643b826132594bc742bdf92d0ba96435c3bd3e056990b095811e9599fb6ea7c80c2e5009a29e37cd42477bd61b9c6bf957bae4ba07a3be97f5170a79148afc21a918d000000b0246e6ceae3c85a1b12873d34b83b83aaf3504b59b82467b17f2ef31a170f7324c6afbbd727b6dec49fa1416da5cdcacb4fe1da65a630dd78d475e7f97516c07074651de0016fe70bd8306252335b93dbb6910e2f821b528768a0cebb9b5ed7b2e2124ab7f744308e3e2a135af0039d9f00820842fd64204faa8158bfe9b43da338d5efac914b1c69feef915f65a3b9841048bd3b277fb7d6ddeafddb7ae9d767fbfacb48ea435cb7e89002ae75028e8d000000b01ffaf982c3d708547d293f9ef43dd039ba968ae7cac6eed815489548fcc19c21a7a8aa1e5792ae5d6e0cf729f6c715137bb407b4eaea60a757eff18237f06a911b1b2f08d4dc9ddf5c6eec38072c5e529421286b2aaa8740cffbacec15b75df4c8df25ff72d696bfee3f0250622da08a243ea19136eca37f92397b43d102dbdaaa2b31876d4cd273853b0a4e9914b3e11d023bc06780cb6f35ba4409f26e146e8f201c18b61de70366fdef667879068a0000021c000000b00514d2664b8023eb6ad419a84f90bebb848821277ea40a5d1110a3df419a6746e23f782c2a30c93fbf8bfe9325a61d944c193ddd916a6c4cd9c9adf393ae99ce9916e3850607c4c476ad0a69c5b4309308756cf40ca98dc8389df11733e096cdae8b1ddc02e680916a726f8e9c3b85d2128f787a6a0fbd787b123231b9b2fb863906d1dd11edf761d68467358740647c07158a00d8c0c31a265e38544a863576105df2c19f06b13f2785a5231e23a928000000b026d773b8b85ac98b71428586b2c6ebd5d5d0734d494aaba1fdf7419f2b29db4e6c93406e719c649be711474f8e8a0af0f744b8e21453efdd2e06bd72b65b4e6a6d96463a68ae115ffcd18ae63428fedb2052b359cfb578d7184fca79486cf0ed26148172fc7ec4995806e1672a37933416894a2e2bd1e7f7de9a10546d38e3d714b042f846ce05adce6268a5bb47c97318d0702d5c8695d5a8053ffabed4a4182cd06903d23ce1ec5bd335f3240ef919000000b02d3a82a076eb1c7f35330b33c39c485b585e3ed57464db422cfc5fb0593baa24ef9807aaea9ce3480e2c807be7a4e9e5bfad94de9eda4e0fd0a5a6069ee3df4f636bebf3b6ac651b59b2c0b2f48b78f736f129f4434b4eb9f0fd49e34c3dfee198b05b83d4ce2f27532b6eb16ec6387401902271deab418cf25835c064554dce3081d961a5ce9469c4221e105137bc081ff27f7e8f42255b1abffdfed854225cb27058eb8935e1a2b59e450f810583620000021c000000b015aaf00921cf4d8c793fc91222623a66cc5d7dfed1bd03b496b71a51cf80ee401ec6201b1a3714e2bb05b2490c78fd5d87279500364c0720bef720a2c3636c24ddb81644dd67d015619c7eaf242797202068942396f0c152358fb33e3206faf31d0d010889e624069f44dc7472cdd0eb2f69e9fa519859f5a4991a9bfb421c2f06ecccb5846cffa20ec14648ccea08260f532b13abc1d8bc54bd1adccfd6838502acd79aa9a46dd7b4007a5f4d594d1c000000b0253f3b69e62dd4e020eccf12d703a47b2a150d63c5f52f2d7fcde20f5497d95f11f296979a8fb26009cf3c664d7dac6c8a5ec2bb6f9e34f5160e752992ad65c56e8e4a484df9217baa33fb7e48f468a0887b39336d5a58ad81c138cdedca05a127459c07c91418cdda0aa520b50f20f3257f01ec0917b5af7ead0e991b514ad6b1b7d98e6da22af7d4756d0e03d5fe071b0c4934487ea4307c3e526f8f703ba2db1343ca0c7c7ea3f90a5687f2fcff78000000b0265673c6ba5f6bad445d6d8b84c1acc1cad648e52afe2eae8a752b4de52fff139922cbe50e97b3d4f63780ee82bfbf73bd873342e714835a117f7ebed5d0f53b9cbd963d3c8407163375dabe73af98c1f5afc4afedfa998f7a614336892e072a5ede85f783c8daf7f0ae6b9317a6abf1006ae478c360c9c863b4a314e4a134292a6355ed49267df7e8f9dcbf76a793e722a861911d66c5916d2e29c5871c346be0630b394e98a58a760f5735811647bf0000021c000000b01d1ddbf1ea99f7b3eacea22f084ceba4ec7c9e960f8d1ee9acbbae9247a41db0907683a172391b4f68c04a3679dbd55da2c1fd4c45830f42049a7fdd385860c4c1c65493980415340cec8ca81915a82cf2dcc3019911c18ff7c2335bc01d660dceb057949ac4a8afdf805d1f0c4da055226a14e024336583c31d94601fbee6b596745a0f694c65317d287a1534b1d1bd04b35bff57a5886369eb7fd8a25b78f387636bf6df988dfa21012727def0ff97000000b01c0052ba02016d51b7879d428fc699510305ce4ae854116c4afb30ae7b39586c1fd87db1b342d101b5845de935627f661c6d6de78d012326630538ccbea8cf845bab55a55b381d159b753a8e4ac549b4a8feadf77de8691de79de34426d628561bb0d7a708964cc44a3f18051a11000f131cb1f9b08a087f80b9509e2dd79a85c1b28d102a9e43673d4ef10c2d9505d0094ca691d27c0bce7e3842ade277a1c77a7f76717d03d124f6230085a76f0477000000b019c0b0f86a213bb87d83e925294d30f84f8351e20ba894c8a38dee26fd9800e29163ca9cc73aa77a19c2eb2cfa420a214dfada08200e958591965fa3eb48963829a0d18f7a9b816eb0fd53668963bab5a1dec6e8caa94c2a5c7b678962d5f788bffbf6642a382e714d8a6eaa90747d352777d39ca621fb066b1d82bb5e1fd58a99d7db07a9790505f5b1d0bf3951170a0890e92ccf162bba0deeae6f73f85bc5909586bba79913f17e9bcf91a40d5d080000021c000000b01f20a4c619ab6c8390b2377eb0f0f98a15ef412792201c2f86fc1510da4c8613d97f3df84068654a297f3932675db828c2711b21930c2c90055f07045b99a4b9de153318831c3677ea7b46cb4cc12a44dcdceecc64a452261a72da733c8298b885fb01b231e42c7e9b497f6a51e80dcf302040a11afc419cf0942b51fbacb8421b85886f0de9730fed7fd6e055dc6e5920ca2aca0a000c2634bf551189cad3f9f59307c7b18d74beb3370dc7afe7f5a5000000b00ce7018bfc8b4fc7c3cb1a79b8f993bcdcbc09a36e7e61fdc9e0d46a004f6dac86e4b7e3598f7f791d3d6d6cbae1967c3a193f617d5472452eaba9196d9b84599e29428ff9dda567e2dbff05ed3616585ab74f0e9d3046dc4d488bbef73d05f7f4f45b4deb087ebb29830dc6871d585e25227434e6802b5f3ead0f090758a40c643db0d9c3f7e5830205ba15293e30250ebd1473a390faa200969313c88241b8957a6b399fdd7e24e0675097404d76cd000000b00330608b25b661de93ac42a971472e703df90f58664eb1cf4967af5b5ca18dd89fffb2d5e44666d831e53bb24d9c6a2498859ffef3e4694646ef05c8e678161b9a16f10550d6119acf7555a98f1165cf4f5f69106f7c992617da23cba4f6f3a064212b2ae660cecf34783a7af7e2026d03b6afee17d3ec0dcfd032627027ad2cdaefd920a6d5882fe5a918d4c865be650133cfee9b99bec73dded7fb84753c76c3c9db0e42599dd9dc37ee499ed5f5520000021c000000b002e98064abaae5b13f41f29386b0e87215cf28213584503061fee470fe51022ed5688b1a7c0dd8d094e1b4fbfa4f21ef64d6cc75e6fe1cc2ab8b875cc3534633686eb40a02464daf77f1fd75a24a6697ea95887ade3ccc73b7cd36fa6bfa9055ba5573b618623286fbf24e5befc009b5076a538afb1c6f0ec0485622fb2a2bf7bb26b590c1a750bc39b9c051ba4535572e6af042e0cfc41c450c6ef9818cfa8d188cd4f422b2dedacd4720a2f0a9a750000000b02c5d031173a33372fd74d234b11491a66567f798cde203a87ede23d097a21e63fb061ad898f21e7919f04201ae67988492d31956668ac9e12b244ec536c2a8f52fdb1affcc75506169ede51ecaf8cfded348a6e8a069c2f0aff3c5e0d5e1e5e483bcdca2c23bc1f1417a0738fc804d65002cc0c5cb02724232867257e032709f7f468313ac6ab1d892fe5f0ecd6e55232e7d4cfa048c6589debd9417a2d9cfc63825b87e67bd786ec37dd90045941d9d000000b02a1c141081288239334a22d2ba81b3e30dbf589a46618b942752dcff501b39b7093df4133447f9bc8fe5a012b7f98e1418ebdb34c35865daf1b8c0d305ca9e0c5117d4316757607432ae4e5b6d10961a990b9363f7d51afaaef8e2b0b13facfb1bd0a1dd33ef5355341eb46b44524fc3160f918dfb776a536603c20d7cfd6c59a6d1ab3fa4ea8c53cb448642bd756a872b88e3c66f112012a43fddfb27561764894bb421671b772f289f4ba13fcfafce0000021c000000b01f59ee7c1cffd30a284ae7160395aab5b87f842354d69e2a58e5831b32130d3f84e3e2458d5b2f524cc9275e187c1a34908fa0aee74a95d4f1fd78f733c830e980059697bcca3c58f2c9ae8aac347e11482aba061fef572e1acf7c6bd7c512610c3fbea68cebc558a1daff4fc8bd95140c9dd8b967374ac7a10a1c6ac36a5c91adec4fdb65cd298ede79ef00e9960c202fff5c45e3254091000155cc9f5b3adc3e0de45a4b64866b03828f98292dc632000000b00a287d29c244fbd415091725e39ad91efdb4b5ab4adc18f1eb70bb2d3f5cbb2fd26d3aab5af4fabab8aa5ae19f1c83e862562cfdb8cb7472130e82e63eb2486ea4a877e2822f76f0952d960364eaa09a0ae0261353a61e408f3f29322b7bc682f3680f70aa3642d17ab845fc3d3441a22552ff2d37e612421e139f922790e58fac60ef012098370754ffe1860a54bd292f5bae18e5bad9700cdb5fb1c612825fb09b1ec0bc6063f958b176017dde7a5f000000b01e66ba2061415337ee25703ce7df84399284abe1d4c7f57a1131ff7fb61213a06285b87ee4619d4509eea1b2dcbb1344cbfe4d67ef2eeb56e84744b7c5648b3c6dc6733548547edd6c9e922d2924734d65e1ce305bacf329f49ec1bd2b246d88ed29b81859289c2fbbb5fa3614f395fd03299a039b41333813e473d8e7d58a565b137c5d450c7d6d6bebeb927424facc145a00474fd48cc0bfa5e39f62b469bba80f702b1591424cf11b27958308c4500000021c000000b01ea5131d14abdfbcc676350b0a62faf9978eaf51ec93cf3550785ad0303b25c7e70e5b882d561c9da74a4ae8465c9cdfd779b85a3dcf94ab9cb6f6fa37ca216e24b0a0e08c6f15048775e076d45baa4a4afe82b2e3015989122d13a2d82922838f6601837196605a6a0287d840bad6b22fa4ab48e5e6d4ed92e6ed373cbcc2c7e955eb927eeb19fda35951a122f882ce27b5ae743d696ba92ee42ab9f92028c24e16b3c45066aa270c73e35a2dec36c0000000b008da97564fcf8d2f015c1cdf4e92f380e0f08c38e2e0cd3781d9321880eaa37bf76053ca689d7e8202e5806fb8e6c10c748fd5e77e15b1e46ddfb0f2b9a346bf553132b75b442b3eea14a6db8927417cff2cacf7fef923f0864cbae168ca388d13efe956e2314474a7ba64676c7431e90165a8c133f53e5054b4a9790dffcf40ef338bcd93a7df229579ea7c47dd0ba8013493d4fc6af16d44aabcad9a7fb82c56baab4ec2e0f17e5d4ecb2e82c5ed49000000b00582467968f62ec79a27bad1964812d15d84a1d7807fbc5dcf1b148fbc179fef2ea200c369455b6a61405bb1be5935a217b09afaa04a5581e9f9b5c192e67ce859ed6ec7c1658ef4d6f3bbd601c5b3eb468a589b53b87cd2b124fef9b995fb5e175c72dd8da3f5f79caa4e46297b19d0078e8e8558c14cdd996f11ca48204b5b265a4b52d832018f0e62d6651a43db34187ab10c07f10be47951b2cb1a508e88fd28b8d0f7b92e495cbae1b721089c8a00000fa400000168000000b00cc32951c32e5cf9552227ef453952d5949cbb95935c992884aeb251e31a71162281c9ce3a1dc11c41a16c445e9fb9235dea1258c08ee8ee8aef0e5e533b82c937ab69c03d771e97555ade247cfd41c7babfef91b73af96d7bcefbc722cb5931d63068b1e101d25b811464fe000392261efecea4bcef266289374e9077956066e4c91507484e9d722a8b2a207d05c2f32ac91bf524e386258a3dd923218e9298472dc4c6120b70f78755414a45d14386000000b00088c715008e371cab96f7c6a7f67857b7a679664ed8f6f7d5a5e5be3e756ef8b35b3c0ec3c8bd60a9ee62f6ef0ff6d4b0b27d0872b9736921604ffc37b1c4f058151b9dc759b075b839e1fb7acb58b5ffaa2afd14fb3075a066499ce8408e3913dab8fdb1d3319cf0fb165d132bd8b91a339de1d291a2dadbda940f5d7b4219aea8c4090dc76137ae5a825f9c9fccfd21d03f731c3957a444ee72448a5caeee5276ab19181a39a5465e035b448ca0d600000168000000b0186b8606ec3c01d8afee739cce53da6685108a7d2a1e874129d23a7d97988cf910b89f169f0697d3223a665286235f7706f9e5d5cb8b4ccd96ea6ffd506925a4cfaebb8b4a1ceb080b4f9bf22f8d03b7dfa3a1621a9f1a885df5976744ab01c1a834b27117c5488e36e81870b63e542005d8590b659fc8d09e4af6823d957dbaa83cc410516e1bdec74a092b461ec0d71dbb1ae5ec73974fad1c2e7fe4183ed38a42f1ebdf027735f96cef7372a02c4c000000b00100c2d540e0ac203b805ea007de8db5c85fdfc82ef0f01be21275a162401852d3691581cc0317b3d3ea5238cb2488a4f5ada800d9d2944f8d970b90a7314dd705aa77aa43b7a3b8e09566284df4ce0bfce4933cd66202d1d512d8279fc0383825485cebe60ee14ba21c239105de8b260f59a31fec9e38b66527e7191b9695edf837d91628b768dd82e80e53ff5e4be322d19fb7a928e16df3e6cf38ceae4c9b05653c0330047d71897c07cfa84506d100000168000000b003c56c7bb2f83bd49be265b99bdab600441b9f44f32a87050910cfa03e00cc537e10cee604019697942c14103e1add6c56d8d09bae04b98105c4085e5f3ff923ab836997986efb9cf26f4c96e343f136ec8f57e41022b06649d153e4a44bebb545459f207c813810b32c09a54e44051c17b6f0453005c35e104a975a2958fa28123983155818feab981804bf9719d40e17b465eb9471fff333292000a6db5953ba7894eb648c183cf1efb9e10e0a234d000000b011770288ab4863bd2d16588b1031a06d572919c06a32b2c819d1e7185ee78e7dcf94d0171b5ae7b10cc9b272e9db2fa4266c7d0156f52584dc4e4dc9a2de1203ed3e19b32b4f121c93ecc53c7968e04ead92d19e3bdef7b0fafcefcf6e3326b58bd0b87b53ce1715c44e953dfac6b25f2b43ee2985df988e3c6a6a98e89cd552209e6f73613cdb026c24aef5e19ed3d70e21ec97ebf3dcd621ae192294aa731201ab08ca070e8a3f3d41d6b17681a2e500000168000000b02a9781585f03297dce8b744f2e5fc7b64ae9ba4578a18c69ff6f7cf099913c3870ca790afe08ac14d9181da0617440a5f45494368ec8454c54590fb0d34d5802d9fd799e588782e2f3d3e5048f33dbb6ad29725e3c52d7ea16a1101a8d014adf01289c19ce0c7f06424cf70ecea9df1610424e1f7149b1ee6b5e8f805fbac6e1b7521080b8e14769dba67a150637b2081f26d0315037cf471a6556adf31edcc4805e01cc9ab33fd957d2bab60f3445e0000000b0288757f8b8cca6f0b3c83806831c69dffa09244df4739b6fb2455a8fa7ac1710331b3fd8f94aaa1d1a0e24b4decd9c9d788c1589c1457f67ee38669ada6f392d202dac33fb821a867c3f63ecf1192518bfbaa4a1cc2285220082eeafe76211f93ef1d2d81ac83819e9aee7e7036fdf3d0be0c035f6d9ca4b52072cb58ee28e8aa40bc4f8be2df52b06a2c9045e92d47c14e55f069df3a3d7c561d3c0e4362c23b3caba995ad91b358da292b7c8b56c2000000168000000b0065359ecd042c1f3b5144bdc38431857fb338b2261a637129684f9468e5a86aa690fbfa4b39041070947b1c2c402d9815e6d3dca605ecbe361d38f7254d3143dcc3bbd9f00bf27ed9d00f30ddcf1743dcf526bf9c26a4d9837518312b5a321faf4a7b9e76ad6a2e33c0fa9fe838d8926211d5994fbb39b157f4edc2aa85cb2a0cf047043a3741b21157794e37a4ebd050f2610baeb6576ace5be9d96a85a1b30073208e9cc3507ca37d0f2db37f202c4000000b01935713f0fab6fd62ec364d077d4116a850634bedaa2b78d362e818b726026e4f2198da0cd2fa6ee8b3c37c96920ef4edabe71e75689bec4babcf74242759f981af4f983704d81d62f3743ae4fa307e7ef3fafec62cee5f85f488fdf739c9f1a1f9d0cd59173f37136ee017e036e92a500078f55ee03f332797277234cbd096dd4220d97fbaf425932be462893c9dc282ef45b8abc509e919c400c3d64fd305e79e814dfeeaa30261b0e56f3435ae76e00000168000000b001e73025a2bb24e78269f10cdb93aa5c3db17ddb53a0e05855d7df4f74229683db90719d4b3d6742e277d7686b2e71688397aaf1b9f33a54719f2831581c5a61285d5c0e49b15f4dc0b9deabb09e6bac7a52a70e60a3d156f1d4733707495626343b22fc51a397b5790bc0a91a2e2c2420163775e761d5fd0c11f4c2837fbe1f869732939036aac6aa2d7717ef373d2606b935a4fff47ca96c1fa4392e849b144cff4b5e78bfe861b1adbc0c30eee352000000b0146e7384bec12a88ab1134a3b07777d6516f0123dca817450c86dc2548c07080b0c18f3a7b5e728e51d01635c2df0a0d62cd5d6bf06bbf4719b89f60ad58efe29b90f10e7f32624dc0c493a82d94f3609fa919b0b2d48b1d0ebb751ee912c51591f13b0481bb78f92a65167ccb205dbe1b6687b21a0a884eaaa00fd2fedb86089495127e9bce26d3f1e57a329a980ec82529f55f5bfbd921b8374b49ccdf541d2f9cb3fe4a358b37ccd2a21f6f3ff1ef00000168000000b02c8e44ab4c19b9d45a5276689ff992bdbaee58d81dcf33f7d9935e6030214434758ff625eed85961c991476fa994453845ad95d854feecdd2a90b131b5ec304298178ebb4e4f3714c009a5de4f956635e8afc09ec28945e80357900e58cba59a40e9f45b817b393deeffd44b2570b54c06b73879117a3d835059bed656415ec644a6bad07c02ecaa4390a45e0f0dad63029087b6545c80d7a7d764041bca7abc6510c732c96978e3d22c645bd56ae318000000b00c12d3b85ed54363fd6109bc63a7af2f9e5fb640c909a0e2fad176397097e376c318cb5ac6034372f35b3cb44d0bfa633c000494a096bd50cda713111195f4a4d1ea732eb87b99541232d1117b81857e004e0186f5801e27d0fe32c795b4d4a648658fa7c8b00088675fa8315de9399d02e622518122c75f4e8f0f1bee258cd94a1a935dd347806586b473aa2b78ac940423ce8abc1344f4c145243c65f85c6a74d0c2e7f90c592fe6e7fb3b8fc3e3ac00000168000000b02f8e1ed74128566fe2477292aac9af8180558b2ea63bcf36d8a5418bccc4e44b65ec151f972d5b27f21ae377e3e0550c018723b401d5d71d29f7ad5cf893dca60f7b953fa86f9e9e0b7468e956a62c6c19f29ec66f22f3615d55a6fa9bc4ef27bb6e61d5239a66d129080428d2b779ba08e6c14e1916222d938d654b81a607ecb56f062ef1b13e303044e61e175eeec70e577b2564218e82313cdacac0ed39da42e7130f8b58b3a37a3f1d548e1990b3000000b0148e0f8d994dba069f604cf54f9c1278514b27b319106c02a744f64fba5c71826d713919d67985f09c631812ff1e1db4d3b77d32b152414d0c8fab82511c2a8ec26abeda02133c79b59ed4b1e5fb339b9a2c83cec53e50b1cd6808cd4b77e31fa6c91d4975fd3c82b411f59d998da93021012802c335be7e5c1f8370015749a8db11a18bd2775d1f3b96f9e93d6e95f71052218c97a59b29a4980264a3215523423a55ff435ba6ffeba608ecb34c135900000168000000b023fccff1472477e6e0d5be51e4bd71d0ad1c967a41832088add7fa421aa6b3c53b91df52bbbd88f1ad07463002490f647974c04769e7fc0960c3e63845e121fc3dd8b54cb2101341efd1856253fe4bed4f226c06edb927b479c4744f285f8e879f79dfbee5a11f80e4ea159e6b60209a24a37c69b337cb296a8d566850c0ed5af15c8a15bd1aa6efc102271b7e48e0f21a949ded5f747ed70d7a1449a132f4a79ed9f698e3d9fa811454b0919dfe0d89000000b004bdae4eca7b4970e29be85a626b061a75b9b0a9045129c4b8882033d25c878da8e867363d0b843fa6e36610acf3f01ffaaf0ad9255ebbfb3cf8459b4a64184eab73a7d4aedf08275cb4658eec2c616f77cac54ff6fd3142589780c767035791858c34bfd1d5b5b43f2ba2ddadf7714c2367f618d96d0f5ece8553b2eb8d190ba2e8bb887e93e64ac5f39e15f113748e07c61a059af10ca0158132993e416ca09b3db10fc1123687d69c36c9da4d0c1e00000168000000b0068e86301f4582af17b6db20312a669e0cba844da4ec67c283d775026a57311b8d485d62d8a1401c75aeec6378aecfad0a661eaf2482931420ba578f4eae79bcc7f24bd807e1585edfeeb52baef285c9f196d493772bf6f49b6b1601b9a1bbb60e00261eb48400911851013be88406fa0ac08b74e05e4fb4bf75e95c67f59c238fdd98927915ba496c19ccafdfcad32c0f66b24303e18431d2b40b279c55867e769bc5cf06f901ff10edd7682ae6dead000000b00bfe52b0afc38bea53c2ff7e69adf229050bc6fe771a1abda4c620a8e872b516cc075a2bb85613486fc19ab3e568ef164a20743aa094f11240985376af267fa25c0003d934f3388385eeeb6b8e7479079fef994e6735d4f73ed5ff53134762a0827ce9448f810e204c451fa94c6a6dfb24be20289ef5b2bd1c312212274904e6c91343e3cb5c6459b4d544d8bd9a88631830c79ab2b436a728ec6b127b2b1f1a0483cd47786065caca28e47a1b9eb80200000168000000b01776d13a3609f22999d9527ec0722a1ff96c59610374d5ee3063f696782948f4f26350f8a96d406fd531f6a629577a0cd9de97890322a974bc15a7e8345d23fb5066054a97fab498d418fbc46604bba0a8df7cb0ba2391b17df804de2ad203c494a53f8c2abcc21701bafc233c66695e208c1c980f2d3740a6a675ea577ff4e3e5a5ea6774e5a2d4767842e7112083ee088f5402e9deb940a6597b0995d17761d023190abac508e1ec7178bc5a4f19af000000b0299862262b08b127f9d65d5fce6a98f4167631d0a7fc23842bdc4f150920685a977f4aeefc5a47f85f22aa40e06e806aa97660cfad6c8b39655286ceb0db64b3bf5b9867f4f0d82cf20610feb20ec1de81d1a9954dcf242afd183431dba4b65b367e3c8b6a9532d5f4d27cd4c72c0a1e29e83d1fe084c239f992e4852745c00f6fc8a5b5624a3034a1f71628feb955f801d494e760943ce8941122af322a14cc9891950959e8f8bedb247cf932bbb804", + "txsEffectsHash": "0x03f253bb6987212f264c5616928f66c956c0f948d84017b68e1dddf871942a41", "decodedHeader": { "contentCommitment": { "inHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "outHash": "0xc2db86162c987f9328539ebf11947c30e3846f8bdb7a820aed2bbabd9544b9dc", "txTreeHeight": 2, - "txsEffectsHash": "0xb7e1130633f3173f7cb9b78fb6e82a99c39ada6ab719e96195d641ce2a4c2591" + "txsEffectsHash": "0x03f253bb6987212f264c5616928f66c956c0f948d84017b68e1dddf871942a41" }, "globalVariables": { "blockNumber": 1, "chainId": 31337, "timestamp": 0, "version": 1, - "coinbase": "0x65a2a896586e32034cb3ca843906223fc2cd313a", - "feeRecipient": "0x0b235aea8996db40f47d82e4c76f348b308348437410b47527d4c347ff70900a" + "coinbase": "0x3763c27097c7679fde3c516b87d7a57fbff2b401", + "feeRecipient": "0x12f0936cd74975821fef2537b6501306af902a7084887216691bce9ac330b88c" }, "lastArchive": { "nextAvailableLeafIndex": 1, @@ -95,8 +95,8 @@ } } }, - "header": "0x012a86560737adb075e12af8253fb09abf17aa841fb56d180bc89f0d2d473c7f000000010000000000000000000000000000000000000000000000000000000000000002b7e1130633f3173f7cb9b78fb6e82a99c39ada6ab719e96195d641ce2a4c25910000000000000000000000000000000000000000000000000000000000000000c2db86162c987f9328539ebf11947c30e3846f8bdb7a820aed2bbabd9544b9dc0a241c83a063083fad29b6c333afcd968f71f8a875544ff1f1f08cae7f770f510000001002c672a4d7bd90c4b6ba35bbc9906598862f626554be3cba05de19265a8ece71000001000ed22b14764d5756c4e97521b31e93e21192b98b3bc2e2559e07b1263ce7b1be000001801faf8e36b0fb8fb337acc1c32316e1fcbd0465d53c47a2dd73ebb031042566cb000000c00000000000000000000000000000000000000000000000000000000000007a6900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000065a2a896586e32034cb3ca843906223fc2cd313a0b235aea8996db40f47d82e4c76f348b308348437410b47527d4c347ff70900a", + "header": "0x012a86560737adb075e12af8253fb09abf17aa841fb56d180bc89f0d2d473c7f00000001000000000000000000000000000000000000000000000000000000000000000203f253bb6987212f264c5616928f66c956c0f948d84017b68e1dddf871942a410000000000000000000000000000000000000000000000000000000000000000c2db86162c987f9328539ebf11947c30e3846f8bdb7a820aed2bbabd9544b9dc0a241c83a063083fad29b6c333afcd968f71f8a875544ff1f1f08cae7f770f510000001002c672a4d7bd90c4b6ba35bbc9906598862f626554be3cba05de19265a8ece71000001000ed22b14764d5756c4e97521b31e93e21192b98b3bc2e2559e07b1263ce7b1be000001801faf8e36b0fb8fb337acc1c32316e1fcbd0465d53c47a2dd73ebb031042566cb000000c00000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000003763c27097c7679fde3c516b87d7a57fbff2b40112f0936cd74975821fef2537b6501306af902a7084887216691bce9ac330b88c", "l1ToL2MessagesHash": "0xb213c9c543fce2a66720d26a913fe0d018f72a47ccfe698baafcf4cced343cfd", - "publicInputsHash": "0x0f1c5cc2f7cf377db61e237f280f3902f15fcff51b70c90b3e0ca8919f65fa04" + "publicInputsHash": "0x2b8b852fcab7e9954ad7186123b6e7be38f1d492d618926c7c0fd50ae69a19ca" } } \ No newline at end of file diff --git a/l1-contracts/test/fixtures/mixed_block_1.json b/l1-contracts/test/fixtures/mixed_block_1.json index 22ddcca1af3..7d4e34b1f20 100644 --- a/l1-contracts/test/fixtures/mixed_block_1.json +++ b/l1-contracts/test/fixtures/mixed_block_1.json @@ -52,27 +52,27 @@ ] }, "block": { - "archive": "0x2b2efee3df02590ec97d0e2ff47c7fdaafbe9ba8e703de44bb71a64867cffb97", - "body": "0x0000001012e5643e26da426570dd999e0e044e5f83d60f3cd813c55059bc0ea0f4a7c9d413b2d2cea949fa0876265cd8eee3a4dce1e243783562ea07e2de537f469f7bf627abb3d4560e786bafd52f77ac52dea36c50419f32386567bd969b0c38e1bd7405d339cecb99fa74bfd631917f965357f0341d8c4dfe6a8f4b621d8df54c82941d560ac24523012499eeca2594f20ce238b7d21b98ad5c638767d70ee05532c2183e6d64e69b005709dfc4771c7ca5981adc54f3e8bd1b00222461ae90e44eda2f1d4572fe0b0b23100a7ea6d4780b25e826e41ca9e71897e010bcb218887b3d036d44eb30a430b5cfc6660270eb5fb7f274689ac73dfa53ba9d0739fe38637f01f7130af8c5888d4c65ea68109a1d58fe8d7d1ae62098857b0a3a3dcd393ef80ed8bcba6eb5e3b4887a32c51c5853b97a5eb59c87c520f36423c6d7be06071821ca1719330de5e3c51a521778b49cbbc1d53f8ed42e0562bf21ed72e8cb9a410b0e82ef5f7276df41353faef675fb408aeb246b6e2f704cab99bf28d1427e7b0fec7b9929c6effdcd045d3fdcec1d1b73faed495444699fab936630d69b519f0bf4f1453db36439419dbfba703b849d1aa5774fe9a5325e5bf3e7cdda9d1f7f2a9c2a035c72fd4a3e383306aff03448f9accc08a2c665837560cec8675fe2512bfaef35a8fb7df08a81001a7fd4903849c0371dedd87f31295f46269c5205dd00000004380000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000024100000000000000000000000000000000000000000000000000000000000002420000000000000000000000000000000000000000000000000000000000000243000000000000000000000000000000000000000000000000000000000000024400000000000000000000000000000000000000000000000000000000000002450000000000000000000000000000000000000000000000000000000000000246000000000000000000000000000000000000000000000000000000000000024700000000000000000000000000000000000000000000000000000000000002480000000000000000000000000000000000000000000000000000000000000249000000000000000000000000000000000000000000000000000000000000024a000000000000000000000000000000000000000000000000000000000000024b000000000000000000000000000000000000000000000000000000000000024c000000000000000000000000000000000000000000000000000000000000024d000000000000000000000000000000000000000000000000000000000000024e000000000000000000000000000000000000000000000000000000000000024f0000000000000000000000000000000000000000000000000000000000000250000000000000000000000000000000000000000000000000000000000000025100000000000000000000000000000000000000000000000000000000000002520000000000000000000000000000000000000000000000000000000000000253000000000000000000000000000000000000000000000000000000000000025400000000000000000000000000000000000000000000000000000000000002550000000000000000000000000000000000000000000000000000000000000256000000000000000000000000000000000000000000000000000000000000025700000000000000000000000000000000000000000000000000000000000002580000000000000000000000000000000000000000000000000000000000000259000000000000000000000000000000000000000000000000000000000000025a000000000000000000000000000000000000000000000000000000000000025b000000000000000000000000000000000000000000000000000000000000025c000000000000000000000000000000000000000000000000000000000000025d000000000000000000000000000000000000000000000000000000000000025e000000000000000000000000000000000000000000000000000000000000025f0000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000026100000000000000000000000000000000000000000000000000000000000002620000000000000000000000000000000000000000000000000000000000000263000000000000000000000000000000000000000000000000000000000000026400000000000000000000000000000000000000000000000000000000000002650000000000000000000000000000000000000000000000000000000000000266000000000000000000000000000000000000000000000000000000000000026700000000000000000000000000000000000000000000000000000000000002680000000000000000000000000000000000000000000000000000000000000269000000000000000000000000000000000000000000000000000000000000026a000000000000000000000000000000000000000000000000000000000000026b000000000000000000000000000000000000000000000000000000000000026c000000000000000000000000000000000000000000000000000000000000026d000000000000000000000000000000000000000000000000000000000000026e000000000000000000000000000000000000000000000000000000000000026f00000000000000000000000000000000000000000000000000000000000002700000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000027200000000000000000000000000000000000000000000000000000000000002730000000000000000000000000000000000000000000000000000000000000274000000000000000000000000000000000000000000000000000000000000027500000000000000000000000000000000000000000000000000000000000002760000000000000000000000000000000000000000000000000000000000000277370000000000000000000000000000000000000000000000000000000000000340000000000000000000000000000000000000000000000000000000000000034100000000000000000000000000000000000000000000000000000000000003420000000000000000000000000000000000000000000000000000000000000343000000000000000000000000000000000000000000000000000000000000034400000000000000000000000000000000000000000000000000000000000003450000000000000000000000000000000000000000000000000000000000000346000000000000000000000000000000000000000000000000000000000000034700000000000000000000000000000000000000000000000000000000000003480000000000000000000000000000000000000000000000000000000000000349000000000000000000000000000000000000000000000000000000000000034a000000000000000000000000000000000000000000000000000000000000034b000000000000000000000000000000000000000000000000000000000000034c000000000000000000000000000000000000000000000000000000000000034d000000000000000000000000000000000000000000000000000000000000034e000000000000000000000000000000000000000000000000000000000000034f0000000000000000000000000000000000000000000000000000000000000350000000000000000000000000000000000000000000000000000000000000035100000000000000000000000000000000000000000000000000000000000003520000000000000000000000000000000000000000000000000000000000000353000000000000000000000000000000000000000000000000000000000000035400000000000000000000000000000000000000000000000000000000000003550000000000000000000000000000000000000000000000000000000000000356000000000000000000000000000000000000000000000000000000000000035700000000000000000000000000000000000000000000000000000000000003580000000000000000000000000000000000000000000000000000000000000359000000000000000000000000000000000000000000000000000000000000035a000000000000000000000000000000000000000000000000000000000000035b000000000000000000000000000000000000000000000000000000000000035c000000000000000000000000000000000000000000000000000000000000035d000000000000000000000000000000000000000000000000000000000000035e000000000000000000000000000000000000000000000000000000000000035f0000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000000000036100000000000000000000000000000000000000000000000000000000000003620000000000000000000000000000000000000000000000000000000000000363000000000000000000000000000000000000000000000000000000000000036400000000000000000000000000000000000000000000000000000000000003650000000000000000000000000000000000000000000000000000000000000366000000000000000000000000000000000000000000000000000000000000036700000000000000000000000000000000000000000000000000000000000003680000000000000000000000000000000000000000000000000000000000000369000000000000000000000000000000000000000000000000000000000000036a000000000000000000000000000000000000000000000000000000000000036b000000000000000000000000000000000000000000000000000000000000036c000000000000000000000000000000000000000000000000000000000000036d000000000000000000000000000000000000000000000000000000000000036e000000000000000000000000000000000000000000000000000000000000036f00000000000000000000000000000000000000000000000000000000000003700000000000000000000000000000000000000000000000000000000000000371000000000000000000000000000000000000000000000000000000000000037200000000000000000000000000000000000000000000000000000000000003730000000000000000000000000000000000000000000000000000000000000374000000000000000000000000000000000000000000000000000000000000037500000000000000000000000000000000000000000000000000000000000003760200000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000441100000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000064a0000000000000000000000000000000000000000000000000000000000000641000000000000000000000000000000000000000000000000000000000000064b0000000000000000000000000000000000000000000000000000000000000642000000000000000000000000000000000000000000000000000000000000064c0000000000000000000000000000000000000000000000000000000000000643000000000000000000000000000000000000000000000000000000000000064d0000000000000000000000000000000000000000000000000000000000000644000000000000000000000000000000000000000000000000000000000000064e0000000000000000000000000000000000000000000000000000000000000645000000000000000000000000000000000000000000000000000000000000064f00000000000000000000000000000000000000000000000000000000000006460000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000000000000000000064700000000000000000000000000000000000000000000000000000000000006510000000000000000000000000000000000000000000000000000000000000648000000000000000000000000000000000000000000000000000000000000065200000000000000000000000000000000000000000000000000000000000006490000000000000000000000000000000000000000000000000000000000000653000000000000000000000000000000000000000000000000000000000000064a0000000000000000000000000000000000000000000000000000000000000654000000000000000000000000000000000000000000000000000000000000064b0000000000000000000000000000000000000000000000000000000000000655000000000000000000000000000000000000000000000000000000000000064c0000000000000000000000000000000000000000000000000000000000000656000000000000000000000000000000000000000000000000000000000000064d0000000000000000000000000000000000000000000000000000000000000657000000000000000000000000000000000000000000000000000000000000064e0000000000000000000000000000000000000000000000000000000000000658000000000000000000000000000000000000000000000000000000000000064f0000000000000000000000000000000000000000000000000000000000000659000011000000021c000000b00f4564015c4126045b0940eefe17a35078bed7b6bb1465747e7499bdcd0076da4e13d3c62831838ec6f069036fffc8a05353f00c015453f6ccbb4d6dd701bdfacb382e327af092374ee59d44ccdef62de25539d93150a58a87a04c35174370dfa5f0bc0eb10364e61cb74b184f76c76224be5d1068a6882965025c73f7908aafcd5e84ff3141228ed0cb6324b6f2204b2613fa06d85fe749dc7834998a1b2cacafc5e14ed6fd26ea67afd009e3a03d09000000b01404a46cff8742e3655eb883785f82bbe9d36b45fbc92cf8170ca1963742082d4cccb417084bc8e9a7edde4319ea75e9f2e00013d7fe9ca267de4b39f2a5d682eb81b95568b66dcb229fdb16e778610ba2f9ecd9ac0a6d29be073c889cb69e5c849533b9f30de94948733dc97ee8096e17f480d5a1583ba401adbd412665fd962e7c993a3abae658f11a7414b4e0aea628bc3cccad16f4659889a7214a83a525fb42d515df3ff1949c60ff7a7daf051b000000b0109df5a5cc2ffcb152024dd1e51599011abe7c6f276f32e7195a235dbe4d158eed4073743a03f815aff0602df153b47ab956055d6111d906cdff067fed3d82f979bcb07a9d5f76219c20eebdd067b62f48232eda686b778b4c6ea89f999991480c70d256038f8dc0733627d3858da873066b8a332f5222fdef4ba36a15016bcf85e75631c81cb5584cf7bb2d37e11b0d2f33a16aa59f16b6ee0cd626e406ad3a96363035fb88b6028daa01f5613d60910000021c000000b024f5047759342c0743b1f786b05d93aa30147f51709d304e8e3e517f08604b096fdd11a05d4f178a98e2e986cb6d56272d20a32aee250cbe8b27c701795952e86ae9528806ef52b0692ad29170a075115b9d7e442bd8d0bfd66b9d47203e941710af0cf37739c825d65ba454c65a81cb199faf8221bdc5c622190213f1e8da460f8ead18c489b0f3fd1e07f816a88de104ebfcaf4fdd4efda302d5d64ff5bb87265df8dcf0479acd19a62cdad79d5a9a000000b02657fb4b58990513b2857c9d397999e1c8e54f2fc58f9fb2e27daf1cf857bef2eba2d65d2da53c2713322c4d1f968760e690f775cc14f96bf5b9c9680cb6fbf93a5c48434605ac11f6ed8ff6f7d5a1e2dddcd223812dc6c9efdd12aa57357af8f2f8ffa779b9ccf632007b734bf21a0d1184428f84476eea3c7e488605b0100ec0d56454783d528ecbd156b9e0c93ad71663deba05827979bfeb26066196d22bfc568198e117ab04dceda45164d03222000000b02b2edb80b1caafc3f7513926d5221ab1ec44349c8d7622b4ac9569a4610a13dfdbbe2b445f3440e85fc5600f47c3dea403dbfeddea85627a55e4f1ad4cf379a3bffb6a3829470a036d354bd1432cfe1a67aa45dd89eb92b43d0b0078bee3b3c0e4fa29f92b313ca0c6e2a4ac1938e38e0a21e00f80bbb8d0a21f20b873dfa3314d703d4da9be08a719450b9efd3e3ecb0f7d0f7886f37c902ec4159b43e1cfb66cd084759e9704516d98523c495af7df0000021c000000b005b98d9ad3d65af257214f2e36acf4745a58500a87425e07774994c9aac436691eca7a7c8cebee1e550309af3df8cbbf7629a6c0fec5655ed318ad14a186119c2fde0692ea4f28f76dd43654c1c05ab10d99ea9ef1fbcf770152fc598e0e4ed543083b600c2570bccaf63977e2cb7ca31b972b6ffbafcc78e72d279615744eaaf1d51a1fedf56811b37cc0366ecfc4fd054254c0f4487aedbc090388bc70c10d0e8e2d59c3b180f398a97020a6c4956e000000b00484d61be068511cbbe2e8c318e0ccf633b24a34233df99b839383993ad8f4001a15a9261a4eb5028de8c6611c0e87f628bc0f23480e3b33209d66ed95874fc31d29a436b745eeb83d92de8e5b416756feba46320deac038f6f4a86c19f6af24f29f6cba9cb2866cc032f9e97e0b5eeb1ff760177e6709b67b8d962eee4f37c245c1471ecaf0ebdd126d35e11014277901e497a877aa128343bf6e418ce8f212ddde95a02ca17061f9d8c5fdf11b476f000000b024d1e28bd4f8b1e213b9e02a4567b57eb56943b46ef2b4654539d1f28f2876a4694f67cb001f972d38ff57b0d20105daa457be8a3b8c3c772179133cc52bd486d47f05394c1fef5a846fed47db5161ce0c3eb4bcc4764a13705e25ace7cb66be3e038d9faa6dbd38a077dd5c741289812e2c080150c941af74e79cb86270eb106050fad650c3af45a6a4c3a9192ab53618f5d23c217e239c10e126e00c0dddfa08928d5997293260d1e71b1b8abb99e30000021c000000b01d2b38648d5d360d5eaa5d02fff0de4631d77b8dd30e011a89dd31292099fdf16b73b48a033cfd4eab3034377d5d58c45562c97ddbe5d635159eb48d184c29598234e4746baa318948bdc56deb17a36bd5a092c131059e7dafcf250874997e63acf5302e14eef9f1dc6142cfb194424f2d4467677e74dd97d4698bbc8e880687266c1335aaa59090ad45594bfae5884323df4636093df981cbbf34a40fa06c8b6598a942d827402b96e3985e2349cfb8000000b0241fe5e2232cd87de77ed4c69b234b7547eb8dcc6789f90796f963eb093f6b2435421340e4aa4befa9d8d48c0363e429497fa857f55ed5f8e66f2f27e37a91a4f4b905270bdb18b049a7d039e75a486d2151c256df7eb91ce0cd89e41f156f26967e91e047723968c0fe012c4984291124fca5221700683c5bb6344b7d6c51eced18af48beac334a070ed82f996d196e29e41dbd2c1ce8d41328cd508112b8fac76df9a68929996612c492dd82bd4639000000b02a39ecf0f2fa16b55488a2d08b1dce12f13e94bc3bda380550407d72a37f1495448cfc26a9299b556f4c48abfda06d082146e5ecd7c0219bc605d7d48c1e34685d24c0337dec19c262b2c85dd5786f0cfcf2bef9a4a65f59fd9d3fc0dc7b8312c3cf0ff903caa9192b26d5963dc5760b26935547f3f7ed75b27682b6bdfc25e8bcb8d3640b85e9c765be9d99e73a7ebd2d4c45cecc1861c6b8115c6ea486e215262761d6a7b68f3068eeda31b3005d360000021c000000b0179a4272687445902584705396a4d52219f530d181aea6d92715c6971fd306d9a1512a7de13ff405be8e5997087111523a4c5cad8d399c6f441cbce7af449059562b745c4161de80db57b4868584998eb97f295443db228f5f79340e4ef8d94f80734be6418bf7bed1ed1712e8d04b2006079c68af8a05eee0936e7b6c317f152c29b10720215d4ed38d20847c5fa95118163d1562593238ff4f16bcdb9c22ef9197737c4a203a5129b6ca0cd7458c05000000b004ae3c969210dfd0e45568d444e3d22ed6df89fa95ce83187542cdd4832523915d0b9977a841d45d551c222c7ab0ad7cc8a36f21447836aa3549ac07a4c52c2d2b2e400804eac6010f8910a89a4e0543c146f093b2c4cd4906eadcde63ce576844e2471bfa9c2adbdabde41f885a5e7803e2fb6eb45b10b1fad8768eb999fbd30780a2961faf8be3226a0a361320687e04ba340cefa24d8f6ba5a0a434a42df5c0131776f0f076914312e5ec6824bbfd000000b0291ebc18806d63b68bfde691ceac7fb67931245115458c5f8535f6ccb699e60d731b236dc7a8f9451339496ab1f830c47591243a3acd27de8c4ddc37e4757e49feb0e417270497b948611eca7b4448986df6618f4be2dd3e83922c91d556932ddc5aac98839c8154bc264ae8711b8ef805322ec6933e87266210609b74c9f2667e19f0d8f8d0d9513986cbad2cc7c627154dc96e274962caaa783c95e557adaff9e773302197b515d16fa4f204b7bfe40000021c000000b0255bf97eb90624daf54cf422796103bd28250d3745872c0fd336d33eeac9afa7446f4ce4788a1ea021c1b220e95407a8cd57f55b69ef91990f26b4a8643128471fb44f83f31a074c7a3ace400766c39189f6b60ae7370f0e31e5ae99afaae4accd5152fa18dba375d030ddbb960cfd6728f3eaac44ce8a877cb0f6d44e56c951dac58f78bc3c714dbc324db0972bda4118e571963cb5529f233ad6a257377996b71e07bf6d08557fd40015953383806d000000b018aea6b55477b58bb2dd0acb61549873b9a5b46a436685b9881acf717e7fabe84a4875c106aa12490948651852b9981dcaa67b45982ff30987e6440c2454964e28e2b262adf4d19c02dd4ff286ab15ec790513d8364fcf125ccbd1da2c956984274e7529606f4ee1d1be89f06dc1c3a719f370dc275df61c98734026c588b168eedb73fa46058e675ad455bfb967d9220708ad76988739ba21c87755710195dbd0fd042e089905c3647d15286d920229000000b026b95d404ae61896b46a503e203f54d381f482a413e727ce90e2da7d8e79f6776b212d81a8fb712eaef81301ec34291e18fdb765eacc571190e9d4576d6d2fe1505a1c323997de01c399418ffa52127a77bbaf751a074654438d51c57e4555632229ef6461c713b033126f8cfef0d58a2b06d060b6ff52dbe3585536e31c9c1596df6bf2933f300a45263edf02d4e0cb1fc6c5362e4b05ab097d130d8aac1982932576ba7dc70fce0a32defddc0ea65b0000021c000000b02859032ef5856a8b30826a4caf6a6ca7347ab2839daa861dff4523ac2cbc21a0b4af1804a26269b4f468eddb4cb1a92899c33d55e44db3c93bdc7db2aa5b8f478ed829fda397f10f4b06c4d2a318a91d951918e6139e3ba57915e65602c854d70c60a297a4ff855365424fe73be6abdd29eb7caf24ae97eaf371811c2c1fa8feb4de278ace1152a7b8dc876b385efbd60ffad8d81e995808a53d5c81cc21c1addcf74205d9b4bbcbf73423d23c0cc1f8000000b0303abdc8fbaf14cae63a94e035c22a71ab9d4cca63aa42525e782079d723318c676277821236a5b8f51b21faa55bac60fdaa23adcfc2ed43d419f44ca41a6e1ae8949cce3673743a81b9bbea7327c67891c20a55ebd296a75e3df54d94fc1c01470eb43c35dfd2ac89dfe05920b8585c179218a32ceee4066bd6ee5e9a6698981fe26fb327a95c9bb66b96dec92fe3e82f27deea1dd1a998704a9d85acb96a5a8c50c235578ed9f424b256b0e1651438000000b00a3a150306181bad1033cab86c5cfba0f1279ada102fb4aa36c69baf71e2618a10ba83f79d3694dee88bdf8d6155662073494d9b39c1d5640b8f8114320bc62a73415d144e4d38de5217bf36b255f669316b1bee841a9bb22e8c716ff0f6cfe894bfd767921b76a9a679aad2927aba9d183f0dabb8d9418c8e8c1aac556646a7662a5204a0e65df29472136198db45822c172edea5fb7d30ac1863db13e3ef74203993cf2a99c4982e5c86f289aaad1d0000021c000000b00d2cee3c052fb81ab24a8602bbe161fa6f6d3a6795475f9877da08648d9a3efaf2a2f94df9bfadc4e89709812c31440cf963f128eeb2d5667ad6ae9aba7c30a1db3837385ae2d93db77ea8bcaa3d9bdf8b7f739d2f3cb6210e4f350188c7c9f6dd80652f2ba6f6d8e87d9bbe28741115009483bae4e4aaf5a1906f873db321dda82a68ca9df1333cfe469284853662351991f1627409da989f2a06b8c5b1401d6e3bbc97cb866680fd207302c5bf68a6000000b0120961ce1c7495b8c8666f5788fa3387d1e8ab9f14f2a8e8a0cf8b74e3c55ed77391fd6572b7b506f794da770ddb359a7786d301709516462372a5e2f1efe1a920687d65f63b4ae1c0307a1a3063b4af49198955e0c487bfdd730d09d37481ffed33462dfdaf30e09fa2585f20096f19032ba5d86bdaad23a7b486fd77a316982937339c9c3c32a403bd82e3cd524b8a2a04ed06db90ed23f5b0a02a6c8cf0681b80eacef4bf29b6667d4bad2e434561000000b017f392ff59eabcf862ac75bc4710aa0aa976c5fddbfef1d201001412ae1215fd959cbe87eded88708a4cd6fb5e500e3658c5d39816dcb227108a0b17f7bffb154a77e9a04e6ca09f4642263f286b35ff0fd4111730621775ebf464e4147d1f5f04d903e487c21cc796fd6279762b8eb11b46198093e319f0c29e8660de39fbe10c26fcda370648a8b861f6026daeb29401e85c8dd61a9dfa6eff5866c407e87d87f6a5d326553ac6e7e81deee2cbd1b600000fa400000168000000b02e25ba0e54bf5f22ea491b7e445c626f0861f6806c770f1120c8c753a09fcc20bf018f615c9d796e615282f6d58b51b196968c57ea28ed6b71383328426631c709761491cc1e8e8a6101563267ee3ca5e2b631daeee59c76e050d404a59658c443633250fc488fcb8749c6f93486f2342d81c65ec68d2a75e636bc697da7cb517a293afe165e2aa02a4fcd468d4a51662a579dde37b1a68f17a8fdb78c407833d98b6fc98237821a5bb9f0d34ac62ee4000000b02aad27fff7ed333d420226a84c5fed1a4b9a8acabb17c3687838d489e6e441c1f19d1c82ec5885d02a714978db22963406c070f94040218d087431ddb21ab04a89110f282bf7239bbfef516a8c17a1e368d782b5d47d24a2694d0f2046c8d89d62eae471229260320028fce162c4bba52d43cdd2236c51117cb7dfb66722ce55bb6f4b9b0fbc03de89cc8b2a6594851213a81f6b1e75818c69849226f0442f7eb81e667620163b8b2791db21b7e2098000000168000000b02d4ac80bf2bd5c115e85eb094e0c2626b7e299bd292bd36c77c0cb9dbe7c357e18426627560e932a79ee0a70ae54615a945dbe45376134acd33a24757add9101dcf4219e9f43b6247c3ca808e268ee899296851a5c80bfccc95f29c1dc08aefdb18ddf8308d0a3d0067fa9d97e058149188f53fcb6a9c66e6d4aaecc9448b0e5845eb639152187144ce176e0311f4c2d1ea399b2269ab683d669a1154d865d32a8bee152693178d05563a54112d3d97e000000b02fe3f97ac1ca3f4768da50f585abf8e90f1d6537f9e5ebb46b9ad126d49a4ee00df9cd34a000fa7f33f6f17ef97536d7c003bb31334f90febd0ae422c1c751036dd84db50930644ea1b4aac42fc3b172af4909dab4ce0238b3b5dcd2482634888c3023772cb696415ff8304c01fab74a29ad30ae2391217899a4c74c1fa3d173a436abe2141252186acdabcc4b5360731e6b46823c8e8b8919f6f1f7cfd3fb6a6b30ea1c04a9741e270ae1087231b05b00000168000000b02e99a804c1b6d1b3a56964cf0da0584200e5488f5ad59ec7b39269e96b03b735acfc952c811603dfd80c6794ac5e0be614acf98c7040604a801d5f3b507a45319b7b0c241a2fbd5062e3a2476ab3595b9f5a877e81af62ef416683387693c0088cd01a40098e6eaca60ec79e7838e18006083e689c62b3029df3ee9e8fbfe11cc373d2ce0daeba5972a2b2aae5f380e30e87169be1b35b1c673b5254d78bfadfba21311c55bc1a5c414c9c52c568f10a000000b0273f8a13c15a175517bccfe7fc8ce3ddd0990ef6ed817bd456d42f986b020a0566605a71cbf462a25877ed96c092a391fe16cf200b546bf3d80761c3ec3798606c3b07f805a14cf04f88b18b174136252e4ecb65f540554434b677878e3e1a3a98e5536708f7da7204de0ba813dbca931ca5f26bb21698b804c190d716c0cc3a7e713a777a816a917ddaa743b99d4fc50509a557b81a5f69e2b02cc349d262e50135c9b3dbc064f0d8f6b1bcd745fc0000000168000000b019ca2b2a244c36a6bcb191ac523ce18d1ccc505602798dec0699dbefb571e3ff6b96db01b240b4fa5cde14be691edb923cb19584733c75a763f126595af3d3138e78a16a341110372709c21eee23198f14c45c277e66524c3e5d401f02e432c960cd681cbed8f51a67a770999cecfb8d22760518b2018dee1a406772ff447ea44e8940994ccedfc4dbfb09eb55e4d38c0b5a091efefc0f53189dacfa0b4d6e9ea8655c0d0e71d737fbdd1d86c9eee08a000000b025c343e87854e6eaf143090bc67509dd1b730c79cff20b63f7d3cf856d7a458c4ce51a3138bae5c931162c0e6448995e99a4380d6d7e7ca7a9cb011532afb3e7cd63dafdd6cbc581f87d3943539a3636c0d859c0ad6841a26b91a5123c4a850c54c53d01551f9eb9ed4b3f52f5147c1f1f632e83a875faa90ae905bb356893fdd8943bbaa8a0c717aec9132aed85e3ed2c5388238132ba55c2225bb5782dd3810948a3d4d09b614f2c6252fe0cda631000000168000000b009df9aa893fd978db179b39a53fbacdc37f16c4971df0b2c3bce8fb21c168d49a08e0d09fae2575470469fc2ec892b7e82f47631ac6b3fda7c9933d57a902859cf476ab75984c3ebc28e7b3f9ed81bebaad13eb21f128fc5a98394e4abebf1b022c5a68b5067eb909b3dbd52e51a1c9022568ac5b2612ea38c66b7a98d119dde4a0d18f5188e6ca30dbb30758260f23f229a315330da696cd65388354b902e630be0b9a0527a614679aead6d79ed73fa000000b00ea438d75931ebdc092c055703f089496bdb04f7d68ac48c8ad6001ec742b1f240b0584707fd7cdee76108ae6118bebf9476de0e68632f3dde2df4668aed36074bd7d2d65f904d6115616b97a1eb46ae8aa3785b05b3c87f516480b1e99c10001ba2605b7f2de6fec1c3c96abe93498e035b01149408a104a154d36bba5d745d529a31ac66e4de11319cbeba2ef5fbc51e3f18ab824986dd6cec6e3d66a25df6faa64c5cfcc16e9f4dc17b4de8840d7d00000168000000b025edb7036e514870fbf90e9d74f724e793355aac704ea032323d295a3dde7290516c154f085174fda15f75432e2c0e52059108177e6bd75bb82ec62bbb44868aac9187934392a5b482a986053ddfbb06305a5dd2069f4d3043b9cbc6c75c50f8494cbc5e84abaadf7df139d29303c20e2317a75af1935f253099503b7e23b483383126b273d67df760ed1b3b4aebd22c00ff6083b8c879be588a3520c36692dcebfac5e1015b00aa0de8ea6683ec4016000000b01da7e3e47a4418afd8416889249db7bacc8501a108aa7c38fb8f5ad2e29ae86f24496185e9d0d5045e504e97497da1cd08448709496e70af690de685d0d0a75225b20a7ca4f3b219184be43dc31df8c4e27dcd2643bf0c52f67ebd03eff7cb29601d0982fa7cdcd9bbac0b3911b652a7275c36525ba975ef25572e0766604ebfdcd0a2c21c482cd11584697ad959d4ae13743120b5f8900885e22a2cac37c456fe2c93d0e51574e37ea4aaffa7900da900000168000000b02244317b3fcfa4d0a9f03d035f581c4dd984e1a37f7a2113b1be7a078c1be8373bb495af41f5d7c76380a7b64edcb8ac52bde75c91766016a26fc41974555286acf7bbf3fd60aa65a69606785f52fff5f4ea903e5a4ef6d6ffce6dd66b4bbe39ceec106059ec071a53401c94f7a0a38522decfea45536bb31ed4485c791e18892dafd883112bc82cd0a1c70c78c828f22110d8af7e0d60036bc5d81467b14732537c8bff3a9ebca3a45ca0308bf44581000000b01729ff2161cef6caeb12f59afb169bc75e78969607def973a26b22ad9e53c13cb74f66a9b306b1efacdf21c7f3222c4a68d96fa7bb75ae02a8dcfa8a934e483e6028b1f2a5dd38737d6aef4dfc9bd5d80f8777546bd90162fbf17be04bb846058ac8450ee72367cab020af7b68dc188f166df042c9e35002aed8c5d746474baa2e531bd552135c8ad6851dfd532654a520adfd75d611abf86628f670fcf43575c41817674313a1c109a75b999e6d935a00000168000000b01524226540709a1d63206210659f2aea096deb676a09e7eb53c64e7e2daf34afd3c3600d029931c2bdfe3d4d04cc6ef8fde703db54dc6b5f8719a818028ab61a41b02e500944fcd9bffa35a5fae5c6ff36549681101dd9dc895d93dcc668cbe3500e96c696368487ecc5a3537e72de1f288deeeb5fda4667dac447105a564846e31007e7a3dd4cb7dc0842c65a34c9681f83d0895990c6d8844cb4ace314521b85bfa835c8a4b4d96eb5e146e0610399000000b0019465e5c2572a6691cdce3d5580056014212ba0bff5cd3c77f9fba7623237d6cd93363b0efa44e176adcba5d76bdf68466e2319c4418f1679ea804b6e179160b944f767a45126bc71d87c7669e10b4094fba7cee2fe34228680591da627a80a5809781cc5623e6b77f8a9b119253dcf2b9bd723dec99f94376e68ab65d04aa33d4b6d8f96f0cc74168388c24b30bb4a0fdec8aa702f49548d2227006143aa1a80f608efbd24550512fd2dd78deb610400000168000000b006334e44b07d07e3954b7824d9b8ab531b43b7e91cf6513a5a3d48565db2f78c3e3892b5d3b372e91cdcf8141dd191b2fe3b831df042347a0c17c83ad97a07a3980340cf9d0e20f8d5ed22273fc36aa68711d74ea2890199f8accdfc14e1f45f8ffa02ada14cf3d7f88aa7cdb2864a96164577d9c44c14703f46d31d65507def7ea7c380d31f784c1531aebbbdf26e3c239e3f398b7fb112d8dabbf4ff59be9339ad47910f415d6a4cbed5e1fc6eb5c7000000b0175a9434ee489315d4de2e4fd920660d2f1432101c4e52ff457c35a314c773b2fee8176c998ed644731e2d5619302f152db69af1ad50dc8eb5de722601cffc942955cf3b5d5b6373435b5f4473d628b049d097ffd358b291893705e57c8bfce40fa177ae2fb6f562d74d18a316aef90c117850026037ef691dce755acd9f84f543fe86892652af4de57e1fb2f18e96801489aa9beb5d8b2dfb3c1aba1d09469cdc04882f3b1c4f59db5904186f1112aa00000168000000b02f6664a4a1877f836a7bdb77bf704b622e056640d54b4eb95b04bcc27c2e343437e2e1347053b7b4054ea826da8b08104f88b6e39ee73951e1d6b4581610561f16600948645068d632c9a1ea6f719bc38e2ee317af92df48406c64e8ea8bc903a180fb79ef4e3c1bd86f210c5f7905f00af405653f662a9073fcd2dbd566e4ef28247d05e2cffbc2ba9dd7fec17890a606c69e41036221ba273576c9c964bd66f1c1d38029b1249b8d08b423a0d9f647000000b026716c91c7d5524b31fc682b86dfe12e70e21f330a4e195f4f8c9ad0e5211ece45f29ccb29af3da517e03a2299b09b649e6563245ef25423f759730e11b954247f6d486543efee496aab29c86157cdcf98263dc19c44e276db1d21a21a86c03ee466583ce78d43d843a66481355783ed1b59850fed1b1e4377da89727e78fd899e0c5b762a2e1dfd5c3ddf02bec0e6d31e9785a82592488f5a776814281991186ced0019b0ce81919c7fead80087b17a00000168000000b00c3808297aa96d3cdacb7efe8f5dc2265a6d06d78e715b8f4b9d1373de019b9858e6870860ba7e7eb6a6e3c11819297b6c0bc980e379112700c7ca976496ce63446ffec3c6dada32f29343b026244e1f7cd52b342b98b740f0c1665d841b0be78e8b5779d53cdfa782c62b0da4b0c0b01c56721ff5f60a4634616321e879683087ae9ec88c8869d6f6f13c29303ae3ab023b5af850d07161096830e6492b20c0e78878b0339c48048f13f3c34c0e1028000000b02b2c071cdb533678d459975d135a06b8a1cafb6547cac2eb49c1efa3df4fdc3e12d4491d265ab3a39851207a8cacd79dd472e879098a4376f9351b4f1d43ff3a6d9aa468dbdffd69208e6c886a0dc374429fcb96d2d40e029f939ad91776c025a04a440a1546729b3c6a3ba85aa3a31919b36b41c5711482f25c29066de21066048ec0820082d0cfe2a5e35341e10685284cde53bc0f400e586074e2cbee1e00d4ddaf2122a8a9c0e8cd7ee22802e685380000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000028100000000000000000000000000000000000000000000000000000000000002820000000000000000000000000000000000000000000000000000000000000283000000000000000000000000000000000000000000000000000000000000028400000000000000000000000000000000000000000000000000000000000002850000000000000000000000000000000000000000000000000000000000000286000000000000000000000000000000000000000000000000000000000000028700000000000000000000000000000000000000000000000000000000000002880000000000000000000000000000000000000000000000000000000000000289000000000000000000000000000000000000000000000000000000000000028a000000000000000000000000000000000000000000000000000000000000028b000000000000000000000000000000000000000000000000000000000000028c000000000000000000000000000000000000000000000000000000000000028d000000000000000000000000000000000000000000000000000000000000028e000000000000000000000000000000000000000000000000000000000000028f0000000000000000000000000000000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000029100000000000000000000000000000000000000000000000000000000000002920000000000000000000000000000000000000000000000000000000000000293000000000000000000000000000000000000000000000000000000000000029400000000000000000000000000000000000000000000000000000000000002950000000000000000000000000000000000000000000000000000000000000296000000000000000000000000000000000000000000000000000000000000029700000000000000000000000000000000000000000000000000000000000002980000000000000000000000000000000000000000000000000000000000000299000000000000000000000000000000000000000000000000000000000000029a000000000000000000000000000000000000000000000000000000000000029b000000000000000000000000000000000000000000000000000000000000029c000000000000000000000000000000000000000000000000000000000000029d000000000000000000000000000000000000000000000000000000000000029e000000000000000000000000000000000000000000000000000000000000029f00000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002a100000000000000000000000000000000000000000000000000000000000002a200000000000000000000000000000000000000000000000000000000000002a300000000000000000000000000000000000000000000000000000000000002a400000000000000000000000000000000000000000000000000000000000002a500000000000000000000000000000000000000000000000000000000000002a600000000000000000000000000000000000000000000000000000000000002a700000000000000000000000000000000000000000000000000000000000002a800000000000000000000000000000000000000000000000000000000000002a900000000000000000000000000000000000000000000000000000000000002aa00000000000000000000000000000000000000000000000000000000000002ab00000000000000000000000000000000000000000000000000000000000002ac00000000000000000000000000000000000000000000000000000000000002ad00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002af00000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000002b100000000000000000000000000000000000000000000000000000000000002b200000000000000000000000000000000000000000000000000000000000002b300000000000000000000000000000000000000000000000000000000000002b400000000000000000000000000000000000000000000000000000000000002b500000000000000000000000000000000000000000000000000000000000002b600000000000000000000000000000000000000000000000000000000000002b7370000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000038100000000000000000000000000000000000000000000000000000000000003820000000000000000000000000000000000000000000000000000000000000383000000000000000000000000000000000000000000000000000000000000038400000000000000000000000000000000000000000000000000000000000003850000000000000000000000000000000000000000000000000000000000000386000000000000000000000000000000000000000000000000000000000000038700000000000000000000000000000000000000000000000000000000000003880000000000000000000000000000000000000000000000000000000000000389000000000000000000000000000000000000000000000000000000000000038a000000000000000000000000000000000000000000000000000000000000038b000000000000000000000000000000000000000000000000000000000000038c000000000000000000000000000000000000000000000000000000000000038d000000000000000000000000000000000000000000000000000000000000038e000000000000000000000000000000000000000000000000000000000000038f0000000000000000000000000000000000000000000000000000000000000390000000000000000000000000000000000000000000000000000000000000039100000000000000000000000000000000000000000000000000000000000003920000000000000000000000000000000000000000000000000000000000000393000000000000000000000000000000000000000000000000000000000000039400000000000000000000000000000000000000000000000000000000000003950000000000000000000000000000000000000000000000000000000000000396000000000000000000000000000000000000000000000000000000000000039700000000000000000000000000000000000000000000000000000000000003980000000000000000000000000000000000000000000000000000000000000399000000000000000000000000000000000000000000000000000000000000039a000000000000000000000000000000000000000000000000000000000000039b000000000000000000000000000000000000000000000000000000000000039c000000000000000000000000000000000000000000000000000000000000039d000000000000000000000000000000000000000000000000000000000000039e000000000000000000000000000000000000000000000000000000000000039f00000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000003a100000000000000000000000000000000000000000000000000000000000003a200000000000000000000000000000000000000000000000000000000000003a300000000000000000000000000000000000000000000000000000000000003a400000000000000000000000000000000000000000000000000000000000003a500000000000000000000000000000000000000000000000000000000000003a600000000000000000000000000000000000000000000000000000000000003a700000000000000000000000000000000000000000000000000000000000003a800000000000000000000000000000000000000000000000000000000000003a900000000000000000000000000000000000000000000000000000000000003aa00000000000000000000000000000000000000000000000000000000000003ab00000000000000000000000000000000000000000000000000000000000003ac00000000000000000000000000000000000000000000000000000000000003ad00000000000000000000000000000000000000000000000000000000000003ae00000000000000000000000000000000000000000000000000000000000003af00000000000000000000000000000000000000000000000000000000000003b000000000000000000000000000000000000000000000000000000000000003b100000000000000000000000000000000000000000000000000000000000003b200000000000000000000000000000000000000000000000000000000000003b300000000000000000000000000000000000000000000000000000000000003b400000000000000000000000000000000000000000000000000000000000003b500000000000000000000000000000000000000000000000000000000000003b60200000000000000000000000000000000000000000000000000000000000004800000000000000000000000000000000000000000000000000000000000000481100000000000000000000000000000000000000000000000000000000000000680000000000000000000000000000000000000000000000000000000000000068a0000000000000000000000000000000000000000000000000000000000000681000000000000000000000000000000000000000000000000000000000000068b0000000000000000000000000000000000000000000000000000000000000682000000000000000000000000000000000000000000000000000000000000068c0000000000000000000000000000000000000000000000000000000000000683000000000000000000000000000000000000000000000000000000000000068d0000000000000000000000000000000000000000000000000000000000000684000000000000000000000000000000000000000000000000000000000000068e0000000000000000000000000000000000000000000000000000000000000685000000000000000000000000000000000000000000000000000000000000068f00000000000000000000000000000000000000000000000000000000000006860000000000000000000000000000000000000000000000000000000000000690000000000000000000000000000000000000000000000000000000000000068700000000000000000000000000000000000000000000000000000000000006910000000000000000000000000000000000000000000000000000000000000688000000000000000000000000000000000000000000000000000000000000069200000000000000000000000000000000000000000000000000000000000006890000000000000000000000000000000000000000000000000000000000000693000000000000000000000000000000000000000000000000000000000000068a0000000000000000000000000000000000000000000000000000000000000694000000000000000000000000000000000000000000000000000000000000068b0000000000000000000000000000000000000000000000000000000000000695000000000000000000000000000000000000000000000000000000000000068c0000000000000000000000000000000000000000000000000000000000000696000000000000000000000000000000000000000000000000000000000000068d0000000000000000000000000000000000000000000000000000000000000697000000000000000000000000000000000000000000000000000000000000068e0000000000000000000000000000000000000000000000000000000000000698000000000000000000000000000000000000000000000000000000000000068f0000000000000000000000000000000000000000000000000000000000000699000011000000021c000000b0147c62faf20a05190c9e0fcef810f478a98e73d1af0fbb1019a063aa9706e8cfa04eafbfe0c4e9cfb169a336fd5ae92fb3b46e13448f24d139ec13e5c07b4477b910b84f4dcb48c3bbef22eb5d4955695df137522431b5a8f5148e0e9e1ac230bf611e1a1cd6e8f849ef8b91bbd950ae2c9ec11155bc09c85f4942cb90c1fcc9e901d739ec6db766b40379fb75bdca6d21a537bc35ee0d8c5af859c785a37800925332e98de0df6417a5456e483a1d2e000000b01f05172956fd910fe097b9f6b6918754f1be721bfaaaea2fd2a9cc55610e5cbd9ec455ca84bb2212fb831b55c834de3ddad73095b9bdaa0c9b9bf60e48769adb153c6625c8ef9095d9f1949da53f00426200dddfd31d234e2394fb46b5c2212c992080b46d600e15b9df6d773bf91fac0ba69a6790c47617c9e9d46e7a6c5937e81ce5f54ede6377e5c9e104b1b4163d021969d830cc47c463666ead35f80acc40809f68cf7f21415b88b422a5c60370000000b010f43ce2f9b618f841f44adfd782750a723df95c5ba9d56a25487b79f8557684b228a0448914aa4a0e607e2ffba0d3217f9a4bed4a18c9a59fa9cba606690b70ba7c6b1ce45f942f4d1ce08bc613a83bd2d4f8ae024c4d0bed2cc1da23121d68529585c7671de9a2e4f88436b99b69db03cf29528617c7999cea561b3e03e7a182d0093c1160252e78043a8ee78d5c500463ed750046dcc4ceb41c6980a282887f29545810d32954dd0ad470f6609af40000021c000000b02e3cff407e49b6b82f4bda45eebb5ef8dcae5d7befbd749fa2d0f0812a7f4b4f14eef37091738fc0115ce55589326d71ebf622ce61a82e9ce80a145905cae9d213610dc7c6bae58a77ec6708227d95430ef0875b57d4baf0c54414e717e5cbf77fb2a4e3fee9b7fa9bbe6b177c502fda2958e2f92d9a0f2668bc3f07924db30df52cf166fbe222c2aadaa5d92b6da0ff195aea90d4fcb24b883c837bbc1a0024f1462d2222a13b2a7c257ce9fd64d79d000000b00bc4c52a51e4d38babbf90ee0cf234773158579eb471f4d72f2fa863d6b684e3ece450ade15d6aa323a0277fc8b6d00a900bede23c26d3be742158d8bcba21e820fd80b0e4d75d4cf20b663efaa0b94bb8fde137c00a8a015ee5539481dc320a584d8bb1696104b4ee92ee911906668221f53679e7b883e8cba4d64664bb35c310cde4f8cbbeadc72f3a2ef87270ee6f0b9b8e06bd48128ce497a3e7fed18583f8a56ca732e3b92f7a83b6a591e2e74f000000b02e029f5ac75041c3b5db0ec867b16665abbda3414a0f2fb1b5cc6b1ae67e4567ac6051f00c7552948fdbc2020fb4793dab5cae781aab93602375bac15a7cde69c3cfaf45f004eb7f2fa10f58f8dbd11bb0b976a50953aa971a667ec89f7e602679b0ac1f5674807860ea04a6e1ceebff191242a611239564ac6ea7d446590c4c4722b6d887dda38b06e8d8bb62d03d3f0ef87d528b3f2f552feb18a80e82f15b42a7f1b18b9c57a3e4e229886af7e6e00000021c000000b01608dee241df503afb2ae835f97c28472ec9ea6aed494fd463b513bd5af880b0bc87b7e70e7dfdb1890642d08f373cde69949860ff024c95fb3bba8f4b8ec59fd960f3e11d99a92976f24e2d71ba6baf1d1fa352f924e6bbbf856f8ab6979a14519189aa95c82047492d77bfdbe7ad2a268258119f91f934b4f95000aadbe60b3aef0c9644555f80f645aecbf824c47614c64d9df6dfce421ec65f3d7a339f70e21442b0c5dd7d8b1a4ec994383640c6000000b00fbba55407aad0bf1a16a8332294ae9d92fbd627f83b5d5d58b2f2d9fd281791c5feb4a7f7fa216df28bc4d598fa079e9a01a1068ba16770e23f897438237ae36f173dc1beca8afa863b9950ed9b52d6a6362c948d61e9b52bce891e3caabed35aa0aa88618f2a1bf05a09ce6c4e05740cb4388a797fabab3def2fe267e2809604a1d3f985ba7770d7addec588a9f7ab15680e31c97d2f98c7a6c3b072f40edc79f535bf445f2673bc2c779d89a57d12000000b022e67c1facd38e81f1b69a2192ef19b8e1de2aceb412b878a9443818d6ef1e24f85485d6821244703cb9ff913a76c7f6a624c974cebd4108cb7d43547eeeaa050736f8fefd2df7ede830ec2d47c607765b802d4fbbb9a5b324d259f2dbd909fe6ba47993e949370b6cb98ff098d38c9d0ec4661290fd68f79002debf33787c4ef4ad37f2b2029d700eac13207f6ed7fe29dfa2558f416c351e2574dd33a02cd985d865c66acce3a6a796a3c05481ead90000021c000000b0052cf71bd3fe69120e2c1e5041b4b11659c12fc12fe65d5c804fe3aba36a0afcbc1ff0a234e5b9aef5d5336456707c77feac0b1c92d717873d68e5294700003cbee97ba10462365098a39653482f4ec9f5c3f9c098599c73c2b87daec73b3558ed8d529e82cbf4ae1855d0f77e1fa30f1f28e54460289e8abcd953f8445d31552b37685290e3d88b72b54084d087fd3e2101c36e4c7edad9ed93379bf43fa70024e76bd4ff4f5e05db5d86ac83f9383e000000b029b8143344395426a1a41208707e5b3f1855eb4aca47c469b4fe4f9fed97078124d9a1ef750bea7b430f715cb409db9eaa8f501ef14e6fc79b39750a36cb5e745a104f23d393891db2d020ec4cf833037bd683b2deb1bd4bb9361c3d25bf752e56ed2419b1b56da372120e1b05fb64d41734b51c3188aace74612b83b689eee11a912d3a5f2cf862f38651cf52f00bf81962a22bfe9d7ea1128d11c91a0a04b8020797c242d11aa08f5bd5da94c6cb3f000000b01598eaa9016862d4ee62a2cd7f90c4410b5e64cab8bdbd16d90d01341577610828dd6fdfa9230f2391f3c5336fb20cb1e8fdd27b4af416d70b5f8eae5b824af241b306a5c8b5e2eae711abc235336e16264fcd2281e71997dc9b416d7c452595dcd99965b5ef4e82ee251ca3f33e018b1f901800e7bd4f00f64334e576ed7c02a68aa68e54148977eefaebbb953ca9fa1a5d84c56732b8b323e66188b9a2fe439f07292c2083fe0c016a5156fcf5b28f0000021c000000b01cc7c67ad4d6f6330f021e82254dbadd0a2ab438bfb3efccc78daef8fdeb80a014db916c8ee9179e4616540a873381274dbda745beb7fde9307a2a4d57d0dfaf6183a0dbf6a8d77c687ff762675a245309cf48577cd0c434e4f0075869c927b0a787fe704c8464943c24a355719b9d871341a8a311656361418171b63dfa5446707e33f41abea14deb15cc4c4a9ea7b303ddbb1095310c956ff171b50f0445d328ed6408e4282e58bc39b17b8fd02120000000b00ed39bc01c872f7d1f27fa128d891739bbcb42baeb804d64cbe1a26560ff25b7a73093365fcc73e1135b6b380f5d68f21840eb6a0a3aa3c09a715f5cbc13d912cffb8c313423942b376fc06d397c302eca4367e91678c1a222133b193e6863ac151976ee2a6fa66714b80a477c4356be19563ad8beaf546ca5225548580428c8f1417f12a7fe0c586c9235090785eb3c0350b165a07632b9143eb75ef31b51ba714427b163e56326a1e0fda86ea837fe000000b02a586546b52a837c6fa6cd97c5975fd31b8bbd61c060852086b5419e7b3fd9d65a32d270b079a7066120f979f3952add4f3919ac548e047aa4fa9c22fc430f080a5a3eef189d9175dceb09557d26882454589ce7d30afcca0cb81b4cdeabc31856c280c4bc626c7ec97989aeb9f2f29b0dba58e066931a32f7e39f378b7e1d1c65157335caaf24102b4dcb50faf38d3d28c438851106cf9c424880396ac2ea80331688acbc2f36e970ebfbe85e3a5b670000021c000000b001164b463479daa493c28d6ba62adb70f074fa0d9c842e6af6a4caf3b1a26cfadfa699e6abd2842e19ec65518d1f27790321c965c1b25cacc2fc87a483c931f9cc483519a5463eac5f2f4ce6d75bee4f86790528cffcd16ddf0135bbcf2ac6a068c1ccccebcfb9fe2f2261d117e63d2f05dd27ef1bfaf3a0e259323d13b660eb7823776e3b2d6006920f4619e12ad995077df2a4f955ae550d49a9d8f341531e72ef5dc825d9a15c5dbc7f326266793e000000b02e3367f70b8668e42c267812ed2a0b03afe49fef64b6a673c3e56eed488c1468dc99ae0b08bcaf77ecb75c9e33245fa8c512e9420b3682fce6f22a58d51506d8c0ea5807ef9de52c27f98fd4d6449bfe3d2cb6b405e9277601458150e0638876cd4381fdb3dc4d7e68cfc3bbd40a27f11630af9ce99a5f5b0f5d99482849c9caacf0bac2beeb7469c40f973f4255140c028b8e3766511dd6389d7daf4f336ed6c46bcdbfe1d2df264d861c38eee168f4000000b0196b520958be09fa01e663617a79325d2a0953bce4cc53b369573ef21b879f53323b45f2077458e0f3b38fa749b183a2a206bbba18c306a077f82498c403f746558520355e7cbaaeefbdedb441a43df05892db176a843247e230d11e281a70d0914ad889e2c3c8973084f714ba9bca220e450c49b42c2d4b0a85bb55e6a867a498b9c8c2b4a29a5975fab68feaed26aa17259a3907e9b3c56305ae720dad0d40b58bbc482e237d8f839bcc7d3fccbfbf0000021c000000b02d462766fd2618f41a63871bf09de2208cf1318fd2d793c1e76b862530720bba628026bb86aaf5006b2858df882a29b3268e195a164bec783c977cbf0929ef0bd1a0a1ebafd1660e89296e5415ad0446fc6dd058d381cea33d64a445b6586c72d34e938a00073f97578b2eff8d1f948c290aa52c49d328fa1ff124a3d73b97395f34f916913efb65a92d5dd0a952037626deef90d9e34b0194041630ca35c273e6bd7a72772b0c23ce8a6dc9f21f4057000000b0178049c40830d8faf672910c66d83b0dec0390ec14db454dd76aaf4291b3f24fe659edaa20b31fb8ad15c329e3c22e85ef27ad150da7520e3b5e18f2bf3ffa303955a7abfc39413409c6917facac100330e1061b8e4d16e0763f088e2c377e07ce24232b52efec1c489e5c7299d06bc11a2c465b405b20532f031d2b7a5a0351a9942d0d49dedfbf6ee5b9bcbeedbd7b1f6a0b71f977ce29bd17415f43fb8d1e2e5214ef82abcfc4d4b2a7bf33c2c478000000b02afcceed13ae33c142cea80f6b52353259ce2c309426fa452399776058bdbf4a681d49985f090eed0ba0321585520936ad2d4400f74f70827edee8a8524ea62508c6d4319a6bebdeffce530133dea50c7f53008d4e5fcaea7c7cc2a5f35c5d7ff52a51cea028b67c2cd180e1dbde22f61f644dfdb1bd8b4ce3529003ba095fbab37301904b5f16340031649e1d02c23d0380ee559f57a1d8f2424451b2e1ea5015bc3003258bfc778a921f8a61535f710000021c000000b0174888b6ed2e5fb26b5a0d7638780ddb748d05e92f1871421e8320efabea23cfbb9d5d799522d7bbd5d1bd82b46da0f311f018df52365f0de7138e2a159d3070b1bff683430d06f8c6b2205e5d5a3cf376e8553658837f01c0ec9c94114d778e43cb388cadc78bf18ab32e72254cb653031947890656bfac221bc3701c09eb8fdebedf0ac309565744edf37962ff18581bba8c6ff221fe61947d446685a996ae0d17884a87bfd6d3eca768b38a3173a8000000b02b6c4b6a4b5e3677b4b2ca07653ab3820744b9c8cc118323b240d9368777e2530833fd31c8a1c2a2f93ea5a93d11dc42003636542d45ec46427ec02b844aa6558ad46d534c8a7264b3d0ecafcc80b9f88ce65d41f6b970dde34b8d5cf829cf38661b8feb9f866deff82d6f6dfaff973a1b3c8258007b7199c1cb429f94dfb3e97e1cd4733e6278982697c932f7871edd26697711c589510075e62d15b0e1044d7b7d4c54ba270aa476329e6674d6da1b000000b02d938ad06abb131b3d669d02c940d97cd06c72af37e87d53d432f90ca4add9b0c1a60a9150f01fb487a58cef5ba3b3916a2e9d515e1665e550bf3c34464afe624744e399b02a57cbf2aadfe623a68602caf37f49b8906013b0a57ac5a9c8d9d72de22537b80380d2f553bae9c82a386f2945e0e636d423f7e1cffe4347c91d8c0238e116225bb3e60e9a3352d2b014bd2090254e41579d7aaaf92c3041267e3f92959a2f029c8454afd66a1521180c5b00000fa400000168000000b0179d3adee291aeda72b57c82d081f5bb001ba8be2e6e44ca54cc7a707a3e9a0a606a6f3a706e88019bf0151f7d47513040685b92e12e7e53dc95c2e7bd3e359896352af11f6aa0bf9661cbe59da07839473e9430a913c8daf54a565b5bc58b017af041e942bc7cc07eabe7abcb92fc160cb430cba0d8fb8bd44e58e66bc5b6c8c0921183a927f53b87f49b23b275ba021d1adc8541df9927bdf694b4257e917683b9df09c9f5ebadfe9df2db9b15e958000000b02bf2d88e9526bdbb2ad1eee7155f7b4c02ad86f7f67de9d8a878a3b8fd9e67ff7db4f2d75a140651c2d33f23f2e77d248c45fb2e8f5914ea486442040527377cca6f9d244ba23050299a7b510ccfdb21b4f2317175b81fb09af6f68a7a5a0bced6592b3ddd321a884caaac1117c7861e2c6b00509f8a91e789eb3dcabbcaab26782cee029cf4f32bd8cbb7e27dbd0eff0727d70f8ea2a5ec41b5055a0475dabc3b531fab630b165367b6a3342a9fd40f00000168000000b01dd962013a1869e7c54130602930c5821878b48c0a5c68be70b898ade73850f554edbeebd809a247ab7a8edb1d7cea7c72d4a8c920cb1cb7205b3c788af815eaceb2daaaab03e9abe643835890344fc5d1ec1b3d6a5f5bad99dbce3e6a7d49379043aca1e6bc4a86c5c49d8a0c274d5a1733e0a65a9ce71c58e5d7046a55dc92f706823c802b6fe2d441b0a0d4e573a5246a32365839bf1d458de790b3d24ac7a7ba9799a588f3ac29337fb251d26680000000b0148495292e69a4fd9245a7593c9adb20804f5724573136ef02059cbb44bfb048dbf25eae0221b5e2d3e20e273bc650bfa6deb970833d018a1925cb60446100ae058631b03d51938b763e193ca54924845806746701f8fc31b0f9ea530824c9d9cae0055f7a09097ac751ade752412ccd25aa4049005c178ba8fe7ae73df94129eb28b82e6e9ea6da2d1924e5277caac21d1dcb885b954a4a920fb18d9ab745cda59475afb9114f01c83c4f448812583200000168000000b002186ac65b3fc3204deb25a9d373f7e134bb3db5a9cf7f3a5ee5efaba479d980fa4ed99bbc8062129fb9cc10721521110fd2137f31ca6860fab7ee0779582d2eccf9d0e2dd84f978db49bd6aece1e1fb2e997e67ba87971aac873ca843286c4ef6388afe03f3078f78974d50fbbc681223bba7154f1053e3f6b7c0719b2334bac7d5d7f3b2c490c58887579538db72570f92b00d1f2a22adf37de3f7af5208a24f15a2d877c24af815456c7714c7d114000000b00e7f3289c063b6ded2650cf97b4eb0a0bae37b7c1bc85706beca4d074538336c79be0a9635502e19a628f3dffa9c3f301afdde789036af777f4374ffcf2590beef567577be8be06267024daf83fbcabc687b6ac4ba318b43f31468a6b3694117c7c8ae32624fbe09f220a699e569f1e804ae77fa892293ad3759ed99a43d435d25e9cf8231f54ee9848cb35cecf13e2800abe4f881f8d372d18923e3b5ff8bef7fb5991db1731488975f3d267bfcb8e400000168000000b00581c8a7e49bfe387d8a4c47978336ceb02f28c588020d073be44657af8c494e06f4fbf078d028b029a0506ba77293c0b7dfb1c23dede4fea84fca2b0a1ef30864b65baf716be47c505b1c078314b67ab30f19de63c7014abd02c937876d45fdb10c1a66083bffb2ddc159ee4a4e10f306a584c19c7715f223e22198cea067be2006e852f34595b64f513ad5d42bafec24f207797ffd1892ea22c5e779d228fec4a283107ee6574a94bfbc6c6ec011ec000000b02e22300c0fca392df7c4b79c29bec3480e481195858850e90ed002f972e4bb49f3dae2922402d7a6d7f7280ce620d5d97dbeb1f4506947ea8e223d87e48e839e7b4f1640da7a48d15ef7abe42b4ff8bd7273949da5409978fee83b5780be170d30b6131da6cea48b42f2c95459b4123717b7d11f03d0ec76209a6671da34ea32b5b084ebdd2ff85dc5e6fd41758b43371f8ee687ba688a0c622cf5e7b9268c822ab54125a36e34f1c82ee8d547a5d0e200000168000000b01e63a8e7c934a3039f4a35ad9e8e84458f9b491f85189a3ce7aa7eb4f2ab110821c112c3d902b9b4e19ea7111353bbe7b5c137e75b5032623569232ed1abfbf14caec554508b9ecb1c07a353f626acf42c24a5f8ed513e1ddde0d64847cceadbadf86e4ca8a0c0a7d3829de7f017e9e018d45896e5d3447309a51dabf947989ebf4a5d3417e090009ce7c19fb4aa7484267a2a5ed75618f080cfa1280fefdd1f8c02cbe3662550b5dad0e40cdf808e6d000000b01ca73bea4ffa404143fd4c82b907f38ce95ba53d575e156df8c71eb73f96a4869787b3219112c1ccc6fc2c7c3b5a38cab8cc16ab89440bf130e45fbe629c46114fbf3efa6e59fe0df8e19ff1b1ac019c8e7df482227baaaea2cfbc37adaba48df3f32c9f80a2d406418ddc6a784f1f891d141572467651320cbfc3d5de598d43981ef177153195eebd57111b2335b2790157b6145e3f31f116c85369e5c688266875ff6445e283590e8001d9a49fff9700000168000000b01e93ae3d009ffd0856a72506e17471c717d97bb96cf508e868ae2f4e877713334d058eb24357ac98100e39a0a38140f5945c039bdd44a1d58225d4c90695d666599c23d596c7e0ec1c983be7ed4a6c65e3b69238d47dab6b685f074c5e315d4e4402125fb7740ec4856812d1710b207e127d2f822ed2d409d75a11150e0a206635802dbcdc1a6b0cef09c8ab7cbdb20604629cdd163914985968345d3bf542fea7e71f8cb9f65326aee1b068b21b89b1000000b01ebe03a5f95192030033a5ead92aef867f40f29158cd0c45a6b7f49b0c7af151add413f079da71cb763c1836e2426ba557b724e11a6521f3ce7351716d3896d0310c99d109cfef33d71d01935be7828b5e412a1ec4d81dd5323e257606524a84d143a769f3f1e694dbb07eb4892eb21d03003251d8e120bf7da8c42f77fad9ca2fe3d57794c9f2a8f3d3ef636545ce540b1cafa57453f7cbca2fb6239713a6adad2d78d3d5c80c4f62f3116bac4b0a0800000168000000b00041d77de94635232d2e472ea74629ec477e6f67724fd2bd412f83d5617167e4f0617ab6ab17cbfb4bacc1c97981ebb1cd547edc7654a39e7706e518dcce704c313161154031fe14208041f011185ca07f953fe426f57fc14ffae01dcad5a925da5a9f9c770529769c28e767720c155221c89e946ba10acabd82e39bb636263104db5e06b50dfa1f79e1143451e19bb51a672fe455411f9992d84aec343538eca769158fd36063fbf3a173900ee3e8b4000000b026a0b5ab5bd66f3e0ee000e26db6da9fe4133015d136f4d7d644c02bf440085d05ec0615f9964ae6721c3f427b71e2c95d4f8870d5581acac34218ce5644599d71a1573c3daee4af16a0a01e49068e031c65966e47aeb635e62b97d7f6d7ab7531499cbf36a65727ba40097ed7c03b2f02545030e38bb017fccec9d741dba5aee8a33b825674f5115d4530c9a17a486b17cb5b6cab58542edb7566a351285d772064a9963ea0a90805bc6026f29c1cc700000168000000b020605052fefecc042c30bdf5c6f61ccc8bc52b7868583e9bf5be6a5b98bb792827d9dc4dae1cc5fff23b5e80f96b8599f4cbc6f744c50cd7f9264892199c1ebfd0da2dba6a1b83dc8521c4bf2ec56d2b62e609773dca9096ad6b0175ac02bbbacd7a9985e89fb5f0387ed9a3b3d6dd2124b47aa9c3118027890bff8a5f5af5b63b8e3f984a7718680fd971d7da20fcf01e87913d6e5841fdcc471a0df1a01572d7fcee0288f10689c7a94d1fc57a0074000000b024a433a1058206a11f6d667c05978ee412e0923907774ab82214ce1ea9ff55fbb2448150712263687b7126b48e05b5ab8fe00a5b2d2f7822d46621dc549b3482f56b0f9a21e3a3f83d4b9e32e04bb26f297ffc6051cfe0ceaafe9dd9b5eb178fe7c0430466dbe0b571a0270c8a685c9e2db2ba33af11ef276857e48d40bbd2dbb85eeaf0a5e716078cec82c5fa68b05b1057207150828babf98df986437c97fc1f7d6944428a59e46d7ce241c95017ee00000168000000b02e304d99afbbaaf86f152e8b8709b837575aee9bf2d26f8066b37d56121bfa7d2092478357b1526c7d0602a0fff7b3ffa3fb6f8caefec773ece7863960926bb6a4b7384ea3f04c5dae2676d95e7fea2ece48291d95b56d3cabba0d65c7a67255af6e0ba4d6ef2d53c45b3353912fe9c61b7a8c3fb5d7285004b915a9d520daba6313f1a5b33aaf2ba850742bb84dc0762f9570deffa1d8194ec0e2e55b3e816501e7e983b77910380de225a144aec7b7000000b01396f436ba4ff089bf3cd9c2ed3a5a7008b86e6eb08175c19e13aaa809448a547c742b18932dfb52aa7d9b61326cf999f4bfe072e8e3d105df18f378c64de85f14d85e23979786312d40844a444a51e0bbd718c974f8a73eaffb3b6f9d1b213ab7e6342fff2ded666f7885505aa12fa2132fbb6238c66043491778f0913c357ac6d20b71e5116527c790f1dd9c5419b9238c6697f453f5eab5dcb86ff4ba702e7f03c47ffb5fb40d2b0848bdc709e86000000168000000b02e08b5d9b92ba5bb5b41a3f5437fef7df65f5e2726d92712fea12d2400a009a976d172a539e1ec6c71122364a2c0fad277451360de8da0f859a6da1766ab381f9f02c0e604c4a7f7a060065973db7de2760fad2a2e5d8f543217adeadf1ba76bee576c292663586ed440aeaa1a623af01a88d505a81959f21c53b303cbdb106c4605add07071b1745a7900a5772980d112d1bc6ef6e07dfee0197b8bd16b5b81a9e24680013fc431d1dcd4ffcdf57a6b000000b02e4a5416ef8d4fd5f46329d250efc573630f42ef1fb2422b20b1ee17c989246e16b9074e59656cc25ee02095d2cb0116a0e3f968a75b4884be6e3ff631603edd93312a1b9ccd9351432b5d9fc5603eabaecf0ad19fdcec88d2a0e1c11023813e206a64a2c64d65b3b1675896c843050901173437be4bfe5a3b23c44f808485ad115d1c97e137cea45f082a3d0796d4c325f3927456ca9c1333a92f5b21046b2a294a435e9eca501d0f2532b600786c8200000168000000b02f7769b8ecbf31c936ad2ccade02b992df94d4cd4256125f0a97eca8ff06e2c3a0d8026a0a7f2cb50f7906183316e7bbde281e2312d68ddc161b5185a3555b2e98ce4f28d29123edcd29a52006b3f5bc7610f84509fa561e0ef4f3e8f64e3cfdacf9e4063da92a6d63e6977363ee500408edf09f79a2aecee3a5a004be46c36aa6c7f6a7e8fc5d0bc0517924745a7cb8104b96c03c01e22e59c64fa762f30e6240a3c07782233bbd0399fde29777afa3000000b001a1136c923965befca6faed336643e0c2f3502ea02150c9b4460b10c4b21f45ba019641dc975ae436c0a13c19cde14086e351cb5c02865b27abbb4f700c446e7481eee3e21ac5572ae5ef834aa90fce7572d6e55757530c7514707db973f24493455dec8efc85ec70218696ff74a4472db21c1f5fed090c7d5250dd0f96f134d2fe1ac2c151296c3685c5f5961f67fe0a8a07aa90d608aacc5576a525f75db8fba2a287ee727048c19c1c74f076007c3800000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000002c100000000000000000000000000000000000000000000000000000000000002c200000000000000000000000000000000000000000000000000000000000002c300000000000000000000000000000000000000000000000000000000000002c400000000000000000000000000000000000000000000000000000000000002c500000000000000000000000000000000000000000000000000000000000002c600000000000000000000000000000000000000000000000000000000000002c700000000000000000000000000000000000000000000000000000000000002c800000000000000000000000000000000000000000000000000000000000002c900000000000000000000000000000000000000000000000000000000000002ca00000000000000000000000000000000000000000000000000000000000002cb00000000000000000000000000000000000000000000000000000000000002cc00000000000000000000000000000000000000000000000000000000000002cd00000000000000000000000000000000000000000000000000000000000002ce00000000000000000000000000000000000000000000000000000000000002cf00000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000002d100000000000000000000000000000000000000000000000000000000000002d200000000000000000000000000000000000000000000000000000000000002d300000000000000000000000000000000000000000000000000000000000002d400000000000000000000000000000000000000000000000000000000000002d500000000000000000000000000000000000000000000000000000000000002d600000000000000000000000000000000000000000000000000000000000002d700000000000000000000000000000000000000000000000000000000000002d800000000000000000000000000000000000000000000000000000000000002d900000000000000000000000000000000000000000000000000000000000002da00000000000000000000000000000000000000000000000000000000000002db00000000000000000000000000000000000000000000000000000000000002dc00000000000000000000000000000000000000000000000000000000000002dd00000000000000000000000000000000000000000000000000000000000002de00000000000000000000000000000000000000000000000000000000000002df00000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000002e100000000000000000000000000000000000000000000000000000000000002e200000000000000000000000000000000000000000000000000000000000002e300000000000000000000000000000000000000000000000000000000000002e400000000000000000000000000000000000000000000000000000000000002e500000000000000000000000000000000000000000000000000000000000002e600000000000000000000000000000000000000000000000000000000000002e700000000000000000000000000000000000000000000000000000000000002e800000000000000000000000000000000000000000000000000000000000002e900000000000000000000000000000000000000000000000000000000000002ea00000000000000000000000000000000000000000000000000000000000002eb00000000000000000000000000000000000000000000000000000000000002ec00000000000000000000000000000000000000000000000000000000000002ed00000000000000000000000000000000000000000000000000000000000002ee00000000000000000000000000000000000000000000000000000000000002ef00000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000002f100000000000000000000000000000000000000000000000000000000000002f200000000000000000000000000000000000000000000000000000000000002f300000000000000000000000000000000000000000000000000000000000002f400000000000000000000000000000000000000000000000000000000000002f500000000000000000000000000000000000000000000000000000000000002f600000000000000000000000000000000000000000000000000000000000002f73700000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000003c100000000000000000000000000000000000000000000000000000000000003c200000000000000000000000000000000000000000000000000000000000003c300000000000000000000000000000000000000000000000000000000000003c400000000000000000000000000000000000000000000000000000000000003c500000000000000000000000000000000000000000000000000000000000003c600000000000000000000000000000000000000000000000000000000000003c700000000000000000000000000000000000000000000000000000000000003c800000000000000000000000000000000000000000000000000000000000003c900000000000000000000000000000000000000000000000000000000000003ca00000000000000000000000000000000000000000000000000000000000003cb00000000000000000000000000000000000000000000000000000000000003cc00000000000000000000000000000000000000000000000000000000000003cd00000000000000000000000000000000000000000000000000000000000003ce00000000000000000000000000000000000000000000000000000000000003cf00000000000000000000000000000000000000000000000000000000000003d000000000000000000000000000000000000000000000000000000000000003d100000000000000000000000000000000000000000000000000000000000003d200000000000000000000000000000000000000000000000000000000000003d300000000000000000000000000000000000000000000000000000000000003d400000000000000000000000000000000000000000000000000000000000003d500000000000000000000000000000000000000000000000000000000000003d600000000000000000000000000000000000000000000000000000000000003d700000000000000000000000000000000000000000000000000000000000003d800000000000000000000000000000000000000000000000000000000000003d900000000000000000000000000000000000000000000000000000000000003da00000000000000000000000000000000000000000000000000000000000003db00000000000000000000000000000000000000000000000000000000000003dc00000000000000000000000000000000000000000000000000000000000003dd00000000000000000000000000000000000000000000000000000000000003de00000000000000000000000000000000000000000000000000000000000003df00000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000003e100000000000000000000000000000000000000000000000000000000000003e200000000000000000000000000000000000000000000000000000000000003e300000000000000000000000000000000000000000000000000000000000003e400000000000000000000000000000000000000000000000000000000000003e500000000000000000000000000000000000000000000000000000000000003e600000000000000000000000000000000000000000000000000000000000003e700000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000003e900000000000000000000000000000000000000000000000000000000000003ea00000000000000000000000000000000000000000000000000000000000003eb00000000000000000000000000000000000000000000000000000000000003ec00000000000000000000000000000000000000000000000000000000000003ed00000000000000000000000000000000000000000000000000000000000003ee00000000000000000000000000000000000000000000000000000000000003ef00000000000000000000000000000000000000000000000000000000000003f000000000000000000000000000000000000000000000000000000000000003f100000000000000000000000000000000000000000000000000000000000003f200000000000000000000000000000000000000000000000000000000000003f300000000000000000000000000000000000000000000000000000000000003f400000000000000000000000000000000000000000000000000000000000003f500000000000000000000000000000000000000000000000000000000000003f60200000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000004c11000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000006ca00000000000000000000000000000000000000000000000000000000000006c100000000000000000000000000000000000000000000000000000000000006cb00000000000000000000000000000000000000000000000000000000000006c200000000000000000000000000000000000000000000000000000000000006cc00000000000000000000000000000000000000000000000000000000000006c300000000000000000000000000000000000000000000000000000000000006cd00000000000000000000000000000000000000000000000000000000000006c400000000000000000000000000000000000000000000000000000000000006ce00000000000000000000000000000000000000000000000000000000000006c500000000000000000000000000000000000000000000000000000000000006cf00000000000000000000000000000000000000000000000000000000000006c600000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000006c700000000000000000000000000000000000000000000000000000000000006d100000000000000000000000000000000000000000000000000000000000006c800000000000000000000000000000000000000000000000000000000000006d200000000000000000000000000000000000000000000000000000000000006c900000000000000000000000000000000000000000000000000000000000006d300000000000000000000000000000000000000000000000000000000000006ca00000000000000000000000000000000000000000000000000000000000006d400000000000000000000000000000000000000000000000000000000000006cb00000000000000000000000000000000000000000000000000000000000006d500000000000000000000000000000000000000000000000000000000000006cc00000000000000000000000000000000000000000000000000000000000006d600000000000000000000000000000000000000000000000000000000000006cd00000000000000000000000000000000000000000000000000000000000006d700000000000000000000000000000000000000000000000000000000000006ce00000000000000000000000000000000000000000000000000000000000006d800000000000000000000000000000000000000000000000000000000000006cf00000000000000000000000000000000000000000000000000000000000006d9000011000000021c000000b0297e0b305512920de9397b9390478ec7afec3230e2f9a3d3b06af3e2cfd1b2b530a88a70b8a4dfaca7713a8743435c931a303dc90bee2139ad27cbd4911f5e1506231bed74dda194b883b91f9823e95b8615ff887f7d030265406dd7fbd9337c00203d78b37a4f3645e3c9fe83abddf9099d61c78265a75604765c7de5cffe1de682ceb30cdb15fafa8388cbe3d321802300f544da9789aa4ed43617b8359d3c9cb7a9dd8fb9a4fde0f1fae70809f704000000b01f3eb517a543728eba4e2696db87f11bd479d31cd5a177e1a1716432ed6f977470341ad1b90e5623e3349d9b4d9daed244764d7fecedee5a04c584419f2a21f1176ed01837a0d66259b5fb7bace33a8cdb65cfa8e1caf76029ee5b4d064577b1f47ac1e694a5cab4ec0ae1e83079fc291a49a99d597dfdd66745ddd3f96a1ea3684856a11c34d394f17793189b01ce0e246188829b7af14c0775ae03b22c533ea209d2619342f5d934ef1f35f2b3ef30000000b01ca63ce4dece74d56da9ff0c963a990ef09b1b9bc8bf0c02fc40bba725b6f1558021783f318e6656a42cd9d1b8fe8a574018cb9bc932d1e66124ef9623a1a36aa5b3729456d4adf250b67143441761a576a1c9bed2600ba798edf8f0610fe94f46bba273d6abeba1d5c0489a74566f772905fdc7fb7c77fa302b108b2f9837afe42b1ab08e6fcb5693bea25bacb000761bcca34067ca2182a0c185ad78aa20e536f804722d5a5c9c1b2381b18bcaa9820000021c000000b0276c2f153bbe771b252b37d5f4bed85d47d9a8744476b64201a36c523a909c900a87c9e12ccf3f82a1a0f05317e22380ce980e4e17c0c3609caec5c6b47690fbb2ff82f18a38bc5ea31816fc08f5b2d797e3c99797e8a28dd68142d2b9da0a17d4292e50061760ff066b22e147cf709c182ae184973da4fd92d54f1609aa66ff6dfdf22d1c7223ebab7c2c1797877c0700520230ba0f23aa0422387c20d51a9e9a3a0d42aad1fdb676b6f586a4763ee1000000b00401d4d2ed743d2be2971041131c926f44d652a38848f747b9e047a26a01c68acda37adf5bd8db1ea91b9f14993e891212ed6c65b8ec17fc2511bd5332f9e99e008515881f4cfa093f6e6674ba7b1164b40cadfa017cb278487abcd3a4ed9692b8bc910cda307044cf562a594e0f204a06e586589dbf119d41c29f1d1bada13eab34cf84257fb8d607c5b17059242d12038c20fa35edff88fec71e75c616225cb942c5d12c1a4125b02001946150a455000000b01cabdc33886882884a91ea8c71862b9b396d10042d122cbe905ba1c7a9986f9b41eaf5bd63d8d22ce293183f21aa0b37e665553e76a921e17731e733825719e57b4246ab0ad7221708abce5d045eadb4845cdee8cd802ee89a050768d11a0027a5d6bbf5aa88299c8faa06f6e64818b42592df7d06e0c9819e3d4ee3a4875cb618e4e01a2d115b591a83110c329603551416c85c88e8744fd690e4ef98d22de79c22dc23932a2ab41de62473cd7e3a890000021c000000b003de80bcb3d6359fd40074fea0e1dd95831e031d60789be01dc264f223a6422b8cdeca2dfa2e5485f83d85f781e5078269091a40ee03d706d1556c8ed36e8824c869c7cbb35ad547b6cc0636863d3fab3b3c4d2f5416e033aa83152f329acae85aab4ba869d48e79b18335af9b5e54f62495b41c8fc3521a3fe17d87512062459d976758c3948819391e651ab87e8d9725a9cf922e6f710618d6b39d2f173bcf40f3817ca32ed4a24bbb8421b0697eab000000b00e3e63b3de11328b757d3aa49a1557242dea85f236bc7d6be5a50a60fc9c907bc928df7952bfb3c1a0b2b51f7cb6c4b896b77822635697ba70f1fe103813958a05cd86ca8e727b6bf5a80b388b37f16ebe8b7155821c5f39a810f79fc3a4704fdc41de49b61bc746dcc086c221a8d7680b19ad368d52b0809ee9a3a9dead3494b7b2135ba5de947a42b6b2a5d07ce0592cd72234074029d8832b74e593341dec59762b5ae3ed51d18ac47f4ccc61f9ee000000b0077803cac38000fc338507bfccdb025661a69d20a26788f50bab628826baeb0687a45431b334ab7f25d5a23d3129272a56762e4eefde7aaed6992ea0678254226ea4e002f07ec7529f25cb93f3fbb9ad32e43f0c07d38371ba2c610e37fdc08d468e1140d5d3cc032d3968e0f73df34c0ef8c73f3f9e290c729be4ccab70f649c4d93fa8c73e10edf7bec4d09f62dd4c184145f013ede3e392ce3fb74a6d2c45c1ee85dd258206fdc6eea69c37a0a6bd0000021c000000b028dda3c41c35d4120ed7797cc60df2e86310aab6d1a5f523adaef226dc79d717baa90727c64397c39968807e01393672986e89ec440f24c3c0c3a39f92fa33583eb9c5e6c168de8480db09dbc2cde4202ebe0f7dcc5aee14439fb32be754005d3f4e1c1c1ee1e77c75c81fb82c5b19840b0da172f09193a3c58c15a449b2e58f5064ca0bc2a53920ac9c3dc3bd3c04ec18f346f8e0dde1dc4dbb5dfa8e6b94b739c139411e5659481496164ddfadf05b000000b0233887a2252a62fc47865d03e643dbc014358d2c27e0cc9636d07abcaebb28070ebe173908176dd2f310f18d52e45964362ef1780f29c1b82edb4f674850ec6c57bc80dd1510f051478e9294c02a1ce1fdc2371fd410411e42f4f8f2155a3e29c499892663d02f72f67757e475bc84b927b07ccf354b60bbc59aecbf4fa8e3fee23af396d07484c2f14215be35c0e4110ed187e8d4d3e053ad71e10e6ead7c9063cdf69a8d579b7d58cd785b9f1b5a18000000b00256dd87dbf53a87ee21e14f3555a6c6de2eb0634063f04bbeed0d2201b3696bc210bf8dcfacf0fe0f116566828b3a1f36098f8c3b1f287ddb403a2680b4d8f6e89641980fd56778a183d511292bff54961696e61312aaa1eff417e7f139d1545ff4dd88e7f811ee389aeb7bc41158e80a77664d22392d20e230650830eafe8135a97cdb2403504bb93132115563f5992d9d865b95bef196883646035a38efc9a46bf1fdbcd72ce1ab28e53aace42a6d0000021c000000b02248674ff4cedf387f6f32be3e401750f0daeff8213b55a9196ce914280eed8ffa03b4bc1c24939aaf788403cc17994ea40690b6b51cddd4670f2c33b42734300b7b804f2b2bb91d8fd6cba53f0224b6bedd9e2133c6153b0303a7e3918e69f8cfd69ad10171673230e34d248d54beab20d433ce81d78233a2b0c761e7d63bffc9a3cee78ef95f591911e081b744426a062589235e4ed2968040ee01835cd12d58a6a2af946716fdfb608be021389834000000b02e3a65a02db851cb84f634fa45b46be6739dc98308f7142ae246ca44c7632ba8bd09bafff55502d6b6d0f26b74d6640edbe3a3c9f21b8b85260cfbef9e8b46d7c98ccf9ebc088e83f3c6793e00945b1c5df4387bdcc1180f62c4307abc8be5470e90c3380c46332ac57b8f5ceb1a6244163c858665386d8c51d3b473e4fb432028fb3e0e870a3a78d2eb5a2b32c3c8f002d1fe0246fab3ab36870145f98fbd4be04e5f91fd7f43fd68c7e382cbea8715000000b01064e323510b6ce3619ef12753f4c4281010071b41604daf8bbdc0a35c8bd613c52b45192f9d61b448c8c7760ac95884334773c4fb19ea9bda16c817adc9aa85945e2b6b1e89cc49a4d6e81318ef14c15a696f58d9e0f5af1400e6082406f4242e81f3f606361780818f7bc1f32879d52f511c46b96ab62faaa55ea4bd3bde6af6de6c66ef3520bc58e62c7b5d0d8fd6060a188bf6089c27290bfd9d0ba910ba3a2396e070255d09eeed49bec439e9090000021c000000b02353e4bf8f5586f6758becae8cd700b8ba8b5a2c6af40374181996243dfb2670b571e210fea0e8eca79330f9b683a93c1e44743333345faa1dfe6d1132f38edd07a0a8056387db9397549cca97b256ccff9b7a351aaf826af97f129036b7085a38dd37105d7fd6b0c9c6f9a51eef68ce276f6cf083a356897f45a6f71b28e6aa9bc24b27606b58b4402e03cc1d9893de010e1f5275e99dec63fcaebbab7a32f090fcbeeaba7cfd97c43c497ee96f121c000000b02e41e659591f170762b021dbb766a5ffa6915ceb24800daff68b2c209b9471e79acc134d4efe9628495442137a89f6678cbb4050ac202688fafdedf8d17a0ab3bd6a181d762fe3ae0eb5ef6b708792f28443dab8329738db9241e1efbe9497692a2a9787b3ce38a8db01e5221cad74ad0cb27bfc1ab4f332e496faf135f9fbd7102be755ab326bf83611441a346b7fe714cdb47bb19bbd99cb9369850dc11372d46e43f6c0df73ff898111c8e573e944000000b001b75d9f8ab8f000a8e8d2dafa17c48330a913110b24cc02b3b0318398b0ecebd05865ad2aa23e3a6e8874fe82e650802a484ed0d1d9ea2cc70cfb4297c7ab35744f8e4c2b83a24123b3e6e12d47fecc69e9b78c8272f93eccc82cd88856577089f1c3d4100362491726c53923ab16092c5e917dd5b7d8e0c71096baa87ec13851b494e5e4300e300170dd138392044815933c2aa6bba63ca5d41cd2969426243ef9cf67a3d60156380292a802f5cf1e0000021c000000b00d2d519bd16ddc3ba583c97e1c88be350225962a907d7016b79949b1c7adefc395466edcd02224b4d057a18d6c79a77b28e6deece19cf9b973ac6ab41f628aa468329b8f81c86d1595dcc7415895fd716c8d882646d454f704cb2e4dda40e3b38a9c0e68cf08622488524398e5a15440222e618d3ac054f834f7a93952a76f9e8c871bf7527064683aad39911543e890248c1024effbbca949260eae75b6730ad9b70e0f5176e4b44f24933bdefd096a000000b02cd378829872bdec57c2390d594870a5cbdf0f950ca8950bcac291164c1c8732d6645708ac959847c75212c3c55affbf7c3c8ce81f07f46804a4150ec430ef2392fc69f1ac1df36964d74a8ea52a55dfc9d271e556a2ec2baa96a190cba683bd173d36b5fb77cfe9580e5442f2e7314c239df5fdb15a9594db38cc63a0d0694fe3a40c9624c0193cd77551868b2071de2cf1bcd480a8f78f71f02acbf696e47b1e743d453f78673d669118486d1b4e01000000b00035e9217fabdba65d96bdccf3fcafe34951a1a25afa264c64d3ff82fc47f5da310b0c0e7650f41577cf689b1a6abbed20d64a4f57997cb8eb1302ce0e5d6534f8a67a36a0012be9fa8f85e7ca21ecdeee616f14531bcc434b05f4219865202c74b4710cf37b075a62fadc5528f720c2192fea383d6ba17e50bd0261ad86c369a03998cf0800f574581ffc43a9b594c6027ffd211e7b56d355e0734c2a7e16cad90391369bb49524e8710ecfd681551c0000021c000000b02e67f8bc017edc2e17f5cfc4cac60ff34e0ebfa16475d81eb0a94a01f47d9f16c935c9faa603651cff8e777be9b17d609bc7c0d5cc1d5b2f1c99f5d7983797758e829fece2ef0518545bfecd8f171dd4ef337b929d6553449c06f2b6b52f749f315f476239579ed38e51a290279d79a01e87744006807470aa331da0ea77537254f048a2d55fde1f1a525c085c9dcaee108e3ecabbc5a7a2d33714ec944ffeeeac36d44d106dfd8955b52db3230e2e44000000b02be794eaf74957a7a4adacb9707969bf9914116b39c1e27908c12ec57d0e70deec6b6743ea608c605afde6e6f00cec11b2c7f9bcb47a4b48876f7b00a2078573c003026d9f8457566d0be197304211c720b73350fb88aa99e8a576893083ccbef36b91ded47d2e7fcab62a88f9e0e7c51bb83ef10e385e381d48b2eca639a2d1fbd9637731fd8d787dd94b464469ce0f07fb5ebf2521e76cbb5b9de793dad9094b4be26cb1e6d52b6997da2ec2673327000000b01ff25d2f3361d8d0b689c7730656106221cc463cc5385ca268b2963b7fea0313302ee268fc7f1f6124442d58ee863d968d90bed2022a2a13e1f86e1598b4cdca6d3821994f82f7bb3c5e96a287dbfb2888293bb3a03ea096a6e4aef54bb3210ed6e5fb7bd42a0a1efa628f5703a2eff80bdd83fa724fcea02fa9da067ba8f1cedc6c3de0842ffd0fe07e4103659bd8742278b6005bc442b7e93363342203ba799664f34dd1668754f76099171af683fd00000fa400000168000000b01ca3dfc1ce3c3b3cd51d22f12c5a8d69fd8fdb3af770ef5fae36c03635a6bfb2c1da41bee10f9f60e4c9d801d22f2bb4f1ccece0111f5ef0b030d4ffb5574e63695e056cfd601a92f59edee46eefa49d8258220b04afc9f4ddccbfed8948b96a0e0577f7b035850a7b717712f8ef7ef20db9b0809bb38a25ec46d80dd536a70239218be2939c3befe01f454400131bb92bbe5fc6d12dcec8714bddab5a5f0e5d5ebaa65e4e7a8d46efff25314cefc598000000b0187b661c3b4c38a38c455eaedd18e20df77d3058e54a40b8a2d133810514000a2ffd79ba86290e9d60e4f55cedbac233c4abb9c6a8605fa8637958bede2e8c554a9212c80a6966a31e62ede09724699444899dd4cbcae7b4b57e9f38c18d93cbc19cddea3eabef7dc544d71ad7a0eec60cf8376d1310bfcebfdbdd94725fe94065b9c31ca7e85bf319f3a2f956e157ae21133127c66a12fc78295270f0e22c63c51483b668fd75c825c36637de5afff300000168000000b0263482a428f76c715b1d6de0a3d92492d7cdd878026391896280df5e9a7b927f24fec44b28fcd13804728aecae50048788f5499408329593c5dcda78c531f10c048653643860b67114772726125bdb73c2d6b35c49f2ff2ddb0a76f6a62d844e0d2329bfc2a31982c26f522231c2d03d2535995ac11ff115720e1e5798f48b9c9d2e8b60c1d610c67df81df78681c63725eb5d1e4df1f878d34c5d2cfc3fdb2dfb14c6c86eb3ffe1d282e2528e4d4cb7000000b01d1c0e252f4e5f7c2a6d3f75b7fc0a07c7763eaf2a2d97befa7451a72848b42c9633ec379d7fb99a6d5b9895d5965039fc15834bbcc4ec50aa98f80e6e26b57bf55b3dc98795ffa996a1b9d879af39014abc47cc0b0ccc918a0cd4a549db4c53e447d42a1a41a958622841ca61099bbb007a92c324661940dbc3567b1e5d3a121af59a486e1b58735f6207e57a4a5cd802c5ed6d68696fcad3193d0f52b7eec71934bcffe8f8b61e1fb55dd68d7b09fd00000168000000b005314296d12a845d7ea6f0a5a5fadf9463148dc355c0d1944a742b3cc54dbf776a18f37c8e0e0e5c81c601cc420c5f01d8d1d621c352dcdd914a2a49f23d60c6c96d6c4648eb75b7e561b61a1bd22096ff47d51adb9a28c33d4533f6b2fd4ebef7b9b7912ed017d01e2975d449f055071cb2bbf9f0e80e8e6eda2c129c3f74877f2b25a39a3d8307a94dea57ef10930f29f7fd3b16977a5f3baa414b113a1821f8f2eb44c9447bec04a75c02a798db59000000b00fc19242da1769fc57134ef0607187744ed5199653255ddd4c74e879f72def196837b97c019cd599cbd6660cf92b671b263accb45ffbdac4dc284f357f85f238c1784253a8b10d0bc280f3a309bc6d4575d744747b18768e4100338f181d77b1f1db842fbd384d799383abf032982b3d208962eea3a2b8006ce56926f158d436e2f5286230bd17ce67470b8b50f909d7216a29d281795ebc4c76f2b59c438a24bb6fd13b5746fba1d4750e701bd9299400000168000000b01f3f99e9f86a7c92807b30a09deae45b425fd73f3879e30561bd64ee94dfb5fdbe35de9dafba1bf58cf2361544f932eba44162d3529211ab6e586ae85dda280bffb76462284c40b3d8f2b2b6be6423fbaec55aae89581dfc6629c9b0d94b604aaf4d82c9b59ff3f62dbff3f05dd1d9972d5385bede69db7da6dc59800e5f358b1e38248234be232b34f1cc4945acdea11cecc28ff637eb3f4c9ef7b6ce6c64dcc86edd886b6208dd45a06b83f94c2221000000b00e15e40ef9f23a4283d2ab653cabd95fa2d5f6f127746c6ae94b7a01938ef07ad5a80a9843a69fa8960c6e5ab968a5cf24d9893567f377bf02a61b4b2c7e1e7a74b97497892de00a924b8c9de06da09eb14cff0689ec39e971a6650a420fca13acdc08aec97265b778e5b920271a8e20001d9ffc4bf95740619ad27434b3d09070ede826dd7077fb4aed156177336ce30236060ae3525f2150196c1e33b93f4c4e25404e35e688ee98aa3cf9f35b927b00000168000000b00cf21dbcba1c0f92b0b9ec9eb4e8367b59b720be887753a5dad467a033a10295b6c307b9657c781c7576e32fdcbb6dc99f2b351ada4c11f5bbe3ee40003dd5c71ab51f0632dff51c120ee774ebd439360cf34b1a121a958fbdc51bd3cfb22805320c40712d3f44eb71e56268ef4f99de23aea50f01e91cd427faade42a3bb2fb0dcdf7f2d4bd08169fc9a5cac6097f6613322b19b59a7b13a6cb370d8df81b219f430c0c34f741aafe7118426065dc75000000b00203f9dde4b9b3ff331892b6e67c02028d98e0f9ef75e042de68ce184b1a4d78b59c336b5c863299d9f839e4d549fb1f35f7c916206829ae27f8eed3d633e6da05c7baaeed04d2a50e03b0cfc3102b67fe3be956707984ef86c0c129d6c377dadc458cef17dbfd2837fe150e38a4343730543faec85e421d4f7f58660d131b91d49478762bdbefd843716ecf6057ba562f0a8ce8f42afcdfb4f73102d8ba6535f785896fcb28dafd8b60f8876270a6e800000168000000b02168273ec92713a3e47c9072e60083241d13257656a91ce4db207d24dcb66352b3b9180d6db373c0ba7c5cadb7ae3dce465e497fbddf0bf387c8d12017943cf82fbb80f69b43207081ecabe21b90dbeca4549e2552fc9dca52e320fd36f51eefecf268b8a64c3b57344f5e696beced4e1b9e5b487ca9bfe4a7bb3f2a9f2625bb1ebcec12fa1020c75d6ed4a457222a5b00a520b9b437d3262ac2ef71e7f5470132262aee54f9c5d396649993357cf217000000b00764e577b8f2b3e0d3c9100a5f5290aa3d7f6b042c1f3e1112fb7030a9a5956045ede2d38f263ce91ccf91b22647610a11e0d23f1a54836a6f32cfd0af4551f3a1896f7e0825b49d7d6732da21a2cfd3fe5492abaaaa0ce92f6894de4f548a127c03a2c155692557865e204e467cb5052bccb2e35bf0a751129811a75f6e5f2cadafee9c3ed90a37af31a33ca141a5d219cd34df2d72c51b6954893de6493b11f00b98d8845757b21479b9a76f2ee3b700000168000000b02fecdf0f5d21477f574c9314241f29b64460f668ba72acd46e7f77cc59ccf12ddadb6b6b9e374058246b9d2e1572c61c845d46b62cfcabc33369da591bc6401f941e3ffcabb4346ea5a028f1d142003b53c91e37e127a3919734497efdb23fe0924999eef94ddfcaab133d30767982051c792cea085a7db2b566d6fd52eb363574df79d8c76912a137a52fd1483afa0f287fe6e76f420c6e1fb4a1e01512c1e855bd27f21fef72fd3bbadb91298aed47000000b010988efd953245cf2710e8edb5f92a9036e9e457f2ffa525219355752db33a268d9d8efb6409674ade743ce521a21882e601cbb720ac9283128213efeb55246062456b11f58c61a045cfb139b122db5dfdf343ab4831ba69454d078c54053bbe327be797d201f99cef50a17df7fc740a221c9a37b612204a7ea4acab026c6c2df6877f6b9a2a713757764f4f7378f4e10095dcffa3b40c813e24d643a30b36989b028a0ea4157998c28ec74e722f98aa00000168000000b0248ff6586b97b152b09496aeb30514e5c91c12a243ac233d6e63b93028f94ab433cce44e86faa934a95bccd335742e9b7701a5d35844185c62623f8f357ae298751a18458aec111b23b44223cefa068b64af29d42b081f2e4bdad9c826bf64e3dae846afe4f6315e6a6f1a52652f2f4f29f187dc06dfac268a1371a0926348e19e49b13c334d583a587600636c8b836c072738acc738a0a5609b1b3fa8982afd3a8e9ea4da29ed2cac65f1ab5116c1e0000000b00bced993d9a93add3147067485c4d908d192271026857b58d50f8ced6ed0957c56c66d5b3e00ef6b39c1cc51bf7bd77cb849a7ed2f2a9d178f89b181dfeb38d3e11c7257046c7da27345753b0ac8290952f10317f2dc1cbd434768d0667de0842d594b0754ec017d53bc080bd3d7cb34188f667729ecc6419c2531017dd60f39a9f9ddd9fef22be47ad5bd3cd1bc4102273c12b82612e4a51f260650a080717ffa6cac65b868be541e39d7caa78656ca00000168000000b01fe272b5b01568e6c92942491499d5189340e017d1113c2d2382f91d39aee3ed3bdf04d80995d20998699c4484c1ddfa632d381c285c04432e9fc438e71ee533de3fb7a51eb3948ce8f0ab3c16f457191e474a113eb78a7ca65e43cec59a8c961869d6fbd8c6abfa95ef60e18f7c47dd07574a3d5eeec87aa0816e933c1034fe21b62ddfe3f859d9f805e97bc6d653d414a82aed94d66a99dfe640c8de9412197cfaf631b1c5d3e4c9fc23479d05c3ac000000b00cf93c2f39012684f3625dfb28490dabd33f70477006a718c3d360675e964e8f8c751d1a904be180aa25a5c0bb31e3586a29396c2994ecc657a4af438542d9fae3da2dbf8fd8b3d0116605f793132b59408138608f15faf2f0bd27fea1540263ef59b37046558bab9cbf8868e6d66a68275bbd4f2a54f6e743bf5153fef84eddf0c9fa4107855ecc40bdd5dfd5d7bc2e084150942c3af36bdea07a1bf5f3fe1d38c0493ba3371a119d7d51055297ef9300000168000000b0213e92e971ffcb083b866dd4955a0f3f9183f54dc7fb1268a9335b119744aefc3853433f43af57e7b4c3d8a9d177bf0a92af1747e3af49e094bffc995d7ddc4eb245a2e221245ad984b231ca8d88d597bc856d412e89c42e76ac25d86bb431e6e6358e6ffc90f121b7014977f089cb7a04063978ee2c11d19fea1ad103ca8d9371fd6535f491639fb128d4afc1065c1f106d59d9c3be981ae779512fc8fe43df86a724352f11f044444b96231777f196000000b0267210212891b7ab5042f830ed5b110f23b4575d2597da72a2b5adf1d0510a65556c70390eaf280b9055cdd495a751ebf669bce3a23563a99a93e2d9853cd63fd19c9abe52e4291e8b686daf0ece9d28849ca40e2d090e208a03b3d126d1b28e1650def5ca9357465b31e8beb54e0f652589acd3122b0650d8d466160e8497971fd5cfc6fb0bed0352023ef546981d0517857e4cd3e9c9ea4070f475d398a5dea68661ee8446cef9e7442a1a443c329800000168000000b021356eb91ff7591f6243d993c6a46d64f87b021eb4276d270584168c8aaf937cb249c6560453c4f998f78218b3f2fbe7e2f75b5af9b637b0c5d79db309cc96827da0407ca9fe26f5efe73f951d552e9f71c76800c21dd398cc3afbb8e15dc136beeb27e5a8291e71121352a9e6ed14411114d1d42ec6eac7210c25be51b86e377d4f4881b65bdd1a6020a543d4d66e8d2fe863f5b579fba43c02d95a3f76c53bc1ff7b3019096f1d5df44f3c63922cc3000000b0055bca670ecbd5ccbc4cf69326255027dede97372017a7b6f8c38c218d3a161acf932166d9d9a0560ff252b8de3020cb7dbbf8f950030e52bf9b7e4d2ab1fa590ee369a2f0f6d3761abd6e6f1ca2971c89562eae13b47cec247a9590b120ba09b3719ba9a98fc227d668ea9157f03af81d9617ba09a95e902fdc1a6fb4b3981ee2cf1789956bd67b994d7384886f886a2c18cdcdef9743e8473be2978f2118877a5c07b8015c31823550cc8b01b6ab60380000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000030100000000000000000000000000000000000000000000000000000000000003020000000000000000000000000000000000000000000000000000000000000303000000000000000000000000000000000000000000000000000000000000030400000000000000000000000000000000000000000000000000000000000003050000000000000000000000000000000000000000000000000000000000000306000000000000000000000000000000000000000000000000000000000000030700000000000000000000000000000000000000000000000000000000000003080000000000000000000000000000000000000000000000000000000000000309000000000000000000000000000000000000000000000000000000000000030a000000000000000000000000000000000000000000000000000000000000030b000000000000000000000000000000000000000000000000000000000000030c000000000000000000000000000000000000000000000000000000000000030d000000000000000000000000000000000000000000000000000000000000030e000000000000000000000000000000000000000000000000000000000000030f0000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000031100000000000000000000000000000000000000000000000000000000000003120000000000000000000000000000000000000000000000000000000000000313000000000000000000000000000000000000000000000000000000000000031400000000000000000000000000000000000000000000000000000000000003150000000000000000000000000000000000000000000000000000000000000316000000000000000000000000000000000000000000000000000000000000031700000000000000000000000000000000000000000000000000000000000003180000000000000000000000000000000000000000000000000000000000000319000000000000000000000000000000000000000000000000000000000000031a000000000000000000000000000000000000000000000000000000000000031b000000000000000000000000000000000000000000000000000000000000031c000000000000000000000000000000000000000000000000000000000000031d000000000000000000000000000000000000000000000000000000000000031e000000000000000000000000000000000000000000000000000000000000031f0000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000032100000000000000000000000000000000000000000000000000000000000003220000000000000000000000000000000000000000000000000000000000000323000000000000000000000000000000000000000000000000000000000000032400000000000000000000000000000000000000000000000000000000000003250000000000000000000000000000000000000000000000000000000000000326000000000000000000000000000000000000000000000000000000000000032700000000000000000000000000000000000000000000000000000000000003280000000000000000000000000000000000000000000000000000000000000329000000000000000000000000000000000000000000000000000000000000032a000000000000000000000000000000000000000000000000000000000000032b000000000000000000000000000000000000000000000000000000000000032c000000000000000000000000000000000000000000000000000000000000032d000000000000000000000000000000000000000000000000000000000000032e000000000000000000000000000000000000000000000000000000000000032f00000000000000000000000000000000000000000000000000000000000003300000000000000000000000000000000000000000000000000000000000000331000000000000000000000000000000000000000000000000000000000000033200000000000000000000000000000000000000000000000000000000000003330000000000000000000000000000000000000000000000000000000000000334000000000000000000000000000000000000000000000000000000000000033500000000000000000000000000000000000000000000000000000000000003360000000000000000000000000000000000000000000000000000000000000337370000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040100000000000000000000000000000000000000000000000000000000000004020000000000000000000000000000000000000000000000000000000000000403000000000000000000000000000000000000000000000000000000000000040400000000000000000000000000000000000000000000000000000000000004050000000000000000000000000000000000000000000000000000000000000406000000000000000000000000000000000000000000000000000000000000040700000000000000000000000000000000000000000000000000000000000004080000000000000000000000000000000000000000000000000000000000000409000000000000000000000000000000000000000000000000000000000000040a000000000000000000000000000000000000000000000000000000000000040b000000000000000000000000000000000000000000000000000000000000040c000000000000000000000000000000000000000000000000000000000000040d000000000000000000000000000000000000000000000000000000000000040e000000000000000000000000000000000000000000000000000000000000040f0000000000000000000000000000000000000000000000000000000000000410000000000000000000000000000000000000000000000000000000000000041100000000000000000000000000000000000000000000000000000000000004120000000000000000000000000000000000000000000000000000000000000413000000000000000000000000000000000000000000000000000000000000041400000000000000000000000000000000000000000000000000000000000004150000000000000000000000000000000000000000000000000000000000000416000000000000000000000000000000000000000000000000000000000000041700000000000000000000000000000000000000000000000000000000000004180000000000000000000000000000000000000000000000000000000000000419000000000000000000000000000000000000000000000000000000000000041a000000000000000000000000000000000000000000000000000000000000041b000000000000000000000000000000000000000000000000000000000000041c000000000000000000000000000000000000000000000000000000000000041d000000000000000000000000000000000000000000000000000000000000041e000000000000000000000000000000000000000000000000000000000000041f0000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000000000000000000000000000042100000000000000000000000000000000000000000000000000000000000004220000000000000000000000000000000000000000000000000000000000000423000000000000000000000000000000000000000000000000000000000000042400000000000000000000000000000000000000000000000000000000000004250000000000000000000000000000000000000000000000000000000000000426000000000000000000000000000000000000000000000000000000000000042700000000000000000000000000000000000000000000000000000000000004280000000000000000000000000000000000000000000000000000000000000429000000000000000000000000000000000000000000000000000000000000042a000000000000000000000000000000000000000000000000000000000000042b000000000000000000000000000000000000000000000000000000000000042c000000000000000000000000000000000000000000000000000000000000042d000000000000000000000000000000000000000000000000000000000000042e000000000000000000000000000000000000000000000000000000000000042f00000000000000000000000000000000000000000000000000000000000004300000000000000000000000000000000000000000000000000000000000000431000000000000000000000000000000000000000000000000000000000000043200000000000000000000000000000000000000000000000000000000000004330000000000000000000000000000000000000000000000000000000000000434000000000000000000000000000000000000000000000000000000000000043500000000000000000000000000000000000000000000000000000000000004360200000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000501100000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000070a0000000000000000000000000000000000000000000000000000000000000701000000000000000000000000000000000000000000000000000000000000070b0000000000000000000000000000000000000000000000000000000000000702000000000000000000000000000000000000000000000000000000000000070c0000000000000000000000000000000000000000000000000000000000000703000000000000000000000000000000000000000000000000000000000000070d0000000000000000000000000000000000000000000000000000000000000704000000000000000000000000000000000000000000000000000000000000070e0000000000000000000000000000000000000000000000000000000000000705000000000000000000000000000000000000000000000000000000000000070f00000000000000000000000000000000000000000000000000000000000007060000000000000000000000000000000000000000000000000000000000000710000000000000000000000000000000000000000000000000000000000000070700000000000000000000000000000000000000000000000000000000000007110000000000000000000000000000000000000000000000000000000000000708000000000000000000000000000000000000000000000000000000000000071200000000000000000000000000000000000000000000000000000000000007090000000000000000000000000000000000000000000000000000000000000713000000000000000000000000000000000000000000000000000000000000070a0000000000000000000000000000000000000000000000000000000000000714000000000000000000000000000000000000000000000000000000000000070b0000000000000000000000000000000000000000000000000000000000000715000000000000000000000000000000000000000000000000000000000000070c0000000000000000000000000000000000000000000000000000000000000716000000000000000000000000000000000000000000000000000000000000070d0000000000000000000000000000000000000000000000000000000000000717000000000000000000000000000000000000000000000000000000000000070e0000000000000000000000000000000000000000000000000000000000000718000000000000000000000000000000000000000000000000000000000000070f0000000000000000000000000000000000000000000000000000000000000719000011000000021c000000b0263f1f6710a880b65786a6d27f2de87f6a9eb67f05351f863c6c2f26c9edb7256e1f7a4c2561a86322131a92a676ce823fc41e6337a61f1dea2caf92daf82ab3fdf6ae0956422cb5b9119f4571ed7047d525b08fed332d9ab448f695ed78f46466304eb08b7afc91d4b77e744ae8b3ac203d4ea99c224bf6802dc0013288b8fed4e53dad3ee10dd8bba126fb35c0dcee0f5e3187f276c2497e25f6b28616572ded95ccc9c1ceb348e3ad889fd8212d79000000b00c96cc8ed00fd809a9c419db7ccc18ca38dd87f5049dc296838c6fa711d63b911cb758815415c3022c34bbdf2009d807fbbe4b8cc99956092347fc0725dcecc0c2e32f5a2a3b4be700f7a516830a832756adda65bbf1ca84a3adab3e4ee03e263e4989c7572cf41acca2a5760adda1622ff3ae0eae6388ab49c41618ee00ce79d5f4915991ee69c299a61fe971a9b0332d5c7aae099bc5e181554cf9d673111b8925f5f62bfab220408ab40f9cfc100c000000b01b247dd9e52bf41e38c9631f4b54bdb35cc5f33746ed2b99df4f978c33f60f57a5c700813d9a27fdf5d2ab1861b03202061a11c98a9e8aad6dc70bb74df288c8014e13393e2cfea7e5ea45b7105790c92c6fa5fa3dc3ed7161329c75de56836cafecd257f594bac7f90351c37829c59f08367d990d7ee0c02318e3ec6f5ea54b6772236430a18cf5882856df8a9da5d900586b818672190094db21c33bcf8c5ff79080ee6ba9f99dcb33f8e90138f8740000021c000000b01756f4bde109022d44a7bdaa82ec4b18f3cbcddfcc4eef1cfa1e93726729b9bfca1538f3f773c0aa3bea781e007804b1e45d341bdcd596da4a4eb0fe543ee584112df78d8afdfbb8cced21bb254038559ff306e23f2514f403340e21ee93a37470c2fbefd5aee4a2b8bb2c765622322a248f5460ea21512fe206d6bae4f04e65142df2c643f03fea41345b009e4a3c1c305459838840adcc778607da2ecee786b6ddacea652512432db6db3a39e9ce96000000b029ee91989ef37f742d1d4b3ddee3d50eb760cf07d3aa0cc83ed9208a9b85aa243995b800722b077e9ce861e4ff4a8d653e069e5bdf555218702ab0052330add49a4279cbbef328b77df5be715b9b2468e8f13ec645cf82ef8e15b84c0e2105b59deef3387c8e56b9df36a086d9c2cb751e7b4198216e247a2e26a7616607995d57b2f4306493fd66d80442e812b82ba80307649c47d8d9022b895d2a1cd03bbb7e2c2855d7e0d99b572af02633f2b622000000b00dd3893bb42a23de84259eb3653db9a0246f71ebc96755c9e27092aa47324cbc2144a936c35d936014e4f0e35013f4e9e46e1caf6142d399aa373770be59e9852aee2d2948d03b5d16ca83031457f69fbf7586f7efd6ded61f34e839630c4872b250439b0654226407abcca836f7b3da2ff87635534b0369a9fc5c74f766ac7b36978d104208ba95608ed640b35ad87a0ef31291aa02c93f7dd61365ccc629c57cda031dd451f64f4efe500a8bb692710000021c000000b00e2f45dfde50fbb81715b088efde5d220c336e5489a3a774f3d8471474baf62b3931810894f1f8d1639e9e7653f146b8139e58da3274c887864d6c23125690a5db4089af6c5645f6576a01aa1da58b6c8fefa2485e1041ab1a16acd210711d07d6f474cb2b6da548cca9b877dbe1883c2d9155ebf7e683cacd9c92e1ddac052332031799e2e3bb33f70779ff3c09e1291c0289f049442b48d1ad927d9cf5e269e163f4a1c681b1c1c0f68fa51a6881df000000b029e12d9577679d9bba41e943b419bc67b88d1bf99e651075e87ff5feecc8b4d0f1f862397905fbc83dcef030171add27122d554dda1bafc3b0cca494c97c21313e60793aa498af25cb2444c24c28028fec31553b8370a4ccf61cf921f15afbf0a15aacd8eff09687fe9817b6b558832918a155d29a634f5860601140e28363f3c6c60b2a43fb4d3059771882b1076e4913fb588dbe37d0206388b5eabeccaeb9d691a07d849fdfe79ba86a648690187b000000b01764c24f54846ec8bceaf9f820f7267da97bc7324664c828b01434df702550d5e8966e08f54e95f0cd5c73a2aff618f29b90a41f3285aef0601e6c9de1205bb7f56e9a074b0dbf99349022df0a92901c0b22f59c8ccfe33caa52443c8461c3090eee7fe60a6fb68a4b2e8bd30035bea211a91f9cf5b7431a7700681b30e9b75d5eca819ffc4d9df0d4b0098e4096e07d0efb9b41da3c80853cf1075f8bfb255ca0a05f9bedd91e413f742c0529991d950000021c000000b026d6ea5e9fc0cb3993a1274f1769d8cf238c11432a9fe5f010dd7763e956b7a37dffb0c07fa03c5680095003b9e3036935e8aef1556c3a86ebaa9deedac93a4780a3232d85d06775a9747736dcb15fcfe9e3bc3aa269b9ddcb743c4738713628e5e37c7a1aa5c4068f93bc127fac65cf0f2cc74aa9a3ded9a9e6cb8304dec89f796dd082a7a1a578a4c432ee7f865bee143f5b5c643f14d43106f3299ce9bc2867c04cc32a0f7766ae48ef1b7e880e5a000000b007ebbdd7e14f7924264bc1caea06930653da4ca4f1d501ff6c40aa164baa5d6cb1b9d7ab56bdcd9295ff984ed8203da106f8d63a20d3732880a01221f148c20828f60dcfeeeeac56dea9d70fdc8755f5a483f2aa717b46c17f160040690400b3ec32d51666b9ae1de202aa88519b161213a872dab090f61cdd2eb1f7299348ec043a1e1490a403e7a2ababaa687644e2275e7b4a57968ecf06c207e3880830c3f8c238d0412d827c3fceba41705cf9d7000000b00ce47f2da6a69447e86e76d3fe970cfea4834d5e4eb7c867127f99d460690d8fad89ec6ace045370d6f788185585b33811ef48bede47f2686cd001233981b60e2624b01ec65132b55de6b2bd6e8518dfd06908a8e1a54c07990d69aae8c8cecbc85ae290768591f230532c386259e1ba271ed6d44a45eeac04a4f05d1c81481c50188b12753c8b611734b419d62532ea0e15267df97ee2af9a320af67db28e78deca457ac794064182fcb3ec183235660000021c000000b006e4cfa4e4d51610204648661d01a7a0176fdc097168bfb014d9a72e561d38ac76af6b884b4b196854f0665b8243acfffebe7c646dfc99ac7a7a2ae8b2a3400c8a1895564b0e61594e375829dd568e78baaca23497a3e78e63f0a6a9697b4bf3269a82c2f736badd3890f7e50e4a1cfc023dd8c5c254a7ef08eb18e1986f3f5ffb5568ab5afb7d3c633dc765fb9ffceb213ce880335f944815d44e5e3a996ff9d2a4619c1febec3b85ed823ddf5b18c7000000b01d122dac317878630c5d2d51834e4553a5fd140d4408a9b28af5b74aacd730a2e529b26ba0ffa6dd0d41fd9ae7ba201f25d985af69a4ad05f160cab52a074551babed78762d457634aeffcd3d327f11294e907c7bc3134520962935bad952615cf78cde6831b93bfd7fafc6c57f5cc97190c871e9c23393998da73e1510e04c76acac9879abf27617d180bc1e849f9ec1d96ba1e0fee99c3adcbdc061f97200d562df829b90b6e120bbd56c376432c2a000000b00ce65595c9aa13441a5a03e95c87192712ac8ba43fd660b18ef9ac07da192781bfb5169a52bc0b8ec657139dce6bedac3d931f2aab125f0fd12d42be56e6a3b04bfed21e46eb53a75ee46343f29da96acb44599e3c29360843c9ec8f36b06451160c045a29f257052d7c8cccbddd7c6709e957eca8425aefaa90af4d5e7211b5378ade7295c3522998fd43c00a9e23212d548b5512732c8121488a5d3c75ef1228fc104332c841ecf6c413dee02061b20000021c000000b001bb13ceb6f7725ecfd43b33158d05fca5d3e53c77ce4c0846553e6bb18ab4dc805b4b4a17048949f4a9cb3455483fd4b0120918b9370ca2679ed50a75b2a2738621ed8b373f822cdd388ecf52849d87fbf8ccddf961f92e80a4b0038038d1b1d0100b0bdbe93ada6a1c221e4983ee3626ef64a5b291d0e4a6e2d652430a559a2db886208e0a71853ff627144e1b403e0263de633a542184867f7106b16836de014943493d72cbf5b64bcbe75b1650bf000000b0167a2ddc276090ffc56cc249b134cd66fca183cc74ae725a84378c8fe4b9da7f526807e42c37a4272e92c6c6a86ecfe17c26234dde7dba18d719b9e806e386318ae98aa2e76500f1ef46c7108645427475ab80469593f26d7231a4355ad3c76faa630e3f68006d95629628d5e54bcebd1214a194187087b3813e236f6a8d588328f6ee745b64b435d3629a3b291b99c90af449a5db04c892cbc8ab77cbecc1bfcda37b249c345ae66ef38429a5b8afdd000000b01743f521fcbb264eb61d290d4dc6541de206b6dcf93d7ff2c68bfa533d07d31f52f8cea8babb55a0e3b084708db2ec2ffe25b02483f09799804ea942ca31236e6c69a00baba8663889490d304b471cdca42d67065912b3d03c6fe3a430dd5512003860c309184f0f86d0a23eb5234f8e0914cd8cd41da83b517cafdbadd29874039146e6ca5b9949b1d49c80b8cb17be2ee6323d052c6a04f4780bd66793b0288be6705d5d3947a4c4159da931f7502e0000021c000000b011bf9278cdf1c4f8d0f9babb149f0a4e6cbb5243865cb9d0fb0e93b3cb658f7f7070a63dd1b2a4af68a4b36241e13fefb8bb6fc4b9892e57e2a293b7fcee72a1293c3c6b65f790e076943fd6740ca4e209305a00badfb9facf559781918e76da32acec482163326cd147d010ad2b7fc91e2cde3df3de439daed0ec75f451975ddaa86dd6f744d6ba3eba5a811f42b2550962baafb23c86df2965ecc4c7de277084ad196c5ae023efb40131855217468f000000b00db21ee4c7db07ba61f09054a349a4429aabf5bf30a6fbe6f0faa3ed94a39c5293267cb1e71ad9ffb5a30a098362cb02bc4254aedcc45d485dba205bbcea72fbad08b7296803d4280c3e82df251fbf36edcdafd4082986e3088c2be31da89502f4ed2067bb25484eb72dd7b9f121b7e3030a27d5ed0f2d1f4af948fbcf5e1b37a161cc9c50b5269c2b107ef2eed364eb25f1522af71e61ab959ed840c35037529a73914a6ed1f28790e4666d998048ca000000b0059844e0ca74310fa86241d4aa21c98699855657ef9ba1b14dd87a3916554c9d025531f8efbaa449d0662342683328e9a2739c3ae599e57161a1763482a2d75de50ffc295b38afe322ec39fd085df8503cb17dbd309ca33e5fb0da5a82615303bbe1eb53da01819710d22e3dbcb6a5e926134ccaf01340e90d371f735d4410df3d88eea834bb70e623068113f1a2739c1bb68f25c8e7d8b8b2e5f9ed909cc8e19bb40ec143bab2e1da9f8ad951140c390000021c000000b024c476408b5456de6abca3842e49a8b01f99aa4c5fa93f709be6ffdbe69e225f9e2a52d00db0222418280f638c3adb8e201cd742f9773f253808e39d617d47f9adcb5c662c4e2980ab2a908984f0d0016337ba4e830069f43abc77909c14019a5c28faffe4283a67c04f9a0868266dc812e8c0f4d174618ffc8eb4eec6f8910d2e1cbb7544da4e72e9a44c9e021172c11c0e92b2049696b7981107819d033439d9af693ff5219d52d8222cd357705330000000b01bf02febc1a99505511735b449d2c7c0fc770b87073091359753d4647db0f9bd80a79b18ccbfde2d4a033187099c7f47f40c0666a4715654b0bf0ce8bcefef785eb54ea262b0e09cd8da72a6616931f0d8bb91c93f85b2ffeb3f929e972bf04455d070bed2b0099e363612589c7a4f5f2c4992454c55310c2dba66f8a37c094857180a7d9b90d35482b413c2c35eed29038d8b61c2eddcecbdcaa2ca5c8f9babf3c67fcc40f5cb0a28486cbf9007e7c2000000b020e404e795a3feb9b8cb2db14defa93dde4b00e5938dc66bb15fa3dd31bd97c4d35ead661dfc3b679317b7ba6757dfa1c6d12d76c42d66b81b43849cd44239d962027695924e7bd2c47cd18be251d9494164fc4a3d840443eac09a1eb27b5f2139aa7c147b8b6b1c9d98e33538b517c1097a54eb45c241eb1c89d463f982016a0d57b1baac4b615b60b2d1c512f8e55f2d60e48627c70a7e46e47fbff146ada2157dee6b18596da705cd815245f19ddf00000fa400000168000000b01411261f214a0906d59e55dd6187736d099067a910414238f5d1f5a840e3df8a806e38ba5dfc5c3db5809e96912e93e967872aa4bf0e7ca856290365435520d03f88e3dd14d489d4e899187d164215c053380c9f222375289f80a6199a0efd2dbeba14a1a92aa38741aa633332ea0a01075d652ddc4bb31e7d2e686825777566c6527a40580aaba20b751c5dfb15898b16161e6a71a6deb78990bfa3ba252a64913251d9796d7d29fdce0600c3a62943000000b011bc1877b0e3bd8f73e4a1f15bbed87f215d4845f55c3975be3751218bb05445efe1f4213c662476896ff7d0515eb5d0e21518942ae524a483fae72491374f6f6b34bf9c74ac1bbd76e89c442e558751d60f118f40599776f7c4f213a1195e80b5c259315f8f10596175b621e0ddda600b1afb0b1c97888e15988e8e49dbafc24c1071653511251d97bb01b4603407a52a53eb2acae93b8012e95feaa7060b06ec431471991982aac8fd50f5c93c347c00000168000000b00cb1c977afad1c6f26ab5d437b1cb3d89951682fa4349dab51507c313f201cc90876d67ba3adb720f1dfd0d2a7d82816267f2ab72baadbf8d897d9239bbd1f0058131ddfd91fcc7f18d25ec9803c63fea45b52d9b5d17dff4eee8e6e0107e272f701005efc2e242581f7c0500f0edc780e0cc10649ad4c3439cc5ccae18c9cbcad367503983ddedbf0435d6dac48f4ed11a0c2809f25822c300dbf4ef8b9b020e76b1bfcea3b6198389a0d407c225083000000b00758f3a97e6ec5c60ff75558c0583ecdd52d1ae789eba35ed4a1bd868215251c37aa3357d39016f1e52965bafebf5e875a34a8a64edc5b91eeffed49a40fb0e35ac8acc22b558a15e24900b38bdea8d3a72724bbb9e4cb005a635a508b696805fa91fd9d1b8682574d55462f0e12fb091afd00cd443473789f381813b03d4b98a3b6208d37eb2ce4802f46257d802eb609666b0eaed3e111646d0092226f4cbbc3d72240362c159090f27f426dfe70e300000168000000b02a52ad6e931629dcb2f9130f75ad353f64842fed5f45a059cc2f679fd524e155b07a23eed876bb786cb2ca9cdbfcd750f98e54bca216a549e84dd833b8a7bd81675c49087c7465be74e5082581de519509cb41d70c7ef0fce02758e4b425f4ec5adbce3854eee43b7c311101214d73d718e76dd18d722bbf4e421e281371d153072118177ee12fdb9b833bd22a16cc9603f1335479976739426a0a6b566388a590ed4337f048d35c5ba46effeaaa36f3000000b02f513dace6c27e95f7d4a8de4bb1b37e02d0b282edcf02b675f5c0ff73caf2a7ec85ecbedc1915d9e69c970cd04d99e635e3ba49aa7621e943eca5975e04b82d46827bcb36d370c77d60ce0e24fab001c7a31ecf426d6b41686fda7713200b5d689472bc0c5d22708095375fcedf9e6a19d02f943f96081fe68530fa9f88fc33a57b9fd45516ad791ff6c3b1cd4cedd32dae5f16ddcacead67a22e1776b326816e4e7f1a8c5a83552e924035e983137600000168000000b020d65b6a8c5a80be25b1ee319b6e5965cd77ccdb6b8e23a28192c03b1a4df416f65d75a13639c3226248aaa3c0c0bca7f98559fac9f107e2f2167acb8b4bd10c1a1aff4adc283056551e5c438097b2fbf5ebc35dd3733a049b199dccfd3919e1179fabf59af099255d50296df09f0681181b895f5846ec0de4c0bca7795c336a57c6fe32b71f8be1ae58e533b26944800a48f46ee45b335a8d99ac4bfbdaa743d125754abf94173dc5e5e5b4fe4016d4000000b0271c41df882f455bc0c74112a172406a7dc3b27ed25399e2f29034b0098172cb120c564307bbf1967d7bfc938b0fbf8373ba5e06e252d9aacb3d7ba23b082706756389e63811ccd8dbd0fac04f1e4686c23c2efa24370607b5cf9c6fee3422669382d97bdde2f3e424e2a24e5c6ea3702de3c50fca441b75417ae95f6f8f248469a3b49314c644b651ce6b4cea4c60bd150526e7f241f9a894f14a491a570cb8a69ad161295c0dc289a6cecb722bf65c00000168000000b005e4ef826260061484024b591ba906a2092853f10a399c9e451ea411de22d00b9aae4cae64858af6538112be88bcc41de2f7ad1c4fa291c0a0d66dadb758d121eda171c427a4d03bea6873e659412f5dc6199da170ea44c58c0c926b643e601da304ead697ff3ff73733d6fa25ab0327080bae373f74d1fb2aaab903eccb99aa357ea85495e4181ba8204dd67eeaec5f1c6c6167b594810d53685afd5d793a6fe2396f0e06d8f57dd31bcf37754dbd1b000000b02fa868628d3dcb202156e3299fe8ce01a36e7b38799d01229c1b8c658b08a69df3bc3b2d21add3d2c7b8246f76c3bc0657501b19c662132c25f56dae819b9aa3df7ec55baf3e05395e29adf6bc5f6c5903d0c10afebf7229e43ad308f6b35a69c3438ccf923a61876cd53412678c5389152b863efdc13c23ef4c223a0555a36697ca8b41fe6f8533c7ca029869da90700c842c104c2dcf20dd82527c2178e2aa130455298481c20f92ff6f628a42efb400000168000000b01cbbea48e65803945155731bde28ac07efdb3349296ee82fbd3873ebc9f18c2f64cf8e3d6885e06352a10f9b6c807083b6cd796c7cc166a4916c6d078e6813ac2eab727c6bf24da1d75a9c42b03e181ff998e3363b95a35ea4e02c50114a2a9f1ef94cf3aa79c254208beaeedc6fcb5e15f1db3e7f4dccbf7fb1bb29d258ce0ececc774ecf2fb7d99dd94ea1a4c9aee91e1d85dfb3358958dedc2da096c199b1615d1f3376f5951533c5f0c85ab1ce52000000b019b8936a60d544580a2e55c1d68f54c427c3f854f947498760215dbcc0deb24f97c12b2acc8db60c72058aef57a5e2710e1e38b2d55bb547511d2803509b9e708bdf0a6d4809ffcec1cb06144492c593b879dbe4fa0279f18827ba3d40c9a68d59187c7a743582bc05acdc62396f2fe0221dfc4cbfd8b1c6dfab12ec88b2ca7237d30f21feb61a58ca3d34cdfeb7e12a26eea59ba9e4e0985c1c7d3ccdb11c29a455dfc5674531058fdec1fa54688f1e00000168000000b01a5a128ea7829b707c90e58bac4754fd273ac2728504295564b3cab2fa44733fcb63d283105cf0d80e033090d2c25e85996884f4b868694703e685bb6633821601050ba05d2f9130ca7e3f86de480f7a14918ee0e4aba55c430a9b8b100315f647ae88ac1764548a5cd6a4e6c483f22e1fa63f2d356c14120ceb9ecb711237c03b868a298c171a0e57378ff0c8e9372a008a4820f4a2aff05a1bec904e13fe4c5505b76b016f29ecb20b3f1d6ed97bc1000000b02ca68b651678eddb4c2b04e6d8b770b7bca054ebdcbc9862908e86234ccccda3305b1443417e76237333832b8b680ae77553431d38bb9416975cb414b032872b370371ef7c633ed4264553431c0eaece13fdac2e2cc018ea41b18fb7d38e012960d90299e6dcf812395ce65900c17f8603168b5448e270fd3c0796795c15f91d8a00f9342f0817f7b491c5a72bee7d29050afc7cd5098f619238130c4ab9e9aff3e6c9fc95d5f1f36d2f5652c2ce433100000168000000b02bdf1a7fb75f3f876b808982a24492ab03c00aa23c6234e9a4fafb40e1e590b38bfd24efdd2e309f1991067855c6de83697a9bfef96d958d358679331fb940a62139426c982bbe82e19b3584eadffc1ff9c24b29a31eb431817cd4fb65ea1d10807582adb1496bb8dfb30b5017d1a17e1cbbe22973cb8c77f9fdf832274a335228cd0c7b60b8d49b8c9c6000a12005982cce23f4382e959e6e8deb7eed7c980430bb0f3283c60ef5f62d1d71c6e9b514000000b01db63e7d47d803e2d820f0365cdda336c506e4bf0c8a14189442963bbad25df95f33556b82527046284c6c8008b826f63b65f6baa08f019f8b2d019966d9fde98301f1738ab878ab15ee81c0daa98b42e53fa91e1237a088ea1592f2d52771b229e0e94483a8db6631dc6ae55a081317067cff4d1a22aa73f18ed480f56b1e32309fb75d08e803ddcdaf64aa3f16bde2239fdacb35e628f4af2d90e94a5e08abffaa90a84000756f6a5c64a1f90c961200000168000000b01163967a8b4c2271b51c53f0ecc982643eb4ed5e691bed5b2f59f98aa329df803146177073f8c15c81daa69d48e5c8af2d2ac4c57d0de3b82c028c4ed622882f9993465aa1a9cb631a37d4db9b10f743278e404858681ea74ecacd975116eb35f020c1ce9696589d743ed64a2bbe82fa09697c7c1f440f178684c95bdff27e208d6e795bd34c47e40ac09c6f464da0712762f0463fe83019f0a5ed7b390ee80469117261e00ef4e34f8144edd04abc72000000b02f435418343859bf56de4fce2cd1e6fdf54cb50a2c8535d7a51946c483609b803fee6f4dd2e3f57551f1160c79699968277feeb36a6ed8f0d093515c73fdb6eb3f374cb5701893b584bad341a4c4470d052b6710b58af703844eee0917021049b603b6b88fb0b38f1a99db52d973376e17d39c38222617fb5b1ee78ac8fe868b4cea899f5c9b80334bc1ed88031a48c40e4e516f55cb767c76c554e92a035e350f916cba2174fbbf8afa397b0982233400000168000000b0213a5edd2529cc5ce7161bad1feb144e1c9a3bb2b017ba78244453da94dd764330c689b03eeeaa2f9eb99f9f10a8cd0ef19730283c07baa844df8d09299c635827e7d6836beaadcf23360b41d64bd8ec668e819bf12e8dafdfcc6479288854c90de5f18b9912e6c4688d3053ef10fc4f0345f27164b9be977a43216451fa8665f9d58cdebb6367eec2ee85f6e0ab9b140462156d5a986a3f71aac00b002f0c67af40e00e9e6961e18e8ff83325b7b0da000000b002b2e79051ecdefb755c3a6f7c424fc51a3e3f2a9bf0f19b5cbb78c1012a2c2f248d09b004ae21f2896a56497f5841908e633b00eeda030082ba2a75fc8958cacbc27ced4e5c286d746cdf15bc462be1ac7c7bab27619dfad12c7c9b429863dae7be206ac491bf48a11c09493f4b4fd914a6deec0f89f117dff547cf4c004f2e25365e80918ebe0ec5a0fd292b0b9d2a01f1ae4652b911551049b0a4078d7e9d68faf7d652e7cec3ef50d46064610b7f00000168000000b01a1a5594349f72a17e85e7c9d36d447bae53962b33e5c6f08a6eee5fc203b8c1f25307381fd7896465e4dcd08793ae5d3f8b47f200726af452a8a1fcac76efbe2d1bf21b346a099d66156cfac8825a45467b1b3ccf4a3410d8c908797f6a793cb25c4883fe51ad762abae0685efac41210a59986509d5a5f50911a4772485814c8a7b01ca0bb3afc32c3dbb06ffd54e82d6516698cea90c614e1b567f77895b6cb2794a9f7a43efbbe4ef4d4e2f9c37a000000b022e564e8172514d2bf6fed10a553f523c2c6d6d4d252cdc35455a063ae2544e947fc48ac76f516d79eb8e0a61b7c8a0a5967b19cdb8dad1e3f9d6c5df2bc519f4577688c127c1c12925363f1abe13ba2d1ffc4e3774d0f3b4ffb292657eeb2426cdcf666b9a41e924e564a865ce487cc21e720dc9813d8db88ba94cc024dd1d851f320735aab4e0e94557b24607f06912056f7927ca2c518496fbd7117e5e1d747d6800393179082a85f6a8d0360be3b", - "txsEffectsHash": "0x9357b004f1ab95bd0ba8f146aa6ec4f7fde65b327f9067081838250ee330f020", + "archive": "0x0cdf664d86731715d9b4b90eb54fc313b6ed470b4d5f7379e6f79f1d123e5c8e", + "body": "0x0000001012e5643e26da426570dd999e0e044e5f83d60f3cd813c55059bc0ea0f4a7c9d413b2d2cea949fa0876265cd8eee3a4dce1e243783562ea07e2de537f469f7bf627abb3d4560e786bafd52f77ac52dea36c50419f32386567bd969b0c38e1bd7405d339cecb99fa74bfd631917f965357f0341d8c4dfe6a8f4b621d8df54c82941d560ac24523012499eeca2594f20ce238b7d21b98ad5c638767d70ee05532c2183e6d64e69b005709dfc4771c7ca5981adc54f3e8bd1b00222461ae90e44eda2f1d4572fe0b0b23100a7ea6d4780b25e826e41ca9e71897e010bcb218887b3d036d44eb30a430b5cfc6660270eb5fb7f274689ac73dfa53ba9d0739fe38637f01f7130af8c5888d4c65ea68109a1d58fe8d7d1ae62098857b0a3a3dcd393ef80ed8bcba6eb5e3b4887a32c51c5853b97a5eb59c87c520f36423c6d7be06071821ca1719330de5e3c51a521778b49cbbc1d53f8ed42e0562bf21ed72e8cb9a410b0e82ef5f7276df41353faef675fb408aeb246b6e2f704cab99bf28d1427e7b0fec7b9929c6effdcd045d3fdcec1d1b73faed495444699fab936630d69b519f0bf4f1453db36439419dbfba703b849d1aa5774fe9a5325e5bf3e7cdda9d1f7f2a9c2a035c72fd4a3e383306aff03448f9accc08a2c665837560cec8675fe2512bfaef35a8fb7df08a81001a7fd4903849c0371dedd87f31295f46269c5205dd00000004380000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000024100000000000000000000000000000000000000000000000000000000000002420000000000000000000000000000000000000000000000000000000000000243000000000000000000000000000000000000000000000000000000000000024400000000000000000000000000000000000000000000000000000000000002450000000000000000000000000000000000000000000000000000000000000246000000000000000000000000000000000000000000000000000000000000024700000000000000000000000000000000000000000000000000000000000002480000000000000000000000000000000000000000000000000000000000000249000000000000000000000000000000000000000000000000000000000000024a000000000000000000000000000000000000000000000000000000000000024b000000000000000000000000000000000000000000000000000000000000024c000000000000000000000000000000000000000000000000000000000000024d000000000000000000000000000000000000000000000000000000000000024e000000000000000000000000000000000000000000000000000000000000024f0000000000000000000000000000000000000000000000000000000000000250000000000000000000000000000000000000000000000000000000000000025100000000000000000000000000000000000000000000000000000000000002520000000000000000000000000000000000000000000000000000000000000253000000000000000000000000000000000000000000000000000000000000025400000000000000000000000000000000000000000000000000000000000002550000000000000000000000000000000000000000000000000000000000000256000000000000000000000000000000000000000000000000000000000000025700000000000000000000000000000000000000000000000000000000000002580000000000000000000000000000000000000000000000000000000000000259000000000000000000000000000000000000000000000000000000000000025a000000000000000000000000000000000000000000000000000000000000025b000000000000000000000000000000000000000000000000000000000000025c000000000000000000000000000000000000000000000000000000000000025d000000000000000000000000000000000000000000000000000000000000025e000000000000000000000000000000000000000000000000000000000000025f0000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000026100000000000000000000000000000000000000000000000000000000000002620000000000000000000000000000000000000000000000000000000000000263000000000000000000000000000000000000000000000000000000000000026400000000000000000000000000000000000000000000000000000000000002650000000000000000000000000000000000000000000000000000000000000266000000000000000000000000000000000000000000000000000000000000026700000000000000000000000000000000000000000000000000000000000002680000000000000000000000000000000000000000000000000000000000000269000000000000000000000000000000000000000000000000000000000000026a000000000000000000000000000000000000000000000000000000000000026b000000000000000000000000000000000000000000000000000000000000026c000000000000000000000000000000000000000000000000000000000000026d000000000000000000000000000000000000000000000000000000000000026e000000000000000000000000000000000000000000000000000000000000026f00000000000000000000000000000000000000000000000000000000000002700000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000027200000000000000000000000000000000000000000000000000000000000002730000000000000000000000000000000000000000000000000000000000000274000000000000000000000000000000000000000000000000000000000000027500000000000000000000000000000000000000000000000000000000000002760000000000000000000000000000000000000000000000000000000000000277370000000000000000000000000000000000000000000000000000000000000340000000000000000000000000000000000000000000000000000000000000034100000000000000000000000000000000000000000000000000000000000003420000000000000000000000000000000000000000000000000000000000000343000000000000000000000000000000000000000000000000000000000000034400000000000000000000000000000000000000000000000000000000000003450000000000000000000000000000000000000000000000000000000000000346000000000000000000000000000000000000000000000000000000000000034700000000000000000000000000000000000000000000000000000000000003480000000000000000000000000000000000000000000000000000000000000349000000000000000000000000000000000000000000000000000000000000034a000000000000000000000000000000000000000000000000000000000000034b000000000000000000000000000000000000000000000000000000000000034c000000000000000000000000000000000000000000000000000000000000034d000000000000000000000000000000000000000000000000000000000000034e000000000000000000000000000000000000000000000000000000000000034f0000000000000000000000000000000000000000000000000000000000000350000000000000000000000000000000000000000000000000000000000000035100000000000000000000000000000000000000000000000000000000000003520000000000000000000000000000000000000000000000000000000000000353000000000000000000000000000000000000000000000000000000000000035400000000000000000000000000000000000000000000000000000000000003550000000000000000000000000000000000000000000000000000000000000356000000000000000000000000000000000000000000000000000000000000035700000000000000000000000000000000000000000000000000000000000003580000000000000000000000000000000000000000000000000000000000000359000000000000000000000000000000000000000000000000000000000000035a000000000000000000000000000000000000000000000000000000000000035b000000000000000000000000000000000000000000000000000000000000035c000000000000000000000000000000000000000000000000000000000000035d000000000000000000000000000000000000000000000000000000000000035e000000000000000000000000000000000000000000000000000000000000035f0000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000000000036100000000000000000000000000000000000000000000000000000000000003620000000000000000000000000000000000000000000000000000000000000363000000000000000000000000000000000000000000000000000000000000036400000000000000000000000000000000000000000000000000000000000003650000000000000000000000000000000000000000000000000000000000000366000000000000000000000000000000000000000000000000000000000000036700000000000000000000000000000000000000000000000000000000000003680000000000000000000000000000000000000000000000000000000000000369000000000000000000000000000000000000000000000000000000000000036a000000000000000000000000000000000000000000000000000000000000036b000000000000000000000000000000000000000000000000000000000000036c000000000000000000000000000000000000000000000000000000000000036d000000000000000000000000000000000000000000000000000000000000036e000000000000000000000000000000000000000000000000000000000000036f00000000000000000000000000000000000000000000000000000000000003700000000000000000000000000000000000000000000000000000000000000371000000000000000000000000000000000000000000000000000000000000037200000000000000000000000000000000000000000000000000000000000003730000000000000000000000000000000000000000000000000000000000000374000000000000000000000000000000000000000000000000000000000000037500000000000000000000000000000000000000000000000000000000000003760200000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000441100000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000064a0000000000000000000000000000000000000000000000000000000000000641000000000000000000000000000000000000000000000000000000000000064b0000000000000000000000000000000000000000000000000000000000000642000000000000000000000000000000000000000000000000000000000000064c0000000000000000000000000000000000000000000000000000000000000643000000000000000000000000000000000000000000000000000000000000064d0000000000000000000000000000000000000000000000000000000000000644000000000000000000000000000000000000000000000000000000000000064e0000000000000000000000000000000000000000000000000000000000000645000000000000000000000000000000000000000000000000000000000000064f00000000000000000000000000000000000000000000000000000000000006460000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000000000000000000064700000000000000000000000000000000000000000000000000000000000006510000000000000000000000000000000000000000000000000000000000000648000000000000000000000000000000000000000000000000000000000000065200000000000000000000000000000000000000000000000000000000000006490000000000000000000000000000000000000000000000000000000000000653000000000000000000000000000000000000000000000000000000000000064a0000000000000000000000000000000000000000000000000000000000000654000000000000000000000000000000000000000000000000000000000000064b0000000000000000000000000000000000000000000000000000000000000655000000000000000000000000000000000000000000000000000000000000064c0000000000000000000000000000000000000000000000000000000000000656000000000000000000000000000000000000000000000000000000000000064d0000000000000000000000000000000000000000000000000000000000000657000000000000000000000000000000000000000000000000000000000000064e0000000000000000000000000000000000000000000000000000000000000658000000000000000000000000000000000000000000000000000000000000064f0000000000000000000000000000000000000000000000000000000000000659000011000000021c000000b01453c45b00e4b9a564ced98590950638ec613525f2e881a1bfddc9b41dce55041cb96d8fd1a78b7078afd21e993bf88d39c6588d4adc62edbf02503c42b0aca6d453c02e06aac647141b005e241d2735f733dea4685536041df64e2d5d13f6c981a0b80bc8d94e3490a688ce4f021ba617b8bb5b18453ac824e66f7abfc703f5ae2b844bcb96e4dd478dd3f17fac851c1745a88c8290042dba40a23434ba28cbea50df7e1cb4951b13fe448ca6fe85b1000000b0262e0b94efbb3bad726526c8f1dfe7abb4b1e277fab48dc1215bdaf2daaf17eaca428361c2f2a93ffb776cd3f5ab9aa13051c4543c88764571504bed12216dddf1eaabc726e9dd84adcb21978d10e875fcd20d5bb4701c278f11d5111487f7cad6d92310aa51aff2065d85564d764aed1fd91d190f1bcccc14c8e71b19f6e722869c851b3c790e140701b5c6a8152fbe0452db67ab4cf63dfc61cb8f5ca63e22091ea15ba38374e02de726572ba9edff000000b02dd564d925644e3cc909fcd6814616363692ef8f79b5120c3e22f33ded265107d5b7518f7c2fc846365afca3285456fca072364b43d0d626cf5e7af2bdd15fbcf19d3ac37b1028f1dd8bcb51ddc4837ab10b7b4e66af89b7c39860314b5fdd39755188f9f6fd178a6e060efc5f4f70ba0a088f687f5f8080b0ddaf90158c2a73cc436d042905c12fdb03b19f292a212929eb704a46723fc8c9c67b1ec2e542ecdf9026e13c9bc55801569a40dc06fa060000021c000000b00eadadc76675966e3c03027b41970b1ab0510f2d98340cbd2d244514a74e181fbcba00a1370265c8e51d6f2b2ad7558717dfcecc7f004a5b1955381b1838856b40a616526f5f88f3d735492c3c5bf245c4bea2e7f83fdfbd2f3bffc373e642e5c89652b7b04e47f310ff7d748def37ff1903ac54d105200d226fa6b707e1bf3f1eb05bf622ecfb4b833f0d08ed05f5c21a7bd8214dd9c6b3f8e2d9464ef521513ecfd64c1f98abdca8707de65364027b000000b01f0bda7d83b5fea9461c09f20640bdd504049a548d8a677550c52f3c56d449ae3a592762311b861c418ee371b9825fb4b6630e80ab1d0a93b752faf048c49fca3acc21049e2600ab45b42dff48e22c5e19fdd1331b597d977a3a2053b11bd5baca5ecfcd302fadc401e3fe74821516d7085cf4cacdba7748b1e26b014350a013c22bcba7853b50bff89c2f39baf53688144f48e0bc1b9de5d1215d249d584cf18b3eca3ad8d5d476f2be4efcf68e171b000000b0204f25e4d7619cffee3075fdda079dffa14823155a070c91b19142135efdefb6df7e17590947558c0efee403208380b9951de8f17d456db2496daf24093ee5e05b2dc1a786b634d41423f0847c0a4a3200f1baa40cc9ced9d141861a83b0063a98daf0501ea0a7fcca1c899a025bc6340390687f63346b7d6f5bbfd96b6f9115560b42286453395c6c91e4a5ec382a8422c9f30cb47208eee3de05eeac74418fdd90d53d13052701ac1da0d112fad9940000021c000000b0073f12e1cff9a046eead73f1163a16f64eaeb1d7107546ca51ef1a787132fdf9cc4b8a99c5e03c03420562689358bfada6fa2143157560dc7ffc2af10e66cdf04271c9edff6f275514103f15b9c14912ea3c83f3c97990cedaa7ce8073792333b5fae87268746e654b82cff646674a202ba29e0741e5bee2fc3c8a7227898b66a49f3c7224340b961bbb17e175b4b0b721ddb15b326174c8e234f66ca2cfe9f7e8610492bd9dc454d1b974f78518f26e000000b01459bd2aa4460f6ea031375aefdbb2302fc2a7665a3157e9262a4ad2db2914060b700b517292eecccbb7f30955a01436dad3ff893676ca5f37592a82617af6c4dbcc61bb2bab9915ea623ec6d89df861ff05f35ab0c6db755d846aa720b435e024d6d7f34aef5870caa8f78f58ae495f2ed80c4b107916dfa0a52b7b5d2062a2ed1d26727d8be128973bb7a8a92082fb1c46215574992c59ea77b48e727f83ba7a2d4d5ec141dc3aa533dc1bc56b797a000000b013e0af63cc1a951806874a3d96c6609c80f3669d308817aeb4747bbca961ea6485be7b3cfebcfbaece59413722538299fb4d336031a242d2f7287d568873c01836657ce7628915aa69c625def994432f4712715fa12ff5995c521a2389dab51e08ce2f41fae736eadfddabe07bd23b33211f86de6e3d0642ad84c76c478007622dbe6d18bde746c76663889b08b1f0200a7bf2beea2ed4c749777d05d7ea21c6033aa80c7bb39ddc98d73555ce590c2b0000021c000000b00cc5d297624d9e9de04c1ed0e5b6514bed3395f3b1e7d9388b668bb3ee5e2649772b5c7e138ab328212bc056d3f542ef5ba9e737a4ed27f6e4e498f38ee6fa52b5d8c39c4787eb2cf07f09234e26efff1b3e8ce5cc0b3f622e33e61882842767270a7c384d772ac037b4af51980250b314d9f15563162787ef401a48d44bb89faf893f198937827b34f1860344b2f057160500199092e854ca0d0be620cf1fe47615a59062f576fe95ced0fe1a1d755b000000b000d65b31e42213cb038ece95de8f5c430bb9ac994c4c7c7f2aad977f066480438c6fdf5bbce378c01202fe5cf23f4de02a8c5f3f58aae3e8f322266cdcb6734e556b3ced61f20a1a1b88302a6c12919a0d5670af43821dfb3ea38bf1ac477e584fed3f19643e136079af552562aca3330112338de69599db6757c2230ec8c5ac26a4f6820a4bc287fb8ed6a3e4fc1d9d0ff2120fb2f9315c8919209d341059f441616b7ef40870d261b280cfe1927890000000b01f50714b0f61347e1523a0688354de8c5e717390f693c9cdef26a584794f39d45eecf7963d224fd97ad699d21271039a26c962c2beafcabcaacd0730bcc1029d9d81e6189c07874989ebb69e94543b6ff8cfdc239c6e77bc918737e6fcb56c456c8d58deade9efb64c5c069489a95dc11e772e285030fc63e5c0e37d34f2bdfbaf865ba339f554f090b4b584a30b8fe40f33ac376d5d3be138b9c7fab3d057372417048cf70d89aea400e904a7244fd90000021c000000b003d759720da2315273c204b6d7890a3965304fa846763837c534fc82e6c322d7406a182ab908bcf5de4d052fdc4147b3656b2a53449c4cf42d38b505174e95cbf63d750043038d8e13a12f40e9b5648aebd03fa3aed192dabc31ed13e8df8c2a136324edda13bb9831a2ea2a00988db60491fb2aa15d91285acf03331666c7ec02b8afa053a9b4d5ebba814e8187574b2a1874e4d1185eadfa13e4ac30902253c79402d7df7582c0f4ee803ee3886d3c000000b00e182cc48ba3dc9f7a8129a07f36070c46a4f237ac372aa8f5dee5646f35d7384912a217b8191d401bdce50de9261caa0121f587e6066f7b2d1fdb69837ebe8f2ed2dbaa4788e76104a3effa9a2faa57c5b5b63e97bcae40bbe8b2fb3f7aab30a31940933c474348e725f5a2f2b0eb7e25fc1402067d8d881378ebfba50e9614849cb105c814dd7b896d27c2d8f692e71a37695941f826ce13d227eee2690db1bf7234f532b3e2a00e87edbe633c5404000000b01656d5f2d23ef393dcf0db547f9160e0751a93ff005f8d9081c06ee49dbf428780dc4353907a7b80299561cc6ba259760ec6873fb2f3d41b929d997b3e138aebecc4d67ea500092036b10035e5978f7da1293dbabdb4226a4c04bbe4fac747ac671690f26fa89a915f6f03d949813ca90ce3dab24a594dad84f32d960bd3c48e27b1ee5b78865d4ae9d6a354881a40f411978d12f93003fcd7a20607b1d862ec6ce06b36715614e8f5b7c07e2ab5e9e70000021c000000b010fc206c3dd60a9c5bb378fa10265e5c97f883241bdca676178f9bd90f24779d263cc046acb4212423612ed97c2cb768a231b7e76c8ecab7fa800a81a7a7e70f66c99d5af353245fba52fd9f66a62032965a15c2aff6b5acc79bf7b4c3913217fe1e70961c24fe3c66d03282bd3151ef23568f4e663a879693f0d938f7a839a8b9715759a7b5eab5ebf7ba95b35b79311735672876b6a3ffb2823890714e416fcfaf0e7649a271ff6725dc917950699b000000b001910e5c283262409f91474c5f1eb313679188181846bdf9091fa522abd134435a1e95c27e0ca7a219be545baa8524aa1369cc99af9b984a585e76bf769fd3a9611195d264371ac37faf8bf7579ba2c1c21408f13dcfb92e0c5211bd46f3bb02ef615d3026f31bb0d2d24872de8651181b084682af96413f36c0fb670d634991841bd68c84f3a4c609a310639586344817e38a88261efea5464e5b42464bdecd751ba5cd7527ef3f4d9c07dd396e713a000000b021424cab97755958a7f27708f7b6957cd098c04ec1d52893796701354d0b04b0dd824aeae0e8f1f8e52cb80b2391dd1dfb5d6a0deedab1807c47a4ca87d3e55dd35761b45973900979f0dccbf4137ec8c21fed026fa08883fab72a51786b7c412ab1fcf56ce3c209b6933dfff0bdc212179081fecb9e882e242b73b6e133306af924efa41f874a05a1f593565d350b80028c375c06eecdcaab96258a7af537e4b320c2c55e5a76259743306b31ba242d0000021c000000b0196f50ae12f37d69b3c5692d2bffc9701b16fbbe8c4bace8fb916d08a99950219811358f28681720e8441eb332fdf13d27319c43ea98351c6451fab622acd699f9d870b83bdd8feedd831d876af7a12575f2173310aa747787e7284e78361eec33d4539442b60e3d178492c3173764400a457ba8afbb9aeccb51d0b311c8ef161fa9e193c1acdfaee2e654c92f682fbf0afd8f3e417aeb619287b2bb46722ee97d2f66b51be6db2e9f3d10f4b9f5ab3f000000b01ce9eb614388fd13206905867dc7f028fd91a5ede7f2fa98acc8be1564ee14d423e688f14241bb49d53fd0a34852ab3984e8ba251e623a4662c0e2aa2cd517b680b432724c56a198752799348c3531616f9cdc0870ec134d35ebbec414ffb595ff3bcb64db4c1d3750ccd66e99134bb10daf5275f7f445a9d210f308470ce0018e9f524b533f745dd04ce2af09ecdefd2c1822e813b90ab70bd703976b2af8c73329b9b867b97d4282d747eea3f48ba0000000b03023c224d5d780b38bb6e24e5a5244b9711016c24cd5b32d185e9b3de5a2760a26ad174049c676fd2d95a79fb32785927a27159459e9fdbbf7816767c9e19f497fe44e2706b99d7ead840afc1263544b4ff3c0fdabc9a63bb5871c623aefcae002234592ee3fc42f0af7f57b72caeb5e20f5444a2d0e32bb5b7ba1657adbc713e9b923287b4ef6560dfb343fdc32d5ba2b3d371411805a0bd78e9543d1f40746465c99c58c957fdbe407612caa0f508e0000021c000000b01f2b60b40f623ea6302aa8024a9862409c01a1850358d9cd64decf4d58a1c5ca213393fcef36a780d5f1b04e519f5ba2b687f3c8c68f3ab4e7e18ac14ce1f74142beaf905805803fa87168962b9ab35b4ba4e0e87a2d73d99a4e5c8152a158621ebaa9b61219c7665bebf743e950a6a3084cc3a6d4412ad42e9fac8f212330cb37d6bead44aceb0a53cc3077ec56b76a1d4d3cf0f45564dc94a66385fcfd2a5d44cd618a2bfb82d6e9c66ff93915468b000000b02f0a536db4fd08da9c1a04ca7dfbecd6aaeb6344cbe6c291385423dad46175b5234e27bf730cb45c5b25cd7db9ceee8ca9cf26dd45194ccb90ef3bf988219aaf6f01d45d525e5ed7bfa30183fcfadb6c5f715e4691449e3ecdc6d1458ebac61072d8a94deb6b9ecf059438281feb210712f25512b17e9be25633dcceec106b877eaae20ef06bfa43a5dddafc1def7ba20d2b172b13147a9a287e4692f88f5d4f9901c78ede1069b45035a1fc996dcf59000000b00569724074fb5a91df766bbeb5ab82eaad0ccc0051a6514a05f00c6640ff660102675a157c49a877899a9bc5cb38879b4a4bb327d58a91303e9c05b83dd1b7f1da07e1cec9f448c05812fe4b2d199d06a04c586287ae58c9f2461e2286e5d71256fd6dc0144c2024b63bc3da657cd04a17ebf37a2cc6d6b597e4ca07566caf900e20d0341b1be9be34fdc49b26b6b18421550c7dbebe16c2418a7a444791ccc66509742cad19e887c96a89165fce7a7400000fa400000168000000b00d83ced7a29892f41e67f6aea5ee7b3825d2ebc05ce53b1c3d44c64bdc34a22db9f3785a63b4d03f05d98e6cc931dad87c1b919ffca46e0583429758f698623f13e949c8091eddd5410c664220aca841f9b62bdea71f13df6c5d9ff38dc71fa6bd1dbc36b7688bffa2947a773ab7c13a275a725e81b8a69323246e8b5390eedb832902fd238d77adcf52573072a72e140205828926b4187da5622b0c4f7dd4a65aead5590c2944b6d04275a94f278244000000b0259a212f37220c66a8e77e9ef68ea5306b69288ca20debc2f785b810de193e30f8db1a84c64bc4b95cec927eb03bf1d30fcd4235224f2fdb867e9520513fe0caf1595a598cd69e7173795294acd1f754babc1a6fd9a1aceb202b64b200373090811ede8be67037f21d6f09125617bb08014ee3b6e8428f8e5ce547ed205ba3497c1653d2ee2dffbf0f8726496773293e09a2b8a0bbc487883023d07bcc1c25c5661dd20d2477cb06398cf088df29781000000168000000b030448e38c0357204e49790a794e244e14276c8636d04bd07c8af983579f8e6d02ea8728bc4a347d2985167f6c8efa1f44f0a7296e18d7448a9d7304a2bfb182d92bf382267155f6c20e9691555855daa3771f8f3907b3e3ab8c4bc1338767ee81b4fa4192a6accb5237dfcc4d2914ab31a04a53a3edee6dafc9f4717640822bb3677a4e8f45db244d4d439718cb96ca20990cd39aaa5134abd9778279610dc66892b148541c08cbfe2f622d457dc69a0000000b01d3bce14929d29c1f39a13afef993127f701f53ea490169185711e58bc23d4058b75dbef531767e3a21e86aa99a9ff1dabad56f2b21b86a0f27470c466c9a42c827128417bb7a8cb94168474902ffd3033dc877f688f3ce82282fa925a5b0796e957ba5518e41e9402fde6ba15f6a689171928e85acd9b642932a563d9ee50e7b800bd0d7f23b788c342c9c8874359bd029b934893b5eb9cde4e8459f0d9a7a9ac7ae86608f0243af50ca11d0007dca500000168000000b0254687b0f02f23993cff900d9d423339c5346307c8d51bf093c1ec708c9f104e6672228f09b9b42c9cddfc269b5ed0760a356f5a24e6376159431928287808981a564f0aad7b935cb5edd2a0c0b3d5bab273178f90de8061eaa02e4f76afedeab4b4d6a61170534220444fbf727cf79e29bd9c12bae5d4d24a99c2dc44258a4d8e2679a0783fd18240694c33ea9514ea0b3da004949cad896ab4016f211c00053ca9ab7ce845b8b3e2ad094f2ab65828000000b0294181e1f9b6790ea814200e3789b6e4e420b0d04ffa697fc11c403a1ca77a1cbe64f3593c4999be68801e385ab9c47debf1ef30c35e18faddb8514ffdd57b6991f354d44a37cdaaf4a5778b26bf2f6714b78b7278a1188cf0c4030207bdf54b9efbe76af64a68193e2ee3e67c365a0707325af3987fe35040d42310d89d02546f456a1cef99e79958219fe9a647781c08751aba0d165f25c64b19455a432df02e03be9c763fe7d433c402cf1d8f57bc00000168000000b02cd7f8c75b75c8ae998a6c26de45f01223d6e2b8e28cdaeaa6a9d89b2914bc9172a3d3e88d2ebe51a1652b798a669ffe279491f7d015f15b717647257ca6f2e903fc7086f43a896ae837c3e755fdba80894f1052e5806ca979c806d0b7f1fe17ca0a301bbd1acca53e29219626a39edf1ea6ca64efb2745480282e3658f55fc36565cd1509d016b2823e0a8b0ebe128322e2a45196fd9e9c4ba6d9d32df0682e554310399ea67f863338758212985308000000b0099b3c1037268cf0b06fc34d08e6f8f69d072b62094161d237769cad734794b02f16b634a1be8e1e1b79e680093b526a48223a43d32f65ebb01513ec00148d44c5c1b7850cab67c6d92525ae0c83cbfdd48003229a1c87db46f25b7b2e392f7fed6148f64615004ec7bae612171b3fc92289cf623db9412fa9f78ca4a3da32b7e5feb13d6e9d549660766ccce969758a2ef89f78ec711baf106fee9d782ccde3ee39882e4ea0153249b3a3f4bc875ff000000168000000b013c81a59b11500d2e42396bbd4ff110f52399e9e716ad257a381ff539c92dac73e484cb6671e5e351eaec78e134981db03177d8b45d9dff62a170fc1b84ebed24bfc1a71e5f2739446f4c6d88e5ae872874d560caaa7a0895393b794ad0bdd9636c0fe1bef02e8ca8841d9d638651de31545c13f1ddd71ad4d73229ed9f21fedf3b493fcf65353d6ba5d2e0e98b507351377c71c346bd6298f87f7bda61973eb38e4921826fa7db46a173f5c605e5ca1000000b00f50122d60b1abb94d7fbdccd58103770f94ff46893e725b28a88a0f7cfcbbf7e3aafbeaf98ee2bbaa3fd35e16f06507dd4fb62767c2764052ce2805d1bc614e148966142b19aee3f01500b8ac4bd8b432e2fdeecdea90fb466ee85601d59987dde65baf9fe7718abb41ebbbb48293ee1cf74cb1358474a212baf1a6b07864c47519c54a0976e1a5587528ecdb95e70000dcbf6887e86b9a48b57b0b74bfd6e22dbd172b8f33a5e13a58bf37d9d49a0100000168000000b0188ec22ada703efae5ee94afdafb370ed5454160388e5412ec145817691f4e5b8f1f92d75d5d11492924afbfb3029683338d6765e2deb40ab005460dbf19f3f13f99ae9ad17714fc0a5146354bb4e2be80dade70aa3451b419f33795c9568d176e446e8b1342512f95cb9a1ae7b1b97c296816c0ce62e306ca507fae5223f29a8b81e4b9f10368884864a8ac8b2356131faefa0a86a015a640446a7d04cbec7a6b942e6ec79a5d3dae53b1d8dcf14e94000000b01ccd2126274af5b76cd6d10ed448e883329e0769f09ac1328763c211c2e88c33825af8f3c0b09e833771f7193c0b60ecb6eb0a68dea3751aa2b44158d7912cc06af4dc483851e0b77adf85102cd78922f852cf1d5280c1d3e60bf3e58535bcf51175e5573307f2c64e4813caac2a2a160a7fafdaac77761d465515d405ee61fda39ddf14c877591379b44c5f7f1e013514b78518b49ed9de57c2a4e08e7d859a1695e8fbfa52475599431ad6685264a800000168000000b01773f6c0d783f530bf1858b343f66299626e43bf786d7d26846b391a5a6eb384971fe47a8c1cfe5dc910f496ccb314dcff5ad2bf783377b76eb99c624a2448e2f2e6f38a84aefd0e2781dd4ecb2e60965442cec23d0d4743f9f66af080bcbbd5ac30430812d1846b8b33eb47cc4cf0ee1ae9ecd1a15d7a92dd0952cdbd44be2a70f8a9fb27b001159ef8d88c2692d10e2237baf5758c3f0478f4655e1a08201d1dcec97e4908061a4bb00e3e1de8e135000000b0014648bea868122778cf300cdbb72d434ab369387d0eaeadb1e8e0efb2071c52f35d4117305f2821421f93ccbd85164a3c4c243a8503bbe8137b572e2337107f2d24be0c927a5b8364235f09ddf6475e6fb141d076e102b3073e5c446f6122f116e5708ff7d9a6c034922ac3868ee7cb2d99f0d26f2c852c01ea7899522ab176e76407791d7a774cf4188334bccce4480cc135b9fe10069b38bb7ec4df37e895052248c64fa46e806dab6c2aafe17c8000000168000000b00381f309b9939b7558333509dac98f269d5a2656885a702daee2157713d4d8df9b9056f1023d31a1b66471ac33702aa139a1a24ecace8fde71d703e99a06f1e596b519b94b357fb57820662b38182874141f01186372949e112260818e337571efc3bb014f9b432e866c5f9edd08b67c2f4f6d02210465c271cb90a077fb9a199eaf6e39c34d056086b7925313c09c0c0a692f399cfd92bef20efffa4d2c2b247ca149743337df730485f52a440cac3c000000b02c81b134ee02b1d34b691d1b5be827a2639df2123098979810bf013dbfa628cffbe16ac296f9a4a3de1a09f77d37a603cc8ded4422b067793d6a765a9a371709aca92f3eda3c896a944969affe2cb1fe8b1fda2cff90f98dab077e26fadf949a5a56ec9a20ab67629cb691eaa3d9d1b60cdbedd385a1cf7aa527f575833f4731a559ef35589e3dd0e4757df2501de74c2ad29b6949dde4b3157af8f020336d8277891c9d1518276cc04a073d0e4fdad600000168000000b0071e4ba97d58f9da74106ca1311f6908fd18b4cedc458c32501e0e482d24e128a02dc5ba0cf072bdf9e38f561e320b445dbda642b7eeb53bdcc3b2305237f169e6e4f322ad86ad8ba76d1199742e6b5677ef1c73814c1cc7f823f0354e118cb4cdd97088718854efcd03e0d750fec9b9113f38eeca55f087aac09c94bdb42646e88683bc94bd3027b1611f020fc505ad2ebdb6cb37d1a145234721b6f5c01bdf70f6fcd53bdc660cbd4611974d79d37c000000b015d6349f425f703c98bc524e67240116c17276769a0c343a5c39cc76452ffff2de640320f8c81c3429fee0146c88822b18bb5f4ca2b8faab323601f984e598161496ec3b0614a5f56e17686978e0fd8dd71b5c90243de9780fefc66830545bf67cdb9b41be31fdcfa90644d67901c90414bda2373d5a2ec0718ee8b0f76841a6d332f9c69555bbee77eb37df1608f1462b701e8fa4423d71fc75f6a5d3d7cb73ac122c242372073e19266d502b79d01200000168000000b02abc447694de0e1023f7ccac6889bbfdf8369adb543f1ddf7ca261b3d34cbe16b7414e0b79dfa5154285087ca3cdbff92b4f816cfb915f9450f954e0273de40264e37cbef6cfdedbfeaf3cf9876176bb1abe57205e4e0d7e99c74f9f933a55afbf689e3172f6b28ffb00c8b84987952a2ebf20d955f41ffecd933707a772757c9b315bd5eba5ee877907b8f05fd9a0d430123e529ecfcaa434cf40b15310d82c6185303988495477f62aec72df7c26cf000000b021902fd3e59ec1cc3db385e4442441c299dc37c1e6866e85d2e6c0fb4566888ada1b19380134618951ad638b2485d63e40beb4a60e2db6fa518424f4be88c7b7810d087df8553b513a89069d13a38581c21c346e37c5a8d6fdb452762ddd1332a767908768abaef2ac8a4d31697528840aaceab306f706fb558f3cd3f6c8c733fa13151c88cfbb5c932533e5f9238fae050cb2b0c325a29631effbab4237d2c9e1f4ee314445cd6dd6db5804d2502b6b00000168000000b0122ebc0b3013682691bb7264b9909cc4edb0d13c93a87157e984a58b298ec5960603815150263297683f0504b3486a9bcb69d7ae8b4b48bb5e847b751b9641f72c35b109dc6bc8453eda247e8bde7732b1a735d2200a19b2df3fa24a567a673445668466a0b07807f68086900b53b58a19e8aa92461135e7177ca6745d0d4e56df9b581ddf8d202d2e71b00591528e6e0d6f590586e363da71189cf2e5dfb25465fa274d0a94031a61365002757c1f28000000b01d9a84a93bc0c2cb6896362c1293e6d2862c05fb64e9e60419dd5002685f6441207736ae83feeb8c04ba2fc30306c74ade26d5cf207e31cf257b728e9525c681f205e21e869a6f1d0043da1b4540261d16698e2f5d9ae03c762464dedb6ca8ce996a9f4d0de3fae29cd5a44eca38036f1d33883181fa2c21e27dc0e1fc6499cfd39a5e9fa64cc44fae0e3a254f105c5113d6169ed5e2e3dc6044f7e85b64efa287955bb79aedcdff31228b9576f48e47380000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000028100000000000000000000000000000000000000000000000000000000000002820000000000000000000000000000000000000000000000000000000000000283000000000000000000000000000000000000000000000000000000000000028400000000000000000000000000000000000000000000000000000000000002850000000000000000000000000000000000000000000000000000000000000286000000000000000000000000000000000000000000000000000000000000028700000000000000000000000000000000000000000000000000000000000002880000000000000000000000000000000000000000000000000000000000000289000000000000000000000000000000000000000000000000000000000000028a000000000000000000000000000000000000000000000000000000000000028b000000000000000000000000000000000000000000000000000000000000028c000000000000000000000000000000000000000000000000000000000000028d000000000000000000000000000000000000000000000000000000000000028e000000000000000000000000000000000000000000000000000000000000028f0000000000000000000000000000000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000029100000000000000000000000000000000000000000000000000000000000002920000000000000000000000000000000000000000000000000000000000000293000000000000000000000000000000000000000000000000000000000000029400000000000000000000000000000000000000000000000000000000000002950000000000000000000000000000000000000000000000000000000000000296000000000000000000000000000000000000000000000000000000000000029700000000000000000000000000000000000000000000000000000000000002980000000000000000000000000000000000000000000000000000000000000299000000000000000000000000000000000000000000000000000000000000029a000000000000000000000000000000000000000000000000000000000000029b000000000000000000000000000000000000000000000000000000000000029c000000000000000000000000000000000000000000000000000000000000029d000000000000000000000000000000000000000000000000000000000000029e000000000000000000000000000000000000000000000000000000000000029f00000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002a100000000000000000000000000000000000000000000000000000000000002a200000000000000000000000000000000000000000000000000000000000002a300000000000000000000000000000000000000000000000000000000000002a400000000000000000000000000000000000000000000000000000000000002a500000000000000000000000000000000000000000000000000000000000002a600000000000000000000000000000000000000000000000000000000000002a700000000000000000000000000000000000000000000000000000000000002a800000000000000000000000000000000000000000000000000000000000002a900000000000000000000000000000000000000000000000000000000000002aa00000000000000000000000000000000000000000000000000000000000002ab00000000000000000000000000000000000000000000000000000000000002ac00000000000000000000000000000000000000000000000000000000000002ad00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002af00000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000002b100000000000000000000000000000000000000000000000000000000000002b200000000000000000000000000000000000000000000000000000000000002b300000000000000000000000000000000000000000000000000000000000002b400000000000000000000000000000000000000000000000000000000000002b500000000000000000000000000000000000000000000000000000000000002b600000000000000000000000000000000000000000000000000000000000002b7370000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000038100000000000000000000000000000000000000000000000000000000000003820000000000000000000000000000000000000000000000000000000000000383000000000000000000000000000000000000000000000000000000000000038400000000000000000000000000000000000000000000000000000000000003850000000000000000000000000000000000000000000000000000000000000386000000000000000000000000000000000000000000000000000000000000038700000000000000000000000000000000000000000000000000000000000003880000000000000000000000000000000000000000000000000000000000000389000000000000000000000000000000000000000000000000000000000000038a000000000000000000000000000000000000000000000000000000000000038b000000000000000000000000000000000000000000000000000000000000038c000000000000000000000000000000000000000000000000000000000000038d000000000000000000000000000000000000000000000000000000000000038e000000000000000000000000000000000000000000000000000000000000038f0000000000000000000000000000000000000000000000000000000000000390000000000000000000000000000000000000000000000000000000000000039100000000000000000000000000000000000000000000000000000000000003920000000000000000000000000000000000000000000000000000000000000393000000000000000000000000000000000000000000000000000000000000039400000000000000000000000000000000000000000000000000000000000003950000000000000000000000000000000000000000000000000000000000000396000000000000000000000000000000000000000000000000000000000000039700000000000000000000000000000000000000000000000000000000000003980000000000000000000000000000000000000000000000000000000000000399000000000000000000000000000000000000000000000000000000000000039a000000000000000000000000000000000000000000000000000000000000039b000000000000000000000000000000000000000000000000000000000000039c000000000000000000000000000000000000000000000000000000000000039d000000000000000000000000000000000000000000000000000000000000039e000000000000000000000000000000000000000000000000000000000000039f00000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000003a100000000000000000000000000000000000000000000000000000000000003a200000000000000000000000000000000000000000000000000000000000003a300000000000000000000000000000000000000000000000000000000000003a400000000000000000000000000000000000000000000000000000000000003a500000000000000000000000000000000000000000000000000000000000003a600000000000000000000000000000000000000000000000000000000000003a700000000000000000000000000000000000000000000000000000000000003a800000000000000000000000000000000000000000000000000000000000003a900000000000000000000000000000000000000000000000000000000000003aa00000000000000000000000000000000000000000000000000000000000003ab00000000000000000000000000000000000000000000000000000000000003ac00000000000000000000000000000000000000000000000000000000000003ad00000000000000000000000000000000000000000000000000000000000003ae00000000000000000000000000000000000000000000000000000000000003af00000000000000000000000000000000000000000000000000000000000003b000000000000000000000000000000000000000000000000000000000000003b100000000000000000000000000000000000000000000000000000000000003b200000000000000000000000000000000000000000000000000000000000003b300000000000000000000000000000000000000000000000000000000000003b400000000000000000000000000000000000000000000000000000000000003b500000000000000000000000000000000000000000000000000000000000003b60200000000000000000000000000000000000000000000000000000000000004800000000000000000000000000000000000000000000000000000000000000481100000000000000000000000000000000000000000000000000000000000000680000000000000000000000000000000000000000000000000000000000000068a0000000000000000000000000000000000000000000000000000000000000681000000000000000000000000000000000000000000000000000000000000068b0000000000000000000000000000000000000000000000000000000000000682000000000000000000000000000000000000000000000000000000000000068c0000000000000000000000000000000000000000000000000000000000000683000000000000000000000000000000000000000000000000000000000000068d0000000000000000000000000000000000000000000000000000000000000684000000000000000000000000000000000000000000000000000000000000068e0000000000000000000000000000000000000000000000000000000000000685000000000000000000000000000000000000000000000000000000000000068f00000000000000000000000000000000000000000000000000000000000006860000000000000000000000000000000000000000000000000000000000000690000000000000000000000000000000000000000000000000000000000000068700000000000000000000000000000000000000000000000000000000000006910000000000000000000000000000000000000000000000000000000000000688000000000000000000000000000000000000000000000000000000000000069200000000000000000000000000000000000000000000000000000000000006890000000000000000000000000000000000000000000000000000000000000693000000000000000000000000000000000000000000000000000000000000068a0000000000000000000000000000000000000000000000000000000000000694000000000000000000000000000000000000000000000000000000000000068b0000000000000000000000000000000000000000000000000000000000000695000000000000000000000000000000000000000000000000000000000000068c0000000000000000000000000000000000000000000000000000000000000696000000000000000000000000000000000000000000000000000000000000068d0000000000000000000000000000000000000000000000000000000000000697000000000000000000000000000000000000000000000000000000000000068e0000000000000000000000000000000000000000000000000000000000000698000000000000000000000000000000000000000000000000000000000000068f0000000000000000000000000000000000000000000000000000000000000699000011000000021c000000b0224ec7c2b1b37e6007d6974a7b87344bd0811a307400c93747925ece0b9a1cbb93dc5eac6f488c5be1e92c031e995d9c3bab51caccac635070c370896e747b62e8824abeea2c3b71aa27c7b1d6acee4cacd7b70b1174d2cc5901377067c181ffa5661d4252bf30d35bf380a2ccb8280b2d0910be5a8df561dead2de383bafcfaaef0f38b68665584c1cc2ade7ad918610b5b0bf28dbc2059d5fdf811e18b826dbd0c0c070dbe30da63ee993e41ac8ec0000000b0050a8c626fe1a9404984e6eb60ae8904400eb11370f4daa5928f1124a39f31c6154fad5e4206a9471c862c83c7d1a301f27add33791a9a7e9d1ea9a03657b2edaa2c0e72d8cabd4100c3f8f002dc230e3731a85bb83688bcf63e4dbe797f5431639c180fb2c679bdbb9ea7befe6c96c42a39fefff30b5e010fe821c26ead8bc4db1288f2505432a1bc7b118b77c07b8e2b0e748b346135c1e1c2420ce4938d268b86e7be4a04c2430049e5265335ffbe000000b02fea155c5d68cd354e9b66fb8ffb23fade2c3a6c0e9bc1fa33e3d1a49a8fb71932d7e60c3b4289375fcedc3dcd4b1f8d77ef021dca2ae9a0f9d99bc9c3358fc89b0d07d8ba50c6459dc788de766ccb9fb5935145aeb80cab053e725546cdb0a86dddfb41e95c8ddefdd0ba521739145c1dcfeffe2e45982a1348e76ae3f78173f122b7bc0e05b3ec9d7e9f41f6dcf4d1179c1270ea584942aa3df0ec3d8b5be39caf18f0d1ff6e1dee21d790021f3bf00000021c000000b011949846714b7ebf644ba3a5f73d621f5e0e1e359a1e5ea53ef522edd0f97f3b2cc1caacd5f88fdae875ce27b1396f3477842bc106f0e15d2f3553411f31ff4a6cfc809211e7a40bf555c0414a98c2217f744804bd5845a8ab6906480b762f447ffc940f9384e001081d9d189f0025eb2d71ef782db7ac33935a289a7d939862143336b1435b5941eca40109109e7ed92c13784359cf367d10ca0ea07b2d2deaa052f7ba06cebd24cdd9911cfad0d932000000b02e051993a495652f214c60a94d32728d3618a31ecfb539550c587a169aaa339a0bb6b9ab623d945191d4f1e03fbf1d6193f84eccca7c34614b57ee3091334504e336fcb819bfee804fe46cdeeca853d65acdabcc53ef27853bddb90741c564bef404fc724d86ec34b3f7b76f6286ddb917ba198f86e139e7f75d99d156961bc2723234baef29a4bc86ed194fd1904c0f1c8516f96c58ad3a4c223e410db7a38d6aa14518bb4c805327401c844c8397a7000000b021251fb1b684122d9b71978e6a2222607e3fccc34a918174ae3161eca14fa757b4580f59945104a52e19ab36c0af276c4ef806c9e5efa2374b5b64072cdf5052aa367ae675d9fc6b1be228931cf1a8ed565ad81408eba6ddfb103827ce370ed0dd2bca47fae0d4e7eb00fa1ba5b2d6e207b8b2290f1af89b8e4d9d417407c6af4b7fdc96865405debb09b7913f3d5146103700298d10eb0b97b9321950ee75f5b09413c44b9753307205d6900a99ead40000021c000000b02ba76e380ed514eaf6cf43648b98a86b38feb19ec7a6901ed169fef414e6ed64fe39c5d5f66a0de6990b3fc7e88024bf22376c3b0d52c223e587ee43848f4b88a3fd469bffa8f989d9501562c63ea93a05300d65a1398cf21227845420b06d9252bd2b781846220117c43f66573747c82d09ca67c6f8aad29a48334ebaa359ebcac75573839f9ab9070dd6bbcdd8e194296674b4d233519f1bceccaab0a138e705562445f1bfb605832912dc86ed5482000000b0016722d5c36fc5bfb60b0d54f3993cd64309b504a5fc4c67efafd536dc52528a7c0bdb66dfeebf8fdb3ed82c3bd69618153ecc110e96f39b74e1166f8a8d9070a9e0edc696f73f4287a055a80c252ff729f2c11f12345394613cfbd650a2b116f131af1586535f87f25ffd7af9a3cb4d15bf3b256bcf47c9e82aa96991c9e5aac9a79ed05144e21fa27498fb03005f5110c2992e13610967927bcf5a86070365239978a85b4f18e33cc498a4f1bbf468000000b0085e37e48885b91a85841795ced74cd60aea13a3eeef7c4882e08c831e9e3cc37600b23b6981d61c9c12ae1577455581c53b149d1a80662938c14a3016154ab86882cb8a0db1427ac81116cba990fec87089ba76d7d130ba54eefc4a1cb18a91e52793d6fb78c17a7fbde46dded13ba52f3d36d25164dec7a68436c2b4b345bf4ef2912c7965fd696900abdfeef155740402c302a564ba8087de176da5101dd57f9c4ef76170b8cdd4e0eca4702423f70000021c000000b00c299584089af354c9f9a40a8d5b2b0adcadc91d91d77ec54e9b8505b1d1dc66c1e93fb03460bd4a3388071fee168a3b3d3faf00f0e150fc630ab608aabe37c30997527a7fad74304f68dd4a2786a696a7bc6dbd7008ca976023443c502bd8c4213034ab20e469490bb09946f30d04e1125dc721fad4273aab7e31886253061fc8267eb387fc464cf6417827cf5091b51e5eb73ea7089b1153eaa0416422676350e1be6e92a0222ee2c2a922d4d9f8c8000000b02c5cdfdc38ac597ac1534b45c59e6459e2939b649f580a30f3db4f201784773cd47835e980835e675c9a0e1044842fda515849014b93f796f36a5ce6ad2c3cb9be54f35f1f4eb4110f6f1beff69370474c9d66e50058c4804b44fb9ece2de5d58cce7f40543a4dacec0ab1055e9c3c71244d7cec893d839a9a36f25388908996289843a1c0cb6aaa3db379edc8802a1826cfd18c6dbeff6fb31a0d9b02709702e0fc184de5871c3e3dde2022994a0b45000000b00b3eb84e9a1bcd9cee7fed45336432a704f6126edb35734cc8575e92b2c1c7da89b6f213f174b043db57b47f23e0b7ab1a90ecee9baf948753962415c326bebae86b44f3fdf1308a3a055d2da4e89e9900f2780074e92abdeb76e60c5613c691f09b99774ca56fe09c190190f00544fe1bdce0fa63d108d9c5e099779ffaef7d05deab2248e19507d3b72aab0efca87112924a9ae03aa4b41f65c27f5eb0192d044d828ac1a0385708b6e32c0808480b0000021c000000b002d8e0db7ee7da9ce8f08e41657512ac36382625991e74f7e36cd46cb6a0f03cbf9d90c262796f03e00c0acf9028af1244ae895b4bbe1e7a07b630c6fb3dac75d0cae6ccdfe5505717268994ab11cbd9de2cb11dcc82122bf1044bfd19b5a012be73703c7f0c7e7243bdeea127eb0faa203a1e3c0e386b8c2b19c9a398fafe3bcb4f99eb8cd80ebbb5b4f9eb1204ce0e102e58ad37799ae221d9e5f1ae0b6c54f4eb64180d9112f0350060cb08a8814d000000b024ecd1090dfbefe4fcd3ddee375cdb9c8067b13ee3182eb67c340ddd1d55baf2a6d0871c970d3cadbce22ec0a080c4daadb8d0e7dca4732e2994ab21dcce56a105e3e235e8fd3cb85f28553619f7d32e6fce5905829c7331f31ff3723763ec380141525e6d17d13fd0dd74f8555dfff204dafc5791e208e87dbbf406a6b5c5877bea345917f75a1af416c7cccef795972f9e34ee3236bfd4e7955d0e832f42a5b1147fe81cc5d7e45515620208024e00000000b00ac409101ffe949a022f078f602d6eaa8ce9dba723c6d9151bf9ad47b26e671860974214480a97daba66b871c6cd0efef241524b439c50a286e19929790d1bf50338b8ec5e666287aff52e065eae8e2ec0aa91d3db9d25ea90ae3012ff0f655b9f6efbdb860cb983ea534b26b62bb04026711ce4f3977b25bb0c6fac17e742c5f5c6357b9807aad5ddd519c7d234602920f32613894fe1835813092a10dd12750f10d44f49c5ba68a73572fe4ab4887c0000021c000000b02a7799c6d11c974b334caaa0e343684c98d41e46fcc8d1402c5db9bf2b25dc1cbcc7e23a169f375b23b236b1b5f4afe57e88024fcd1daeecec35122a60b553a5b2e448bc4884794296f5bddbeaef58a92eb809ced70fe66f60899e732880974cbd654f4d58fb6a37a4725f0579f1f2512647e1b2ea3ab0c553311114577e3e7606c99647b7fae0bc9efa4a2b0eebaf15253e11e2c2eaf2061fc728b5d0b1e0c4b5e0523a4c2c55a505eadfafe6bd0c93000000b01aecb37c8ed0e0490d2ba53a9e8f0162eec3396c9ef8c28dbafb167949999e4bf7e5c39d974e540acd17c6566690b7237191a42f9202257ff47901bcec999c19256a30a55a03a080a7f7ee070df6399c6f76e45764a3fcd2aa1aa203d65231ad238de70450faac96ec1fabfa6d95e98d2e645e3a6d6e77e88882c50c77d486c6c52a84bf565dbde9306a59d36c33140c23753618b352e3426538df87de4c98a43a54947b9bff27b2b4c9f3660927c04a000000b0239d12d5c084b1822912e7a7cd998068933aafd3572dbc95202af3e6f61ccdfbaa7e36cc84df6432110e5df07c4959705558a89f69d1dde613a687ccde9fb7017c77e77113e857585452d46f46888de2eeb32c95ca6a447b4737395528577a14eb8faefa51a9b5b304d44b633d32304819632a9f10b6553583664ed38d092240e16bfd2e30bfeead1bbc8c6c85f686a207a4eb0e1dd6b80b85d29249a86a8c7dc0d7431b05a46dbec1389d46336b4cc70000021c000000b004ef73f190a1d4b30b7613a0be6377050a1293772e68892a37dc6faedaa010026780ec12d99aaad3226480dd362b4461a05c3e3ab9aac851818f5d4ee4480384d82faad6415d57b89b4401b782bbb6c4d94f63c77cb03c31d0b44bf4c998730e964a6c7dd67d4e498addf4badec86816104585efd42c2cfa600ee05aba46f6c9f6b6d72afa4ba2a07b2530eb18604e77230a6ab78fd1ff1c247d9ab1f445ad4c626631fe4b3db913a635257566521b56000000b007b6a088be0df5198cc7f5b5b7057e360fe2a46bfa1ae43c33c1b11e62565d4c8ed2843ec6e9001d8d101ea8453cec6f2dab28c9e11f7b8627428cf6dc7fba1ff4fb6bb9a2418db49540b2f7f419d651f734f0de0f0fcc8b3f9e80dcf4a84b909040dc283240137a0b38ec3449cf406c02b18e061f142cb01f54961a6337964f9c61810a8ff3853030549ed5d4d0112408500da7dcd1ca4befea6e039a5841e1ad1afb1fade0b2a849f3b760add4ab14000000b01faa802e91eeb86e49ce38f52fb92bc345de0773c4b3028cab3b4623fd15d98ce1ba9d78ae1e8bef2d9410c13216fcf69c62d5b2f7f5307f8dc23baba507f61f26be80a11c4bc584c58e78148d2b2cf5b86a9696686a259ec36bc1f2d66f88715afd36c82c76235094081957108e080828c7b78347c58f4c2670730579e788b723201d79d76592656103ada83b9f52f825f1b97cd2c30188214f0f5fa27cdf062f855165cd85c3aedb45cf2146c2a40b0000021c000000b01da368fea6284c0b1ac7c4711bd151200a5288c2540f0844bb61b594dfabfa92d27ea2a3fb3cc310a32bbe01b23ab82380b4eea80b4371d26904d0e35dae0a523efe484e1fb6dbd0e2b2a824e39fe4705d2a5f77c16ee9d5b61bfb0f96a2651c62f77e711e43799e7b37832cc71dae9600075fdde7162d726d7177acba15deff2a0cb5f909a8f69dd466015260d778cf10663763aa338285d025ca18083c06392db22b19601f4f451ac3c87fddeaa37e000000b00a77aea26e32895a0f35ca8f33edece1bedaab0a47a6d2872d3b3aa7e32c0a8c54fc985ae2c77d348263a41b2f47e5dab177e4780fe58d40c19b1c7f154ff47ce5437906126d24dbbdb2eca0b1f16e9868fa8152fbf82d5b047bdedc4c96cee371e0b717c3c4600d1cd1da7374527b8124af1808d6d3b2da6f4b41b8461f693cb614686b430b89d546442dc9fad776e12db3cdcd0e0a0808dd2ed4b9cdcb29ac1d3d613990bc0b5c95fa3601ef1a91b2000000b02b9c1db685fa1533181ffa7e2cc931cb9e37c9c2eba3c8b7ae3338d939b8e7d5d0f8e460dd6cff82c3dfb438dd0aee7ec7ff402ed6b76c2b2e063abf0cf415e3350d1bb097e7a5d1b8d80d0b762f51030cccc62eedc8c2591461973519db94b11ea9e7b009acf748da611c0f02a0bc1f1c744370bfa1927a8c42b32295469849b448f7f9f6a2a23c3648947e823d4cd41e4949a64824c276ba3bb5eaddd43a2a161cf7195a989aab9f9ece53b52a945100000fa400000168000000b029071e3777675ccf43c783664411a4536296b2e3f2024b498fa6aaf5d5108261626ba93e410205cd1cecc245a191d28c9ee45b9891106844903595edea13670735295dcbcad66a1a5985fb507eade338637fb6142cd931091e02a6cbb3a8db4ca8f4650168631418ce033f8a930745e82011f3c5d71e7a29f2189ad77890fa4397bb97f605a3f9817c25a06cd8a0263e1616b32ee26a7401795580bc76a1308cb9f393f6501214bad860561ef25dcc76000000b002f6e362183c1d0bbdb6d8fd9c6eb35d583632bb10b3e7530d30d072b454fd7972f54a7625f8348b4d304fed9247303d852b5638e17eae8ff1fc2f3dc7780c17e4361f94894a625f64ee5dec0f4dd109cd7c201777455f92400af0964bb45676ee846b5a8e93c4f1b9a1eea03dca564e1854303de151ca31f53985b04196c91df6969bfc2d25bd997f279794353ea5112bf6bfb6cc95428ad8e44fe7b900403d448227888e37c2dcac4305e79a1ab41700000168000000b01abd3b7fa2a5ac5883b3a763b097496d9e6d7720074a265d042dd3ca4e7f517429afaca0ffb4c30b42b7244294d246abe1284459cbd0d5478ffe5cfbf364acc2c3bad123dfb54d1248d3c56300aa601f9eb91bc8e5f6591734a4f8c57e90205b964940daf9b789dd2618d4f06958fc3420a8117eca28095fe1a4dd26aa7025d0292289c922f62b6b1e3a9ea3b429fc0527d7c63442fcf304982a24045e7fcccc081e68acdf02066a26031d55d24d6ccc000000b0080cbe71f692d01d39048cd65316e0e2d9c21c469479c7d6a675d9ed13a90ddbbbef866a9a79e14d6f86e32c7d66375413bd4fa108fbaf265a347a2ab3a6366aba861c63206fb4c7aecf52039d9015e33287dc64a37b16f643b720377d84f54a9d4293a1f207b786651821e5a526209f114d92845215f73cca3073b0a7ab83a09d3e28f9a7b5394917172ad2aba9458209065484e6b93b52b48763c0286a548428506317d625e2200f9fab88b747c35200000168000000b017ed0309bbaead176d4d1d1bb4ed44b79307db0490c5989636b1c353fee7cd3ff9bd1a259c54392024c0b61cbefd428591a210a223fc5c314376d3f62854d1bafb59817741c2530095f90d3dc1977addc03f34264e4c004ac2fd06d63cf61e6fb3e8fabe3bef2b894f2d60795984835c00b448e09a5dd8d8148a009d931203884e55b1c45faa4f7d034bc52140084aaf17f6d59c86e69948c4e6c053ba98e991bf0c1c132afafcbcdfc5660ee39202ed000000b029de7c0421d772ed7f9ff46a230356c3eb076561ab77d5d46885db87bac41340ce3f47da491627993ead1a438252f958e85cf7c59b31a0b0f84cb409c0b6772fd6193ea38b5ab1983ef13d3cd4108c6f1ebe25c6a525a7dad52c771a447167dee1d079c9d72aa9b930ef1e6d4540856e143c2e038ac5e0c48f39e2a2cdd686e6ed2399f615ddb363f4f90c834e51638907d226f8a053a623030320fae31d28a7d60ad2f827b8831f6f97083ab63ca45a00000168000000b02df822d92fe3b9e56272ac28fe2b83a4ad81b44371f1acc2718db3c76c78191c318ecf7cd4220bb7bff163bffee729b9ab2db5124e6bcf934fc5e85a6c317076aec4b8d37baf9263f2dfecea8eddbf51650558f907d5b7ce5a6f4eead230912d70c66265c3d74c00a8777260bca4e7cf303be607cfb332b18e77db3df8b20eb0a0c7ab6500299335d7dfdaf4fa254bb31dfce978f6760045d1a363e228ecbc9f56e606974c4f820eb093515e4a75365f000000b002d2dd2302eddd13dec8e7d76a3fe477044e620ed6400686eb000f967d4416b16f94662754cc13c59b93f3f69b68efaf9a86302108309c09234b5ac52cba5eea4898c8c33ab5fb28842e3a1b775ab9dc5c45db32b919cca9f953af71e9340b0b616e272aa6586645137d0358585dadb50e89ff8c0ea94c60d5493734a6fe639b87c08488f55ebf2d192b85276f8c22fd22509a02785f1743f78bae9a3ffe58f3e848fc3df2328f7c330251c844a2d2e400000168000000b025f4c4bbcb68b37a0597aa3b7769f29b60c3fe5189a4c35ad117294640be748d8d1b037512916704d8ed77837a916acd28bcb7bd7681906320c5486ddd74562092261ca6f16efff4cca3b8aae4f37c4c686f7ddc96aae8aa7f2f2879082c313a5610b74dfe4ec469607ff34f68216fc9165934ece363ba2ca369e783b259f62fe39293d07840253e4104c44eac59f71c14ba9f3929c52d375510b51b95bcc5f1ed7cec66b525a0117acd8eee3fa8458b000000b02348bce527275e146128a2d4b53d9b609fba91526fe75e41ba2c662b94c8c14ee3a24b311884be5ea1d6232ab1b1c37b614212288bd492bacc32c6c4594efb0e5859de3c0539d0410e59ab0eba31e570ca0f6c94702bd51b924bce1bc8b938f692dc48c563cbc9635d29b8051d497bc828e7457d3896964087e50be9bc78efc37047f44e873899f64ba988b08cdb4eb8026d37dd407d9186b6809e2ba3f009382c9d0ecc9e2e3d76df5e2f6cc30c6c2900000168000000b01c6cfb5b6a880df7f554fb4a08e2bf6d4902c7b8edfbf9cd2165cb76103af9b0225e0c5199e411b5d5d4054359966059ffc6487c7608852d4d4fe437359d729b44a0243887db5213d1e4ddf1b688852c51b05a775a04ea3b0e916358a587b9e941d7092bc45f74deb420a7e900166e6f108157caba241c732f0993b5ab9a07f08ce6671919fec856c957864193bbeef60ce24b2a427b4fad9ef18515113916252429a7c14cb0a607ce4f2e33ae3ea431000000b019f6b2f5beb736ac7258fa2c1f4b84bb24ef00c8454a3b524ecc83dc0f1ddcfc915bb21ee902dfe10e6bf1e9820e54120ec6d99fb052fb6e9898043506374bf5b6c5e3ef16e1ff75c14d9b5190981bab0c8dbd019866dd4caf90a51c8698183c97b432747f7a29a23b1bbd75f90b7137132d1f8a72edf8dda4261633acc125738c34b5227f272ba13d1995b2de8534a7118fc3257d916617c5714f13153e062538c58d238720328111e127e197ea5d9d00000168000000b001be89d373abcbee7286aaf2ce233de6901a1dd896e186cccc94653a3f3709a35a90d6e3a63eae08eb8f7be15296cfd38b36c15bef0c017f83820e9db16eb0889853edb55ff56eefa16d1419877238340d1c75cdcbeb64e2db48a1ef2a0b80cdde5696c6a42cbe876e80dfa79623cc3e1b2da42f2be111aa5b21bce8dbbc5cfcf7739ddbbf5c2416def0df7762d972261eb7207f7ffb5555b768492eac005babd81120845c533e993f06b05149c3fd00000000b02d86a5d07cb21dd577cd4c8968207d278431fa86f7ecf940b0e59b80086afac8df02f9c49ac46bccf2c7d6211fa2384bf4a5c6cba0db73e449af8a75ea28a34b8fc7a6ee744359f75a8938c26492baca32f34871ce54a7a01c74011de90a7da1e1afe020edaa5aa71c471f90f92d8b27107d0634a44243d60950f60cc50c983d6cb740c41a4d1b9042315ff9b6f2ae2a2e4edd4e8fcfd6e8d0a8649efce0f4605361b6d4f3f6d035b57dcd5d241ee75300000168000000b00a1c1a17a463443d33eb36906ef8567e07644f2fd20dd9a37bd023cc3adfa8e0cb2395b1618ec4b96ed1d170e61bc27c50c078084f1c3d2506c7e0ef6546ee0c63c7896835263c8a8a85abf4023f9d1e79a47b4c623e1c32efe0873e58765a779ccaaba723f843606d0cf3ebbf5d06f9241b4437d69f0861b80f5508ea24f46533e05473eb906c587c2e4ca18e022cee0856fefcd74161817e81a4b7793dceab4dff5e56b3427e8c6e8062d6b2757586000000b023747f71593770bd08e3ed103001fc0e308b26eea05d2babe55a2a3b485a6c76915aeb94c8c43257ffa2b48d427c058b84bcfc05288453f5876ab1aa942f30a3bb3d049998f6774e83d0e40250f305330e267d51eaa1a72803ecd6874752ef6e3ad8ebb63eec7da62bc48f866d3c9ec006fc74a544bd97e2346d8139081a08025ddc2ae4329a8f36c4708c1c12f12fbc2bc3d1e8aa1b0a1db9d55459ca36fa41711ae4c977b90be0356302f0237eff3000000168000000b01d55558b884524ab7e7b2d666236b54c23b281beeca2783f2f9b96c301e9cfb4eb1b56ca1f4bda380f52bbb17add067b62538527a694fb39ebdb92d55e4879bb269e2e03a7ff1e26d647e25e0a5c07f05301947e3de36009facb9ed29d380c93ec0ba98d02674168f646ef1f9042020228139ec36961b2c7e73b275cf75c55aacedf2855f30d9abe4330646585f8cdc51778df2118cf7c59b38ea2fe4e16c1cb04c35a9e69fa93b8df8f3edcec2c9431000000b0083526e4d49653ec0011d56ccbfa097b6b4158cf4623fc48d01403d11499494ac98450db42bd022e96bcad5ced3d8765cf9850f4a4c1b404cb3d8f6d33b6f376cb3b9f01e56bb920868644c657782ca12ca96e7dde4e568c790c18bcf6dd51010d395446e91fe8bce92c19663d3fd0c22db501768f2096d747937bfd971a0e4f339cef53349f8c2d18236b5b374e48eb13cbaccdd4a777d3f2997dce2ff298e97868ffb24093f77c768f5209d0180a3d00000168000000b003cc87d3a82ddbfc436c985f1d3bf84ff98b8a3f93e4a6adeccc23dcaa2180d6a913a433b6d497f8159987f78f9f50b272579757537fe518bfd4a39a9577c4588c1cc7aec4485acca77fd9462215376ea686bea784e4a5f6fda9ce951bd6ebac2cc39df6c26096e69b99d2c1296f0c30305e1ac9c14bd90ae9df43a4a572f57f87edb0cebef2c6aee59af4fb31dd0a811ebc8121fa92eca3ac584a22311fc4c154cb9a8bda12471894734a7c8a54821a000000b01075bef06858e0156fd32093600cc9028f6aa12a2706455fd674f1144e9de3b110db8d7e3e9c59bec215b6d8bb9ac913b837f711b4b0ddec2a704b67133f9fefa3e6563a1bcd639274f0a60be6bdf537659986d53d49fdb34aacd1f65cb1d0f2e3d4a01971ad702ea7cca81238f87d1a297a4de9b92cc0688c1d7bf095c9cfb98207e94fe65624da700850531b123a2209c3fa589fc1924f5099305a02c5c3f41fb6c83a4d6b0e1f131f2da8f91e715f00000168000000b00fecc375cd63b6fcab408b28fa927fec11cc02acb60838c189f6d56d058989fe60951d9df77896b7a671624f6a82a8ae482afd71b3f29f3acb87f86fc212c276a71f010d8467370f75bdb0946749578ecb1c6c7adb6ca7e67f3ed000ca3be85790adbe105f1d43dfb95e5703eb7fb5732dfe8518b10b78cfd99ba50ff88c2550c838c25e22c44098d1f34ad2174ada3a0d8bef6bb4340271d5ee5f7f7a9cfd45544717b01ea8f942e1084e984ecb2597000000b02ca9662cecf693896bf97ddfa259eb26dc1ef6d5a1d6049194e02de3ab29f316e37cba3d1a7ac14980e0732e980355bd700042bf113bc270e097156d122b8319cc8941e15a829bdc2016e1dbefe64716dbff2ec859622862032b09a5d615a6ab05d2f49fd7a7354ec27c299a8f9a868022be65d7f438c6f38dae5a17e90d46d32cfdcdce6212d79201c68c576940af4329e7be9f4e21ddff4785c9357de4e3ed5548077d904b32567bf7c268a1f0445d3800000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000002c100000000000000000000000000000000000000000000000000000000000002c200000000000000000000000000000000000000000000000000000000000002c300000000000000000000000000000000000000000000000000000000000002c400000000000000000000000000000000000000000000000000000000000002c500000000000000000000000000000000000000000000000000000000000002c600000000000000000000000000000000000000000000000000000000000002c700000000000000000000000000000000000000000000000000000000000002c800000000000000000000000000000000000000000000000000000000000002c900000000000000000000000000000000000000000000000000000000000002ca00000000000000000000000000000000000000000000000000000000000002cb00000000000000000000000000000000000000000000000000000000000002cc00000000000000000000000000000000000000000000000000000000000002cd00000000000000000000000000000000000000000000000000000000000002ce00000000000000000000000000000000000000000000000000000000000002cf00000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000002d100000000000000000000000000000000000000000000000000000000000002d200000000000000000000000000000000000000000000000000000000000002d300000000000000000000000000000000000000000000000000000000000002d400000000000000000000000000000000000000000000000000000000000002d500000000000000000000000000000000000000000000000000000000000002d600000000000000000000000000000000000000000000000000000000000002d700000000000000000000000000000000000000000000000000000000000002d800000000000000000000000000000000000000000000000000000000000002d900000000000000000000000000000000000000000000000000000000000002da00000000000000000000000000000000000000000000000000000000000002db00000000000000000000000000000000000000000000000000000000000002dc00000000000000000000000000000000000000000000000000000000000002dd00000000000000000000000000000000000000000000000000000000000002de00000000000000000000000000000000000000000000000000000000000002df00000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000002e100000000000000000000000000000000000000000000000000000000000002e200000000000000000000000000000000000000000000000000000000000002e300000000000000000000000000000000000000000000000000000000000002e400000000000000000000000000000000000000000000000000000000000002e500000000000000000000000000000000000000000000000000000000000002e600000000000000000000000000000000000000000000000000000000000002e700000000000000000000000000000000000000000000000000000000000002e800000000000000000000000000000000000000000000000000000000000002e900000000000000000000000000000000000000000000000000000000000002ea00000000000000000000000000000000000000000000000000000000000002eb00000000000000000000000000000000000000000000000000000000000002ec00000000000000000000000000000000000000000000000000000000000002ed00000000000000000000000000000000000000000000000000000000000002ee00000000000000000000000000000000000000000000000000000000000002ef00000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000002f100000000000000000000000000000000000000000000000000000000000002f200000000000000000000000000000000000000000000000000000000000002f300000000000000000000000000000000000000000000000000000000000002f400000000000000000000000000000000000000000000000000000000000002f500000000000000000000000000000000000000000000000000000000000002f600000000000000000000000000000000000000000000000000000000000002f73700000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000003c100000000000000000000000000000000000000000000000000000000000003c200000000000000000000000000000000000000000000000000000000000003c300000000000000000000000000000000000000000000000000000000000003c400000000000000000000000000000000000000000000000000000000000003c500000000000000000000000000000000000000000000000000000000000003c600000000000000000000000000000000000000000000000000000000000003c700000000000000000000000000000000000000000000000000000000000003c800000000000000000000000000000000000000000000000000000000000003c900000000000000000000000000000000000000000000000000000000000003ca00000000000000000000000000000000000000000000000000000000000003cb00000000000000000000000000000000000000000000000000000000000003cc00000000000000000000000000000000000000000000000000000000000003cd00000000000000000000000000000000000000000000000000000000000003ce00000000000000000000000000000000000000000000000000000000000003cf00000000000000000000000000000000000000000000000000000000000003d000000000000000000000000000000000000000000000000000000000000003d100000000000000000000000000000000000000000000000000000000000003d200000000000000000000000000000000000000000000000000000000000003d300000000000000000000000000000000000000000000000000000000000003d400000000000000000000000000000000000000000000000000000000000003d500000000000000000000000000000000000000000000000000000000000003d600000000000000000000000000000000000000000000000000000000000003d700000000000000000000000000000000000000000000000000000000000003d800000000000000000000000000000000000000000000000000000000000003d900000000000000000000000000000000000000000000000000000000000003da00000000000000000000000000000000000000000000000000000000000003db00000000000000000000000000000000000000000000000000000000000003dc00000000000000000000000000000000000000000000000000000000000003dd00000000000000000000000000000000000000000000000000000000000003de00000000000000000000000000000000000000000000000000000000000003df00000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000003e100000000000000000000000000000000000000000000000000000000000003e200000000000000000000000000000000000000000000000000000000000003e300000000000000000000000000000000000000000000000000000000000003e400000000000000000000000000000000000000000000000000000000000003e500000000000000000000000000000000000000000000000000000000000003e600000000000000000000000000000000000000000000000000000000000003e700000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000003e900000000000000000000000000000000000000000000000000000000000003ea00000000000000000000000000000000000000000000000000000000000003eb00000000000000000000000000000000000000000000000000000000000003ec00000000000000000000000000000000000000000000000000000000000003ed00000000000000000000000000000000000000000000000000000000000003ee00000000000000000000000000000000000000000000000000000000000003ef00000000000000000000000000000000000000000000000000000000000003f000000000000000000000000000000000000000000000000000000000000003f100000000000000000000000000000000000000000000000000000000000003f200000000000000000000000000000000000000000000000000000000000003f300000000000000000000000000000000000000000000000000000000000003f400000000000000000000000000000000000000000000000000000000000003f500000000000000000000000000000000000000000000000000000000000003f60200000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000004c11000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000006ca00000000000000000000000000000000000000000000000000000000000006c100000000000000000000000000000000000000000000000000000000000006cb00000000000000000000000000000000000000000000000000000000000006c200000000000000000000000000000000000000000000000000000000000006cc00000000000000000000000000000000000000000000000000000000000006c300000000000000000000000000000000000000000000000000000000000006cd00000000000000000000000000000000000000000000000000000000000006c400000000000000000000000000000000000000000000000000000000000006ce00000000000000000000000000000000000000000000000000000000000006c500000000000000000000000000000000000000000000000000000000000006cf00000000000000000000000000000000000000000000000000000000000006c600000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000006c700000000000000000000000000000000000000000000000000000000000006d100000000000000000000000000000000000000000000000000000000000006c800000000000000000000000000000000000000000000000000000000000006d200000000000000000000000000000000000000000000000000000000000006c900000000000000000000000000000000000000000000000000000000000006d300000000000000000000000000000000000000000000000000000000000006ca00000000000000000000000000000000000000000000000000000000000006d400000000000000000000000000000000000000000000000000000000000006cb00000000000000000000000000000000000000000000000000000000000006d500000000000000000000000000000000000000000000000000000000000006cc00000000000000000000000000000000000000000000000000000000000006d600000000000000000000000000000000000000000000000000000000000006cd00000000000000000000000000000000000000000000000000000000000006d700000000000000000000000000000000000000000000000000000000000006ce00000000000000000000000000000000000000000000000000000000000006d800000000000000000000000000000000000000000000000000000000000006cf00000000000000000000000000000000000000000000000000000000000006d9000011000000021c000000b00e91e5660f1e83363cdc42f6c64b75d29885b70ea6793ce76a0c309097b88257d9f17f9a493c5c217cb33cf5a210dd95c02de7b06f4bcf66ccc3a80692cc6b9a4e12aae69781e01b4fa9310f70d79af2a431af5d81e0bd5c352b8c01fda4bde8d738822d48ce6148e0af49da61d572140e7917a4b57a1ed652cc8a5ef4e910d5d1355ed76831c8f71dd42b9c061e26460df76f31d0502b792161b2a149f5b36c2ece5d3bea3e4f043febbabdf4d74fc8000000b02d2542f6a5094bc932fe19bdc3417ab9795162872859b74017cc4d85adc22572001f65a46ff7341863e53b64821a69dfe62c8819962751c49d0aadd53980e35b443f152bed55d90c2b7f471af932e8f148ab3f420d9ed63ad05850e054d03b2f634c21a43a000d41e80c1a8554cda6782da1aeff1e6d244a9a287a8f885f372d15e09730cbc176b2083216d8eee2663d1a2f0fdd709fa8dfaa9dad82902fa919d28d5636c7044728dcb1aed916c6a72e000000b0034074f9ac74f35c70cf90028d3671cfbf73ee87192a17c7ed83da4deb3c8adafa081342160722e124d31f4be8ea8740d0084d7117e236a0ba2810fcaf93b7dfd3853320f76b0c6448a8085ed44fb7461ccc24653bc0dd5b9e3c7481d3abfd56d819da15860251f2b523b59b8d50a9dd29d44485d1071f828e00482a115a4314d0b1f4e538f3a47f2d2bc3cdc6e541311c4ee3e776da93f5b8e4eb44ee3257ba513c8b007a452980a15dd383dfdb98580000021c000000b00ba47fdee0ed223a059a604de00aa3c68ee8bfc40ca7f2399027ec9f0374aa75f4324e77920457c38d48784987a0183e09986ff8e8442c5bb5eb261ba71663f45625f159e377f33e537d3d5c030965727a04b47c1fce9c88d3f371ba41940cf1e7bcf0a4f5f294cf2b69eb2eab8d92c31444d60e89429821060f3b11e3d806d5769990460efdb5e9ef7bdcbc61712cf52e6764607ab6866676ccb926b2b90d02dfcb892dd66afc555fcb959e0335a847000000b003279b0ea84d3e719c963baf6d6c035a50c3add4c7a72f90fc0f791edf35f1630cb0b0fb67174bb40b7121d776fa5bac22d7daa7b81bda312d1afec4ea4bec58cfd71df522e807128a9abb76977116c64d40579f785c77ad6cdceb0dd60715cf1c4f96407e239760ffdd0555dbfd2b2f171007e0e65dfda7e1f28fb9b0332247ad6ea20bac00180f75c7a17ada7a1a1818628c000a14e3446cdacb44b5b5c6a344e180305185c7a195358df9d16efc4e000000b00d4deb56dc69d4d629d34d71f3d849080f03b556526c5789f649bae84f076005b81aca5590c60f70ff713063425bef7236de602c3e87abb1dd920a7fea982e361db93916a322e4585f09b9607fc21598347dc28115c6e8982f3e85a61ce8f5dbfdc7ada9f5d4e0c0a0651c0e2e487d27159d76daa98b39b7e8f25ec374818da58d2ddc14c21f0ce9ba99dde413b583a1112d3eb5b153d3214d665965c0230311b25a0e58667c49725d9415f36452ca3d0000021c000000b02f13e4bc1fde6416f7216410dfb9d096f94270c8bc13899ef2bce32017a01a4677fd489a065172226211e56c4cf3ca540d18a1b335605fcf6f357d20eade261b8f92a010bf8d00051d9ced1527b913aaf2dee558d7cdb34a750bcf83d837ef63125ae3ebc6f5463c9d64a64dade3adc60a3cdf63fbcc7a5dca473c39e3e490d82777385374ab4472d80891aa88f05b4f0faffbdf739014df6a14805d435205cab382b8de1c2e5b7eaeb10f22c2cc3182000000b025983674ca296e9a17be9cfc0f273a90b45fc3071ef78b03a137ee4ecd2b894dfebb63b2012d9f62680a6a30e7339ebedaeafe55991130f503e9a40cfb2e837c6d896253ffc8daea5be073b9281866cc1ca09ce8df4a8da61fd11e4d36870ce14260cb5f488ef5a29c54de7fae7f47a60c064028b4bc1d731ce4b11e3f1f62a3e91c3be3b319aba85ab9febbc0caf0bd0da0a6b76510a90de8ae2fc380a88f4664c62778be854e27aa502389f4609c4d000000b00a675282706bf33dccba1d21155e818a20e1f00a8c6a4451a6683e90e39869a88d053cd8614561cf6110f72d36fdf40e6ff18357da417774aa6f7abc91e41dba043bfac52980ffbb12865f3ab7f36e50facdd4b7a3e707f97ec3b38cc08d855a373cb7e92f07e415f5d93b7e326be7ba06c31eb48f8482eaf5dddac5077d6bb18986e377525075baeb3198fce4e2b9642d3e18081b327c5ac4725f221b7b819635ad2e53697b74a8391c6505e2f89b2d0000021c000000b01877efc03cf0fb2a7b4627f3251607542cb2efa139bf24e5a633508705ac0d54f50cef5e83ff321ad9b666301b65f200d92c3ae1396268f00b59af01c0ca1e0bdb81645278039043f25d4c7f1a34ff448b765c6bffe51323c341b2b77b0f8b1c9575d6069c57761740b4ebd93377f0a013c06c0daaa82202ecdf570c15f95f4599be7fb1e2c30b2fd0671be5fb1386cf25404a8fc762eed49fd17dac935ced0372fe0b82de3bd66fc5ea6f3bfb29fd1b000000b02095b02f1863b2b701b1ac3a8e6ca3e8638a3dab08f8ac903601d3980178425ba535650d88259e80a09aaec9060c4a16562d090a0836274c2e2c2fc10723a43fb797a222f378f99778157d8c35bcee96650aee13526d1684bb479e983487a522baa52dd6a90ae6e8d68ab921bc652ce623423fdd91523fc125c580127fef9c75d063bd453c3d5e1a8fb8a2783403a6c2057c560354bf2ed4c026e40cff08576863db4d90f1391f53e50cb10045c690b9000000b02bfbba346a8985f12518f6e86274b5df0ec06d38249eafcd20006e3bee44c3cb097d5fa45650b9c256abc8659220cd206e1fbcd98462b89e4b949e7b53f4c1345fcc547392e9ebcf38c678ce5c2a3c1cf059ccab654ba753a9359ca68cbf0692361474073d8c2f39cd2a37854dc1f13001c99b0683b222313548ffd2f464256d0e9f993efb9a51d57efd14851aad0b6a0639c25f865ad7e8914ad65bff16c5db6148ed6faa17b0e8e0630843ece1010d0000021c000000b007466d97c33277a16c3e44541ac64f032fb4a608e47d8826bba217220cbdf9b79b69285e97e7b49147337c9d5154da8c563440c0a6b27007bd57919ec719a6e9d2ffa7f0f22e3435a95a1e0e340aa3a33560890dc58c053e2e508add5cee11f079518f026a30dca08eb0e56274b3ed541ac8f0bbcba42800209703ed473949460e38ee36d02a2ef79689bcb6b8d746632144525589738f22d766324bd9e1b529d33b59179e99a89c77c2afbf88ff115d000000b014c997c4cbe5150388efb05921216a96f3b21cb434a1949c2e58b506edb35e29644e7ee3e3e275aa670a54112ba0592785fc904ad5185186c4af258e653f12edd886bd245d2c1387eb53810a34f38fd7437f17dfb021f265bdbc36f10d51d6369d051a1c5af56584c8ef0033a9667d79229c889d3beec357018675ebc5c2f4f81c74c3e3e3b14c75f7971f147ee4787704575682a82202f79f0af2f431fe1357059b6aedb951ef094f50218396ce5f07000000b0261f3eeb6f6b8c203dac9e51caba5ad4eed08060d4559d4e9ba66c896a7b87ec01bba35463d767a5534239c049aa7ada6569bd7f9c2c7c0297408362745dcb26df8b2b9bae1c37ced2efde2d6bf825ee790233b1c03d48ed96222fa4308b737da0595a46dc922567db81851ee305283d1f85840a87340076fb59715a808ec2a11207be1cfecd25096b31528ecdb9867b2595549d747b22d07f3bad67a2113661e324c39c3b6b03065dc9bddd0890e9cf0000021c000000b029a92f83f2dfae110f9376e3ac3a360cad24437d6bff64492957945225de37f04a76080f900f4918cad55d8207d23ab5719dbde40211a2f566e218fcf7215aa2ba8b04f68501d3f4b6bf9f8c9ad21543b7019c98341bc4408638ec089b1946c0eeb972f4043b71eb024efca44a326a781c0bd876ab39aa13e53fe60921fd74037aa55917a924b3628849a0fc4e92f5b70e256ceb91224288fec0fc9e2a68a641819870cc0a9e42c6fd3e077d12cbdd3d000000b00983c5e8f3c7ed0bae06285231b4afe725fc69b664c8ba2933480311ba3074526676b7f78f24ba5faf98b3c1bad689230e09ef58e60d097595ba1aa53a117d65f252292d7ff88b1c42592c679230d5cd740889e452b360563b1fb8900106b670e3c46ed84009fb6ae7d6e67c7e8cff7a08aaa583d83dfbef22539e5adb44f28da75635d642152380c06b697a505d9aa8262ed0944d33a0de211416b2826bec479215cccbba4f940e66283ae43da12fd9000000b0094e1d8012b07bad52d9e3851ee6d7c72ec4d878591f3cc700e1ea5af03bcb6b7df5b4a63d4f080881e40302f218d63bac8e21d14a811703ec0a91561efefa49171d360d57f2a99af9d8f000accce2595a982b223f07dc70c5a369fa85616ec9af8d34b6fd43c1437e8e182ff039c43607a7e20af1e4e08873041011959f49ba94a9c32c906ff7f77a2dad0f55d35ea7255bcb9e64803619db2f4ac58505c511a8da7757f587a47db77d000a7f2ff6ae0000021c000000b01eb4bb010faaffe659ed64af195337ddb667d35138d0fb0ac76aedf9f55e26f79405d602115eab2b1edf651e42368e17a16ca009355272bd38d9b7040b5a3c8643c7d7421a61f5979bbda01eea214bd15a1f5663eef1e991bdfb2071f238750a95e89a5928ca6f4e4a9c875655342b931a34a5a2b45fcd7686bacf46a3004cfe57712cbf6bb4ad9f90d1667a24818bfd2ce884a568ccc5f8bef74619529265e604eb963eb6b5fca097e17dc189c7dcb6000000b00034589aa5771c5c13a9f188cf59661089cb438830b7da659daa04df4965f3eb1d1a388e2f1260518dc55bff6ba0bad507fb963706ddf8164e68180c25549b78e3ff7328c442595c88f4092cfce2b578649a090a3d84204aef92434ee080971fd22b6baf5053bfce72fb3b45497bb7ba2c5155e31291d6fef0a30e3f7a56001bea7c6374282955a5a2927d86ea1db353109fceafc125da9330a57cd18c73629b41d0d3edad54cd57e62de2cd1bd57ad3000000b029ef5ea07d26606e71c1d4ccc3379e982c909715b4dbf6ec181070cc72432c17b7f4b45e4d83065c79904a836710d72c34877f00d7c5188e06771be07324e97c44498d336cbba5e8d8bbdc2598c22d511965aba3a1af79f776ae5a8d86b4ecdf43d1472ed3c905a21d8b1e2e829e3b520cd168548c160967f401ab369d0c07eca3ea4cb95ccd6c7aa7b2ffbdacf159531ec19433dc38d057a3f34918e7bd31f344b2f37aa27d7ecaa3461eff83c2cfc20000021c000000b019f00a983882d136916fee5f0064fd407fb023313ae65d4181f2ec9285737bf96ee1f989f0b5fb86a1cc857fa7a965e7c55480faeddf0deb9aee4bd2d6c839ad0935b7a4d0345f2ddb906eb7a597b5abb1988dbcdd99015e99d16955c8d83396cbb03d6e0b599a97acbff9a8e21af8f7241780a9c20befd79400143dee9bfc47efecb4383546de49c093d7230580645d2851627826383b4328f01e37e203738b086080e19d88696b0af7e65eb18221e8000000b007b86c0922887e71946298ce764e204ff0dbf0a4314615e6767ccb48248c3abaf3c7f44ef82844a795a168fb6da64e33d2395b4d7b850a3c14cc327de6fdc7cdd38cf3470b9ff3b9cd1d4df282cb34335b33679f536cc2b2b38fa1c34fc1a4919082dfab221e359d3b065e4a53ea20df0877c1b9fae1801c24b03bfb0014d0bedd34c2827936a912975574dafb0fbcca0be7e5ab68f4856d43e65208673762fe3de05dc255701a92042b96b3d7737030000000b02cc754e4404db839854355b43977c0a4d3f2f04ecea7ac07bce388b5d6bfb54cdbbf39f98a95eee09f03e6b4d660abd36ff76d91b393cb5a641bbe4970cd8cf64ad7e9e6022744b9c1a4afde7ba4683716bb6b968106efba509fd93c6dfd73a2b237173d26bd9090e0b257dd7f159579246e5ed75e51a55a6a154009a728036a963abb446ecf710f4202c036472963f5123495e99741c8a44839efbacd9bc016b287c7caf83a7b518b0d371fca032f7f00000fa400000168000000b018550d6eead26984bee95682340eb94858815784a946515bb33e46d13fa257a712a223d502eae5bbbc18692224da290206ceaca84015a8eee76b2795a5e4a3d18376eda12f489f997ab10993b976f80fe2cceb7e1e37acf028bec433eb265b79f1bf977f2dc70675e17b9260d01fac0c12cf6ce00eff06dcd7e24fe8895aa61461cebc67cde6aa7b9d686a0ecd435b6501c606fec02ea6787a8a9cc94f79caf3c185d20f62f1c8a65b4bad43734d9dc9000000b017f0268a076ef50fb96e8d06d4686d97d835cee9b54c8029da9101b7a674fac298e9ff805f7000802dbabcff9192611fa735c499b4a1ade22c3719afa4cc5a11ce0c493ecee12be6a32cbc0ee3343bc58e239381bafbd0db163205eda4b517989f77d59e6c958c6698b111c80508617f2631aa9e9c5895cf41adb7e4d4c774f4440749555d370688929217e042fd5d9617f5f8657dd1458bbeaeef887260e6230d07dac2e3c350eb8e9ad3352258ace200000168000000b018daef7348cec7ee8a1bb655c7ea4945aa010b24843a47e8cc3d0715103383494646fb2e7b766c64c5891eaa18831e9f6ffba18f304014cd683727a4de98bcd97f501b77a0a5b64329cf74051e855e995bb6390ed665ef1cc327b7dbda117ce37d874cd53597e47e1a726293645ea8a60383ccf4738c28fd20f814365ccf1a670a6d7d6f2e52b176b8798d983a7408c306f4f3b06f19d77ec0679720afd3b78d715d7da983c9b5463c8c4aa61d33ffa9000000b023a4c16370101c4d1d72498a7de6cefa88b6fdfaa49a829ed8d4a7e99212cdf0a1a5d98f5c83c3dc7aed8d0ed86637a2f411370840649717c7b12dbbcd6176179bcb386a00d03f05073239313e093b95ef4f4653c1a1d09ed00751e15f808c9d10d4a6217b40b50fe52cab6f4eed1dba238080fc3bb69cec27ccfb45b9b7951300236b98b1103faf0fa835c4e6e454b50fb42947ced38bb3dae2ec17b2561b7550ef93e4def63f4d1eaf5a6b4a6b00e600000168000000b025c57d2d290181abfafb71143de72d92b22a855fdab73cbed678d5f073a6253ed0becefb28862be21ed2d18bb12f7ec767c68649b0ad1bde168e1a0027afb1a9952543090644727dae23d92b794bc67fda1cc842c9933907724cb05c26eec82f009bc93981a8c9759701494f5782019915825a03969090ebc360c567ad4f1f327959325a50a774158d3f14e31aa6dc0925a4f7e9641efeba107fdf41ad420cac7bf74a2c9dc40baf49a7c8649a964522000000b024c7c77993ee659f5bd0bd87fb2d9486d63ec43bb648b4496979722a781dfabca8f5386e3eae3e1422f878b2f90c75e66f4f418c10fdc0feae6da3a89773f80b9850cd45f75b820d79e050567c0c9a64c3daa145332212e185c12ccea3c2b838f759b7fdb8e35936fe6fcb2ca40efcd618863fafe263838ee423120641a57b09b9d82b3841823c3b8d84b53a5c0926632d4beab1134ca39defee31baeea374e0cfc84ff6b8abd6759d856c52b08d216200000168000000b01f9a2087417d21c5102c497138b225c561b5f68af791beb896f59b51c520abb7916adc345de8eaaba469b274e5acab5436b3625fbe2e32272bc420865a663a3bbdc0d4b719400a2f2a97c4c7ef6be9bc2d8c1987f4e00d0aa11e37c748cb645d1cdf65a4708758bb675150ce826e379f135d92104290749259be022823ddf6f5b6ca7f9110335232b656637b1e8206b404c5dfba55816d18f691bf9c24f37de44ebab7419eb7c001d29a426185240beb000000b019cb9720a0eb64cf1b7adc4de4ee011f9f440528e01010052bc9b09be42e6798ab4b71547112ba616b80989b7765945b0c6e420713dfcb2d87ea1fb9420cc571754399bcb6f2d45ff74788cae2eb1175b712d065284272583664a1be17a4177363a1cbad43ce6571df3bf2c394db94c72bec5e12e2fa12cf603bfa6b3aae72806836e8c997bfdb99fb298f8f5f148d6703cc190698e435e3cde269ae62624082697fb6961a0c13bc075413ca58619ab000000168000000b015674af75ce0aa0a6978f640f9a56cdf1ab4bc0b8aad65faf60215d4ef4c51b76d0f1c1bc4869f0e8f70bc238235292aeda388c3310579b69ffd0de8d770f4262397c35791c70f61e918f4c8ade29c2c987550ce575edab728468f53b823031d73e753d7d557a4bb457c5d60efac0ac705b20f97d42f72db45219b3770a7522ae73244d2327668a4b2947cd9fb20b1052a2f4951cacc80a9cab9f1af497aac0474d51771638a0bcc1402824fad076d55000000b01ab9c5170967fefd897bbab1f5ad150530ec242638a85995e7c7d14d6bbce39757d6f8e25ffc0f464120728b5987539abb546de81c3218ef1d836a96273c45f1de606a0fe605bcdd44bf353696517d2b46d206cd843661e67631f6c899091146d99211730d1bb4a19cb70c37f7acf6381d79feeb40c2cda760c329b3c8472b94c8acb039e9a111197d6cbeb531988f39020d254eb7ecca431d2efe013bc2cb53425cdd24636af081a11cb0544243c9f600000168000000b02259f6d070a2ad1d578908756d5ae0ae72533a28f59ec2b9f3b38cbc0b818f026eb1d753f8eba43542a312c87f946e8b9ef8e55d0534bad29ccc417f27026dada2d69dc11f299162d0e5c3d683f66f74f8bf05a43dac300e6ad49173f08c23d48f42ec670052f01efe2d119631c050c51c09ae73e02d200d2718130099ff1564cb03faed09ae74357bce0f2f113df3881ed6c62770f1ca8d43ed411a8b24e926137faf25ba2b51d01854ab3db3fd6cb4000000b01f4538b53d3d8617a22619b284b15888be61a986eaa19b4a10e12dadd692247f9434112881e7834554a25d6530f2ad50b58784bc5e25ba1ad3ca8a8504d891e05f71d7053bb4a07403c88bcca29f24ac59f30043c4b70ebd70164239eaf127d6f804eb39b847f856d3aa0f79f0d6f8422b1ec410112137add770469321b9124f40eab66e63ef6a9c30522014d3a9bc4425a620722c08dab74df797c6ad3fa1dd8df45dd2817542eeea7d38f158d0bfd900000168000000b026f555571554b5880654d99d0ac75dd4c848bc3e54c20cd3298aa488e0216b33463ad515425a3065435b655419ae42d73263ee7861c3e51db8c0657e8cee980dcbe45b7317d25c00096228394faeae1d52d96a392f4b4cb7dcf4a65df71f2353093ceb630a2986c32b2d45ce25678d0113cd53421825ec6d70470378b05909067029975ccc87fbf849bdb987cf4009d81df355b38a811faad5362c0041dbbcbbae90b765e8add788b3b8defe8e10e0a0000000b026fcbcdb0251762d4f26831b1fa4295ef158f406ed816d7ce22c10325a8425d301efa3bfed6ee5362af4d6943e65e8c730bc4b1f7d064298fea24e627bda89f0ffbd88ad2cdd7b93f197a6cc3426ca215edab1033fabcab0bba8a03ef56c4eeef63bac34981a0ef4eadf38090dafa60e08b3d22ebcf2599e61b8cdb7baf210904d5df6fd240b211f931d8162cfd3c86f28755e94cc54e2979fd864ab96bd4d75e5dad5ae869a105a35c533f4198562d400000168000000b02a825563e4b88303a9490b67eee06f58267c076915a38253a704335dc38bccd4842dc95f0d9c742837ca839eee21c3373f1cd03b985563e51020992b3b666f420f964a6d9a2fcb23745a5fba3f8e4f18524ab037e0ec6109ffa1d1ae30a723767f705bc1917569ad0497751fa31023620e3c9aba65faec2e5962033b45243640cd4bb7fffae37a220960cf9fab57429910955f261dc6a8f84655b819a0d01c5709b8d1e71b92e167c46c805345347a3e000000b016c3d0908f51da34f2d32ed38ea08a4c1833037a5f3f6a09f20ab27e79f697c3eb7d91a8892438c923464c5381689b5681a8443686736bbf37743e23de010dddd0876670586fdc4fc3422846f39dd3e78f4e0a776685b7b9445f79b753d47d74d82771e0add25c1466aaf28746fa42703005b93d193ae3f93cdc068d0f27106b17f21072ccbc66de7e044f07362510af1f3aa38071c5ffc73d6c1d9d565db35ad4f0ab55a1b516a14da52e8430a8171800000168000000b00e3d1e0490a8cdea27d30b1dcb08fcbb295d9d3b6012adb29e6510f9d72fbc61f9d6b9a9d95b87b5af8ba3d1374855e12123692e94c88c12eda2e9787014dc91339c772772826f6173f06d5c8eaed919cb78eeab992bd1e86e49d4d901dca435ffc6e64c46db28d6e0bbaeab8b8b97d414a588fe204f3bb85cf7824f49a131ae7162b32e5342e69a1eec2960db67dee32bf2a62b285087778c2172d7d7a41d74b7a13afa15d0ea4f84167dd1d8220ce6000000b0124948966bfa90628ef99597392741e2ed8cb227be47bcd2cba96d29241b7cf8cde97c590ce4a3147e3ddd9637650bf13c9b3eb2918751a87beb3709b90b00fd259b7785ae3b94e69c25ef0e3b3b7a6d0cb4720be0b333467c7b8119a18f94ad116a81b869e773ec590c5589db381bc01adfd28a80cc12f7ef0b3fa78b312e1e40c5e1c25375c41a76496591c0aa80a81e3c39adbfc4d421f32e9daf92b8f7d1d54e61f2954e63a9a759b6c8e98605c600000168000000b0051b9b68598f8c7da90721c52ac04b934088b3fa7f73b5eb6be14b460f469279fd2160dd1d4910c82a4f63ddcb2e5ef88588d9a5c0661bc44bc863849a7c10020f4f857674741761420d4b6a930f5ef07c176ce0a4f699d9c82621d8e1d614eca705c31e552ad37d0e7f68e5193b42df0f3956047f304960c4ab27e759a8c6c7f712ae1001214e26c00febacbfa4d8192f9f4507385b951f9e8af418a591cc887e91ec667b004a9ca59b79167c3712d3000000b01d9a7693501bdf5573dd7f8df9379a44db0eac42d23892a4a658f9161eec044086ad85559d2f843026e323f55838c1296f34b0fd9199e5fdd713ca6b7bf8b449fa38092bbf96e47f83304986cb1d6b97358d65c1aa89947e807dd57af51393a5193df35a57d463b94cd9c51aeb15c26711ad6188ce1a6567a54375f3a28c633a581356a8696eb13887e5dd9f5be0e41700bd6ed0e18296c32d1f5097efbdc6a260f6ec08ffd32c3f6295dec4e3d5829100000168000000b03006b5f1944203001e0691fa92daba61bbc81e0361e77bd9ff5c6c83a79513f17b4e96a95f86b0ee421a941f1ff83944522ea282545ecbd4181a825005e12abd6fa9715e781ef8709ff43f301ced9705ce601a3ea708ff4b31ab0c5c629ae5440250124cfef228e0af1ed45f55f5a20a2ac8495f893ac2215c6e27edd5704c30d9b266bf0672e3654edc8a3eaa2f4a1b10a00091f75cc9d1d04cc57d61ee4c61f8ed7f51680745dc0c90ef11411cef41000000b01150a750ed714dd6e174e9f23ddc87aa0e781583ba1b8f808520bf88e90ba3001d67deddcc35fe89fcbdee3f2e7e741354527eb44a7af354ae359d37dce64c72a234a850a1b48ac1b5c864ee69b5fa9b606be557468c5e47e710dcbfd618ab2d123b28ff1de181e3b3dabbd1522a20e714b2acc97a88333252c6c3053dcd328efc440c5350b165b45530f03e3cf9dc0e18cc64bc800595d16490950a664f9f8ab4612c1ec51a50abfaa05f19c5e0bb37380000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000030100000000000000000000000000000000000000000000000000000000000003020000000000000000000000000000000000000000000000000000000000000303000000000000000000000000000000000000000000000000000000000000030400000000000000000000000000000000000000000000000000000000000003050000000000000000000000000000000000000000000000000000000000000306000000000000000000000000000000000000000000000000000000000000030700000000000000000000000000000000000000000000000000000000000003080000000000000000000000000000000000000000000000000000000000000309000000000000000000000000000000000000000000000000000000000000030a000000000000000000000000000000000000000000000000000000000000030b000000000000000000000000000000000000000000000000000000000000030c000000000000000000000000000000000000000000000000000000000000030d000000000000000000000000000000000000000000000000000000000000030e000000000000000000000000000000000000000000000000000000000000030f0000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000031100000000000000000000000000000000000000000000000000000000000003120000000000000000000000000000000000000000000000000000000000000313000000000000000000000000000000000000000000000000000000000000031400000000000000000000000000000000000000000000000000000000000003150000000000000000000000000000000000000000000000000000000000000316000000000000000000000000000000000000000000000000000000000000031700000000000000000000000000000000000000000000000000000000000003180000000000000000000000000000000000000000000000000000000000000319000000000000000000000000000000000000000000000000000000000000031a000000000000000000000000000000000000000000000000000000000000031b000000000000000000000000000000000000000000000000000000000000031c000000000000000000000000000000000000000000000000000000000000031d000000000000000000000000000000000000000000000000000000000000031e000000000000000000000000000000000000000000000000000000000000031f0000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000032100000000000000000000000000000000000000000000000000000000000003220000000000000000000000000000000000000000000000000000000000000323000000000000000000000000000000000000000000000000000000000000032400000000000000000000000000000000000000000000000000000000000003250000000000000000000000000000000000000000000000000000000000000326000000000000000000000000000000000000000000000000000000000000032700000000000000000000000000000000000000000000000000000000000003280000000000000000000000000000000000000000000000000000000000000329000000000000000000000000000000000000000000000000000000000000032a000000000000000000000000000000000000000000000000000000000000032b000000000000000000000000000000000000000000000000000000000000032c000000000000000000000000000000000000000000000000000000000000032d000000000000000000000000000000000000000000000000000000000000032e000000000000000000000000000000000000000000000000000000000000032f00000000000000000000000000000000000000000000000000000000000003300000000000000000000000000000000000000000000000000000000000000331000000000000000000000000000000000000000000000000000000000000033200000000000000000000000000000000000000000000000000000000000003330000000000000000000000000000000000000000000000000000000000000334000000000000000000000000000000000000000000000000000000000000033500000000000000000000000000000000000000000000000000000000000003360000000000000000000000000000000000000000000000000000000000000337370000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040100000000000000000000000000000000000000000000000000000000000004020000000000000000000000000000000000000000000000000000000000000403000000000000000000000000000000000000000000000000000000000000040400000000000000000000000000000000000000000000000000000000000004050000000000000000000000000000000000000000000000000000000000000406000000000000000000000000000000000000000000000000000000000000040700000000000000000000000000000000000000000000000000000000000004080000000000000000000000000000000000000000000000000000000000000409000000000000000000000000000000000000000000000000000000000000040a000000000000000000000000000000000000000000000000000000000000040b000000000000000000000000000000000000000000000000000000000000040c000000000000000000000000000000000000000000000000000000000000040d000000000000000000000000000000000000000000000000000000000000040e000000000000000000000000000000000000000000000000000000000000040f0000000000000000000000000000000000000000000000000000000000000410000000000000000000000000000000000000000000000000000000000000041100000000000000000000000000000000000000000000000000000000000004120000000000000000000000000000000000000000000000000000000000000413000000000000000000000000000000000000000000000000000000000000041400000000000000000000000000000000000000000000000000000000000004150000000000000000000000000000000000000000000000000000000000000416000000000000000000000000000000000000000000000000000000000000041700000000000000000000000000000000000000000000000000000000000004180000000000000000000000000000000000000000000000000000000000000419000000000000000000000000000000000000000000000000000000000000041a000000000000000000000000000000000000000000000000000000000000041b000000000000000000000000000000000000000000000000000000000000041c000000000000000000000000000000000000000000000000000000000000041d000000000000000000000000000000000000000000000000000000000000041e000000000000000000000000000000000000000000000000000000000000041f0000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000000000000000000000000000042100000000000000000000000000000000000000000000000000000000000004220000000000000000000000000000000000000000000000000000000000000423000000000000000000000000000000000000000000000000000000000000042400000000000000000000000000000000000000000000000000000000000004250000000000000000000000000000000000000000000000000000000000000426000000000000000000000000000000000000000000000000000000000000042700000000000000000000000000000000000000000000000000000000000004280000000000000000000000000000000000000000000000000000000000000429000000000000000000000000000000000000000000000000000000000000042a000000000000000000000000000000000000000000000000000000000000042b000000000000000000000000000000000000000000000000000000000000042c000000000000000000000000000000000000000000000000000000000000042d000000000000000000000000000000000000000000000000000000000000042e000000000000000000000000000000000000000000000000000000000000042f00000000000000000000000000000000000000000000000000000000000004300000000000000000000000000000000000000000000000000000000000000431000000000000000000000000000000000000000000000000000000000000043200000000000000000000000000000000000000000000000000000000000004330000000000000000000000000000000000000000000000000000000000000434000000000000000000000000000000000000000000000000000000000000043500000000000000000000000000000000000000000000000000000000000004360200000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000501100000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000070a0000000000000000000000000000000000000000000000000000000000000701000000000000000000000000000000000000000000000000000000000000070b0000000000000000000000000000000000000000000000000000000000000702000000000000000000000000000000000000000000000000000000000000070c0000000000000000000000000000000000000000000000000000000000000703000000000000000000000000000000000000000000000000000000000000070d0000000000000000000000000000000000000000000000000000000000000704000000000000000000000000000000000000000000000000000000000000070e0000000000000000000000000000000000000000000000000000000000000705000000000000000000000000000000000000000000000000000000000000070f00000000000000000000000000000000000000000000000000000000000007060000000000000000000000000000000000000000000000000000000000000710000000000000000000000000000000000000000000000000000000000000070700000000000000000000000000000000000000000000000000000000000007110000000000000000000000000000000000000000000000000000000000000708000000000000000000000000000000000000000000000000000000000000071200000000000000000000000000000000000000000000000000000000000007090000000000000000000000000000000000000000000000000000000000000713000000000000000000000000000000000000000000000000000000000000070a0000000000000000000000000000000000000000000000000000000000000714000000000000000000000000000000000000000000000000000000000000070b0000000000000000000000000000000000000000000000000000000000000715000000000000000000000000000000000000000000000000000000000000070c0000000000000000000000000000000000000000000000000000000000000716000000000000000000000000000000000000000000000000000000000000070d0000000000000000000000000000000000000000000000000000000000000717000000000000000000000000000000000000000000000000000000000000070e0000000000000000000000000000000000000000000000000000000000000718000000000000000000000000000000000000000000000000000000000000070f0000000000000000000000000000000000000000000000000000000000000719000011000000021c000000b01ca95a38ee1f625129ed061558e695cd4b41d7eaf046d0605768391e285be2aee719710cf156df888adba93d8b0590f4f69f819fd9e50f462e7999c40ef929075e95981f455df0a571a076715f574c33b2d3749eef6a9597392ebe177779d9a53099a3354fea81e11a21c157273382cb1209c4f6f6c0d1d646d91733de73e575145ddc51b11a3bc640a244da47f7ae2a1f8537c7a78c88fcbc42d42ddecd7170c99c5ed4f6a93df3e78ba0af1fd5bfdd000000b0161bac8b2c06986bffe90c25127520d8cdb7046e3bff807b4e34df8384118e3ddf25c4fe31e1a84a0f334c93a481a56477e97aeea138a3111c0a7fbf537d0c2d6aaf5b25991919f0d8a58b626664d437ad3117fbdc64b890653cc64659eccd56666871917dc0f0d9ae889f147a42c79d2a83ca309601e00641d706e5eea3ac9e5267cc81a65f3c42d6b9bc620082a42f16d61f2a856d98a0fcf9cdd67049ae2585c72139937d0cd6867e836fff780bdf000000b02aef312509e36917fc08fc8663dc25cd1a4e0298a12d0f3ee98dc464d1ff29ea418020f2aafc171ce676e36fee56c97a0695b48e2284b5a981a7c3c02446824968b0819585f696d51a4a7051ec4e1d548528faaee848c3804bb779d88786e3db686bbf034fbccd356e1ed8ce9be347c5067b7d5b0c201dcdb266eaa2e6df90f61c1a7f75efc27177af12a758bf5977ee13ae6b486335f09cfa0778750e00ad038b8d689de623ae706fea9120fd5664250000021c000000b02d78d6eef8cf736377ebb146438eb5b7459cb15634ef863a023cba0663588770c1e04915c9bb9a2e517e6d23cbbde6e622b9930a7bc66d2702749efb59f70cb1074df22c7bbd6e0d645334eb0784858820732491d4429639c44c1d43409b029daed3bab256f8c219764911e8ecd313a9176033138a5bec74725d92f47c84b90979707b0527de8e6d3f15bf20212418d10c1b4ad31f39155574133f7a0b0f60339eedea731c0b0ba8df633e6c285d9feb000000b0079f6d0541b6c739b3e48771404ca53d6ff881dc9d4da1bac755b51bae863556e710a1fab94a087cc73b7f41d8856811984b3fff1a2a56ea6fe1011440e7d619b08f223da43b54b4eb6e1b8567b11b5c6e73b6515dda447a8b8ac84eb419f81649b88361b81671d6f3810db73d3827401b0e62eea6bdb9ce82097bb7a45f8ea9d48612d75ac2a093ff0249af9ad00ef71e78fefdf0beca8c081714c2f0bb5e72e45eb11dea9cf8cc47b622d355c0582b000000b02d9d285384eae7fba6d404ba3f364e6aff97e06aa759523c2e3d3c7d31be8f102eb7f23794a62e380edd8080cf0aee92f2c13f2f42152397bd51c87d4da3961d414e5d18f19bb80a57de0cf21850510cac170b5b78f56d36297efd783212d6f96b26ffc9fbd922cfca7ad021ffc0c72208a1934f6537dd51bbf1e846f33f2466f7364a0534037bc8abb45c0edb35f83e0a90d8478c1967eaeadd68c8d8b3e07a69f6e0cbce77adb2a9816b00178acc560000021c000000b020195a68f64788a6e37f79994170a37dd8ca22f5ede7f4aea3f7b0406d8157e84c81935dc475cdfa378dd7479c8155cec2dc807deb79e2d291fac35c371ee3941886515fa226625387325865746ba43bb93c10eb10e05de31509d4d44d21ddd4cac3d279cec55cdddd7f5fa0c4a63683272f570af77b8b96f829c9340aaa18083590eff4abc26a2507aa85d9edd578691a76a8fe088875b979e4af0180c7d0f2b135478c0b39f6a2b5683fe5fe0533cf000000b0182b5083c3e411527d5c65aa51912f8e13c716079e8bc3c2a5ccd5a6c1b011580d0e9bd42134d35d0398e1aa986e2b01df8e314a86b22f07e97ebcd6bc002dea631cca0ea7d4d910b2e72512295dd47abaf2312b943118f7ea03d101131ab04af8ca7966dd5477dc395bcc09915748da1000a75b2216346636682d5bd621149c902160548c5282e3d0c98e07c77aa5c202a8d2c3a750f27c0690f5784349ef8f28c1db2f2d84cf7fd20e0de81ff09ae5000000b00074fc3e3b2682a37a7116ec7dea4a282ca644c84049aedc7ca4a7319159e21410a67b9e8c20d25f4efa2fb1190bb05d604f7a07bd8f43d0452e45d3a94462abe43b6cc75041518131115ee027e6279b7b2b87645184a484af2e8436f7374282aff01a3e2cd2c503439b82b5340e2c861bca579009f9a13974de1b6e80e4ae2f5cf85d0116a529eb36cbc97e6fa40cb22908d5974ce5285fb5bfd6876f9c62a0e29f7e760f2bd71d112fb23d65bbcdd50000021c000000b0022f1d2dcc23e91d7694e2f775c3bfc39fd032c604b8811130602e0dbe81fb64b35d6bd29aa09236639dbb4b207c405aafbd21a1fb28ea5d16366ffad297a152112e05bfd807dd8ffbb7f0e2422ef926cb83c5a08f91c620cd15a7ea65ce92b647306cdb2bbd8498f6018fcead3c26ce13d2c54fb87332ea4aa6aac79462a532e63ed4a498a2580404d278151f1ab23305ae1299e15459e625e0f8762097d5389c7d9d387076d112bf4077477e6abfd8000000b00555e0e0e6e901edff2b8de8130b44cf8a2001478e7619e74936efc59d19068af0c087e0c4c22b1a6166dc269eb3aa06aab2d7cd0f4ee3cc5701199aee473af09d18b1cc40306f2653d3c40d8a11a8c976c11f7b55cbb4a9b197c6f4f35adbd4587229c682c9b6fbf294a1d27c4b608222133c4ee8e959e855b55d7d097a854c408a47f7e0d6ceca37ed5bbe94dc8802056c764c92ca99248cd60dfaa762e572dda8789bc417ee5904ec2435d691be51000000b020b32425dbf5af5f8729d567c3d791f4b627d4886e20e26969558a3d024d4ddfeb78121609a26470ec015c392295aa92918e22db0429db21641fb9672e95ff7681db7b27a9bbf825a0bf1a1bf8cc6c27d2c687b58476abc19f61f8e56e3ec64c8653c175275ce9aaf8303e6f35fc41360d0068794df68cae9757e31daa0602af1681756cce1caca3e243a364d1b25fc32dbe40564022593e87b604b89b39f6ea16b063f0dec9a02a43b2342e244883540000021c000000b003d86614f74410d1a9df9b6e0272c9f55fa06df978eabbc0b3a196fc3001840658ce6048d5f701defe21570c30e4b197b0a81c2ab1780907c6171b31cef860ebb441eb53008815ccfdb761a2e54222b92e11ae483e189533f71f8da2705e421a5ed0cdf1be8fafb44b243977ed2131ec023d9e4e246fe94ddef56096b142a8964610e1ae3c35e16888d3bddd9461a5e92a9dd1e3d6c8a48a22e5195e9504def180b984c5d2e3a599c19a0b97d8eb4546000000b02c3e9a1d5253c27825a9d2586057d1c7444cee3501a3c6b708641da787c0248daba71884df3a6da55e7c291fd57598977564594312f994cee71f256c8760e19302b56f78ba196dcb606210d6072416cb0b02f726adeec94652b01d72ac29c5f35af053bf9efa2e4b94f476395e597d1901ba4981831938d925c5fc34fa8c448f53831fc4c0da969fc5dba252fe2c364301ca6b500e2c6cb280087018f87064280b6085edb402531f2b78386fe97cb193000000b00dbdc2bdd4221f423c44d0c82e99fec2d08a31902670fda1633a900bfe2c93bb81009c4f4c8ad40acde7eb8dfacc29f9808a86aa99071005ae7d4151cebf8c57d3ab6271ad243bcace21396cf857386addd4f3a548dadcf58b7b421b371dfab2aeb8e1380a7d5e317154441a46ea4da90686a2b4a8ddaa3c11f449ebfde0b2dc4f57a3ff225e31043c324fb1bd7c5b802249897985b79ea7cfcffb297411375b98f0b13d325ac2fef07466b2132bc4c00000021c000000b0011476cecaefb5d1a9ef3f10cd80ed4f11aee9585e0dfe0828cce93232f4b0d9c175605e771a2ecee50712d5b2f38a833444b3923ff6269a297e4a361b9ed31bd020c92c500ce2f91b56c6423dbb7a7c77320f5e1d96088c92f0f6165e83885dd6b63513b36cd6badf680279c4a63cca23f2322e59cb2554943fd983bd8b18b5eeaa3b8ae449c686d3858ff3b24e351112f0da78135f3c0cfd8334df623843e00ba669bc4b634c7f7d29476478c222dd000000b00b36301206a05674a37fa56fcde573448a238dd0310d476a9032fbb38d11025aa46cc5ebe9229fa4a0a5c3ed3f50881edd6b9b859448f437cf1f4dd0cb08e5e6bd7c75461754eb102b237845205366a1162839a0ea0e6fb1b712b0c4e0a575264eabb9273007ddd7540d7a5b222723ed05f2853af628c87f1653cd22bd2a0c5ffe0e69ba81a385c3f7564b35ee6a95f422118fca396e06f91b1f5b3a438055c6e4360a77ac042d51636186f0a4730213000000b02fd8d55e2a5e235e1ae9af58a96134de6268c80c45debded6287598a942113391536cd5df421055c9239b35ed6598a327601ade7123a0c8872a94e7a57bb13eb25b8ea189d8c9df99501be413460a91b48428c82293714c58b8c6649a9b89be696fff91e2fc5a344d816ebe0497e4d7a03806abfeea7f533ae2610bc76eb98bb79423dc9a320003a1efcc901fd1d5a04293e366b0c090a3ba449f6bd169c9d13455875aaf1448c89fc103dccd7d72eb00000021c000000b00d0f46a2cf5cb3d3eb427dceb4200606b38c3e817c35459f88ed1b4e93e7799242e22616b89744025b8027253bb129cf7ff3409e83265502179fab782ffef2392f6ad3751efa13ff99f74a4ac5e85b7dce29aaf90c56f192ac4ba8d71fd9b422928ae18c0028e4a3ef1fc82d56f69a5a247783590be214dea06b39d8cc4fb3264bf73822903b660dbd72900676fba08e2a089119453aa6938431b9f6cb16f70968309563e264c505d994cd5da5010d1e000000b01542987ea6022c7a6e39f22ab19f55cfdea9e820c57199289b79d2b8fb374dba732b3cfee5d9fc664783874c90b87388799e18d11cea2388a609addfe485e28b0fd9971a0079aaeba9557865327789bd329a59e4b28ea08de8b682f50fbf11a475b9466f16d45aa9dd7a00f0e1b2533a2b349ad3e746e48d3bc9ec2135acc5b2cbe5dedf892670a433bc509190d87b152ba025240e0668c5d19d184d91610f26a35d2f6e5e93e7336d7705137351439d000000b019e09e0a94720220e1dde564ca0dcc71b24019f378c7ff5741b7e6864ab0ce4d8c32936b2ee9713907440843f85ac713ec442c9d1d7c566faf7443ffa8d7a538cc8decb4ff178b35fad4730890520c851993fa702064160c616b95b9ce3e2dc06bc6d641774e6b072a4e0fa722978b3e250219c28cc04868eab433c07ce324b1c5a655862700d885ba1b393f5d63a933285eb14a108f1f767f02699c3dd5ddc9eccb133e21a8b00067ba371c23e9be1a0000021c000000b017516321cd1684598fe8175553478f9d79023763f7467df43e3b513884fd8ecdc9f43220e2c84954b1a488b7bcc2c0a90056b1940eec7883889bc95f4f7deb5d27fde5554663c8d20b4e1d4ca770e6245ad03fdb84e3020f043e9c6e00ef97d95e723224320a0ba4e11b6e1b3cabf43f0b11a31e35f0b53d111b2882789a3cc0714d9a4c24576752431d986b9efd99210e2a568d16037e19a31a128047b82ce87714706452326461d2d1d4ddc4a1efcb000000b0272f1bcfeda0d3ff5f2e9ccbaff1d301879e70109d0f3a4e788a4895fc6ee2eb6bac66d562b357cc46b83f71f78e14b15270aca9bb35f4b7d56c3c7f3760b544640865c9c42c8f9a35e995b76a613365318e5d0f1ec6f8a6b4512817f282033312bb1cdc8aeab3d89eee4fd4de68521c0f2b9326026bb90c3364d7a1be46a5630d84c224755e5d86c887eba9e8f2c34c14f3d825eb6d30ec610e7650cab51fa114d5a734e03746231bc6bf09595f28a1000000b01252618e0ced5456fcfb9783af5b459b540e44ba8fac142d6a0411936a96252484d9bc12d95e4c3437f5f2bdb6d361b1f322033c54b1868fc2b092a7e1309cbafe96350dfcfcfd839a37edbc05c36ee31b78f2085d163b201d9e14469f0bc3e0a006b1ae93f081db662fe60a997202f2070eb422fbff7401157c30abf1f3254947adf2357f818e8b23c411c9b65c36f41cc7eeada33c364f5f577f490f7b61981b20d536cab771eda71692ae71e40de500000fa400000168000000b01aabea8444110fd2521125e870c323bab7b67ca0b33925df06b5adcd20716505214cab90fb71f0ff6467b2ea2237e0a9a60fda9c517a3f956c4612d65b9b70f110b0755d399f5b08b3365a588fd8c5a1bd491142f0453f70ef7c8483ad7e518067477ecd2ad49d5ac5d85590642390000aad10671bace8256cc5df3d1a4c0e252eb6367b1989ef8b738369e8535d73ab0c6a5d0caf3c868edfdf8edc08c674ac9f031f6436444a2d5ecb133fb6a1d0da000000b0142af2e21236c8fa33eca343ccd06f89d6239ecca8c30326e7ae712243e67f5bbce19ef32ed2eb42f21a9a16b7c55379f0d88b99c9d79b076cf400e1f7da99075f50acc3e8ceb095d7c48eb3f244b68bfe2189530ba81d1d0ce61861f420ae13d69408ff59f888df052e21d986c6ffef250612869b76f00a9a7f47cbe734da30ea7034620ec4c131e3e5e08a482f65570f93c39830be86ba524834445c9ae73bc57d0e1989b6294320791c94de336b2400000168000000b005801010d388403443ffb94fcfdcd53ff4c6556af2e6a6af93f745228447b1d75cf287b1932853b0e87328296db21fc2a509684296a06e5c14cad5c98fcff9c700a69a4b191e76bd4e046632ff4483115441507877ef902261c608c00f4956668eadeff6f98655f53804c7073af89a6f08742ccf39b6f5df0e0a69b9c3e2e0c3d949afa97aeda2a4656d9540705425d8218b5b59b00d4d3c12193f4da8af141370c1ab428be0a64b51e792d9ab9662e2000000b02376d97a96663ef4db5907c539400b2c546e2f992ba3e7f91a34dd8c3d50e106283aed41fec55988b71e9bb7499d5be2902287b5ec2fc131729737e4c00a2f11ea93e133a890101e6507114926bf58ae9d539a8598b7e0414929ba517cf5da85f036b18eed826c36a7c1a827ea042a46295e7713134707568a39258f29fc09619f07b93bdab66721026a0e013268191a06f287f711195409702278ba74a46e9d0edc05079dbfd7bf17bbd027cb1e173b00000168000000b019160db80a19c8b9cab1fa7a906c095c43892862c4336a08279996f7906d5302977bdd8dfebe256c22d3268141e557fea2833a51ccb6f1e8ff89437655ebc6843aa4f58cf958374b30131efa824f70985738d0ce9cbfef8316eb0ce20ec9c667cc24600a46fb50a17867cb773f66b72d06c72d35b3ac267fe6c1f1487719a8a8199ae156cbcf45ca920a2c449947fc5b105c743a64d9cd67c936139afa452617628ac1710b1944f2be37846c0bc74cd3000000b00fcddd75a85a0410045d15b3ae95ae7091cf4950699307fc5d74e27c43c5417ae115cd1e9bdec80fe3696c4093cb27ad0e270f5069aecbc274479fcf6d22a527652d89152a451303a95a8af8ff85ad49753cfc5d1bb7cf0d1a6c64dad8661ca120cc87e5b245399d5d14590f6d95609c1f4f0c1d7e18ded0e84c15adbd430f202ab676e1c5fadf0cdbe3a8491941086e0dafd02050d45c4eeeee9fff911f9c2a02e9be660edca42493902891559b100200000168000000b01402ec40a2cab35f51de2c07f95ac799b6e364a8c295fcffae1171b6718f22df630b270eb101df0d51b0566d45e34b08fcc01b5af9dc1de33cbaf21235913e02e6d03faea4635b6ee502ea9a41272731fcf22d7afd3dde20febbf7a847b856fff7d9ebc8ef35830d387b59ca4c2d68ae28c2137bf20812afc0d21ca795a653514f013d77eecbeddd78794f4874d078b312540cec5690bfb612758d485dc0d1d2077168c4991e17adde777dcf87960518000000b01728363bae09c7c58a1c8e7da47852da7fda639ae583a6e5e8dfae0caec68c6ea608844c646106dca5112c70613d2d1ee6cc6caf6d06f66c9900679a7f9baa15a41e645a5ef74ce8ede9299c5905b679fd3edc642af9b4f5003d677ded06def3cf660db411788fe79904c9aead2c5312109fe1a897863be88ca321d3eb876d662b3f681da3cbb292d9d7fe2ae529854d14fff43b678d0d5fc25754542287b29b9e3c7f44a5ac952f390522fd0fdf4c1c00000168000000b01f549eee4a32a28c9b2bb37a3606f08533f625efd12423f9c9fa5f29b2da938b8fe57a3414136b4712e24ff04d1c30114dac904507a656b4b1bdb660eb56e514657310b2ae780a65b336b3ee48879b4c8ae8e3b2b212d01d6ec87736a172ffae53b1791a72368f60e585e539175f3cac2eacd236b7780801e5fa41b5ad9f0d3c5c06d05c25eb5a55626d76e90f7bb02d113d089c96b79a68cd60dec8e8d47357a320965e49fb1d47dc0d0c8c783c02ac000000b0030e88a546b545bbc1c24ab72f4b01e5868b303682f78768dc1fa3c95c07b5d293f96710e25bf3ca9ae89c896cfbf5904fd93630e7dfdcb79f6f5f5b5c0fb4f36637f0c6e3dc8f4a7216dfcb465c7ebb3cbc57c088fe69233bd69fe3dd75a7f1859e4eaf44bb3c5e70ef8239e3bca8422cc01c4b11a2d1844d9fa569aa964fbf03a9db26f6fda73348e23cafe715c66e1cf99149206b507c3ca7de2e7468496eee3978cc32306c4a2d959d0500aa4d7300000168000000b0003f85dddf77ef920f6456daea356ef7504c09dad7b52654c14ec13436c93fe210d4e88c40d9ed7c298d97b735407a1c92d307e5c45827dc09c7e8288d8b6ac463c06f05e29617f02265d6fcaaa46db39d0a29252c363a817a592be3294a365d913bfbfa3ff0f3c521fe36dd06cbb8e10e2ce8c11b1314b679236de533dd532782cbed680bf7ea05330cc9108dbe7eff231f1e9fc34c519b395c6671c556a382681f24d6133d11ae0710b2f9915555b7000000b0256a415d7e18d916e7a037034e665f4fbbf0d3e44da30de17e61ccd0289c39b9abe577d52a444c7acda034103e59613ccfd13070ffdf034404d132f3f2788b8206e2f6178f4bc581099dccfd7c472797303619c9fbfd6f785a797b847e2bd5d3a9933524c88fe95db986dacbadb9606f205b0691a545318143db89cf970b124304a13fefe696ca415988aeaa961f9eee2e978cf7ed017770e8b4c402a79a23aedf4d90cdfdf0c14fb42621470ac0fecb00000168000000b000b0251a8c8b697e63254b6e5d90dfeba98f2e270aa5cdaa8da09654be25b22d7c5ac3b2b32ced096a2247bcf6e22bd089a8ff68bb408394d0f082db4c819f1f68f805e3b77783e7f58a87b19d317a27aa5a785ecf31b5610379e707d9b035dca9be3b3ad252e74d69e12cd422c5191a046dcf6b0a9091f90b71ddf7de1fa1b9aa2db03025fcd9d1d57da2fa21fecbff16d701e48a3ab9fa67f27e630c9ff6c35447b8c2a929bc9b41856bcb3ca7ec6c000000b004ffa1bc1d6d5d031bd09fe755fe127fe14e92e5dc54e0875420fb308d1051ef16338b5dfb1a8bf282d6eed46b9ebceb2bd49df96fd8be0e82665111ef7a195331c33eccff09ac2842f30648298cdd67d5b6035fd24bff8d994d307f66678153928cc9828f0a53c4d55c5a545eb4b2182732a399013a28a1531355e118e2db0f3f26cb369ad10026d95056906c36910523db6209424fe9d93364c5b733b7af9a531de34fb4bb9e8051ac083a6abfa4f700000168000000b02405a96f61f6ef17a02003575a93c878325b287271b7faabae157688ccfada728db465f5d52ad87ac5e3a3dcb7366c0393eaefd537c59872fe37de43b20c5e107e316c0f954cf3eaec16a7de2a00b587770caab251796a9db9242caa129be64c2c9b634d36e002864bb39aeede1035002c0238ea14c586e2d28263066f76073432e9b9959df798f7447f2d98c2e4ec290944813e456182a83af14616b794dcac9a7f132de33dc9dd5e06b2000d5b7d8a000000b00ab3b93771986ea698e440ec3871c28ded7e0611832e0e03231bda06f03488910f5e8f9ce61d5882804ea19e681138d454b4035527cf0085035cbf5cca44b5b76597fdd0950582660d0e48e0e5599fff64c8ac62aa5a9d8481b9014688e56d82d6ae2641c438d456e46d3e2c46ccc20e28970cadce6b8eb509ddb0daca6ae2b96a175d3c4ffc2c7533a784dd435caab805a109472f9663b480defeeb0f8251c068db62e4e8d8bd295669c565a177609b00000168000000b01fe15c9b0ac687152364aa6a592e7ad6ba2164986c490feba56386f72b878ea0cefe33a105c7916a56369b03372a73d74f20bd1a2b73e4bb4837db1d62ca8d938c5c2959f014280708b7f9a57cfaa2142ce864e671ca470b7572b3c7118d6cf4f7d1612a8ab79a4287e76e819e8b3a6a21f22e8fc5a446259a7c4e8157a78391ac58e513fd848d27c5c2be6e05ea1e4927f75b55697b73097a77a351bb45531dd6826db6c204fb8ac93780d6ae41ef95000000b0205c2faf1c063c87c3105e9edb3b62f8a5f69299c55982e3c72363b75583e1fa0a1c94613b1243cf6b222c2e59d56d86eab043092e8f1bf5f4ed6bc5c8d6a199e56b356daaaa01539be90b4bd8999eedc3f9633c5ccc6e9a758368bde3fbd126ae923ad54ecc0466fd29c07e392d4e021bbd3aff6dc886ad59af0a2970f3a2975b11441578477a1b41055c137ffd099c2af3e69fdbc176b2b286bb6b667e694ec4ad96435aea93fdf0d487945f3a00e300000168000000b0137ba05eab7fbaf836b206b29d27ba39164abf627a8fb9067eba299fcfa6c162f909f6271a82392ff84a5fa4997e028a1fd0ad43f39ec30ace1592796f80eb3d714382ada1084adc94ef2eb1d6190e0c7d5c74e6d043ff3ce7544488a2148a13d9c8b1108892f3f47d18ab85a124870a1440aeaff103d7594a0f2161a4b19ef06ef76f5997500ed60f6c18b1aaca535718dbec7a60c1b7e8a59b699814de64d8c998a074402eb43ca857e3d938b0a154000000b02f29eae1fbbfcf45bfa87be2d3c950ff524e7c4bcc0543fca977fcdfac6a25d20e6d02b1f70e6fcdefe35969bd9892e28a50acc30e1529cdfc977d0768a0c97651ee012ad45b9820072d315fcd5cd4fea47456d00bd7890e705f99c99ec5ea42d3e31559cc87a84fc701d71db0931d3f2459fb17c6a46d9b0e7a533507ad0e6ff2c11abf8202311d37d3db4c95a6f618020fd85dbec80ff7b16bf5c2d69093f7f0967430d16fd435465a1ba3105e36ce00000168000000b03007edb592d74abfe475aaa44fae51d0b54b2e679576cf0be0c24296ee14c9175cce60fa5d7e14b67e11bee1ed2130de0fd24c1d6bb2ee518d25dd6f35db87f1a91e83b1c90921af6eade9ccf7fdf8f53cb682faaa8bafd42751932223715c4e778ed35d788dc7f557b7880f0ccd11d503fb3535bfb10f64195e5d73afdb9cb5e30cb93679d42c2609630c08f4869da822e78a9fcc0562f31eba8a2b3af47867ea2b619c8377825108a7fcaff617849c000000b02316545590a39dbb9957ddcb5e5b161f9e57ccbd5c60a5b87b7eb449a96d1a1c50a7a1a3f735cfa37746634f9c684f6d0d8708271c8493fe7fc787e5849f6bfdb2cd9d1f0026532cf27034701af258853023faf11fb29f602067549caf686733b416370885c462146ddcbc61596b3a312e8d87cc61c5a2613f6f181e8cc3d8423162d03fff13c55d0c1e0101dfded8451092a351ab5df1baa16358ff931f86ce617e919e013de7b7624e246c8176ebf3", + "txsEffectsHash": "0x43b8bd02d2c6ca958303c71be5c272b917a436b3f9d779ffc3ffd66ba41de258", "decodedHeader": { "contentCommitment": { "inHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "outHash": "0x3c00faec8dc481e71433eb21f1dd016134bf403950c146783ba1928cddcb315d", "txTreeHeight": 2, - "txsEffectsHash": "0x9357b004f1ab95bd0ba8f146aa6ec4f7fde65b327f9067081838250ee330f020" + "txsEffectsHash": "0x43b8bd02d2c6ca958303c71be5c272b917a436b3f9d779ffc3ffd66ba41de258" }, "globalVariables": { "blockNumber": 2, "chainId": 31337, - "timestamp": 1709933308, + "timestamp": 1709939074, "version": 1, - "coinbase": "0x65a2a896586e32034cb3ca843906223fc2cd313a", - "feeRecipient": "0x0b235aea8996db40f47d82e4c76f348b308348437410b47527d4c347ff70900a" + "coinbase": "0x3763c27097c7679fde3c516b87d7a57fbff2b401", + "feeRecipient": "0x12f0936cd74975821fef2537b6501306af902a7084887216691bce9ac330b88c" }, "lastArchive": { "nextAvailableLeafIndex": 2, - "root": "0x0906ec56c4b26551de28a357993a893da99366977732263a996dd928bd232fba" + "root": "0x00f4e742fc0ed23e57b5bdbabad8806c1fc9f51695dadc9fe2dda7a6dd16e830" }, "stateReference": { "l1ToL2MessageTree": { @@ -95,8 +95,8 @@ } } }, - "header": "0x0906ec56c4b26551de28a357993a893da99366977732263a996dd928bd232fba0000000200000000000000000000000000000000000000000000000000000000000000029357b004f1ab95bd0ba8f146aa6ec4f7fde65b327f9067081838250ee330f02000000000000000000000000000000000000000000000000000000000000000003c00faec8dc481e71433eb21f1dd016134bf403950c146783ba1928cddcb315d06c76caee115a61eeb6788977c68a3bea359061b678a1a4f5ffde13e0451717b00000020023ef973dbaa366409f7a01a4ced696227685ce75e57b510d0e7015ebfa72c5000000200231b77b7e0311a71fae5cec0f0281816950f94a24bfc2e67c5ae8619c6ed4c88000002802ae3a1bf2752c8c8bd6741bb3fd0d9e3811dbf7681454436125ccb7afeca31c9000001400000000000000000000000000000000000000000000000000000000000007a69000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000065eb82fc65a2a896586e32034cb3ca843906223fc2cd313a0b235aea8996db40f47d82e4c76f348b308348437410b47527d4c347ff70900a", + "header": "0x00f4e742fc0ed23e57b5bdbabad8806c1fc9f51695dadc9fe2dda7a6dd16e83000000002000000000000000000000000000000000000000000000000000000000000000243b8bd02d2c6ca958303c71be5c272b917a436b3f9d779ffc3ffd66ba41de25800000000000000000000000000000000000000000000000000000000000000003c00faec8dc481e71433eb21f1dd016134bf403950c146783ba1928cddcb315d06c76caee115a61eeb6788977c68a3bea359061b678a1a4f5ffde13e0451717b00000020023ef973dbaa366409f7a01a4ced696227685ce75e57b510d0e7015ebfa72c5000000200231b77b7e0311a71fae5cec0f0281816950f94a24bfc2e67c5ae8619c6ed4c88000002802ae3a1bf2752c8c8bd6741bb3fd0d9e3811dbf7681454436125ccb7afeca31c9000001400000000000000000000000000000000000000000000000000000000000007a69000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000065eb99823763c27097c7679fde3c516b87d7a57fbff2b40112f0936cd74975821fef2537b6501306af902a7084887216691bce9ac330b88c", "l1ToL2MessagesHash": "0xa10cc8559615be5a44cfb608374b1f84fd11cdb5844ebffafd92a77c068350f1", - "publicInputsHash": "0x00f4d89cc8b3932ddb9a9b7690d8acf4fe1c5b3f0fb4e4a0028ad6cb8e46651e" + "publicInputsHash": "0x2af486d91d741bafe33b4e5fad0cbde6b32bace6e82fff0677dd1c58cafdafad" } } \ No newline at end of file From 770bb85cdce8526c3fd23f5ed9e8b4b751f84f6e Mon Sep 17 00:00:00 2001 From: Santiago Palladino Date: Fri, 8 Mar 2024 20:18:43 -0300 Subject: [PATCH 08/12] Fix solidity tests --- l1-contracts/test/Rollup.t.sol | 7 ++++--- l1-contracts/test/decoders/Base.sol | 1 - l1-contracts/test/decoders/Decoders.t.sol | 12 ------------ 3 files changed, 4 insertions(+), 16 deletions(-) diff --git a/l1-contracts/test/Rollup.t.sol b/l1-contracts/test/Rollup.t.sol index be9dc7192fa..93f4433a5e6 100644 --- a/l1-contracts/test/Rollup.t.sol +++ b/l1-contracts/test/Rollup.t.sol @@ -62,7 +62,8 @@ contract RollupTest is DecoderBase { bytes memory body = data.body; assembly { - mstore(add(header, add(0x20, 0x0158)), 0x420) + // TODO: Hardcoding offsets in the middle of tests is annoying to say the least. + mstore(add(header, add(0x20, 0x0134)), 0x420) } availabilityOracle.publish(body); @@ -78,7 +79,7 @@ contract RollupTest is DecoderBase { bytes memory body = data.body; assembly { - mstore(add(header, add(0x20, 0x0178)), 0x420) + mstore(add(header, add(0x20, 0x0154)), 0x420) } availabilityOracle.publish(body); @@ -95,7 +96,7 @@ contract RollupTest is DecoderBase { uint256 ts = block.timestamp + 1; assembly { - mstore(add(header, add(0x20, 0x01b8)), ts) + mstore(add(header, add(0x20, 0x0194)), ts) } availabilityOracle.publish(body); diff --git a/l1-contracts/test/decoders/Base.sol b/l1-contracts/test/decoders/Base.sol index e74a5e20693..4d2b9a85e9b 100644 --- a/l1-contracts/test/decoders/Base.sol +++ b/l1-contracts/test/decoders/Base.sol @@ -72,7 +72,6 @@ contract DecoderBase is Test { } struct PartialStateReference { - AppendOnlyTreeSnapshot contractTree; AppendOnlyTreeSnapshot noteHashTree; AppendOnlyTreeSnapshot nullifierTree; AppendOnlyTreeSnapshot publicDataTree; diff --git a/l1-contracts/test/decoders/Decoders.t.sol b/l1-contracts/test/decoders/Decoders.t.sol index 9c53d7499ab..6227407d6ba 100644 --- a/l1-contracts/test/decoders/Decoders.t.sol +++ b/l1-contracts/test/decoders/Decoders.t.sol @@ -128,18 +128,6 @@ contract DecodersTest is DecoderBase { "Invalid nullifierTree.root" ); - // ContractTree - assertEq( - header.stateReference.partialStateReference.contractTree.nextAvailableLeafIndex, - partialStateReference.contractTree.nextAvailableLeafIndex, - "Invalid contractTree.nextAvailableLeafIndex" - ); - assertEq( - header.stateReference.partialStateReference.contractTree.root, - partialStateReference.contractTree.root, - "Invalid contractTree.root" - ); - // PublicDataTree assertEq( header.stateReference.partialStateReference.publicDataTree.nextAvailableLeafIndex, From 40b7bcce62887849c296c18e110cf05cdedd2808 Mon Sep 17 00:00:00 2001 From: Santiago Palladino Date: Fri, 8 Mar 2024 20:26:22 -0300 Subject: [PATCH 09/12] Fix slither output by copypasting from CI --- l1-contracts/slither_output.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/l1-contracts/slither_output.md b/l1-contracts/slither_output.md index a43d9bcd639..a0a7f05ae3c 100644 --- a/l1-contracts/slither_output.md +++ b/l1-contracts/slither_output.md @@ -321,9 +321,9 @@ src/core/messagebridge/Inbox.sol#L148-L153 Impact: Informational Confidence: Medium - [ ] ID-35 -Variable [Constants.LOGS_HASHES_NUM_BYTES_PER_BASE_ROLLUP](src/core/libraries/ConstantsGen.sol#L128) is too similar to [Constants.NOTE_HASHES_NUM_BYTES_PER_BASE_ROLLUP](src/core/libraries/ConstantsGen.sol#L121) +Variable [Constants.LOGS_HASHES_NUM_BYTES_PER_BASE_ROLLUP](src/core/libraries/ConstantsGen.sol#L129) is too similar to [Constants.NOTE_HASHES_NUM_BYTES_PER_BASE_ROLLUP](src/core/libraries/ConstantsGen.sol#L122) -src/core/libraries/ConstantsGen.sol#L128 +src/core/libraries/ConstantsGen.sol#L129 - [ ] ID-36 From b134992760fc4913d6d0d8dd07a3b1f1902d1600 Mon Sep 17 00:00:00 2001 From: Santiago Palladino Date: Fri, 8 Mar 2024 22:49:00 -0300 Subject: [PATCH 10/12] Fix docs --- .../writing_contracts/functions/context.md | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/docs/docs/developers/contracts/writing_contracts/functions/context.md b/docs/docs/developers/contracts/writing_contracts/functions/context.md index 8f4455fc3cd..f878aae70fc 100644 --- a/docs/docs/developers/contracts/writing_contracts/functions/context.md +++ b/docs/docs/developers/contracts/writing_contracts/functions/context.md @@ -14,7 +14,7 @@ On this page, you'll learn - The details and functionalities of the private context in Aztec.nr - Difference between the private and public contexts and their unified APIs -- Components of the private context, such as inputs, block header, and contract deployment data +- Components of the private context, such as inputs and block header. - Elements like return values, read requests, new note hashes, and nullifiers in transaction processing - Differences between the private and public contexts, especially the unique features and variables in the public context @@ -42,7 +42,7 @@ The context inputs includes all of the information that is passed from the kerne #include_code private-context-inputs /noir-projects/aztec-nr/aztec/src/context/inputs/private_context_inputs.nr rust -As shown in the snippet, the application context is made up of 4 main structures. The call context, the block header, the contract deployment data and the private global variables. +As shown in the snippet, the application context is made up of 4 main structures. The call context, the block header, and the private global variables. First of all, the call context. @@ -67,7 +67,6 @@ The call context contains information about the current call being made: - Furthermore there are a series of flags that are stored within the application context: - is_delegate_call: Denotes whether the current call is a delegate call. If true, then the storage contract address will be the address of the sender. - is_static_call: This will be set if and only if the current call is a static call. In a static call, state changing altering operations are not allowed. - - is_contract_deployment: This will be set if and only if the current call is the contract's constructor. ### Header @@ -77,12 +76,6 @@ In the public context this header is set by sequencer (sequencer executes public #include_code header /noir-projects/noir-protocol-circuits/crates/types/src/header.nr rust -### Contract Deployment Data - -Just like with the `is_contract_deployment` flag mentioned earlier. This data will only be set to true when the current transaction is one in which a contract is being deployed. - -#include_code contract-deployment-data /noir-projects/noir-protocol-circuits/crates/types/src/contrakt/contract_deployment_data.nr rust - ### Private Global Variables In the private execution context, we only have access to a subset of the total global variables, we are restricted to those which can be reliably proven by the kernel circuits. @@ -137,7 +130,7 @@ The Public Context includes all of the information passed from the `Public VM` i ### Public Context Inputs -In the current version of the system, the public context is almost a clone of the private execution context. It contains the same call context data, access to the same historical tree roots, however it does NOT have access to contract deployment data, this is due to traditional contract deployments only currently being possible from private transactions. +In the current version of the system, the public context is almost a clone of the private execution context. #include_code public-context-inputs /noir-projects/aztec-nr/aztec/src/context/inputs/public_context_inputs.nr rust From 4714ff3714951215de40588cc369bcc9ed930704 Mon Sep 17 00:00:00 2001 From: Santiago Palladino Date: Mon, 11 Mar 2024 08:22:03 -0300 Subject: [PATCH 11/12] Fixes post rebase --- .../archiver/src/archiver/archiver.test.ts | 7 +- .../archiver/src/archiver/eth_log_handlers.ts | 15 +- .../src/l2_block_code_to_purge.ts | 1 - .../circuit-types/src/mocks_to_purge.ts | 35 +- .../__snapshots__/index.test.ts.snap | 310 +++++++++--------- .../simulator/src/public/avm_executor.test.ts | 1 - 6 files changed, 160 insertions(+), 209 deletions(-) diff --git a/yarn-project/archiver/src/archiver/archiver.test.ts b/yarn-project/archiver/src/archiver/archiver.test.ts index 64c25365fa6..a7a89c78bf5 100644 --- a/yarn-project/archiver/src/archiver/archiver.test.ts +++ b/yarn-project/archiver/src/archiver/archiver.test.ts @@ -3,12 +3,7 @@ import { AztecAddress } from '@aztec/foundation/aztec-address'; import { EthAddress } from '@aztec/foundation/eth-address'; import { Fr } from '@aztec/foundation/fields'; import { sleep } from '@aztec/foundation/sleep'; -import { - AvailabilityOracleAbi, - InboxAbi, - NewInboxAbi, - RollupAbi, -} from '@aztec/l1-artifacts'; +import { AvailabilityOracleAbi, InboxAbi, NewInboxAbi, RollupAbi } from '@aztec/l1-artifacts'; import { MockProxy, mock } from 'jest-mock-extended'; import { Chain, HttpTransport, Log, PublicClient, Transaction, encodeFunctionData, toHex } from 'viem'; diff --git a/yarn-project/archiver/src/archiver/eth_log_handlers.ts b/yarn-project/archiver/src/archiver/eth_log_handlers.ts index 8a5a06ab411..2d2e2e4a325 100644 --- a/yarn-project/archiver/src/archiver/eth_log_handlers.ts +++ b/yarn-project/archiver/src/archiver/eth_log_handlers.ts @@ -1,21 +1,10 @@ -import { - Body, - L1Actor, - L1ToL2Message, - L2Actor, - NewInboxLeaf, -} from '@aztec/circuit-types'; +import { Body, L1Actor, L1ToL2Message, L2Actor, NewInboxLeaf } from '@aztec/circuit-types'; import { AppendOnlyTreeSnapshot, Header } from '@aztec/circuits.js'; import { AztecAddress } from '@aztec/foundation/aztec-address'; import { EthAddress } from '@aztec/foundation/eth-address'; import { Fr } from '@aztec/foundation/fields'; import { numToUInt32BE } from '@aztec/foundation/serialize'; -import { - AvailabilityOracleAbi, - InboxAbi, - NewInboxAbi, - RollupAbi, -} from '@aztec/l1-artifacts'; +import { AvailabilityOracleAbi, InboxAbi, NewInboxAbi, RollupAbi } from '@aztec/l1-artifacts'; import { Hex, Log, PublicClient, decodeFunctionData, getAbiItem, getAddress, hexToBytes } from 'viem'; diff --git a/yarn-project/circuit-types/src/l2_block_code_to_purge.ts b/yarn-project/circuit-types/src/l2_block_code_to_purge.ts index 25eec75d249..6f66eead4f9 100644 --- a/yarn-project/circuit-types/src/l2_block_code_to_purge.ts +++ b/yarn-project/circuit-types/src/l2_block_code_to_purge.ts @@ -68,7 +68,6 @@ function makePartialStateReference(seed = 0): PartialStateReference { makeAppendOnlyTreeSnapshot(seed), makeAppendOnlyTreeSnapshot(seed + 1), makeAppendOnlyTreeSnapshot(seed + 2), - makeAppendOnlyTreeSnapshot(seed + 3), ); } diff --git a/yarn-project/circuit-types/src/mocks_to_purge.ts b/yarn-project/circuit-types/src/mocks_to_purge.ts index f83e3d11115..7556e69603c 100644 --- a/yarn-project/circuit-types/src/mocks_to_purge.ts +++ b/yarn-project/circuit-types/src/mocks_to_purge.ts @@ -6,14 +6,12 @@ import { CallRequest, CallerContext, CombinedConstantData, - ContractDeploymentData, EthAddress, Fq, Fr, FunctionData, FunctionSelector, G1AffineElement, - MAX_NEW_CONTRACTS_PER_TX, MAX_NEW_L2_TO_L1_MSGS_PER_TX, MAX_NON_REVERTIBLE_NOTE_HASHES_PER_TX, MAX_NON_REVERTIBLE_NULLIFIERS_PER_TX, @@ -22,7 +20,6 @@ import { MAX_REVERTIBLE_NOTE_HASHES_PER_TX, MAX_REVERTIBLE_NULLIFIERS_PER_TX, MAX_REVERTIBLE_PUBLIC_CALL_STACK_LENGTH_PER_TX, - NewContractData, Point, PrivateAccumulatedNonRevertibleData, PrivateAccumulatedRevertibleData, @@ -149,19 +146,9 @@ export function makeFinalAccumulatedData(seed = 1, full = false): PrivateAccumul tupleGenerator(2, fr, seed + 0x800), // unencrypted logs hash fr(seed + 0x900), // encrypted_log_preimages_length fr(seed + 0xa00), // unencrypted_log_preimages_length - tupleGenerator(MAX_NEW_CONTRACTS_PER_TX, makeNewContractData, seed + 0xb00), ); } -/** - * Creates arbitrary contract data. - * @param seed - The seed to use for generating the contract data. - * @returns A contract data. - */ -export function makeNewContractData(seed = 1): NewContractData { - return new NewContractData(makeAztecAddress(seed), makeEthAddress(seed + 1), fr(seed + 2)); -} - /** * Makes arbitrary eth address. * @param seed - The seed to use for generating the eth address. @@ -185,25 +172,9 @@ export function makeConstantData(seed = 1): CombinedConstantData { * @param seed - The seed to use for generating the tx context. * @returns A tx context. */ -export function makeTxContext(seed: number): TxContext { +export function makeTxContext(_seed: number): TxContext { // @todo @LHerskind should probably take value for chainId as it will be verified later. - // @todo @LHerskind should probably take value for version as it will be verified later. - return new TxContext(false, false, true, makeContractDeploymentData(seed), Fr.ZERO, Fr.ZERO); -} - -/** - * Makes arbitrary contract deployment data. - * @param seed - The seed to use for generating the contract deployment data. - * @returns A contract deployment data. - */ -export function makeContractDeploymentData(seed = 1) { - return new ContractDeploymentData( - makePoint(seed), - fr(seed + 1), - fr(seed + 2), - fr(seed + 3), - makeEthAddress(seed + 4), - ); + return new TxContext(false, false, Fr.ZERO, Fr.ZERO); } /** @@ -229,7 +200,6 @@ export function makePublicCallRequest(seed = 1): PublicCallRequest { functionSelector: makeSelector(seed + 3), isStaticCall: false, isDelegateCall: false, - isContractDeployment: false, startSideEffectCounter: 0, }); return new PublicCallRequest( @@ -255,7 +225,6 @@ export function makeCallContext(seed = 0, storageContractAddress = makeAztecAddr makeSelector(seed + 3), false, false, - false, 0, ); } diff --git a/yarn-project/protocol-contracts/src/gas-token/__snapshots__/index.test.ts.snap b/yarn-project/protocol-contracts/src/gas-token/__snapshots__/index.test.ts.snap index 79c161f0dcb..e307ded8f3f 100644 --- a/yarn-project/protocol-contracts/src/gas-token/__snapshots__/index.test.ts.snap +++ b/yarn-project/protocol-contracts/src/gas-token/__snapshots__/index.test.ts.snap @@ -3,122 +3,122 @@ exports[`GasToken returns canonical protocol contract 1`] = ` { "address": AztecAddress { - "asBigInt": 10518537853519909204957666322334442672584410385979059968848104222965977783517n, + "asBigInt": 904490780781460528224376188338116591313205995238981621267723393880425033858n, "asBuffer": { "data": [ - 23, - 65, - 72, - 13, - 6, - 111, - 233, - 124, + 1, + 255, + 236, + 115, + 172, + 83, + 86, 40, - 151, - 239, - 36, - 144, - 234, - 34, - 48, - 149, - 204, - 24, - 108, - 103, + 249, + 128, + 136, + 183, + 15, + 118, + 111, + 71, + 152, + 152, + 1, + 160, + 223, + 199, + 84, + 207, + 73, + 150, + 245, 5, - 224, - 47, - 181, - 106, - 33, - 6, - 27, - 203, - 28, - 221, + 207, + 216, + 240, + 130, ], "type": "Buffer", }, }, "instance": { "address": AztecAddress { - "asBigInt": 10518537853519909204957666322334442672584410385979059968848104222965977783517n, + "asBigInt": 904490780781460528224376188338116591313205995238981621267723393880425033858n, "asBuffer": { "data": [ - 23, - 65, - 72, - 13, - 6, - 111, - 233, - 124, + 1, + 255, + 236, + 115, + 172, + 83, + 86, 40, - 151, - 239, - 36, - 144, - 234, - 34, - 48, - 149, - 204, - 24, - 108, - 103, + 249, + 128, + 136, + 183, + 15, + 118, + 111, + 71, + 152, + 152, + 1, + 160, + 223, + 199, + 84, + 207, + 73, + 150, + 245, 5, - 224, - 47, - 181, - 106, - 33, - 6, - 27, - 203, - 28, - 221, + 207, + 216, + 240, + 130, ], "type": "Buffer", }, }, "contractClassId": Fr { - "asBigInt": 1081288800764539456992515725727545013194509212534089179832398000157107722146n, + "asBigInt": 19991854230050936342500655152798276890654480361721079564566765643052229542968n, "asBuffer": { "data": [ - 2, - 99, - 252, - 222, - 180, - 100, - 28, - 30, - 214, - 18, - 131, - 72, - 114, - 250, - 186, - 113, - 101, - 40, + 44, + 50, + 253, 14, - 133, - 193, - 94, - 154, - 6, - 203, - 103, - 189, - 107, - 88, - 212, - 151, + 188, + 205, 162, + 226, + 0, + 87, + 243, + 127, + 162, + 230, + 8, + 92, + 7, + 217, + 161, + 35, + 106, + 114, + 165, + 79, + 88, + 199, + 36, + 65, + 143, + 123, + 68, + 56, ], "type": "Buffer", }, @@ -318,41 +318,41 @@ exports[`GasToken returns canonical protocol contract 2`] = ` }, }, "id": Fr { - "asBigInt": 1081288800764539456992515725727545013194509212534089179832398000157107722146n, + "asBigInt": 19991854230050936342500655152798276890654480361721079564566765643052229542968n, "asBuffer": { "data": [ - 2, - 99, - 252, - 222, - 180, - 100, - 28, - 30, - 214, - 18, - 131, - 72, - 114, - 250, - 186, - 113, - 101, - 40, + 44, + 50, + 253, 14, - 133, - 193, - 94, - 154, - 6, - 203, - 103, - 189, - 107, - 88, - 212, - 151, + 188, + 205, + 162, + 226, + 0, + 87, + 243, + 127, 162, + 230, + 8, + 92, + 7, + 217, + 161, + 35, + 106, + 114, + 165, + 79, + 88, + 199, + 36, + 65, + 143, + 123, + 68, + 56, ], "type": "Buffer", }, @@ -446,41 +446,41 @@ exports[`GasToken returns canonical protocol contract 2`] = ` }, }, "publicBytecodeCommitment": Fr { - "asBigInt": 11070879835458647599904872869544251898416073411427356569372185618409843299916n, + "asBigInt": 12831037323980616574351244666328101205920009085730841227364130135390586685732n, "asBuffer": { "data": [ - 24, - 121, - 229, - 91, - 202, - 195, - 128, - 170, - 238, - 201, - 145, - 159, - 246, - 6, - 245, - 115, - 211, + 28, + 94, + 28, + 25, + 158, + 58, + 255, + 173, + 143, + 61, + 62, + 199, + 219, + 62, + 59, + 64, + 99, + 155, 60, - 229, - 130, - 225, - 76, - 234, - 38, - 46, - 15, + 14, + 248, + 35, + 81, + 80, 108, - 202, - 129, - 107, - 150, - 76, + 235, + 37, + 205, + 227, + 176, + 73, + 36, ], "type": "Buffer", }, diff --git a/yarn-project/simulator/src/public/avm_executor.test.ts b/yarn-project/simulator/src/public/avm_executor.test.ts index aaff6232443..5de5e968c7c 100644 --- a/yarn-project/simulator/src/public/avm_executor.test.ts +++ b/yarn-project/simulator/src/public/avm_executor.test.ts @@ -20,7 +20,6 @@ describe('AVM WitGen and Proof Generation', () => { storageContractAddress: AztecAddress.random(), portalContractAddress: EthAddress.random(), functionSelector: FunctionSelector.empty(), - isContractDeployment: false, isDelegateCall: false, isStaticCall: false, startSideEffectCounter: 0, From 6f3e0276d9a1ab21125b7c012b1395427f9abc3b Mon Sep 17 00:00:00 2001 From: Santiago Palladino Date: Mon, 11 Mar 2024 08:35:48 -0300 Subject: [PATCH 12/12] Remove vscode settings file --- noir-projects/.vscode/settings.json | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 noir-projects/.vscode/settings.json diff --git a/noir-projects/.vscode/settings.json b/noir-projects/.vscode/settings.json deleted file mode 100644 index 7c62ffb0edf..00000000000 --- a/noir-projects/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "noir.nargoPath": "/home/santiago/Projects/aztec3-packages/noir/noir-repo/target/release/nargo" -}