From a09fd2a92c540d65abea89113abd9a217b3ee7e0 Mon Sep 17 00:00:00 2001 From: Lasse Herskind <16536249+LHerskind@users.noreply.github.com> Date: Thu, 11 Jan 2024 09:37:29 +0000 Subject: [PATCH] feat: Generate json blocks for tests (#3923) Fixes #1736 and makes it easier to update the decoders to align with typescript in the future. --- l1-contracts/foundry.toml | 10 +- l1-contracts/src/core/Rollup.sol | 2 +- .../libraries/decoders/MessagesDecoder.sol | 22 +- l1-contracts/test/Decoder.t.sol | 274 ------------------ l1-contracts/test/DecoderHelper.sol | 4 +- l1-contracts/test/Rollup.t.sol | 127 +++++--- l1-contracts/test/decoders/Base.sol | 45 +++ l1-contracts/test/decoders/Decoder.t.sol | 263 +++++++++++++++++ l1-contracts/test/decoders/readme.md | 5 + l1-contracts/test/fixtures/empty_block_0.json | 47 +++ l1-contracts/test/fixtures/empty_block_1.json | 47 +++ l1-contracts/test/fixtures/mixed_block_0.json | 64 ++++ l1-contracts/test/fixtures/mixed_block_1.json | 64 ++++ .../src/integration_l1_publisher.test.ts | 58 +++- 14 files changed, 691 insertions(+), 341 deletions(-) delete mode 100644 l1-contracts/test/Decoder.t.sol create mode 100644 l1-contracts/test/decoders/Base.sol create mode 100644 l1-contracts/test/decoders/Decoder.t.sol create mode 100644 l1-contracts/test/decoders/readme.md create mode 100644 l1-contracts/test/fixtures/empty_block_0.json create mode 100644 l1-contracts/test/fixtures/empty_block_1.json create mode 100644 l1-contracts/test/fixtures/mixed_block_0.json create mode 100644 l1-contracts/test/fixtures/mixed_block_1.json diff --git a/l1-contracts/foundry.toml b/l1-contracts/foundry.toml index 04c6ee0c90d..31c93e28280 100644 --- a/l1-contracts/foundry.toml +++ b/l1-contracts/foundry.toml @@ -10,10 +10,18 @@ remappings = [ # See more config options https://github.com/foundry-rs/foundry/tree/master/config +fs_permissions = [ + {access = "read", path = "./test/fixtures/mixed_block_0.json"}, + {access = "read", path = "./test/fixtures/mixed_block_1.json"}, + {access = "read", path = "./test/fixtures/empty_block_0.json"}, + {access = "read", path = "./test/fixtures/empty_block_1.json"}, +] + [fmt] line_length = 100 tab_width = 2 variable_override_spacing=false [rpc_endpoints] -mainnet_fork="https://mainnet.infura.io/v3/9928b52099854248b3a096be07a6b23c" \ No newline at end of file +mainnet_fork="https://mainnet.infura.io/v3/9928b52099854248b3a096be07a6b23c" + diff --git a/l1-contracts/src/core/Rollup.sol b/l1-contracts/src/core/Rollup.sol index 7699dc42c24..e359b9500c6 100644 --- a/l1-contracts/src/core/Rollup.sol +++ b/l1-contracts/src/core/Rollup.sol @@ -69,7 +69,7 @@ contract Rollup is IRollup { } // Decode the cross-chain messages - (bytes32 inHash,, bytes32[] memory l2ToL1Msgs, bytes32[] memory l1ToL2Msgs) = + (bytes32 inHash,, bytes32[] memory l1ToL2Msgs, bytes32[] memory l2ToL1Msgs) = MessagesDecoder.decode(_l2Block[HeaderDecoder.BLOCK_HEADER_SIZE:]); bytes32 publicInputHash = diff --git a/l1-contracts/src/core/libraries/decoders/MessagesDecoder.sol b/l1-contracts/src/core/libraries/decoders/MessagesDecoder.sol index 29dbf87bfb0..3c632b234b9 100644 --- a/l1-contracts/src/core/libraries/decoders/MessagesDecoder.sol +++ b/l1-contracts/src/core/libraries/decoders/MessagesDecoder.sol @@ -44,18 +44,22 @@ library MessagesDecoder { /** * @notice Computes consumables for the block * @param _body - The L2 block calldata. - * @return l1ToL2MsgsHash - The hash of the L1 to L2 messages - * @return l2ToL1MsgsHash - The hash of the L1 to L2 messages - * @return l2ToL1Msgs - The L2 to L1 messages of the block + * @return inHash - The hash of the L1 to L2 messages + * @return outHash - The hash of the L1 to L2 messages * @return l1ToL2Msgs - The L1 to L2 messages of the block + * @return l2ToL1Msgs - The L2 to L1 messages of the block */ function decode(bytes calldata _body) internal pure - returns (bytes32, bytes32, bytes32[] memory, bytes32[] memory) + returns ( + bytes32 inHash, + bytes32 outHash, + bytes32[] memory l1ToL2Msgs, + bytes32[] memory l2ToL1Msgs + ) { - bytes32[] memory l1ToL2Msgs = new bytes32[](Constants.NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP); - bytes32[] memory l2ToL1Msgs; + l1ToL2Msgs = new bytes32[](Constants.NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP); uint256 offset = 0; @@ -91,10 +95,10 @@ library MessagesDecoder { calldatacopy(add(l1ToL2Msgs, 0x20), add(_body.offset, add(offset, 0x04)), mul(count, 0x20)) } - bytes32 l1ToL2MsgsHash = sha256(abi.encodePacked(l1ToL2Msgs)); - bytes32 l2ToL1MsgsHash = sha256(abi.encodePacked(l2ToL1Msgs)); + inHash = sha256(abi.encodePacked(l1ToL2Msgs)); + outHash = sha256(abi.encodePacked(l2ToL1Msgs)); - return (l1ToL2MsgsHash, l2ToL1MsgsHash, l2ToL1Msgs, l1ToL2Msgs); + return (inHash, outHash, l1ToL2Msgs, l2ToL1Msgs); } /** diff --git a/l1-contracts/test/Decoder.t.sol b/l1-contracts/test/Decoder.t.sol deleted file mode 100644 index c353bd51756..00000000000 --- a/l1-contracts/test/Decoder.t.sol +++ /dev/null @@ -1,274 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// Copyright 2023 Aztec Labs. -pragma solidity >=0.8.18; - -import {Test} from "forge-std/Test.sol"; - -import {Hash} from "../src/core/libraries/Hash.sol"; -import {DataStructures} from "../src/core/libraries/DataStructures.sol"; -import {DecoderHelper} from "./DecoderHelper.sol"; -import {Registry} from "../src/core/messagebridge/Registry.sol"; -import {Inbox} from "../src/core/messagebridge/Inbox.sol"; -import {Outbox} from "../src/core/messagebridge/Outbox.sol"; -import {Rollup} from "../src/core/Rollup.sol"; - -/** - * Blocks are generated using the `integration_l1_publisher.test.ts` tests. - * Main use of these test is shorter cycles when updating the decoder contract. - * All tests here are skipped (all tests are prefixed with an underscore)! - * This is because we implicitly test the decoding in integration_l1_publisher.test.ts - */ -contract DecoderTest is Test { - DecoderHelper internal helper; - Registry internal registry; - Inbox internal inbox; - Outbox internal outbox; - Rollup internal rollup; - - bytes internal block_empty_1 = - hex"0000000000000000000000000000000000000000000000000000000000007a6900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000020efbe2c7b675f26ab71689279908bbab33a6963e7e0dcb80e4c46583d094113000000002adc67712c2f7afc4e827551236adb46a693d572fbb29f3993dbedbef8d2d87d0000002027378c30a97c642a3b78bd34c54beac15a4dadcd7a3378e66d2384c485fda541000000002b72136df9bc7dc9cbfe6b84ec743e8e1d73dd93aecfa79f18afb86be977d3eb27378c30a97c642a3b78bd34c54beac15a4dadcd7a3378e66d2384c485fda541000000000103babeb39cf7cb3fd320ec225367ac5e834aaec3e7b48bb3239d0da39fa4a20000000120efbe2c7b675f26ab71689279908bbab33a6963e7e0dcb80e4c46583d094113000000402adc67712c2f7afc4e827551236adb46a693d572fbb29f3993dbedbef8d2d87d0000006027378c30a97c642a3b78bd34c54beac15a4dadcd7a3378e66d2384c485fda541000000042b72136df9bc7dc9cbfe6b84ec743e8e1d73dd93aecfa79f18afb86be977d3eb27378c30a97c642a3b78bd34c54beac15a4dadcd7a3378e66d2384c485fda5410000001019133ced5bd7348dae0f82a7195910ca141c7b5c1894a7c5f9fa53290c79f3ed0000000200000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000001000000000000000000000000000000000"; - - bytes internal block_mixed_1 = - hex"0000000000000000000000000000000000000000000000000000000000007a6900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000020efbe2c7b675f26ab71689279908bbab33a6963e7e0dcb80e4c46583d094113000000002adc67712c2f7afc4e827551236adb46a693d572fbb29f3993dbedbef8d2d87d0000002027378c30a97c642a3b78bd34c54beac15a4dadcd7a3378e66d2384c485fda541000000002b72136df9bc7dc9cbfe6b84ec743e8e1d73dd93aecfa79f18afb86be977d3eb0000000027378c30a97c642a3b78bd34c54beac15a4dadcd7a3378e66d2384c485fda541000000000103babeb39cf7cb3fd320ec225367ac5e834aaec3e7b48bb3239d0da39fa4a200000001235f4e41a2440aa28f9ac14e7eed447ddd2e539179cee4c0941e6e408d2443e50000004026f32989eb2870f2ed00774f54a82e8266fc2a2b3392b64e8199aacac71aabea000000600b6abbab461cfb072b267bfc1ecf8dc3c943736341baf11c5c829e345c49b5090000000429c0d0effa4242b8d2e372cfcdfa8bb57160715fa3640a3404a9bba93725a107000000042fbbd267a1c9b23b3ac1609b2c2a7961a0338c56d62607d5f8d6b6a29e7fe4cb000000102d81b3e2140328e322ad47f083bfb89d61aa26a26795d34e7442006f939663b300000002000000400000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000012100000000000000000000000000000000000000000000000000000000000001220000000000000000000000000000000000000000000000000000000000000123000000000000000000000000000000000000000000000000000000000000012400000000000000000000000000000000000000000000000000000000000001250000000000000000000000000000000000000000000000000000000000000126000000000000000000000000000000000000000000000000000000000000012700000000000000000000000000000000000000000000000000000000000001280000000000000000000000000000000000000000000000000000000000000129000000000000000000000000000000000000000000000000000000000000012a000000000000000000000000000000000000000000000000000000000000012b000000000000000000000000000000000000000000000000000000000000012c000000000000000000000000000000000000000000000000000000000000012d000000000000000000000000000000000000000000000000000000000000012e000000000000000000000000000000000000000000000000000000000000012f0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000014100000000000000000000000000000000000000000000000000000000000001420000000000000000000000000000000000000000000000000000000000000143000000000000000000000000000000000000000000000000000000000000014400000000000000000000000000000000000000000000000000000000000001450000000000000000000000000000000000000000000000000000000000000146000000000000000000000000000000000000000000000000000000000000014700000000000000000000000000000000000000000000000000000000000001480000000000000000000000000000000000000000000000000000000000000149000000000000000000000000000000000000000000000000000000000000014a000000000000000000000000000000000000000000000000000000000000014b000000000000000000000000000000000000000000000000000000000000014c000000000000000000000000000000000000000000000000000000000000014d000000000000000000000000000000000000000000000000000000000000014e000000000000000000000000000000000000000000000000000000000000014f0000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000016100000000000000000000000000000000000000000000000000000000000001620000000000000000000000000000000000000000000000000000000000000163000000000000000000000000000000000000000000000000000000000000016400000000000000000000000000000000000000000000000000000000000001650000000000000000000000000000000000000000000000000000000000000166000000000000000000000000000000000000000000000000000000000000016700000000000000000000000000000000000000000000000000000000000001680000000000000000000000000000000000000000000000000000000000000169000000000000000000000000000000000000000000000000000000000000016a000000000000000000000000000000000000000000000000000000000000016b000000000000000000000000000000000000000000000000000000000000016c000000000000000000000000000000000000000000000000000000000000016d000000000000000000000000000000000000000000000000000000000000016e000000000000000000000000000000000000000000000000000000000000016f0000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000018100000000000000000000000000000000000000000000000000000000000001820000000000000000000000000000000000000000000000000000000000000183000000000000000000000000000000000000000000000000000000000000018400000000000000000000000000000000000000000000000000000000000001850000000000000000000000000000000000000000000000000000000000000186000000000000000000000000000000000000000000000000000000000000018700000000000000000000000000000000000000000000000000000000000001880000000000000000000000000000000000000000000000000000000000000189000000000000000000000000000000000000000000000000000000000000018a000000000000000000000000000000000000000000000000000000000000018b000000000000000000000000000000000000000000000000000000000000018c000000000000000000000000000000000000000000000000000000000000018d000000000000000000000000000000000000000000000000000000000000018e000000000000000000000000000000000000000000000000000000000000018f000000400000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000022100000000000000000000000000000000000000000000000000000000000002220000000000000000000000000000000000000000000000000000000000000223000000000000000000000000000000000000000000000000000000000000022400000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000226000000000000000000000000000000000000000000000000000000000000022700000000000000000000000000000000000000000000000000000000000002280000000000000000000000000000000000000000000000000000000000000229000000000000000000000000000000000000000000000000000000000000022a000000000000000000000000000000000000000000000000000000000000022b000000000000000000000000000000000000000000000000000000000000022c000000000000000000000000000000000000000000000000000000000000022d000000000000000000000000000000000000000000000000000000000000022e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000024100000000000000000000000000000000000000000000000000000000000002420000000000000000000000000000000000000000000000000000000000000243000000000000000000000000000000000000000000000000000000000000024400000000000000000000000000000000000000000000000000000000000002450000000000000000000000000000000000000000000000000000000000000246000000000000000000000000000000000000000000000000000000000000024700000000000000000000000000000000000000000000000000000000000002480000000000000000000000000000000000000000000000000000000000000249000000000000000000000000000000000000000000000000000000000000024a000000000000000000000000000000000000000000000000000000000000024b000000000000000000000000000000000000000000000000000000000000024c000000000000000000000000000000000000000000000000000000000000024d000000000000000000000000000000000000000000000000000000000000024e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000026100000000000000000000000000000000000000000000000000000000000002620000000000000000000000000000000000000000000000000000000000000263000000000000000000000000000000000000000000000000000000000000026400000000000000000000000000000000000000000000000000000000000002650000000000000000000000000000000000000000000000000000000000000266000000000000000000000000000000000000000000000000000000000000026700000000000000000000000000000000000000000000000000000000000002680000000000000000000000000000000000000000000000000000000000000269000000000000000000000000000000000000000000000000000000000000026a000000000000000000000000000000000000000000000000000000000000026b000000000000000000000000000000000000000000000000000000000000026c000000000000000000000000000000000000000000000000000000000000026d000000000000000000000000000000000000000000000000000000000000026e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000028100000000000000000000000000000000000000000000000000000000000002820000000000000000000000000000000000000000000000000000000000000283000000000000000000000000000000000000000000000000000000000000028400000000000000000000000000000000000000000000000000000000000002850000000000000000000000000000000000000000000000000000000000000286000000000000000000000000000000000000000000000000000000000000028700000000000000000000000000000000000000000000000000000000000002880000000000000000000000000000000000000000000000000000000000000289000000000000000000000000000000000000000000000000000000000000028a000000000000000000000000000000000000000000000000000000000000028b000000000000000000000000000000000000000000000000000000000000028c000000000000000000000000000000000000000000000000000000000000028d000000000000000000000000000000000000000000000000000000000000028e0000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000520000000000000000000000000000000000000000000000000000000000000052a0000000000000000000000000000000000000000000000000000000000000521000000000000000000000000000000000000000000000000000000000000052b0000000000000000000000000000000000000000000000000000000000000522000000000000000000000000000000000000000000000000000000000000052c0000000000000000000000000000000000000000000000000000000000000523000000000000000000000000000000000000000000000000000000000000052d0000000000000000000000000000000000000000000000000000000000000524000000000000000000000000000000000000000000000000000000000000052e0000000000000000000000000000000000000000000000000000000000000525000000000000000000000000000000000000000000000000000000000000052f00000000000000000000000000000000000000000000000000000000000005260000000000000000000000000000000000000000000000000000000000000530000000000000000000000000000000000000000000000000000000000000052700000000000000000000000000000000000000000000000000000000000005310000000000000000000000000000000000000000000000000000000000000540000000000000000000000000000000000000000000000000000000000000054a0000000000000000000000000000000000000000000000000000000000000541000000000000000000000000000000000000000000000000000000000000054b0000000000000000000000000000000000000000000000000000000000000542000000000000000000000000000000000000000000000000000000000000054c0000000000000000000000000000000000000000000000000000000000000543000000000000000000000000000000000000000000000000000000000000054d0000000000000000000000000000000000000000000000000000000000000544000000000000000000000000000000000000000000000000000000000000054e0000000000000000000000000000000000000000000000000000000000000545000000000000000000000000000000000000000000000000000000000000054f00000000000000000000000000000000000000000000000000000000000005460000000000000000000000000000000000000000000000000000000000000550000000000000000000000000000000000000000000000000000000000000054700000000000000000000000000000000000000000000000000000000000005510000000000000000000000000000000000000000000000000000000000000560000000000000000000000000000000000000000000000000000000000000056a0000000000000000000000000000000000000000000000000000000000000561000000000000000000000000000000000000000000000000000000000000056b0000000000000000000000000000000000000000000000000000000000000562000000000000000000000000000000000000000000000000000000000000056c0000000000000000000000000000000000000000000000000000000000000563000000000000000000000000000000000000000000000000000000000000056d0000000000000000000000000000000000000000000000000000000000000564000000000000000000000000000000000000000000000000000000000000056e0000000000000000000000000000000000000000000000000000000000000565000000000000000000000000000000000000000000000000000000000000056f00000000000000000000000000000000000000000000000000000000000005660000000000000000000000000000000000000000000000000000000000000570000000000000000000000000000000000000000000000000000000000000056700000000000000000000000000000000000000000000000000000000000005710000000000000000000000000000000000000000000000000000000000000580000000000000000000000000000000000000000000000000000000000000058a0000000000000000000000000000000000000000000000000000000000000581000000000000000000000000000000000000000000000000000000000000058b0000000000000000000000000000000000000000000000000000000000000582000000000000000000000000000000000000000000000000000000000000058c0000000000000000000000000000000000000000000000000000000000000583000000000000000000000000000000000000000000000000000000000000058d0000000000000000000000000000000000000000000000000000000000000584000000000000000000000000000000000000000000000000000000000000058e0000000000000000000000000000000000000000000000000000000000000585000000000000000000000000000000000000000000000000000000000000058f000000000000000000000000000000000000000000000000000000000000058600000000000000000000000000000000000000000000000000000000000005900000000000000000000000000000000000000000000000000000000000000587000000000000000000000000000000000000000000000000000000000000059100000008000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000003210000000000000000000000000000000000000000000000000000000000000340000000000000000000000000000000000000000000000000000000000000034100000000000000000000000000000000000000000000000000000000000003600000000000000000000000000000000000000000000000000000000000000361000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000003810000000426fcb9639d15aabe6d792e23ab12fb9633046d4be6911a60d64471d7560d3f6809143b7d4943a3485115d37e7596938a16c91b6055f3837640d8c36b8303bb3c06fb5fb553496e5e0b48834087e036acf99d6d935dc2ebf43c82788cb5ed1c6a2f4bd77ac2bb5474d48c2856135d18168cd6f69f77143c60b3cc370319419dac0000000000000000000000000000000000000000000000000000000000001020212121212121212121212121212121212121212100000000000000000000000000000000000000000000000000000000000010404141414141414141414141414141414141414141000000000000000000000000000000000000000000000000000000000000106061616161616161616161616161616161616161610000000000000000000000000000000000000000000000000000000000001080818181818181818181818181818181818181818100000010151de48ca3efbae39f180fe00b8f472ec9f25be10b4f283a87c6d7839353703914c2ea9dedf77698d4afe23bc663263eed0bf9aa3a8b17d9b74812f185610f9e1570cc6641699e3ae87fa258d80a6d853f7b8ccb211dc244d017e2ca6530f8a12806c860af67e9cd50000378411b8c4c4db172ceb2daa862b259b689ccbdc1e005f140c7c95624c8006774279a01ec1ea88617999e4fe6997b6576c4e1c7395a22048b96b586596bd740d0402e15f5577f7ceb5496b65aafc6d89d7c3b34924b0c3f2d50d16279970d682cada30bfa6b29bc0bac0ee2389f6a0444853eccaa932b2a60561da46a58569d71044a84c639e7f88429826e5622581536eb906d9cdd25a2c0a76f7da6924e10751c755227d2535f4ad258b984e78f9f452a853c52300e212d8e2069e4254d81af07744bcbb81121a38f0e2dbed69a523d3fbf85b75c287ca6f33aadbac2e4f058e05924c140d7895a6ed167caf804b710d2ae3ba62b1b51297b3ea37637af6bd56cf33425d95cc5c96e9c2ee3077322fbec86a0c7f32c15d2a888c6cc122e99478c92470a1311635142d82ad7ae67410beeef4ae31f0902ba2fb964922a4610bb18901f7b923885c1d034da5769a48203ae6f0206a92855e2c01ddb3d6553386b5580d681b8230fa4062948668f834f23e0636eaff70aaa64519aafdf4b040bd2f9836e76b9dc13cfec8065dcdf2834d786e06260d10000381000000e00000001bc00000090b1c43c1dd10fa62d46ac721c5529068d286a18a86e22787da7a222925e32a3148915e9b0ed2f8793823e9b4fc52cddfda38739e4a23cbae77fd06d498b9b8e6ea0911e8e23b97a17da9fa3777775672dd21198963bc0bbf6667d10365dd77172004b20053ff5fa88f214c7cfbb1501c5aa7c9bd36a08bcd318a70f71ef4a5837863bcc1e9a539584952bc17cb270e2d9000000907686f00e315ea807d51ecea805379caef8781be53347315fc9510f3e9db44f3e65862c9d964b0007dab956272d11e50d1338bcbaac47886108b376f34d207aa5e94ae1f2adbd06d15590d0cb7061bb79b839a791f90fdfef054e878748fad2123fbb481f7e1d9cfdab406f5e8093badb645fa2cb49203e1bf68f945ca21f5a03027dfe828e99ea4b6cf8ae2daae54bcf000000905510d0f861d5cd19326c399727f453486bdc7b85202ecd41f5fef58b5078e887ec5b91f4d39ddbe24e2233747a1e65e6737b58c0850e148f7e92cb21e947efb518882acf619244aca195b5dd44fe507cf4f7b1aa9386b7904b01769ffa8211b3ea6ab32f2c85a4d03c6266632b602c655f1dc01662d283f3fb700a734f14c580bfc7a5d2228ff1a4c7761708d9322f2e000001bc00000090c6d6caffce822bbedfa8b303833ce3bb9b0b3a79bfbfcbfd3b563f02298c592c4c7216a38ea06d6e9a1a75b8ce59730cc56c8488246b4d5261647058936277ea7ca9ec6df4bfaab432e580fb3ee6ad005ae36548d2fb1e7edc2f1228431bb1acc1e3210b4f8d5b68647dbee0bb7924fe2727a6669cfc46cb82fcdc1c77e3a0de61eb3f0a7da43811a067fcc07a5303300000009014237a82b5c531c5b22ebeb4f7af578d7998537fef0b53ee2fd725d07550da956a9ea3ffbdd09144a539b5fe593a138d39e93551ff290cc899b250940749ec14f745945d067438975a090af541be7ca68c7acbec35e623263cabd630ebd11d6caeefaa085a44d44810e70f8d6a631a8207ea4aff253f47613ca512bf04b63bad9dcc861f61d81ed0d7a88fe0747c6027000000908e8e062b17d6f040bf583520ad0d92e257880d51cd470ca10fd94d0e03815062d26f1169b1ebaaf9b5dde8a5638abb39043bd0e31d0939415ed88682e4b1d0e434f879f11542360439caf4db74632afce8378f2faf1316e528cf3a64d7e7e3a5fcf322938c266d48181fb71b956c6f66353469056cf26e8fd84c3ae60f72ffcf1f9deb3363b93f5ba1dda798c93f4ff5000001bc000000908cfb998afce6a15aa54c86f27370d5fa09e60944ffd9ba0cad5da227e2df3e678226f78094eac382cd0cfa9fa7dadf181c190002fde911048c253e2f05e8267af3129dd8be984d00e9ef152762ef161f93fc72ef1ac9bd0de640f6930a88f1fcfa9ad5bf5032505cb5c90ad5a7b22cd0b2c8d9af4f224955b28bed5900a852c9418d94f1a1e968afcae8d489895996a800000090579b53b18d0bd8e4db71db680804471f263423a4c57a5807696dae3a7d751e6dd8c1340ed4e0bb63e6e45b1fa36519d89f164f4ffaa41d391d4adeee0d02273595d6cfd41d0869677ddfe43cf8d4fc6e711d983bf9064485083edf3dfac78ceddd10474c1e07234f04ecbc50cb1bac7c30248d5bd9efae2bd72baad5d108f98de87b6ec6414d7581031cca18a7a1f88d000000903df50823b273945486cac84eae73e266121418fc5756bfc8ea6809d69410c76daee250d34b31a846e74ed1e9b87ad3dcfe92600d5bf24d620319554a8c67b0c2a76816d6bbd0ad08d83a89b121a4209e751b3e1d2ab0ad916fa673ab94ae1ce7c5367d77a7e5094a96e8c6d85575e34ebcf5ccddded1e82e329b0f5d0606f0010754789ee4e8be98adc2578c242d3eb2000001bc00000090fb7cd18168f47d0ddf433e52f0ea9f4f1d391b476226feae60b6258e7e9203983154c17120ef162fb83d858ed5d89acfb48b5b42ceeaf4cc45a3a2774814a2bc080b2a5d139aa7d33d54730e7c6b72b8c81475d99e430e914d609adba55d572d9fd9a2d0d3b55765aa106faac79fc50ade6e09d2fb18631a6e5028dd30a03fd78756608d3390e38358345734691e130400000090f354980488624491d43905213b4f502c0e0cf43c88bc840c0cbf1f103e74c47c3bd8bebf1453aee92c4ea82615fb9f4a50aad10dc69dabdb8ec7c8e518f55628f48a22867302d0aedbe01330ef940b87fcbe1522609073955a1f4e53b580d9fb5947abd430f3ada138bd38bfe014bf017d257cc3cdae7ad84837ad0aac1b8fc85d7f619247c58c4b84d96bb47d61447d000000909a34e935d1b48a64b74a4b7a130471c3197ca84342093096b7d7a5e57bf4aa9d89f286b4a27619861589c15f9ff4ac6277093e2bdb8f1418ce45c88b1b94d69c8fa5194ad9bbcf79de7ae6596d0f81fd1549667d7a97d3ad96e21fa687964b2d29ea50b7c0fff8bed8e3f5df7c0b7528130bc9443be97e2cd56bfae66b9f471572223673a7027b9df9c8275b7bf3cdcc000001bc0000009048deb9e0401c49c61deeea50914ae71c267a5056dcce4406b02478aead4616303a6d36685b3d23d995d2a3c31dfcd58a4925ae67251b98bc7a08521bbc80b850b7c268e8b796d8e4436e156fd1d9f906c508132999f3928da46a5829c3ef8636ce949c5ea263c6e0a23427bea71a8fe5cc35344d0e9d61b2891de94fd71fe97e23fdd6a1f28937cd6a4efa1e3282614900000090ef21002e4193e387593866f9568792747b9dc5353764bb3cfc9691068cd7ec63509277384c3e12130782690775bfd7598b30130d4797603c432bc9b5bea6a27f0c69b05374e731c220ff281450b2d4e126716e2bee5436d160b2f6731bf35c900639a6d7e65330b75439d3c7c6245f876e2950cc7fa970ad9ff16ebb6a0898525dbff3e00564cd209f260c2bc4f694910000009011f59e99b692f90fb8cb1a1724ea0cc8585330f95afbc3393e707c4d2a7703cd6ab9d975e56c7c1d10863b3b139958722f4af95cfda6159bca44175d9b5c6ac481caa2a86c6770abb6d6925a00213cea8455e87213b575da93ca24ee48e627145db559c962519911b1afb7a47af5ba0460a4a97ba00bd4bfe9f52f194c5e8ecbf6427cc4560227224f38c07b7e59a4ba000001bc00000090375f55f2a7cb6057626722e28363fabd45f30ea1babf12ffe3184303eb5788010d104812cc4db5d7d18114007d9f4314e64fd02acba6c5bbf83ccf2f35446b21a1e7955c55e6859fefe6f71f2e16ddf4ec1ed3c5178daf2c9e5613c3e9aae3201946fcdbeb0e8719b01a18a25905cca216f034c4f94ace0ee4bcfb8bf0b40ff0cdcd8f1238384e28df63c1ba65f91b540000009025e941529ddcb4ac5e93de566fac91cad1baa6dae9cda86477c95ce97c7fa81b6a3db36b657711ea0a1a7669a87ebb593bae554b66a058af1a21ecf1b2c5aecfa191f54733a32480d29a1ba026b6fc90b0ee4e718738ee68c2b34e774116f045f1138ed8c99ba88b98affe4806efa98b32435d368c6f34dde1fa09715624ac0611faf13adc4a8a6eef04646897ce61af00000090005b88cd11607a66bd9fdf06b8023ae16072df1d1a7d223a6d7d37049dbdd417043e11e1736c01af9098b6e30ae6e59e1882deae1521bd41b011c3f18fbb569d20e9af66508f743059537843cd1088ca526dc1f174a8018e467dc19af5cfb12d20d09664ecfafa7b1acf78c1396f0dd20f606f27813b004b81f347c313fcc77ceb5fc33758c4042e3bba26e6b4c9ac79000001bc0000009011e23f2328a3cdcb9652a6dc95eca90584fe46f92b70362a33f8374faf6c26f54650df91601eaf32e44ef840c5c3e0e5d02e51198bd57920a5c8b22aa96288c430ca5c462b8aab462c9222c36adb884bf5149978707ef563dad2ab59041332b569c79cf44e915c5aca22b75ae7218e996bc17d8409b0cfe5ea948fa2f95162b00069e3046acb65d5e245756709742b6f00000090193875fe2d757b5c35f529652a27b43f96d9866935e92806baa042413da52f6785a97ffa06741bf7f3a52031e8f67bc4ce40528f304d1e9ef6efa19575100fbe49f2147d7e0ec69f0f232c239fcce61a50addc45875278d5ac24e389521fca0c6a49eda5f3ca7f5cc7f1f9fad15332c9e6548f77cc0fbafb72413f6af7a44365b67dcef769105d6fb99e6acfcb8ec3d80000009060f4380337b2cf5647dc40b9d4d198ab5c8ce6317e4ca71b6b120612539ddc0de66f6b5a42257146ce190103849efa4dbc68903f1a32164258c81ce43caf8b53aa73519fc442f2f93cb9494fa19ba62817d116704233bce8a761a13221cfbead9bba235b6567045072eda0f4da79a5abdc640ca003cc218d3ad51fb6f5699ac03207e37e457d997288c90e043a4b49e1000001bc0000009027ec222ad55c14e1b629cba9e7b024ad8b045150f409c624f1b4b5772994e2f847ed4c6fc9ba0b887fdb370dfab6bc9a029a882d513e848d0a000e6a21d392081159e910e1824ca8336326c6fd32e62ee4fb91d3bcd1ea95316ccfd428235da330cf4e74853790219bc1d868b696ce9f289d416dd11908e410c00a7a2b0ae38ac6aee983af156f7ab445944bf3c78e8b00000090c7b511f4186d7293c83edbc937e81e2068ccb3253c10908e1dbb877098d3312ff806bf187b9521032fc91802a275c546310d3ede01710cadb7fef5c5ca3f188c900120b753a91fe69a4bd6ee2c39bed71c7ca4d6d5718ca20a3c83795545b169608e6248ef7b16e892c08bdfb2e261f85863b80f65540b1a68f1fd872fd2a9012f645a9177f656ab4bf297b5340983a500000090acba85789c0bd050a43cbd36f5b1c1e427f898fcee8c905e59e58b0218f7f652f7f947cfb947b52336439ec95ff4472481c871ca400dca0b90bd36ca63cc72e884736cae8a5ea449e383aab49c4cd6fab9c185f5b03b2bb9995436b1736674b1a1f8a9f4eb1102ad1fc406db1efa35e57d04cb2b69521ca599c548a3545805d44835b5dfde8b9039207128eba0be564d00000e00000001bc000000905bd444a8cba9ec75f404b87314bfd6020f57de5ccbe53d5fc09d4ab7d0523bad932cc48f4547c19d6fb6e5dfd506051992fcaf21fdfda48c0cbc1bac1a0db7bec9bebf7c40350a275594cdb6c0f5c94478f2d8ddb378ee5553051ba1014b4ef11c72588a4add965476d0da2f6d92e8c0745301d16b48600e1818114f9b02d82c8fe9ea5faf6a6033431267feb6788e3800000090c2cbadc76ca5c5af8dcf7288d4ef510b6114c120dfc23294df68240116291024a307f69ef01a033c11adac13172bbcbd83499538f279d4e6979184bdb3e9a71dce200df699cad843448318fc765621c6e762e8115488774101f7e3fab9e5c3119cea5b3c016fa19e2fd7686d7ab0bae4a036236ffb0cd9a1de8adeb1b624e150e917033d9a6aaaf2a93533d70007bdfc00000090328f9d32f22edfebdb68b5243666e71fe47a0739ad54826a2c9022076c8ca9f6e33deb528608d088e3e1d9a4222f1155caad9f3c4411bd779fe4e48a416cd6b30dd4dc5af43781989d1677d3c9422ee5687fef2d3f2de01d28800086c3cdddd4fab892dfc81ebdc8538f69c21137b4edb06e3b57ae6e75b684510c05225cfaf9e3ca6523fa821c3769d41a21fde5552e000001bc00000090fcbe73df4cbe4ce643bbee6919bf8ce36bb0083e91ddf443c4ee83374ceb33a79ff29e7155da16a7e1a4cc387b97981d6c38ca137a53c59b9e953d528df5e966da7e28dd7aa35b22cd75f86a920715f03dca7ef0f24bcb605e4be105a9b5d5f3fbe87f5d8bc8536011782da77732815fd863e08348fe2eb2c550f8bec4410d3850a79fd9cd2e37a1d244ba3184a99d2800000090859704b25ed494302d05adc7012684828a21a45b8aeb93df0a2d1ea91e312d66a2832a040bd2bcbbebaae7cb9dd3aa225d094a55977583142576a401ad449ed0593e7d9fd1cbc37ce036af276f565a038b63875d8090ccff076ac7495b4ff9631e86a6a0cdfa74e2f677750b1a1c280fb6ee6ff516163491aa744aad3a1c487cdab16dfdaec960b66ca812785ccf1f2a000000905726064d12c28f46856076461dd95fef270926eacd55074d64c998310a4798b699e8c864d863fa24c164036b379429ba81e7b9b52afda13d16cfcb231ff6e36812b16064122a163cd7bf935ca76ed6e275cd0e355aa41880a54c6f4fc9089e66837f477a5a0dda745ac9196f94fc8e1ec36eb8ea932eb6b4d737d6d005d0b8e3f299a2c02ac881de574900c89eea6339000001bc00000090bfee39eff3bae13492bf9ce976a56c09f166dbcd46ece93ab636914d02a7392596a2593c973fc5329d8dd03aed494ce37ba3a9a8d44108be1ff4238c414f2d8b9de63fc3adbe43edfc0bfcd0b2c85b9752eb49a51f36b995d20a3f7d80b35c30097ccc4fbe50cc4bf627e51771b5abcd43806c5d9dbce141c8c002bd56ea73d3cdfb523d1b6195ecdab57b427096227b000000900296ad69087cf87ef862839d9581a851861d600fa3e1e0dd4eea3cbebb18b868000356deed62fc7f1645f1a0b088aa169164b7f93b1ebd2e82485a677b57b68166d7896b4c65fb4808eceecca609f95546159f1d2b4ebf30862f18673f1d0248025bac6c928438e32c3b087abe01b8e827c811178866b40b4e3c14f8d1b6e89949ba757df7d18c21dd7a71fc5d4efe13000000900d33920df26da7d1d6b36377566e86e40a8015ecf91f88630ed533afafbf02a9aae149987f96ebb264eb582b1fb1aef2dbcaccc9efd52801c7d4d091b4c4a6e1378ddadfee155b09597a2ab3b1901780f0e606f6e1ffb02decffbc61f6ed141c282122b58b6ebd5807f3005d365eca15d2ce2c6ee04e53f0279af43b59017f3a5521ac893649bbf5e44cb9831879a7be000001bc00000090cc65151f7ad0a4bf1b0355424b24cc6eedba544cd71860bdd03a6855fc8242a77f21ccd3ee05d414c7cc8c8ac06108cb6102327bdb2a50dba83060c70b6cbcb31c817da3bade2a008761a0055374adbb54e0b549fe8ef201b83064196cd04bc0df1500b86ba47caf85b8bf64c01e93f27290ee8f0cfb6a5a53d9e6e2e092642df9d33d21139cceda22b76cfcdc0bbd3900000090378d2ba4c3e4b6d7f41c3e40cf644800141153017fb22ed45e0afc3f3f33f26da0a42071f04441b98a1af1bc41fc67f46ec17497f1ae5e10850c11452a284825a40d124958218ed6ab40f0babea0a827dba3a9e6efe5a9ebabbe59a1a3d64cad6ff4d706d2cad4c3f18964bc3afa143e8eff0b6469324ab2f417a4c1508b917a3e87c2f826a2ae81964f3a2c5af72d81000000906cbd3d7a20ae20388791281bbf4e67beaa96f258182d43044da9f1ebd6887b1b72da20bf46b67a23096b3f8509177b9c8dc77556cdbcc916b1ed02737ce1a8b34d3e74058494773916a1d1ab7f6658b09bf396ed9a2e70ec021178f9078dd57ca020c7a36b4e75548658ac642118f8c74062ad1169c47c2ff445433a50ff23623bae3a52b5a614fab34d12eaa314bb26000001bc000000906ea8321846cadbbbd83f29e437e2f68ed651e32a80b91c23fa9aff1116e3f7d084d238933ee634c640a369880b6eb7e1df8dd518e82546a53657a7aaf8f8e7ee8fdabb094a22378a14da612310e7dd6502aa80f268fd9bc57345c0d62c8b5b3dbd20c652445f67444074c186de015ef73221e6e865007e72082b14e9a6b03f76f5eeadfcbb705c1b03d6b983e8be0a28000000905219224f11bb74c2905c836b29a468148d41fe096400b1c4a5622c876d4fad2c161a13fbadb299cb0274f3ebb24f19f994a0fc82dff8523587cd1860b97bdf73a8a389a8b933a4711ab03bd77b28caabfdcfd2ab79cc27fe4e347d62b7acc92d385c206e4964e6252c4dffe60cc0bc6d9d0e265237941efe40116c02ed8dfa3805a63b6c998936e0a6e3d220bad3ee1300000090d07856ff8c6054302a935ee722eaf3cb1b9ec87e1c99ec4d5f05b82035d25abd2919636567dff299030db4df879a1e3da982747382e803240281fd86455d3e0ccec709c94a3226ad404ba79d6548a729a9c9ad21e1070e32154c4bb5665ea38ba1d7cf28598b3c115d50283af0a9f83da97a6571fabad795c7da119c7332ce25f686ad84f40b3ef6b08328bdb8e4733e000001bc00000090d3f985d89d0e61756a2139c09fd5502a712bf54663733ddf69cb1d3101d85c63924c625b12cd3bd36ada36864bc4443899d3c0735a5c2a29f86e8c8673952bd937cc39a6101ea05ea7e29d5ca473c8c05e3d3e37a9cb63fe19a38b2143155a2412b7feb1edd44b9686dc1179e04157e5965199f3d597190cc205e17333c995c32d5875f222e11759ccaca03613f713410000009094984b569bb94bad9099f29b90ef394dd454e2af7e3407a242f48bd08cd3fc111f49fbfc8093676a0a0f958a44b532e771e676fbcec59a5d965a98681e5460260ccd9ff9afa3638d92e4405d1f26776855ed9458d250c2854550f2e7bc3b2a7b1d2e49b3f08100ce724b420bd2f3de6a8078622e00fc4616bbf50da777426ddb2c47dc704cfcd6deb695156ca4a60e8000000090beee2b163d5d4a655689e8b0c30c8510d5c9e0fc68df0c94e9fa90d88a01d433523495024f2bf686d72323d34d8559aaacc1806e7bcb45b51cf697e3dce63ea0443807ae95619d8cbecc598e60b40ea544e93bb21b8d5862942774ebcf4ab1f56f42db3b75e3bcdc61e2c601b73286789f49ffd8b16788ce30dcd556aa35cbf32e1f628ef27cda313b1b779afa78372b000001bc00000090ca71834083c2c4a2c84e8192dec2d6f869bb192cbf4abd9a7f4fcd832d27875153abb7cc2da5eb8ccb6915b96a294cce6e99ba7632ef6757d7008b0bf0958d11e1bd49796e191a0c0c8417b4923da5c0779aaaed17ad3b4fad14065fd4203d73375e945b7792260c28893e89e3474970f80a2d5ea0f524f3efb5ffa8c2b895cbd32c5a77595c55d0b02133b97519f24600000090de3733625aa8d0451bbf8ceb0be90358fddd5863068f18505e05f9620da1bff7285b56740cf001d503bc05ff9e47c0769b45c5066c9f521cba91852d64db3748354ab1e9d12dac0284d0b63545918f00f4f1bc14c98760b9f02a666ae4721eb7b99254922bdc980ee12674075da138d68b385df945e3695c337af5ca590026d81bc5170366d9e1ee6e1a6b964782859a00000090b46b4bc458ff824b02d652b9e0e7d785589131d3359e69893c85b1606bf776de78b58044d0beb789dfaeb3104c8321ea76369c5db074097f126f8b0078dffd3ce005eb18a09cf43ac4f6f1f38dd58d1bdb1dd0dae627b5528d10adee3e1a822ca5c1aa8489c0f0e8ecdec41ad817ee12d534a241f7a6a13bb0ebe6a0e6d6349939669d5bdb654bb8f69d111a941af156000001bc0000009047099475fc1633753f715412724344352f1e4e82ce39b92b0d12b252413edde0e7c95f8b3b5ebbde7a57ba3da250bf51b2cc9c8c3f29e8b50d29ea0f31015879ca8bd47f6e092955c3c45f028b68350001831603834529b9e9625fee1b2a212e006b853c3ea4fc9124da15fd610a40aecc48728f1be8e8db55a32b26de66d1790e404c95710c76baeba3e5912a53768e00000090bcabda0ca6aea4f9d32bd42a74401684c5f46a968e48f394fb82b06ed1a36b0024f41ed47e948ddd2f96f0f9e2df0e7e61f67440a2b6e41c59059f2f563f27b21b4a7960c6f2238faf8d3bae1b31c1ed8974932b1a4ecec12e11772265bd9ded7b6751cdb0ace6d0db1055121a81f8f39b86d4e265c2bd82aa63fa52135b18c7089105d261e8a7147712b67a4f41cdcb00000090e02c17c4eacd5cab85df9268d835e0b3c1210fb114be217c839a764f1ac161bbdc2774a4fad9803a4c99315afc07b84c3796c7420f48c4a69ae5cbb3fd637a34ffb4ad7828fb81961d3bfcf6f52530d0b53f35adc9f88c96612123a23a011adb9c2b8e9acb53ee608ff642307de4ae094c859489acfe3c1d85119c4a786a1af5a3efafe2685aa4747cc63fdc84e9146500000e00000001bc00000090538a0441399b0eb4b37558ecf90d9bf9d67db754fda7d60fc3deb3c4e767bcc087f8c11ee7ee94353bb1a943dc8d148f97c3172f61121fab91a333f97129592b891c45de2c185d57c1548022605fed55bf47dbbe5470fbb7fdebc757800c35880c5ae70e372cc46272caceb0003fd6a46126a790e8d65baf954669f71bd817bc0e8c9b36e735963afcd3256ef4505b2400000090bcabc8093838df793a13c3cf44a1a70fff0569e2b1356a210fd55913b23068d1a98ea92dd3df55bd2755d97b09887edf8860b310a675eeec0ac1869aae6289c3e49560b8f4eb583bf40f6e21654a6b80e7af429fc7f038d95ecffba457ed949bbb7995158b2061f986643795c68b7967facb2cd028641daedf89779cf3fdfc90d12865fb851a5cf4eeabc7911d3d8f4a000000901f9dadab38f2ad1c8c0bf1b02c9bf4d584069a3b54a92ce07141c19e7bc975ea943719224e6f93fe69dfd882b6ecc94ec80a1da4189443cb04636e92f09f88adacea1ba91c31cfb9b7474ff1d58d63652f522adf727c82127393617c4b1530d8c961d41e378e3f5f266efc1bb0b7455d75148d6c79f98c01a5d5dafd3ba03f2639b4b45678ef60587bea187af77a11bb000001bc000000903442c44f4115857ef498fa03b90666e4b043398d13f0c2523a31c4ad92bebb6b6a3826f7f9158e1610939d54d9a3a041aa38d1192bf0dc797710a83799f48e470deeca42989c44b7622c4b99ad4922673f9ca98815da551a3d3e882643bdfb9cf0987abc462b859b433c1c7e1c9e96b4b4961302654f31326b8c6ab0b751d6f267c2adcad54b9058cc6fd5e9c8b70cd4000000906d69f738576233ec2328d6bd1ee76e6b40dab296dc3b214e02c6418e007ea20470acd84bd70c7ba5c24cb4360c8641f399a5b928077b3d11ceaaa73c11f7f37bd246208926b9c1b0e55abe71413511c4d0f04e811246a32542f7df6ac2a53254f1fcb9dd9716d85697cfe7afb069c65e9c03247da7195e9d39cc81f3dbc1a5b78e989c9e6d8956376e65a68b15be17340000009076c552a5d849a23c028a8df9458c56ef39d43d4e88b83cc86a7c5f93937b9c4db4f58496390d315c983284b9b68b5a546ec81ad4276d487ad1327ceb7b1f028887b1a7dd91fc6df07232e8371d78770a860f4890bef4d66018bc2dd5cf19c19da34b5efceb81804574f18011c9d52373d6d4996811bfa4ac2f947d90f5dcff96c9a8a4a407950c1de8c24bfff838971c000001bc0000009020c2f2ce0288f6e482241ead06ee7eb7b9f7d75f81c08b0da7b8d74fcf71c226add5b6db17fc64cdebd52bace97d20a655a05db3e73cfe16a0b88f11c049bb4a3b84ba4b50ccd39a9bde94edda541f5b44fda6a243468e74b9207fcd9d0385417891fe89f8c98a7ff77709e225c2039b6669e9879b5f595f52b194051ffa1a28f79973c4766e14da62a94b96483ac44200000090899898e94b501a777a9c12fb71a41e7697903ee2467966a5fe4ebb3024763e3d1ec29fee30c778929cb1a8a7265bd94d2dc67b1f6f6c8fea74ec2218ebcfaafb86f31426be18238178d23a165e671a30f3cb1b583f31555cb2be7e939aaa3a5b730c719fc73baccb83f69c07b26787d0107c7576dddc9dbd9d5fc7d0877f5150b27379c1d0b957180db2f528caadbc870000009057a22904be7a901c8cc3780b0277abfd02cc690199f208162df307f4168800bfbf2d997b9164cd2094a905d0d990cba8bebdfc6b4f30f740f811b44d203454d4364376c90912dc515f7752494649674edce66dc97a66dbb635ae57019ec8c46279e5373b6acf992a1a49edfdc3975f89d3185ad1b2de46ec88647230df94679cc356cb7abadd931aa6f294e34c3eed16000001bc0000009025609637221fe1306882993148602ceb784483a1151fed8e832fa18354016cdf71254410e38ac04184851ef76e6fcc5aba4e9a6c9e2638e41c7c5f8cee1b13cd3b0d17035b91ad04c63ee8a196ba537c26145c76a657e3d58ce9fed1d815a923033f7f3b4e866678d5060c1fbe338741b642162e9b7b8f9c47652521db9d99936c4d1ad38ee22f40bee9bc0f9ada6616000000901cdc562761ae6a5df3735ae6520eb47449dbd832f71ed2fc601aba142d20e1db7af47e209133de4a4874478df07071a4e0e373f4c2a61f0ef9036ac6b9f7dc2ca68a9b9d42d95caf623a8d1cb579b14e8b7d3fb8364f41bb945b63d933917fccec8de9746d5a295470a0c72ae94f47ed1a19445e70fdb586d9e6e7040bda1392fe9f3824c366512191767ddb708db86000000090f1a3c9017a4f4e312db8be2df5c2ffc914976a896d42ed510c47de5e437d6a4d7c61f893b78170690fad42b3f785fc77aec0a3cfc350fa0fb8c2d167b83f3d6fcb68e198633ab4538cd326e50c60d09f11cc14ddbf310e66c54021708c305bf57fa089950e565ae42169fbae159a661e68e641373df3cd38f455f3b8ab7d502d8187451fbe918b56a7c826e97ece64f4000001bc000000904576be0ee1fb3989c2b50c3c12eb035478869d0070c9522062b4d729485a9d6ca310cb28835f7611f4c44e8a92bbce8a7b52e229ce919a836b1942920d895205469b78da41f4862da83b05228c9728fcb1865b5b24002d2cbd16df45312f7dd1321943f1f7bb6aa432bdb84462069bcfc58650c1b4bdafd3992b5ba65657965656128fe027ce897b2051c9c697a1bcfd000000906898e921b3171d11bfa8902b63cfe050b43129c7395b6408415a18ad43c9543ed00cf3932f6023e999bc2ecb19853b3f20cf8cd5dbbe8514d9ea535dc4767cc9c9e88ff5bc664641e6fcf7d60b4cda224238e457073e702b2aa03c6d3dbb3ee797493a3afb2d079389e1548b761aa78929c4654c1dc1260d1db3cc989eab174cf2639838f844efcc4f648ed6b1c635f700000090fc9483293459d113eee0962ddc86156fd3cd45d05a0c16e07b4c0f3bfa660e3b069664717211a3cc3682945993548caa5b22df049a2f86238b3118ea877ecf9829afffab51135dfb66651aca3346892221585fe7b4c05b112fdfeee3134f6e8d3c7205e0de0a7d11fd4ba79ee612e840d6f859a4e3c746d122efd2e80755b46e4acf8c38d23f9271e101865e1ed823fb000001bc00000090c3cf4166479dca196f8f0246666941e3159f4e630223144a4e7a5a3f9f275c365e9191c212e2463a159e9de3155255f0f9c3b26c82f97c1d82601be3c51eb33752533cedfa1df5a434d37565da7aeb49f6fce23d4419aa3dc6c29478260e4254119cd7fbc9734d2ad321ab505d3b3c81eaa6e991c9a101e7250d71acadce5669281a3586b524e89064a42ebbcbf9f65400000090f32756a1d3fac1cfd947619de20dd66cb5a3bab4a4b1735d81e0b70deef25533bd6183cbe0b46ce35a4fa3ebc01b62302bb65d2a6db20233b500577296657e24768a1837c1eacd099834e69d3f878ce837dd31a7b8a8ed78e624a1810a7aba36f6ddb23c411b2ee5034a366c18bfaf3bf8e32e6d38361c9150f3c008825b8be8a3e5d177c80b2450c4feffbf29c8bce500000090c815b26c6e93de18db7c07eefdd72c77fc04eede275c87032768403812324fb8627805521f427e1fe5f881739df67d2f94fe358fddc4a971495b8ab18dfc8bcd83acc0117b65e15ece82916332c400424b9df1a8c6faf744d3d858cc63d5748ef8e927b7cb58c0129426a11afea0bb752eba612fb3f3bc43b1a2c627e7eeaf83e67f54683a0b4886990b67e07ce112b2000001bc0000009047403c11095d5b37db843ee4def2f8314b6f35746d30dbcf7095a8f5bb372ba1f385c21a8261210f8d0ac4c574f48bcff6f6f328bd938542b88fed261a7bde161f45913a788d2e418e9c8e432edfedd0147966d3bcaf0b98d0df08552403e92fffc01a0508721e1ad14df4306b4308dee4de010f603093bab5faed87c6cf60ba3171a00856f2ac3b06b699f7bfeb90f700000090af5b01631cce3055d7a9453decba284c3fdc06b0b71d98331cda285eea5206b3d2849aa349f8964e41cdeee6e5033639273d9a84fd20d695347a217822773890dced57219cc9acd1c866875d58939b7436db0eaaae1e44ed46ec19aa52c5f07139084a2ab1750e25c4ba379c4e683c08dbd954495bf6290e6edc61fdbe268142910e82c6aef3873100e3e7f40c4e856b00000090eb59cea068d5d6f4ee1d8115de3caa9ac0bc1ef647dab13a897080ee608c4ac251f4ef3fef30c12a7ac13eb02de4f2a37027b245dd9f2ea62465039a847c84c9ce2058930d1fa6d573866a018abf06350b09f9ad6e6fb0934122c64e7edc06690432f62faf63bf11f2881d3026ac9bd17d2143f7bd55cecd872e6fc98494f20c9f1d3c6436a4eff1baac096c0c5c882e000001bc000000907a519a60fe33f4b9382b5a67a538ebf6f53574dc1b2226f682bb87090ed48de9760c9b3e96ff6c87a8d2f2bcf4eabd7ae4d7f7859b10b3490561221bda35379a6196f07f7eec1be17be8abf819fa543655da0b0e224a2206197a464dfc7f0f812f194256ec8197aa776989f7f6b373a3b7a9fdbd40f85b203d63ea04bb972dbfcd15e5e7f1107e6270662260771da70e00000090bfa04272dd685cca97b73fe43df6f13aec32a46040e7a6495aed0c841aaeb495dc9428024abb90cb8309a9bc381a08428cbce5642ba0c18ba4cebf593102a05c62dffebddd38699b7d0f61d9f0114e3d7c713d65175a0aadbd4ad218a71bd8c9c9822dd7aeb4fc66994e2d31402cf81462f3ca7dc5df16a2dd15326f212096b22b30f2e8634327453802da76ac65615c00000090a479c98778c84ca2d9882cc42ef49d8441e855a2f54a43e045ded34978d82b0b1b0cd89ae968660d697b5873cb35dc91d8f463c2607d6f8848ce86a8c9eb3d3acb36d049915591056ab1b79aae00a5f568dcc3c48ae34c054ecdbfed0e96eae51e734386b262e62de543bc05d56251cad682b889103e58a536508821f847033a321142d8933ecc097dcefc5430fadb3a00000e00000001bc00000090b7968a955d2dfccf014999255b9ca6e954d7caf9a303bef2814245542a14bbfe846c946b03c54c945928d7c18b4a756d3636260d94f5d69ef6f93c523b2d80e2dfa6212f9fa3c82b083f3cc5d0a6a500837ecaff099978ac1229a823df5b11facb2eef513c1b277d704e51c28551814916d644e8818d8f971e1d80f2f735644be615e57885d8568b3efc13b4a9a1fb0a00000090a10b4b7824af15267906d782f4904863afba1c3d1ed581e99e32c6c493a7846e6f846c84286bf333ed45ae38e0510284cb164ccabd2fe49d5791a710b94c8df61b337fe569991dc692314e8eca72af12107c2d75080debacdbc1318c0a8c40b6cb600c366a733fecc7f76543c4dd73ca4b237ab3b176d98537532fe0382ffddf4e4426f5227b0a4ac756c9f6badb234e0000009085c8b49b001dd30b7018b2a4a90e8485c200113f9c3c7867cdf5a4cbfc8490f3b34a056c35be01b576f39d69a86e7f60c2f6f8f1ee445b96a4449114ea6ed1e8d03fbc50bfc658c43e8d71dde864b506380ad15dd48cf99dc7fd3c82f3f1e48bc4409ae2ace69c4350fb1235f7e445b1f41e96477784299439dd984b19d8bba4489aeb66862d543ff340073d046c80f9000001bc000000908e9cc39a7bdf0721646ba3b0233c7b8631903679258eb14f27966ecc188d74c92fb176aed4fb55e0022bc417a1976da6b1e9ef8a26a9ebacc234bd030c9f930e09fadb0e5989f964ac2db2e8c08fea5ce219ee1c757de3b3305d537c5acbdb7164e6c0c5bdea99ca6e05751c3d6c8ca4abfd29f3027cd21467dda03574adf18be31acfb55227f08291fc7ff94aafa82900000090d7ea79f2a79ac7b7199608412594e9c39d6d200c865056541c65d00218430bb6eecca91752dd462ed04bf2337c17763fc18326195672e7664138f28f44afe7bd8ee5e36e5237fe193ef4c82c8d0c608bc078dec1bf9a6e693113e6d91e261c579c66478ac5a1596ccb91ed884dcf88ff8b8ed010c46d26b560d54b96eddd6b4f435b2149aca948f24d9403096efc7d7000000090cf657fdb9a0dd2b397c3c6f86cabe903860f881fa3d787e00179173c8061a7a903389c4f0ff1bac518ddccf514eefc9814f49f54ab22f25cf0bafeb92589108ffcd6c35ead1950640949e8f7025f5e3e669dd8f298498655d4f22d4908c40f6a1c9d02ff790d397440b7d0e0e64b2eb03b52be821ee39dad03788d613b876fca3053ce1fbbf61588be94342740011cf6000001bc00000090db066dd99708e02662124ea437c46cad412577c6b6e94d535f1bc556be4d2215c19428926ffe706f811af6eb239dacdcfe6f2b00c14c70ccbf2548cd3eb3c59ee030c1a0b3f02e952e3e370f39a3407711a393569c9905fe0be6048cada151dd5fb1337d334b5dc1c2b018eaf892d3edf265f5c22e45dcf843b0647159f4dcde84bdf31133bbf8b7c692b7d24c1a063d000000907bd9616b869597f8c331a4112d51429c804370966e033be8135121beb7a4dfc21ecdc37facdc01ecc6d1db6e9435ecb4833f197b6577403d57d2c09f511e496da938ea4898bbbeefcf5c776112961888d2aab79a214ed7e45d34a7699ad5523e02ae32c96a2a49c0cc5da2581e81ccf55439f4f5d0e52f5542c86a65dc8c30aaa326972fc852c514e57877fc1632a10100000090db2a0f48ef0ee0a981673c0fc77b364c4d5b02498e71853c6806e66f215613b266da6f2c3295f6a61099d72f94ceef9a0ceff8464c2b9b106bf36bf6ccfd512f56e7d026e7f680ae933978974704a03b27a1ce316c14c50bd191380b7ae6e5eed923737aebcf01092047f81ecd47c9441536c5a4579dbb32a1fa3c2d5758014750efec3a27c52ea30b68f5d9f4850e2e000001bc0000009028a58a7daf03e720795deb55e471a44b048b694f524903dd1aadc6779f6b286caaafcfd0b95d213eff8ebdf24a227ee8a2503d9c02ee079bee47cc032af93c1f513da5c754599e5c14a53cce674e1e37980840e2cbfa446d7c8e00ac0797cc6973c723f3e7e1e4f05eeb27463c1cac066661b441c36d43d223effcbb1a7e16eb9a616c23efa8643703a519fce0e3dec900000090e12682942a9cb9d8d97e0d8542d4b3eb2f61e1c6b18d15dbe382472cb8eb601c2191b239f98b6de85ff2d96b53c5158e33dd6d195bf4837dc481d5c068136ec4d31923c522342c81ff3fac8721a1da2e83d81be1e3d657a9d6ea592a634ffd4385226199dadadd8af222616ddd36b8a58b6b014d8659e76e99a4447a1773869f57c4ff69075ccddfa46de2db7673102a0000009014acf34b96562f756f3a34419fc01eefef5123364d56c35c3226813f56b7868e300d8c299ef09be1b08b38a85f759bce2b14fffcf6892f37d18c54ba9516a85fe9ed9de7293d7e7dd0a8d79ec9b069faf44f250c4c5f748b396901228c7bafcd7c89059fc0b330b37a2b9be7c4805c50c8cdf439e0f6b8fb7e8706ed29940bf7098edde8b3f427405865d2a6dedbd040000001bc0000009076e1ab6c68777495c22513e219f4a9ef4ddff594c95ad42337177a1fb4842ee0494168c135904a0820e65e95ef99548b80dacc87fe0ad7a58c67076640d3075e9f9f1cfcecce95b7d1178fbf6ae8662ac3e09c6470fb6ee972e1af3833309657eb02185552813b4231fb0dfef0046567243efe8bf958502aa87c2b08463f71ca4194bff89dd4b29b7e039784145d5e430000009041331715e1cb585124b0dc39418125664fe058a973203758019fa2ef0ea59c7bd5699c0d072e61cfade043c16f98fe730b4c8b62c66aeca37cb5914337462d7a8865ea805c3a989f184a154b8cb49305d9b15d98703e9bc55b33d3fdf0ac4cf476ed841c65a6372744f4edd93b550e48b49c3acbeea01235449807c8bd5edc26433d94016700d07365769ecdce72bf4400000090c362e0f4934778f4585405e6402fb9de60210e5f1209f942cf428510da7f03774f0121a7259defeb3f1ff6895b5dabb8fa7dcf1c7e1c8f157c01f00f62968a872d0b1d5d072d37aa0bd644d63489d0fedb5eed785b537c852f81b1def1b4dc788eb6d8255e396854a06fbabe3cc4482301c38923ad0be4f9696227eb3f5d83e99f554f1dbd79d1b64a50341a85a73740000001bc00000090a6e13c2eb058853e0865e0d942ec7d63cbca97e6aace8d62edb8429a5a2cbd2a2ce68508e01326c60881c584e71f4eecce64d2d2ad804c62ca47c5a0d1958b6bc7983aae29d9430914e4c09247d53fc8a1ecaa20b93662f4020cf7331a55701ee9fa57b97c9044d7048dbe7d1a9a350c96e0e22b1d808e8d24f17e233e0c864fddfdc7b68a8877c73cc191eca7eb9f1000000090922b263725ba81ccd8d7422243bbb9806961a47e96da934a3a5fc4603e5d5e4e6bc7d38fd31c84aa1747287d9f729869ab9c0f32bde16677534a83148f9c489920d3b29f6cf68324c2e5d864932dfa60fc97cbcd4d9657281712b022e29f5f89992cca034a6342d635eba4c0ad2df5af89904e4276ab1da6a39432ee1c0f9a8bf0ee4eacfa26a54d1a22a3d63732744a00000090c673de086083e4f2deaa6a3f34a917e374d1a9c2577ab6a85ff9bb583bbe7fa923f3efcf68348028587ee4b7be6df0a97c6af81b93af58038760a59f2d91bdd3126fdb44c80b208862924a53122a75d0d0a70b5433714b1eb1203cbf165a934a6568c68a22d358490deecff0558ccdb30e006a98cf07610a55194893c9649b30398a3301e8ba5d721279caa106549b6f000001bc000000904a4029e9184666e191b436b44bfa3a8857c4335075eb18bf413257765e02e3e16fcc66d3c2c32e339c0ae1b4f99a66232adfaf33417d71e3fb35cfa8272ab18257d412ae7c56b7c65e1dc1c4ffd6ea5bbc3f16dd46d111c38999b5d4ad141910dd482765f3cdf7d6fda72159ecf246f4ec5e09abf857d3627a4d90553dde7ea3f5663a02b08ce0069b78cb5e4f49c0d8000000902178902bc93e04b3f3a6658a3ee3cd0aef2a16aaed6f0249aef5a026de6f516849832b547d9a4e026ced2da2ede5ab517adadd045cc698446827bd8bca4491e2521ad944320d7198e23ae65432a90c51c7d0c0c6dd2bb78ec5a47c241ab318810f37025a301961be34aa75889f13fb67f39c272222d68fdbdf47e0ff5b3673b290951c674a463c68ca3105bcfde34ea600000090688c993c3b2a470cc31c4bee959a98d1af8c12d21e520b50773fd7723d9d9d6cddb095a99236d054ce3c11c6f557cfdc79bca98c54964cd68944b28f65831eb3ec6086b226077d5512c782e030b57e3c3276da66d8eb3af1b7d2d76a2a382a1b6e7f71e1c4130bd24b864dba04727ced8abfff56ad35533c1fc7eab7ef08949d08c5208ae3e042e763322cbbb0c65776000001bc00000090d50be3ce4e58c66a007f2716226fd00515d21be6161efc71317f535c0ad3f1cb0497aa0c55e3bec7a34675504334497b6958783f1090b88ee174e107759ae3706ef200b69e4e9681a67239f9512c4e86b101df5bf73f08d3fd08acef16bc9857b722a6472a6dff98baacace6f3478fa363e9500406db02772c4fd328f7bc82b0448cea431a089f6f567410d44992c3d100000090a2f72607f0f9161f24cc9c00ba8914937e24cc3d20d3b14c751076ed5481930c339928038c366f5fa1db32c055782c94b44d7e6a73c72b8370740c9a91972eb71165516107307e18f0d58c0dd51fb0585f05e6b64a7903f7e427ba93bb69a705fc464095757f14c5b86bab8352b84a0066210a190d0ff68fb88794730e6d63cd8ef03f632f8a6d28e7deb8a9df7dc83c00000090b5abd77435f66a78e2de4cdc07f5326e6ed20a594ebb0b3dbecbebcddb6ea6fd756b4393b024cff5cc9a178ae19f5088f6130f37117b37bd1bb5847f352862590f5a21dd0b1cd4060af8dbbb7300557e12bbd00fcbf953b4111477c5add912c77cccfe78306b3f29a5186bf4f005d948b3eef381081e2a8693299484d28445e4843b48c6b52582d8a2b5d84c749ac950000033a000000ce40000012800000090229388b3a431be6b9653aff04b9359a8608767dc2de0419efb0b91f247a4269f45a4b1e2a8bc2e6dda32f707eecd34cb3366b36803954fdbb8f279d852b37b33decc47345388d527433dba1449c00d03a490e6b5f7f0e9ad28301d099ac3492489f8287165f5c231389123b86db7baae55731f7d2ca674378556f89548ab1f9f037b5c982c7b7ebaa74ae94e2dc4732b000000903aee5e522b5f56e536df8ef54bd19f1c5bb1d820658fffd764da995e584a6efaf04d744beeb6127f19410af6fb65edd2261dbce88a18cf55d47a07c5c550ebd1d6425136927d40bc78a13c45da9e88993ef764aee2a53ea05dca3ed57368eda2c5a6a13b08687360271d05d835b94b78efe6b60f2839355849495a363ded3507648476e19e3cc1d7903191e5bd8598a60000012800000090505af5b4991216986ea5634f906556df448f90ee8d7c400a6e96e2d2014d9ca502059dbc82a4eb40e6422cc17d2c59399035a13cf18494af6e79de74dc243f69a18355d4ce14c1121ec65ec9722c4667e31ade9bb4ab5c41db9ebac1f0e215dc5236dd747e0ba8685ccaa12760865546d52a9e2245d699c8e88d89cd183e04c0ef8b4b6547141d247937a6da6ae338e50000009094439dac22b0f4e1a1cf2747ff890355cdb876d1133463d0f3016734159d099540628b8a81562afd699b1bcbc2885ef8feeed751536d9bd8cf046a0bdf0398984146839da849ec6bd897350bda300f04276a1b7d9abf799776a3c64294b6e4c9c768e19f0ef758e0fa97a706e6315cdc7a2370f89e301ccfb5664a9cc5becdf9bb0fd015936b984c9b4800e62b2e1f6f0000012800000090e0698c6a57315526b74f6cb3617711e0c054b0488cd2b3d413e18674be991c4ce9d6796564eaebb8977b5ae75ba9a47259348b64e8330754cc5543c3b867da1709fdda0a509cf7a216c6c8693547cb4454d17181ad1e67c51da2446c1b922c87836775ec86ed5aba1e4e14bac831021dde12ebd15223efab74e73b47d7d42a64b255dbe1929a91438ee5d82ec2c2b60d0000009072b35250299df92ec033153bd0799eae0234158b942abf7c23df05e6c60809a5e0a344d7de0b739c3c478c00c4c020c9cade6a7f3c10031c47ad3248bc56b47ac7ec58f071aabb500370c990804be96157e63e41ef9476a965467cf588f77f2bb420477512ff881df4bc89628bf8be5b095170733398ffb463ad6347e4ec5d3345e35be599a28d5e744efb625ba90ef400000128000000903c56b6d74c83e54735baca8111b0c3e5496c7cc3737c1cbea76e13761c0c086366de8290722cada540d19e8d45235e49469bfeab2b09f84607d6bc069409fc29d6ff6986e715caf2b411343e1b4e66c0aaec16ff15335f3030803585f8769fdaff07f9bb95d5b3a1f25a3d5bdc8b8420d6ab8d8c8c3146e82e330abf83ad8bb8e8153ed842cb780af11f4a7104a628e000000090d88f4ce50221ca7385fb78a7db3e639413b03b803b6bb177f100c95007507af701f9b4982607615066f02f598ed06b6f98be07c33e8283eae9483624822dcf36400e8193dfc720d12e58d57bd1eb0fdaaa014be61644f62ad2401ff2460f91b9a852ecd0c761ed2fbf6c00e721cea4f4387bc825f1bb92d29dd01e7aa31f4aba59a2188d3c2590b52cfdd921d7e8e57c0000012800000090aab78c0b3962855a0dce967579343c0137331b1cd622dc347ba3b6e3d66ac75c602484fb7a24e771f9e1b3f9edf768b86614c5e12f5aab14023a1f35e7693c048468d51e1ad2f71bbe06deb0a6f25b348372c25388d1cd7e44fb2a01194786bd2661abf38e323be07ac7e7c869348b6a0fe03fe712c3c2ba944353e7c161715aa4f5a6988a0531bdb757a5b96bdba738000000903dcdb5cead4dbc2d6f7f4dd0093b1c14f44876543bf016543b15a05938d6fb66f17f02a0e5467532f8441e0699e20acd7060a2b6ebbeb04f65af86b416b9a081a5cee331691a934379450b2bb4ceb4b1cab8f5fc861ac3d2acbb6485e2e689c91e09052ff61f9a819bfbea097cda0c6474f8a788a00cca8d4c863738bed83bc8e16e0e9759f9ac190d2b28987ea4231200000128000000903cdefcfd45b1ba2d83be0a46ab7dd242f7e5e895e7672f50add523a0eb6358f94c04302bf690ba420aa42a69e82a4f373f1887e7698ae51d11e258901baed21b6c0d6c3d16de591910540b9abad5c89a96bdeab09b27a752e94dcb2e71ed8571c963df9afa3d8d736b0621d941429139aae3da4fafa8def367250ad17cfaddf758914fd43d6901a92473fbb27726668900000090985b0016d8588b238dfd905cd864cae91d3ef4474833887e1a0119f5b8e67441d409af7bf106a2a9a10b887bf8edaa4d240f2de9cd0d7a180819412f076d2502431195001c2cb2b624c249519933e40cf7918e9d8856a8bd927f761bab2a4d2bb1a8292f4d63107f806f7fb971d4e3dbfacf5798444c335bd737a5e00c78f148c754f8d761c3ff396af00e6808fd01f0000001280000009001ab2f2f96fcaf3ee139547dfcb20712ace6ae915f8d86d2aeb96a8efc356a2b0c9e40fec9b001f22ebc49c53056f781aa0145115822ed88c143f12a353d5f0470fbba36e85ef4491c85c310feaa6a20093eaa78eb1e49c815cca3fbcfa32a942f90dd82ff94fdb74d66a089fe8529fbbb6046b30533d144f6a537fe8fd734ce32bbcab3bc2019aef32f77692397b2e400000090ce9fbb834c6c927a11fac76cdfc44a00edcae62a5d8088092a2e7545a3b4a7d6d58566a30760b7b3f4e58fbfe571c4d5c72da8be7b7999a7c29c70a02b868ef5558b2b70b1cba583d27898bbd2d66c2923944c85d4fc77d36a5241780df91173f2bf13e9c814f68c1fe6b5d92d46f7c1b2bd1e69ed00017262f1d8b1fe795b498b920a9be2086eb2f00b8f652964039d00000128000000908860e1a69a9e2cbf88e05b93915ebc98e8b609f41781ac97fafe6c3e18e8c276e6faaa4b252c784a9b8c09e1caef1265e0f2c467d6272fdc889e539ef0aede3684937782e4825d9aecc975e09770420f04ba1333c84fee4dcc917d6ee0e567aa421f205839425a57597de409eecaa93d3a4fb262f9a99c14bfec03e1437b1108323ee30fae221f925397481c6dadcad200000090966fed22f972cdb59d1aa2e6c28c7643e2d1a2dcfd4636345c21e9d2c702dd6e9c97eea8fa2b4a5f2ce409f9706f1c4f7061ba0597dc1772c5252d3f5c0996e17fb44db31970424fa04c39e4f9dfe1df3a19ef6536cf3678704566cead85577908d2920d4b8bdc43c8154712f0e994deabb13034ec5db65ed7f1a0099cce611f0005bd6b2d2fb8168fb09b296d6d3de600000128000000901e24bf1b818df3b4f0c786e0f65346a46cbc6e32a4b3dd7354a3e49e45474fa4e90e150e00d9caf47ff6cf2ef7e5af39576ad7b7afd93a1271dd3e6cd08bafc90cfe66772ae41fcd3f6f184fc55fcb61ee464c44442f22a5d6ae4d8423fbb03d2ecc706b6043e1762d51df7c4f72e4bae329325f1b813714178ac415fac87060cea5fc7976804ea4d580b5a6a9f2bc320000009069200cddb6678b395690d22a92613469428b1d487c79be4450ceb95273f6b409c3dcfef361f1a0fa88209a31eb26b67cd96374df6bbe2b32dfcd867d00d8d5f4030e3091d200e4d95a1c0d511f8f37ba31378e1bae21b3125818a75f52fc89fadf49b10125af4c66631914efe6b68bb40d1d6701e52cf14587be5e697aba1f2427d67356e5a9c10f3c6454ed23af43f9000001280000009075bdd58d142542120664c3a621de692476f985546d6e644cc10fff950d99e39c3dc88d84dee487f947bbb0f3917c292f4276e9f87fa5724f0733daa0922f338c1cf4ad40224cf3ffa9e0ef29349903fceadf23ab67bdc42a6d97b73bb85352fb539252d59b6e7e86238327d630e0a4f6ec9d8931377580c4f6ba30f5187e4d59f60f1acd6fc96ecbbf94f13a92830790000000905ed953ddd64ef5fbfe5edb5fb182de41aa7a1fd5f9e85b6d5ea74cd8a7bdafaae31a434198d8841c3718a07ce17edceaa7e3fbfef7c0cc8aa893fc8115857754053d8c77e1b16cf1feb8e3d0860585641d188ea2c414831f3624ab59d835851f1bd033090662fcf445ba08f4876bf71590e5bc3c32ceb745088cb0f2ef46272da82ee42ff496bffc2ac37a20d2bacf4e00000128000000905a341b6ce0ede8f5f8f6e8d32e8022c11d0c68fcb7aced295e2ad1a83a9596187a46d257d062ab1c70721d5aa577dfa429081d6a355708cf37b903ca19764a3c0dab929758e5193aa8d12150c059339aec63bebd51c3092d43145cfb9d3c451dc39d6381650d37398521efabadbe3c1f182848defb521b96f8010d5ebb0d567cc1a35b1f92239a47976e2b32989ca7d30000009073ccdd690f4eafe2eead77e9e089ba7511cae490f3538e6c84934e714a4e9fe512908ad79cc5ba5e0fb79dbd9e583c32a9bf87ee48c96635a9a75be8c35194ea95499f3249d0a1bd568e081c6784f79a20467f0d81545aa21a7e38ecf6ef9d94dd9f5df93bf563720b644bda89f3c1e229db4cbe6eb0dfca5adcc805e1ab68da3cb812817251b02acb103aed40541a2b00000ce4000001280000009026bce16f9034980ede54249ed45fd623470304ac7d5c290037b743d785762c0178dde6a5b11b70f67ea2aaa4bdcad784ad51517c0aad8d0741ee9896cdfddf5efa8cb971bf13704a62ea56426c5b5b28dba5b9d7431f3b703d16ca928b14717ad847beff58bd00703d469b04ae8d5673c764459d7c70c487e2b8dc56921f3772fe890e19d46937246b6ecb53f4f50c5500000090f04587d4fab3a75048c04fa486941e4e874b19ad77ad780f6074d2384fefac7ce05c28ae2ad4bf50e0025bade67aae8770584ba9992b15db5533cf3b89fb64677adb54c862e350062e733f35edde61fc884a5293d24e20c4310964eafb3c5960d7d1def9a6f609e98b1022a692f0fb786d81df0d158fff49bd11a990c3122e2fb83684fe6b5106cfa2733c6fab9fb88b000001280000009035a7eeca40c8e2bba2ed2b757b8d6490f44e13e161354541e0075ce961822a4eb27b051457f9e88be8684213c8fcaa00ad2052fe2886e701cc24d8d6f7a4aa4b3597c7d85613edf04dfcada7d7c39da86b077d97620635b6dbd29824e0848357be256b504ff5652165c4822d4ad820ee2c79467b423f5d31adb633612b5e5b15777d6ccae55ec70d99a6c10c030cfe2a00000090aebaa1ebca372bd33e7852db4163446d886090bcd05d6e5355d11047e601463f4507859694c8e30d11c9d74acb02a5c7bd5eed8dac2d9f0e5d0281007233a02ea4c0ed665441aa57c0c7082b942d65b53e605ec7d3d89af83196c02996622bd3ebaa5d54b7d4da94727478e2987ccb4bfb81a153a99603930fd609be0e6be983e1fd59f539a91df3e9f1763142f9a6ce0000012800000090524c471a92b6d7165edf28ce0e54d66a6f61e270e338d4cf262c8cd180db7be85cec5365b6008feb5be52c99461328e1ebdf6893df6f9808a74e2cd5fc6c60919000a617cb9a4bcf84e01cd6404e7d5dac142e826e737dc8758b90c4dccaedab94f1cbfd7cf053d8fcae94bd309f201831e0edfc6ae8e30457e0c0371031220947c78fea955d4680fe39ae790b9e963e00000090d3bd94123ca96bff2dee2aa370efcd404e118f1180d79530dedaba3dc3154614e9915a8b0901b005c288f061f03c0c60566d357ef772387d8e61e8f4c2b8654c62c7cd23c3ac9c033d98892b1ea04ba5b4a9aca46eb7a128045a09269f9bd4fee8402b8be68dab85fd929afba6f29a7fe738be2ce0e94820e0f9c6518bee1b44679c9780f200b5c6261802b4a0be2b1c0000012800000090319c0d94159436bb81fcc81be0aaf9e3118a5955348108a8fca1f4a77806ec0462f1899c78170ff4176f5e97d5a8d2721e7bc03a8eb6dda0351850ba330a2b54cb7128286d9ad0d7b58c37d112b2536db4d6a86d66a3c8559d4cdc19caac191228d72367ed35f94d5d2dd7043ab074a7ae22ffb167347637c3ba2ad3a0c419d1181e67b061a1de2ac917f012999b1d0300000090065f2755859b1133d853b59bcc80bb73af1189664b3195d624861c07c9eb878cfa8687cfb82c4f851b0528473e27bb9af77059ae1c4e23a5f2372ff75857075a753a9c75875ae2129823424e66d5d78f84afd052d61b0a1b31a3dfe6cb1a806aa19a50d5b9ec157d2facb4f563abcb83cc3b6aac3dcc528c329b4919a355907b36cf2ee524d926ba87092509e3d808f70000012800000090fa2875f8be9eb0776642aa5d2bf2bc615e324ee515e2d4bdf81c09de95cb6ab3136288cc91a3e145bd70fc686df1754f7162baf30e724733a98258f91792da9bbc4264cca247c12d94e1fc2f2e45f9f931060c14c2462f6b0cfaa1a6286c03d3e30d81cf3c03f68af6d107fd42cca7438ece9749058fbc2328dd9bbe02f4f8d6d2309e6c3b0001af3cc932dc8bcc8ed200000090f50d7d32ab91cd8c3aff752e922844a0bfd5edef2f6bf8784360fd5b486e44288b07615b9d580f34a302222225ceb2f04d41339ec684e624163d4917bc8e42193fe14b0c1c88d68f88f9067ef677bcb76c752f326f2e536bf531c021e543fde42a5aa9e1c499bee05f6d78647b9d9d5ebbeafb53b8604767811f8e2ba029cb438e555810adec3f85ba2521675c2750440000012800000090d3e5f1f0b7463a85fb887c73b59cded50445fe4e890daeedf6a576380d2b3fa11c7518fb25af49490abbd6712cceb4305f3d43d61349be0c9b4c393a8a6bbf30f17dbc06c2103572b1b5cf22f86daf99eb76470d469fae219d26c1dbd533f47cbf1a3fdedbc55ae23dc2a789e51a8ab28eb2a0f292ed0c9f7253913199ccb2a910bb012a2ccf4630fefa169f661ad3650000009010599e417943025a7639267a1e18127c1cd439d05a1039a059f8ab49f9dcef63b890dabfa6096ec7fa0ddad844b29842ed3ec56bd6190c811da59fa70a07f9f5571dfa7217aa63717e7e6409ed81e37701851638904cc026911824d6b25c702fddc156b58f5f48ef411176330f9fae31236c67f30a1650158369ffef352e4ce3fc6a4d8cb5fa6ed9c5ad9ad3d119701a0000012800000090a389db0fd184113a4e4b46aa17388cbde640bfce3325cf61bd8ad7cdad47770eaa77abe2e690f52076a252505704b309cb8851cb69b24c95a87489136e6f73c0bfd49b94a4ef197d01d754d1ede85e4663e923dadbb4a4b806746f2d1ed9d992e06e2dd80f320f827db44059e1716ea92a1fb7c77e0d624d5adc773982b6c8d6687b699b3bdcd74edd00d78a69658c7c0000009028f5c952c4c3cae898a4269ac8ee0a0d4168e771a6f8d58561fed45c016c95c495c721923916f6d187b2523f7df94e7db8342aaa50f7a8c76823499ece6d3a53b1e095c4310c0225f60b20a91b86f1d2fa94c0ec508cc26b7b88b01a4b3b17e06698d586af6478253b877068f6a846f18fb0179240bb56e4e54770b3a4bc215c2be2b50673dbfe7bad40c07f63bbeff30000012800000090f2c814af6271db7c8e9d4e66cde9621bf22aef0134da41f47c35f71e471322fd66ebb39b40b974ca386bee6418469d5a1f3614758edb5ce1fa9636e03092329d8974e695dbf86e8da247feb4968a7b061c729f685b9da1d8b8635e04567bbd2b33eba0c833ee0f0bed056365873336e905c137ea0f17978259c2ea780c8c25ba328af85d9d98a0e3d938ae4107e42332000000906c52a4d740a9a815af7a7e95ba09c78226736edb78e8802d418b12022485c3b7ce79547cc3dee2c8001c0955d2601cf7aea7fcef6a09f1e36410a28a233be825bec542c9dbb53b6b2d203676d2c62b06d180b8fc42125ab058b9155a27244b61552af9f69f214acff4373f901e83c64a49116c2dc7b9b312b4fc93de2bd45a90864fbdf25a4ff286563a0ddcb50ecc770000012800000090bc8e92635d068e8f45cba5df8453691e130a9fafddea39c56f766fc987ee093e76ab21755ac24471f4bb049e3e71af69d9b12bacd520d6541f74909f903d3ad05830a6453d20c79fbcfde7ea423693eae7176bf537bbabdf309fb4e4178f40ac2eb048540dd302daf6deeb69aad9617361c56304a9037a66d39a94c487235c862b95d933caafaf0a964204eb00b2fcfe00000090f1d1f253bb1383ea73d63955d73b688b3daf0a019a1747ece001a07708988e629e5cd0d557e8f2f674db96e904a69762d1bc2eb02083b535e7767d14ad60fdebc1ef938d8422cbcbf9042ffc27a76523f81cf17bbb658d9cb951fe0bf9335520c00aed26cc37b7ac1eebd297ec02e90deb147a3aa5f2933973c37738cdaa040db84200c040225e7a4d412cee477998210000012800000090b864adaecd36d70266605faf87d3eec7205abd549042d44f60ffff66ba0fefe5f2426826b44c2779e144f28a162d06d24efe8cf29c337333c8ee42bdf40e0f5f836da60d7ae07495f821360f22afa06e85fe1ff0710fe0f12f2e1a053cccd9a89eb8d69b12d0604daf20a79e2b310d069746d271cfd788b448aa9c907b0be49faa548bfa0eda227aee965c8f4b0cfc1700000090cfc24b1d4dc86a7e0b31a4b03db181ed811ec14b156df7da4bf44ec6a19d7154ff5b7543d4a117176f0cb5a509706a19736b86ce8027dd3ba62ed0e1bf93bf2686201a6aa33bfeac26fe49c2a91dedd85a8d0323668373868b40e65e662edd3b079fda7b450524e89ff5987d8a5ede5117c005777c90a426862f76bfabd4ee3f254525478d37403866cc1b536b24519f00000128000000907340b3e06f362d0e25af7a0054eaceb640eadc92c26ce2adbd225e40075c48adeabba9a0286360795e5aaf7ea15560d1e9ccb9307b854729ef54170a63bc4584cc33744bac67b66475067b808c7b3612837efb49e00909b129456195dcce20256d5aa533a5ccf6c81644deb9226458b01fa3882da3ccb1cde0778a76e0ef1de5a397b1a74d1015da520af795974fb68300000090d2f4bebe950156f5a477fecae6f502f2e12d0a6df4029e8b4bae461d325db1d3b5812a5bb055406757f41621c76865b80d6be58a8bc5d9916c0627eee5928cbd9531e7977707dccc5c37a1a8a91f61395a77fa5fa5b7a70b8e677d311963474577abb368e9e3e571a3161f82c4603086ee0acf8c450ac2390b5e11e41c161ed9490c0605cef9916dd7ab4dfc8639aaba00000ce40000012800000090e549acf82a2d39497468fb5b925614c77bfaad29c7c2097eb12481b38da2cf526d83815bf1098dd63315c17a3cadc92ba6f513002cdf6a388f1de593f4b1075fcfb8ba1775f0b9796dcca84eac6eb940a7c45a9fa6c123681ca3d9e1879f61b842aea625a7de75502dc5af86d6b159b7cab7fdefa98b2db1345d07cf7da54dc5b1735ea31d2e75bfce4767273bce88cc000000905b57379b21c844b13cf8f3a037091cb3d0badbf3bde4c962d6b9c3c859e71295b1854091dd1c6668566ad727f9020ade69e19d34adcda46d2c93260a54929ee78d0f54cd90deeb0fc3d5860b7cf373b1012cd224e4bf27172a5741012cc83dd2ce8afbb70c32e3728fe900fe16284ae8b91f09055fc133f32923b06fa3f594635d85f964e8592be2175673eba3b07833000001280000009068833df188633bdd6038b3056a6f3c496a25391b1931b2f7cad08ee450a9a2a319f9781f9219511d9e739d99a6339a386822f561ffffd4d03d7fded85c2aa60202b8b67c104a85455a269fa8ffe4aa104e510b61731cea00eef07a943ea86867635706b6dbc509ee7e710247f254ce37315c9430368fe5e21cb5868b0f8c15d0494baa5aeb5c6b9a3b2985b3791b9a6e000000907676fe247936a75a03de9df952f34f0e82cdb40a1b057f932f6b913d30f708119d8857a1048511ea14e1710db2b90dabdc1351d9521f5f3064367a1d2db14fdb33bdd44e155cc39f61795f024ef460b307624c7a5e004dbea07c89cd271f921a21d225bc1cd87db49e398e1e8aedd923c9032f07b7e29cb1ceb462a59a6b2f9aae7cfee6064ac65578fe46c69cac75ca0000012800000090811ed27dc7ad47725b36f2c99ddb7e4cb66d6ddbaabe12556ab48b82678be51ba35a2c8401214e1c52e839a8a6903345b56c482977ab438bb64ecaeb5b6dc871e3a2876cf72333935d688ba754f397f3b96c795a3b292eee1f0def244ff2d3055cff950f727aef6d10ee069202325a8e154d526e08bd9dca4115276a99642612af60bb882d18903d261879dcb83c388a00000090e215b3deaf1f80a0450ca99498b82978e61011cfecd2b62ac1302b54f5abf8353658654997d2d66aef07ee1cb22bc33ac492274e548657b9d72c33e15883ce164fb56df05ab50d4cabc5ec4b3e328e98d595e36b1b778577cd9f07aa530d8049b4e39be4470cb7ae5afda18939496c85969fc1d3859992dbaf71a57ab515f4ce475bfbb014d1a3b005d698240f3569680000012800000090393392d7b7dc83078bd03116d5331cac8598a7d3dbfc13828d4a755de00f03b2ca88481407fbe04314601bb9001255aa51f43898cd2eaf0a1c3e11987b40fb4ce9d81f838de5c7d1ecbb79addcf3e27662abe805244c5b3d6fe5bd6e542eb329f48584e30d09d103679f52268d63abcaa6d02a0e9596b1c5f4d54c4fe11d8afb084494242cef2761e6be2b26c69cf28200000090082406fba8c9ae1b7c48b88bfcd627113f0d3f8c845665439fff90506e6d10257cdd5039c84c2b726a793c46fd7e30553bb33e2b4508d626e3d1deb2742683b26bd96abc118606f6fef1e0254203743f7ba5e122cc28a61e7c25550ee83cf7f363fd0ff7ba950447f08f868332b7369af8dea778aa4f2bdaf19a6ea422f16b9b4336b90d597c150712c3b083fb5dcb860000012800000090566d5d24fbeae58464b0615822f5dc1a5a03e6387afc0f89143738c3a7a82202b4d56c2bfc68175482f4cc3fdee16e023931a4dd760b719f0e31325a7198dacd88e32019efcadbb2a52b9701d23476fcfaff2b0f621845c3e246118f5c45e2a6790536c3984ae9a5984b938c3297920d7119a80e9e65dedb85f624888ee140d33fc9acd649e269a3ddb1f6bd31663220000000905b94546562731f1304d142db43c5462d32c17a7571b9a3fe2fd8b6c594b07a1bbbe4307e8b5c8c79213dde97f4a0ebaed453c4e798137e16b7d97c5882bf505ab2febbfd0a9bc802ea653874f11d6428cbee3a13a18eb54aa068cf2493512935163c59abc5d41900687c0222c084e85b476cbe9e2c1b367589a987f8c85c6b31257a22cec6af243663028f6d04b83955000001280000009047f97e0eac0aec21000ef407ba1cee999045431c0b8dd55027275e04502ab79ce4d0b6e5e86e8267a4e0234e029b335fe0a5a425638b5c07cdf37819afcd4b1f89246b02dbcd453bd7c2b0b25334f835468e6898a5c6066e62b8d869892dd294e05c83441841902532b4b5614c537bcfe557e329721078343e340bccf1abd74caf709ba0764352531308a7f5abbdf36000000090538969d6d762b76699c38f562873016b04d775021b4e9d2968430a2b3037c9cab3ae7814fd6dc7540e1a776bc4b75ebcab68a5fbc3eef095bbd0897517073639167327c8ce14e0e383c48475123e958c0c547ec4a2304df37901c05672f909770f02994c6f952eb5f21be1782e8f9b58df9967dbbf40306aa622ae9b4f8ef918105bfa6490e6311df30d9caed97e65180000012800000090ecf13baa64eae5d4ae2a2171abf58b0316e596ffb4e45d8b04fc6b3ef7baa3b6f144c69d47e57f4ce71725c1d23d904eab72f1e9558b38a2ec2e03490753746866158f8b5a1c1676b6c104795c2c72b46c02a0a24b09b0a167cf793e6d3a8fc4966487e6b9badec4505406c897064d16397c8f9c19e3be5bf2b6d836598a05aac481b44c2279db99967c7af13f9b754300000090ec3107180cd218bea3427fb271d8ee8dad175dcff2c80f1d9546beb9e3888f3da8632ce4672f5a4d826d219dee2704ac726a25cf699bc587432d1e76c5370cc090646ae5eccbdd2fd291b96c28f012c846308c58341f691de11365856500c6ac11ff5a20b28b39590fa03cb51730afcbb5651820568c5287dc99816279536f9016d8d770bfea03cc7dab39d4727b62910000012800000090b10f42fe05e1e1db07bac42949c8ba753f1c1185e27e061e5c73b8cf47eed8f356f38a8253891f322bca6bdd7d83933291953bfe0f225edeca42a4903bbdc73484d2b13347bb5b6ed7f48bb2215cb7b7cf968b29972e7ee078af4c634100613d21fd151fbe189aa19b395ee32bd671fd7bc3d1f9b8add290760f8cae20afbf91262267fb012b19527b11f94a35b5d8e20000009027517a0b48a659823f506f85de46054b9e586a0b9ef8de12a8d5f126d849333211c3e95f572cd162217fb7512eac7a87e0cb71a81c004a8d33d97e85832c1b7d33d615aa220cddc2ae5389bb239b8e29652b02e322d20c5e193bb3cad2efca03afb2d04c44815e56e2ac9caa2b68d32dd291ce3da9c7debb6646c0de58f4e321df762a3cc55cfc30425221a2f2cb26d10000012800000090471e0b99b2d33a1c6c46137b51404859c121b605ec6ba2d051cb05000ea2af1038fd2f55e333b12143126d8430e576a3102a4cd9b7d8b28bda0fd68c80f9f4907d273e8db07d35367eff9fc93d715a1e1e20c80b76593addecdab503c944603e1ace2d612f482eec9d23e9655552ad9b5d6805379b4ccc26195ad730f4a192cb4f85589fb9f4f0556480a78593348a5000000090b56978aa1d94ff2e2593864144defcc9491429a862274141a65225b58597d15b8eb13ef060cd75c33246df88241964c87eb08f2639f24048a0dd94bbca3b0fb4a6fb82916f2b6fbe1d05504f02fd6b4a67b58c58085864dbb6a26f7359a1e256e7fda12e9f4714dbab35fa1ff05081380bd351516c68b542f7068f2ecad24139b59055599b1cecae902973dd934007a400000128000000901ff8c6da2a57ce3580ed242c3571d9ec27f35ef436367a80bb500e65a97d49e48840fd757984eeee7ed4d7b675e2fa761378d270ceb582a96f4abbb7b90062747ab25a1e6fe505e7c3f2187f38c8996d773676380161053f7eb3f8c97387aa9c6aaaa30b97a546478668ac11ac2447f8845f1139820d679387fda7ae38627b95d2e1bc4a1ec6c50c02b6001ad67dd621000000901a0f38d26a55c352cacce5719aef19a35195aaa7a0660322ecef21d17cdcd4beb2e9fdf909522e68ead4974dbbc61ec727b7c192d649ba9402ef11bab69a4820c4ac8466678684a4561b79c607787a99d0ad4c9bcea79c0f6141417e2b2c08927e61c1412c6116fd383ce2b39f5284887477b1af8a5d4287b6e93cd9f6cc2b20bee631b52586254fca5b4eceadf0fc3b0000012800000090d454eb3e205fb713c0e1f57ac87f7486e283bf5373ab8dd7d6814b51e647c906668e53fdecf34d62c2577741f0326aa2770dbe8ddfa38feb113f296e8154da0bfb8744ffdc53fd9952fc2886e3c9ff4d9bec7fc40bf3b419f7cd8f9fdd94e5a80d858c55d3d8d6a78c4f38aafa2e57d344f3fa33066c02fcef95584f53fd18d77746707d7baf40f3d132e0762ff530da00000090447038e5cb74279855f930e8f7b7766db0fb5d9659e29f100a5edee666e93509b6304c0e244f64f622b85fe2edd61b7fea4129ee9877221583820e8624e32d92ab91f7f912589879ebe09ec84d6188f1afd24505c8d53576e2f4ceb6ec542df20ff8b21341611074c545fbb75dd8e4b9ace680bf1c22d34acd865dbe1ce75aa488b8c373d2601600ffdedd741f163ed500000ce4000001280000009045436ce2e6da0bbfec32c2a11b7de39d7dd557b2c44a87a827375716d3a0bfbf23e4e3027a036a17fe39610b53226ca60bc1a401c108e7a175a79639423d25e87c5bee44843faf52e06dfe9c5889e44696d84e60b00c808fc658cc1ba3a0380981f00a9b7e08844bbd7a30005ba8721b1933fb86fd11c4d51834fffcc1ab349f99bcda485368666b15f1e3668cc181f200000090bd229cf6d6f7d21631b59a23f3dcab0a9e2fd1bc8559a231695b6a5c26615528cf204d00046fb6fb2e67656576cbb6d72d194763c42e03a99b90950193d0d71c906007f18e3e1e3a7dc32ff538e16de9f4fb1ff8469289acb071318c67b9e99de9220af87f0936e67dc7dd73f06476d2c387fffde703d4375bc237c735801c71af114a06051621aead6dd13729d131990000012800000090b1095ccf7c01d057426cbf1f0b64a04461f96293107906aa032cecce60a80895415eaac9d968cf92b9bc23be2e4c28ad899b286877d856e516c45346416a54c7b851d3ee2310822c48ae58b6aa98d77214590692e544beffb4cd7db0b178bd4c73352d26295117d7fb3035e24c5a46375b0351068f8d13314c72c4791ae3ee6327bf1a69223068ebfbf3ee1162b05b3d00000090f9c41e0deba7b51b30183beee0fa118da199df57e7b64f7edabe514b9b054f84a8ac4a874b180c1173b428aede80f9065673f90cb90b50a75d45190411bca2802ec52d39a94964dc713f22e7a84e2b3951dc0147667b61153d4a7f05acc134188a20f930dbecaa1a6bf25d32efa1522651b47f92bd69e4c23a636a55111254efd05580201b50b964a1f32dc9025107a200000128000000903e89093271e6a69b711d07022e4e5e9c150a25620bd439d17551add63a0d8d884e45a3c44128ead9c2d3d8d2c3d4f92a39c8f93cb7578f1163966a8fbfc0e9c525c5d7f722a08d5c7352cb9a75b416603403f181652a7b06f8ca9600e23b4a965cdbd77ea9839d8e7e4d497c383e5e37682638f763ab3cead19ed526720b89d95366d5ff51b3f9c5ae658633f3e2c993000000906a4e1ed85756cd8c10680d71a1836879fac29cebf1d66a65cafca1ddb5b9ccf0c7eff289bdcce8b3dd23a1f904bb453359354d48579cc3fb3fbbf992a3f736154b6c8e1cb2e51c5e2c172cff4d5008dad02365cea9da1d63e00c042a9ba57e413c4a06d155fe9b9f86e262e97463597a82d7ef555baa2341426e0b7158829d50f9e4ecbe06444b6eeec16f96faf4550500000128000000903dc7fdc3162430d001f7977c0763f2ff678dcdf07c2f6a2485deeaf993ec94a2198d9ef36d7cd7f35081345641df105b6bd11a3491769f78c0d903ff1431a9e5dbe4018ab44cf0b9821ecb5ed32eb34ca80dffa898289893d917d9b1fefe265d6a7f8399c9daa180b1febcbc1c558d4746e5704d3405512a4fa1379925e58f33fa44731f43927a950a6c8babbf79a14700000090c596b4a820d0e7a8836b13d5e7f50bc9755865b70d1346e590ca091025a25e0add8c50137f8192b347f75bccce887e3f831d57d21252cab4b69dad4f17e1e0d280d147c23ab8bc57080c4812514ef05f63506743e267f89012fceb91c0688d6f5c434d4c5ff2ae87387e1a186b536e5bf6e98ed3291e5342ce9fa44c90cc5ba90387a4717d6dcb6e059145c1ce8764fa0000012800000090283d76ab2e5af53de1d18916e20f8b86bc6a20176941530f8619cc9cbc9fecc6a93b724f7fcee354a4fd6f195841ab11a75c89d33aeece8eec50e5fd4e546caabd8c04c6b1961a9fc37bc167fc31f3ebc1eb5d6dd77a1d04c733862b604dbfae14f6f9e69fb510ebf18bb64db753b0555b44b49f6fb37e41833c2cc1943c57394e0bd0dc3ce650c720e383a2de6f08fc000000900be60fd6de9a29388caf4f72b62772b80a503fd1449f8de61c72274e30ec13804f576b64345d7aedeff7af7d4b7ca95f03409036f473f35d5007585a2ae57ab94e234c195c07e0b5396f64211659a785e9a3ae4a697f5dca6a0a3ee2800208a107b12f40e5ec28cef8cd611add402aa2b64bf8938bcd1c2e4faebb54fa98cfae7b56b4a7797d5773a3b13808ebf2d3640000012800000090e1a2d111767837b0a5bd9ab4aa040837f01dc81fd1f3b4c94c577bc4334057561d356f081587fe288df0698fd3ca2d1be1fd4533a3d985a514d3b47a8f0e25c6e71b77a0f2a845a9292d016e16dea8c48597750ed24ec27955b749b8c647b1dad52191d4619762d90b395cd161201b5801587c46c623c9e9c85461a0998f13f32f3dabac687c6b37f0452793ec12029300000090339f31d769c14a357e7c98d6f5844e7c8a97ff122b25e0138d144d983c8219f971a67c20aebe049899c7ec09a3c7673ba857a507af1f5df87b53ce538385894b27c2e51f69ca75cb36656b09eaeccbffbea93c8af1dae1a5e8ab4c7c576c1f8521f27aae4d35c5bfb2868134d8dec61c60ebdb108b6f710c7e5ad7cf07026b0ab30df451dafb7d129075b4e2e29e87da0000012800000090446064bffca204655f9bcd32448d5281fc2ff2719cd87b3af607980fca826d2475cbb26176a5581312a871e1f3437f8b56e3e3424c050b0431daa7232ff0628d3c079dd7968229f7f4052650e2535473e346836f424308e4617e69233e04cdaeeb36f1952d6b42c278ae462f8c494d767a736ea0ca5eb4c7213413aa20a50b425b53e56c525fb4e4c9a4446ac4eddbb4000000908c5392f39dde50a945b2a726a59b76e677db424b16a2c17a7ae63c5b8a54db1a3ed78c150a97792402f186fbb8a6e093293ee00ff8b56cba7e772d89c79b87d48dcd17d436d11128b1f84ba989025fe5e25f731ab1fd99185783c13e2b180a344419a78577c541e4fda696c8463bff0b69cc80a23b3278f1149614cac7a019f43e484791680e168ea97e21cd5ec8bcc20000012800000090345b551d49681f065d63636d7c6e71cc73992b3b301f9591c577572b36b22e0fef0ac09ba7d7cfdd0f49a13739ef4314eb78de142191a75976123da2a49640249ccbc2af096e3900b4ca9bd4f09f52600c95f374ba110d6af27c2e1e4bc776af4577cf8cb55af20f521be2a0b9840a9e24c76aecbc0452ba6e07ff5762fd337ad72f9bebd508596940230d3a3648f54900000090ed47ff927b3a0d86080173815ca57523eb6dd5e261e587c375bd495e8bb376c15c14fe2f7086941bcee511a2845b43dce73c03193cb7f4069a18a228f310c87c2ea4c7023a863ebf36b3dd8f205b4cdf8bccfb99add2b6bb9b47057840ae0aad4147bc702c940e977f5be5fc96dbed0f578bd3c8fb05e73a83eca17aab10ff63f7781d4f42164a7ade252a819c7d8c0e0000012800000090a2acbcc47d3d3b5de0fd05c6e9a434a45f8df67d84caf7cc08438cc747261ad6f7d5182e8b4ff771f889ecff987fc81ab3fce9803f1f66ee6042e70026eca90cd8ee628a14cb2819b80062b9583aadcfb87a4b07b4758b162c4836d7e3c65d1406e4023e50cc17103ad1f23a9913eeb466c9626c3753860cbc973345674a43a3a9c3752420a8d4d0968d1dc8c051e0d000000090bec08567dd021f5e9de396dea483bef26c0fce90d2a9810cc0fc5cf979273566c8bcc1a5b7348f8c134c6836db56f06e1ec9bf2f22772212bbd346121021a3e06630212745414ca8ed09a68bcecae7ae5d657a5d0aeeb0787c601fd7ac9164c8dc78b475ab03c24fcd0d069e26386e24a339e387c4aa4aaee8a982836b9fc4f7da4043a4d98acc25a6d734034ffbad800000012800000090529e399a8cd2758e15cd6288caae8a4caf0825dc10342864bb3420a5599c42935ef54ca3c0755585de1d591be4d0a077bef0d0c7bf6a960ce038af375b4a2353866fcffc2e2ed3c9c126a996472b64259ba5bb465be59a2d08d91696dbc24909500d5840aae4a2af179bc4eb0a409b4b8472380e2f327252ed83255cfd2cfdbf6ffd43caea70a475fc62ef5f0f88aa5e00000090d57807dc2c257bb03cc5721539ee708345108fcf0cd13c91142f134800d242e8435773da485f21220c059830b664ed61fb5fbfd7a4815b7e33ab387b4c5a6b2cd5ab5bb7e22608bfdd5b53f95d58276dd44019bf08893e0b527c19c3a537cdf76bf68fee369d43c622e64a8567ef2cb84edd9ca30480d88489f1e31117c08c45e575ed09a075964611b419728712620c00000128000000905c9800416b095f77831bc877a355db545151d4ff58a8d9347dc9a982366aa6da5f9043e7b3320854635dd53d55cd2f283188eb27020f98ab4a2735b23d1f91df763e3272f4fbeb459ea74d93d007ca1dd1162e57b48161b27a2f02b35a7ef5998d4bc0e60b7acb4d31f781a1544d992688d47fa439a6e7e4ce9a8224e4e1c36ef85dd306d8fbdfe2246ef96c98ebd7cf000000904e9a6442af0ec3b24f0e4e472afb25a70dfa8159e23a861e53cd3756e54a9dc02e5a0e2112c1e00c8881ea179393700d41ce4009e93b8c5abcf4244cb2705507bac7d6bf6fbcc6c7e0023b0518765b6bebe0f278ba18c4f1e62102b4affefd24d94713ce05cc156a4a9a0908fe9632892c639af5c86c471a02aa3dae340f061a23b94ca42551f6b15919096dd2d80e87"; - - function setUp() public virtual { - helper = new DecoderHelper(); - - registry = new Registry(); - inbox = new Inbox(address(registry)); - outbox = new Outbox(address(registry)); - rollup = new Rollup(registry); - - registry.upgrade(address(rollup), address(inbox), address(outbox)); - } - - function _testEmptyBlock() public virtual { - (bytes32 diffRoot, bytes32 l1ToL2MessagesHash) = - helper.computeDiffRootAndMessagesHash(block_empty_1); - assertEq( - diffRoot, - 0x0091523e648cbc7b8a533aff93eb01057372e789a0ca601ed2daad5ae21acad3, - "Invalid diff root/calldata hash" - ); - - assertEq( - l1ToL2MessagesHash, - 0x076a27c79e5ace2a3d47f9dd2e83e4ff6ea8872b3c2218f66c92b89b55f36560, - "Invalid messages hash" - ); - - ( - uint256 l2BlockNumber, - bytes32 startStateHash, - bytes32 endStateHash, - bytes32 publicInputsHash, - bytes32[] memory l2ToL1Msgs, - bytes32[] memory l1ToL2Msgs - ) = helper.decode(block_empty_1); - - assertEq(l2BlockNumber, 1, "Invalid block number"); - assertEq( - startStateHash, - 0xffad71573f9ba1b8549c21040e8ca81c850b5c8616890c0b811525122993a909, - "Invalid start state hash" - ); - assertEq( - endStateHash, - 0x9b57972a8777a8a6ab8ec21766efe06d28d913326a5a64b138d041cc22e405ed, - "Invalid end state hash" - ); - assertEq( - publicInputsHash, - 0x171bd65e55f7519128d5ebfb47e2d264b9abd3ba0a12b155da67cfbdc500bbc1, - "Invalid public input hash" - ); - - for (uint256 i = 0; i < l2ToL1Msgs.length; i++) { - assertEq(l2ToL1Msgs[i], bytes32(0), "Invalid l2ToL1Msgs"); - } - for (uint256 i = 0; i < l1ToL2Msgs.length; i++) { - assertEq(l1ToL2Msgs[i], bytes32(0), "Invalid l1ToL2Msgs"); - } - } - - function _testMixBlock() public virtual { - ( - uint256 l2BlockNumber, - bytes32 startStateHash, - bytes32 endStateHash, - bytes32 publicInputsHash, - bytes32[] memory l2ToL1Msgs, - bytes32[] memory l1ToL2Msgs - ) = helper.decode(block_mixed_1); - - (bytes32 diffRoot, bytes32 l1ToL2MessagesHash) = - helper.computeDiffRootAndMessagesHash(block_mixed_1); - - assertEq(l2BlockNumber, 1, "Invalid block number"); - assertEq( - diffRoot, - 0x72b5b74580b90c42a8089a222c9a450f69d35bf6cbefb5a0fe8f7403eeba8a07, - "Invalid diff root/calldata hash" - ); - assertEq( - l1ToL2MessagesHash, - 0xb213c9c543fce2a66720d26a913fe0d018f72a47ccfe698baafcf4cced343cfd, - "Invalid messages hash" - ); - assertEq( - startStateHash, - 0xffad71573f9ba1b8549c21040e8ca81c850b5c8616890c0b811525122993a909, - "Invalid start state hash" - ); - assertEq( - endStateHash, - 0x9a5cb854559b8847af8706564acfa34f73a963b6e889ad98ea0363258b916b89, - "Invalid end state hash" - ); - assertEq( - publicInputsHash, - 0x28bf184e40f1b56225120f46d0c05f49c58453e5a9851caa2414f95ab2f1af63, - "Invalid public input hash" - ); - - for (uint256 i = 0; i < l2ToL1Msgs.length; i++) { - // recreate the value generated by `integration_l1_publisher.test.ts`. - bytes32 expectedValue = bytes32(uint256(0x300 + 32 * (1 + i / 2) + i % 2)); - assertEq(l2ToL1Msgs[i], expectedValue, "Invalid l2ToL1Msgs"); - } - bytes32[] memory expectedL1ToL2Msgs = _populateInbox(); - for (uint256 i = 0; i < l1ToL2Msgs.length; i++) { - assertEq(l1ToL2Msgs[i], expectedL1ToL2Msgs[i], "Invalid l1ToL2Msgs"); - } - } - - function _testComputeKernelLogsIterationWithoutLogs() public { - bytes memory kernelLogsLength = hex"00000004"; // 4 bytes containing value 4 - bytes memory iterationLogsLength = hex"00000000"; // 4 empty bytes indicating that length of this iteration's logs is 0 - bytes memory encodedLogs = abi.encodePacked(kernelLogsLength, iterationLogsLength); - - (bytes32 logsHash, uint256 bytesAdvanced) = helper.computeKernelLogsHash(encodedLogs); - - bytes32 kernelPublicInputsLogsHash = bytes32(0); - bytes32 privateCircuitPublicInputsLogsHash = sha256(new bytes(0)); - - bytes32 referenceLogsHash = - sha256(abi.encodePacked(kernelPublicInputsLogsHash, privateCircuitPublicInputsLogsHash)); - - assertEq(bytesAdvanced, encodedLogs.length, "Advanced by an incorrect number of bytes"); - assertEq(logsHash, referenceLogsHash, "Incorrect logs hash"); - } - - function _testComputeKernelLogs1Iteration() public { - // || K_LOGS_LEN | I1_LOGS_LEN | I1_LOGS || - // K_LOGS_LEN = 4 + 8 = 12 (hex"0000000c") - // I1_LOGS_LEN = 8 (hex"00000008") - // I1_LOGS = 8 bytes (hex"0000000493e78a70") // Note: 00000004 is the length of 1 log within function logs - bytes memory firstFunctionCallLogs = hex"0000000493e78a70"; - // Prefix logs with length of kernel logs (12) and length of iteration 1 logs (8) - bytes memory encodedLogs = abi.encodePacked(hex"0000000c00000008", firstFunctionCallLogs); - (bytes32 logsHash, uint256 bytesAdvanced) = helper.computeKernelLogsHash(encodedLogs); - - // Zero because this is the first iteration - bytes32 previousKernelPublicInputsLogsHash = bytes32(0); - bytes32 privateCircuitPublicInputsLogsHashFirstCall = sha256(firstFunctionCallLogs); - - bytes32 referenceLogsHash = sha256( - abi.encodePacked( - previousKernelPublicInputsLogsHash, privateCircuitPublicInputsLogsHashFirstCall - ) - ); - - assertEq(bytesAdvanced, encodedLogs.length, "Advanced by an incorrect number of bytes"); - assertEq(logsHash, referenceLogsHash, "Incorrect logs hash"); - } - - function _TESTComputeKernelLogs2Iterations() public { - // || K_LOGS_LEN | I1_LOGS_LEN | I1_LOGS | I2_LOGS_LEN | I2_LOGS || - // K_LOGS_LEN = 4 + 8 + 4 + 20 = 36 (hex"00000024") - // I1_LOGS_LEN = 8 (hex"00000008") - // I1_LOGS = 8 random bytes (hex"0000000493e78a70") - // I2_LOGS_LEN = 20 (hex"00000014") - // I2_LOGS = 20 bytes (hex"0000001006a86173c86c6d3f108eefc36e7fb014") - bytes memory firstFunctionCallLogs = hex"0000000493e78a70"; - bytes memory secondFunctionCallLogs = hex"0000001006a86173c86c6d3f108eefc36e7fb014"; - bytes memory encodedLogs = abi.encodePacked( - hex"0000002400000008", firstFunctionCallLogs, hex"00000014", secondFunctionCallLogs - ); - (bytes32 logsHash, uint256 bytesAdvanced) = helper.computeKernelLogsHash(encodedLogs); - - bytes32 referenceLogsHashFromIteration1 = - sha256(abi.encodePacked(bytes32(0), sha256(firstFunctionCallLogs))); - - bytes32 privateCircuitPublicInputsLogsHashSecondCall = sha256(secondFunctionCallLogs); - - bytes32 referenceLogsHashFromIteration2 = sha256( - abi.encodePacked( - referenceLogsHashFromIteration1, privateCircuitPublicInputsLogsHashSecondCall - ) - ); - - assertEq(bytesAdvanced, encodedLogs.length, "Advanced by an incorrect number of bytes"); - assertEq(logsHash, referenceLogsHashFromIteration2, "Incorrect logs hash"); - } - - function _TESTComputeKernelLogsMiddleIterationWithoutLogs() public { - // || K_LOGS_LEN | I1_LOGS_LEN | I1_LOGS | I2_LOGS_LEN | I2_LOGS | I3_LOGS_LEN | I3_LOGS || - // K_LOGS_LEN = 4 + 8 + 4 + 0 + 4 + 20 = 40 (hex"00000028") - // I1_LOGS_LEN = 8 (hex"00000008") - // I1_LOGS = 8 random bytes (hex"0000000493e78a70") - // I2_LOGS_LEN = 0 (hex"00000000") - // I2_LOGS = 0 bytes (hex"") - // I3_LOGS_LEN = 20 (hex"00000014") - // I3_LOGS = 20 random bytes (hex"0000001006a86173c86c6d3f108eefc36e7fb014") - bytes memory firstFunctionCallLogs = hex"0000000493e78a70"; - bytes memory secondFunctionCallLogs = hex""; - bytes memory thirdFunctionCallLogs = hex"0000001006a86173c86c6d3f108eefc36e7fb014"; - bytes memory encodedLogs = abi.encodePacked( - hex"0000002800000008", - firstFunctionCallLogs, - hex"00000000", - secondFunctionCallLogs, - hex"00000014", - thirdFunctionCallLogs - ); - (bytes32 logsHash, uint256 bytesAdvanced) = helper.computeKernelLogsHash(encodedLogs); - - bytes32 referenceLogsHashFromIteration1 = - sha256(abi.encodePacked(bytes32(0), sha256(firstFunctionCallLogs))); - - bytes32 privateCircuitPublicInputsLogsHashSecondCall = sha256(secondFunctionCallLogs); - - bytes32 referenceLogsHashFromIteration2 = sha256( - abi.encodePacked( - referenceLogsHashFromIteration1, privateCircuitPublicInputsLogsHashSecondCall - ) - ); - - bytes32 privateCircuitPublicInputsLogsHashThirdCall = sha256(thirdFunctionCallLogs); - - bytes32 referenceLogsHashFromIteration3 = sha256( - abi.encodePacked(referenceLogsHashFromIteration2, privateCircuitPublicInputsLogsHashThirdCall) - ); - - assertEq(bytesAdvanced, encodedLogs.length, "Advanced by an incorrect number of bytes"); - assertEq(logsHash, referenceLogsHashFromIteration3, "Incorrect logs hash"); - } - - function _populateInbox() internal returns (bytes32[] memory) { - address sender = 0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc; - bytes32 recipient = 0x1647b194c649f5dd01d7c832f89b0f496043c9150797923ea89e93d5ac619a93; - bytes32[] memory messages = new bytes32[](16); - for (uint256 i = 0; i < 16; i++) { - bytes32 content = bytes32(uint256(0x401 + i)); - uint32 deadline = type(uint32).max; - - vm.prank(sender); - bytes32 temp = inbox.sendL2Message( - DataStructures.L2Actor({actor: recipient, version: 1}), deadline, content, bytes32(0) - ); - messages[i] = temp; - } - return messages; - } -} diff --git a/l1-contracts/test/DecoderHelper.sol b/l1-contracts/test/DecoderHelper.sol index aff9242912b..aa1e9d326fa 100644 --- a/l1-contracts/test/DecoderHelper.sol +++ b/l1-contracts/test/DecoderHelper.sol @@ -28,8 +28,6 @@ contract DecoderHelper { pure returns (bytes32, uint256) { - (bytes32 logsHash, uint256 offset) = Decoder.computeKernelLogsHash(0, _kernelLogs); - - return (logsHash, offset); + return Decoder.computeKernelLogsHash(0, _kernelLogs); } } diff --git a/l1-contracts/test/Rollup.t.sol b/l1-contracts/test/Rollup.t.sol index c4882ed7db6..97c05292291 100644 --- a/l1-contracts/test/Rollup.t.sol +++ b/l1-contracts/test/Rollup.t.sol @@ -4,7 +4,10 @@ pragma solidity >=0.8.18; import {Test} from "forge-std/Test.sol"; -import {DecoderTest} from "./Decoder.t.sol"; +import {DecoderTest} from "./decoders/Decoder.t.sol"; +import {DecoderHelper} from "./DecoderHelper.sol"; + +import {DecoderBase} from "./decoders/Base.sol"; import {DataStructures} from "../src/core/libraries/DataStructures.sol"; @@ -18,35 +21,45 @@ import {Rollup} from "../src/core/Rollup.sol"; * Blocks are generated using the `integration_l1_publisher.test.ts` tests. * Main use of these test is shorter cycles when updating the decoder contract. */ -contract RollupTest is DecoderTest { - // Skipping this because the block is invalid after I changed the constants. - function __testEmptyBlock() public { - (,, bytes32 endStateHash,, bytes32[] memory l2ToL1Msgs, bytes32[] memory l1ToL2Msgs) = - helper.decode(block_empty_1); - - vm.record(); - rollup.process(bytes(""), block_empty_1); +contract RollupTest is DecoderBase { + DecoderHelper internal helper; + Registry internal registry; + Inbox internal inbox; + Outbox internal outbox; + Rollup internal rollup; + + function setUp() public virtual { + helper = new DecoderHelper(); + + registry = new Registry(); + inbox = new Inbox(address(registry)); + outbox = new Outbox(address(registry)); + rollup = new Rollup(registry); + + registry.upgrade(address(rollup), address(inbox), address(outbox)); + } - (, bytes32[] memory inboxWrites) = vm.accesses(address(inbox)); - (, bytes32[] memory outboxWrites) = vm.accesses(address(outbox)); + function testMixedBlock() public { + _testBlock("mixed_block_0"); + } - assertEq(inboxWrites.length, 0, "Invalid inbox writes"); - assertEq(outboxWrites.length, 0, "Invalid outbox writes"); + function testConsecutiveMixedBlocks() public { + _testBlock("mixed_block_0"); + _testBlock("mixed_block_1"); + } - for (uint256 i = 0; i < l2ToL1Msgs.length; i++) { - assertEq(l2ToL1Msgs[i], bytes32(0), "Invalid l2ToL1Msgs"); - assertFalse(outbox.contains(l2ToL1Msgs[i]), "msg in outbox"); - } - for (uint256 i = 0; i < l1ToL2Msgs.length; i++) { - assertEq(l1ToL2Msgs[i], bytes32(0), "Invalid l1ToL2Msgs"); - assertFalse(inbox.contains(l1ToL2Msgs[i]), "msg in inbox"); - } + function testEmptyBlock() public { + _testBlock("empty_block_0"); + } - assertEq(rollup.rollupStateHash(), endStateHash, "Invalid rollup state hash"); + function testConsecutiveEmptyBlocks() public { + _testBlock("empty_block_0"); + _testBlock("empty_block_1"); } function testRevertInvalidChainId() public { - bytes memory block_ = block_empty_1; + bytes memory block_ = load("empty_block_0").block.body; + assembly { mstore(add(block_, 0x20), 0x420) } @@ -56,7 +69,8 @@ contract RollupTest is DecoderTest { } function testRevertInvalidVersion() public { - bytes memory block_ = block_empty_1; + bytes memory block_ = load("empty_block_0").block.body; + assembly { mstore(add(block_, 0x40), 0x420) } @@ -66,7 +80,7 @@ contract RollupTest is DecoderTest { } function testRevertTimestampInFuture() public { - bytes memory block_ = block_empty_1; + bytes memory block_ = load("empty_block_0").block.body; uint256 ts = block.timestamp + 1; assembly { @@ -78,7 +92,7 @@ contract RollupTest is DecoderTest { } function testRevertTimestampTooOld() public { - bytes memory block_ = block_empty_1; + bytes memory block_ = load("empty_block_0").block.body; // Overwrite in the rollup contract vm.store(address(rollup), bytes32(uint256(1)), bytes32(uint256(block.timestamp))); @@ -87,37 +101,60 @@ contract RollupTest is DecoderTest { rollup.process(bytes(""), block_); } - function testMixBlock() public { - (,, bytes32 endStateHash,, bytes32[] memory l2ToL1Msgs, bytes32[] memory l1ToL2Msgs) = - helper.decode(block_mixed_1); + function _testBlock(string memory name) public { + DecoderBase.Full memory full = load(name); + // We jump to the time of the block. + vm.warp(full.block.timestamp); - bytes32[] memory expectedL1ToL2Msgs = _populateInbox(); + _populateInbox(full.populate.sender, full.populate.recipient, full.populate.l1ToL2Content); - for (uint256 i = 0; i < l1ToL2Msgs.length; i++) { - assertTrue(inbox.contains(l1ToL2Msgs[i]), "msg not in inbox"); + for (uint256 i = 0; i < full.messages.l1ToL2Messages.length; i++) { + if (full.messages.l1ToL2Messages[i] == bytes32(0)) { + continue; + } + assertTrue(inbox.contains(full.messages.l1ToL2Messages[i]), "msg not in inbox"); } vm.record(); - rollup.process(bytes(""), block_mixed_1); + rollup.process(bytes(""), full.block.body); (, bytes32[] memory inboxWrites) = vm.accesses(address(inbox)); (, bytes32[] memory outboxWrites) = vm.accesses(address(outbox)); - assertEq(inboxWrites.length, 16, "Invalid inbox writes"); - assertEq(outboxWrites.length, 8, "Invalid outbox writes"); - - for (uint256 i = 0; i < l2ToL1Msgs.length; i++) { - // recreate the value generated by `integration_l1_publisher.test.ts`. - bytes32 expectedValue = bytes32(uint256(0x300 + 32 * (1 + i / 2) + i % 2)); - assertEq(l2ToL1Msgs[i], expectedValue, "Invalid l2ToL1Msgs"); - assertTrue(outbox.contains(l2ToL1Msgs[i]), "msg not in outbox"); + { + uint256 count = 0; + for (uint256 i = 0; i < full.messages.l2ToL1Messages.length; i++) { + if (full.messages.l2ToL1Messages[i] == bytes32(0)) { + continue; + } + assertTrue(outbox.contains(full.messages.l2ToL1Messages[i]), "msg not in outbox"); + count++; + } + assertEq(outboxWrites.length, count, "Invalid outbox writes"); } - for (uint256 i = 0; i < l1ToL2Msgs.length; i++) { - assertEq(l1ToL2Msgs[i], expectedL1ToL2Msgs[i], "Invalid l1ToL2Msgs"); - assertFalse(inbox.contains(l1ToL2Msgs[i]), "msg not consumed"); + { + uint256 count = 0; + for (uint256 i = 0; i < full.messages.l1ToL2Messages.length; i++) { + if (full.messages.l1ToL2Messages[i] == bytes32(0)) { + continue; + } + assertFalse(inbox.contains(full.messages.l1ToL2Messages[i]), "msg not consumed"); + count++; + } + assertEq(inboxWrites.length, count, "Invalid inbox writes"); } - assertEq(rollup.rollupStateHash(), endStateHash, "Invalid rollup state hash"); + assertEq(rollup.rollupStateHash(), full.block.endStateHash, "Invalid rollup state hash"); + } + + function _populateInbox(address _sender, bytes32 _recipient, bytes32[] memory _contents) internal { + uint32 deadline = type(uint32).max; + for (uint256 i = 0; i < _contents.length; i++) { + vm.prank(_sender); + inbox.sendL2Message( + DataStructures.L2Actor({actor: _recipient, version: 1}), deadline, _contents[i], bytes32(0) + ); + } } } diff --git a/l1-contracts/test/decoders/Base.sol b/l1-contracts/test/decoders/Base.sol new file mode 100644 index 00000000000..ee95efe7a46 --- /dev/null +++ b/l1-contracts/test/decoders/Base.sol @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2023 Aztec Labs. +pragma solidity >=0.8.18; + +import {Test} from "forge-std/Test.sol"; + +contract DecoderBase is Test { + // When I had data and messages as one combined struct it failed, but I can have this top-layer and it works :shrug: + struct Full { + Data block; + Messages messages; + Populate populate; + } + + struct Populate { + bytes32[] l1ToL2Content; + bytes32 recipient; + address sender; + } + + struct Messages { + bytes32[] l1ToL2Messages; + bytes32[] l2ToL1Messages; + } + + struct Data { + uint256 blockNumber; + bytes body; + bytes32 calldataHash; + bytes32 endStateHash; + bytes32 l1ToL2MessagesHash; + bytes32 publicInputsHash; + bytes32 startStateHash; + uint256 timestamp; + } + + function load(string memory name) public view returns (Full memory) { + string memory root = vm.projectRoot(); + string memory path = string.concat(root, "/test/fixtures/", name, ".json"); + string memory json = vm.readFile(path); + bytes memory json_bytes = vm.parseJson(json); + Full memory full = abi.decode(json_bytes, (Full)); + return full; + } +} diff --git a/l1-contracts/test/decoders/Decoder.t.sol b/l1-contracts/test/decoders/Decoder.t.sol new file mode 100644 index 00000000000..c846f12a29a --- /dev/null +++ b/l1-contracts/test/decoders/Decoder.t.sol @@ -0,0 +1,263 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2023 Aztec Labs. +pragma solidity >=0.8.18; + +import {DecoderBase} from "./Base.sol"; + +import {Hash} from "../../src/core/libraries/Hash.sol"; +import {DataStructures} from "../../src/core/libraries/DataStructures.sol"; +import {DecoderHelper} from "../DecoderHelper.sol"; + +import {Decoder} from "../../src/core/libraries/decoders/Decoder.sol"; +import {HeaderDecoder} from "../../src/core/libraries/decoders/HeaderDecoder.sol"; +import {MessagesDecoder} from "../../src/core/libraries/decoders/MessagesDecoder.sol"; +import {TxsDecoder} from "../../src/core/libraries/decoders/TxsDecoder.sol"; + +import {AvailabilityOracle} from "../../src/core/availability_oracle/AvailabilityOracle.sol"; + +contract HeaderDecoderHelper { + // A wrapper used such that we get "calldata" and not memory + function decode(bytes calldata _header) + public + pure + returns (uint256 l2BlockNumber, bytes32 startStateHash, bytes32 endStateHash) + { + return HeaderDecoder.decode(_header); + } +} + +contract MessagesDecoderHelper { + // A wrapper used such that we get "calldata" and not memory + function decode(bytes calldata _header) + public + pure + returns ( + bytes32 l1ToL2MsgsHash, + bytes32 l2ToL1MsgsHash, + bytes32[] memory l1ToL2Msgs, + bytes32[] memory l2ToL1Msgs + ) + { + return MessagesDecoder.decode(_header[HeaderDecoder.BLOCK_HEADER_SIZE:]); + } +} + +contract TxsDecoderHelper { + // A wrapper used such that we get "calldata" and not memory + function decode(bytes calldata _header) public pure returns (bytes32 txsHash) { + return TxsDecoder.decode(_header[HeaderDecoder.BLOCK_HEADER_SIZE:]); + } +} + +/** + * Blocks are generated using the `integration_l1_publisher.test.ts` tests. + * Main use of these test is shorter cycles when updating the decoder contract. + * All tests here are skipped (all tests are prefixed with an underscore)! + * This is because we implicitly test the decoding in integration_l1_publisher.test.ts + */ +contract DecoderTest is DecoderBase { + DecoderHelper internal helper; + HeaderDecoderHelper internal headerHelper; + MessagesDecoderHelper internal messagesHelper; + TxsDecoderHelper internal txsHelper; + + function setUp() public virtual { + helper = new DecoderHelper(); + headerHelper = new HeaderDecoderHelper(); + messagesHelper = new MessagesDecoderHelper(); + txsHelper = new TxsDecoderHelper(); + } + + function testDecodeBlocks() public { + _testDecodeBlock("mixed_block_0"); + _testDecodeBlock("mixed_block_1"); + _testDecodeBlock("empty_block_0"); + _testDecodeBlock("empty_block_1"); + } + + function _testDecodeBlock(string memory name) public virtual { + DecoderBase.Full memory data = load(name); + + // Using the FULL decoder. + ( + uint256 l2BlockNumber, + bytes32 startStateHash, + bytes32 endStateHash, + bytes32 publicInputsHash, + bytes32[] memory l2ToL1Msgs, + bytes32[] memory l1ToL2Msgs + ) = helper.decode(data.block.body); + (bytes32 diffRoot, bytes32 l1ToL2MessagesHash) = + helper.computeDiffRootAndMessagesHash(data.block.body); + + // Header + { + (uint256 headerL2BlockNumber, bytes32 headerStartStateHash, bytes32 headerEndStateHash) = + headerHelper.decode(data.block.body); + + assertEq(l2BlockNumber, data.block.blockNumber, "Invalid block number"); + assertEq(headerL2BlockNumber, data.block.blockNumber, "Invalid block number"); + assertEq(startStateHash, data.block.startStateHash, "Invalid start state hash"); + assertEq(headerStartStateHash, data.block.startStateHash, "Invalid start state hash"); + assertEq(endStateHash, data.block.endStateHash, "Invalid end state hash"); + assertEq(headerEndStateHash, data.block.endStateHash, "Invalid end state hash"); + } + + // Messages + { + ( + bytes32 msgsInHash, + bytes32 msgsL2ToL1MsgsHash, + bytes32[] memory msgsL1ToL2Msgs, + bytes32[] memory msgsL2ToL1Msgs + ) = messagesHelper.decode(data.block.body); + + assertEq(msgsInHash, data.block.l1ToL2MessagesHash, "Invalid l1ToL2MsgsHash msgs"); + assertEq(l1ToL2MessagesHash, data.block.l1ToL2MessagesHash, "Invalid l1ToL2MsgsHash full"); + + // assertEq(msgsL2ToL1MsgsHash, b.l2ToL1MessagesHash, "Invalid l2ToL1MsgsHash"); + + // L1 -> L2 messages + assertEq( + msgsL1ToL2Msgs.length, data.messages.l1ToL2Messages.length, "Invalid l1ToL2Msgs length" + ); + assertEq(l1ToL2Msgs.length, data.messages.l1ToL2Messages.length, "Invalid l1ToL2Msgs length"); + for (uint256 i = 0; i < msgsL1ToL2Msgs.length; i++) { + assertEq(msgsL1ToL2Msgs[i], data.messages.l1ToL2Messages[i], "Invalid l1ToL2Msgs messages"); + assertEq(l1ToL2Msgs[i], data.messages.l1ToL2Messages[i], "Invalid l1ToL2Msgs full"); + } + + // L2 -> L1 messages + assertEq( + msgsL2ToL1Msgs.length, data.messages.l2ToL1Messages.length, "Invalid l2ToL1Msgs length" + ); + assertEq(l2ToL1Msgs.length, data.messages.l2ToL1Messages.length, "Invalid l2ToL1Msgs length"); + for (uint256 i = 0; i < msgsL2ToL1Msgs.length; i++) { + assertEq(msgsL2ToL1Msgs[i], data.messages.l2ToL1Messages[i], "Invalid l2ToL1Msgs messages"); + assertEq(l2ToL1Msgs[i], data.messages.l2ToL1Messages[i], "Invalid l2ToL1Msgs full"); + } + } + + // Txs + { + bytes32 txsHash = txsHelper.decode(data.block.body); + assertEq(txsHash, data.block.calldataHash, "Invalid txs hash"); + assertEq(diffRoot, data.block.calldataHash, "Invalid diff root/calldata hash"); + } + + // The public inputs are computed based of these values, but not directly part of the decoding per say. + } + + function testComputeKernelLogsIterationWithoutLogs() public { + bytes memory kernelLogsLength = hex"00000004"; // 4 bytes containing value 4 + bytes memory iterationLogsLength = hex"00000000"; // 4 empty bytes indicating that length of this iteration's logs is 0 + bytes memory encodedLogs = abi.encodePacked(kernelLogsLength, iterationLogsLength); + + (bytes32 logsHash, uint256 bytesAdvanced) = helper.computeKernelLogsHash(encodedLogs); + + bytes32 kernelPublicInputsLogsHash = bytes32(0); + bytes32 privateCircuitPublicInputsLogsHash = sha256(new bytes(0)); + + bytes32 referenceLogsHash = + sha256(abi.encodePacked(kernelPublicInputsLogsHash, privateCircuitPublicInputsLogsHash)); + + assertEq(bytesAdvanced, encodedLogs.length, "Advanced by an incorrect number of bytes"); + assertEq(logsHash, referenceLogsHash, "Incorrect logs hash"); + } + + function testComputeKernelLogs1Iteration() public { + // || K_LOGS_LEN | I1_LOGS_LEN | I1_LOGS || + // K_LOGS_LEN = 4 + 8 = 12 (hex"0000000c") + // I1_LOGS_LEN = 8 (hex"00000008") + // I1_LOGS = 8 bytes (hex"0000000493e78a70") // Note: 00000004 is the length of 1 log within function logs + bytes memory firstFunctionCallLogs = hex"0000000493e78a70"; + // Prefix logs with length of kernel logs (12) and length of iteration 1 logs (8) + bytes memory encodedLogs = abi.encodePacked(hex"0000000c00000008", firstFunctionCallLogs); + (bytes32 logsHash, uint256 bytesAdvanced) = helper.computeKernelLogsHash(encodedLogs); + + // Zero because this is the first iteration + bytes32 previousKernelPublicInputsLogsHash = bytes32(0); + bytes32 privateCircuitPublicInputsLogsHashFirstCall = sha256(firstFunctionCallLogs); + + bytes32 referenceLogsHash = sha256( + abi.encodePacked( + previousKernelPublicInputsLogsHash, privateCircuitPublicInputsLogsHashFirstCall + ) + ); + + assertEq(bytesAdvanced, encodedLogs.length, "Advanced by an incorrect number of bytes"); + assertEq(logsHash, referenceLogsHash, "Incorrect logs hash"); + } + + function testComputeKernelLogs2Iterations() public { + // || K_LOGS_LEN | I1_LOGS_LEN | I1_LOGS | I2_LOGS_LEN | I2_LOGS || + // K_LOGS_LEN = 4 + 8 + 4 + 20 = 36 (hex"00000024") + // I1_LOGS_LEN = 8 (hex"00000008") + // I1_LOGS = 8 random bytes (hex"0000000493e78a70") + // I2_LOGS_LEN = 20 (hex"00000014") + // I2_LOGS = 20 bytes (hex"0000001006a86173c86c6d3f108eefc36e7fb014") + bytes memory firstFunctionCallLogs = hex"0000000493e78a70"; + bytes memory secondFunctionCallLogs = hex"0000001006a86173c86c6d3f108eefc36e7fb014"; + bytes memory encodedLogs = abi.encodePacked( + hex"0000002400000008", firstFunctionCallLogs, hex"00000014", secondFunctionCallLogs + ); + (bytes32 logsHash, uint256 bytesAdvanced) = helper.computeKernelLogsHash(encodedLogs); + + bytes32 referenceLogsHashFromIteration1 = + sha256(abi.encodePacked(bytes32(0), sha256(firstFunctionCallLogs))); + + bytes32 privateCircuitPublicInputsLogsHashSecondCall = sha256(secondFunctionCallLogs); + + bytes32 referenceLogsHashFromIteration2 = sha256( + abi.encodePacked( + referenceLogsHashFromIteration1, privateCircuitPublicInputsLogsHashSecondCall + ) + ); + + assertEq(bytesAdvanced, encodedLogs.length, "Advanced by an incorrect number of bytes"); + assertEq(logsHash, referenceLogsHashFromIteration2, "Incorrect logs hash"); + } + + function testComputeKernelLogsMiddleIterationWithoutLogs() public { + // || K_LOGS_LEN | I1_LOGS_LEN | I1_LOGS | I2_LOGS_LEN | I2_LOGS | I3_LOGS_LEN | I3_LOGS || + // K_LOGS_LEN = 4 + 8 + 4 + 0 + 4 + 20 = 40 (hex"00000028") + // I1_LOGS_LEN = 8 (hex"00000008") + // I1_LOGS = 8 random bytes (hex"0000000493e78a70") + // I2_LOGS_LEN = 0 (hex"00000000") + // I2_LOGS = 0 bytes (hex"") + // I3_LOGS_LEN = 20 (hex"00000014") + // I3_LOGS = 20 random bytes (hex"0000001006a86173c86c6d3f108eefc36e7fb014") + bytes memory firstFunctionCallLogs = hex"0000000493e78a70"; + bytes memory secondFunctionCallLogs = hex""; + bytes memory thirdFunctionCallLogs = hex"0000001006a86173c86c6d3f108eefc36e7fb014"; + bytes memory encodedLogs = abi.encodePacked( + hex"0000002800000008", + firstFunctionCallLogs, + hex"00000000", + secondFunctionCallLogs, + hex"00000014", + thirdFunctionCallLogs + ); + (bytes32 logsHash, uint256 bytesAdvanced) = helper.computeKernelLogsHash(encodedLogs); + + bytes32 referenceLogsHashFromIteration1 = + sha256(abi.encodePacked(bytes32(0), sha256(firstFunctionCallLogs))); + + bytes32 privateCircuitPublicInputsLogsHashSecondCall = sha256(secondFunctionCallLogs); + + bytes32 referenceLogsHashFromIteration2 = sha256( + abi.encodePacked( + referenceLogsHashFromIteration1, privateCircuitPublicInputsLogsHashSecondCall + ) + ); + + bytes32 privateCircuitPublicInputsLogsHashThirdCall = sha256(thirdFunctionCallLogs); + + bytes32 referenceLogsHashFromIteration3 = sha256( + abi.encodePacked(referenceLogsHashFromIteration2, privateCircuitPublicInputsLogsHashThirdCall) + ); + + assertEq(bytesAdvanced, encodedLogs.length, "Advanced by an incorrect number of bytes"); + assertEq(logsHash, referenceLogsHashFromIteration3, "Incorrect logs hash"); + } +} diff --git a/l1-contracts/test/decoders/readme.md b/l1-contracts/test/decoders/readme.md new file mode 100644 index 00000000000..e59108d452d --- /dev/null +++ b/l1-contracts/test/decoders/readme.md @@ -0,0 +1,5 @@ +# Decoder test + +To generate test data (also used in rollup test), run the `integration_l1_publisher.test.ts` in end-to-end, it will generate the test data in the fixtures folder. + +It is generally set to NOT overwrite the existing data. But you can change the `OVERWRITE_TEST_DATA` to true before running the test. \ No newline at end of file diff --git a/l1-contracts/test/fixtures/empty_block_0.json b/l1-contracts/test/fixtures/empty_block_0.json new file mode 100644 index 00000000000..71278c67c1e --- /dev/null +++ b/l1-contracts/test/fixtures/empty_block_0.json @@ -0,0 +1,47 @@ +{ + "populate": { + "l1ToL2Content": [], + "recipient": "0x0000000000000000000000000000000000000000000000000000000000000000", + "sender": "0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc" + }, + "messages": { + "l1ToL2Messages": [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" + ], + "l2ToL1Messages": [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" + ] + }, + "block": { + "blockNumber": 1, + "startStateHash": "0xc738d05d59876de0510b4270011e7f52341083568b9bafef2324af4d12eca533", + "endStateHash": "0x87bffdad8ab435bf2382a7a6cf54d95dbda6e43ff1d3810cc3d1a6a65aa85dd8", + "publicInputsHash": "0x2becbeeb3170f323bf0e30641b4b4da3dbf439caf5639a2eef139173a6693f8c", + "calldataHash": "0x5b89af3c0d0bf66ac691697d317108e8f51bb8e3217d56f152b80867ad25d4a7", + "l1ToL2MessagesHash": "0x076a27c79e5ace2a3d47f9dd2e83e4ff6ea8872b3c2218f66c92b89b55f36560", + "body": "0x0000000000000000000000000000000000000000000000000000000000007a6900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000016642d9ccd8346c403aa4c3fa451178b22534a27035cdaa6ec34ae53b29c50cb000000000bcfa3e9f1a8922ee92c6dc964d6595907c1804a86753774322b468f69d4f278000000801864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f80000000001ed250ed73db6e70805c4efcf0056e8695b79cd3ba418e827c184dee6c6fb0e0000000201864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f80000000001a005071a487e4891787073a91504fe6ea55280bc6f65a021fd6f7ca1f10aa020000000116642d9ccd8346c403aa4c3fa451178b22534a27035cdaa6ec34ae53b29c50cb000001000bcfa3e9f1a8922ee92c6dc964d6595907c1804a86753774322b468f69d4f278000001801864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f80000000041ed250ed73db6e70805c4efcf0056e8695b79cd3ba418e827c184dee6c6fb0e0000000601864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f80000000101a11e8b1d440a44deef8aa8e4eec8f476e780ee6eac2d7d64b09c66b8063ee1100000002000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000001000000000000000000000000000000000", + "timestamp": 0 + } +} \ 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 new file mode 100644 index 00000000000..d09682cffc1 --- /dev/null +++ b/l1-contracts/test/fixtures/empty_block_1.json @@ -0,0 +1,47 @@ +{ + "populate": { + "l1ToL2Content": [], + "recipient": "0x0000000000000000000000000000000000000000000000000000000000000000", + "sender": "0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc" + }, + "messages": { + "l1ToL2Messages": [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" + ], + "l2ToL1Messages": [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" + ] + }, + "block": { + "blockNumber": 2, + "startStateHash": "0x87bffdad8ab435bf2382a7a6cf54d95dbda6e43ff1d3810cc3d1a6a65aa85dd8", + "endStateHash": "0xe6d5706f6089a53a07f19afc1f32f6491201c964430640256a526ce9155d4766", + "publicInputsHash": "0x12f4fc1761991304cfc810bfa9d4a2928b1a536c5ba2f0f6f943f16ed8163312", + "calldataHash": "0x5b89af3c0d0bf66ac691697d317108e8f51bb8e3217d56f152b80867ad25d4a7", + "l1ToL2MessagesHash": "0x076a27c79e5ace2a3d47f9dd2e83e4ff6ea8872b3c2218f66c92b89b55f36560", + "body": "0x0000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000659eb26916642d9ccd8346c403aa4c3fa451178b22534a27035cdaa6ec34ae53b29c50cb000001000bcfa3e9f1a8922ee92c6dc964d6595907c1804a86753774322b468f69d4f278000001801864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f80000000041ed250ed73db6e70805c4efcf0056e8695b79cd3ba418e827c184dee6c6fb0e0000000601864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f80000000101a11e8b1d440a44deef8aa8e4eec8f476e780ee6eac2d7d64b09c66b8063ee110000000216642d9ccd8346c403aa4c3fa451178b22534a27035cdaa6ec34ae53b29c50cb000002000bcfa3e9f1a8922ee92c6dc964d6595907c1804a86753774322b468f69d4f278000002801864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f80000000081ed250ed73db6e70805c4efcf0056e8695b79cd3ba418e827c184dee6c6fb0e0000000a01864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f80000000201edec46da82748ab9159023272fe1c3d4a5533cd7f2bfb4aea950670ac42c7c900000003000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000001000000000000000000000000000000000", + "timestamp": 1704899177 + } +} \ 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 new file mode 100644 index 00000000000..50ff83dd3ac --- /dev/null +++ b/l1-contracts/test/fixtures/mixed_block_0.json @@ -0,0 +1,64 @@ +{ + "populate": { + "l1ToL2Content": [ + "0x0000000000000000000000000000000000000000000000000000000000000401", + "0x0000000000000000000000000000000000000000000000000000000000000402", + "0x0000000000000000000000000000000000000000000000000000000000000403", + "0x0000000000000000000000000000000000000000000000000000000000000404", + "0x0000000000000000000000000000000000000000000000000000000000000405", + "0x0000000000000000000000000000000000000000000000000000000000000406", + "0x0000000000000000000000000000000000000000000000000000000000000407", + "0x0000000000000000000000000000000000000000000000000000000000000408", + "0x0000000000000000000000000000000000000000000000000000000000000409", + "0x000000000000000000000000000000000000000000000000000000000000040a", + "0x000000000000000000000000000000000000000000000000000000000000040b", + "0x000000000000000000000000000000000000000000000000000000000000040c", + "0x000000000000000000000000000000000000000000000000000000000000040d", + "0x000000000000000000000000000000000000000000000000000000000000040e", + "0x000000000000000000000000000000000000000000000000000000000000040f", + "0x0000000000000000000000000000000000000000000000000000000000000410" + ], + "recipient": "0x1647b194c649f5dd01d7c832f89b0f496043c9150797923ea89e93d5ac619a93", + "sender": "0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc" + }, + "messages": { + "l1ToL2Messages": [ + "0x151de48ca3efbae39f180fe00b8f472ec9f25be10b4f283a87c6d78393537039", + "0x14c2ea9dedf77698d4afe23bc663263eed0bf9aa3a8b17d9b74812f185610f9e", + "0x1570cc6641699e3ae87fa258d80a6d853f7b8ccb211dc244d017e2ca6530f8a1", + "0x2806c860af67e9cd50000378411b8c4c4db172ceb2daa862b259b689ccbdc1e0", + "0x05f140c7c95624c8006774279a01ec1ea88617999e4fe6997b6576c4e1c7395a", + "0x22048b96b586596bd740d0402e15f5577f7ceb5496b65aafc6d89d7c3b34924b", + "0x0c3f2d50d16279970d682cada30bfa6b29bc0bac0ee2389f6a0444853eccaa93", + "0x2b2a60561da46a58569d71044a84c639e7f88429826e5622581536eb906d9cdd", + "0x25a2c0a76f7da6924e10751c755227d2535f4ad258b984e78f9f452a853c5230", + "0x0e212d8e2069e4254d81af07744bcbb81121a38f0e2dbed69a523d3fbf85b75c", + "0x287ca6f33aadbac2e4f058e05924c140d7895a6ed167caf804b710d2ae3ba62b", + "0x1b51297b3ea37637af6bd56cf33425d95cc5c96e9c2ee3077322fbec86a0c7f3", + "0x2c15d2a888c6cc122e99478c92470a1311635142d82ad7ae67410beeef4ae31f", + "0x0902ba2fb964922a4610bb18901f7b923885c1d034da5769a48203ae6f0206a9", + "0x2855e2c01ddb3d6553386b5580d681b8230fa4062948668f834f23e0636eaff7", + "0x0aaa64519aafdf4b040bd2f9836e76b9dc13cfec8065dcdf2834d786e06260d1" + ], + "l2ToL1Messages": [ + "0x0000000000000000000000000000000000000000000000000000000000000340", + "0x0000000000000000000000000000000000000000000000000000000000000341", + "0x0000000000000000000000000000000000000000000000000000000000000380", + "0x0000000000000000000000000000000000000000000000000000000000000381", + "0x00000000000000000000000000000000000000000000000000000000000003c0", + "0x00000000000000000000000000000000000000000000000000000000000003c1", + "0x0000000000000000000000000000000000000000000000000000000000000400", + "0x0000000000000000000000000000000000000000000000000000000000000401" + ] + }, + "block": { + "blockNumber": 1, + "startStateHash": "0xc738d05d59876de0510b4270011e7f52341083568b9bafef2324af4d12eca533", + "endStateHash": "0xed09b43d862f8628640ddc03012c80962c0bab9bf63c4962b7b1ef80e80db89e", + "publicInputsHash": "0x0dc5c55cd235083803f33a86381f9c1552213c0cb89d33d8fd35d9f1b617788f", + "calldataHash": "0x094b6884a31f1505b1f60a4f96a44b60b24647d3edcf532b4a30c242eb75a894", + "l1ToL2MessagesHash": "0xb213c9c543fce2a66720d26a913fe0d018f72a47ccfe698baafcf4cced343cfd", + "body": "0x0000000000000000000000000000000000000000000000000000000000007a6900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000016642d9ccd8346c403aa4c3fa451178b22534a27035cdaa6ec34ae53b29c50cb000000000bcfa3e9f1a8922ee92c6dc964d6595907c1804a86753774322b468f69d4f278000000801864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f80000000001ed250ed73db6e70805c4efcf0056e8695b79cd3ba418e827c184dee6c6fb0e0000000201864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f80000000001a005071a487e4891787073a91504fe6ea55280bc6f65a021fd6f7ca1f10aa02000000010d944282e11bdcfa5e8f2b55fe80db4c586087bfc10e0bbba5724d30b8c15e2e0000010001c16141039343d4d403501e66deecff1b024bd76794820a43dc3424087813a2000001801a3d3e40c90cd24822b9c268154ef14d4639febdb7af81b554cb2d651b88dfb100000004160ba3a7c15d7dd592a24b3f14bfa76a0b45378877d4dedc5f126f47844b99b2000000600a241c83a063083fad29b6c333afcd968f71f8a875544ff1f1f08cae7f770f51000000101f1de772c009f5b1660876343eb57b7a676a84c695b0c526de2f238c4181090700000002000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000014100000000000000000000000000000000000000000000000000000000000001420000000000000000000000000000000000000000000000000000000000000143000000000000000000000000000000000000000000000000000000000000014400000000000000000000000000000000000000000000000000000000000001450000000000000000000000000000000000000000000000000000000000000146000000000000000000000000000000000000000000000000000000000000014700000000000000000000000000000000000000000000000000000000000001480000000000000000000000000000000000000000000000000000000000000149000000000000000000000000000000000000000000000000000000000000014a000000000000000000000000000000000000000000000000000000000000014b000000000000000000000000000000000000000000000000000000000000014c000000000000000000000000000000000000000000000000000000000000014d000000000000000000000000000000000000000000000000000000000000014e000000000000000000000000000000000000000000000000000000000000014f0000000000000000000000000000000000000000000000000000000000000150000000000000000000000000000000000000000000000000000000000000015100000000000000000000000000000000000000000000000000000000000001520000000000000000000000000000000000000000000000000000000000000153000000000000000000000000000000000000000000000000000000000000015400000000000000000000000000000000000000000000000000000000000001550000000000000000000000000000000000000000000000000000000000000156000000000000000000000000000000000000000000000000000000000000015700000000000000000000000000000000000000000000000000000000000001580000000000000000000000000000000000000000000000000000000000000159000000000000000000000000000000000000000000000000000000000000015a000000000000000000000000000000000000000000000000000000000000015b000000000000000000000000000000000000000000000000000000000000015c000000000000000000000000000000000000000000000000000000000000015d000000000000000000000000000000000000000000000000000000000000015e000000000000000000000000000000000000000000000000000000000000015f0000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000016100000000000000000000000000000000000000000000000000000000000001620000000000000000000000000000000000000000000000000000000000000163000000000000000000000000000000000000000000000000000000000000016400000000000000000000000000000000000000000000000000000000000001650000000000000000000000000000000000000000000000000000000000000166000000000000000000000000000000000000000000000000000000000000016700000000000000000000000000000000000000000000000000000000000001680000000000000000000000000000000000000000000000000000000000000169000000000000000000000000000000000000000000000000000000000000016a000000000000000000000000000000000000000000000000000000000000016b000000000000000000000000000000000000000000000000000000000000016c000000000000000000000000000000000000000000000000000000000000016d000000000000000000000000000000000000000000000000000000000000016e000000000000000000000000000000000000000000000000000000000000016f0000000000000000000000000000000000000000000000000000000000000170000000000000000000000000000000000000000000000000000000000000017100000000000000000000000000000000000000000000000000000000000001720000000000000000000000000000000000000000000000000000000000000173000000000000000000000000000000000000000000000000000000000000017400000000000000000000000000000000000000000000000000000000000001750000000000000000000000000000000000000000000000000000000000000176000000000000000000000000000000000000000000000000000000000000017700000000000000000000000000000000000000000000000000000000000001780000000000000000000000000000000000000000000000000000000000000179000000000000000000000000000000000000000000000000000000000000017a000000000000000000000000000000000000000000000000000000000000017b000000000000000000000000000000000000000000000000000000000000017c000000000000000000000000000000000000000000000000000000000000017d000000000000000000000000000000000000000000000000000000000000017e000000000000000000000000000000000000000000000000000000000000017f0000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000018100000000000000000000000000000000000000000000000000000000000001820000000000000000000000000000000000000000000000000000000000000183000000000000000000000000000000000000000000000000000000000000018400000000000000000000000000000000000000000000000000000000000001850000000000000000000000000000000000000000000000000000000000000186000000000000000000000000000000000000000000000000000000000000018700000000000000000000000000000000000000000000000000000000000001880000000000000000000000000000000000000000000000000000000000000189000000000000000000000000000000000000000000000000000000000000018a000000000000000000000000000000000000000000000000000000000000018b000000000000000000000000000000000000000000000000000000000000018c000000000000000000000000000000000000000000000000000000000000018d000000000000000000000000000000000000000000000000000000000000018e000000000000000000000000000000000000000000000000000000000000018f0000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000019100000000000000000000000000000000000000000000000000000000000001920000000000000000000000000000000000000000000000000000000000000193000000000000000000000000000000000000000000000000000000000000019400000000000000000000000000000000000000000000000000000000000001950000000000000000000000000000000000000000000000000000000000000196000000000000000000000000000000000000000000000000000000000000019700000000000000000000000000000000000000000000000000000000000001980000000000000000000000000000000000000000000000000000000000000199000000000000000000000000000000000000000000000000000000000000019a000000000000000000000000000000000000000000000000000000000000019b000000000000000000000000000000000000000000000000000000000000019c000000000000000000000000000000000000000000000000000000000000019d000000000000000000000000000000000000000000000000000000000000019e000000000000000000000000000000000000000000000000000000000000019f00000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001a100000000000000000000000000000000000000000000000000000000000001a200000000000000000000000000000000000000000000000000000000000001a300000000000000000000000000000000000000000000000000000000000001a400000000000000000000000000000000000000000000000000000000000001a500000000000000000000000000000000000000000000000000000000000001a600000000000000000000000000000000000000000000000000000000000001a700000000000000000000000000000000000000000000000000000000000001a800000000000000000000000000000000000000000000000000000000000001a900000000000000000000000000000000000000000000000000000000000001aa00000000000000000000000000000000000000000000000000000000000001ab00000000000000000000000000000000000000000000000000000000000001ac00000000000000000000000000000000000000000000000000000000000001ad00000000000000000000000000000000000000000000000000000000000001ae00000000000000000000000000000000000000000000000000000000000001af00000000000000000000000000000000000000000000000000000000000001b000000000000000000000000000000000000000000000000000000000000001b100000000000000000000000000000000000000000000000000000000000001b200000000000000000000000000000000000000000000000000000000000001b300000000000000000000000000000000000000000000000000000000000001b400000000000000000000000000000000000000000000000000000000000001b500000000000000000000000000000000000000000000000000000000000001b600000000000000000000000000000000000000000000000000000000000001b700000000000000000000000000000000000000000000000000000000000001b800000000000000000000000000000000000000000000000000000000000001b900000000000000000000000000000000000000000000000000000000000001ba00000000000000000000000000000000000000000000000000000000000001bb00000000000000000000000000000000000000000000000000000000000001bc00000000000000000000000000000000000000000000000000000000000001bd00000000000000000000000000000000000000000000000000000000000001be00000000000000000000000000000000000000000000000000000000000001bf00000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000001c100000000000000000000000000000000000000000000000000000000000001c200000000000000000000000000000000000000000000000000000000000001c300000000000000000000000000000000000000000000000000000000000001c400000000000000000000000000000000000000000000000000000000000001c500000000000000000000000000000000000000000000000000000000000001c600000000000000000000000000000000000000000000000000000000000001c700000000000000000000000000000000000000000000000000000000000001c800000000000000000000000000000000000000000000000000000000000001c900000000000000000000000000000000000000000000000000000000000001ca00000000000000000000000000000000000000000000000000000000000001cb00000000000000000000000000000000000000000000000000000000000001cc00000000000000000000000000000000000000000000000000000000000001cd00000000000000000000000000000000000000000000000000000000000001ce00000000000000000000000000000000000000000000000000000000000001cf00000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000001d100000000000000000000000000000000000000000000000000000000000001d200000000000000000000000000000000000000000000000000000000000001d300000000000000000000000000000000000000000000000000000000000001d400000000000000000000000000000000000000000000000000000000000001d500000000000000000000000000000000000000000000000000000000000001d600000000000000000000000000000000000000000000000000000000000001d700000000000000000000000000000000000000000000000000000000000001d800000000000000000000000000000000000000000000000000000000000001d900000000000000000000000000000000000000000000000000000000000001da00000000000000000000000000000000000000000000000000000000000001db00000000000000000000000000000000000000000000000000000000000001dc00000000000000000000000000000000000000000000000000000000000001dd00000000000000000000000000000000000000000000000000000000000001de00000000000000000000000000000000000000000000000000000000000001df00000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001e100000000000000000000000000000000000000000000000000000000000001e200000000000000000000000000000000000000000000000000000000000001e300000000000000000000000000000000000000000000000000000000000001e400000000000000000000000000000000000000000000000000000000000001e500000000000000000000000000000000000000000000000000000000000001e600000000000000000000000000000000000000000000000000000000000001e700000000000000000000000000000000000000000000000000000000000001e800000000000000000000000000000000000000000000000000000000000001e900000000000000000000000000000000000000000000000000000000000001ea00000000000000000000000000000000000000000000000000000000000001eb00000000000000000000000000000000000000000000000000000000000001ec00000000000000000000000000000000000000000000000000000000000001ed00000000000000000000000000000000000000000000000000000000000001ee00000000000000000000000000000000000000000000000000000000000001ef00000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000000000000000000000000000000000000001f100000000000000000000000000000000000000000000000000000000000001f200000000000000000000000000000000000000000000000000000000000001f300000000000000000000000000000000000000000000000000000000000001f400000000000000000000000000000000000000000000000000000000000001f500000000000000000000000000000000000000000000000000000000000001f600000000000000000000000000000000000000000000000000000000000001f700000000000000000000000000000000000000000000000000000000000001f800000000000000000000000000000000000000000000000000000000000001f900000000000000000000000000000000000000000000000000000000000001fa00000000000000000000000000000000000000000000000000000000000001fb00000000000000000000000000000000000000000000000000000000000001fc00000000000000000000000000000000000000000000000000000000000001fd00000000000000000000000000000000000000000000000000000000000001fe00000000000000000000000000000000000000000000000000000000000001ff0000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020100000000000000000000000000000000000000000000000000000000000002020000000000000000000000000000000000000000000000000000000000000203000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002050000000000000000000000000000000000000000000000000000000000000206000000000000000000000000000000000000000000000000000000000000020700000000000000000000000000000000000000000000000000000000000002080000000000000000000000000000000000000000000000000000000000000209000000000000000000000000000000000000000000000000000000000000020a000000000000000000000000000000000000000000000000000000000000020b000000000000000000000000000000000000000000000000000000000000020c000000000000000000000000000000000000000000000000000000000000020d000000000000000000000000000000000000000000000000000000000000020e000000000000000000000000000000000000000000000000000000000000020f0000000000000000000000000000000000000000000000000000000000000210000000000000000000000000000000000000000000000000000000000000021100000000000000000000000000000000000000000000000000000000000002120000000000000000000000000000000000000000000000000000000000000213000000000000000000000000000000000000000000000000000000000000021400000000000000000000000000000000000000000000000000000000000002150000000000000000000000000000000000000000000000000000000000000216000000000000000000000000000000000000000000000000000000000000021700000000000000000000000000000000000000000000000000000000000002180000000000000000000000000000000000000000000000000000000000000219000000000000000000000000000000000000000000000000000000000000021a000000000000000000000000000000000000000000000000000000000000021b000000000000000000000000000000000000000000000000000000000000021c000000000000000000000000000000000000000000000000000000000000021d000000000000000000000000000000000000000000000000000000000000021e000000000000000000000000000000000000000000000000000000000000021f0000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000022100000000000000000000000000000000000000000000000000000000000002220000000000000000000000000000000000000000000000000000000000000223000000000000000000000000000000000000000000000000000000000000022400000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000226000000000000000000000000000000000000000000000000000000000000022700000000000000000000000000000000000000000000000000000000000002280000000000000000000000000000000000000000000000000000000000000229000000000000000000000000000000000000000000000000000000000000022a000000000000000000000000000000000000000000000000000000000000022b000000000000000000000000000000000000000000000000000000000000022c000000000000000000000000000000000000000000000000000000000000022d000000000000000000000000000000000000000000000000000000000000022e000000000000000000000000000000000000000000000000000000000000022f0000000000000000000000000000000000000000000000000000000000000230000000000000000000000000000000000000000000000000000000000000023100000000000000000000000000000000000000000000000000000000000002320000000000000000000000000000000000000000000000000000000000000233000000000000000000000000000000000000000000000000000000000000023400000000000000000000000000000000000000000000000000000000000002350000000000000000000000000000000000000000000000000000000000000236000000000000000000000000000000000000000000000000000000000000023700000000000000000000000000000000000000000000000000000000000002380000000000000000000000000000000000000000000000000000000000000239000000000000000000000000000000000000000000000000000000000000023a000000000000000000000000000000000000000000000000000000000000023b000000000000000000000000000000000000000000000000000000000000023c000000000000000000000000000000000000000000000000000000000000023d000000000000000000000000000000000000000000000000000000000000023e000000000000000000000000000000000000000000000000000000000000023f000001000000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000024100000000000000000000000000000000000000000000000000000000000002420000000000000000000000000000000000000000000000000000000000000243000000000000000000000000000000000000000000000000000000000000024400000000000000000000000000000000000000000000000000000000000002450000000000000000000000000000000000000000000000000000000000000246000000000000000000000000000000000000000000000000000000000000024700000000000000000000000000000000000000000000000000000000000002480000000000000000000000000000000000000000000000000000000000000249000000000000000000000000000000000000000000000000000000000000024a000000000000000000000000000000000000000000000000000000000000024b000000000000000000000000000000000000000000000000000000000000024c000000000000000000000000000000000000000000000000000000000000024d000000000000000000000000000000000000000000000000000000000000024e000000000000000000000000000000000000000000000000000000000000024f0000000000000000000000000000000000000000000000000000000000000250000000000000000000000000000000000000000000000000000000000000025100000000000000000000000000000000000000000000000000000000000002520000000000000000000000000000000000000000000000000000000000000253000000000000000000000000000000000000000000000000000000000000025400000000000000000000000000000000000000000000000000000000000002550000000000000000000000000000000000000000000000000000000000000256000000000000000000000000000000000000000000000000000000000000025700000000000000000000000000000000000000000000000000000000000002580000000000000000000000000000000000000000000000000000000000000259000000000000000000000000000000000000000000000000000000000000025a000000000000000000000000000000000000000000000000000000000000025b000000000000000000000000000000000000000000000000000000000000025c000000000000000000000000000000000000000000000000000000000000025d000000000000000000000000000000000000000000000000000000000000025e000000000000000000000000000000000000000000000000000000000000025f0000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000026100000000000000000000000000000000000000000000000000000000000002620000000000000000000000000000000000000000000000000000000000000263000000000000000000000000000000000000000000000000000000000000026400000000000000000000000000000000000000000000000000000000000002650000000000000000000000000000000000000000000000000000000000000266000000000000000000000000000000000000000000000000000000000000026700000000000000000000000000000000000000000000000000000000000002680000000000000000000000000000000000000000000000000000000000000269000000000000000000000000000000000000000000000000000000000000026a000000000000000000000000000000000000000000000000000000000000026b000000000000000000000000000000000000000000000000000000000000026c000000000000000000000000000000000000000000000000000000000000026d000000000000000000000000000000000000000000000000000000000000026e000000000000000000000000000000000000000000000000000000000000026f0000000000000000000000000000000000000000000000000000000000000270000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000002720000000000000000000000000000000000000000000000000000000000000273000000000000000000000000000000000000000000000000000000000000027400000000000000000000000000000000000000000000000000000000000002750000000000000000000000000000000000000000000000000000000000000276000000000000000000000000000000000000000000000000000000000000027700000000000000000000000000000000000000000000000000000000000002780000000000000000000000000000000000000000000000000000000000000279000000000000000000000000000000000000000000000000000000000000027a000000000000000000000000000000000000000000000000000000000000027b000000000000000000000000000000000000000000000000000000000000027c000000000000000000000000000000000000000000000000000000000000027d000000000000000000000000000000000000000000000000000000000000027e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000028100000000000000000000000000000000000000000000000000000000000002820000000000000000000000000000000000000000000000000000000000000283000000000000000000000000000000000000000000000000000000000000028400000000000000000000000000000000000000000000000000000000000002850000000000000000000000000000000000000000000000000000000000000286000000000000000000000000000000000000000000000000000000000000028700000000000000000000000000000000000000000000000000000000000002880000000000000000000000000000000000000000000000000000000000000289000000000000000000000000000000000000000000000000000000000000028a000000000000000000000000000000000000000000000000000000000000028b000000000000000000000000000000000000000000000000000000000000028c000000000000000000000000000000000000000000000000000000000000028d000000000000000000000000000000000000000000000000000000000000028e000000000000000000000000000000000000000000000000000000000000028f0000000000000000000000000000000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000029100000000000000000000000000000000000000000000000000000000000002920000000000000000000000000000000000000000000000000000000000000293000000000000000000000000000000000000000000000000000000000000029400000000000000000000000000000000000000000000000000000000000002950000000000000000000000000000000000000000000000000000000000000296000000000000000000000000000000000000000000000000000000000000029700000000000000000000000000000000000000000000000000000000000002980000000000000000000000000000000000000000000000000000000000000299000000000000000000000000000000000000000000000000000000000000029a000000000000000000000000000000000000000000000000000000000000029b000000000000000000000000000000000000000000000000000000000000029c000000000000000000000000000000000000000000000000000000000000029d000000000000000000000000000000000000000000000000000000000000029e000000000000000000000000000000000000000000000000000000000000029f00000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002a100000000000000000000000000000000000000000000000000000000000002a200000000000000000000000000000000000000000000000000000000000002a300000000000000000000000000000000000000000000000000000000000002a400000000000000000000000000000000000000000000000000000000000002a500000000000000000000000000000000000000000000000000000000000002a600000000000000000000000000000000000000000000000000000000000002a700000000000000000000000000000000000000000000000000000000000002a800000000000000000000000000000000000000000000000000000000000002a900000000000000000000000000000000000000000000000000000000000002aa00000000000000000000000000000000000000000000000000000000000002ab00000000000000000000000000000000000000000000000000000000000002ac00000000000000000000000000000000000000000000000000000000000002ad00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002af00000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000002b100000000000000000000000000000000000000000000000000000000000002b200000000000000000000000000000000000000000000000000000000000002b300000000000000000000000000000000000000000000000000000000000002b400000000000000000000000000000000000000000000000000000000000002b500000000000000000000000000000000000000000000000000000000000002b600000000000000000000000000000000000000000000000000000000000002b700000000000000000000000000000000000000000000000000000000000002b800000000000000000000000000000000000000000000000000000000000002b900000000000000000000000000000000000000000000000000000000000002ba00000000000000000000000000000000000000000000000000000000000002bb00000000000000000000000000000000000000000000000000000000000002bc00000000000000000000000000000000000000000000000000000000000002bd00000000000000000000000000000000000000000000000000000000000002be000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000002c100000000000000000000000000000000000000000000000000000000000002c200000000000000000000000000000000000000000000000000000000000002c300000000000000000000000000000000000000000000000000000000000002c400000000000000000000000000000000000000000000000000000000000002c500000000000000000000000000000000000000000000000000000000000002c600000000000000000000000000000000000000000000000000000000000002c700000000000000000000000000000000000000000000000000000000000002c800000000000000000000000000000000000000000000000000000000000002c900000000000000000000000000000000000000000000000000000000000002ca00000000000000000000000000000000000000000000000000000000000002cb00000000000000000000000000000000000000000000000000000000000002cc00000000000000000000000000000000000000000000000000000000000002cd00000000000000000000000000000000000000000000000000000000000002ce00000000000000000000000000000000000000000000000000000000000002cf00000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000002d100000000000000000000000000000000000000000000000000000000000002d200000000000000000000000000000000000000000000000000000000000002d300000000000000000000000000000000000000000000000000000000000002d400000000000000000000000000000000000000000000000000000000000002d500000000000000000000000000000000000000000000000000000000000002d600000000000000000000000000000000000000000000000000000000000002d700000000000000000000000000000000000000000000000000000000000002d800000000000000000000000000000000000000000000000000000000000002d900000000000000000000000000000000000000000000000000000000000002da00000000000000000000000000000000000000000000000000000000000002db00000000000000000000000000000000000000000000000000000000000002dc00000000000000000000000000000000000000000000000000000000000002dd00000000000000000000000000000000000000000000000000000000000002de00000000000000000000000000000000000000000000000000000000000002df00000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000002e100000000000000000000000000000000000000000000000000000000000002e200000000000000000000000000000000000000000000000000000000000002e300000000000000000000000000000000000000000000000000000000000002e400000000000000000000000000000000000000000000000000000000000002e500000000000000000000000000000000000000000000000000000000000002e600000000000000000000000000000000000000000000000000000000000002e700000000000000000000000000000000000000000000000000000000000002e800000000000000000000000000000000000000000000000000000000000002e900000000000000000000000000000000000000000000000000000000000002ea00000000000000000000000000000000000000000000000000000000000002eb00000000000000000000000000000000000000000000000000000000000002ec00000000000000000000000000000000000000000000000000000000000002ed00000000000000000000000000000000000000000000000000000000000002ee00000000000000000000000000000000000000000000000000000000000002ef00000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000002f100000000000000000000000000000000000000000000000000000000000002f200000000000000000000000000000000000000000000000000000000000002f300000000000000000000000000000000000000000000000000000000000002f400000000000000000000000000000000000000000000000000000000000002f500000000000000000000000000000000000000000000000000000000000002f600000000000000000000000000000000000000000000000000000000000002f700000000000000000000000000000000000000000000000000000000000002f800000000000000000000000000000000000000000000000000000000000002f900000000000000000000000000000000000000000000000000000000000002fa00000000000000000000000000000000000000000000000000000000000002fb00000000000000000000000000000000000000000000000000000000000002fc00000000000000000000000000000000000000000000000000000000000002fd00000000000000000000000000000000000000000000000000000000000002fe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000030100000000000000000000000000000000000000000000000000000000000003020000000000000000000000000000000000000000000000000000000000000303000000000000000000000000000000000000000000000000000000000000030400000000000000000000000000000000000000000000000000000000000003050000000000000000000000000000000000000000000000000000000000000306000000000000000000000000000000000000000000000000000000000000030700000000000000000000000000000000000000000000000000000000000003080000000000000000000000000000000000000000000000000000000000000309000000000000000000000000000000000000000000000000000000000000030a000000000000000000000000000000000000000000000000000000000000030b000000000000000000000000000000000000000000000000000000000000030c000000000000000000000000000000000000000000000000000000000000030d000000000000000000000000000000000000000000000000000000000000030e000000000000000000000000000000000000000000000000000000000000030f0000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000031100000000000000000000000000000000000000000000000000000000000003120000000000000000000000000000000000000000000000000000000000000313000000000000000000000000000000000000000000000000000000000000031400000000000000000000000000000000000000000000000000000000000003150000000000000000000000000000000000000000000000000000000000000316000000000000000000000000000000000000000000000000000000000000031700000000000000000000000000000000000000000000000000000000000003180000000000000000000000000000000000000000000000000000000000000319000000000000000000000000000000000000000000000000000000000000031a000000000000000000000000000000000000000000000000000000000000031b000000000000000000000000000000000000000000000000000000000000031c000000000000000000000000000000000000000000000000000000000000031d000000000000000000000000000000000000000000000000000000000000031e000000000000000000000000000000000000000000000000000000000000031f0000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000032100000000000000000000000000000000000000000000000000000000000003220000000000000000000000000000000000000000000000000000000000000323000000000000000000000000000000000000000000000000000000000000032400000000000000000000000000000000000000000000000000000000000003250000000000000000000000000000000000000000000000000000000000000326000000000000000000000000000000000000000000000000000000000000032700000000000000000000000000000000000000000000000000000000000003280000000000000000000000000000000000000000000000000000000000000329000000000000000000000000000000000000000000000000000000000000032a000000000000000000000000000000000000000000000000000000000000032b000000000000000000000000000000000000000000000000000000000000032c000000000000000000000000000000000000000000000000000000000000032d000000000000000000000000000000000000000000000000000000000000032e000000000000000000000000000000000000000000000000000000000000032f0000000000000000000000000000000000000000000000000000000000000330000000000000000000000000000000000000000000000000000000000000033100000000000000000000000000000000000000000000000000000000000003320000000000000000000000000000000000000000000000000000000000000333000000000000000000000000000000000000000000000000000000000000033400000000000000000000000000000000000000000000000000000000000003350000000000000000000000000000000000000000000000000000000000000336000000000000000000000000000000000000000000000000000000000000033700000000000000000000000000000000000000000000000000000000000003380000000000000000000000000000000000000000000000000000000000000339000000000000000000000000000000000000000000000000000000000000033a000000000000000000000000000000000000000000000000000000000000033b000000000000000000000000000000000000000000000000000000000000033c000000000000000000000000000000000000000000000000000000000000033d000000000000000000000000000000000000000000000000000000000000033e0000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000540000000000000000000000000000000000000000000000000000000000000054a0000000000000000000000000000000000000000000000000000000000000541000000000000000000000000000000000000000000000000000000000000054b0000000000000000000000000000000000000000000000000000000000000542000000000000000000000000000000000000000000000000000000000000054c0000000000000000000000000000000000000000000000000000000000000543000000000000000000000000000000000000000000000000000000000000054d0000000000000000000000000000000000000000000000000000000000000544000000000000000000000000000000000000000000000000000000000000054e0000000000000000000000000000000000000000000000000000000000000545000000000000000000000000000000000000000000000000000000000000054f00000000000000000000000000000000000000000000000000000000000005460000000000000000000000000000000000000000000000000000000000000550000000000000000000000000000000000000000000000000000000000000054700000000000000000000000000000000000000000000000000000000000005510000000000000000000000000000000000000000000000000000000000000548000000000000000000000000000000000000000000000000000000000000055200000000000000000000000000000000000000000000000000000000000005490000000000000000000000000000000000000000000000000000000000000553000000000000000000000000000000000000000000000000000000000000054a0000000000000000000000000000000000000000000000000000000000000554000000000000000000000000000000000000000000000000000000000000054b0000000000000000000000000000000000000000000000000000000000000555000000000000000000000000000000000000000000000000000000000000054c0000000000000000000000000000000000000000000000000000000000000556000000000000000000000000000000000000000000000000000000000000054d0000000000000000000000000000000000000000000000000000000000000557000000000000000000000000000000000000000000000000000000000000054e0000000000000000000000000000000000000000000000000000000000000558000000000000000000000000000000000000000000000000000000000000054f00000000000000000000000000000000000000000000000000000000000005590000000000000000000000000000000000000000000000000000000000000580000000000000000000000000000000000000000000000000000000000000058a0000000000000000000000000000000000000000000000000000000000000581000000000000000000000000000000000000000000000000000000000000058b0000000000000000000000000000000000000000000000000000000000000582000000000000000000000000000000000000000000000000000000000000058c0000000000000000000000000000000000000000000000000000000000000583000000000000000000000000000000000000000000000000000000000000058d0000000000000000000000000000000000000000000000000000000000000584000000000000000000000000000000000000000000000000000000000000058e0000000000000000000000000000000000000000000000000000000000000585000000000000000000000000000000000000000000000000000000000000058f00000000000000000000000000000000000000000000000000000000000005860000000000000000000000000000000000000000000000000000000000000590000000000000000000000000000000000000000000000000000000000000058700000000000000000000000000000000000000000000000000000000000005910000000000000000000000000000000000000000000000000000000000000588000000000000000000000000000000000000000000000000000000000000059200000000000000000000000000000000000000000000000000000000000005890000000000000000000000000000000000000000000000000000000000000593000000000000000000000000000000000000000000000000000000000000058a0000000000000000000000000000000000000000000000000000000000000594000000000000000000000000000000000000000000000000000000000000058b0000000000000000000000000000000000000000000000000000000000000595000000000000000000000000000000000000000000000000000000000000058c0000000000000000000000000000000000000000000000000000000000000596000000000000000000000000000000000000000000000000000000000000058d0000000000000000000000000000000000000000000000000000000000000597000000000000000000000000000000000000000000000000000000000000058e0000000000000000000000000000000000000000000000000000000000000598000000000000000000000000000000000000000000000000000000000000058f000000000000000000000000000000000000000000000000000000000000059900000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000005ca00000000000000000000000000000000000000000000000000000000000005c100000000000000000000000000000000000000000000000000000000000005cb00000000000000000000000000000000000000000000000000000000000005c200000000000000000000000000000000000000000000000000000000000005cc00000000000000000000000000000000000000000000000000000000000005c300000000000000000000000000000000000000000000000000000000000005cd00000000000000000000000000000000000000000000000000000000000005c400000000000000000000000000000000000000000000000000000000000005ce00000000000000000000000000000000000000000000000000000000000005c500000000000000000000000000000000000000000000000000000000000005cf00000000000000000000000000000000000000000000000000000000000005c600000000000000000000000000000000000000000000000000000000000005d000000000000000000000000000000000000000000000000000000000000005c700000000000000000000000000000000000000000000000000000000000005d100000000000000000000000000000000000000000000000000000000000005c800000000000000000000000000000000000000000000000000000000000005d200000000000000000000000000000000000000000000000000000000000005c900000000000000000000000000000000000000000000000000000000000005d300000000000000000000000000000000000000000000000000000000000005ca00000000000000000000000000000000000000000000000000000000000005d400000000000000000000000000000000000000000000000000000000000005cb00000000000000000000000000000000000000000000000000000000000005d500000000000000000000000000000000000000000000000000000000000005cc00000000000000000000000000000000000000000000000000000000000005d600000000000000000000000000000000000000000000000000000000000005cd00000000000000000000000000000000000000000000000000000000000005d700000000000000000000000000000000000000000000000000000000000005ce00000000000000000000000000000000000000000000000000000000000005d800000000000000000000000000000000000000000000000000000000000005cf00000000000000000000000000000000000000000000000000000000000005d90000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000060a0000000000000000000000000000000000000000000000000000000000000601000000000000000000000000000000000000000000000000000000000000060b0000000000000000000000000000000000000000000000000000000000000602000000000000000000000000000000000000000000000000000000000000060c0000000000000000000000000000000000000000000000000000000000000603000000000000000000000000000000000000000000000000000000000000060d0000000000000000000000000000000000000000000000000000000000000604000000000000000000000000000000000000000000000000000000000000060e0000000000000000000000000000000000000000000000000000000000000605000000000000000000000000000000000000000000000000000000000000060f00000000000000000000000000000000000000000000000000000000000006060000000000000000000000000000000000000000000000000000000000000610000000000000000000000000000000000000000000000000000000000000060700000000000000000000000000000000000000000000000000000000000006110000000000000000000000000000000000000000000000000000000000000608000000000000000000000000000000000000000000000000000000000000061200000000000000000000000000000000000000000000000000000000000006090000000000000000000000000000000000000000000000000000000000000613000000000000000000000000000000000000000000000000000000000000060a0000000000000000000000000000000000000000000000000000000000000614000000000000000000000000000000000000000000000000000000000000060b0000000000000000000000000000000000000000000000000000000000000615000000000000000000000000000000000000000000000000000000000000060c0000000000000000000000000000000000000000000000000000000000000616000000000000000000000000000000000000000000000000000000000000060d0000000000000000000000000000000000000000000000000000000000000617000000000000000000000000000000000000000000000000000000000000060e0000000000000000000000000000000000000000000000000000000000000618000000000000000000000000000000000000000000000000000000000000060f000000000000000000000000000000000000000000000000000000000000061900000008000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000003410000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000038100000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000003c100000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000401000000041c72e330b60e0052863df88b19ebb482d412b0a7bbb2fabb9347be5e59453d10078d263242fac5a2ad544b5005bcea367ebc04e01ff7ca279650bc63d9488ac304ad4d395e21ea570da47bf574569c6526312c5c7ad63a6d248f694e5c81c2b60e12693b411d9eb8f564aa43f4aa14e3e30f8574425a6d6491416332b77d2709000000000000000000000000000000000000000000000000000000000000104041414141414141414141414141414141414141410000000000000000000000000000000000000000000000000000000000001080818181818181818181818181818181818181818100000000000000000000000000000000000000000000000000000000000010c0c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c10000000000000000000000000000000000000000000000000000000000001100010101010101010101010101010101010101010100000010151de48ca3efbae39f180fe00b8f472ec9f25be10b4f283a87c6d7839353703914c2ea9dedf77698d4afe23bc663263eed0bf9aa3a8b17d9b74812f185610f9e1570cc6641699e3ae87fa258d80a6d853f7b8ccb211dc244d017e2ca6530f8a12806c860af67e9cd50000378411b8c4c4db172ceb2daa862b259b689ccbdc1e005f140c7c95624c8006774279a01ec1ea88617999e4fe6997b6576c4e1c7395a22048b96b586596bd740d0402e15f5577f7ceb5496b65aafc6d89d7c3b34924b0c3f2d50d16279970d682cada30bfa6b29bc0bac0ee2389f6a0444853eccaa932b2a60561da46a58569d71044a84c639e7f88429826e5622581536eb906d9cdd25a2c0a76f7da6924e10751c755227d2535f4ad258b984e78f9f452a853c52300e212d8e2069e4254d81af07744bcbb81121a38f0e2dbed69a523d3fbf85b75c287ca6f33aadbac2e4f058e05924c140d7895a6ed167caf804b710d2ae3ba62b1b51297b3ea37637af6bd56cf33425d95cc5c96e9c2ee3077322fbec86a0c7f32c15d2a888c6cc122e99478c92470a1311635142d82ad7ae67410beeef4ae31f0902ba2fb964922a4610bb18901f7b923885c1d034da5769a48203ae6f0206a92855e2c01ddb3d6553386b5580d681b8230fa4062948668f834f23e0636eaff70aaa64519aafdf4b040bd2f9836e76b9dc13cfec8065dcdf2834d786e06260d10000381000000e00000001bc00000090885bb3dc3c13f4414222efad9b9e5e6b380905a8824d722dbceaeae44dc9d8f03a7be52298709b7534e26a43afc7358bfcd2bd4fbfc4bda7e26710ab1adaac6ba47592ec789cebf41a2a12564c39819917de5950bb458c1f2a5029ba060e2d5d7d84910480c7f4a07c46b54ed36598d30818e99871e918f8c1c422c04d3cc0c6034ff9f034e9052f51c041dde393a1fa00000090ab3f3be064898fa1b6f88b2ff00e4928b3c5074286fb4a5233cbea038470b013e00d97e2c5e8187839db90699ea2e69acb15662fdd32653d66d1437c02754e56bfa7ef5169f00b77081d637d027dc86f1878e32c0f534c68a6985e5154b69be52d4f03a2b62fd36899df06f76bd7520724dc30c460bbe024a21939761482bb6c41ed47aebb56f42ce7d95bf792ce12a500000090860b182ed78831afcc1c928be192425f7ec533406dd66e925bd2b588cb89b642a4f15df2f79a177ce5a4aafcfba4bb8fb07f032f632ad17cc725e21c1bac538ee73ff2d5e77efe715e12af88d5453b690d75b692974c3327b985925ac3abeb6c12445c6c4d1ec51b7127cdfc90c95b5b23e5cb8afa1a351a612293ba6272fef9f8e3f82f138b961b0f76d7a7c916e4c7000001bc000000908122eecb03c180f9e3ef677d4b29a99dc26c88054d0734600668041ecec1868207a66b01b1941de1354cd8223c1f4ea3536db5305c02ec0e2a0e2858c2f4dede7e33ef9681d52276497da6e65343f0a1075a16514a1d323e1071ceb7439ff2ab6276cb29fd051c0eeb6dd7111e0e87230f46712569040b814d9be577d854fd02f917aff118f5ad14a25d05c7cee039e8000000907f9bde742f35c0ea8e81b656ce7d988a9d1ae00195cda79aaef816dd37548f9f2eaa13d46c5ddf3124ca0fb34fc8bff0b45e9894f8ac16ed038ce9d5722d6566d24f9f57f486ef0829c9b741bd1c96ea1c3f5c3f5a87b843d9787218ad4baa5af887e172a82b016d8506f6c953dc96581ac245bb267cd88bd8bc7e3ef9df7ccbeacb18bc1b30534368589e4f570a657d000000905c12faefd7a7cf65d6475e18ee99a942c6567d3473919de144ac498665fee34772f883fad49d250c33d1ff20fb1085c86137de6471bca35e6a5f3f7dcf8b6975e2605312d9fbf714a1cc9a58650c208016fe29c4c8ee1a0c371dfd02264cbe8642ca0ad671b2479af0f5e0a749d8b33c0da2f7e7fdc61947f39c7876fca728ab5fcf1761bc28272190b3defb9a9844f4000001bc0000009032d67ec8b6e9dc8ed89a3a411adfde6239b51667715c9c72cd1495db5b7b746380cd63f2f9188450f9fd686eb793b2de5af97357e09da777a8ca0c84995c44d2ea03208445c25361cdac650588c6d005191231bba3b350c452e6d76081873b450b2cc63e013bdebb1da5a9c18989f12e15fea068d56e97030101e058be618f286cf66719580c5295c1dcf3de827aafe100000090c4c9ab378f4957c8ad3b68e592e857830ac4c1145a8923918ead849873221ef658e0378e93fb196ead3eb080d1972fe4305ccf439751f57220004c8d3aa8ad6b686249f4687f5631902fda016643994226c6c0a2844bb06ef567624f1d06661a640a856e863a38e568b21cd4af6be791029fb2443d6e6c7d660ddc85c0e8de0b2b5f0a148ff426f1115974672f73164000000090c0ac0d3eadc05c94a097a0a76b9a68fc58d6ab8e66ccd223ed628f6950310bb2f369f2f178b3444802ced1a56fa7f57cafbbca09c7ce687cb7ed3f5a95601f6d7608c9be2f6df2469cffe14cf1b13f830bf1a1b9646c29be495fbf6f801ed8be5fc9d45cec5fc743a027899ff6b362f303db01d279fd5ba05817a92d8129d004d6edaf359c08bf964cb1e5d2fc99e5a0000001bc000000909105457ccaa2ba3b2254ee3ec3f19923a82bac08498ed2016ca2e9c0bca04979fb7577cd7c152ada33b82a8e40bebe45e497e2861502176e32c51cd5b1bf0ca91851cf7b3724cfb9a99417c1a4d2d90d1f3d35bb9eb3912108d1867043c38b4d5aede3570128855f56cb6d0348bcb8f52a8eff8224deb07c301555237486c0f37ddfa0ac08b0a5fda00f5cfdaad0cc0e00000090520db5e2d7b662e04f3988c5a428035b057f059f3cddb49439eefd9447458a99c733dff4b5a1702a9d392586195b02a24c5f24628d078f7c01bd4f422614bbb0c973a991475ce0ec2e678361237fa0251b16333fa4c3aaa531f98d1960466449964e3f5ba7ec75bcf322e87a35a2230a0ae9882a05db7731b4c6ed6da99efdf06c0815623698d8b71ade16a55ffc067200000090918abd315fde38beba7259c86af4ce352f12f1444481b6c86c23d5e2cfc4d98c90b6d8fcf7c30a5fac7dadc86a5ba8a47dcd1f3b16484812924f79a9e00a9633efa90b62f21bed0f8f3776cf69d0607b0fdbc918a51316145718e4c48dbc323e187982d83abbbc1fed4fbe2762e72dd91cb8f0c539b4ddd4f9a4a8ff6cf732127a0970de63718120523fede4ebab7f14000001bc00000090e5c846c8a6bceba584c29c0fcba48265a2cc20f6d982541b13654a15c1dc00c8ab9c8f9c52fb6ace413a95b1979eedca8d2d2385a622dfeaff8402ba4413ea16b78733f4e43a82bc95a56ad1f72702a72e025499b65d4b2e326cfdde34b3092c9e1c3bac6d610d361ce7dfed8f50d5222f161e3a59f5747a8183cb9719f9ffde5ea72eb1c5bd561c4f78f3c05614854f00000090e31a6868b9f9f24b79786034d06810d25c594ce48750e39ad996631cc6c8b4fa9f230fcdf32e1ad67e9acb892334f24cfb07267de8cea562a28788554cdddfdb323b4700800390c25434473988c7a1520c2bfeb394e512109f0d694c4b7f2d6e2abccbe414cab48a25e8de986b9eec3f07b0575584b0b455ede60d373f90f0cd6a2cfc08ad9be1056d358c821a436d0700000090f9b974c64844d04929e7f9c06b1a701ea02486bfb297c7a56f7728ef7df3a0bc21b6dabf6eca6273b68469cf0d06948166bff4c6c580bdda0d72b5a9aaee819d6c2d92a2aa8cc0cbcecdeb57df7c91740f87cea4888233cd5563a7ddad4f1e414ec745429f1ade6b2568319bb65f7ea123f67e4f1ac6379f7c9efc978e0c06556f16cc5ab6b3255f5a116d86e68f92b5000001bc000000907953bb52ffe6538fcd1c69c4bfc577b4217d27e17a1ba9d420df7a5bbcb32c825690e1b3af4f9b76566aebfaaa83c6cd22c1d27dbc979a94aa3e402148dd57399b57425f74b32fca7bf2b7ef88da460d0bfaf4dcc899aca398cfe7385d4d569da438023a5ed8a0b6c6c98b32acc95a300a9747a52cd664c6527005f2410fbf86e48135fb602da0f0e0d7857bea44051900000090a3b31666d69aac0ea75b4f14b3c9396fd413990d05b380e0ac360465035f4cf07e35324f15b51e964c04a49427d35ac6fd5db99837d7dcd05b3d1546571c15cc7e8f668ea2f445d003286827e3844ea2087b51181bec332e626019a95fe5b1e370875fc41a322c1cc340c8cfdffb068e302518cb4e24106e35373f67b04b8b2404468aa5a1a3899110061c89883d29fe00000090d1999c3f19d70a38351b00a5d70f267d7fd0e3e4ee253580e5e481cf1807d4cbca753bee71bc94bb0374278a884538302276e452e26f67ebaa2d1b223592faa44c2b85ed845d988edbaeb3dc64f2fd471c1ab57b02972ba4bff3448a513807cd17e1deb756ebd47960c340e18c2215121682c2c08a2f58c205f3dd24be3227e8e5a6385ece8905943a219f2cf2a84a6c000001bc0000009091d5467314eaf5b1accdb366a18b157b487db5445ef026a27a7c039767fe5777ec102cdd027e1856edb816f3d712b9135ae6acd56b7f80ccd23352dc17e48eb1be8e25532e56e281cf7afd9f0175edce0e51f5cdf9df26a39ed40a26306ff94f1ad73ceeecea7ea03e98b9ed0b69d4b61b6295d8849a071c13cbdd25f83e2ab9a3c1692eb19437cf4dae483f4bdfbcee000000902c6729e585ad2a150e094714412881dfeccd6d60a55adcc29b9fdfa1016ef0ab2820fd8f9231f77bcb1733becaaed726ee87c5a4b702c8b93257fb27c935be82c9dfed1b8f08d61ab4ec2e6a164ae4ba1c4b49da7b7297615009824dcbf37340527cf19158255916c7ae72edb381b76d19c20e326c044d932f963b5e49d123362ba3a165da27bf7b7efa26f10a90c25a000000908669621dc7cd48e795774a7d44493d63f672bec71988a8b652a0119101122345d4f5278a4d2c4f85309f677e9fe64375497073e4979f8b5d630ed62e8c88e06400f943d692bef2f370fd2bdc257ce2a125c6249e515cdceaab38f0b785ba054425a8a0ee15bd18cb0e1b8d91642d258b1ccbdefe5ba29c900abdc7cf8488b350aebf7296923e2e7f2fddab87acf35497000001bc0000009013e5e112b7fe339b2a5f07cad03c54af89a78e678aee76caee1996cb56cde14977c629c05ce5c914c5679145b0ab2461ce54394347072f363bb7066d448cdf6d70787f37f9d8a1ebb125d5198dd36ecb12ca14e6abe05439984c3953c86ed574bc0c8cade296aea9515ccaaf373734aa1b0474cd87dd3dd712a2371d9523ccce1d15b8702687ab97d0f9ee6f6b380ad400000090bbb31ce264b3254aa8551f77c4e15dc2356ef9e10ffb578b55a3bfcd3d946c16114859069db76a87e5ab25a7b8306fd41279dfa485ef9c1db1d5c8004d63c3f34581224a32fa05e8ef6e70c30a1a19182bd811c146c561484318b36158684b49bc0a8f633a41df89168feb871b6ecb4a2b2104c7f6e0e9046a1429a4c4ed010bf7f6661084f4f8413e60902b7091f88600000090a91313ba29284c043712351d55c47df69177271395548514ca22cfa79ded9689580b0c17c68ea59fd91245265cf933fe81786a0ced256d7062e182cb7822942ba1ba5c2c4e59c8eebe1818026b64ddd90a3dcde82e56d891fca6eaf4ba2d4aade3e96a26996f873f968bc78452f88e0411fb57ec23bc04c829c6e516d8989b853cf3072d9b16c0673e6bfbfaf2d0ce6700000e00000001bc0000009077ecbc7fd165d9ade6abc8ec7aef76b307b4f0223202b5466cc8aca4f4fe90fb52b3d6ec1aa36ce127e2e721c5164107d36be2975e0d3971c94455e550a329c776fdbbfc9a4c9fc3f66c073df1cab5140c0ef7dd2d4e3340d7f197e560996c17112346c052cc156c207e34386dd47c5307a76ed514cad3a7f59744c81c9d4a12fca48fddd3fcb143337dfdd7ec351038000000900fa810dd90147de9aed3bd9a035708540c69924bc682bd1b6c745ca73b15a173727a74b8a2de40894906a813b64960245376a7fa37c70f709f0552450ef76a5129d87870b369dd56847c590f502c2d210e9385ff9ff7e691a2abd5b6c0d96a9c709a3cc6bcfbbae261361777da8651420149af77f0630d9d328073fdae21ed6114a4eac5c741c26c6e0818f1ecaad2d60000009046ba7f5a13e47d1bdfc6d3dfd1d0b5529f4672d6fce5bb7384d19ab2a7e15965ff3a34c081da31d850786656c7af8b8a966a005c0412b141e855058472063a65e1899ab0db0d61a6b34395504e28c7b2146662c3df31eaec3f04cb6114cd8dfdafaf17f3dc1d382cf2dea579a814b57e1009058a127493317697cc37cf718f5e0b56f99aa09d5b3b8f26a02fc5dcd8ba000001bc00000090c5f9eec88ce8e5c36979798b376de2b28f9d1f2607d9010e5145af8a3ac2b0e0889e5c178be25060b061b1d583b471784a0461f9213e242dcd470a18200afc52b435d47b8a567a76a6b655924b5c2d8d209fb502a2435d3cd3e140629a2cba64126ecdf5236da4b089fa4ac315c9daa01d6453eb8857cfa2114cd3da25cc8134fb99b4c06a640bf6c4c808852b82629500000090db6ba5dfa5e3424815ffbfac8ef48fd05131be802899cec2852251c113b5eec328de64a9e640b3a243ab6202d27a5854e269a69fafa7a4d7fa960db62ae810c139a60091fccbb29dfebc4def6a50f2051e051255d552589a7b09899cbca9d89f6cdfacdda4f03ca9f5b4aad25bf947e52a717cbb1e27c6de6fa93a38cb53c6c0e287fd92386eed743b29ec85a557fa2300000090e0ab72826bfdb018ff4d03de311e647e1edf6469965bc5d2ffcd54e7167ac350a57457540af8de0dada31bc4b3ca199c9bf4686dd797c67ed21b34946ad241c5db1a87a1906abd877e7965b206b371bd0f772722bcd358dc890cb0a4707a1d5ff6590dddd773f3099b84d10f5158e2fe05e583c964cea3986aad35c7bb2799f0623ccc3666686764b9cbd53dd3f0c43f000001bc00000090f37fea372a0e4d26e6ce992dea6506f6cb992331e094da50cf92d329cad0b8e40fff1c0694bea939816aeb8fdff615d8fb41bafbb4662078337b7398a607d09c7fa8448ec27c7581855dcc12790c3487271cfb0703aed8612673183ef7d52bf2c449bdd023a9a743b7d25115cc403f181190481c74b41df64e1711b0d058f12ce16b634e23cd6b298e87810d2a1c399c00000090eaede529f772b2ba0f4c57c39e6bbf5c9e12a6258a38c8086d5de7dedbbff8306c7479719a5fe90506d0853a6f9bf5c12c45fdf1c62f7d5cebab84e9eb3eeee1acc6597e29e2619b96a7ccea4a9dfd0516bf834c8113f8f1251070908929a65e83266cf023f765a0cca29aae566444c71810d6d67cbefe9670eae9d7b6a1e57bb6a1fe6749e21806a4ea8bfca35180790000009024ca72f55751c3a2f1fa6b5ba8f2828de2b402c8c2aaa76f8df3fdb3678ade0d07b0788a3f9909f47d4e463a327b476a43acb8d58ab355c4690648fad19878ad62a77fefa8a731af94fd8f819253aaef2fdc29ea25c6d4027f1407247ee783138d98285577d29f0828092ce8a3ac13ed04afffed27a7d7f250f700a5e772b993dd262b911a9c92877ec640d9f5ac6d10000001bc00000090bf464ad4c3858c0122511935318812b1dc1db80b5cc1c41a7ece66dd0ad5dfab7ece2a9a6d3a514d7ee39a02ddc66cdbbcc1eba73167068723fd267fed815f38b52fce696ab3f6c2d63c3b45513043ca09f41a2a9a9479a22e62c45379405216747a71b6ec183f4a671cacc8f667ba09026d61f7318ac5b2253cf5d96b658d7bc3b65f67636aa573eb43c640ba3f0b6000000090fc3bb64b89c9cfb06dbe7e87bef9c2ed71c2610fe2cdef0aabb138cd39f373fa94f8e881c2c3e4365af09072249a0609fe24f34a3e8673c734414fc70fc617806704d7c6f169a61c4d7fd9ac7cab94cf1c8a9d504d17dacc3d3e1b766e29a2d03c8a5fa3c3e7e2b27062710f4407da3e0093123ff99e90c7ab2f266674ecac51df1d170c62327fe9de0b9c81d0095a2200000090e67f3ec573e658b392cd2af096090399240c98c2466f8e43ea5b8bf53ba1e940fd98a86bbb52540fa1a9475378f8027ac77d6ba02c736f758af04da2b72ca496628260263774bab8c3a81e23005a2397154774b7846b16ee66d0747096517db61c7d4d1f175573402e14c4394a87b1f52b0fcfde42d9382df89a7425f41484cde25adb6e0b1eb35edecdca08f00fb9d2000001bc00000090b92ab763c1a69450d42ca10e52b125b9d8bf3512fa879d1c5c9a119892600534bddbd15de8fa6edced3fa0769b21c711de0813398cd3bd5ffd439b24f9db1a24e03441895911fc88c04ec2712b4d2f3c1bf2209e64d6e55b9587360872f1226bac301ae33122e23d6d59fe0120e6ecaf01b2e7887f9a7a1fa4623ef0f907ecf15b1e0b581d06d90d2a306c831d58d43c00000090101b4e9c41460d1748945f6074788e6f58db9a4df2ccddaf42c6f84f25432c2da25049fb00d18a9d5b51240855aa45157630078f02a5994b984a016edf39c7b241b8adede8c713ef1eab761ea4a2bac521fc229f1e999d246e8ef60db122c4a43541fcc0de8a956dec6320195efec3371730352fcdabac0f9372be84d1fb7e831e2b501aeb45979d1fe19bcfcae3b9bf000000900d157efa8bd9a51be9d467c060ab5746781db4a3b2e061380eab0d4cf66010d4cf2a401519c37a570508d5741ef30989846c9c53f66600971bbd070ca178ae00a55f3408db0059da1a2ba3fbbe619f7519156ea4a7d89b9e516e59a14f5f56af35c7f073610680b3a6779b708a7e18b425ce215d686bdb0d748dc2d7a5548cf817a16503766b44c712f4ddf321efebda000001bc00000090432f1ded3d44abdbe01ed2e89bafbe1c84ce83fd12888412eff36d79004f12d8c5aa5cf6998f9602930de2099096ec24b72003891060293e56ffffc61033792d6d4b556e0bad2e6624cf37ef92e4ca4f05773137660f3d57533cae96467a188770972d3471eccf940669dbf863942beb0810848d08161aa59b931ce25fc1df928083ae06435d59017038ec2374f54964000000901ec087f95def019a6d27fead9b8c62367f0a42f0f824302b6936b4550f3d653f374696ead3bb36a59f5526dd24cdbf8bf1dfb08e8b89bf89242f1ae76a79bd1422dc52ada85bbf65708c140678e3f7222d7b7f8657d5e96d2cbb68fdd06d45c0dfb2829b8ff69a5da3ad31f00dd3a71e0b16dd7146a35747ca925ce14ddad8160d540aa2803897cc722441d3503b602e000000901c3c14c105ff0677c2b7bf1860de56d70f741ca09b49f0a839963f236d958d7ebabdce53d6da91b119fc0da0f8a7d3918a9fdd4eae1ee313fda1566c0c3c966387952db18ed31c0f77186e9b0c67e6ba1422c74690427f65d8f9fd25f55be251beb77b6fecb3f61c9f7b2e3579a0a1ab091f4551d92a140245fcf2dc16111c828b2736d8324e00f64efb617d64277fa8000001bc00000090348b7cadb6aa9f85cd97001f740bb85feca57ee53572b9a56a9d9a1e4e769db7ccdef3debf02e57ae0786d27402dd9a5278ff5752c85b405a846a990636563c637b5236dac5ee0e272df43c5a5acd4911e9f04d01ffdc8819a526b0b359884a573186bf6c969de2c6d9a11d74e49d2782765e69acda1b5b090aa61c13bb6dca062d9fc1a09eb879a3b58ccae8c612f210000009021a8dd1b296aab46dbd0d7336ac88e50a8274dd5a227635b585d31a0733ffe2057c07c200b964c1bca0a63c793094621216447b62462186ea3534500d23d7b8fcbe56fdcb5a8e22486ceb3e62b9e68952846eec38b0971ec951954f28452f406bf260528914f82a7b05ba8737c46331611597218df81e21e78428fc58da592f9dbec3fde5615a8b66223b76ed24b78d30000009004a7b293f9b9a54735caa22d4e730822f32a72ac3114072e275dd2aa3e10e71c8d89fc3d41c10b7558d78d793332586cba01ab7c771759ba407af43201460f11fd189b726113f86bb9c4908556e7968d2ddad4cc3a1234106629acc17c9f1fbb47920d12b6260e26f59332ad056c925f23cb2eecd2773358dd743d732f11a094bf601aac5fe92730befd8d4b017fe1eb000001bc0000009050ca80f334bbc31242863e214c23ab508ba9f4b2f4c6c318ce7f7cd303e34aceaa8e543831819cb1575987598d38b426834612ea5d161657539e1ad5ace79ad7acc9622166d5a67941eb206c025b0f272f9967d93c2e40396574d8603c73304bf7433d34536dfbb635f08df960e394f8131d2b030dea5b231f632513433ec71743c5e0c9a837197924c84cf3e0042f6e000000903e6b7ccb8fb9aee6edaecd83fd6a465f54a9f561199d250c36097a23c74c46c22bac99e6ab6d80fda580c6d9c4a42199882b3a4819b2907f18cd651afc0131e780861448ae81e90c4f92d6c0957395fa0586e104bdcc8fde67272abbf2fbb93a14609d947bcf55f89cc334fe91c6aa6d2589c6d4ec464c2287021fc6b7b8ff630688c8a2d0373c2587ed1b2e3909883000000090d2c093b2f85d296e8671bbc3f6f5391f045b26835609469fd6a83a589bfa2687d79d63e602d211d6a8124d55b55bee99099153428b6d511ff66b37f3b3ee2d15ef9a80cd706fada648a7d1d937c36bbd2879b1913d2d6db30feaf51a63bf177c92a795a848069bbc68daf69319b60a540b37419303e5c8d3cf7975b903de8af1ab3dd703d8346e7ac301fa14c3e68f3b00000e00000001bc000000907ff933d189f81ea3642beee9b48974e68e9e69542a09eebc48b9a4be59fc6fc87a75474afe61162e15b85c0b3a03a564070ea4503cdc512fe86696d40224b5edf6b8b3de24737d5e7b35cf5fe8f0c96c0c6c3ae41877e8c0e1eef6f00d3475ed9ce518b73c3e91279bfb7e57b8c995442551cda3d4ab1e89d4f3c6ada8086ac7904cc2150c135f39b897c5a82b70339f0000009007928174e367b1a7cde51eaee56a0dbd0e65af2e74364e419a7d2b371a3eca01e83b6b2f7ca72fa58de8ed0c1c726cdce8311e9c4866cfe27e6ee7edea2284c1c0ddae1cd9f7a3f353d8b8167cfc9d2c2af85275570b040992db2aa3300b2b3071bd479cb815f3e0d6993506f853971d12f2a9ea933931b1664ee07d80c28a624ac667e95102856051f6579f45009fcd000000905fa9a3caafbedb2619e3affc97847a4a080591b04e2cb361f7f2e55a7f1295940ee6f7b6dc1132f7bfc4805c3abb05766bcc9c8f35db538338fd68e4a3020dc785d4337e2f8370731f293e97863207be11243ae71cae03139efa9e54d811dc21403bf9b52f0887fd95b30e615b85fb21007c03a84c093f0517d973a119e1619e7caec744579ba37f16602079745f4753000001bc00000090987a25b73f65f2ffb8491c4601ca2ca3304de1fac189aec1aa22e53f06c4b325d17e1cad996a33a0ddbb512a5e9529ae65a2d7a94c349113bb530728d589f37a1734f9895db9edbb4e507af3f6faa6c02247fa80098f678f699fe4a4b43ec18dc67a90fa3f974a9558a24665d7a8d8af1b719b78a52593fa1f42a60722695eed537deacf71f4e4f2613d391b473a24e7000000902486518492ca3d9af84919350632ae15ea3acc2e403b1d03598d2c41c7f3f49c7c1b4cd39a6f4b5bb2650348bfa507067094fa53ab6ee3cfe966cfdb7f8286e3a2c4c54bc0ed379c2509da262eecf1e42e60c8e6b78f6f6ff676cd1bcbc4779f4ba311444db1ff73328425081350f8c9265e22695d968daf3961d4460e192cf7e0dfd4ecb35987f26f15ddf384e9786f00000090a035e12deee24a5e08a2495866543f5d3e69aa4dbe1833e5f03d4e31325cc98f2203c077dcce09b9c4bf4c773e537169c0b6c98ca9f72d0f4cf9bd31f474acbf85aff1adbd726e06cb8ecf50764cb02921496a96f309573f72da144935092109f981ab64fe93baf54e26c3a965f3ab8c1251dd4be4dec9fadc08bce3cba9fb05f437e2149251cf69e5ba957333249a42000001bc000000906e96280f3810327378590f7e808274f9e3500a837aca9675d825305bce9b99f1a554c9a06ca60c373d827a468865a127d26eb16286e67959d066c892e4dc7fc367ee7298efe9b66990dc8ceb62f4c126214606c6e4eb48a3c1b4b60461f04382b583553c15c31a82814d751d3d84762418e51f1276e63e174eecebd3356a6a24c22ab536f8dc0c0c119d384c8547f17500000090158506ef9a1b0e59c798120e3fd2aaf1fb0fa649c222d9dafb90126823897979902670747dcf04fc6c23a46c76893f2c27426daeb5cd749f2588738192f84ad5ba20336682d83b768c95e17a5556f2c106b0b8a13199d07892072b6ff24437e74578252bb37121b9051e0ea551efc0b51d1d6b26dfba5600d91aeaffeed73fa2e9ee594fd2cb7047aa4d2d03779152c200000090be71589c5a47bb2106bb583414f6c299d5334de49e1cda93e4cf7aba43b086e1452202f154f198ed55b740b8c6c147ff20da82092899ef2f5aac0b1903808a72c437b275b272080f6a56d0bad9bad3b007edcc2c7789331b9dea6d42cc66ccfab47957c65a53147222b1a679f97856fd224bf31878d31d399b7f807405ff21bad369183fd43539a96dedf0bb039b1637000001bc000000905feaefb78dad13f506904a0a8ddfcde668ce2b96c854e90217fbbe08c52b40a69000d08df2be4d438d0abfa5dea2f92e248549f578c32513cf9a5585c931b70693f201544a2ece54ad15fcba157c16bc02ef6b9bc6d71d434b8e392ae8daa464716b56d0054910d56d8befe80cf6ec4f03b982348f197a68fde937b72bcfaeb6feb679647050fac1c457f1a21525114e000000902f105a0598720611323092571c024ec366dc188231287d98cfc8733689b76c2e0b9ac5b0d9a1f06b14a04b6521db798faebb482ac475fd05515900cb706dd52fccf94e48e6f4c047ca1fa4b1a76ca2450554cf084201b58d05396ebb16d2a727b488cf4ddf54adda4fc2d77bd8e8ce1e1f4189dc56924b2474a9f07b677ae53bee5132e03507a3915493d103818d8cc6000000903f23b02b0b2c344563356dedab9a1822bbaa38472671f66aa32eb96ebc7acc0d9bbac392717301706db1ae2cee765b7a4c6b4bd4f483f2e793c04a91c032a490959f1055389b6e0de568be6749a355432d80e888df790c9758ad4d31944b5283c51f6c9674c637af6a1d668000c91add058df99de856af3dc222de6a7235c1558c904e6ab43eabfacdb5e899ef3083d4000001bc0000009042d66efc1999d9cc3a74958ebeeb00616575c07339a9b85ee9ac70807e2c26f57affd7c8b975b17746a53f38b7291fc0e70ea60b87030aecf9fbc56f69d7e16709a7b0573f241fc0a381b1289d19e9eb08befc4bd29a5c80abc3789ab4965198acf9cd2d316eec45341c852626d39826245909e10a630a5409db99b1b723784a9384c71439590afe2962438264d5bdbc00000090795f8aae2dee0f7bfd1745eb31ae1eb4a51e707ac4e9d94140982969b9d87f3fd708577d7e1432841eed2000242ba67b5e1be6f8c749fd30785982548a8f7a3b96d50175a0f621d0427f4949673736d2012cfcee5067706942f7731994c88fa108a100bf9bea62afc32dfbb40740de802823d98f4fa9d665bf042fa79949618d06c6dc2151f0b6d240ad112107086743000000909f6e5df2028a34951931c049d19597ea2889d835811dd4dcc2886c68679358252fb69433796aa7c29c2948faf8fad1a2d41000f21888005ad4455d7ffe096f9b6d547f99e7c98a2f48f708045ec341342c0f7be6683b92f84480220acaa5bbd233e38ae3e6c4dbfa3d68f0b3dc534c4d1b3d4dce8e9e49caf5d32332043761859db4de6554bd05994282f209e1547c35000001bc000000903f5fc4779ae15b6e4e71bc5fd54a3bd1cc02c0a6bc36fe912017d61af548dcab6856747cd9a95cca8c74f7ddeafacefd7fad8bd40175718b52e50bdffe03c9ade10eeff3951530318127a035b5c254861352a0d60bf8eef77a140c80e2bfd6d52c2c4fd3aca155b8d7b7c9c2c94a494313d812fb44147d114900388a0f453f393a7acf67f8b2147a11cae5e3a76cb22900000090e6a39320687fbb56c5535f28e5191e44fc59eca93af556579b80b8afb40b074d0d6106ac199fc63738eb9e96c88ccb4e6767b5fd38a84f2beed8ffdd55dc4f57aba138771993667a37c2077c47718fd605e755dec6336bf599c1b293fdc517946add0f7b491b95e50ddb417a111d70a800f32c920dd2bdfd9b49a93b1bfa839af68068cdd7e79c823125afc0771b45ce00000090124fdcd9c9ecd351686468b9553806189382da42ddd3b9f9a5c60e57a3a61eee8238e5fe72fdf1b2cf5dadadda519f9b718e4e8630b7556969ee4561365d02287252117d9dac2a534de6890b0b8986d517d8483a2cd815ad35952532d2cd0b96518b05a90464cdd86481533d4396a4ed1780df72d871c6c60006be9f461ff8e072eb88e21826eb57d95c35adf012b193000001bc000000903dc8b81c61e31e46df07e46f78f0692c46810fa584ce4a5b052ece068582a9e2d6b79a38a053988a91b3683f9b95759c253a403a0197f168453aa3bd6111b92b7b74bb832db54df1970a7c85bcdd0c0611e0427135ab6ad2f65dcb52ed33a8e4c4cda1466ad7e36b34cf7e6dcaad12352c8180d68bcaab93c2ac042ecb2090cdbfe09c14cdc35276498e109ac3fee1950000009057607ed1d961be7596f94585f1caf398aec447c13efe341f9efb5541667966a01ea7ae8f68b7c331deb863dbd5377e88afb701d53f27587d33a9d550bfa8a89bbf64491a6c75920e702fd40e1cdd7c62295212b7fabc6777d6398f10c2e26e84d9fce24d790e063b3c45ab10569f13ed1a50075f5eadabe86b9a20519a718d04c70444b1444577f9c66d611af2fe6900000000902fd59afae3531c091f0b1af527123c72a9a5866d71a539f4ec63a92c17f90c29e8e216cc6613ef7b2511a49b0ee30e5fe0e49c3e4cdd715aa1c61648edc0ea63879820bd31c8160b287c9bc45eb199fa0ee1405065bededcade7d7483faf26758d8ce230ecaeaf050106dc489fb3444921ddb4cb2ae5a99c67c5f47ee3146af7507cce360b312931ad00d5c9853c808e000001bc00000090339261e4bc115373cdd81aa97f634f5d7c6946f2e0c66173e0e92cef5271058be9398da5720a2990533dc29310644a1c9286e040cb2aba0c0bfbd9a9aa0dcdbaf3d4f983c1c117493a668dd0f8587d1529b6bf45ac12dfd898adba5c8a707187983bce68f26569352a64ca11fdc7c00a2f5704b437401fb50c93bb239f54c45a1a01020d6822ecdc52a2ae9b1ef0f19500000090c62ca5026fb3f06579914b1bd762c2f7d970dd4a0e1ca53a932bdaa2ada4669dbbe834f155ce915d5b5f9a95c4ff86dd38cf63d4655cb325a96652ce3239ae46d076d8a1e42ad65e1605868fab37c9e9271c4e1c60f1dc489ac1a6760a4d65ceb788d28ec9f9608f6b6b51b669ed7d7d05a68f00bc45edc3bbaafe8040eb003240d829a7ab5abd5c08b704a133c3da1300000090f6aabd420544a76d49845959ab8a7446907c856d36eca872fd03825af49ae1fd624980afbe6cbe8545c9b19f2fc902187053e898ef583863e23b8d75b28d53a589cdd8cbe0485d06ea5764af82c0b50b096d432d56165bdeeed573899ba5e2e54c531ab438fa3e04fab4dfe9c5f33b49029c1a800a3478d456a50d1a65ef205f067a50e14df920267a09da86d6b5a60f00000e00000001bc0000009081b533c19f9ea09698de206e7060910bc57dc8d813ba6c05697fb8e678a5400cc945c5730ddf55b66eb9b2af5d19ca0d2bc1b2cebd24f6d343be3df5124118f8cfd30ba83fe191b2a71580c520d9bcab07a662c630a3c38b094a24dff8edd325b941ffcfbbf5ab3b2a6fffb34e80a2c111e78d60dc5da2f56c5bd8aba5ff575fb54cf015b6c68249abeb3fe6f382054f000000902d9d872378e35007659a028b9932bfa562d5cc9497a290efac692f461e15ca15082e89da8fa4e61a5ed05cb04a05b634a29b8f400eb0141fdd527417db9abccf04983ac0cc3eaf54d54188c99b1acd002bd34173e0955a2070b01c4855c7d09487343c19814ff57d8f6db903b0455d8a1c30b0c4d89d0c25842c00b83c768ceef639a36dacb8e813496d8d74a7aac97a00000090b3645acab7284cbb76e855d65ce1a6409a976ef7eef84076ff3e9c81e082b68f6e30a2442cc432288ed3a8ccf1dd9c95063bbeb9de5bd2c4e0c9ce5a0c048b9df6149cd4b6183894c68189e2830cd82006351d570efb7f797b2d0a0b6f6121d6e4010499c0e923f04e469fb7036bc7152325297a743f2a24c0f38abf0e07675f39c3dff1e49558476ad776765336afdc000001bc000000904cfff83681a7a5873f438da49c480a564760923da235a88b18ec0f61dcd4dc60990b054436b66db9ed6368151c5da1a23c65f0f7f411896bb68946aed5c2abb6dbcdb199ec828dae21c34d70beae85101e4835377c3c25b12533a5b27bbf38a35047101ce00ab135f116f1927224c50712f959fef1a6c88c8d55cbe7a55008ed10747260e702f52b9a548305d4b8329000000090cc1c0fa87ad4d63cf26652627c40b5c54fed5804db179624bc6acd1ed64062e99e50275acf40f5f14f636bef91f5bd06d1b53c74f041e2858a1e6be62e32f872c9feae8657d19f0a5f0d61e28a7cf10a293d2f3d7669c1f6b9239f3e13660638daff0b8e8a1e3b31c1f36b55e4ff00741a54f7c156ad4e5308db482411f67e3e5493c930f2b9a41cbb857fa021421217000000903ee0b537aabcabffb5be55ea148e36d54845c4c184afc6b82a6be6514ea76c6bea77eec81579c5546880400b75134aa330ac5a6fcef933c3998b1ce6255e0dcac2a1d350d36a93c172c13185e0d387860b5de897da7483b22fc9dd4f2cc55eac643f08234737c20c67b2c58d3e208dc226cdb0fbdd90d3d00ce2373d450e7bd9b0296a2cbdd5c1dbf022b999f57ff094000001bc00000090524ca07fe30c8c4b5ca4f5c30b19b26f5d48a18abb3018c3972f1399d26a4920ae9cc13175fcb5585f9a3de7fc5b93111f91a81b7341480c5405af4fc19b186865383120286d32b59824eb6858671f3717a9ca67468b73035512e400896ba5c3da2836243fffdcf1abe906989708889223149110c40f0190231349a29ea1fd5cd90d21b968fbe0175d12ca2e91c7e31d00000090d2b61f4dc7005d290c3bb0e2e29320d8d4f78f35bbdb039a82e736fdf0ba077ec6b61aa79cb4f5da870ab4b09e9877ebfd034099cd674a85b9e3530911105e7993ef21bf6a8c589c710272200885e0c524a40802bcc072e6d43ddcb05f118b4b499104df714e2bb3f8568b16b54712102b65243a7aee8e410875ae13bd78e8746955261742dea8e086b419a16ea822670000009088c521d8b967b463a34b682d0d95113ed739324461bb8a24393bf3d1e34805e1bfbca641c585882c7e7b46905eb52b4588d6550ba0317f180495ef1e48e5e1e2f5c85dc42e88c076803d156a1f98819321e8d52a0b6be6a861494767c0489b704db84ec4d00a3d01466828a1e757ec200a5a0ebb0da0a9f13d4e2c519f1bcb03d1384274c82cae2e4e6e0accfe245edd000001bc00000090ad5652c5b40a2e0ade1c6726b6ac76cc768b00d45a9cc1ab4554afdb607301d0bc099db8723da2dc52734bc4927cd7b335233d27178a21b613dd59435fc801dc77958bfa25910b8063aa34448505d19d19933ca47318945bfa4d6c4f41369a30fe64be98673d558e567b90441c7a147f0c95e731667b7e1d7998ed3d953f22b291bc356abdcd73e7b9039b88b2d74a67000000904780b45ccf61c3de2220cf58ecbec5dcdb5a3a443fa0b7b37d702fd1b8aa8e48ea26ecd5dadd864592c64004cbaf9a2805f25689492d19ad823534a86c178ec191422bf60140fc122ca3d93463c5d6af06e98f63ddc257026763032f400e637b71dcbbe005dcefc29ac33162d028af0c2acc579b0a8c35caf3e249642006a1d68758eb5ea7a6d90fbcda5550d71e6bbe000000902489b951c1a9b520c4b7e5011fa47eb550ffdce7065ea6c13347fd4183fcb7931bb8edcf70fd8e8de3c587072c020cd93bfeecb8fd54cb0a0f8c4e1041bc3bbbda63d0497ff92c489b047e4f01e670cb277dc0c721f2831d00c27d75f5a2ddcedacd04286ef7519275a2042e992edbbb28ea02edb47f972e806a903d52a11fd79d9cc29f0887b9bdb1f4523283db6d55000001bc00000090f4ff9b70f9dee895ca55478330399090da2c9bc277ad4dd105de8ee9609028d4c74239fcbb7e86a35c06e6fe42470da1d53effa1e4c0d7f39710fa119494f6e649d49e2979bc3be19d615c9a953ef4b127a887fc9dab54f3f36cc232325652765cd7e18621b50ad412400adafceb328326fc36c3196efe68e522b61972990c5e8b95eba426282fabe0af94af7c06275900000090bd9fc82eeeace4532ee7da395f58e3deaddfe3deb5e72b092fab45e7626ec3ba338b93e1583061cb06db482585b5469394466f1144af00b45ada25286e855befdd67d455ff4e335492b0b2a5ff6cd8d3259245cc0377625dd5e2e72f504204885816b9c84726056eed1cf72c70634a202937b608a634aeeb05bd136bd9ac24122d8dd3d100b88a1c1d1604350423413400000090f80b9f9afdf659211cab55dcc889930e2305e6f90089afd3d6ec0b7c579f5943fa68c8be02ad5ed2f6a464e6e83f86176337ba8dc214d0b78720901d7695f77f2c1dc82d3829f4e8a89af6fe6a0678c320bcd0b21480178e196081f5f6e3ac2fcb59b26dcf0f4ddbf97cdf9e037e235f1806db8666164caecd51adc6bb7909dd8a1b9e1b3dbfe80f92160f877d185505000001bc00000090ec8da01e88882da9805de3c48de5120f670f68cd634ce5a94ba8ff7706d5457e624c85363657d934a4c129aca182ad9d0ae52f3afc8b9621a2665ba1c1265280d185e9abf182086840e1a405ff3055a70e5df2685d17ec0a168af1f16c90a492a241cb7bfc1276c0856d43e8c38c8c4714928b2ea1beb7cba5f50e67f098fc79dae0eca3a309d824110502b53c146cdc0000009054191925f54c1cb204dd477d4af343a48dbe94262b52f10385866c5328ebae400f18c388b729cff56611ac089091d8206ce3661090832cb66f2af785d014509eba20318d49530be6b830681adbc5b79d0900bf101900f0fabbb597f5da57b818749748314bde8e747fcfd31d70b582d20cc942e31e78b4c565ea5acb9f955133d3a62b5bd24c8d04d635a5aef01bc1180000009000db8c48c3d6c782f324829aac6a809e6445a3b95bfb78f00b8731a237f3e3df79a97bca9dcd93920695b9d2f79860fe42103c2309e090123f15fd626817f554bb3cd4490fe27a01518ab3f9952c5f53296beb7bfe849c319322d0973c865c0fdaf4da5313676d1579c89cbc9e2c4efd1ff5feda6ea27765bca2f756b2bcf325d803056c0b1f569d1a8345f0efa03ef8000001bc00000090e05f7f135fbdf5012d8bed12d4603035f483381bd7ea8d59fb56601b2780e82a98163fe27a804647bf6155bc4e52ea317683b996c31b3c9541abfc935232f9966c9e87c45e75143235c7a8ac69c4366c0f9af16f9efed127442d0e36b5ec1f6eadc2052a1a99fbab79b5fa6e48082c5d091a5f81b7d8541c46bbffaa596c23f3f4daedb33fee367b30f20c027bf7973900000090c75f59b067f17eab4f3b2707b7cb0e3b5434055cd2e7c69d062a45e6bf538b130276f40c54b86bddf16009062c6abde9e796be6311d599df6ce74e37c0c4c75018064532454c43f4f2fe44e41a827a67022434c5dee8b33f66dfea2b57602e7efd47dd73ac2b620ac8059e04c953ba111c014ae2bf8bbc25c954c938819506a534e2989b46d54a12e3bddb3132851a8400000090a276c465f3f517c61b4445494fcaefcd37520602b8e96adffd9275f4343eaab23d88ab0f2ad91b55617c695f327f92bb0296abfafa615958f373447432dc6bee8e383575a942b13de82d1efcebd16d792cb6bdf6050605ebbb7bfea70ad7c64325fc23bd75431fa8dc1b15df3ddff11a09559a9501f97227e77662fd0bb22bfe0d11bf44c6b28324f2b2eb6c267c4604000001bc000000907131a50ebca59ba304aca4fa044f4ba68ad8b80735a8fae6d5f1c922132b5a5c3730c328430149c093ed9f0b7c5969039e1adaa5a52d4e846a745b98f06697c36d51670c9001f50f6c32bfd2960ce0612df65bec6fc910bca5289826210a89b272f598ce3c9ed0530bb5194886ac810d1a6a432785d9f1395750126d0757b29b97461ba3b6bc46285e6504c98541b3660000009014f5e80a2555343a6b38f0606cfc887234564ee752c0abc4f508033fd1665cf10579390a34274c3bdad1fae0a5311f90b99da9ab14507d5f7a1d59cc41a5e5a0d0eb2601c7be1985ef8cdc6d3f2a31732c35d8bba3dd0d7ad16c80ff5b4e8bdb65e274878db40dca8649bd2bf0fe228f17ccc37ec3fc4d6a7ea8121a5861fb14edc4b308adb596dd2aff387da9c650cb00000090c6ff4b5e2431741d17f592fa5d1840cd9700e6bb8696c740c45f34f9aa293f5df8ce4d4c9b8c14975bc056fe4f57cead64cec71b6b8b0ee3b62e9a0f8cc6ec476923eb9e584eee25453ce8f10978f35b064f182025a119f88c46bb469ec385227db0300147333e6de994629fa7de26b8105f0ebeb088f2f6a5bb203d203aa527d42d0224ec9b2d46d0a8b35abd1ffaa7000033a000000ce40000012800000090c71d679925070d32c995da2681eef595e6f53e550027843489d1b0440309a69d14b229674c481b0b9e84abc2c60ec7b837c0342204eeb41512539e059c3449f38cb6e9c86aee38a28b1473573d1dcac622672420ed9e15917b10cdc7b17d38622f211054006f989079d0b0043705e3d727ca9f0d428f68a0a107c2e1915460749edc84eb3b31ee811e34adff1cbfd6ac00000090038efdbdedc31f2aedd171630eef8cd0d244c3be6dd41d4b3ecf61c86175e645fc74affb1467beb8ea69638bc1341da593f9a0bd7e53fee9354992e16d0e6587455b9487e0ae646c06d1944638c0e15c18f9bbf1b441c4d366f954032812d7ed91c672194567076732f8f9d81f8fa182190612331690e5c0545a0cd27a5c8f042642deeb56e37297fa3ccc1fea7f928100000128000000903d7982ec14d1c8358d52c6f6b8bcbafe013830e191a5ab39656154a777d45fd91aa4ae6cfd91707e5933d89518faee66155aeb4ed726bb55dcf3b40b644d53a973088ab3cfe476844a015627a5b09a5a0fbde609dad6b5538f58f50fc75c43208236a3c4ce506254f2b01fda3b15252b2fb6c6247902f0cdd40c0e034e2d36ad9c6d22589a8ad4d5a6ac22f291722cab000000900fc5444a190c9c87ae83bcb9ec3baf6dc141530d84976ab1f4451b4e0453e377e546dfff5d61057b6e57a813160a607f8c1d19aa876143fa103c69cc146c57ab896540a59e7e5978a5d33d8459ffe32c1fdc4b9a9ceeb1252b595ce973b876db1d490f2def2cd7990743e8ccec7e85651d3d222d8aaac525d63967d4a006b7992200b19161f3dc590a910f1474e70ad10000012800000090ab379b57322f587efa10dedb047bd354a431c60b74c36ed74561f0b5819690f528005216797f9cc7246b77a8aee294beb4b083bda3b83fc096590e068f04561fb3fb1f38fa25cafe933f0b3aaff547b21680fd97f4baac392cc59d1a27e71e1b22a44ec231428680618f68d8268be4fb1792c61754e1d2f021698e203c6628a4c638022fc53bcf0bda5fc667a85e624a0000009045a2fa32a7e00ccaa3cdc333d013a35d34e770390db631493aa0f21aa4512e7c123673d469cca0a4ee651b5e84998299fefbb3ecb360e7fa9d3146f7b2d52591f3b11621f39714f4398f75fc7e5b52a62375dd3b9b947ba60426803764fce43970ca4be6217ce5f4ed7389f4e48b72bc0b5516972a0e4771ec103a10d2bbd3152766b278b20d9af01e4353121f30ffc800000128000000908c5686279bb6fe6cc423939eff72183ff10ad85e28ce99f28a722711b9c0b504af55d4afd50ac935ba78793d4f70d061ffe1ada2ea223e630abe7491f547a1914e66a1ee06df7082d4c172abb8c882b21810a5d7124638ee6dc2caf8fc7222c82573e56d34d6687fb2186ed80ebdc4831ea7d86fde094f306539288c8be66b300442b49a59aab66ff5b736ec9a9a4f8c00000090498b2268c9ed61ce6bd4e8c4ef65df0a888902e8b6ca111f9e8d6688c86024d5502332d39f4bbea07e64a308a0378aee61e9bc2cfdf2ab3230e2189d1b835de9d5b150cc914393ac43b7dc7ff56745912a53d2cb6c88c3fcbf6707a485a1852935e80dec3cf0dea9f4eeb75e697f298907fc5f8636796e3d94bdf4b52fe9fc5f07b0f0a17d3f82beae12d6a2222f0e56000001280000009072a82eb0812ef2f320ba109534879244dffc7bd02fe1b78eda49a3a48ecfe03a93bdd580cc2efaa04ce8ba355d1581e8b9afe08409fbef91728a1053b5ee2236ff583ba3ee585b16fa574f9ebe6fcae7179f61f5b79931f1639ed43861f5b4a33a7c41cf2fa55c520f9358f45db7f90f1eb61866514ec833f9b0768acc8af7edecdd4f93992d70da975dff2754b7f19200000090d82046d30f688030a2860b4bc7be5a704d44673d9d6c508532d6d098cb140202a91e9880fbab548f0f87bf0f4b4df23b3a501a86e9fe6e82b896c2def96bd43d23335176e45904c77e0d78d5a8c6d97626c7f06e116d0ff1aab88106d53425ab3ff85999370c19d3dc5c0406864c74f40d102770a0d8d7b737850730d27da5f989cb23b8031e3582d418d36e1b3ab2720000012800000090450f3832122e3af03e91a318865a2b335dd34236459211475a6828a770663785a1e4eaf456f7bfea679561f461f464515d5975363b7ac762cb5b18684a58d4da94b43db18d70cdc0c50253b54463d271244af59856bd7a149fb51e1e5a6e4ce1a5c3a091acaf2f09cf8f406b37854275133242eb3c7f690cc85ca3eb51a84227cf11fd3fbc1b39f668a262f7135d6ed5000000903028f27724261e2750dce0089a8d5d86cc9168b0b1ab852261d6c09844a4a011d06f761c4d85a6c418bd71c2830d10d2510b73bcf31fc5a8002721444fe3d60e9fcb9e6da66a9d079fa57027769ed47f1cc46f59e1b9b3cfda12fa6176db2e1aba945452c4f0c47bdd1070db102802fc2f5d302852c0966d518085c89a4bcdb4f1f487b377875f6161b488b3b128f1650000012800000090c3ced23e895c7656573b5df10d3646ebca00ca93e876938a0f8e1fefd50db2d78313c4cc2fa49cd92335279ab6c501fe301d108dc6c157b8d96f0e1b6ce376dbe7de4406cf1e89631e22fd33a3b7ab1b0fab3434ba1b41db25d020027e28de7e4b00e3f31b58cf00249d56e3561ce9f024ecfe4b4f7029947569976a107c45c96402b762db2edd691bdd2e0f86c4a8930000009015474eec2eba6d58caed4ca78cf4e443e3b503deab75fe074740e9be70d68af21e1aeb2e66850a131b41a942463b1c7dd55206d0b806e91b9fc981da435b9388cc2191cd952d2db93cbadd98866ae79504c935649b6cffd6da114c067aa75c240b93b2bcb23381c62c60b2868b2a13ec1d1f2611d49506039c360a0055cb51a8aaf39449ca6ddc7d63f68aa9d92195770000012800000090865d87f1e469f41b5c31ed1e616c2a0674645917dffd61e065f9fc5e73e13a7f456c2f646b9be714de0e030f604da073b9505ce841e671c1d17ed04d46e5565015a2c3ec2729af33490721c850e3cb950bd68d278d322cac9c489770957d94705252b455022e22890eb6a7056f39d1f82eef60354bfe05cf68306fab8d59ff6cf0ab2c080401864e1a0aebbd7aaee0fd00000090d61da29674c311d4f823a6b2b097b703c0d3bc76b832b2f5d3592c6a71e7316df5085d7826fc108febc8763e004b639374380b4e15a6d483ffcf9655d16c1a4a0dbc48e45573c394ad50b97e77e8bec90ab5d3423a539e719906398fc33bcf6ca0d937297c69bd563a41cdce943732312e6f97104340fafaa6a85fae36a5ae80b81190f3798d8e9bf8bc71491863ecd40000012800000090ffb7ff7af5bc41ea36f85244d1a700a2828ed17f8159cef205d7f605c2a2b563dfdec4b8daaf2d4bfcbcccbdf7a216e61df86acf665e8dc075ee708962cd60c69bb463316ab697783734348c4ad00c5f16a8ac58d2715034eba5af99c4b67fa7781ee27405331dd58c90428352b595dc1c46a6e1f277c2f39668ca628701dc3835c3858df17edff389ea3aa65dd30dd4000000909fb2bade83a464bb1c67b00819d59e2a5b9d41d92bc7ff8fa82c695bee6d5d4339e15ba0c655ec17d28f08a7ea91300bcb4b2cbf78a7ce01464f64a440fa89b7ec80003aafbef4f5992c207448a33cdf09b5ff6a9c69c500b013d12d117bbbd23752a082e5460bd74fe7f4ed1004dc0300bc502c819b127979675a3cb875ffcaece9468836d01abb957059ddf8aa56bc0000012800000090722de9d67d167ffe6df805fba007296a18eca2e2de7a407a7b4cfd4d92713d2ea6dc700dd8f7094c8ba5241d56b5cdecbe6c32a89d1bc666e65f96a4d37144af333928895f8b055dffef4a51bfadd2042c71790d7d76a869015ddda3a4b2027e784690dcf3a0ff6ff60d4f97283a926f03a65cb73f6516dcee170e66adbc7d3274fd50f853e499e5fc1bfa44ada90b6700000090404bdb971cfd878a67852e6664e6f53ce6f6deffdef0607050892ae0b59e7d08ac7603364f47d0dfe2ffda9dd73fadce4c9246cf68d001ed163e08940f979f5c1bf412b6d9795386da60a95185cb20ff2355150975b1a25646c74c1303ebb7775ba620d70e09aaae7f97cb7b6da8f0991853f44135f3cdb67dbf75e349ea2cbf06407f804848090fc832d7c1d7e7c7f6000001280000009007b0677b6d2eabed2ec0e09f127d60d715c2ab741c384278c1f2bbd598ccf8d22e246e8852131aa94de590c0cfabee6629db631f44b5509ada661ac07987092591d59afd84b45f97e1084d87ff6145fe08881d6b651207b9c6a106aa102f66f08cf864b77f17a7b0dec92b6d116734400027074be9638080c8df12cb3aa2aed032065d0f183bbe14b94d5c4729ca347c00000090efa094e21b696a986eac21a4d86999f263b506bb4ecd2cb7a4b82a061bec6bf631f52ff6f33bd20ff552761f1333977b4b2dabfa0bc42dcd78921f087c0fe6781761b338a30ae624899c60fd69da6fa402c085e1d3de548a08c26702ca97de22d430597df903ec8c9205b3822ae395bd14eb9911c0d701ecb994b25bcd98ff9947acc66470c48b15e884aaee4632d86f00000ce4000001280000009063f77aa908b88e3af656373781fb1f7d004b3b2d44cc7b9d19af6db5389f0bfda548770c4adea33ddf8eef774b8cde6b8a7a9a041a86ed15408e108dd5bcd92e1aa2663e4a4d2d7a1aebc0f19aac1f9a0db16679dc2f2cbd378fa2918cd9a36e74bd7b341102326ae62301cdca306131194cfff96dfcb1d53e2c71cb117044cbc09bee6385fa06de2887359a23ec732d000000905623e40fdeb53b03b938ad694b8f785f108a308c20bbb3d829d8a5a7a2a51eddd2be4cb6ac50ebe5f4af9018ed5b8ae00de2a29564bf8fff18603bb289014e39ffccab4126d8b7443c2a764f33c3f9b708fb490f14c065b1dc4f24ca9725ab9a091180de66ce9f65979a81f97523b57f1956b60c989c44138d57b8ec8d3ae12a3a15f5cf0d81607f176da730c27281d10000012800000090ff9f267fe556e160594fc2a5a815c041f2c47c5d827303f7035f9abe7bb8bbbf3d234753a43861321deeb26e1bec2ba4b2f5595c8d3635ad231309784b97616a9324195c31201c6481c2104acc39af8a0a476143a197281d042a696299d4f714360c6c20076e83f441ce7ea6afa9447c15d5cbf43c54a9ff1b3d516e2cd3cfe9de5ce1998bbebfee61cff88c41cb5d5600000090948b7f4dbaf6f2831f75658a6c820c80c0847bd526d9f436dfcafa1afd370280773ba8294542e731c93069ebe5cbf1d6195f7e213c517ba069cfa7d59324f40f745efcb95cdaf858a91b244b0f1f4b84081fc967b62e7142a9d195a9559b2ab599a3099a7e125eef3eba3315a67ce5300f6c54300868c4d7190ea9130d9361696d0bd0dba43d0834e4864e3b7d57f5650000012800000090297bb554da0bdda1d83e89ac27a54b48ee1790c00219cfaa0167c77a34af87fb3fc8fc0d80d89117fe62230de3a72833ee8938d5a0eff8048662b5e45f1e57470a35614563ab65e2857414b634a07a2021a42ba345d06f798efc219b2824d07b8978892adda8b49806b449ad7c3fdbd61131bf968ba49e7e8f1eee5a7dd64f59bb2bf6cc5fbd7817024bc4709c5c159b00000090b7bbf78d1f57fd321952af5f09fc41efae936cddaa198b5f1f71e21d78cb5bd1b563471a0271bed0af52ec5060153bc033920c8c88bcf699fc6e62a5424fbc67ecdbb54f36cefcefb7ef75066f2e71481a9844cb22b4441895f7424e69327fec159373879d5c6b195b7ea352194e555011775c3ed96693bfcf1ad3eacfeef7e5ebc5a57365737bf930fd0a447aebd0bc0000012800000090c24593fe8b57a02d3470403d06b5bb619d6f0d14dc9a4c873ffe1bdd4dc1ca608e3bd4dcfb515ca69ec8e1ba6d0650eea0ad9b8ab7835c0a606ed9afecdb08cc7d1b5fb6dae4d4984bd749708e164ff429a02a143d35f99212f5ea89d1442bce93fe3d0573c30d8a62a078bae1c407621006c8b133c5b40f4451bcfcdf8192575ee5fe38f278b537d7bf5c13d3c28b99000000905a6a50f82ffa27feca446c6cb59193af6377415e82265c4d28f1f3e7215c8ae85d7330a25d7fdeb577846ba17585ad7f1b14980ff7f6762f545903842a61f6c95d1d34eb16933e8a832cc506b82f8c4404f300adfca46f0f5e08fbd0b99e18b908f19a63fb6d6f98e9fdac26aee27e7c2b0ab15de3aa62fdd415c7231a54279ef5d7cf9e405e6d1ec090f98b59a666520000012800000090793a9cd754e8f7f460b4bf5d8dde22a6993914b7cd1389eb80c927cafc5e6272d5c90b1e3170e7569de4849d183fca9007cf8b178839597f8e48d13d0e1106a56e2e69bab949edea1153a6ec3970db0c0acd29b06582e4b2e1ed2de1cf4c32752a105dddfd0095c5214b684041be5add01499cad24b94ca1ec7d78ef349051cb33307f475281d1598a86a30070a9a64200000090e14f958c3020249654374a1f3111adb7173e844f84161f5b7274baf685e12d52901f415ad5c37a1350d05f58b131375afa7e9ed6d57e4ff2dd1945069cf85e1061d4f601a8fe9541f07da351f5d212750e70edd753036e02e2a1278791523aab1f7a7237bc0e4fd798751bf940b2e02805bbb1737c9af7ebc1d5cc99e012ee2cf15e67b3c89884a832ed38ecc4822bb700000128000000902e7d5e82048343981a2bb3cd56f7377ba5bab3d4918205007497e5a2d35f849b16a2572485f42dc4380cb5e1d3eff4e1e30e02a93faab6cd338138ab142f976ec3d8f477c264ca58466d109bbc3856120e954bf2ea346ab0ba5d0c8a9abf7224204ddca8ec5cfeab4ebecb06ef6e8d8909a7d2a9ac183d3c0ea5668d011e9f443ba88e160c90b7e795e015c87105dbf500000090503c75ac6e1f0725f302316b715daaf080b3014d4b19d4113a0377e1190f27e3a589fbc8084de9b03e5e6dbc565441b42484451d8630d628861f6d0fd0c53f9f10e393335ec07594d7910181c90ed6810044f9ae40fb83e41486a2bc6d588f26bd6af302cd368a227dd511bf412544302d2cef03fa3d06b920e9532a50faeef82b6fc3f6fc8321d6375c5f8e44d41fad0000012800000090485f789e23a539a0a2f374697ddd900acfb0f301c991c436bb294e707fb652674006d89052d59d1b9b0ab424f3916cab852056037212d7c7c4f5039f98ddc5aee5926e103cd9df9eb5c061f9603a3300061b67f709c3088e16037fdf0c1174646910e2b6aae3f820494dcdce1cd881662ff7ebca23a35290a2c8dca50bad64c50cda5bdb531dec39e95a3892f835d2e9000000903927209a4951422c3bf52a29ff18d371151bf6be55fc40234ff661b46474cd7153c150d8f96de3f2e04347f2a25ff734c1c60b8d256db004f802700e822a4c4ca19bf6190807e29ff4a895706575462607aa4353a32d228d0ee50c8bb9db027eb833502cbd3207c66a67baeeb39a1b1028ad263f50ddc533cec2c9c85f606e62ea031f055efc15ac484eca930de220160000012800000090eb5c73405aedadbe78ca133680e036939f63af7bac31b94e87461e1b6a86a47d1f0ce79f09884a23a47773476f46640363ee2ace60205d246f415847a03ffec4ebe4665d8e5129f99b77b507e16ca7992673b99d6c89ae4f9565ce47c31835f3cd823f7479a417c24cef96cf99a4165e2d2a52862400ed61e097e5eecd4878cf0eb5b45b82c3d99743a298cabef51b1c000000908a8daf200a00bb31c60fa406ff9e058563793780b33cec32ca6f5d9d2f88581961c0119617997f0db7537cecb603f4e70064043c9d9da6e7b9c46c69d654a1f3d5988dd903e369e688cea1a7f4b7d09f1f46d73bfc23ffbf13d7833502a10a196f54a77016466ebbc504e64b597a139414c0550fba5a4641fce3b83d527d2d86334fa8418b68afbe5ffc6a343505dae300000128000000905d63fcd881456911188f19939a8495e6c78549700faf7a3a6458fd88ef6ce5f77ff22c2dac5f556d52a2fbd36f8a94ed113fc3f8c8a66f868988bef2a00a562a0ccb64cf4a96b27de14a504973e5420c12894e1bd5b9a7b77453596039cc67506a884fe44b2b011d431d878bd32942171a24cc4bf57cbe41fe9327e0aed0d218e032787cfd245b0b403b35dc95c4df9800000090e375ca363df3929003d884321e970109cd9ad391b7c7c74a0aa32767d7602acd5ff235211adb7ecfcda2914559315265c90291243cecd396561ca7f2635863606b657c1a2238f93ebed0f6f8de081a940e6f2007508f12def94d326e615486e0ec209ebd78ed64bcd8c51f7e423b8e7f230ff1b81954c47b70495a1d74736ac12626e688a6d67e61a6f27e51eb6d38990000012800000090de88fd7e12d05566e5cfed1d05fc6013f02dc112aa74f0ac306304cf559236489cfc6dca53776dbdafc185ea395015f0aa8d1ef5f24487fb8f99edae72a72c4e5590e672f502cbdff996beba83dc56dc162bfa0e0a57c32ddc36195a081f9d42f11b1a0e0b09b34fd443b9040a1ee65424d9272ebf6544a7fe9a75b7efc79407cf28467c7b8256e199d2643492addfb800000090a3f440389d4a74107a9501da64a3b5dcf875d9ac8c82aaeb2768d34d3326cbcba65a96a1a3a6af19c99df344149ade6782d3eaff679f3b24bf91305d10827323f7dea256ce10f5ca79147f99e893f30027f7c9ef1f0358a18d10a2d87e98e79ec7061793ae4ca61634fc15903e7a00a509919be972938ad2aa5413b0855a701b4ff6187311d7a0ac8ed66e85f23833b10000012800000090ce588cdd25056e3b2f9201cb7dbe48ec9ab60b8469d2352a35049c31ea77f9af1069f9d9f215942159ab154a8b74e1c17009059b1b8674c341499ebedc27c90d9ae8d01c7d819695da6a58a61a540f8d1e9c57d341ecc20a7cef02f268e9b6746e645823195d47650e56d88f7656efac1c7031fd2e234ac838a8309d5e70a5b2b17a4f68342c597b58a9d64270a218d70000009054c41b052ead3566e398a11e68a8139f830c5701989c97ee2a698b7796fbbffe81ee971c2bcf7033a743f01cb192d281fa215ab5658b61d5585b6670ecc2ca2472ac1a4117afec0877f5d2cefa31f4931fd46db2a037b341e68e55fb8518361e0c238727d5ed761fee9cf09f307f351803a8dc48166f821c06900fbd405731a012e470772444571a005ddb019d0c05a300000ce400000128000000909897a994ba05f0486e038bb585e5571d9e127a6030d4435ccd58f38b0f50d3e5988bbf20f018e12fef961eebc20c8debb6b2099faaba17214128d774be4377705679bdeaf86b3680b88e255d862dd73f0f704e8010d711ee89301d25592d1d4c2aba8716264154c634cf9c850f6efeb204e9c44e005d3ff9244430333bc9c1a6ed21bff816948b334a72b6a924bc965e00000090a49c50055c86e10536b64b3f7e8471e2aec4000c158b54abf089f0223b5d8d999b3983b8e6d30863dddbdf41319d572c6d2f8c6908a2ee7f7d38c97541832e5c8f6434a3b9fbc69a5a16641a33c6d74e1a48c49fd577e345b7297c15a35e53def3cb55b8b93711d09b0eb97a80a065231c80c5b0adfc02cadf986d512f2b44775d696bf1d81db65ef12bb4b0333f9bf3000001280000009053deb49fbf158b5be94cd2a438f3413b0a1fdb10485fed3388745781d94194dfc38464f57970c5f6e52cdfaecaa60fefc35164bffeb909e7d9ea6dd31034fbaad36110d8f820f7dd1d9208aae6fb125d1fc927e159624750a037f41fd49a9d1d693c87debfc2dab1d2d4e94fa8b2c34828e0298fe92306aecfd0f2b5e250837fc8d4b0bb949493b75e138112504cc47900000090f3d83ed8705a04d934c3fefd11bf674a0cd0bb9a9756633791b1b666adb87e0f969c7d9ca9c53562217d047161c226ca8f1518badd719cc009133e9033789fc38db6b6e4aa362ff305a4ce3448e0e9bc24a2fc3189ffb1a0e60dfb6141c8092992b1e06c77fe8a411a061a8daa4b52a714d7e20b02ea6575319f99998a5f7d9c1b40259beaf99f9966c2f34d1be439180000012800000090c327096b3eec0a067bfc1c20a47502c9cfd269e3d9730b7f36a804d0164fec3c9cce56c6210d4143cc6768a58e1f0719dbd09744838559fbf7e716bd092753953bfc3a6b2738c515f7e7e027d031ff432606ba6ca0d2ef38eab336924eb792cf927e016f16c0cf891eafd612d5d9cfec135e5d68f88e994382cc6f400160cf1697d689899f45bb7e3a87bc95cd7eea690000009088e9e7deb8aa55e2981ee9adb7a44612bd7169d2def6d060b6ea1f0ad48caf91c75107333919ddacb0cd71577da15cbc882e21fe80118cdfa627a65dea7c382acec3556d07bad8628940fcf895dda6022dc658e582265c71baeeb0dce7a6ae003ab314f713e0c44823c005986ee0099a15fc512a02471af9e83fa7c7e95815d157abdfe8f8eadb591b3e1adbaa5307ce000001280000009081417056f6e040507a63bae32c2dcf546187aaedd0bf2dbeb1dbd5fe0a0706cc95eb5b753a80a899404daf16923bcda2d0676cf61e4771c1808681a1d8c032c455378c4800cc646bab5d8599a3c7a9841f496aa79516daabcaebb6f15c6e7dd2854bf294c5034dd2c063fa7914c99c3b277aabfdecca615167482f218045e805035b976c285c62c691eca4c8df9ea582000000904a525e70aed1a1aac3e69072a4c3b2671e6a938d455a9f58b3c558a73f50f7f2c5d6649db92acf5cadf941ace8cef6580b2ce3cef9f6fc2d3a8f7b3248eeb04ef8046479be8d8dc63e4e7f9ee35716991ed2d0e0ad40877b764d41395e225445da6e5397a05a5006f8c00ee3b153b58f12fd204c83aa3b83c0ba9b46e6d59ae28c41bedd59abb1bc926bc363cf79caee00000128000000909b037a37d4409a5181e52506747ec1bbb9036c881fd020d3bee2dcd612e68dc1fb0b298bd8aa7ed2cd5f882e9d3246c91fcf55db2070d09c33a6f1219a40e33c47dd91199468f261db47a9f64f210e2e06d88b209f6c3217730704780783505bb79e9c39ec94f3d1f7f0e6257054388f2745903be8aacc22b3e814b50890294a9d8a40b9dc0a3418c85dd2d80a8c6b7d00000090b580b02d3849d33e10ae774074f374461d60f1d6b339bd2d39db0d7c442c22a1af2737d0647c31ff6df4d49bcded921073dc9d229c35d6c87075284f97c3abadbb9d15b0f343ed024b8ce85e5aea6df21279cfaa7c940419e5cc233e0040a0b3a269c4484b31a71e693edb983ce8dcec256eb90fe2c4463bb3f3d450ec32ee3a59aa1b244b57425b9f5eeddb8290174100000128000000905a3a2128768d8d5f73d71a428196735890ea6eb04c881789d5332891a38abf48f243d01cfbc7cce5b149e1bdfba4818df5dbd0a38d7ce2c619408614dd6490e23876793d119818e657d3474b63359d6902db8605bb2346f2164170e8c6eb5372dbff0ff7533c242b23dec54006c5876226debfad08fad871275239cd84679a8e7732b869d3dd1d36b79ea163ff8569970000009091956926e8bf3bc6f6d231b113ebe86e0f5562bb20b83e4b7115b2905dce8444dc55b3fed9831313d578ebae075b7e76b9afc49b48e7d35c24f49b1077f1677d418f5e8de6722a552b556258da524cb00c703e3643fcdee02b1990a394d85da8627bdbd960200d2cff52bb2ee72dd4b41cec456f6190c76b0dc9987e8b578427effe223c07f71bfab7deaeae68ab37700000012800000090c96bafdbc9d729e2a3e41dfba1cf190807289c45bb1351ea9be682c35f72071651c61bed1d08e23d32718dbb7369f8502bf6a0939495b8805c2efa14d0e3c22db5668b1f3cdaccc3a288f5b33f24e74d2fd682578d0014e91b937555feeb8a84dab486a59a7431d628cbbb3d4102cedc009c2a51d9dc73993b322c6faecfefdba0c99bc43ccae92131249cfa5db070f400000090f316558939886b8972c81a331c9bb56e931929716b985bca2d2c01d2535f036f5bf00b8f7bc3b5ff62cf36fb7750792f51e7ff80cd9bdd74f07fafc07170fa1e76721d7d0c34b16edcca6f3c7dcac4691b2853151dff440a70e39c00b55f88a2b4578252fded76768a9b2dc103fad5b60e0e2ee332dfa6341526b959031511e6fe87c9d8b7e94cd864deaced0fe917780000012800000090f15673a8ac2b26b1ea8b0872dcdafaba0bd0cece2f72d76b8d2e2f2d0dcc0e0b72281c339f4d72c00f8c9f54a06697b1fca113961620727494fb50a9ba1fe014b4a86b3d687aededaa520bee1ccc9ddf211af150ce36dd15a72c7cfe44537630b149ab91f630ec838aaaa2f5766ad3e403b61b0af41c0264ebacdad6aa3ccaededfd921115a83086fc1adf24fb22c23100000090aab4fd8ad58bdf17957383860b25110bf237f1ee8426c453335747d9d80345dbeff22faeb160b1fff089aa148e2d364a657bcb86035413cc1b3a13295e35485daed937be9735af02727035f72fa717fe1cdac398541a9d556eebb38ec9676efa8bb4cdb18e20bd28b084644478ae97302d849ef7f47e11e150c6d4d45133cc46538d6cdfc3d10d73ae346307e93869920000012800000090243b45e22c08e2c67bd02ec3094e45372e43425ade05ec2cca9fc280b837dad7bbadae7ea3127d19186329f66cacb183fb8156d2d6ca130b42a2970dcf9cad7fe65523b3cd2ff108fe81b2e58387871911a747eed7afd7b4d2cc3d67a74b8bf970c2d0c1b78b459ca497d55e33b29abc059db6d287a067050c9a7592b893b7eee3312e672f2f29bd7dd906a61b8920000000009097886a623b7bb1f1cce68039b4a899e0e0b0a0451c35bd6be205c972155c12143311d4aebf3e2a9a0455e8bb3e9eb53a7b18784fe540d258730b17b3fc55714196288d0111ddd0910d87914462bad49815aae603595888bc000c5a21e6a11776bf1232a245888594db842a61b0dedb990978746a72f2cac732ce8d6a52c081ff771009067732eae2a3644d3ab44bdcea000001280000009044e0a4bd5e3a78f5f2161dac9d19b79236837160ff98b2d82407bac4bdd0475a85ca56d08edd50aa7cf146f006fec82aee7ae6cf8ad80d974adf6cc333c47d2809f515d3a6268f1f3f9fafff478a154913a9a5fba94787d68b1c90e2c689bfb89d7d76ddf3ba9503182cbdb6f4d9b0a7098f7cde67c54afbb616efb7e6aa62b98a6930bd3ba85e1ecfb0fe1405f569d00000009014db97e6099157f09d0e85ce50765b5fb344cb1fa282d46914157a587c697e8fcd0ff9eb71dd3fa8bca97f12951dfa0554b63907ffb6cada8cc3ba7de76268393cb4ac52e89fabeae2c0ac62ba535ee205e80d247286af16803ee652f2d659c86c649a85ed0b8db322d2071deabb5427224c195b68bd42d81001434d2a52461340201df50ed4184d2649f5b44aba5d4e000001280000009006f42b65816f716aaca8a064f3753982938baeec88e190b69727f4a37a9325812010d0df94d9e91487b8dc65273b0ce2017718658a0bde0257a800679bcf758a218c01f2a2111f1e061ca3eb8a953df02355b3ce1b3c92cbdd0b6393e2bb334d5ac66fc15dc53f6f6384a044fb84db771b93b2ad429ad5d2b133bb7cac88be6d4e2b65f0e9ae70af2d9b9e0b1d21d664000000903ad57810e82927f9e1ae20f1b7e95c26e0fe8d108fff5c352ad1cbd547d0413201075470ddcd2afc08920fa6db662db4f04b02596143a5178ff5981151727f649f1aae93f0b02e784a439abcf9be449c2035212828ef61bd5653efbb6ba88043e78d5a8c96e803936c3be5b0b8d757f31343db61141bc8d15023515cb7fe0450d77b5d5b9b962dac04b5d65123dff05700000ce40000012800000090769b7a95fe04e1f2143155e7ea60be905fc932a1f934e193004ffaf8801a57992349425de4379f9d18c7e4611287a96d34277310223e56b4f5b188130006345a8ef172ac777f7857eeb24ca7fa6a84d022c743e6da0e603bdc94b18f32273263955a733bf98a46e01bb6e56edb06ee0e2bf6e111610d01d28cd2d96ced7929852b871af1629bd70d6abb21db8a93a4ad00000090629d3e61e02ad7e72fd42528a18eb029f33e80a4d464d8963a8b27472ea6386b7ea7ad8122c4d478981fa75becf8211cec6e49543a0c6fc9c4a4728e0ebe656f4005b3b40ea8d9c38eae95198950197c012fce04008591db2be1e00b64183a0efd705dd568e0b1978b3e6f92d0cf54991f8a2fde3dfd508015ac7cc3161a98d9b09a333975f28f39dd86db5ca72e90d60000012800000090b7e11ba7480b5c973fcf207721a59e92e1fa71f0573ec486a3d1728d0782a2a7251fedca509f9506cc84313f5c3f3e4a6d0cb3eee0769a1e766285d6e386e7b90bbdb1b482504cb062bd33b4a46e44521cf3a4099423d1a193cb662f11f28d68381fc162c71a39878f32203c78ae3ae71e85253f1fcb46175e58adb856361a7893f17ce700af632d01f766f002322fff00000090a194629bee6e5297af2d4e81b9552497d96e41c40202bca01dec4fffcfcca19011eb3187e5d273022b4493dda188db20c92aaa7c3f040fbb5077f18cad5276253829979488d68d8b256f8e9dd5f13bc22d07de22053a539c84aef451ebeb66ff41091c59fe6ebc335591db149937d9852e3f5a07bd276a8f3364755c6fe88a6950d723e60b528ce8e3609353044c9037000001280000009041d5f38618d22c35005a4ccbb2e563c85e2b448d2201c688c561242e1f3180b20a70b6368ca6a04a6d6b7bc8af5bb27565922d1bb84f357ca84cd569732b487b050858315370c32fc772389ccd70bb0c1e59361c961d1fec593ffe37e528337819ab977161fff87867b7d817861efd23190240e0e5eb8f20390da04b933208db4cdf59dc6c95c96faf995afe69d6d4af000000901311278c2a29bf0a5ea49620300d70c2e70dc5e35cc2b197f1c0af322847f06c37ee9eda077ab4418bc7fe13e323e9d8863ab80fc84ec15a542c3de17964ad98e593640170a695ab01500422866148481db5414b9e9dc74808543d57b11b0d6c9ef18bd36a20ea3a3a4c295e5e6c61b80b0650c0294647be70a5ddc723d11990aabba34c7473de537f4b13815297c75d0000012800000090350eee08562667e68db2618c4f7e8909c769d2acef55084de48ab1aad2a9be0994930636de38bf302c1bf742744b9e4811e4c6b76dde69bc221458319dc3a82728ff2fc811552ab46879a1b42916f83704621abdb5d3f3725eb701a93b29a2bf46e494ea7ed050f5af474860dcc2f67c045afd17b39e0ed02fdecb7ee41beb93ad62ee812e1fefa53457508f92bcf86c000000908635c62dd4cb48672eba900690c4a2b4d9170059c626ac043447137abf472e308cdc51946b0c4800b800d2bbf8fa5ccd6b88e05d2d3e75fbfe528aa720cce1cf5f2fa3a08ed75ffa1b338760bfeaa1220e2491a9002eaa4a5adba74dc3d51e30030fc38a517d48f059e5cad099a71add28a655df3752f94c35102cf84371fb8c289d70c9e3c79d0923d96eef8fbe01c3000001280000009078944926723027a07938b0560fd9dd6a01161edb84a2b35deca972e341c0c2f99debdad57a4e9fd343dd01fa43b4e5270c4057f02674a7e2379c3676e866aa5d63e5cd6ac2eb45772fcb32c440adcf59266a24a74d703fe60f9f520e0e5544fb0a665ec5533a44c92ea9dabbbb20b977029c51e0fd9a744dc2e2e9e980f310ca042b2078a2e4b78f011e506c52a0968900000090b17e1c111f7d425285fdcfad0ec746cf7bc2f06ce732e74c2ea73c214c689685a34b7bed644015beed00a66d0996fb24c837b6cfbf39402a71fcb3f147b54a83902d349e2341c137af6e652a8be73df32e13ddfb927e204afa375e1411ed811734a59c4e3c84a38e8e266a71ed211d5c0e40ab4aab3821e42d8345fc11d7a24ea7417927b534bb8586e0727ce058089300000128000000906482e87c2faa9855ec501242a3f85a69c86db4f79e1629a57789ecfb57b731a1862630807e5dafeb40bb7114802f1d3ee7804a68e63ed05f968ff91f0ddf76a7c05d7bb28fd92abc18c0f2827187a01d2807cb0c5c8b000fe8ba06baa2dd2565ea295d90fc0f39f7e8d153c99063c034132e663cbea67d110d96f50cf195f8c0b121c21c2ec73f50e6c733031650767a00000090ff3c3a3650a88f58d5041d2a476ccbf9edc9260a2896e4e26a61780b40eab5afc563ffb21838d361fb21731a88d1a437ef9e99cc0a6746cda0766c7bf7846aa417741ef05e712fdda23c2a3a3f10fae108dd3267d80f270b10132d4566237fdc1cd4121258ed8f0098b4c628f5b26d410b7ccadb3d2b5d214201ce41ff79ab0f9c3743001cd55bb53e84d346d90f720e000001280000009089e091d396ab28517ccbdf40a45d02abc83c6a771310ee94385f14dabd50b3239fae674a98402d00ddd41a3139552a81fc6db334d02c87330d9c1f5747d1a5e6c5e566ac2093622d4afd551a96e740f80f30bc649c2e6f25db9cab1c4f53c2688ac6dba4e6d24219fc3fb3e96f22d79d017c16f68e4e15c1e9cc75ded884ae4b870bcca55904c7e4c85b902c48297f9500000090f6cf1a1091f1ff9ed45b86d475d81b47df21fee05708873bc11201c9ab6f8852cbcc8c0e7b0cdc53f1c832a1b277842b66282e57cd677c5b3816d4715de88701865f8b9c6a394a9345b2dde9b3707c141d9e14005c89c8004d3eaf70941aca0fa20d4b861312a665b20dd2ed53b9f6c80daab476d00c8716f32b5138bbaee3755b74b0c265877d7e88caa5bc99f5df0b0000012800000090ed3eafc128b6aa44fa604f4c074b08709a87cbe8b121b18be9179e2c735c4cc57486fc2e38848f45487ea318c5a6f369df389b4f8802023e322cc08ecda80cbdc0d6735416e8c74dd2629b1c9dac44ce23352337284d4430c8c3a91429a707af9f8d7ed80b918f1847577b1ecd2f3805235d4886c33d39070b6e0f0b12236e5548314530034782f86b3faadbd643ac370000009059b5f5ce278d3b179affcfe95c7f2247579ab3a96493c390dbb40ea7746dd9d885e0fe32a951a0c2bbfd4830cba8ffb67a04a5cbdbb75a3e03df77e4fd7b2b3eacbe7ee38b576e87d960ed5d8ac2ae622cb5cff0da9a10b7e48397ed99fd8e11141db00b06c76e83b1e45f7b241c723303e1bfd9cc8d8c3e38b01f622ed29efad16e0e724e8cdca0572fc8c7509eb4ad0000012800000090f84960cad0165e05bbee5df21c974fef634f14c4851dfa847a5f07a1d7a869f68d5d896cc9f261d26973221592607936aac41c0591ec20849c1e33f0e9a5c6426c0b209b9b48a3ad45a7dad87fec894219eedf5aa36c7db0758868993e97f3fb900f6bfbbdf36fd9d8afe47ae5a3283e29674628ac8544036ddebb628629df03ae05ff788fd408f44ca9254d4ff78ecc00000090a4ab332943d66fe625be47b9845e537b967ccac017c41abcbc0c2628c75bc84a02177296f90ac31f71836242d2abace7e5f0609be89c02ee8bae4a0c5f3088dcdf8269d76eed51e15455f4c5fefc79ae084bac2d2d9551190f81d7958298e64527f1c454c972799003856a063adf38c42875f2e864532a0c1a0662671e47b84292b8c17448d6358dff58e4a39c4ad545000001280000009010dd1a56fb7e2caffbf7da1d2494d96497c10f8b83061d2a7fdbf4929f575e94458d285d297462b31a0d327fe7544144851c002001eff096e7e763bb7371b8135a1c25d5b844a932fa712ce861ce4d0d151412c87e1e385a4b6ceb7dda77a2b8210360ccf0ce6aec734cfcf7792c14e917f003e0fbefe22da2fdd4c4370a50eddc7c051aa1781d32d09180285e81e33500000090d04b03752849abd068a041553be26194646cbb651bbd7eaa8ac61b863e7eb17236a5024ce2922fdc74712bdd9b0eaacf534c3e958837b80778eaf05f1a09e8af6464e7a1aa1f6735b3830081509f907b03c563539582713973caec33e047a5e087499f60585d49c66f39a728e1a1d54511ddaff3b2962b9ca053bf76c84aa9ac3e852be5c528c620868f97b770ea1c6800000128000000903eac051126fe83094f9102987843fc611dc961623b49d42fb86f7d5d4ffd58501bd3caabca512eea7ccdf1326f5a40c86fec627a39802b0188d786ee26a6ab57e6b494758fde93f864f6b9925324975f021d5bcd23235fa00ec18a95d73e5daa37c028a904dc89018e8570707e9a605c097e9694b140056d2eabcfa2f21267daf3accba1fc1ec324fb3515dc8ab018ce0000009084627b52fda3356fbee716000047cef7b28b792170486623a6495af3b4c733c60f3e16b16cefe06f53dc03cb98cbc63dac6f25cb0ec9f1ba23cfe5750308e69f103d06c04f9b08998b9e008153714bcd0dae73a7d52e55a2505854865ac685d0ede14c4eb30d56afafc26892c2c903251a7eb4ee19387c1d4790cbfc7ae2a2129d0e336dddd2d51b9438117e2cd31263", + "timestamp": 0 + } +} \ 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 new file mode 100644 index 00000000000..b10b890b79e --- /dev/null +++ b/l1-contracts/test/fixtures/mixed_block_1.json @@ -0,0 +1,64 @@ +{ + "populate": { + "l1ToL2Content": [ + "0x0000000000000000000000000000000000000000000000000000000000000481", + "0x0000000000000000000000000000000000000000000000000000000000000482", + "0x0000000000000000000000000000000000000000000000000000000000000483", + "0x0000000000000000000000000000000000000000000000000000000000000484", + "0x0000000000000000000000000000000000000000000000000000000000000485", + "0x0000000000000000000000000000000000000000000000000000000000000486", + "0x0000000000000000000000000000000000000000000000000000000000000487", + "0x0000000000000000000000000000000000000000000000000000000000000488", + "0x0000000000000000000000000000000000000000000000000000000000000489", + "0x000000000000000000000000000000000000000000000000000000000000048a", + "0x000000000000000000000000000000000000000000000000000000000000048b", + "0x000000000000000000000000000000000000000000000000000000000000048c", + "0x000000000000000000000000000000000000000000000000000000000000048d", + "0x000000000000000000000000000000000000000000000000000000000000048e", + "0x000000000000000000000000000000000000000000000000000000000000048f", + "0x0000000000000000000000000000000000000000000000000000000000000490" + ], + "recipient": "0x1647b194c649f5dd01d7c832f89b0f496043c9150797923ea89e93d5ac619a93", + "sender": "0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc" + }, + "messages": { + "l1ToL2Messages": [ + "0x12e5643e26da426570dd999e0e044e5f83d60f3cd813c55059bc0ea0f4a7c9d4", + "0x13b2d2cea949fa0876265cd8eee3a4dce1e243783562ea07e2de537f469f7bf6", + "0x27abb3d4560e786bafd52f77ac52dea36c50419f32386567bd969b0c38e1bd74", + "0x05d339cecb99fa74bfd631917f965357f0341d8c4dfe6a8f4b621d8df54c8294", + "0x1d560ac24523012499eeca2594f20ce238b7d21b98ad5c638767d70ee05532c2", + "0x183e6d64e69b005709dfc4771c7ca5981adc54f3e8bd1b00222461ae90e44eda", + "0x2f1d4572fe0b0b23100a7ea6d4780b25e826e41ca9e71897e010bcb218887b3d", + "0x036d44eb30a430b5cfc6660270eb5fb7f274689ac73dfa53ba9d0739fe38637f", + "0x01f7130af8c5888d4c65ea68109a1d58fe8d7d1ae62098857b0a3a3dcd393ef8", + "0x0ed8bcba6eb5e3b4887a32c51c5853b97a5eb59c87c520f36423c6d7be060718", + "0x21ca1719330de5e3c51a521778b49cbbc1d53f8ed42e0562bf21ed72e8cb9a41", + "0x0b0e82ef5f7276df41353faef675fb408aeb246b6e2f704cab99bf28d1427e7b", + "0x0fec7b9929c6effdcd045d3fdcec1d1b73faed495444699fab936630d69b519f", + "0x0bf4f1453db36439419dbfba703b849d1aa5774fe9a5325e5bf3e7cdda9d1f7f", + "0x2a9c2a035c72fd4a3e383306aff03448f9accc08a2c665837560cec8675fe251", + "0x2bfaef35a8fb7df08a81001a7fd4903849c0371dedd87f31295f46269c5205dd" + ], + "l2ToL1Messages": [ + "0x0000000000000000000000000000000000000000000000000000000000000440", + "0x0000000000000000000000000000000000000000000000000000000000000441", + "0x0000000000000000000000000000000000000000000000000000000000000480", + "0x0000000000000000000000000000000000000000000000000000000000000481", + "0x00000000000000000000000000000000000000000000000000000000000004c0", + "0x00000000000000000000000000000000000000000000000000000000000004c1", + "0x0000000000000000000000000000000000000000000000000000000000000500", + "0x0000000000000000000000000000000000000000000000000000000000000501" + ] + }, + "block": { + "blockNumber": 2, + "startStateHash": "0xed09b43d862f8628640ddc03012c80962c0bab9bf63c4962b7b1ef80e80db89e", + "endStateHash": "0xb80cdea4fe6984e4a45d7eed793c19a7768836819a566efe201df2a848638aac", + "publicInputsHash": "0x045809133f2783cff5fd025fcb350a78fae4854d441a47c7ca05c1e8355db2e4", + "calldataHash": "0xc73a69c8db8a87e0e6b99c6841d4ff717f5d35bc40a70f3130c917a9fde92d40", + "l1ToL2MessagesHash": "0xa10cc8559615be5a44cfb608374b1f84fd11cdb5844ebffafd92a77c068350f1", + "body": "0x0000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000659eb2370d944282e11bdcfa5e8f2b55fe80db4c586087bfc10e0bbba5724d30b8c15e2e0000010001c16141039343d4d403501e66deecff1b024bd76794820a43dc3424087813a2000001801a3d3e40c90cd24822b9c268154ef14d4639febdb7af81b554cb2d651b88dfb100000004160ba3a7c15d7dd592a24b3f14bfa76a0b45378877d4dedc5f126f47844b99b2000000600a241c83a063083fad29b6c333afcd968f71f8a875544ff1f1f08cae7f770f51000000101f1de772c009f5b1660876343eb57b7a676a84c695b0c526de2f238c418109070000000224c6dc6d357aad01e10fe1adb877bb28b1df97375b874116e488086ca76e5f9600000200268020a622156e2beac47431b0cd70e1c81fef9a6aa3c365bfcbed9aa7301c5e00000280022612683c6c4a0955c8248d409bc8ec8776d96a3bfe5b5a7e76e492a4f26cb000000008039e689049f104493f0e819b00d874663f0724639f854b8722e8ee829b0f136a000000a006c76caee115a61eeb6788977c68a3bea359061b678a1a4f5ffde13e0451717b00000020006d87d3393cf4378f937c65b8103be6d2376fe77e1f17850cb76b01d30fed0900000003000001000000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000024100000000000000000000000000000000000000000000000000000000000002420000000000000000000000000000000000000000000000000000000000000243000000000000000000000000000000000000000000000000000000000000024400000000000000000000000000000000000000000000000000000000000002450000000000000000000000000000000000000000000000000000000000000246000000000000000000000000000000000000000000000000000000000000024700000000000000000000000000000000000000000000000000000000000002480000000000000000000000000000000000000000000000000000000000000249000000000000000000000000000000000000000000000000000000000000024a000000000000000000000000000000000000000000000000000000000000024b000000000000000000000000000000000000000000000000000000000000024c000000000000000000000000000000000000000000000000000000000000024d000000000000000000000000000000000000000000000000000000000000024e000000000000000000000000000000000000000000000000000000000000024f0000000000000000000000000000000000000000000000000000000000000250000000000000000000000000000000000000000000000000000000000000025100000000000000000000000000000000000000000000000000000000000002520000000000000000000000000000000000000000000000000000000000000253000000000000000000000000000000000000000000000000000000000000025400000000000000000000000000000000000000000000000000000000000002550000000000000000000000000000000000000000000000000000000000000256000000000000000000000000000000000000000000000000000000000000025700000000000000000000000000000000000000000000000000000000000002580000000000000000000000000000000000000000000000000000000000000259000000000000000000000000000000000000000000000000000000000000025a000000000000000000000000000000000000000000000000000000000000025b000000000000000000000000000000000000000000000000000000000000025c000000000000000000000000000000000000000000000000000000000000025d000000000000000000000000000000000000000000000000000000000000025e000000000000000000000000000000000000000000000000000000000000025f0000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000026100000000000000000000000000000000000000000000000000000000000002620000000000000000000000000000000000000000000000000000000000000263000000000000000000000000000000000000000000000000000000000000026400000000000000000000000000000000000000000000000000000000000002650000000000000000000000000000000000000000000000000000000000000266000000000000000000000000000000000000000000000000000000000000026700000000000000000000000000000000000000000000000000000000000002680000000000000000000000000000000000000000000000000000000000000269000000000000000000000000000000000000000000000000000000000000026a000000000000000000000000000000000000000000000000000000000000026b000000000000000000000000000000000000000000000000000000000000026c000000000000000000000000000000000000000000000000000000000000026d000000000000000000000000000000000000000000000000000000000000026e000000000000000000000000000000000000000000000000000000000000026f0000000000000000000000000000000000000000000000000000000000000270000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000002720000000000000000000000000000000000000000000000000000000000000273000000000000000000000000000000000000000000000000000000000000027400000000000000000000000000000000000000000000000000000000000002750000000000000000000000000000000000000000000000000000000000000276000000000000000000000000000000000000000000000000000000000000027700000000000000000000000000000000000000000000000000000000000002780000000000000000000000000000000000000000000000000000000000000279000000000000000000000000000000000000000000000000000000000000027a000000000000000000000000000000000000000000000000000000000000027b000000000000000000000000000000000000000000000000000000000000027c000000000000000000000000000000000000000000000000000000000000027d000000000000000000000000000000000000000000000000000000000000027e000000000000000000000000000000000000000000000000000000000000027f0000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000028100000000000000000000000000000000000000000000000000000000000002820000000000000000000000000000000000000000000000000000000000000283000000000000000000000000000000000000000000000000000000000000028400000000000000000000000000000000000000000000000000000000000002850000000000000000000000000000000000000000000000000000000000000286000000000000000000000000000000000000000000000000000000000000028700000000000000000000000000000000000000000000000000000000000002880000000000000000000000000000000000000000000000000000000000000289000000000000000000000000000000000000000000000000000000000000028a000000000000000000000000000000000000000000000000000000000000028b000000000000000000000000000000000000000000000000000000000000028c000000000000000000000000000000000000000000000000000000000000028d000000000000000000000000000000000000000000000000000000000000028e000000000000000000000000000000000000000000000000000000000000028f0000000000000000000000000000000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000029100000000000000000000000000000000000000000000000000000000000002920000000000000000000000000000000000000000000000000000000000000293000000000000000000000000000000000000000000000000000000000000029400000000000000000000000000000000000000000000000000000000000002950000000000000000000000000000000000000000000000000000000000000296000000000000000000000000000000000000000000000000000000000000029700000000000000000000000000000000000000000000000000000000000002980000000000000000000000000000000000000000000000000000000000000299000000000000000000000000000000000000000000000000000000000000029a000000000000000000000000000000000000000000000000000000000000029b000000000000000000000000000000000000000000000000000000000000029c000000000000000000000000000000000000000000000000000000000000029d000000000000000000000000000000000000000000000000000000000000029e000000000000000000000000000000000000000000000000000000000000029f00000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002a100000000000000000000000000000000000000000000000000000000000002a200000000000000000000000000000000000000000000000000000000000002a300000000000000000000000000000000000000000000000000000000000002a400000000000000000000000000000000000000000000000000000000000002a500000000000000000000000000000000000000000000000000000000000002a600000000000000000000000000000000000000000000000000000000000002a700000000000000000000000000000000000000000000000000000000000002a800000000000000000000000000000000000000000000000000000000000002a900000000000000000000000000000000000000000000000000000000000002aa00000000000000000000000000000000000000000000000000000000000002ab00000000000000000000000000000000000000000000000000000000000002ac00000000000000000000000000000000000000000000000000000000000002ad00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002af00000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000002b100000000000000000000000000000000000000000000000000000000000002b200000000000000000000000000000000000000000000000000000000000002b300000000000000000000000000000000000000000000000000000000000002b400000000000000000000000000000000000000000000000000000000000002b500000000000000000000000000000000000000000000000000000000000002b600000000000000000000000000000000000000000000000000000000000002b700000000000000000000000000000000000000000000000000000000000002b800000000000000000000000000000000000000000000000000000000000002b900000000000000000000000000000000000000000000000000000000000002ba00000000000000000000000000000000000000000000000000000000000002bb00000000000000000000000000000000000000000000000000000000000002bc00000000000000000000000000000000000000000000000000000000000002bd00000000000000000000000000000000000000000000000000000000000002be00000000000000000000000000000000000000000000000000000000000002bf00000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000002c100000000000000000000000000000000000000000000000000000000000002c200000000000000000000000000000000000000000000000000000000000002c300000000000000000000000000000000000000000000000000000000000002c400000000000000000000000000000000000000000000000000000000000002c500000000000000000000000000000000000000000000000000000000000002c600000000000000000000000000000000000000000000000000000000000002c700000000000000000000000000000000000000000000000000000000000002c800000000000000000000000000000000000000000000000000000000000002c900000000000000000000000000000000000000000000000000000000000002ca00000000000000000000000000000000000000000000000000000000000002cb00000000000000000000000000000000000000000000000000000000000002cc00000000000000000000000000000000000000000000000000000000000002cd00000000000000000000000000000000000000000000000000000000000002ce00000000000000000000000000000000000000000000000000000000000002cf00000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000002d100000000000000000000000000000000000000000000000000000000000002d200000000000000000000000000000000000000000000000000000000000002d300000000000000000000000000000000000000000000000000000000000002d400000000000000000000000000000000000000000000000000000000000002d500000000000000000000000000000000000000000000000000000000000002d600000000000000000000000000000000000000000000000000000000000002d700000000000000000000000000000000000000000000000000000000000002d800000000000000000000000000000000000000000000000000000000000002d900000000000000000000000000000000000000000000000000000000000002da00000000000000000000000000000000000000000000000000000000000002db00000000000000000000000000000000000000000000000000000000000002dc00000000000000000000000000000000000000000000000000000000000002dd00000000000000000000000000000000000000000000000000000000000002de00000000000000000000000000000000000000000000000000000000000002df00000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000002e100000000000000000000000000000000000000000000000000000000000002e200000000000000000000000000000000000000000000000000000000000002e300000000000000000000000000000000000000000000000000000000000002e400000000000000000000000000000000000000000000000000000000000002e500000000000000000000000000000000000000000000000000000000000002e600000000000000000000000000000000000000000000000000000000000002e700000000000000000000000000000000000000000000000000000000000002e800000000000000000000000000000000000000000000000000000000000002e900000000000000000000000000000000000000000000000000000000000002ea00000000000000000000000000000000000000000000000000000000000002eb00000000000000000000000000000000000000000000000000000000000002ec00000000000000000000000000000000000000000000000000000000000002ed00000000000000000000000000000000000000000000000000000000000002ee00000000000000000000000000000000000000000000000000000000000002ef00000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000002f100000000000000000000000000000000000000000000000000000000000002f200000000000000000000000000000000000000000000000000000000000002f300000000000000000000000000000000000000000000000000000000000002f400000000000000000000000000000000000000000000000000000000000002f500000000000000000000000000000000000000000000000000000000000002f600000000000000000000000000000000000000000000000000000000000002f700000000000000000000000000000000000000000000000000000000000002f800000000000000000000000000000000000000000000000000000000000002f900000000000000000000000000000000000000000000000000000000000002fa00000000000000000000000000000000000000000000000000000000000002fb00000000000000000000000000000000000000000000000000000000000002fc00000000000000000000000000000000000000000000000000000000000002fd00000000000000000000000000000000000000000000000000000000000002fe00000000000000000000000000000000000000000000000000000000000002ff0000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000030100000000000000000000000000000000000000000000000000000000000003020000000000000000000000000000000000000000000000000000000000000303000000000000000000000000000000000000000000000000000000000000030400000000000000000000000000000000000000000000000000000000000003050000000000000000000000000000000000000000000000000000000000000306000000000000000000000000000000000000000000000000000000000000030700000000000000000000000000000000000000000000000000000000000003080000000000000000000000000000000000000000000000000000000000000309000000000000000000000000000000000000000000000000000000000000030a000000000000000000000000000000000000000000000000000000000000030b000000000000000000000000000000000000000000000000000000000000030c000000000000000000000000000000000000000000000000000000000000030d000000000000000000000000000000000000000000000000000000000000030e000000000000000000000000000000000000000000000000000000000000030f0000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000031100000000000000000000000000000000000000000000000000000000000003120000000000000000000000000000000000000000000000000000000000000313000000000000000000000000000000000000000000000000000000000000031400000000000000000000000000000000000000000000000000000000000003150000000000000000000000000000000000000000000000000000000000000316000000000000000000000000000000000000000000000000000000000000031700000000000000000000000000000000000000000000000000000000000003180000000000000000000000000000000000000000000000000000000000000319000000000000000000000000000000000000000000000000000000000000031a000000000000000000000000000000000000000000000000000000000000031b000000000000000000000000000000000000000000000000000000000000031c000000000000000000000000000000000000000000000000000000000000031d000000000000000000000000000000000000000000000000000000000000031e000000000000000000000000000000000000000000000000000000000000031f0000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000032100000000000000000000000000000000000000000000000000000000000003220000000000000000000000000000000000000000000000000000000000000323000000000000000000000000000000000000000000000000000000000000032400000000000000000000000000000000000000000000000000000000000003250000000000000000000000000000000000000000000000000000000000000326000000000000000000000000000000000000000000000000000000000000032700000000000000000000000000000000000000000000000000000000000003280000000000000000000000000000000000000000000000000000000000000329000000000000000000000000000000000000000000000000000000000000032a000000000000000000000000000000000000000000000000000000000000032b000000000000000000000000000000000000000000000000000000000000032c000000000000000000000000000000000000000000000000000000000000032d000000000000000000000000000000000000000000000000000000000000032e000000000000000000000000000000000000000000000000000000000000032f0000000000000000000000000000000000000000000000000000000000000330000000000000000000000000000000000000000000000000000000000000033100000000000000000000000000000000000000000000000000000000000003320000000000000000000000000000000000000000000000000000000000000333000000000000000000000000000000000000000000000000000000000000033400000000000000000000000000000000000000000000000000000000000003350000000000000000000000000000000000000000000000000000000000000336000000000000000000000000000000000000000000000000000000000000033700000000000000000000000000000000000000000000000000000000000003380000000000000000000000000000000000000000000000000000000000000339000000000000000000000000000000000000000000000000000000000000033a000000000000000000000000000000000000000000000000000000000000033b000000000000000000000000000000000000000000000000000000000000033c000000000000000000000000000000000000000000000000000000000000033d000000000000000000000000000000000000000000000000000000000000033e000000000000000000000000000000000000000000000000000000000000033f000001000000000000000000000000000000000000000000000000000000000000000340000000000000000000000000000000000000000000000000000000000000034100000000000000000000000000000000000000000000000000000000000003420000000000000000000000000000000000000000000000000000000000000343000000000000000000000000000000000000000000000000000000000000034400000000000000000000000000000000000000000000000000000000000003450000000000000000000000000000000000000000000000000000000000000346000000000000000000000000000000000000000000000000000000000000034700000000000000000000000000000000000000000000000000000000000003480000000000000000000000000000000000000000000000000000000000000349000000000000000000000000000000000000000000000000000000000000034a000000000000000000000000000000000000000000000000000000000000034b000000000000000000000000000000000000000000000000000000000000034c000000000000000000000000000000000000000000000000000000000000034d000000000000000000000000000000000000000000000000000000000000034e000000000000000000000000000000000000000000000000000000000000034f0000000000000000000000000000000000000000000000000000000000000350000000000000000000000000000000000000000000000000000000000000035100000000000000000000000000000000000000000000000000000000000003520000000000000000000000000000000000000000000000000000000000000353000000000000000000000000000000000000000000000000000000000000035400000000000000000000000000000000000000000000000000000000000003550000000000000000000000000000000000000000000000000000000000000356000000000000000000000000000000000000000000000000000000000000035700000000000000000000000000000000000000000000000000000000000003580000000000000000000000000000000000000000000000000000000000000359000000000000000000000000000000000000000000000000000000000000035a000000000000000000000000000000000000000000000000000000000000035b000000000000000000000000000000000000000000000000000000000000035c000000000000000000000000000000000000000000000000000000000000035d000000000000000000000000000000000000000000000000000000000000035e000000000000000000000000000000000000000000000000000000000000035f0000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000000000036100000000000000000000000000000000000000000000000000000000000003620000000000000000000000000000000000000000000000000000000000000363000000000000000000000000000000000000000000000000000000000000036400000000000000000000000000000000000000000000000000000000000003650000000000000000000000000000000000000000000000000000000000000366000000000000000000000000000000000000000000000000000000000000036700000000000000000000000000000000000000000000000000000000000003680000000000000000000000000000000000000000000000000000000000000369000000000000000000000000000000000000000000000000000000000000036a000000000000000000000000000000000000000000000000000000000000036b000000000000000000000000000000000000000000000000000000000000036c000000000000000000000000000000000000000000000000000000000000036d000000000000000000000000000000000000000000000000000000000000036e000000000000000000000000000000000000000000000000000000000000036f0000000000000000000000000000000000000000000000000000000000000370000000000000000000000000000000000000000000000000000000000000037100000000000000000000000000000000000000000000000000000000000003720000000000000000000000000000000000000000000000000000000000000373000000000000000000000000000000000000000000000000000000000000037400000000000000000000000000000000000000000000000000000000000003750000000000000000000000000000000000000000000000000000000000000376000000000000000000000000000000000000000000000000000000000000037700000000000000000000000000000000000000000000000000000000000003780000000000000000000000000000000000000000000000000000000000000379000000000000000000000000000000000000000000000000000000000000037a000000000000000000000000000000000000000000000000000000000000037b000000000000000000000000000000000000000000000000000000000000037c000000000000000000000000000000000000000000000000000000000000037d000000000000000000000000000000000000000000000000000000000000037e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000038100000000000000000000000000000000000000000000000000000000000003820000000000000000000000000000000000000000000000000000000000000383000000000000000000000000000000000000000000000000000000000000038400000000000000000000000000000000000000000000000000000000000003850000000000000000000000000000000000000000000000000000000000000386000000000000000000000000000000000000000000000000000000000000038700000000000000000000000000000000000000000000000000000000000003880000000000000000000000000000000000000000000000000000000000000389000000000000000000000000000000000000000000000000000000000000038a000000000000000000000000000000000000000000000000000000000000038b000000000000000000000000000000000000000000000000000000000000038c000000000000000000000000000000000000000000000000000000000000038d000000000000000000000000000000000000000000000000000000000000038e000000000000000000000000000000000000000000000000000000000000038f0000000000000000000000000000000000000000000000000000000000000390000000000000000000000000000000000000000000000000000000000000039100000000000000000000000000000000000000000000000000000000000003920000000000000000000000000000000000000000000000000000000000000393000000000000000000000000000000000000000000000000000000000000039400000000000000000000000000000000000000000000000000000000000003950000000000000000000000000000000000000000000000000000000000000396000000000000000000000000000000000000000000000000000000000000039700000000000000000000000000000000000000000000000000000000000003980000000000000000000000000000000000000000000000000000000000000399000000000000000000000000000000000000000000000000000000000000039a000000000000000000000000000000000000000000000000000000000000039b000000000000000000000000000000000000000000000000000000000000039c000000000000000000000000000000000000000000000000000000000000039d000000000000000000000000000000000000000000000000000000000000039e000000000000000000000000000000000000000000000000000000000000039f00000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000003a100000000000000000000000000000000000000000000000000000000000003a200000000000000000000000000000000000000000000000000000000000003a300000000000000000000000000000000000000000000000000000000000003a400000000000000000000000000000000000000000000000000000000000003a500000000000000000000000000000000000000000000000000000000000003a600000000000000000000000000000000000000000000000000000000000003a700000000000000000000000000000000000000000000000000000000000003a800000000000000000000000000000000000000000000000000000000000003a900000000000000000000000000000000000000000000000000000000000003aa00000000000000000000000000000000000000000000000000000000000003ab00000000000000000000000000000000000000000000000000000000000003ac00000000000000000000000000000000000000000000000000000000000003ad00000000000000000000000000000000000000000000000000000000000003ae00000000000000000000000000000000000000000000000000000000000003af00000000000000000000000000000000000000000000000000000000000003b000000000000000000000000000000000000000000000000000000000000003b100000000000000000000000000000000000000000000000000000000000003b200000000000000000000000000000000000000000000000000000000000003b300000000000000000000000000000000000000000000000000000000000003b400000000000000000000000000000000000000000000000000000000000003b500000000000000000000000000000000000000000000000000000000000003b600000000000000000000000000000000000000000000000000000000000003b700000000000000000000000000000000000000000000000000000000000003b800000000000000000000000000000000000000000000000000000000000003b900000000000000000000000000000000000000000000000000000000000003ba00000000000000000000000000000000000000000000000000000000000003bb00000000000000000000000000000000000000000000000000000000000003bc00000000000000000000000000000000000000000000000000000000000003bd00000000000000000000000000000000000000000000000000000000000003be000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000003c100000000000000000000000000000000000000000000000000000000000003c200000000000000000000000000000000000000000000000000000000000003c300000000000000000000000000000000000000000000000000000000000003c400000000000000000000000000000000000000000000000000000000000003c500000000000000000000000000000000000000000000000000000000000003c600000000000000000000000000000000000000000000000000000000000003c700000000000000000000000000000000000000000000000000000000000003c800000000000000000000000000000000000000000000000000000000000003c900000000000000000000000000000000000000000000000000000000000003ca00000000000000000000000000000000000000000000000000000000000003cb00000000000000000000000000000000000000000000000000000000000003cc00000000000000000000000000000000000000000000000000000000000003cd00000000000000000000000000000000000000000000000000000000000003ce00000000000000000000000000000000000000000000000000000000000003cf00000000000000000000000000000000000000000000000000000000000003d000000000000000000000000000000000000000000000000000000000000003d100000000000000000000000000000000000000000000000000000000000003d200000000000000000000000000000000000000000000000000000000000003d300000000000000000000000000000000000000000000000000000000000003d400000000000000000000000000000000000000000000000000000000000003d500000000000000000000000000000000000000000000000000000000000003d600000000000000000000000000000000000000000000000000000000000003d700000000000000000000000000000000000000000000000000000000000003d800000000000000000000000000000000000000000000000000000000000003d900000000000000000000000000000000000000000000000000000000000003da00000000000000000000000000000000000000000000000000000000000003db00000000000000000000000000000000000000000000000000000000000003dc00000000000000000000000000000000000000000000000000000000000003dd00000000000000000000000000000000000000000000000000000000000003de00000000000000000000000000000000000000000000000000000000000003df00000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000003e100000000000000000000000000000000000000000000000000000000000003e200000000000000000000000000000000000000000000000000000000000003e300000000000000000000000000000000000000000000000000000000000003e400000000000000000000000000000000000000000000000000000000000003e500000000000000000000000000000000000000000000000000000000000003e600000000000000000000000000000000000000000000000000000000000003e700000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000003e900000000000000000000000000000000000000000000000000000000000003ea00000000000000000000000000000000000000000000000000000000000003eb00000000000000000000000000000000000000000000000000000000000003ec00000000000000000000000000000000000000000000000000000000000003ed00000000000000000000000000000000000000000000000000000000000003ee00000000000000000000000000000000000000000000000000000000000003ef00000000000000000000000000000000000000000000000000000000000003f000000000000000000000000000000000000000000000000000000000000003f100000000000000000000000000000000000000000000000000000000000003f200000000000000000000000000000000000000000000000000000000000003f300000000000000000000000000000000000000000000000000000000000003f400000000000000000000000000000000000000000000000000000000000003f500000000000000000000000000000000000000000000000000000000000003f600000000000000000000000000000000000000000000000000000000000003f700000000000000000000000000000000000000000000000000000000000003f800000000000000000000000000000000000000000000000000000000000003f900000000000000000000000000000000000000000000000000000000000003fa00000000000000000000000000000000000000000000000000000000000003fb00000000000000000000000000000000000000000000000000000000000003fc00000000000000000000000000000000000000000000000000000000000003fd00000000000000000000000000000000000000000000000000000000000003fe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040100000000000000000000000000000000000000000000000000000000000004020000000000000000000000000000000000000000000000000000000000000403000000000000000000000000000000000000000000000000000000000000040400000000000000000000000000000000000000000000000000000000000004050000000000000000000000000000000000000000000000000000000000000406000000000000000000000000000000000000000000000000000000000000040700000000000000000000000000000000000000000000000000000000000004080000000000000000000000000000000000000000000000000000000000000409000000000000000000000000000000000000000000000000000000000000040a000000000000000000000000000000000000000000000000000000000000040b000000000000000000000000000000000000000000000000000000000000040c000000000000000000000000000000000000000000000000000000000000040d000000000000000000000000000000000000000000000000000000000000040e000000000000000000000000000000000000000000000000000000000000040f0000000000000000000000000000000000000000000000000000000000000410000000000000000000000000000000000000000000000000000000000000041100000000000000000000000000000000000000000000000000000000000004120000000000000000000000000000000000000000000000000000000000000413000000000000000000000000000000000000000000000000000000000000041400000000000000000000000000000000000000000000000000000000000004150000000000000000000000000000000000000000000000000000000000000416000000000000000000000000000000000000000000000000000000000000041700000000000000000000000000000000000000000000000000000000000004180000000000000000000000000000000000000000000000000000000000000419000000000000000000000000000000000000000000000000000000000000041a000000000000000000000000000000000000000000000000000000000000041b000000000000000000000000000000000000000000000000000000000000041c000000000000000000000000000000000000000000000000000000000000041d000000000000000000000000000000000000000000000000000000000000041e000000000000000000000000000000000000000000000000000000000000041f0000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000000000000000000000000000042100000000000000000000000000000000000000000000000000000000000004220000000000000000000000000000000000000000000000000000000000000423000000000000000000000000000000000000000000000000000000000000042400000000000000000000000000000000000000000000000000000000000004250000000000000000000000000000000000000000000000000000000000000426000000000000000000000000000000000000000000000000000000000000042700000000000000000000000000000000000000000000000000000000000004280000000000000000000000000000000000000000000000000000000000000429000000000000000000000000000000000000000000000000000000000000042a000000000000000000000000000000000000000000000000000000000000042b000000000000000000000000000000000000000000000000000000000000042c000000000000000000000000000000000000000000000000000000000000042d000000000000000000000000000000000000000000000000000000000000042e000000000000000000000000000000000000000000000000000000000000042f0000000000000000000000000000000000000000000000000000000000000430000000000000000000000000000000000000000000000000000000000000043100000000000000000000000000000000000000000000000000000000000004320000000000000000000000000000000000000000000000000000000000000433000000000000000000000000000000000000000000000000000000000000043400000000000000000000000000000000000000000000000000000000000004350000000000000000000000000000000000000000000000000000000000000436000000000000000000000000000000000000000000000000000000000000043700000000000000000000000000000000000000000000000000000000000004380000000000000000000000000000000000000000000000000000000000000439000000000000000000000000000000000000000000000000000000000000043a000000000000000000000000000000000000000000000000000000000000043b000000000000000000000000000000000000000000000000000000000000043c000000000000000000000000000000000000000000000000000000000000043d000000000000000000000000000000000000000000000000000000000000043e0000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000064a0000000000000000000000000000000000000000000000000000000000000641000000000000000000000000000000000000000000000000000000000000064b0000000000000000000000000000000000000000000000000000000000000642000000000000000000000000000000000000000000000000000000000000064c0000000000000000000000000000000000000000000000000000000000000643000000000000000000000000000000000000000000000000000000000000064d0000000000000000000000000000000000000000000000000000000000000644000000000000000000000000000000000000000000000000000000000000064e0000000000000000000000000000000000000000000000000000000000000645000000000000000000000000000000000000000000000000000000000000064f00000000000000000000000000000000000000000000000000000000000006460000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000000000000000000064700000000000000000000000000000000000000000000000000000000000006510000000000000000000000000000000000000000000000000000000000000648000000000000000000000000000000000000000000000000000000000000065200000000000000000000000000000000000000000000000000000000000006490000000000000000000000000000000000000000000000000000000000000653000000000000000000000000000000000000000000000000000000000000064a0000000000000000000000000000000000000000000000000000000000000654000000000000000000000000000000000000000000000000000000000000064b0000000000000000000000000000000000000000000000000000000000000655000000000000000000000000000000000000000000000000000000000000064c0000000000000000000000000000000000000000000000000000000000000656000000000000000000000000000000000000000000000000000000000000064d0000000000000000000000000000000000000000000000000000000000000657000000000000000000000000000000000000000000000000000000000000064e0000000000000000000000000000000000000000000000000000000000000658000000000000000000000000000000000000000000000000000000000000064f00000000000000000000000000000000000000000000000000000000000006590000000000000000000000000000000000000000000000000000000000000680000000000000000000000000000000000000000000000000000000000000068a0000000000000000000000000000000000000000000000000000000000000681000000000000000000000000000000000000000000000000000000000000068b0000000000000000000000000000000000000000000000000000000000000682000000000000000000000000000000000000000000000000000000000000068c0000000000000000000000000000000000000000000000000000000000000683000000000000000000000000000000000000000000000000000000000000068d0000000000000000000000000000000000000000000000000000000000000684000000000000000000000000000000000000000000000000000000000000068e0000000000000000000000000000000000000000000000000000000000000685000000000000000000000000000000000000000000000000000000000000068f00000000000000000000000000000000000000000000000000000000000006860000000000000000000000000000000000000000000000000000000000000690000000000000000000000000000000000000000000000000000000000000068700000000000000000000000000000000000000000000000000000000000006910000000000000000000000000000000000000000000000000000000000000688000000000000000000000000000000000000000000000000000000000000069200000000000000000000000000000000000000000000000000000000000006890000000000000000000000000000000000000000000000000000000000000693000000000000000000000000000000000000000000000000000000000000068a0000000000000000000000000000000000000000000000000000000000000694000000000000000000000000000000000000000000000000000000000000068b0000000000000000000000000000000000000000000000000000000000000695000000000000000000000000000000000000000000000000000000000000068c0000000000000000000000000000000000000000000000000000000000000696000000000000000000000000000000000000000000000000000000000000068d0000000000000000000000000000000000000000000000000000000000000697000000000000000000000000000000000000000000000000000000000000068e0000000000000000000000000000000000000000000000000000000000000698000000000000000000000000000000000000000000000000000000000000068f000000000000000000000000000000000000000000000000000000000000069900000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000006ca00000000000000000000000000000000000000000000000000000000000006c100000000000000000000000000000000000000000000000000000000000006cb00000000000000000000000000000000000000000000000000000000000006c200000000000000000000000000000000000000000000000000000000000006cc00000000000000000000000000000000000000000000000000000000000006c300000000000000000000000000000000000000000000000000000000000006cd00000000000000000000000000000000000000000000000000000000000006c400000000000000000000000000000000000000000000000000000000000006ce00000000000000000000000000000000000000000000000000000000000006c500000000000000000000000000000000000000000000000000000000000006cf00000000000000000000000000000000000000000000000000000000000006c600000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000006c700000000000000000000000000000000000000000000000000000000000006d100000000000000000000000000000000000000000000000000000000000006c800000000000000000000000000000000000000000000000000000000000006d200000000000000000000000000000000000000000000000000000000000006c900000000000000000000000000000000000000000000000000000000000006d300000000000000000000000000000000000000000000000000000000000006ca00000000000000000000000000000000000000000000000000000000000006d400000000000000000000000000000000000000000000000000000000000006cb00000000000000000000000000000000000000000000000000000000000006d500000000000000000000000000000000000000000000000000000000000006cc00000000000000000000000000000000000000000000000000000000000006d600000000000000000000000000000000000000000000000000000000000006cd00000000000000000000000000000000000000000000000000000000000006d700000000000000000000000000000000000000000000000000000000000006ce00000000000000000000000000000000000000000000000000000000000006d800000000000000000000000000000000000000000000000000000000000006cf00000000000000000000000000000000000000000000000000000000000006d90000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000070a0000000000000000000000000000000000000000000000000000000000000701000000000000000000000000000000000000000000000000000000000000070b0000000000000000000000000000000000000000000000000000000000000702000000000000000000000000000000000000000000000000000000000000070c0000000000000000000000000000000000000000000000000000000000000703000000000000000000000000000000000000000000000000000000000000070d0000000000000000000000000000000000000000000000000000000000000704000000000000000000000000000000000000000000000000000000000000070e0000000000000000000000000000000000000000000000000000000000000705000000000000000000000000000000000000000000000000000000000000070f00000000000000000000000000000000000000000000000000000000000007060000000000000000000000000000000000000000000000000000000000000710000000000000000000000000000000000000000000000000000000000000070700000000000000000000000000000000000000000000000000000000000007110000000000000000000000000000000000000000000000000000000000000708000000000000000000000000000000000000000000000000000000000000071200000000000000000000000000000000000000000000000000000000000007090000000000000000000000000000000000000000000000000000000000000713000000000000000000000000000000000000000000000000000000000000070a0000000000000000000000000000000000000000000000000000000000000714000000000000000000000000000000000000000000000000000000000000070b0000000000000000000000000000000000000000000000000000000000000715000000000000000000000000000000000000000000000000000000000000070c0000000000000000000000000000000000000000000000000000000000000716000000000000000000000000000000000000000000000000000000000000070d0000000000000000000000000000000000000000000000000000000000000717000000000000000000000000000000000000000000000000000000000000070e0000000000000000000000000000000000000000000000000000000000000718000000000000000000000000000000000000000000000000000000000000070f000000000000000000000000000000000000000000000000000000000000071900000008000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000004410000000000000000000000000000000000000000000000000000000000000480000000000000000000000000000000000000000000000000000000000000048100000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000004c100000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000501000000042ea6fe02855d8c72905f35f08604467117c037962e324c9a793505138558b3700c94efd9afe573212f9bf596ca3a4b42ae57f59e670a7cb5b9440c54bd8ea2961856bc4892b0b3f156ed2aa87463c389bfce0fd675a37cec77ae5d753fcf593c12f9d3f397c2edc9e4a6a5e485641163525ca802e3bd93994af997a9b9a44f98000000000000000000000000000000000000000000000000000000000000114041414141414141414141414141414141414141410000000000000000000000000000000000000000000000000000000000001180818181818181818181818181818181818181818100000000000000000000000000000000000000000000000000000000000011c0c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1000000000000000000000000000000000000000000000000000000000000120001010101010101010101010101010101010101010000001012e5643e26da426570dd999e0e044e5f83d60f3cd813c55059bc0ea0f4a7c9d413b2d2cea949fa0876265cd8eee3a4dce1e243783562ea07e2de537f469f7bf627abb3d4560e786bafd52f77ac52dea36c50419f32386567bd969b0c38e1bd7405d339cecb99fa74bfd631917f965357f0341d8c4dfe6a8f4b621d8df54c82941d560ac24523012499eeca2594f20ce238b7d21b98ad5c638767d70ee05532c2183e6d64e69b005709dfc4771c7ca5981adc54f3e8bd1b00222461ae90e44eda2f1d4572fe0b0b23100a7ea6d4780b25e826e41ca9e71897e010bcb218887b3d036d44eb30a430b5cfc6660270eb5fb7f274689ac73dfa53ba9d0739fe38637f01f7130af8c5888d4c65ea68109a1d58fe8d7d1ae62098857b0a3a3dcd393ef80ed8bcba6eb5e3b4887a32c51c5853b97a5eb59c87c520f36423c6d7be06071821ca1719330de5e3c51a521778b49cbbc1d53f8ed42e0562bf21ed72e8cb9a410b0e82ef5f7276df41353faef675fb408aeb246b6e2f704cab99bf28d1427e7b0fec7b9929c6effdcd045d3fdcec1d1b73faed495444699fab936630d69b519f0bf4f1453db36439419dbfba703b849d1aa5774fe9a5325e5bf3e7cdda9d1f7f2a9c2a035c72fd4a3e383306aff03448f9accc08a2c665837560cec8675fe2512bfaef35a8fb7df08a81001a7fd4903849c0371dedd87f31295f46269c5205dd0000381000000e00000001bc000000901bbbef3c28b593bda223910c4da84390617abc7bd1a5d9e6abe699a8d564423d157457f7ffc6ad35e55fcd080285d1f8d0e4257da98a610cd038d08935be90b454d2a167cd0dbe7c7fcabe35baf98f8b0444d1a95109d8af1126716859446f94e2fa3e9223158fc00f0238c4297cde400cc585cdc952e4a35987736f5f0f358afc2c80a9729dce95e4ad6c99a8049496000000900801e74f1076f4059a5e29ea28829c5018b7ed6e2c13088c3ff4afd3d1ecc7195e53056d0b372de69aa635b1a1e2f390e2eff2c8efb57445a53e4ff7c27677b3dd5eff583341bc4756170e27620b1ef01734b72ac04880ce64a043ec11cbee86fb54f25dd38f6da24124b8fcd0e6501f1243520950ee37e7711b13383b83a5670ada6faacf0b6ed63149ff7274313cd7000000903d789416c844dcee48a0c06656977e98cdf7b78d890602ba364c89e5c75244c91065944e7eab2d653ecf36240dfc8d45a57fb12292a1231fecb1202ae0a0448477b3c45bca7f816ddb57d6388cd17a3f0aca6923244fb0b379d6a61ebaadfeb9cc5a5e4581c974556092bf7142abe87e0b29e6f1b99888449e0d7e7ad682da12c1ee264c51ed42667f351deaf078cd15000001bc0000009044c89f4bb93b937f257264d2d760ca5e2b3d4e92cadbf7a0b09abfa46dc22a7c8ab66e5a4ee70b69c0c3a55e9af9353ca6f9e445c7ce18ba203522b28057392622c7cd856993730767bc396cf7a7842e17b72e2da6b614c3a5eb3b758a8c7fde084fc6d1e315e86bf88a94974c11422007441bca51c0fb5a8cd9125a17deebc8fffdb62314c51dcdef8b0b911bde617c000000907cf318c159e037fceb65d69800779afaf4339456ec9afcaae830041a65564f0881e7776057fbe9543a8e2bc51a479c7995c2e1f03aa28f5ebe082bd419e6a4a0f329d746372c844b38f34f450215596914425fdb872988b458cde3fc19afd08806a58b565efc6ec48c2d8be29650150b0f70ab038cf8dda8ecd0d30a1f489218343782affb54aaf0700a993fd812279d00000090391336dfc5cc13c655262457ad009a6dff4a4212be26875a99ee84800b54d454204af0a6685988b443e2d8a02ac61e87916c6f33cc31be2e5eb6f0fa57cac629bb9748d4cab7a56b06e832ec134c88871f61fdbe0ed85c9febb31a9e7b57d1c0fd80c64de3be0532710f8a0c4b6e6dbe2b4731ff0743916951f2cf2ab02d2b073277afa45bd8549231b5b4882cc21574000001bc00000090d4c0306719a700d2335bfe386a6265a26593dc3b00ee3decea20df454464b378b308be6712a79d127dfb22087a048606db264272dcba52a6aba8dc8f907b7ab80d84e5b19b8964085616a3dba66ab55c1f26072b93be3a2bfc1c1dc02a1934b3bc77edcfcc6da9e986db080cbe44e1f02d26389d239f59e89153c403b7121172d4cf25ee5a4f6b334d241e9476054ee800000090ed5694dc14fff5bd9e60c0b0e14631a67728efa34c84b00e23d247589a72c454bb9100a8248d478698f1857f358ba12978163df41f2406568bdbc16f77869395f72890e3ec965f094ba3f2e394bc3854074d4daf022889aca54819148fa933fc708f6b94817cda4126a24c25269f413014232b411c83b1bf72acf16f3332e74ec71b725edf8c14df6d0fadb866051a57000000909550d05d0953185a5a4734d57876a217b048cadd73932617f73c8385691a7528dc8b86244ac48a97866c9ff07c03b4ae87647306698244ed38728b316b5a710162484cbadca0a193e062221e22667f171ec129887f420216fe57d9017e5ad95e656eb93ef18d4bace9845f3933f365a126a47bd5624508828e86be6806b7d6f1a5901802974e1f5896f38041438be007000001bc00000090bf2b3c0781fb59f551ccda180921c7fb59cd0b3fbf3f2d08efc03e329b6186aa892764af52466ce12801f5c425ec10bf740fb24d9812a70d9253481db8225be7fbec76c789a05c5a05ed9ae4dae23d88158f012ce177df67198a930a5cdebad4b91c0fd3ce0d2424955f9168649dab4b0673adb98f3eee50ad255054258bbf19e4c074211652c9e70ce90bc2841a3c6d00000090f3f15a62c34a9c61c7775a16527cd2ceee25ba7b4f6dd174c15dfe09b038c4097df4d2fe97205939ee1d383c9de219b35f296e1f9e68377ae5f582eb44eca3a57280ed2f3275f1dd09c16b32ac1158de21a791fccacb346e1f10c3dfec72bd056984c97cb1f65e093de5dfe30aaca5512b65720c7e95db495d49128884c54dce2dd1201451607bc34e0e9e61b32b163900000090c9303074fcab34ce08631b5613015cb573f8bad3245ff941e061efcf3d2bc98e75f13fb9b026e9fce34e970109445a58077664136392fba1756b28a98576f4a6dba24c19695a5b7a092d6aee83678ac802e48a785b7973b0cec73cfde3c755d8e6a29da5aeb45da94896e8ebdbaf8b22042cf1ddc4ec24f437d9a29bcbeb851a3efced101ba9492574aca98d450bc475000001bc0000009066ba62c480fa8fa8e997d67460ac659594e5acf3ab7f39efbc73ec56a925253858ec11890572625f66e1718856dc34a6773d912465997eb923f2b0951238e77844043fd70e967edb63a3b5d657069c4e04670858748c1dcb6efecf0faf92124b97f0a73eff226715b0911a5180dd708d0a0d072bb2d7c2dc29c1ba30e89d0caf40ce7d9badf83d0894c347a12cfd695400000090b70a4068ec9a281b1cb28c85b9a57aa39cb39f1ba8475b196d569053c09d179ed7bcc57f2438e66f4a6ffa160969df973444f04ee871d5f8ce80c5a2ab783e3ab7b042167205cd81e5fa466475c7ed94027f19cf3771b52de1930b26273d84392378e19362ce087519ed6514233c929b1793f7e258ef1d8b4d8d8071cf18cbb4e6141ed183600c67a5be242acdca3b86000000907baea0cd6b76df2d47201f6c7257e915ad7dadc9e1eaed8859c68c1e885467e0f7dc9a2b6b0069305064b274e55bfdd3ad5683188b423792b6ee485ce0acec288f4473db8e1407187e3b883cda868da32ebcb8e0e56e36d94a5cd04ac5fc3d52dae466abc23da47d6bdc5b73800bfb760ccb9ee2e47ee6dbf512638ed0d110040202fb7e0d20c91237a4f76c922367eb000001bc00000090435a77aa1a5067c65b865b0f099098e369bc09b7466096ea97ecd5c7dc5858eb45defaaf2989274121a0f534f88191da4d3aa801fc7fc1bdd5bc0d262b1e0f37ec62db78889a90ac6671ea990ca4f89e1be694df56aff7af48c2432503efdb1f455885e0ab1f44feb1739d7e0b0b99972af3d27c0af462ad11773ba13816873ff68703bba334da82b1d20df328e821bf000000901e55e15903dcfce5122f315ee3a694608528aff4bdd9f73a8b229cf87f709a78cad350984e664b84e19cda7bb635a50cbc1a6cd07011ca9b17735398c44133b8c723323f1b2e423fb9d63e074e4afe210f479d2da95001a0e0c14bcfafb39095ba68a06bb54c11b4cd4322b7a9dac8471dd5a4fe081c21ba23c3ea6f38f900f03144a15654dadd90c6df53ffc4e9879000000090e6f7127c8ca00dd089998aaceb95832f9f6fbb317287e7d91e09f11ae8a616b0d5c1093463c3ec28ab7b9de0d78cf306c48fc0e35c725a42daf1259484f06d0d0994aedafc7e79bef6d8a14cb835a8af282a5b621c67d4d51ccec78db510f0ab6a70f33d17ec8ade77d45cc2323d0b5a1dc842e9ee6d1fcec7b59dc1957bf7a54d7bb64e7e5913486a186bfb733e5623000001bc000000900daed9b24c8808de6caa0ce94faf29b0161f52a6b6e753d60a6de14382e5543d4f548d163944f4763b35585ade6fbd461d2212fe452779b7080649631d08da65bd450235e95b009e82e7a0ec6f83b2a025570d446fec4fa9ef7931ff02d8268db614e2bd39bbefe1f1cafc27d02b72301262660cf9a50142a90777fe870e5fbe216b736a1626ca98bacec9cce71b40e90000009016a3a084d4db5e21a9ddb2fa8ea6bbf3d1c8a047ccd7299d7dce8b2965a40639f54524e4708c8f3c6b3d68b965b198056691e411132ad001a5c3f3e47b2cb79a792611ce383e4ed6fe76a980141c68462c1de6452357d4cacf986f010f75538916b9b3f6226661a550bcf45c1643b5ab26aee38d8a240740d17b64983c3a697f372162591f9cba336795ff6e771dfd31000000901832177024c659e403875cd3fb6c9b284abb411bbfa9fbe8f92d0fcb55181837c651d9bab72e4a70319f6719ddb9b8de4d0a1f55b2f0bee04ffc2e2adb30fc52d5e85ffbb3571f79ced6ea4c2a01acb50a5149334461de2636c59da982066b918d2beea8b4cb6e4ac43d8b0db00e6a1f04d9efd02aa25814d4aee406a81b6d476a8b0a41d118eac19714a51df358b9d6000001bc00000090a3f3f06a4a96bb9202a1b3f1907abac5bba7f78117ff9b1aed42fb43b1cbaa4b6562f7089868c0b1e434bd36f2dfad77db1b249eed235be3091c20382cb1b1d679458fb695fcd9de0b40454f4f31e24f0b6766b52e095f579bf859ccba46e0b9141ad9a5e2deb486a8e4b69e57e1ac351c40a85b3d32a46f41c366080204cb90c11a2a4f69318317c1339e1339baed730000009079bf57fd182085d21ff68c3cd140c7175c02d3bb3a629f524401ba84dd20456591632f6653b297cacec14710a34b96833e134d848d1ff827ec7071ae67d7fdba4e7c38b23b1eb354730b23f26c47c1f31e35bf639491ed74a38ce136cf075f9322c1714d7f1d0f54d69309e575f4fe061db552b171f53f1efa8656c0e7d6cf6e615a22c666cb36fbee3a5e50fafbc5fc00000090c5a6ef430fe31e17b99f59245e6a6579d1b754ceec9ff1c517895c18d50736b0aa71b234d25be15ff15d3d4c72f153b4c89ae1a2fb6abce065f3aa1bea6a7310ec52904a93230ed524dc4f145361fb28299b9316d827939971374540bee274ec875613b759be66d9edd3339d6cca30620e06f233bad277a812eebcbe491003ceee38e0759815bb0c02176bfe12d63a3a00000e00000001bc00000090dbd592781428d455ed39dc0a07b9ef4ccf58122cb55c07417d0939db32f1866ea0ad8ad899923219cc8db4bcdf752ef90945ae69d0d6a5955cb26e761c2df9f0c414a579f681023f5e83be5e7fa190fb127c3babc53a4cc2dd852580d269d46d21914494e25acf5d3375e0086d5a97c309bd8e92370b80453715cda7cc900ef6efaf62118c4cf5bd7825a173e7e609b00000009066525a088ff7c589c94eeae66f8fc9f087b188fb791f53a5c817550b579a936ba0ae9ea3fc068e776c07ffc0bd3e0593cc82944b3b8ad5cf56c5fcde9db94845e2b04e642c0f7bc247619f69f2660e1921f7ffdb11a80108f64640c810e1e12f1ee907f247b47cf7a183030f3b8307140dbb5ab35f8638c1eb82168428deb529505dd969034f149271a54e1b2eca53770000009040c4b147cc2db994b92ff6eaf08902bb22decace8884a9106c10acb1e96222a7a250f775e3ee8f5829d89fd2d138e03fb5265ec0dbecd7c6dc549b80e1ff76f9d5f8aed45c6f3d370ebf6fe146ee7e130e24ab11e5a2533106fc6d294cf6fbebcac388841cd501264ff7016f0ae299902f2eade2fc2ae7effa8b967e7b5d6b98d83eacd391786d17d257916cb0452948000001bc00000090a2f86a906afe230c158387a588576e4ba5041c43217e5b5f8649a87a73775a3452bc3bf4e21757e53ffeec78be7359eae072956c5e635dfbe3d3e476c958cc89a22e26f5439e9481cf634aa107588f8c11e8fad4739babd855402dfa419e08b030d289d39a45d3cc7b1a865b6115e71f1068eef4671c2f7aacf48acc527df9944b52bdb870b3e9204bc8698754f35f9b00000090a19f37ea68c8eae603f92aafdae814f19be15ca223658a00ebbf284e22ccddc90219b78f162ae17727283c2869d4a1cd39a1fd7434d0671e840700764fab02a023805fe8c7b9eee4e445a63e90f1f400079f383bdb6b0c6257239de9f49fc98c77ca46a5f25a7906345ac830bc5d0c532c5ad56c4ec7c977c39cb3e42a0077d6eb99180704f7249706324c3e3b79760d00000090081a6685395e9c95e121c4684fdd7b01f44d3efd15c56f303e3b7be13797d3b0fe79ff63de67d0c0d97e26ac6461adb3feeb2b4904d2b7b84635e9666c94a3ad2a02f237e0cfed044c5a09b9b65d2e3d0a828adb37d6b23ecc03eb74e2b25c71282f9710a575907c783266b634f5bf3a07453fd656891e21f0e2d2e290a8a82a2a0e5082c7c760ac6a2f5752a74d538b000001bc0000009038865ca967ca89cf35550d25f27c55e440803f4f8a75113addb9c1561c2ba9c81d0bfadbb84e494131ae3047155080ee1d21de792436f33931bb1a699f30c8175a52d9883c8292c6b724ad9867f7cc95295e8c7dbf2f37a76a8052f0ba31a3ee4a658b34359a18ce2104030f878d6b471ffe04e5f74ef661784940d2090c5f134efc1248966629ce8c8411713d1200c30000009023ffd451a6cfc3f4ac36e52f5f312d48704c6929e2ac77405207c24fe1c6e3c291ba592b72614e64f0478f22abf9e25258c7d8f8c992ddc11c991ede410dc14aff4502ce53a0c4c055cfc8151cd96e6306e686af7a3ae7a36c0e977f993a447b87b1cc367d878aea89324e2a3ca398070598b8829da2a2d244e4783d7c1690a9ca4b23528d687cbee85727608ff09351000000900efeb2408af27136ae0e7958dfcd539495df3ce594047c02595a16e38c702a19f2de7ba30b62c2f14a24f29641e2a09c6dba588540caf306ce1bda730fffa5c75d7395e29d2fc222f1705d00de7a19912f2caaace096cd2c6c6a7e7d7c964ae9917563b70a02fdb678a1407c734e4b180a34d98d64cfe0b946598ce5b569fd79656b98a4c87b0700edc1c64ad7d6dbcf000001bc00000090e5fd3c365b22326ea5c0a5dc9f19a996922f7d49aa7313382808187bc060c5b2e015d9b65e23f837dabf320de7e523d0eec069eaac4b1b6850dfa41bd9636caada69d6f42e75eb17fafbb85fdac13db006c1c9bf8f8b254847c18c8e6db06233879d57a21d420dc3593883287540b2cd09e887a6b83d313cd4c68056169e1b7a1db4897cbcae8604fadd6043d904b78c000000906e60255a6adc6580bfd9781f620f4cd13b5c681e9eec066e60b5d785ea84a96a234991ec5d3a57fc0e514e35997e2285ad8074827dce5fd0e782b21f442d353ab072a5d5d2366c3938f1f45f6ce3334f18bd29ef0d97844498c73a72929b72766270cab01c339b412c7832022cd6fa3621729a1a65fc36a97b929bbf4f70ef03aade5df05984a381a6bb62423d9648910000009045a199afa36beb3a48d8a261c43be660020d24d8265aae53155c27b41a4af7780db55020f443c91453ba6a859feaf41c9213db991708737f96a117082e0394b0e1088881d99897226f4dc6038a8fe76f21672acd1a17cfecc99eee359973d6cf8b2a283b5b1b9d27c38c18ce6c232e381fff33e9693fe839214d25ccdcf1894e961cd47c26b5fd5b771886f11db2c228000001bc00000090c43ebc23510738502cc9d8d299fc6478ea4c47a64c4aee16c5e14acc4fe5bf0009bf12f5983cbe03001a26b6e94514fd8101af523a444553ae827d173648e4c8638ad55aca067312a233e0e5ae916bed23a2e29585e3934a321fa483fb663b4f99a8bb77d03a9b02b78e76cb73dd3f0e0837d389463f82a99d5fa64bb66a9508378165f6fe212ad61e7f8483dd56071900000090e4b084e5bbb7b4a8a915e501839417eaf2dd878778adc46a68bfb88e6cd4d2121b1855b46ac48f6046035159b8d3d52359baa8d9f8d6287f270affcd3de3f2ce287e2f8bd8011d102a236cb0bcbb8a3d0e4d309c502ba8bf058660cb96ceb24458043a9db9fff459631458c5556d38e51ebc921f1bf61d44ddc3708ee2e8f5bdbd63c290b7eaa4927d62154937e2bbb600000090f1b36fa8ee796d9caebda6e71962013059ef50b948e189bebc9cd8fdb7735d12cb2d06fc04c037ecfc9b2d25ea08c466bad41d97c2aa5afadd681fffd498d8f12c489bee322d45dfdf1dd372a5e99fa2104c4b82a0c8c1f636fa057d6af53e29c3b232a4b5808759ba4e6b75a58e77322acf78e038a4f93f8f27432abb0deacca30d89d4bc91f9548c699f2ba7f96d74000001bc00000090f1f30b1b3dea88a07f9a0d1e1460a44f2b108b8abb26e585667a903e76f611e4948bc961565171240a0597707a8794c3420ee472d183a524f15ce18d74e6bb7d5f6cf2760f947b5d09c1f50e7f2da577037302b7bc609c1a4695e05a5de05edb1897eba85ac8a1fd7dfc65a62ea5e9162caa7d34f0291a203141e491107bc25ce569aafd1efa5bae2888eae628942556000000907d03856941a006bf1f744b79788b7a0b10b5cae5bf12607544a0cf92d2893db19c3db72a259e653e30e350c80fe1e3c75f0cacf10be1cc93ccc8ee4929f4e13ac333a65c8de2dd8e977b7b65f31a6c38231fdc667d127e71a70dfb8b367549b088fca435214f93e14702a5c66b3ed55f09a1a72e07643cfe14404cf368a89052c537242bae76d558a4c8d3e9df5d0a220000009036b041e9620bd12e9df593848a0a04053bdd55cb2db4ce8cf01fd8c76d893241e2900b56bf981a650eaafe652c08e677ead0d6e9d2c00ea65f830f458f18a2f20222fc7701fdc7e1575f01d78a6f654f21f23148cd71e58956dd66263dcbec384d76fddcb46d7666ad05f078776df83a1c1335155258e399211a697582e753ffac410e0ae79647174e62b01609a5f8fd000001bc00000090cf68f9df45aac4e7f963f64a78793d1528e164bbeb92a5d20e1b1a057902a906760dab6160d43511bb6fcefdd10bd9bf7262d121240c6fd13b55cda7c41f9a96acd8b39325a4b45d892fec8b707194b3266c85a95edd0aeb9e54cdc8f96fe8307b70b0c69b1b6a2221f6718f05c8dc2128ff75437af4ea76e2229be1d6b4c2d90488c1399ff687909a53fe61ad2a6b460000009098ffb40f8c4edf5e8215483c482b55d32228948e988e2447a773a5c98edc009d6b19741770908a1d8cb32a5b21cf3d2b557d6e0a808398176f6ce2a60730eb992e794d57863359b7e0b5874a73e78cc40e0613e88d9014fb9076f12c387655f1127c2e66a94657bb07df8091ea93165b1b0a72d2d55a520004f56c6a780b92633a8dafe39e0fa16c3db586280df813a200000090f6873fe2138107349532a2fec977c59df9569c490f36d663b77973853261a18f8a759e64447e95008398f3ac3ff24b3de15fe53b059299e940bf9cf032dd748a74ca086559ed1da57191f92e2294bc55013fa4a82b64528c590f2dae6683ae4cf53b23efd2a5e758e03d8b31ece815b01974b5163801bbd93869933afe723c7b7e969659a83a30846e3e9487da54dde0000001bc000000905bdfa911b84b587f383d54c009677b2e7325b51c6630acb3002dc8675b67f3a0136323bc91f1d349a544ec4997315089c9c62b6aaeead058e2b05d20a5c0208148bc2702f2eb83cb3fe5e13e2d3bd56502114269970ed0c8e37210609aa10058b8e8d2b2581450390c69512908c95d4a08fa3134fc3e3924f3eed4924d18efcdf5b78b750425245115f379ef1a5cb6b8000000908786f914d1d57927e98c0b81839b4dd874ca2faba27ad7fea64ee53e9ea40336b77c8d0bb664bd50fbc772879cd50bebacc6884dc46bc956df2f0f6427e7a9e61f8c65bf240bc009e1590bc5a42966b9199fb47e1a1940e75b3fa788054ad501e6ee55df308778f20f005608edd6715a00f78529fe00f27b0dd6a331ad8eb421c6d1b4fa9c509d0d83b08b752dc1789e0000009098f1cc4efeb0223b0a9dc2519d7cd2129372286f8dff3f166ccc021bc108e16693843a031d69556329c8c92896e8b19280358d4737965acc74d2979b5977571493e9eeddf567671feca0903fcc71e88f210f93a807bee40f0a26dc79a326c68a81bf4b6c70078b70eeea437ed2eba1b9201ff4356e502ccb68e406e3c39bf0768165fa75195e523acc7e38dd74589a7d00000e00000001bc00000090cce9d87a1a3f39d3d328d1b9cdab679ff43102ba3266ac6651c893dc27b953d68e6642f5d907a7f9619643fc31733c0d42bdc7c5cb40fd7c640bf0cf8aa7dbe823547212442de4eca49cfd32d158f1751c50e6c2214b43a84a562b70ca69182c4cd5e23cf60596bd6b573742cad39ce6162c5f88172f144ca967ff265e10db46939134a34f51b9ac8cffa73f5f5b033400000090c8a8828e8ceefdd4d3240b7d98363f286f5a5b4d5005eae09e3a572dd7ed4909f76dc65675e4cc693a102a9b9ebac9b9daf50d9682132ecd2db484d14d835913d942e36d60759c55204b3f0d4d60370d0bef6cd6727ecee639f2774d4e8c2ba90021b1129591e9282ac01c9ea89136701fbd937e7fed39b2a66d1221d8bc9dd86e83b3fcce73544c237b6d26100f07c3000000906cbc0e36409a0d5a7860f484ae9432881250d1f07f5f490e358dc8280ad21de7d7880102c1ddc3c129e3d88857b04f0bf0ad962f1e0afc94e66637234e567fa8567774d74b8aba48536c89de4bbeb2091e8e5b05e99fba07aa4d3b06a58df8d17113ef48e320b39b58c0b5c1a88b31701c1210c03ffc54b4284c84ff319f649e20e4cacbf220a04afaa9e8d56e6b0533000001bc00000090a3a4c4cd9264e8adb53b1db7d5cff25e47f5d0cdf1572d9f4c9b8807dff3ae2ecab2bff9f2f8d039a956b789945a3a273d527a64661effb45b111ff286986402b6c7636a24d24938cf168d544fbe9a21278ea96d43d07535b77a0b743fe8933cb1e2c2ee72f576c8b3b0cb233118671b2df70659501dadc6310dbe7cd7b40855d4c2fd90415bb1b5ecbc7bbce3b2124a00000090cfa70b1a20378939334ce8635732c6710849073e6246d026a3bab1b77815cfeb9c21e4ef75668b8eb9c155134d19c35210dd54b7e161bf6db27868dc8b403aace16cd81a44f9f0e67b3aa4a5191f2a4d07ba853e5bdb2ba5e1105ebd92b5e78f5b33ec0096928673a96d47fb5ff4a94d2d5c03ad9ae04548b47ce472cd43c72820bbb574a28c41e46076a8ae7c32fced000000904fd16a18080b540a0205836c75d7bbb808c46cba1a56136a3ad4e4a0755a1d4170b13b70c65b2554b78ab68dec8c29129e977e75ab905086a65c48369da7542f625c0bc60b48dd11196a252626c787471eabe965ab5b3b6253451ad3ab8fb1d014642d949e00381375233f7f3ca42c6f202c037673938d7b2a444e8851fc6acc8c003f101461c3d6a69d2c8f13108895000001bc00000090186f6f09ae419a715dd70824fc8ae27bb97263d34452cdd819de11ff473e5c6c6eb39e5d23ca56be9b8ac3137475509bc5e6b66d956d3006bd8d6301ae994bd91759264dbbe99f86463073a32329308f2f2c4f47cee9fbc9c4eeb852a7cf59fdac80c11cf4797683af5b2d17178c7562138322cd7279397b66e0a70ccea7d3f972ba676eb9780fca53ba97ac00afd284000000908502ca2631a9ed3866618251aa67e6638979435f627bd143d416f7923608f47675ceacde229ecfa719edf0970862116ebbcdca48b65b41cb8933d9932757ceec21ea9edecbc2cb7071981f3583456b200b3502dca0b7abec81f86847ba29adc0ead534cbec6559ecfe23755eec3eb55018c5bc485c4da0ece2cb70a225e431a56b581da559fde1d54d4007889d0120f400000090da7dd9e98cd55538f1f524e3f807647719cddbf2ab303912a431ef953706f8d2300fe0ba8670e321b311fe42a39f32dd27083d4f3774cb71687f62dd05399e38f7bea8b6874b5111223353e515d484e126c01fd2a55fa17119c04749aad4d8513184fc7be79150b525075a6cb92999630c62a0a53d615e78a068e1e7b53081c0eeae206b4346c11cfbe062606ae066de000001bc000000904a7db38800f51e278093de082b9f7af9d9c03366a3fa38062f1871d2f72e6a3965cb25c30c869eec5239757da7c91ef7cab96ffcdfd7517b9eb74fe57ca61654b14388dbcda69a74a255a32db259a61110598e0e1cf5f027e539f080736c4da310c17050b8ca200088cee055fcae41f00d449e6ba7713c923fd78c816c87bd9bbfb103870a268a290bd92077a3cd95dd000000907a10299f4454d75b99fc1e996feb1403d7aad5bb4cd54286a09e5b48fa1bb40487a8947512475ffbac9498cf658e04a18b17592cd2078abfb5a51309b7b55bab91c7eb0797e8ac4ba984643002cdb24a09fe6d95c5dbf4c74e49dd645989ad685adacd6c3e73527181cf8a87421e0e2400b010858cb15981866a51fe0f0ad3790c7620c8cc09e2e14403009a630512d3000000900e324ebe3e1b3480b1bd5557ba407dd932b3433e2c4dc7ac50c1d6f11e11151e0594eba6b495fe92e70c4ac09f7bc2662b665962a2fff87a6313bfd1aa34466523720c771b0b7ee1c6de4a508984ef8e2c0d1bf2a4038c2c65c98e5d81b03e53bd5e3bf464c7502cb9dbebacf0f7d5041caabba854b65f3e8169c8678f279519a52f67f65ce9b3fd96cd57bdd911b7d1000001bc000000907b9211d9d748905a18a500eb6a6d6d1fb44cd87fd1c579fa7b3f2ae93ed67c4ef2c5f3090221bea2e2408f628379e2ab6841e4d573c7b0420b1d3da415cd15cbace56965f636050af3674fedf039bdb11c27a3900ad2c68dfa29dc96e5bc82cdab80bb39492a42111d27f1a3a2a80f37247ad11635dce04aa7e465e8c289906ae93e4b78acbdb83b8b8a63ea4aa27d8f00000090292512d8e7a449f67575e74127cc7a680e3561bff95c93e7ebf974d8c20ec23a13fe7a484537aae82ff1201ffee3ac73db8838dde0c843e0c9d528843a52c1e3f9d90427ea37a98e3e938898e9561b2d2423f204c10ad656cf160221081dbeb94a8b2ce0087c671d3b34c8a1e8dd0fa2094a5ac25ca6969e4eda160abcd6859ecc1b6f390d122d79113ef7e47cc5044900000090774384db97344aa33373b85fc5223d79385b630069f16683c497040cbf66e77b07490d72577ed5536547d7b6f9674591511f5b09e6ac88dfec761e7ec0211eb12fa4215f3645d60e9a846bee6be5e9530909469351cc8d33b081c4851c9ce9c021c7f5158767f80bae36615b21950194108a4389ad0ee603ac8865d4ad008568f5e6b823e79f6bc1b2e7eb7c66488ff6000001bc000000908e11951f7670aaefc054a27dc47323825b1cfa85f029306d29ad85c700fba8e18f151752fde95a490c62619b15067f66e0f8c96ec0da407a72607314877bee52c0a5a0c2fa5746b0d7b03ee9ca70507c128b1fd0a65a2b6fbfd87bb47f2da6c8b65376e3d4a25cad7eab946eeb3c463b1ae8d324739ba34749077c05c5d9246c65eab93c820bbf1887c31a0393ec3a5500000090b26243b1a62cb42e7847750990c2ef643f973b274378e21110ba922e1bf4de8fe7aec6f7f3d5229b4d711a505d4e569ef39c49844ec831a7db08c521e5f3050afe8110a40feadef8e0f7b3f5cdd8a06502d20883f0066bb7c3f5ffa522b7219e9c66eaecb97933213b0083f7f9d92e8b12b2765a4032554fedda5fe2635835f4d592f3b725852ff4015dc50dc089a9010000009019978bf34c085b4048d3bb215016ee70502114d7969f79550714b3776004eef96f42af2a275392364f4c44b07d65ce2200a654967ed504fee1ca30b3b24b429bd83a3f1ec155e6f3f550227fc568a4480eca115ecd27d94cf5e0340928946ec64db158dfec8a39dc47186afface68dac2aa91f4b412093409527d198cb62f1204a3516ce45ad0a325114adbe077c393e000001bc000000900fcb8f6b2a7edd9aca0dacd25918287fc58c9301234ccdbeea6e2c98efa1f4a081d99a19c81f9cf19c56317621fa5315409418b7261c797b458aac42af072cbcdcae95a2cdd9c256ebb355f05511e13b05654e468daf33e0c0ff921a4e5e98a83a3308a3a7e9df2569f6bb0869b9d6fa22b28708f4ff3eaaf7fb55dcb2baef83d046175f3d6b916bb5fb40c2ac55beae00000090b9cbf40833a7b278a00069ad6b1475dfe79d938950e4a79ced292beb450104066013e8380a643a9e11a41c86733b1b70c8bed1c8581cb6eb0d7c1b999c9da9b2651a6a1e986985c5713b252e8162043e1276ab664fd7f43e70a4fe4acd42fafed60d6cab69c49b16712bcadadfb0d22b12f145c5126cd1ff0eefbe5f8012adb565e190e86877b30053f34a9881af104d0000009045e78bd61ff3a6652036ae5e6c94584e4abfef252784e0c359aca3ee9ccde85fa8475edb4db2b588ce4d84d11d5e75edfc1fbff5e00bb1b947cd091eaca9cb62ae079f01f9bfb031a0419e46835cffe801802a1dda6fdc033195506f8501910acb44b98b5a5bd57c7281aae0c1f9d6c608b0483fd957398863e9d28d626fb1e35443d7e73caf2a4cadd9e934b6e237da000001bc000000901e07a96bd0419cb16bbb58afc41771dc1d21dac0147ab6d572567994b47198339f1e9224e733443eeaa653386b0694e0aff27562b8d9a9c28655c83e3f04d120efd11e3bb0d5491928ef382eea2427340a1d92e5f2a95315116aff23f783db3c776bce2b9d743a311b9db73696f456d402c7357569195471b065ffffd83a82334f24804ce5dfdd1be66c8d21714579620000009080dfcc8f7e455573b0f74ed0ecd7940c82734165110682467f4c4d5b5babf58bec1d23c69081d420397adecfee162fec22c88ebd33486a6aab4b30c9ed286bf7120f738e909db885b3261dd0c52d4bd31b8bf9bda64a5cbf1abd28db88b54bb2020d81f61ea868ddb41f002b5fecf72c2fee9dcc397605bde2d6491999305621a25cc501fd69caf4853945d87ad632db00000090a7fe1c9131a8009cbb5f8489995203ed56a673d999adc927668ccf9a1f21ebd2b7925d626dfab08f1ea375c139be0302f3dec1992e5545926cae1802c8a3b274f871296490e6eda05694ab7e5711c2c41c67654ca899137262ba90100be34e70cfede7874b240747f52149523c9c43ae09f5b7d45898d8cf3f13ec6edc79f324229d6bc8b6bad960251a774691154b5500000e00000001bc0000009050bddb89806c6d371adae059837278d20302ed4034421923ea862538112e31c6388dddd755f9ec9c076258dc83b84f5c8c683f1a83c7ae04d1723f094f751ad7adab8471c39681f6e5750e41dd37c0d929eb37b28ac642bfca4a5eda6ac1da2bc8a0297b9c0ae62b91f229d54eb21ab20ce76da753ad2b6206798cd64ece1ef23ec7bd050f07f24443c600f39b233ede0000009018cac018070a49a2e3f210338aeb63bc956831c022f19196e684c576455938ce88fc96b0639dd026160467daf4cf174243b3cd38e7de7a2385a42408ac91974d49bd58a544e5644b4f215c0ca76341cb15cf8311882fb02fd13665d2a3de7ddefbbd402795ba9907e48e1711440497830cb16746b0a566214dcf6c313a5c7233565b4f58a97f1640fb055c8a88a0a1a200000090b0f011a48c51a5163271f275bfaa54dd92507db9814793495b43590ab83b4b9bf39091fdee8afa438010a09c747e6f90ba9a31be6e9fdfcd66694511e816c097e8c9288d762edd82233ac6adf3cab59d18f7d1b71e8cff0b9ae7ff0ddc9d9e905236e5ba77876319dc3fde6eb611497a052f07bfe5d634ce1226eb49d1b087531387e7a7f76310c3db56f4e36aab954c000001bc0000009038c6e9887e83979ac3592844e1f292b2d5fc6c7044d5cd697b25c1ae62871ebfded8c6ca7974175545af8337d6a0a250334732a96a6682ea353edfc703a6d18d9c08f4a5c82c48bd983f4f2803c29a41276c2bbc3d6a0bc1dc36e32981de4363352d7f37628ee4c89c2b7bb1126068d82bd301d72a01d7d40757d37207cf8ee5c3f0f838dae508d5710ca510e8e6e95f00000090fa390b3c91805e660e73455231c9c14aacc5d89dafe67a4a8102cfaa6d98a2e1448e5ac6e9e96ff4e6f7c68132cdbd24f0acf7eb757b09c9bd42e850709f3aab441deff33d47d1dec941533a8fb7548d14d209ec6cea7ba1abe32a872ebe0661c35450492fddaab8158fc122225aa87500dad62e0f054dc361382f6390320c194440980eb54e15c79ad74510ff5517b50000009042dbda4df1899ba1021fb0b4d8c7df52ea339e849393bc85e1235ce79e9f16842b3756848d62299374ec2797305c1df4bd8aab5078be5f15d45f29350bfe1e639d9d2daa7bb4f6665c3fcd61ea8d3303023c4434002fe0687b995d775d2b9d5c920d6ac9763819a7c446de39f3aee3930aa6326ade19b7ff95a97a075db0583480862671eef1d5702b70f253345209c5000001bc000000907767e6fa5e52d4a8cc42952b523b33150245f3ec7806210ac990fcf39c5148e73e04beab8076e804d28e8a10cb4957e534538f751e1145b170e09ffcf409ea9e1378c0f3fe7923f24568605007d194a40419e53487bd072cb5363fd01c1d81a4ca6fef8cc9368a3ca17536c16443d28a0784fc56d85cee15131d0c054507f19b2c456626dd316d10bcc4764fe5802e7b000000907c80f7661b245f02bd3e5b605cdda50576e764ad374c12662d9893df3326634775b52b89a6488f3fa79100deab6eb5ff0444f32b1aa6759951b53e2b2b8cbac8b237dce13f3310e8a0ced3e021149ab8247911bcc390dee7bab5b0e8717eca05c149facbd4564554ccec881cccda04b301fc252967dee15cd0341a1c59b564224bdf98dd924625b394d7e61cf4a82178000000903de2a43bd8b8575aa7f5a73fd07bacfe1319b25cf3b58cff9b790bd460ca0d461181320458f35bf7def65f92e6a6c6ecb7ad47c590cca136cf0937fdfc049b8f77e77c609abb514a84b9be2f5f80097c2c1c6ac7340bb7c1cc4364a0f2306d2994b1fe09bb3a5bf22ba092d649a6e96f228e22d42b96235600d29c7f278f3129c0032c914df37df4033c31df3e4b8d1b000001bc000000907956f8c61a02c25812e8e3bd46ad37ad0b12bfa7155631a82a5e40574124e32ee4bb8447f2c7a642dab4fcf2b8b69fe7dc765e3746fcff466f8c86e61951b9b8c4d8c0543e6e2c2989c2a49bac0156f104a1562121d375ff3f800b4a36e7935962afd9c62d888774817e861ef353ad1a283ecc5bbb3b2a4e6c7b065620dffab7f2256039e7848d98620f7b6c3e9837100000009034c3b89d6064f9e51847c078742f955e2806343e19d8c4bb25135d5bf041a912b2de8fc2e7c6a5758969b88853a3031046698c379b1f169908ca1f993da6beeb27e23349820392a526efb286244ef5672494a4583e203976caa8f585ae175324a31f08115a1a895248203a323f2e8f6916301dc1f74ef24ac61bcbe4e224c2efddee19f87d221c314bddbda864a96c7e0000009037a6820a9758099dad8e3e32aa4b97f47ff62c8c193ccb519cc51265d2311e1d8b2330b094ec1c700b5e5a21437111f296ec6e16d34fe2f1a93219341e5b514f8fb5cabd840e5a88b58d4004065741f00c3551e0510d7ef3124fc69017952b70c265fa3514a92c278d0bd18ec88d008a2b90ff717be49fc26060fbb946dce6e1755861b46bc3e74462915dc878f79e19000001bc00000090ff8be2e57edec27485d3666dff0ee490962f2257eacf3638cc44a08333063526d42133196bdaff2c41ac73b8135e6ac5db29320af7149f8ce575930e8464dcc6610f93d26cbaab23618d052fb5a40b6d2a38d7106bc74563f889ba5353e4c5b2d1c7dc61ebea76d1460f352bf46d220e138b578aed2efccfc0287fecc1e2ca4edc9b656c59fe28d3f38f50e13c062ead00000090a81a22e099652a1b95eebab9167c1037f51757734664209dc166c564201bcb7eb8f2e23b1ba452500cc767c24ce993f48bda3a083216d6bbcfebe54167636513e0df3847bd292f4c2a4354f7ce1c32e10257789c196e2fd929c6a8fd916a86ec6df4286d2fb59215ee37eba102e2affe1329b912a4787c3f185b10f03d74cfd57f658bc4ec2de4a8566a8c0406c3901c00000090e9fbb5a34e89b20d7fbe560f945218d2166b624aee3a42fafb10bcb7dc9dbdeb58feb0d8cd51bb4fb1c77ce29eb556224b226fbe831b3432ff25e9e88ac5cdcac32239058ea46965483a0e9da48a022824383480c04a3c062dc801921c364a0ab0a46692654cd96bfef8c10f8c9d0d3e14934c1f33b543219b68f5d810c886314625b4c44dd85bda0dac8a14d932bb3a000001bc000000908470eb0b1f63032a6fec1fc5982285acf6676db3edb403f62780c2169876ccae974a1f1377148773daae76afaecc0c2d19dfc1f0a647ae3fdb632c88c2888332f4f8f8ae1b4731da08c8a94dc0e37a6505e0722d5111b362f15c3f3b637f52af2d0a3382726cc5b7a369de69429a27452eb2c07d46954ad6dec05c5d103b12a21fbb16b896b605178211986479777c7600000090d70fffde576fdc6dbe3a89182758b8254df6d4a0667154f6ef37b624fc1e82f7713971605390155e1f3a8f7bc0382ea1ea0cd2c66d51bea3dba5911918807f13a06224a2979cea0f5011c8ba4f4dabca082d87d7a9ccd3ac16714ca9381c2995b047a61fabe79f5437ad43c7e7c75d56061f8274a7f62f3fddcdd338fb39a1427308e72e5666fe1d2932763a9733b0b2000000903986f85ad1eebc1a7d14c6926d9476e474caff2ef2728a5d090ff9bd6c9a1e686f342c01656552c7740fad5512294afbd87532a709c934465fa53e6f63827c933ca8ad09c474bf3419f8336a483e38c513a8b1075e244814c3a5fb32d0c66399ea37e850e9789df63113cd76090343b71113f9e6c230b989c617aa38e741b25ea2ed75a0069a72188286b350e986c9c2000001bc000000906621f0b3d2c51329c50912430167717bdae7f1534dca7a9b63c0f16b53737640d18ac00e3231eca8d1fa712413b473d10795ba37c4acaf2f21f294ae611be7bfaba43a43a2949088cfdd5163e249774521e05fc2f65bbc60d43d95ac1a1671eff974307a54d6b7a87d050c92f7df112d0453c270451af89c462c9ebe5fe85f8e4d924ec6f6ff06a1f03c9f7b5dd2944e00000090178eb040c11f4ed2d2370a7843c5c5ca43250c0d6cff6b29d0b38ee2415322295aad0c2930ae600d35473ec4a0abd758d9aa01280b8b6f57fc00c0d88629b374743a5f2d37a96e56025ee60c6241782c02626d50cdf76651d1ce9ea774fdadb162ec67def5e30cded3a21d82600db29304a52079fd3ad18637b6171f21bff14f7e0fddb1266c78858ce863cc09e7ee2700000090d55f7d2c49bd970382e2749d0377210390e54b4fc00017a69a010e946e917fffafb211c46629ab22dfac113c5b8c2b21996e94f8254fc4b05d6e041bb55b022872e3243749f70706db3e43b42e4f7403175b9464d1821ba89eb5fcd98e6ef5bcbb6875f36833e6b250e8a0fd1f28eb6d1bd60458e36af25114af9bea7d3c655b3e4cfae23db5693635787f935c0686ce000001bc000000906db13c491fc66f1f2a0b0e987b08af5cf23edb15268ba7cf011568b2aaf47ec599c9a3a3ba79c5fff0a904d678f0aad02ca4f1d0cb0dc76c510161d0756fd27a20a0c3f417d0ac2ff4d8ec36fe14220204780853d3e671f1e69e66c0f8d9278c3fb5e60ce9fb8afad7202ca83e11209b27fa57bfab38c2bd342c1d5e8a3fd2c0bcf296450df7d50efe94f10e3a6c0da50000009031e13c8501de1867d9626afb8d730f170acbdb25c69473e2e338711f3af30d50ec3aad4ed0ea9346c05fb516068aa58ff98b9daf4c1f50b587d1d88a11f3d10f2e26aca82830974ad6c3d47c3d00714e059f17fda8cf86556c3d8c603b130faf6d84393e366e60bfc850ad8c806e39981140efb21b69ee915eddb092f6547b71ba594618f4ad8c56579604284ca0d23400000090cfdadb6b817b179cbbe5922525fc89af0973dfc73cae4006f0740f2bc814b1ffcd0956c526cc5d4f2ba7c1dc407a1546d002ed4ac30fe71761cdd39f01861b2908ca2b423b548fcab9832f6c561bc03d0b281b3bece1250be5005ec1eb757354719cc7ec761c6c7ae07f362ad90e80491e304007bb9b3a7dd58d00081dd5a2feca95043e85649db7ddab194b695b925d000033a000000ce400000128000000909f8f0e6ace9a2c85b0e1c6837bfe9bdfcfdf641a7a262f3864f4399e80cf08b40ac2cb0dcaebda977e10142fd70904fba55dadc1ecc12bbcf26e01ec54e69e6ea74628f27dd9c70a3e1611d284f8c42110d69d794fa40fc49e2cc697a80a45abef25d0b021dfae3b78bfbd4dd670240c11c71cc314c33edeb103e2b459d6f9e0a4b3f601e3ce90e0bb15f2d1c502ef5300000090b23e3e3687dda79a91b4fb8f55e67e22ddf7f915ed61455d0236d61823b95d169acf2c10438b9740c06e90ceda5954b1aa3be810d0aa67cbae4e902db6e2b64080149f45874b7487712fc8d5cf83e9f50274f335bda58cfad871da2677178381cc39f7ed4ee2be03acafc87bf74a4d372d19ec1c8f8e5c6771637531be0e857da95da742b52b10eb3c34673b256d0e030000012800000090c47bdeb67eb0203b950f0bb40c35e23189b5f2eceda303f3e40b5b05a5520b8feb644a875c8c1eef0ceb59f518026b18d35e2fd4bf614a074fac8ebbc3c49bde2ce67be47ba476da92596d3f9d60e86520dcf569a71311b4c7f349b9a66992bd8ccd99a4050efe6bbbfd2a1f0c5c183a2d526c5a4750dce71adb548ce813695bfd372e81f33519c3450871229ef8559c000000906a65a1f67bd19b746d79217567e8efd957563a9d2dcd22ea23f8ceec026ea513e191173bfbc16aad3a58f32cb2fc5520ff5437e744f20c7b8621eab1b6829d11c2c9108f5014c7c7e420aaca18292f57237e45180bfe636e6d6173fdd29750ecd2b23365eb745103f4a46929ad14f42b1bd2567e4155b0a1a2163635cee2051154a753bc063f028b321b002967e0e8e50000012800000090702b6f54058ee8581d5c0afc9c8616c274525a0e1ce6bd7dec36f741ff75345c1b212e3d07339b0a236a0f527fceb6e94c558b7b7de1c569bf04c686eb501106e74d492bb2ccd127d11b8919b969c25b1b35ee58dab892cc0af648daac3135d66ea4db63884ab597c178d2abea58277b0b8855c1957b599272fdcfbdf4047a05ff7fb14bdc18b69f0c41de89630e9e10000000906f0524895f94a397e8635a3b6fbcb20f766bc941a622ce0af677b706f649fe9ec186ea93d4da5fe2ad547677d2ed84b18723f05863ec68198ae2d2d8da6e30e4d757c3b03f5ed2fcd0600c08c3f46f72179d0cba043376d1304ae9c1afd14709c437184a6e7c4ddbcbe7d4e472ee1cae02909c3e671a109db5ac78db6fa93c8fa0f2b13d46e50611d7c8108c13e10fbf000001280000009050940efa17ecd2980f13ae850b62c501c853f2eac9f3f69f82468ccfcf20cb814f93c2b6db4fb508c1009d472598eb86da535dd2734f8f8f068f38c870823434794ce4781f9d9f3670da1e33f2ee9e610ba15b16fbbad5a99ef4d523c8d32d30f198f30bd6308ecd4fbe56ab64f2340606c858a88e8e51230ae4146d78f604c68c36354419494acb49dbb61b2f673cc3000000901b3e3f99917a643a515f211da068d8e8c17adcbb6be9c948cf16d95781badee521b289b3f56bfa1ea7f8ba149e012ca1fc54ce9b6be5d4d82ec3f2428448c0cb9f4f2458d7954d7ceb9a1a125a1e7c0b185a70fbe114b9137a0f5266e205931eace0d4a4bbc869c3b6e6785b7ed1378d05573a1020f03f28f8d01b09ddab509d7a0f250c9a94741ca92c70d4d889b6df00000128000000905f840884679560a8905c7a07d3c122c19764b9bd701591dfcf77a449c08daec98b0bc24e90a98191db9b60bd305076b09054158c626dd5b46c112144bee2d3594e549d67079a4364355870e95a6a8c440f7a27c6af7ea0262baa847dc4ef9945a19fed51e1bd060a2ed5187f616512142f9af3cae6bd3fb3cd9dd1af5756f4a8271b855d7b0e076bec5ee719626fa3c30000009076cf1896fdaa5784ac4b27ef7c843fdb9760e734f764881010a773cb8d558287c6882d07fc05465ac9e876aa42e6f162761151fc6ed48efe6ad5abbc1039898b4c655e0c0f62a963e75d1cedfa3485f92c7ec52539c534aac73cc4fbbbc9836c2e4f08002f7af1f8711af75b2cca23cb1929ef5578b257c43e9a78a1cd8cc8269f4371f34e9064b1fbba1ce2da689ac80000012800000090b08c78f040430df1a5a9f08442755337542415f5bfe2e9ecb1a94ef00c7a0d346d037df629667cf31e438e0e855cc7ac71d288798161948b53ebacf234660922e532195cc7e8a9926d5ed129bd97217a1b170eeb161ecdfa24c5aeae58ee9ec4347026f0507e75589d0088ca004c1231019e491eb908ccf83ddcbadf9be446b8ec5fa5ffb287bc85f8bb1e13beb66617000000903442e435ccbca2080536d45d8dbf4ca789802d596d672a72fc96f805f8fb86b40b31f4dcb94e4568ae28f6bdf097ceaccfe82b06d73b3292c2388327df70ba6270323d5e58c6ede284f0bbe6620a3ca219ecaeec17d9f49a9ceb34d46f833a8f00c0201d8377c914433e1489e48221e1225a97ce45f4721e35310a8cce1608943d9fa0e0c9fa937c3b62954358248b660000012800000090c8323e56ecab702ed7bc4a60606ba2e436b6ad8be22e985a1dddf86ce32a7c9aab444816441188aefac034d780909b74849d1470bf19ba1a3b870bff9020220cc97b43cbb0c36b6188dd0eae6e6f8676169a225a5f8559408cabae0c613e75424671f1897fc4cca34569e2fe02d85c672e9759b17a2aafdc7206590f8b63812ef8a1805db588e277c6cfb57005ca193700000090b404f05067f41cfa67274ee57679ee2ae910bd04cd0e643571cec23141c2ddb9fdb3b36250ac22c3967cc2ce8551d76cba516512fe5319c10948159bb0211a73505392cb28b68c8ca3368765ab98d01d1ce8fa71d5098c339ae26741b35812380a6cede0b215e3251edd4229e77d82a321a8a303f777832fe8a9ea3f4bb4f95ea62deb50bf1abaab822864587fc3b323000001280000009024db5023bca8979f11943482afda456f7b93e405844ca5eeb5937c73157a52f0e7f320eab961fbe481e96b5b8cdafc819cd8dab4331b6ad508b55f9df55338e4dd831a601780a032bd8807840c1b98ea13dd030f83696211e8e5ed737fff5f2b9e69fbcac36a83ca2edf94061b40bfa52bcdb72baea7a8a428a798de6d5a3c96051753be3b1c9802de503728f8d203f500000090742c7d963083725102b72c06708f1fe350327eb1c0ef106bd10e817750201e15bd80d8536d8529cfdc3e67bdbc96206a8c708455017ae4b556d637bf7335821d924194ebc0488cf6006021f9180ade2b016c8ae945bfc67fa805e4c364ccda6a741f8e8f28a543dcb9a06b1cd499d0c1187ecd4717414e389e5e007421b12934c7694c3d751ec01cee068c44db937ec7000001280000009036f4d4f139e83334efbea77c0e516da51139f1925bf9981d798509fd046ec775e2b4eed693249e82199ae189f3d82cf913bf64cdaea7fbd34b5a20f3faecec78bf3d2ba8505dd4cfa4a4e8d301abf2832d5d7ff1932e0ae2aea76c8983303b52c9936c584c5ecafe84b4866157b6c55f208d74c2528961e4cf4b4b95848290d88f9cddd1cea6d67b54fe39617a58413e0000009060fad0bb132545deb65c878b0ce8b544b52583b5cac55466a0f14722d476ce46fdbf3f564ee292ea64b977c381bd17707a6b06a5072de4bbd40b8f742d2d0385c9c7c2241300eed0a999b4ec744c71c209e75820c3c93add6e6cc5123660a0bfb4933732e8d23b7d3ca25cbab2720bcc14bd115eacf6349000956fe778f4048eb418dbaa5890582c959fefc7575467390000012800000090176107cf7e4a3c1eef79c8820f3a40a2dac02ce7e22b6c11c24aec8edfbdd27a078bb529c6e6e7fff3e8923a58568387e0894cddc199ab0f91858207c73bee7dc11b6c251d7a603ee309e6f15856d82f03fd317ca3d65f325b1d7b7f5f560fdd559d92879a59074f8d22b5f1eba9d1c62ca2cd29939327ac181bdeba04407d50ac9b35c8f254c66535e2c6d35889c597000000907d8d646fc5ed7dda9b44cd51bb81d328bc96920de63376b4ea6447dcb67026e9fade724aa488e8bb9c750c835842a3e258c0fa307e672de5f0fc7c0e9b79d58dd7e5509d19214bfb35bb9b35dab94a8409c11f52c7c0badb77ad61b7834db9bf796f79461f174ecaff7ca6f01786616d203a5df354d8de9eb83d717cc3a585e7fadae645444eb57f43fbb19c0720784e0000012800000090db74264f37d1e5ac48bc360fa3ac1f365840a11920381d26670e2e69bc05a4073e7bb65c58566f0b0b594669565e8e529ff5612959f8ddd367adc660a189f0f5323baeb160dae229aa936fd1cf3ea53f27c77f541cf85b2dfdb98d293cb2bff8d16bee86550778cd82acde4b9e00c4bd0ad4be05be20999e61af2948f4d24df761c8e426dcce96bef9ee99a03d6d61eb000000900cd0763aadf988899b32e651883acd7197a92968246d4df5fafd537c72c0ef83434deac8fdfc9f5b9f592768da76180f3b7ca701a607d2530ab1a7cbfce99c4f733459b5da62189a9a5f3cfbc26637c82fce574a08c60e3ced8f24eba946a2d450ae7193955645a41515e55a080f267a154eadaf1ec638141e563c16a6aa35455d3cfb164a49115425c69ca9eb8c953600000ce400000128000000903afb72cdeec2a47f1bf935ada706a6e1a4d6b576d4a94b508fa1dd08c697611b2d6449105f66efae08cdb3f7028234ce6ee5210f04f031103b9ba05afb40224093b5ae3e5938b0a114bc9005b43a3479287a976ff10d30dad9fac1babce35d8218441ab6fd35f20a7ced3cbf8c9a2257226134ae106787d34488ade600e2ffcb6a4547683da6bf66fece37d83364f31d00000090e55d01f0eaaaba67f08b09aa757650d9069d2785bb9e1e6188c9b9006a9db9a4b39f17c8847939bef971653bddd12d2327d64ddc255964faad3f9c304c227b458618b871295685b959f184ce4eb8aaa81c68ff418a89b0de0ce6130cd80568bee79390cb5916bf12c9503590109c0ff419a94015bf0e01a458cdbe44bc377902449c6a16eed79d779bf753ea5635d7d40000012800000090d02006c4eaae045115518940c9ee0cc26b58946c4f6d8d81e9ed0daed3e838377bd9ffba26d92307bd106f4e1074973bb26fe542b43afdb16f24af4496c40ff62806892de32b92a6bb2f85761c7da8512f9822ba5933f5771510f41f5214b17800e017c5fa858cfebfc62247a796a63f08d318cda4ed4be84efb24c8c2bca8687a50bbdac14f8e916f77f80ce430fb330000009029bd6bba2d30919b80e1d32fe38320ce270b13021452f9366600bcc5185a30f6d4c385f9cacd4daeabc1559a90c837fd82494be962c633da9650440c6c5595fa4e1ea09c5a38048662fe86f85d733dcf175526449d8728304fa159bd30acb3714d604ac6afdfe3bb4d685f2b66ad696e24156b3e683f38fa846effe4cf020094ed31592094147ed5154e106173b819eb000001280000009053b9e98ec02851eb21e60488888e73ee9f47549e199327aa34b1d1f90ca135338c79bf0844852a2eb7414f7974d883f741b18d058d9ce31d939303245e05c19492cbe1f784a8d110ede68175699dc0400ea7644e81350776075cda6c1661a6dba567950d4454fc2ec43c5fe2a0906cbb06ed12cddf328aceca03e3b4855f5bf7dd742e3c3d3117557227e874b3e8182300000090be2d24b8bc1ad75c0dc69849e53fec5259a4cb6c367597d829e1b7bff7dda63e77bf3d096585aa139d14797b5d8750a4ad2bd13684190bbbef0361863da876b87bd42665423a42e22fb3060dd9c73f900fe1b72ebc006d5207fb30006150188c6f0c6b14f59745367dca68862f61fd64143a1d6601e96d56ebd298f4b90b2df73215a6fe8397b194a19bdbd3778838c0000001280000009061b24e8ceb34e7544d129a9ef21d5153bc0b8ad1e3030cc9c284f53a895703cc495bb72ff7b1e273961b4dc9380f780f81eea3f598857b744cd330ac15e4487e76e19b83faae1486a8932c6fe388bbd104ebf68c70862af81f17867f97d9f5429f3004c878af466f41113a337ea8d42625b48ea1b6cb49526fc175e65dd0a869734216ed12ee7344981f3ee15ae509f8000000909c0fb44be97b4838d4daa152553b77460faacb7b06613398d7aef1db12ebb8eb5316e1b443d232f06478225ee82244c0f19ffda0b5cb4428ed328f713beeb4c677d11a7860c83456231e63c21233376d2942e81f463d4a7bfb1e05501bad2d78716f8dd45969b88054826ddf5a4ab41d1fe8eb57d44df5ff0817cd39b1023d3b1300b422d38594b1e8335068edeff0c90000012800000090f7fd108f548783bc9551d0d463a8bf7f94a1e6c8b60fdf451f3ccc606f8294981d3b5ce672df54868e27a0d8c74f348c5eb3030aac40cf3b1de346cceb7fd9494ce3bb35881972d7f3ff5182877dbe210e4d4d8bcb167849ba888a13e210639448d689ba5995a2cf6266d928056eb57c13fd22723df36937f86c0cf881791de7146c0ef65286cd69df8547c214332a6c00000090107981bb8f3aea1065b9cde7cce56d12eeb6f1975473b67b99b5d7905cf13310268fb70e8d77ae3c05f4d16504eaac521eb288596375ddb8bbe2b995b563ac45d14476c72141c4a547496c1db9ec803f0af37fc493bc765459ad57f11167ef07a56d7ae032cddfbef55d311e3c8c425c1d5f508ce6dd96b32f5541b5293772a56130dc086e6bbd22f1f14c33bee5977700000128000000904aea85ceeb0100ce9f1efe3220bb32db922cf977772d43c9dc1f19c87e7d98a43d2d4dd91461cbc408239b7129aa237d8f5706cb253427b511c55b8f8110d04c4f75627cd8f2aaae43666df85e688abb2b411b78b74abf27c22bd96d667c113d6ac58fd22b9c7de263650011fb996c991379f7ee71c2db13885787b6aef36f6554e2a482a11f00e6b2f972f7050ea52e000000905dc0a969a008fa8b4f1dec7acf6b73b70ee3e47f03fac413035557cab3728677dba8c647aef9ef6bd288376ce693f9dff555a7ba5d16a3c6ac032d6a3f07367a6b6f9aef79f274229b44b49e74c4d5a70ebb46c5b566d049f63a00cba0910d271c54a1fd2dc3ec64fa53c397fa015afe072642f0c50cb747fd7e48b670f7ba3d433a274106daccdf396ea36e89ad989d00000128000000904d612ab7845284ce62a5d70cfce81009b375cc463bc6b4ffaea4b945ac0ecc3e0a9761c0b79f273efe7be8638f5d1214c9ba7b811132a5956e5814925721c70c9dd4a72c8607a93228bae77a151bfd9528ee829fc60f20def2577aa5063478a969eb41ed43db4dc251d94580ea6d57ed0883dc36e6b90a9d8559bfad5c6bcb8249995f89b8c7d7ca876af23a63d5c33600000090d084b4dabbdbf002a2ad9e9b451d41e78ab165c3c7f702e19c8ff56742faefd0d8f7ab71bbf7046d1c6759c0ed5cef66049cf4f12682a01d197682d9feff8675c006e2e5b99c06e7f87ec28abd8701071acbea1eafda92c77cb9ef64e3f4c80ccdf4a2bbe98841fae72e8bff58785d6f2ebdf38676288029cf0430038dda9ee1e0691a4ff64145cbf081b44c35b3a58f0000012800000090fed672fa19c5a9fdac804a848f869fdfeb363115e5e26540892a271834e433203a0ce7667c3b203cc1818d7381bd9204c99cd8f22d7f1f48da5a079063be0a5c65a65a1f10641cc5a8dc6f0a73d4a4c21caea77de0d2fa800bda8b62236680f372fc9cefac781c55d095df26f7540c240fa8bc9c2733cb9329312ff6ec7e1a2b47403a75ad67ea7df93243f6410371b8000000902a3b422ea518dbe9d741c4df05062ed74e4f1a7c1cdaa251fd989bdf008dfdb9913b4a0aa120549e6481d925e522fbf312c7e71e437b6740541bd4042d6a43bb04caa03ac96783ee6668097107a6822f1a6220290af9e64a6a3daac8e49cd4a92e2e4281788433ff7751265efd25dc8b23168871c86c25ebaddda482171ae243097ad2442719b309e4bef5866d5257ac0000012800000090f6fb1a394b4fc4d8c67dff4c8a0f3cf317d8e1d8a544381c2e4f608b6881b61c279844d2b20be38aa65786e01b06598262c080ce23c3a4d43beb19c7e56f13b0034284e7e04ea4e7bc0581a1df91a2fc2b2eb63ded7e27db61178a4db2ebff23acec70e7bdeac1c5be55a225d28d794e00ccb5bbde557906d6e8d058a62e4a962ade0a495357064b12e13a6a656b19e4000000902998e811887c2a59fefe44a5ef8aee9b5bb61aac5fb000d6b8668f8543acff09c42a82122a23a92d53749b91f2d61b8290a2571d5f69c4d7011e434acc40d765eda4b06c27f2fdea490af3a30f219735073ba046894540f7ebb006fe2a56d87c722838a540d12f7fd6a83d91a55f94f925f6e6951e1f6dfeabaef20424777b6d163020f97bdbce40f95e4366362cd05100000128000000906cfce12e4210cbdde53e910b768b0091925a9035a1e9dca4e8773ccc6be5749368bb7f4eb080584382ea35acc4e2df39385648d4e04bd6dd4bd2715a2e58f646fde89d75d7dc2716afad281461ee7d372c002ff6ec7445af50544b2b651402a23be2cccc1dd2b9f0efa5720a918b9cac0fb4d2268b3ef217f461782f7295446e2d5af95f1535e557c2054ede0b95a58e00000090830257100c277e93f3c49f7ab082ad055cdc67b0141825003b9cd3d349bdd02ca5a0e8d02263be0c4869a6662de376f16b3f51587e3a0486e2abefa3e86be4090e7f70bd98e6b8e369f332ca3a555eba08acfab520870ac5e28daca60516f10f3cbbd7d5d7a9bc055c22d9a60dcd063b2088e784f4201a6da3a72a7109350e0e50afba596a2cde4abef655e196536d6500000128000000904bdfdedd1e441dfa9e136bc325e17eefd8533060f61d5b4eba53c4298b605b6c820887e77c1f2d80167a74380a324ab0891b385fe8e0d7db0355d21cd79e286cd92a1905fa35b5c2591ccb6189a7b25b2f643afcc58f0e60679134ac8e4e352a21abf33cc9ebcf6ede3f9024bd4b71d5189afbd5aa0970977159e383e05b5310d94d060043e1583f43b0d0c89313bfbf00000090cc7b3670a5bfa40d016465f019d7d2af8cd02ce946cb6043aec4904781a5f768a672661e4268fa54ce8f5dd8eb3b3deae505c62ff556edfb87bbba5e4d40dc2db8a5702a72980e4f2e6879eec88b2eb519068b54d138aa1b9878212212a23995c47780b94b4f323f449523755607d9f91739abb31df8ef2f415c1799776d60c8baff3f44fb4a919b773a8487a1f97ec400000ce40000012800000090246a0d106a08ec9b5c24de43750ef0a453554bfb753dc1bd1b44d76c83c910dc9709febd669d7f4708221c6566ad4f3b752ae618d5b63fe50aea4cc7c8027e2604120a79b2712f6a3edb322ecccccc8e0ded9fa60da1014d4339819cea3f507d8e0388cef979d889c1bc43f9f8b27be00820c059595c41a9b7ec63ebf035467a5eb02d9dd6770592c3e6e6b5b59ff90000000090248d83c678092b420119b2023a8823eef838ae6eddb4ac214eb2f385c755ae3cfd292f480c7495d98c1a97581ffc4ec910de7e1cee8a7c9fb0c79a2f0cb3ec60a2aefffe3f108ae87c9e920826700d7127b5d29d9538a7c7803d052198053d0dbe60eacd686d97d02c9f91e558c218a22ca07defec009d42f301e9be442e4cab8de3d6806f2a2defa3d029a9d1e7a03b0000012800000090c947d1f7d0e8fba004eea5a277d746bf38ed5ea75219a9a00d7bd60061f3c8c96ee19187f2074c4434357275ab8df7f3be32404b5462f58878abb847e81944076bfdf875d8259ae9f5bdda689669cffa2f32f2b4242e723d1434ce950109f634baeba2e1ae441a1f170ee8001241d43607e29f21ce598cc9ace7c9fcb293ee98cd771c06a90452485bf2960e778b03c2000000901271d45b7a0e31ed8ba6c1f4e5765322949e4271eaedc6e8744c7b50dd392f98e4784b69d1e36236dd904180d44f664ad0cf9e2e7fc013b9317d095d7daeef6a622ed3f74f06a8ceb6864d4d40b7377102609e650a29204bb2631d787371559b68c131e61333a9583e8b11c64fa181b7114a5889c5dce28a03b894901ca664de01ca0b3187012a9ee30aa500274bfd8c0000012800000090080eee5c08e5b2165858bf7941e34b1c0d717f86d45527b00f6cc5e4b650c331c39d029aaa40138104ea682d224432d15211421a42f71fbb8003b4235b83ff02ca7049f3809cd47737fb94a2a94d54f226600b5187f1ce2f5394c078cf06670a3249e0738e9d170e952ca174bc49690b0069e888bcebb11f591024e564bdb1fb4f4bad91fb2dadc7bec3d18445b43d370000009055e5f35e8be8a12b1379458b114b88fd50ab46f2f773bbda0d97734713ef5e9a606c28a7e8b69ff1cbafa0ea3e281d0c80a2f2b3f6646712ba95dc6041f1fe157fe42fd03022b10511ab55f998390f5b1a417cc74fd030c667aed93164d9087c351cc11f46db56298d8dea943ba920070ef0aa228df6701eebcfa9485c12c79ea07ae7cd1c49ad151ba529a8ea2dcb1f0000012800000090b656cce2d7cf095027f969dd662bc35a7fbf7ff4f4a36f26c8f444b429e7ea1f32ebbc8b61d294bb0ce01f0aa8a79638afbe11bf7aaf3a0860b1179a7446a4601b415dbc49fef8f2cff00052f63d2a7b24bb6746427061652664d449c145012f9c77a29891a54e27d9f89cad7c0a6f3d16e0757c54171d8bc38a56bf254985518ebe42b99a52302435cf36647d8178c500000090d216199db36837839fc6cc741651443e07e5ab902fdca004f0f728cdac1cc4e17000b64f52f8a972517e7b7446c609627fb04b84fc871b68b62b97d5092fe97519e19c5abad064a4fd6533c970cf8bd02c9a870fe6745678a04cb5fd108f93f7f2c420e138f8251803bf85d31edbc50d063660f9398011412e41b42cce9fd0edb964689b4b6fc0b016d7814c9fa0e1ee000001280000009082090320bcdeb7d28388dc67ed61d02475ce864818b0b5d232143a80315ce05dee400b69ad5fc343fd31c7490978667ed9da0b4863317365db5a1eee2aaeaa0721cd6997c7c3eeec2cd3838ead39c8b51e2c9980e5c46143bde338449b6a1bd9c9572b96ac78ec9dd87f59f5cf57b1c90a52db29968774929c18149634aa73a210ea1be4007ec9b9274674a037202fe80000009030bdb825638927614a043a9034162d728cd43c745725fe8c19fc6d50de76e35472267d56e50d6a55d880cfec6342622ded9ed869f75a0c1487d9f9a382fddb13ea1c635e627834235148e634e3f6f1100141e873786b317c74f39ce868708d31cff93b38fbdb2cd20143eca47bd75d53241211448ce1906df7ef556aa9ea4eac40f38f11739df9f5c499605bead183900000012800000090f813f828646067dc51d5242353d807ee5c1aa9c66ed5d7d331c5d0c01de93981885db387722aa025e33b87470d710ebb973889a6809b975a22da8a56907bf80a84d15918cac48b2794e1822941153e4a1440d4db50c931e1ad04e1bbeab9c6ee6e182b4d835485d207cedd64ca443245055847fe127bf5394e1fe8a06707b4fe6c019fe62d4d9b94e56b5d8b6c8dc96a000000905c2449a18e5907e3a3200004082d61f84dc6275702245ac02221e2e9fa7fddbafb9c0c03c33e3a522adb8937b44dc1cfe493c26fd7580d60b981351db198a234dc71b540c2ac7eca5e44130645f0d3ac0205554d5e9f6edd547c5dd999daeff9fbc4fe2f4955a70be1eabcb4d16032e828287e03a8208340deb34ddbd01988ea922f711004ee1ff58d2a80032862a7c800000128000000901094845c5de05e951ad7c565191ca696bebb4b6026bc685765a29fb744acb881d46aa3659618446e392dd104a79f63b78ba6992cb410152ad853e4835cb55fcc765725d5fbdd197e8dd0bebe245a16112642d7fc22957e79f0252e469112b4e5be5dd94c16b0cd03e223ba84c92612b32f29dd1fa08abf0210ae7541fb07518f09b73219800c026a31d1de82806a717d00000090f25784fb68a28671a138a2689a2e27d36ff4b57d6789d7ec9600f50258d2f1d78a8e6f87e600f18c38dd9e2db1ef1fecdab806e69252201bf753848fd642ce0199e4cabbdc6b807103110b79060467dc1d928ecb52987f9594ee3d645e5bc384597fc02bebe8baa1b788619a91011611219cc2d755c7ad29e2b796caee1e48298e1ae075a4906e3cac4aa00fd7c6d37e0000012800000090232a0ab85a65971d9e129564be4959738fbd010e4620bc56d4c6a0cef0df48ea2916d699bfcf86c31ad798df1cf683dc447fcf3f776921569c940f49434bd5c5726b884987da77fc4e5bd2feadede3491d65766b3b5e95867650d9895558f7a6605e54f7b5fadbd155790e4e0f24a61c131f6644777601fd58c0ec242d9d964b3659244cdd9d0734ccc1cd02e2dc0cd70000009000e85396676fe85ae00b6a67c58a775a8e015dbba543d97b62849fd736be0a5ee691edb3386a0d2da107d33c0b6e20aaf0ebc5317953b33d0b1fa5d4dc0aa4e37497ae1ff07f85091f53e2e2c1a4a91912f3a31920458b51becc95d1b36e182988466ef6650fbb25a68f6e41ffe87c8d06fdfda92175001f9449ee523bbe716ed67386b7a65dc2281201dc0f52e79d84000001280000009046eb6f5858b6deb25997802d2470fc937ca6a0db4ec8b4b9f54033e77b0530b1fb827d1b901a45e99ae05235c325eb594e8ae2fcc865713fb826e451fa32072510ba33ea4ea74dd1a418c1fd6623b1882f867d690e3c0e22454afab564d44b876ebb1dc99ee27513ba0d681126875cd2083925d5f64dc05a14f6836d752eb8ee2724d4c45cc4ef6b5dff05966a946bfd0000009089295e34b6554ade8a37880e22cb11e97362668e30b2d266fdc00a06d91cc1c81f1a60714a1eb8e362900d31e59b4874f872d6baf1d057acf9712992eca98651ac3cabd3c68b8480e5a76049fefb122203f473002787777af3bd17162395067a9294669f469176bd8261113591575ea9194fedd044a208a299a74884a04c159189c5584324e0e28c0ed1f934f52083fb00000128000000903b1f75e86603f88b00bc7fcb389a0808f12ee410eb4ea5927614284aa5eff96ce07347df10d30654116e33cf57ec6f616b0d60a7ed480940b78c9bd174f823354c2c6977aaebf30932a359bb3593b8921080a3c03b4b9cd2e136130f101384edae29998621687f204fdcd5d0c5aba84d1348b19326b9878dc77421ad2fd4ec3317bfd7bc9fc0bfaef3ea2d62ded6f7d80000009071cea3ae8023a06bae36072dc5bd97b0579720667a7de4fc06a77c71c8f22fd764d14f7185fe823324e1549513b0c33ba990278a50eef3926f4192fe56d5f4a20a81b3192ea1fa4f5d411f94976ecdbf26fa3c8c2f2ee479ea55e9f45021749e35f514e87b37353ed481023f7e7c801e14fe40a872d25cf710dfd4cb5bd31a7f7fc5b462a5effa3d25bf544a26b50bf70000012800000090550c59f8f001f40751d8d8f83d41b3096ecf6539613399c810c05ea476e5c7f195c496c0590c6482641f0d4001babf649e3c761d216f978c6e279af75d24a0da1cfe90c67caa65b7639e7a82b48e53940c8ed9b0c03f1eca4fb55db4c930c770f029d49a2df26a008e78aa93a35833570ed3c91162ee1d25a96ed37ab571817fafa9c255f21cc8444eb20cac55e0cbc70000009032816c593e8f09426b459417186dc07b9cdfbfa0e7672418b3c63354af60bbdf627fe8e337eebb661f2163173c956523b37df946ad27e4354ed74fc199f40291a7e621b8ce9b5ebb3cf73b45022458160ebf2a3ebe228d431c8938f176fbc32e7f80ca5bff06dcff0d4c1a62e53fd9142812e0a40487e437190f29ae3bae7bf25ebd750c802e6bec8cbbd4b2b60c5e6500000ce40000012800000090cb8101b645c45719b837537f288db2a972242cd3b13945677a520b119b69c1ce9b0cdd31db1ed5af20c58576578b0023ee31cb95c131ee7a51c2ba75defb8f2f925af553133e3f867cf9e5f7c05d5dff0607731d4be02945695497b306deffbd102f7d24cafa87311ce23f557700dcf12cfa609937d2036dd835eb3acee695282f0aa384b7a710abf261c02db6267e0b00000090993f529a09a0517b513d11e6c7d35ae7daea3d9ef96bab7f86182f31abd5fd250a79773e373ecfaed4860234f7ba4581d2eae5882bd731faa19cc6ddc1440f062223294cdc8bd5876a84aca2021e56d0080888d3097e2d6ee2e65c3891b4c62a083308e2b969577fff780fb53c6895a50ca75c4e8e647ac512cde4c9a329960f9d82579529a57a7e0fba3b6c45554b9e0000012800000090c397f20811539f67aa0d9deb333219706d06272749d0ed917bbf52d7d3f1c1828ea1f7982c66e5aaf0b19accc338ec1f0e562c3576ade7ef3e568043e82868f417d22f07a7d4487af14566bc11f10b6a2d0767a2efa94f65d2e2f15db519b52e4d6ad1a96535692bb980b1a0689e2a2321b59c58bb53bfdc0843ce3896a4f36848e0c00a31f3061db854e56ed52aa4b0000000909ebd9573cf974839b5fb0c1a18cd9a565b914ebb383bdd20c73e72a5cb61cfe24ffdb2f71f0d63659b226c9e08f52c23178f18ff0ef81cabe90cc186f9bda9ecdeeef16287313edf4044df7a01fe31c52e1186400dade877de4d00ea6a1b3d2bcfc80220c2ba0f4daded50b5ffeeaac502b7a117fa66d1e46d35c81ca6f4f02933f7bc117648f1212afb6abec99684bd0000012800000090c0e4f6a168e67a0a4f1b0c413a3d02d9751f9febfc9ef4c129386d347ac2828227aed3dc4bbe71247b120e6678676dd8da58102054ee86013cc91f63f4f7add06ac0ae21f75b0939f56d21c8ee079d9f1b09e101295844e7941390e82e4fe23ce5d3f3cb7ee36af753fd549568b8f44e10a3e3341bd516e5ee23abbaf49a9d6a524542bfa891390b79538b307f60c9dd000000908dad9c1e96ee3ced387c2109956a2318f201b2eb51ecd81fee5cc5e16528604afff0916b93c29d298a73cb15adf80a37e539c0e73c13c99060e386785c02de3e03c4a95cf093d2df68e015faaf8beafa1d3d2ad54c1c0dc2fe1220d5e0b58987c14678bb2f6e7e76ef31152d83c961b51f2b841ca071188f2b2b49100a86dd7add0695373e1c3249683b8c2e7b9d09f10000012800000090258db38122111767a6f06767568b2e6256a1c76ba7f99bd399dd90defb9c5cb8a69a331d423515fd6e659c774424095e541dd11504090b9d3821e8039e9b511d0980c4ba6867f8c9494ab945d33d95771c8b29ba520b178f9ce2451e66ca3e510b90fdbdcf2be432f2999909975056861c4b8371741e94728718acfa10fc8bf7568bfba3732fd5fbc52d298fe6be0e92000000906bdf0de137b90d7eed4184fd8fe20aaea35bf9a196cbf9d0fbb4cc396ef24edc4b7200309da70a4e8d1bdbb018f0be98060aa1c7865cc1d2a50e986fae7ba2e510da189ce588ce3eb7c7fac7b9eca1ce2fa9e270894ab1f11c354eed4c70a53893828ae8967fafd1a0ab075afb4342ee0937b02097e238a8a3ab1a5063f0afdb01097c473e4d97d946a3386e067ec4c30000012800000090042c964916bc0cc2975bcbee7b91882633cb36fde8f2e3ced567590076c1e398bd291a2175afe0c483c77d3b93d7090d172bd210c1cd6fcc32b05c48adf810ecaa0299547b96411e5decb69b8154f67a258025cac1d980bfdeaa7003a61586769f66c36e2b27118bfab8819dec6c4a4b00318e674a4622ffb5296d93eef492b52866f74370dd4250d1f8457496a337c600000090b2f68730bfe2c8f0216b58fad1442fb289b8499b95a628c9d83c2d71f222c374101d7a40b459832ef3f396cc4df82b9c436324863f8d4e3a2ebd90d7c88050efdc445745b66f843f2e049c0f8c5f221d2d12df30584882656ff9d6f0efdb29464c87765e44befd7954c672fd4db509bf1ac277f551f5016b51e928ee78fac040bb5f39595f629e87cc40d44fd08c5aa700000128000000900e6ff27e9b1d0ac0be632384adb77793486e64d4d451b359aefa3ecc2f770c53e2bc64852b5efcb0185b8ca6f40e581890c55be4f3c0ba0efd7132544d03f3893fbc5da47e18b3e70271ea2d097039122ab6bbf91b9b3a49701a263e022a02e41a4b12ad55aad42fd4ca280fa88217bb07a897709ee27fcd185cc89617ab003d05727127240091d79f2ded1cadcff23600000090eb243c5a7917e3784d38145f679655b0f598aa913c3585e61523aaba948c59f7500afd3183f8e94dde153aedd2c1efdb0290213aa269d96e40b2e6768a9e9ff804a0da5b3cc6f204bd21b3ed1507f00e0203bd184252c84fccf825b8fe971c75e7c4d7464dd732ccca507038c2a2f800085733ec3b3021387c272405f3ae8a5ff35208a6dd816961ea9b60443e1e72cb0000012800000090000089c0bd91d471aa672d2e71f2b3e95efe7cc2247703f3e68c5341ade330bd2b72cb4d1c453c53e2bfd83a249b4369c796e3ded3ca80c653acd3952935922e8c8e3874477a69194ee84c0ff450e20f05f0f170bedb95b2db6e875248ddb3efaee20d102c9d7f626825fb084b9c02760dffab112427fd2bb4636ef37faa46c0d297db5109d1735caa709e9c11243fbd00000090cd7175b8b999340d3a6a19f314667ebb76111fc1995b92520ec1b2425dd7eec6c6925ce79a38049e728bcf1a7517c76b8f512682dc85233cc675ba2d08fe63a939820be928249d8267ff87e941b1d8ef1ffd90af3769864bce3fa7bf9abaaee175990da6a99f9ffce39188b09054932004577df22545471462a0445004c184e82960acfa0de04ca814e5a59e8d7853d8000001280000009027c57885ad44e86bc050adc16a9f431b8bcd136858797069b2ac1dc57e4bc07f8dfb1b0437a8b04f517ea77e11ff95868a697f4a647d605fca1d24efaf5f2070ed997bb7eb4b394a50ffd46bdb225431064c39026f41d45dc7689a9f766339b36f348817f822b9bade7f63cfc352f1830a6a40c1fca91d694ea2bf01e6c8c96b18e212bae9f1cc726cbcdc5fe42b9997000000909a73ecf61fb7a16bd0da5901fee1878055e506aadcbd399eac68a328c496aa89da4034c0ccd2f41cf9f210bceafb936bef1867d150b6c4eef3a6216f838f46c246be3b5cc9b6917651f0665ce97ec75e0f88f6763f37402d26bc6dd967ea561ebfdf539784f87b34260514f6bea4fe4615f0f38a93420c5a1b7468301b96944f03d14c26da162c1d74518fb5f687471e0000012800000090037411a3e4d6d8fce24c6b20eb2685da8153c648c49b901ea4e198e410c2f4ab8b4f6da6c3001db34c631a0eba034a2a73f7bc07f9b5bb3f0c1cd35b6f830bdde23e56540f2926d1428c92421f512df02d938fb1bf669cb7e3f2f67092ffe9c9235151de0f7780c884c275b87ab16c7c04fbd3ca6e59256f424817a5aa6af4db3dc7cfeccbd2e33a674aaed3c00679b600000090b63e8bcc12b7202e6adf92d08b0ceff3fb5f2aeb3641914f2007f01be6e8d0531717e813359ea9d87f334e4dcd6d9d2a9f469cb3ffe7b39bf3f516371d94d5cd0684b459e90ef0ea7e135cfdc09a459806ebcd20b37d2449effb46e1891920e9552219420926fe5b19e24c84eb5b489702a9b68a3f386683ebb68a80fbf86bda5f9eaf551a05e44bdcb62857b2a2596d0000012800000090be02f8ca31f53bbb98951c594b4d63e86144597afce010fa052abe4ce22ea616e5ebeee1592f72b790e861aa288e5e65e3d4e1de590d600e5fe8e97b2a944523fea6d4877982c820a8382bf211bdab670d212dfd578eea5598603aa2184d3d19631b7afddbf64a7d7d42da50957af2200cfd85cc575e688cfac8a7bf79d13425a8b8118cebbb7450ce71a5f32dd57c7600000090506fbaace8089afb104d6f51761c4b160f7fbe12ea416075884c7051942c26a7a5623325f5ee9b61e978bb6bdb0fb2247e1db58409ed666d92272131d0907441fde90741079630c7979d5c26cecca78a0e9311d2ab08ef98c21d6c368ace80671d4b53355506c328bffa5e50343b7b521f302e47e478b4cd9d6c378dd1d805301e1a212a76dec996b242c73d121275600000012800000090858cb772b6218e3b500c5ec852ec41fa01759de6d92fec4072a5a110de67577417858f16483e60864a6bfeec08ac33f895cd2925d9a32b5592599a6a960b88a9037dec9d267dc8b6c7cf3d14a6eed1e61923dce2ebe3796339f5a12c60b1da8b59ffbea3ff915359fc23a18f1f4967c701c040dd0e12cf5c9847b9acfb42fba71a589cc1cd10069130cd77de09e8f77000000090d3d771170fda563baec8662676daf70c323b048e3b5aea56cacb8e6e05eeab197e7ea3a84783d7048e4b302208cd2677d4fae6517098a2ad889e3675debb168d12bed274ca336a0787c2f0ce0755e66d1c19e641008d906a75f4cfe0412da1c25c4c6eebd8f8acba536deff6a87c52790f0d3c3df3ba9e411bdf469d86c008caa58d2076ab6c34c60b72f9bc03c3d4c7", + "timestamp": 1704899127 + } +} \ No newline at end of file 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 5daf787c32f..1c2f469ae90 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 @@ -44,6 +44,7 @@ import { import { MerkleTreeOperations, MerkleTrees } from '@aztec/world-state'; import { beforeEach, describe, expect, it } from '@jest/globals'; +import * as fs from 'fs'; import { default as levelup } from 'levelup'; import memdown from 'memdown'; import { @@ -101,6 +102,9 @@ describe('L1Publisher integration', () => { const chainId = createEthereumChain(config.rpcUrl, config.apiKey).chainInfo.id; + // To overwrite the test data, set this to true and run the tests. + const OVERWRITE_TEST_DATA = false; + beforeEach(async () => { deployerAccount = privateKeyToAccount(deployerPK); const { @@ -233,6 +237,49 @@ describe('L1Publisher integration', () => { return Fr.fromString(entry); }; + /** + * Creates a json object that can be used to test the solidity contract. + * The json object must be put into + */ + const writeJson = ( + fileName: string, + block: L2Block, + l1ToL2Messages: Fr[], + l1ToL2Content: Fr[], + recipientAddress: AztecAddress, + deployerAddress: `0x${string}`, + ) => { + if (!OVERWRITE_TEST_DATA) { + return; + } + // Path relative to the package.json in the end-to-end folder + const path = `../../l1-contracts/test/fixtures/${fileName}.json`; + const jsonObject = { + populate: { + l1ToL2Content: l1ToL2Content.map(c => `0x${c.toBuffer().toString('hex').padStart(64, '0')}`), + recipient: `0x${recipientAddress.toBuffer().toString('hex').padStart(64, '0')}`, + sender: deployerAddress, + }, + messages: { + l1ToL2Messages: l1ToL2Messages.map(m => `0x${m.toBuffer().toString('hex').padStart(64, '0')}`), + l2ToL1Messages: block.newL2ToL1Msgs.map(m => `0x${m.toBuffer().toString('hex').padStart(64, '0')}`), + }, + block: { + blockNumber: block.number, + startStateHash: `0x${block.getStartStateHash().toString('hex').padStart(64, '0')}`, + endStateHash: `0x${block.getEndStateHash().toString('hex').padStart(64, '0')}`, + publicInputsHash: `0x${block.getPublicInputsHash().toBuffer().toString('hex').padStart(64, '0')}`, + calldataHash: `0x${block.getCalldataHash().toString('hex').padStart(64, '0')}`, + l1ToL2MessagesHash: `0x${block.getL1ToL2MessagesHash().toString('hex').padStart(64, '0')}`, + body: `0x${block.toBufferWithLogs().toString('hex')}`, + timestamp: Number(block.globalVariables.timestamp.toBigInt()), // The json formatting in forge is a bit brittle, so we convert to a number here. This should not be a problem for testing as longs as the timestamp is not larger than u32. + }, + }; + + const output = JSON.stringify(jsonObject, null, 2); + fs.writeFileSync(path, output, 'utf8'); + }; + it(`Build ${numberOfConsecutiveBlocks} blocks of 4 bloated txs building on each other`, async () => { const stateInRollup_ = await rollup.read.rollupStateHash(); expect(hexStringToBuffer(stateInRollup_.toString())).toEqual(Buffer.alloc(32, 0)); @@ -303,14 +350,7 @@ describe('L1Publisher integration', () => { expect(await outbox.read.contains([block.newL2ToL1Msgs[j].toString()])).toBeFalsy(); } - // Useful for sol tests block generation - /* const encoded = block.encode(); - console.log(`Size (${encoded.length}): ${encoded.toString('hex')}`); - console.log(`calldata hash: 0x${block.getCalldataHash().toString('hex')}`); - console.log(`l1 to l2 message hash: 0x${block.getL1ToL2MessagesHash().toString('hex')}`); - console.log(`start state hash: 0x${block.getStartStateHash().toString('hex')}`); - console.log(`end state hash: 0x${block.getEndStateHash().toString('hex')}`); - console.log(`public inputs hash: 0x${block.getPublicInputsHash().toBuffer().toString('hex')}`); */ + writeJson(`mixed_block_${i}`, block, l1ToL2Messages, l1ToL2Content, recipientAddress, deployerAccount.address); await publisher.processL2Block(block); @@ -386,6 +426,8 @@ describe('L1Publisher integration', () => { const [block] = await builder.buildL2Block(globalVariables, txs, l1ToL2Messages); prevGlobals = globalVariables; + writeJson(`empty_block_${i}`, block, l1ToL2Messages, [], AztecAddress.ZERO, deployerAccount.address); + await publisher.processL2Block(block); const logs = await publicClient.getLogs({