@aztec/end-to-end 0.0.1-commit.e61ad554 → 0.0.1-commit.ec5f612

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. package/dest/bench/client_flows/client_flows_benchmark.d.ts +2 -2
  2. package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
  3. package/dest/bench/client_flows/client_flows_benchmark.js +3 -3
  4. package/dest/bench/client_flows/config.d.ts +2 -2
  5. package/dest/bench/client_flows/config.d.ts.map +1 -1
  6. package/dest/bench/client_flows/config.js +18 -0
  7. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +4 -2
  8. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +1 -1
  9. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.js +10 -0
  10. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +2 -2
  11. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +1 -1
  12. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +3 -2
  13. package/dest/e2e_deploy_contract/deploy_test.d.ts +2 -2
  14. package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
  15. package/dest/e2e_epochs/epochs_test.d.ts +15 -7
  16. package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
  17. package/dest/e2e_epochs/epochs_test.js +85 -41
  18. package/dest/e2e_fees/fees_test.d.ts +2 -2
  19. package/dest/e2e_fees/fees_test.d.ts.map +1 -1
  20. package/dest/e2e_fees/fees_test.js +6 -6
  21. package/dest/e2e_l1_publisher/write_json.d.ts +3 -2
  22. package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -1
  23. package/dest/e2e_l1_publisher/write_json.js +1 -7
  24. package/dest/e2e_p2p/p2p_network.d.ts +2 -2
  25. package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
  26. package/dest/e2e_p2p/p2p_network.js +16 -2
  27. package/dest/e2e_p2p/reqresp/utils.d.ts +22 -0
  28. package/dest/e2e_p2p/reqresp/utils.d.ts.map +1 -0
  29. package/dest/e2e_p2p/reqresp/utils.js +177 -0
  30. package/dest/e2e_p2p/shared.d.ts +2 -2
  31. package/dest/e2e_p2p/shared.d.ts.map +1 -1
  32. package/dest/e2e_p2p/shared.js +7 -3
  33. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts +2 -0
  34. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts.map +1 -0
  35. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.js +184 -0
  36. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts +18 -0
  37. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts.map +1 -0
  38. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.js +120 -0
  39. package/dest/e2e_token_contract/token_contract_test.d.ts +4 -2
  40. package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
  41. package/dest/e2e_token_contract/token_contract_test.js +10 -0
  42. package/dest/fixtures/authwit_proxy.d.ts +15 -0
  43. package/dest/fixtures/authwit_proxy.d.ts.map +1 -0
  44. package/dest/fixtures/authwit_proxy.js +30 -0
  45. package/dest/fixtures/e2e_prover_test.d.ts +4 -4
  46. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  47. package/dest/fixtures/e2e_prover_test.js +28 -35
  48. package/dest/fixtures/elu_monitor.d.ts +21 -0
  49. package/dest/fixtures/elu_monitor.d.ts.map +1 -0
  50. package/dest/fixtures/elu_monitor.js +102 -0
  51. package/dest/fixtures/fixtures.d.ts +5 -1
  52. package/dest/fixtures/fixtures.d.ts.map +1 -1
  53. package/dest/fixtures/fixtures.js +6 -0
  54. package/dest/fixtures/ha_setup.d.ts +71 -0
  55. package/dest/fixtures/ha_setup.d.ts.map +1 -0
  56. package/dest/fixtures/ha_setup.js +116 -0
  57. package/dest/fixtures/index.d.ts +2 -1
  58. package/dest/fixtures/index.d.ts.map +1 -1
  59. package/dest/fixtures/index.js +1 -0
  60. package/dest/fixtures/setup.d.ts +40 -24
  61. package/dest/fixtures/setup.d.ts.map +1 -1
  62. package/dest/fixtures/setup.js +79 -164
  63. package/dest/fixtures/setup_p2p_test.d.ts +16 -9
  64. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  65. package/dest/fixtures/setup_p2p_test.js +40 -29
  66. package/dest/fixtures/token_utils.d.ts +2 -2
  67. package/dest/fixtures/token_utils.d.ts.map +1 -1
  68. package/dest/fixtures/token_utils.js +3 -2
  69. package/dest/shared/index.d.ts +2 -1
  70. package/dest/shared/index.d.ts.map +1 -1
  71. package/dest/shared/index.js +1 -0
  72. package/dest/shared/jest_setup.js +10 -1
  73. package/dest/shared/mock_state_view.d.ts +86 -0
  74. package/dest/shared/mock_state_view.d.ts.map +1 -0
  75. package/dest/shared/mock_state_view.js +186 -0
  76. package/dest/shared/submit-transactions.d.ts +2 -2
  77. package/dest/shared/submit-transactions.d.ts.map +1 -1
  78. package/dest/shared/uniswap_l1_l2.d.ts +1 -1
  79. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  80. package/dest/shared/uniswap_l1_l2.js +8 -6
  81. package/dest/simulators/token_simulator.d.ts +1 -1
  82. package/dest/simulators/token_simulator.d.ts.map +1 -1
  83. package/dest/simulators/token_simulator.js +2 -23
  84. package/dest/spartan/setup_test_wallets.d.ts +9 -2
  85. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  86. package/dest/spartan/setup_test_wallets.js +31 -1
  87. package/dest/spartan/tx_metrics.d.ts +35 -1
  88. package/dest/spartan/tx_metrics.d.ts.map +1 -1
  89. package/dest/spartan/tx_metrics.js +150 -0
  90. package/dest/spartan/utils/bot.d.ts +3 -2
  91. package/dest/spartan/utils/bot.d.ts.map +1 -1
  92. package/dest/spartan/utils/bot.js +2 -1
  93. package/dest/spartan/utils/config.d.ts +7 -1
  94. package/dest/spartan/utils/config.d.ts.map +1 -1
  95. package/dest/spartan/utils/config.js +3 -1
  96. package/dest/spartan/utils/index.d.ts +5 -4
  97. package/dest/spartan/utils/index.d.ts.map +1 -1
  98. package/dest/spartan/utils/index.js +4 -2
  99. package/dest/spartan/utils/k8s.d.ts +31 -1
  100. package/dest/spartan/utils/k8s.d.ts.map +1 -1
  101. package/dest/spartan/utils/k8s.js +124 -0
  102. package/dest/spartan/utils/nodes.d.ts +14 -5
  103. package/dest/spartan/utils/nodes.d.ts.map +1 -1
  104. package/dest/spartan/utils/nodes.js +204 -33
  105. package/dest/spartan/utils/scripts.d.ts +18 -4
  106. package/dest/spartan/utils/scripts.d.ts.map +1 -1
  107. package/dest/spartan/utils/scripts.js +19 -4
  108. package/dest/test-wallet/test_wallet.d.ts +83 -0
  109. package/dest/test-wallet/test_wallet.d.ts.map +1 -0
  110. package/dest/test-wallet/test_wallet.js +214 -0
  111. package/dest/test-wallet/utils.d.ts +41 -0
  112. package/dest/test-wallet/utils.d.ts.map +1 -0
  113. package/dest/test-wallet/utils.js +71 -0
  114. package/dest/test-wallet/wallet_worker_script.d.ts +2 -0
  115. package/dest/test-wallet/wallet_worker_script.d.ts.map +1 -0
  116. package/dest/test-wallet/wallet_worker_script.js +48 -0
  117. package/dest/test-wallet/worker_wallet.d.ts +52 -0
  118. package/dest/test-wallet/worker_wallet.d.ts.map +1 -0
  119. package/dest/test-wallet/worker_wallet.js +151 -0
  120. package/dest/test-wallet/worker_wallet_schema.d.ts +274 -0
  121. package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -0
  122. package/dest/test-wallet/worker_wallet_schema.js +10 -0
  123. package/package.json +43 -39
  124. package/src/bench/client_flows/client_flows_benchmark.ts +8 -12
  125. package/src/bench/client_flows/config.ts +9 -1
  126. package/src/bench/utils.ts +1 -1
  127. package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +11 -2
  128. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +7 -8
  129. package/src/e2e_deploy_contract/deploy_test.ts +3 -3
  130. package/src/e2e_epochs/epochs_test.ts +103 -72
  131. package/src/e2e_fees/bridging_race.notest.ts +1 -1
  132. package/src/e2e_fees/fees_test.ts +12 -27
  133. package/src/e2e_l1_publisher/write_json.ts +1 -6
  134. package/src/e2e_nested_contract/nested_contract_test.ts +1 -1
  135. package/src/e2e_p2p/inactivity_slash_test.ts +4 -4
  136. package/src/e2e_p2p/p2p_network.ts +29 -7
  137. package/src/e2e_p2p/reqresp/utils.ts +235 -0
  138. package/src/e2e_p2p/shared.ts +13 -3
  139. package/src/e2e_storage_proof/fixtures/storage_proof.json +915 -0
  140. package/src/e2e_storage_proof/fixtures/storage_proof_fetcher.ts +190 -0
  141. package/src/e2e_storage_proof/fixtures/storage_proof_fixture.ts +173 -0
  142. package/src/e2e_token_contract/token_contract_test.ts +11 -2
  143. package/src/fixtures/authwit_proxy.ts +50 -0
  144. package/src/fixtures/dumps/epoch_proof_result.json +1 -1
  145. package/src/fixtures/e2e_prover_test.ts +29 -39
  146. package/src/fixtures/elu_monitor.ts +126 -0
  147. package/src/fixtures/fixtures.ts +10 -0
  148. package/src/fixtures/ha_setup.ts +186 -0
  149. package/src/fixtures/index.ts +1 -0
  150. package/src/fixtures/setup.ts +103 -225
  151. package/src/fixtures/setup_p2p_test.ts +40 -44
  152. package/src/fixtures/token_utils.ts +2 -1
  153. package/src/guides/up_quick_start.sh +3 -3
  154. package/src/shared/index.ts +1 -0
  155. package/src/shared/jest_setup.ts +16 -1
  156. package/src/shared/mock_state_view.ts +188 -0
  157. package/src/shared/submit-transactions.ts +6 -2
  158. package/src/shared/uniswap_l1_l2.ts +9 -11
  159. package/src/simulators/token_simulator.ts +1 -29
  160. package/src/spartan/setup_test_wallets.ts +58 -4
  161. package/src/spartan/tx_metrics.ts +126 -0
  162. package/src/spartan/utils/bot.ts +4 -1
  163. package/src/spartan/utils/config.ts +2 -0
  164. package/src/spartan/utils/index.ts +7 -1
  165. package/src/spartan/utils/k8s.ts +160 -0
  166. package/src/spartan/utils/nodes.ts +251 -31
  167. package/src/spartan/utils/scripts.ts +43 -7
  168. package/src/test-wallet/test_wallet.ts +306 -0
  169. package/src/test-wallet/utils.ts +112 -0
  170. package/src/test-wallet/wallet_worker_script.ts +60 -0
  171. package/src/test-wallet/worker_wallet.ts +213 -0
  172. package/src/test-wallet/worker_wallet_schema.ts +13 -0
@@ -0,0 +1,190 @@
1
+ /**
2
+ * Fetches a ERC20 balance storage proof from the Ethereum mainnet and saves it to a Prover.toml compatible JSON.
3
+ * The JSON can be converted to toml for use with nargo, or used directly as a JSON file when used in
4
+ * Aztec contracts. This script is not using any Aztec library code, so it's easily portable.
5
+ */
6
+ import fs from 'fs';
7
+ import { dirname, join } from 'path';
8
+ import { fileURLToPath } from 'url';
9
+ import { createPublicClient, encodeAbiParameters, fromRlp, hexToBytes, http, keccak256 } from 'viem';
10
+ import { mainnet } from 'viem/chains';
11
+
12
+ const __dirname = dirname(fileURLToPath(import.meta.url));
13
+
14
+ const RPC_URL = process.env.RPC_URL;
15
+ const ERC20_CONTRACT = (process.env.ERC20_CONTRACT || '0xdAC17F958D2ee523a2206206994597C13D831ec7') as `0x${string}`;
16
+ const HOLDER = (process.env.HOLDER || '0x23878914EFE38d27C4D67Ab83ed1b93A74D4086a') as `0x${string}`;
17
+ const SLOT = BigInt(process.env.SLOT || '2');
18
+ const BLOCK_TAG = process.env.BLOCK_NUMBER ? BigInt(process.env.BLOCK_NUMBER) : 'latest';
19
+ const MAX_ACCOUNT_PATH = 15;
20
+ const MAX_STORAGE_PATH = 10;
21
+
22
+ function padTo(arr: number[], len: number) {
23
+ return [...arr, ...Array(len - arr.length).fill(0)].slice(0, len);
24
+ }
25
+
26
+ function toBytes(hex: `0x${string}`) {
27
+ return Array.from(hexToBytes(hex));
28
+ }
29
+
30
+ function bytesToU64s(bytes: number[]) {
31
+ const paddedBytes = padTo(bytes, 32);
32
+ return Array.from({ length: 4 }, (_, i) => {
33
+ let val = 0n;
34
+ for (let j = 0; j < 8; j++) {
35
+ val += BigInt(paddedBytes[i * 8 + j]) << BigInt(j * 8);
36
+ }
37
+ return val.toString();
38
+ });
39
+ }
40
+
41
+ function toBytesAndLen(val: bigint | number) {
42
+ if (val === 0n || val === 0) {
43
+ return { bytes: [0], length: 0 };
44
+ }
45
+ let hex = val.toString(16);
46
+ if (hex.length % 2) {
47
+ hex = '0' + hex;
48
+ }
49
+ const bytes = toBytes(`0x${hex}`);
50
+ return { bytes, length: bytes.length };
51
+ }
52
+
53
+ function parseNode(rlp: `0x${string}`) {
54
+ // Should be safe when working with branches and extensions without embedded children.
55
+ const decoded = fromRlp(rlp) as `0x${string}`[];
56
+ const node = {
57
+ rows: Array(16)
58
+ .fill(0)
59
+ .map(() => Array(32).fill(0)),
60
+ row_exist: Array(16).fill(false),
61
+ node_type: 0,
62
+ };
63
+
64
+ if (decoded.length === 17) {
65
+ for (let i = 0; i < 16; i++) {
66
+ if (decoded[i] !== '0x') {
67
+ node.row_exist[i] = true;
68
+ node.rows[i] = padTo(toBytes(decoded[i]), 32);
69
+ }
70
+ }
71
+ } else if (decoded.length === 2) {
72
+ const keyBytes = toBytes(decoded[0]);
73
+ const prefix = keyBytes[0];
74
+ if (prefix >> 4 >= 2) {
75
+ throw new Error('Unsupported: leaf node in proof path');
76
+ }
77
+ node.node_type = 1;
78
+ // Extension header format expected by the noir code: check out storage_proof types.nr.
79
+ node.rows[0][0] = prefix >> 4;
80
+ node.rows[0][8] = prefix & 0x0f;
81
+ node.rows[0][16] = keyBytes.length - 1;
82
+
83
+ for (let i = 1; i < keyBytes.length && i < 32; i++) {
84
+ node.rows[1][i - 1] = keyBytes[i];
85
+ }
86
+ node.rows[2] = padTo(toBytes(decoded[1]), 32);
87
+ node.row_exist[0] = node.row_exist[1] = node.row_exist[2] = true;
88
+ }
89
+ return node;
90
+ }
91
+
92
+ function parseProof(proof: `0x${string}`[], maxLen: number) {
93
+ const nodes = proof.slice(0, -1).slice(0, maxLen).map(parseNode);
94
+ while (nodes.length < maxLen) {
95
+ nodes.push({
96
+ rows: Array(16)
97
+ .fill(0)
98
+ .map(() => Array(32).fill(0)),
99
+ row_exist: Array(16).fill(false),
100
+ node_type: 0,
101
+ });
102
+ }
103
+ return nodes;
104
+ }
105
+
106
+ function nodeToLibFormat(node: { rows: number[][]; row_exist: boolean[]; node_type: number }) {
107
+ return {
108
+ rows: node.rows.map(bytesToU64s),
109
+ row_exist: node.row_exist,
110
+ node_type: String(node.node_type),
111
+ };
112
+ }
113
+
114
+ async function main() {
115
+ if (!RPC_URL) {
116
+ throw new Error('RPC_URL is not set');
117
+ }
118
+ const storageKey = keccak256(encodeAbiParameters([{ type: 'address' }, { type: 'uint256' }], [HOLDER, SLOT]));
119
+ console.log(`Fetching storage proof for ${ERC20_CONTRACT}, holder ${HOLDER}, slot ${SLOT}`);
120
+ console.log(`Storage key: ${storageKey}`);
121
+
122
+ const client = createPublicClient({
123
+ chain: mainnet,
124
+ transport: http(RPC_URL),
125
+ });
126
+
127
+ const [blockNumber, proof, block] = await Promise.all([
128
+ client.getBlockNumber(),
129
+ client.getProof({
130
+ address: ERC20_CONTRACT,
131
+ storageKeys: [storageKey],
132
+ blockNumber: BLOCK_TAG === 'latest' ? undefined : BLOCK_TAG,
133
+ }),
134
+ client.getBlock({
135
+ blockNumber: BLOCK_TAG === 'latest' ? undefined : BLOCK_TAG,
136
+ }),
137
+ ]);
138
+
139
+ const storageProof = proof.storageProof[0];
140
+ console.log(
141
+ `Block: ${blockNumber}, Account nodes: ${proof.accountProof.length}, Storage nodes: ${storageProof.proof.length}`,
142
+ );
143
+ console.log(`Value: ${storageProof.value}`);
144
+
145
+ // The -1 is because the last node in the proof is the leaf, which is excluded from path verification.
146
+ const accountPathLen = proof.accountProof.length - 1;
147
+ const storagePathLen = storageProof.proof.length - 1;
148
+ if (accountPathLen > MAX_ACCOUNT_PATH) {
149
+ throw new Error(
150
+ `Account proof path length ${accountPathLen} exceeds MAX_ACCOUNT_PATH ${MAX_ACCOUNT_PATH}. Increase the limit.`,
151
+ );
152
+ }
153
+ if (storagePathLen > MAX_STORAGE_PATH) {
154
+ throw new Error(
155
+ `Storage proof path length ${storagePathLen} exceeds MAX_STORAGE_PATH ${MAX_STORAGE_PATH}. Increase the limit.`,
156
+ );
157
+ }
158
+
159
+ const nonce = toBytesAndLen(proof.nonce);
160
+ const balance = toBytesAndLen(proof.balance);
161
+ const slotValue = toBytesAndLen(storageProof.value);
162
+
163
+ const data = {
164
+ account_nodes: parseProof(proof.accountProof, MAX_ACCOUNT_PATH).map(nodeToLibFormat),
165
+ account_node_length: String(accountPathLen),
166
+ storage_nodes: parseProof(storageProof.proof, MAX_STORAGE_PATH).map(nodeToLibFormat),
167
+ storage_node_length: String(storagePathLen),
168
+ account: {
169
+ nonce: padTo(nonce.bytes, 8).map(String),
170
+ nonce_length: String(nonce.length),
171
+ balance: padTo(balance.bytes, 32).map(String),
172
+ balance_length: String(balance.length),
173
+ address: toBytes(ERC20_CONTRACT).map(String),
174
+ storage_hash: bytesToU64s(toBytes(proof.storageHash)),
175
+ code_hash: bytesToU64s(toBytes(proof.codeHash)),
176
+ },
177
+ slot: {
178
+ value: padTo(slotValue.bytes, 32).map(String),
179
+ value_length: String(slotValue.length),
180
+ },
181
+ slot_key: toBytes(storageKey).map(String),
182
+ root: bytesToU64s(toBytes(block.stateRoot)),
183
+ block_number: String(blockNumber),
184
+ };
185
+
186
+ fs.writeFileSync(join(__dirname, 'storage_proof.json'), JSON.stringify(data, null, 2));
187
+ console.log('storage_proof.json generated');
188
+ }
189
+
190
+ main().catch(console.error);
@@ -0,0 +1,173 @@
1
+ import type { AztecAddress } from '@aztec/aztec.js/addresses';
2
+ import { poseidon2Hash } from '@aztec/foundation/crypto/poseidon';
3
+ import { Fr } from '@aztec/foundation/curves/bn254';
4
+ import { EthAddress } from '@aztec/foundation/eth-address';
5
+ import { Capsule } from '@aztec/stdlib/tx';
6
+
7
+ import { readFileSync } from 'fs';
8
+ import { dirname, join } from 'path';
9
+ import { fileURLToPath } from 'url';
10
+
11
+ const __dirname = dirname(fileURLToPath(import.meta.url));
12
+ const FIXTURE_PATH = join(__dirname, './storage_proof.json');
13
+
14
+ // Constants matching the Noir contract
15
+ const ACCOUNT_CAPSULE_KEY_SEPARATOR = 100;
16
+ const ACCOUNT_PROOF_CAPSULE_KEY_SEPARATOR = 101;
17
+ const STORAGE_PROOF_CAPSULE_KEY_SEPARATOR = 102;
18
+ const STORAGE_PROOF_NODE_CAPSULE_KEY_SEPARATOR = 103;
19
+ const MAX_ACCOUNT_PROOF_LENGTH = 15;
20
+ /** Node: rows [[u64;4];16] (64) + row_exist [bool;16] (16) + node_type u8 (1) = 81 fields */
21
+ const NODE_FIELD_COUNT = 81;
22
+
23
+ // --- JSON fixture types ---
24
+
25
+ type JsonNode = { rows: string[][]; row_exist: boolean[]; node_type: string };
26
+
27
+ type JsonAccount = {
28
+ nonce: string[];
29
+ balance: string[];
30
+ address: string[];
31
+ nonce_length: string;
32
+ balance_length: string;
33
+ storage_hash: string[];
34
+ code_hash: string[];
35
+ };
36
+
37
+ type StorageProofJSON = {
38
+ root: string[];
39
+ slot_key: string[];
40
+ account_node_length: string;
41
+ storage_node_length: string;
42
+ account_nodes: JsonNode[];
43
+ storage_nodes: JsonNode[];
44
+ account: JsonAccount;
45
+ slot: { value: string[]; value_length: string };
46
+ };
47
+
48
+ // --- Serialization helpers (Noir struct Serialize layout) ---
49
+
50
+ function serializeNode(node: JsonNode): Fr[] {
51
+ const fields: Fr[] = [];
52
+ for (const row of node.rows) {
53
+ for (const val of row) {
54
+ fields.push(new Fr(BigInt(val)));
55
+ }
56
+ }
57
+ for (const exists of node.row_exist) {
58
+ fields.push(new Fr(exists ? 1n : 0n));
59
+ }
60
+ fields.push(new Fr(BigInt(node.node_type)));
61
+ return fields;
62
+ }
63
+
64
+ /** Account: nonce [u8;8] + balance [u8;32] + address [u8;20] + nonce_length u8 + balance_length u8 + storage_hash [u64;4] + code_hash [u64;4] = 70 fields */
65
+ function serializeAccount(account: JsonAccount): Fr[] {
66
+ const fields: Fr[] = [];
67
+ for (const v of account.nonce) {
68
+ fields.push(new Fr(BigInt(v)));
69
+ }
70
+ for (const v of account.balance) {
71
+ fields.push(new Fr(BigInt(v)));
72
+ }
73
+ for (const v of account.address) {
74
+ fields.push(new Fr(BigInt(v)));
75
+ }
76
+ fields.push(new Fr(BigInt(account.nonce_length)));
77
+ fields.push(new Fr(BigInt(account.balance_length)));
78
+ for (const v of account.storage_hash) {
79
+ fields.push(new Fr(BigInt(v)));
80
+ }
81
+ for (const v of account.code_hash) {
82
+ fields.push(new Fr(BigInt(v)));
83
+ }
84
+ return fields;
85
+ }
86
+
87
+ function zeroNode(): Fr[] {
88
+ return Array(NODE_FIELD_COUNT).fill(Fr.ZERO);
89
+ }
90
+
91
+ // --- Public API ---
92
+
93
+ /** Parsed + typed fixture data ready for use as contract function arguments. */
94
+ export type StorageProofArgs = {
95
+ ethAddress: EthAddress;
96
+ slotKey: number[];
97
+ slotContents: { value: number[]; value_length: number };
98
+ root: bigint[];
99
+ };
100
+
101
+ /** Loads the storage proof fixture from disk and returns the contract args. */
102
+ export function loadStorageProofArgs(): StorageProofArgs {
103
+ const fixture: StorageProofJSON = JSON.parse(readFileSync(FIXTURE_PATH, 'utf8'));
104
+ const addressBytes = Buffer.from(fixture.account.address.map(v => Number(v)));
105
+ return {
106
+ ethAddress: EthAddress.fromString('0x' + addressBytes.toString('hex')),
107
+ slotKey: fixture.slot_key.map(v => Number(v)),
108
+ slotContents: {
109
+ value: fixture.slot.value.map(v => Number(v)),
110
+ // eslint-disable-next-line camelcase
111
+ value_length: Number(fixture.slot.value_length),
112
+ },
113
+ root: fixture.root.map(v => BigInt(v)),
114
+ };
115
+ }
116
+
117
+ /** Builds all the capsules the StorageProofTest contract expects during private execution. */
118
+ export async function buildStorageProofCapsules(contractAddress: AztecAddress): Promise<Capsule[]> {
119
+ const fixture: StorageProofJSON = JSON.parse(readFileSync(FIXTURE_PATH, 'utf8'));
120
+
121
+ const root = fixture.root.map(v => BigInt(v));
122
+ const slotKey = fixture.slot_key.map(v => Number(v));
123
+ const accountNodeLength = Number(fixture.account_node_length);
124
+ const storageNodeLength = Number(fixture.storage_node_length);
125
+ const ethAddress = EthAddress.fromBuffer(Buffer.from(fixture.account.address.map(v => Number(v))));
126
+
127
+ // Compute capsule keys (must match the Noir contract's poseidon2_hash computations)
128
+ const addressCapsuleKey = await poseidon2Hash([
129
+ new Fr(ACCOUNT_CAPSULE_KEY_SEPARATOR),
130
+ ...root.map(v => new Fr(v)),
131
+ ethAddress.toField(),
132
+ ]);
133
+
134
+ const accountProofCapsuleKey = await poseidon2Hash([new Fr(ACCOUNT_PROOF_CAPSULE_KEY_SEPARATOR), addressCapsuleKey]);
135
+
136
+ const storageProofCapsuleKey = await poseidon2Hash([
137
+ new Fr(STORAGE_PROOF_CAPSULE_KEY_SEPARATOR),
138
+ addressCapsuleKey,
139
+ ...slotKey.map(v => new Fr(v)),
140
+ ]);
141
+
142
+ // Build capsule data
143
+
144
+ // 1. Account data
145
+ const accountData = serializeAccount(fixture.account);
146
+
147
+ // 2. Account proof nodes padded to MAX_ACCOUNT_PROOF_LENGTH
148
+ const accountProofData: Fr[] = [new Fr(accountNodeLength)];
149
+ for (let i = 0; i < MAX_ACCOUNT_PROOF_LENGTH; i++) {
150
+ accountProofData.push(...(i < fixture.account_nodes.length ? serializeNode(fixture.account_nodes[i]) : zeroNode()));
151
+ }
152
+
153
+ // 3. Storage proof length (u32)
154
+ const storageProofLengthData = [new Fr(storageNodeLength)];
155
+
156
+ const capsules: Capsule[] = [
157
+ new Capsule(contractAddress, addressCapsuleKey, accountData),
158
+ new Capsule(contractAddress, accountProofCapsuleKey, accountProofData),
159
+ new Capsule(contractAddress, storageProofCapsuleKey, storageProofLengthData),
160
+ ];
161
+
162
+ // 4. Individual storage node capsules for private recursion.
163
+ for (let i = 0; i < storageNodeLength; i++) {
164
+ const nodeCapsuleKey = await poseidon2Hash([
165
+ new Fr(STORAGE_PROOF_NODE_CAPSULE_KEY_SEPARATOR),
166
+ storageProofCapsuleKey,
167
+ new Fr(i),
168
+ ]);
169
+ capsules.push(new Capsule(contractAddress, nodeCapsuleKey, serializeNode(fixture.storage_nodes[i])));
170
+ }
171
+
172
+ return capsules;
173
+ }
@@ -2,14 +2,15 @@ import { AztecAddress } from '@aztec/aztec.js/addresses';
2
2
  import { type Logger, createLogger } from '@aztec/aztec.js/log';
3
3
  import type { AztecNode } from '@aztec/aztec.js/node';
4
4
  import { TokenContract } from '@aztec/noir-contracts.js/Token';
5
+ import { GenericProxyContract } from '@aztec/noir-test-contracts.js/GenericProxy';
5
6
  import { InvalidAccountContract } from '@aztec/noir-test-contracts.js/InvalidAccount';
6
- import type { TestWallet } from '@aztec/test-wallet/server';
7
7
 
8
8
  import { jest } from '@jest/globals';
9
9
 
10
10
  import { type EndToEndContext, deployAccounts, publicDeployAccounts, setup, teardown } from '../fixtures/setup.js';
11
11
  import { mintTokensToPrivate } from '../fixtures/token_utils.js';
12
12
  import { TokenSimulator } from '../simulators/token_simulator.js';
13
+ import type { TestWallet } from '../test-wallet/test_wallet.js';
13
14
 
14
15
  const { METRICS_PORT: metricsPort } = process.env;
15
16
 
@@ -25,6 +26,7 @@ export class TokenContractTest {
25
26
  node!: AztecNode;
26
27
 
27
28
  badAccount!: InvalidAccountContract;
29
+ authwitProxy!: GenericProxyContract;
28
30
  wallet!: TestWallet;
29
31
  adminAddress!: AztecAddress;
30
32
  account1Address!: AztecAddress;
@@ -70,7 +72,7 @@ export class TokenContractTest {
70
72
  initialFundedAccounts: this.context.initialFundedAccounts,
71
73
  });
72
74
 
73
- this.node = this.context.aztecNodeService!;
75
+ this.node = this.context.aztecNodeService;
74
76
  this.wallet = this.context.wallet;
75
77
  [this.adminAddress, this.account1Address, this.account2Address] = deployedAccounts.map(acc => acc.address);
76
78
 
@@ -92,6 +94,13 @@ export class TokenContractTest {
92
94
  this.badAccount = await InvalidAccountContract.deploy(this.wallet).send({ from: this.adminAddress });
93
95
  this.logger.verbose(`Deployed to ${this.badAccount.address}.`);
94
96
 
97
+ // Deploy a proxy contract for "on behalf of other" tests. The note owner must be the tx sender
98
+ // (so their notes are in scope), but msg_sender in the target must differ from the note owner
99
+ // to trigger authwit validation. The proxy forwards calls so that msg_sender != tx sender.
100
+ this.logger.verbose(`Deploying generic proxy...`);
101
+ this.authwitProxy = await GenericProxyContract.deploy(this.wallet).send({ from: this.adminAddress });
102
+ this.logger.verbose(`Deployed to ${this.authwitProxy.address}.`);
103
+
95
104
  this.tokenSim = new TokenSimulator(this.asset, this.wallet, this.adminAddress, this.logger, [
96
105
  this.adminAddress,
97
106
  this.account1Address,
@@ -0,0 +1,50 @@
1
+ import type {
2
+ ContractFunctionInteraction,
3
+ SendInteractionOptions,
4
+ SimulateInteractionOptions,
5
+ } from '@aztec/aztec.js/contracts';
6
+ import type { GenericProxyContract } from '@aztec/noir-test-contracts.js/GenericProxy';
7
+
8
+ /**
9
+ * Builds a proxy forwarding call from an action, selecting the right forward_private_N method.
10
+ */
11
+ async function buildProxyCall(proxy: GenericProxyContract, action: ContractFunctionInteraction) {
12
+ const call = await action.getFunctionCall();
13
+ const argCount = call.args.length;
14
+ if (argCount === 2) {
15
+ return proxy.methods.forward_private_2(call.to, call.selector, call.args);
16
+ } else if (argCount === 3) {
17
+ return proxy.methods.forward_private_3(call.to, call.selector, call.args);
18
+ } else if (argCount === 4) {
19
+ return proxy.methods.forward_private_4(call.to, call.selector, call.args);
20
+ }
21
+ throw new Error(`No forward_private_${argCount} method on proxy`);
22
+ }
23
+
24
+ /**
25
+ * Sends a contract call through the authwit proxy.
26
+ * The proxy becomes msg_sender in the target (triggering authwit validation),
27
+ * while the actual tx sender retains their keys in scope.
28
+ */
29
+ export async function sendThroughAuthwitProxy(
30
+ proxy: GenericProxyContract,
31
+ action: ContractFunctionInteraction,
32
+ options: SendInteractionOptions,
33
+ ) {
34
+ const proxyCall = await buildProxyCall(proxy, action);
35
+ return proxyCall.send(options);
36
+ }
37
+
38
+ /**
39
+ * Simulates a contract call through the authwit proxy.
40
+ * The proxy becomes msg_sender in the target (triggering authwit validation),
41
+ * while the actual tx sender retains their keys in scope.
42
+ */
43
+ export async function simulateThroughAuthwitProxy(
44
+ proxy: GenericProxyContract,
45
+ action: ContractFunctionInteraction,
46
+ options: SimulateInteractionOptions,
47
+ ) {
48
+ const proxyCall = await buildProxyCall(proxy, action);
49
+ return proxyCall.simulate(options);
50
+ }
@@ -1 +1 @@
1
- {"proof":"0x00004d6006f32a63ab1a10c44b40a14c94fd4e693830a91920a63778c91df75b67c3a2590000000000000000000000000000000000000000000000000000000000000001221894f21cae5e98d0c7a1a2658eaf169b0688cf8348dc7be4d5a944d568bd4600000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb00087e2b1632207a64d2be3430a622118411f15477dcf399a057660b8e566041001c2aa1e8a9c646939d1d0d3a1b789e2eb024aa538a4c7864db736646faf6cc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e586311f1581539435ce58c90ec4a9d291746a8b33999d1654faffb07f382db2efd3fd6b542f09e9f76c84337f46370f67729ce54c815d35866b4cb2a2672030000000000000000000000000000000000000000000000000000000000000000003f1c36600e57c2c3556b97fe6d9919a7c418380b539dcf74182dacf5baea2e16743433c1b3d551429cfbc09ab7899d4e14d2b5786a3243e29bc9c6c0d76bf100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cf1e314549c5109330000000000000000000000000000000000000000000000078ab65cae0766dac4000000000000000000000000000000000000000000000006d9729dd2114d251600000000000000000000000000000000000000000000000000025bb48088e2d6000000000000000000000000000000000000000000000004112c333273480d9d00000000000000000000000000000000000000000000000e79ddc992614451e3000000000000000000000000000000000000000000000005d880c4e49e3909410000000000000000000000000000000000000000000000000001adc707a50e7500000000000000000000000000000000000000000000000591960a3c52d5a331000000000000000000000000000000000000000000000005d69c43aaa65acc860000000000000000000000000000000000000000000000011ce4d0df71d9b0da00000000000000000000000000000000000000000000000000007c4b84e96f1200000000000000000000000000000000000000000000000e796d0a9ec64b048d00000000000000000000000000000000000000000000000a9f1811bacc20b1ef0000000000000000000000000000000000000000000000081959aa974bf5661900000000000000000000000000000000000000000000000000014ac071abce30000000000000000000000000000000ca9d55b6e986c398073827360972cbdd6900000000000000000000000000000000001099819f900ee75e8a6ab54c59fa4000000000000000000000000000000081180a8b96072c3f4246e9a036d07f3507000000000000000000000000000000000027d2cbe77a3e0edefc570e90c90b9f000000000000000000000000000000d6ee6d7b1ba024766d6f835521249b7ae4000000000000000000000000000000000016a0da7d14c7230116a9948f6550ca00000000000000000000000000000019227c5f9b9bc32f21583696973ff92ffe00000000000000000000000000000000002e72b67d18384e0ea627c38592ab76000000000000000000000000000000f4ec1a574da16cc52af9cfe52a0a88ac0800000000000000000000000000000000002dd342a68d2d19b030ec0b82734484000000000000000000000000000000f24ff72c85a62ed5b9cdb3ab52878e5d6600000000000000000000000000000000000f7afb370a128f12d63e3649ae47790000000000000000000000000000004b35876712ed72f6999ccf4346aea9dc8800000000000000000000000000000000000b9c4ede9e05409f4df0b886e12a1e000000000000000000000000000000f4338b85257350c3bbafb99d2c1464cb8100000000000000000000000000000000002efbe244cd2cfd9aa0c8f71e50c96200000000000000000000000000000054f2bc452d87e94668fa54fdb54790c9b0000000000000000000000000000000000025980f026372c596860eda2a791d9b00000000000000000000000000000047dd57b3275e8f09905f26b7bc44e48bba0000000000000000000000000000000000010988e60c8f065cf95a1c9a292364000000000000000000000000000000c9119a149e8374416e40f7586311a3861f00000000000000000000000000000000002ad3d93fb74b1be165a915ad72a3380000000000000000000000000000000148b87898085b1b8b915c1878b2a188d000000000000000000000000000000000002a91ee00ef56a5964ff759ca2990ec00000000000000000000000000000091163f22963ea9894fdc40b2516296029f00000000000000000000000000000000001db9fdde7620ad93d46e0fad2cdd1f0000000000000000000000000000005ce65ed82881f4f78356cbe6d94699849c000000000000000000000000000000000014250c7cd0c960952568293d732d20000000000000000000000000000000cde964c7dbc45d7bea0e22c409d3f4bf960000000000000000000000000000000000016cfaf8940e476cdc1852d5a9172d000000000000000000000000000000ca8d4a2f2ec921c4b8f591c2c27dbdd8ae000000000000000000000000000000000027d9c460264941701fcd49bca2b2f61db5f435f1c9b1b0f491d38cf071b8cc67cb453563b2b60c99daaf55a85360d412ae5a3cef67ee78c3be7229910f9f90c068a3131606ba84aa07463e47ac9f2d2fa7f383cb9bda2055d025ba59925a45d09bbc3abf2a607ca649a641fbf19225033120e4db3ca51d56e3ac61527718a0a5f9d106973575780d8803c89bd9e7be0fa40d87661532cbf29108288ae6a1ceae9eb3fea4d2c7a767f4196a8d4117c52bd771c13a22a6986d53dc0734cc775e2b47c6538d0dd5f82ca62ea90010607802774fe2ae0ded6cc0fb00f591b98a8a17e9a1b0592973bcef46339b184bf1660220da8db31103b2f88257f3a6a49c41ed8895a8c759621d5994e7b71b3959c72c4290a83a957c5d7ec3305efc4137c921bc019382bb97aa434a5b206e60258a2c6283d5e2fa72db956e03a261af9807fb352d8394e8a3f8f497604c586cc43808ba9508f19dcd2c88ebdf68f7faf36d5a4ec4b5355c318734e8273a864d923c0d122ead90fb432d9beda2e8ba40fd5132ba52aa3def71f2893378e49b0c65eb0b88e36f6e25b4d27c975fa867555b51cbfd9412744819e753db95c7fa1087dd0965cf48bc50a9e96cbc1b1ce8b2ca27132029dc01101c7e1a13cac34ce8fe0128c1d28e4d69f5057c8eb4de3cd1406dbdb46f45881b41481faf3942ad75aa5612ce5af105c235ef077fae32c577a820333addc7d22ee9917dfe1823b8ff645023a789b1287e074fc0d44e1ddf5c64dd272a6ab61cdab64b9c22e95a0beeaee52b960f0eb444467e546c409a7def039a1ffe2323c7609b807d184b0207cecef406f5e7a413f18d01a6c9cd20fddcee991b2e66c646d2133bb4f296ba1465fb042e3308b159399371602a4600934b56b48c93e145ef89b8ce32e0c4319420852a260fc934bb5b2ddc0e0487fe59a88b074f579df8bc93218b7a750e7656885a450e7e8e3acc01c991025dfa5c3a0c733c02b51b4596ed1b6cca3da27a5aab6f81059fca6c74e504744b8e4f4fcf34be13c1c641e0fa69cec87fe2e61d3828f5ca2c3dd4e23ab8365dff18bf503ff9298b0f7cc5f79640672faa67f6c15a82dd6019b949fb94e03235adfec37cddf6e0c2db7803662f70f700a4134f05db1b7f331aabb24920355a935d257979d043b6f419fb652bb0ac3354a5cad5c22ce0b029083005d775aec13fe5215f2998092ce9d9c6b59e876900ba4a218b02112eabdc30339b7d9b74c357275ee52c2e92e9f840fee659f063205ee913b8771108cd7205061a27fa68b0a5d11ee01390ecf9db47180fd044e5b8e68f20876cb59d884a0634bce681ce910d3839decccbb99548e4b2c48ab58008138387a88edbd3bf541217acce5c99b311743f0a885ab4fc5be60dbd12e3691c9fcded433f2f23cfb02b5baaade2dc7bea9687c53ae5cf93f89ddac6bd8a898b1933a87ad4bb9a16ce069c746023a2d0aa491466b442061961118dcd93432104a203dd855a6a75268d06ef585e2f552d811ca934b2a17e7ce192d56bccdd8262e621a8cc0be364cbd4119113909bcef03f3d310d79c12987f7e2b9a5dd5e76438542e66c6ffb48a32f0baca42f56b4d0387f8ae9548347a56c0b7fed358db3e8a6b2267f0f4186b6a305bab73106ea0559c0c38c8b8f91b56ff8826107e411a14512aa75d9dfea89e51233560d096fb5ede83cb4925de73194869a980b0e3e4f362125d5ff962c13e60b7b5445901eb8aad7c273af9ad2154914b6d87791dee5348803b5f07b63cacc0fe976fd85339a6192505b8b1bf27e0a3947b87e57b803e091afe80a04b88f370722c07c87b4163022c8a45916f0232d73770f3186094533fa2cef9cd818384c0ddd0c4b7802230ae60738f44ac6dfaa3389a3fbbb103c5948ee0262c45f1c4619b30f1fe28037be4f630cc577705107bf585c8183c4b74fe16b9ab6f8c6dba016585ba8ce2bf3e24c49f75fedfc588b10b3d46d4b400c49335b6cee47ca48ed1aeb8bdfd317556091d058b2d82713ddfc91adae10e46be3d90c02bd11c8761e10118eace939f78fb4b27a698ec4e0660bcc540a7c6f921152185a748d5932ea10622bbbc32f885edec3a69cee3773be88a2d58199243b961efb6d4f85468f5d1d3b7315511da9a1138808b18e684baffb1ca91f77901e9928b5e31492e037600e15f1818fcf0970b973bbf36363a463c156abb1d417f1b9e674720beb55647c1bc7e1ef4a8fed5d330baef509cace450e5a5284728d158b39729aa5c09017f21ae28c00e7d7c53ff73e934226723e2f54ff4d20335249473988d3c769e0866720b787e351441001b269c93c71a16a4308f079e8506fbffb3e8fcdbd279dc03003b0e7b77b29093846aeb08ac57b63e9e6ca5da9ff9a92da45ad62a2851dce1617d2a88bb172e575a8fa2ea2b2a73947d8e0bd1e5258fe80b1f23427df5bfd1d0c22f8ca454458f49c05d75a7e015a7adaac6b6a680f2a1f847b8f163a64714b156ee53bd2b5bc153cbac4b9b180b5eda314f86176b9c3f848aff8967e1be2460e45a56ef2c2e5d2a6a432d6b68f99ee6d5bb23934cee0752286dc5e3bebf0b51fd1057ecbe5cdb0777521739a2327d621a2dbb14cf95d64fe5781595e63dead24cf5131c82145bd4d92ed504e9a60893596cdf437fa87481fbe335d33320fe42a330d852b76c0aa33dcb22045d4124e63869a825b672655be11f1539e7fd7ec1d925673b23327ac733382033d7526b09e7816787b77f4025dd8ff9560cd39b607474d881e61d07160c81c07df3d19c9ef9279ed9b9a87fd1b302f2785e6d030135a68128b627337aae616fb0c44ac0904a728e56f32b48a05c43fbca7193b3c0cbaee34a10be73cb5efb067e0a6f639fea08c4cfd9054de1dbcf775f97690502d6c3802b5407c5bb25ef4c51c82dd15622eff5c0dc883975d210126340293c608be656b21422672140c9e218cd85d7a06d0a212266afda817112a23263c790319fdfc82e8ddc9bba8ac8fc18ebb4b74655ce6a87e4fba40888f391e4483a22f17cb0e241ad558f67f921a28be36647e025291b8c3563c0d4195eec985b4b7f31cebd69fd1277c3b71f6a95c2a95745799bac4bfc84d2d8180a3352d6e7c5ec11e9470e104ed350bf8adabf8a5fb98e720f31d8d43b89260c2edb61fd9200a002b069ac3f27375d0a7a99c30137298490a133441e1659a869a6a1738969f55650ae5e20015818c4abd45165534290130c85af0656687023c6771d9b8e96507c02b0afa988c0a3329876aa1cfadbb760660dea99f70828bfe29c5272b7b128f220708fedb4747e814da49a8223d67d398335cd60746db92f3bc2fb4dee71aeb362bc028e3a57b7c3b084aa1a3d7d091fc348d7e6c66ad39307b7bb150b023d76a017cbd7259a19175f3d12a4049dbb68cd9bcc1d90e247fe3e7575b9be5548ecb1303e4899b05ed3fe96c6daa0159a41e5caf66600d0fe9776113d4ec10e32a4a1f17c4577e3e940b49c068b65f30d171a3ed813ec34c3c6a891f76c3aada0b851003e6d72ee3374d19ddd79b82631d45934204c3707e2c53f6249252b1efb95e1b944e13ea3442a2b425c64caa62e80d5a8770526dff7473d4f980773b3087040fb1e72eca5d56620add7fb2772dc91481d845d7e69c2cac5d11bfe8476cddaa119a19be2f7d19a0d6cf00dde3cc7727b829497629abc11ca4c2e173169b12bc284478c0b48994489cb12d0313b8bb5fbc3f397e6433fd13e6f20a9945a128441a52d9e2b37bdb97aefff765a8757deec39f6da1e2c5221d6e3eebfafd98f1471356c5e502404156f8ffca15d9020bc4c34a9f37b35a8759ee0dd42cc5f01eeb00fd87fc66bfc33b91e0f1462a6df820f8d06e5286d8f2b6a8f2f28cdf3b869e2347e75edb5dade6a2341fd6119ce9b236e2f8b103c95112de486515b7ef021625dd028a3009bcb2001879d0656d3f538b2181096e10afaa8741f69ae7149a9620e4005c11c98c438e7d9a9d13eda86a81031e59d5297df58ab48c33a22fc0e00e44373fb8eb35fb90540370844e2368e67f5f51f296af41afb124c5790c307f19a15d5e07a6d8615b623e0e0938b71797048cd0124124983b6ee83f476917c80aa5d7e6ff05d2e6a0871beaddb9e6cedcf9c291fe353896accd666121822ea2184f582f6ac8ec7dd9219b915ec779ee54f5d3cd398680fc81412943f8a9285f09eed8558d9a143946f77d90e49643e4088cd905eafbc32c117491ac81bd7d8703789147fc529acf0d61b7a43545a58a776d881fd9b88b39424b5ffb2c29bd6003bef49bdf90fd9119c2d3b1dbfa1f21464f9429a7977716873c9f4ce112777b1a9dc0f03761819893c52014c0e734b1bb58eb4e8c4817b727fa3766e6b5da8f0e45d6ef3bbed7662348782f6a74fe492711a610751aac932e014c32a3da7c312c73dbe8d0e04868315b24722c96b397eb20f4f071c40c58db960ff6acad6a552673df936d8d40e23a027a917fa2779fc7edb284a155773c725cd73955ea7abc2cc4889333eaa6809996e123959a3a3f8d83c96759ce9e3f7c6c09730bbdd98c1aa07c0680a3d9e6dd843d24e7fe49ec9d21a62d54bff6f64a9ee5e08fb11c3a2f8ad777f36bf832803321bc86f1f4a4f72a2eb1fb41913a6cc6dccdbdc340760ffdaff52d1f1245c0d8334d72f5cf99bdac2be88f755d6c37a8214f12bf49e7153b7e75165d3d6920173724eb228e37c3d3e869772d7e982b350e29c07bfa6311e701c78009064faa24e89582b68e68440c660c810f11d316d670f4aa66e05314c04145895b8d875b1b4dccbe89457ebd946fe0523dbe7ddf5fae64aaea32bb0a84ad33f4b8005c00eb2535d0a9ccb8af87ca7f42a78503ab8a07acd630363f2e1a87cb164e41fcf1be838f39a66288ea938fe72275a6db9cfd23b5a51ffd0a1d8ab5b1ceade4fed78376d97a2ae58b1c68c4a53350511df91ff5710ee2fa4e1649055bb19084952ada33df6ea0c8e0f1e549a2f1e6fbf1988fdf00184c98be1431b48ee04df9088e873dd33ef27eb0256512d25f8c0435cf698d52271f82872ec03f71561862b3435535f6e71f1b075d9d544d45ecc11695b695deb45d750026c294d56366e281ab66f2dd3994a5ac3a14ce157aa5d566db035b00aebc0f801e232803cca81f368079508e3a55a9e8c0914d719f7dcab5c4540d050097c61f2e0137a33b9d4e9c67c0b93a22a3b77bed25dac563925b1077627300712f42751b034ec5b3d57085922c3e7e7359bf4694070e43519adb125ea0fa5b964b20a512d95dd6694bd85101318c90fe2e1267efa53c6496c9e076368292c53c4ee56b19c683ea9f5b1fc87532eccdb8fad939f3687f42694b6af100fa1cbc6c27c8102ae94ca0d7c16c9e8ac6ccb18453be033acbf503e4811e59513b058c4ee7defe1b405e22adf7095fc5c8d4eefbb0f50989d6888e6fc9feeea9cf4e198f320a0b0812e27e24b7d3da6e853fdab5c92f85cfd8dd411c6d6c89fb3edb60e4fc3c670c8fc09cedbf16e9c156ef9bdf4f3af22f9901aa20dda1848c8aac42e59984b4031093542cecf7d2c3a039af76683801b33641e348ed611ac1013d83185c118926cd7af617c3ff1f9fdd3837eed0139bfe0d0432bea5f34a65a36a0a873846b028aa1680748beeffe1a802c1659cc25c9acf2f91fe6bb8dadd4436a80b9370e914d13105c4dbeb1bd584ce3987ae2ff62b245d26b2529874d1f49fd9449e6ad61a8993ef077f2bd170851e3eb51ba4639d81ff2fd9196e8d062227d1c1c344e412d030082a057b6dfd0d5036fd87155a2d759bfdc47245d2e55c553ee876dbc509aeaef065e60c37b09b8989af2f54c604047063bc040e07fad0677c2517f56b1b703eec763782336c9a5863ca6e1f2f52346b4586d2447d552f4f8a68cee8d4257b0fe89f35d6b5cf9d1aecfd13e5295f726f06b75a2ed43a0db405b3f1529f2beb899ac04e4b50cf45a7b68765ef92ab03785519983349f9d884ff92583e0120d9a298acd1dd9ee8234b9c35d6978ff9a282f826c41be47e647e48235ba2ee300fa16102f76dde521ddc19d186b73c27ff9b3b341d1d8ccb71664c02b74a4421d22b2ae4d624350dc2cfadb8202659a381c7d458ed1926d8cde3f3bafdc4022dcba972fbff1cbd43002e205287081e346aa39eb981df15dd01008bffe8375a0f7f302db96bbc960c5f1b44186a28c22f3efd2464fb058313bcd623d68cf3ee1424dbf0dd7f14784dc6874ce573e88dec8bf168a30d724f389436c4a1bbf2141a6307ee84eb712e53b73a93361b7ed19949e68884fb50f7782a172716c134e2030140bf394b092573ecfcc9771fe2320b4b4f1e7462af1a510ec78d9317fd51281ab64c26c0b69ff6dda6ec0528186ad0faea1e1f835a8a03d55265c99647d21dc60b01daa3c3a826a71e7a81d424ed4ef70548004185d1c394a6a4c91c75e520a1665d716cc07e8db3490df6f48695e59fd24df7936adf11fd6c76f3b93fc61af47d4f13c560bcd9f66e0be39f31fe9e01f103bda296ca7a24a1369197a2ad04e2eac8c21f92e029ac27cb43e84940b5c07e9612329c5fd30fbb79dbddd0a226da1b0cddcb5ebe352dfef7e8214a5340477d4b63f597bb991de61ace715c7503c9c99ae748d77219ef2c7afcaf2db0a0ce84f0888f8f92834caf45fa72acf81bd0a24d39f36eddbe02a9ff88b0ab7252df0c39b70805c199bc2d72855b069f13f9e8f0990780814ff0852b103ccd7bea5e80e118bbf517223edf1058498f070ffd27cf08f39ba10af54803457db4066b029146c7399e1ef16e54ff7e494e1b02d84c168f6c2a12450279dbc4544c0dbeb745c86fc87632dfe85ca8fc439d7a3053a9b1c63c64bb32940ae3a3cdba614ddd6ff98b102f6fb680684257b655452b3082fc1456ddb5eb551a5652fc46bb553ca9bfe5fd72c710a0413c4b7e5b200b37ee615524093473b99318f268a2ccef91d09ca66aa77bfa32bbc9149076dd272834a4848f29eb304a652567b5f6ee9a2d42a6c431669f71ba6bf58a2a982c1e28c5cd23179ce6f559c5f5132bd2b698b3161724d96335077f67dd22fee9951b852b6f5169f1194c61a9c526f2fbf8f59e3f9d58ccf91a655ab60edaccfa32042fea7b8a4c37f7afa5dad12747f6de96fc9327c4cf0abb75ac2322aa90d87b13816f3db7113c9114f403bc0fe5573ae876d9930e8ea7af5e48125cd50b371d2565e4cdfb5923b279a6dd8230e58e3b5afa585fee6674d6e5716db5a2464abf23163d7a16ca25c7ebbd95f03498337faf402c703b4c0867a3d39cc707d4dece2281551441763c2b90e0cd7fd734a34bccce474462352281c5830502f5e247050b1d1c46d7897740af413cb9c46018f2eeec615c65ab5a7965ec4b35391daacf0413d252d650f28c2efbbe4aac18145370a218b8a1d79e24ae8906fcabcbc530207e7de442ddd569c4763e77a97d200ae2be108367ac43d3d366bc0c36982e38228b2be51f841a9cfdb98c9f42cab2e34ee55afb8ed45b9430eb848967ae9cb2049aba7b95ae916910b49ccc9787901a2ec6f851f8a0ab7021fa43fbeffc93cc06facafaefd92b11704a252d5ad6e16f17ae8a9b1998a561789934b901b4159e03b0fbb480bdfb6f663959c4b29562d01e8a775b9c44b9e1a62d2ba4a2d85685066b847dcb0f8dcc4496b10041d5bc6234e0ecf76497a0193e7e7aa2609b300616b10c3692f12f4b265f2639d408d25dac1acee6c59600a0f01b98fbd5dc463b040214f30d7b358346351c2825f8104f1546f13387059c8b39f07a9c1863194d2b73c577664b978c19b6bcd65e64afd4927e78ec1d8626ecef2116052ace280816fc1b1cc186d0f276153d9038b7b2b3bc077f9c8a3ce84fba4484b000a8d47d19f9e5328cb52ddab8b88ef9abf4e9f84e7fd97df6740733a16d85a98cd4569624b3f2e5ff7f8d254e5ef53286e60c710b446acac2704137a72f156720f855cc0255a3365ce594033b07eef0c3033ce98118f564819ef65801f53bc1e0a34a0e21abc7411fc71c396e42edae13f5f807f7a2f79b8c85f804be41070f664a2c571c164582c928f7991d0b22e25d1f3319f1b60a61f7515b50b5889d9f4bb860b5145a3e6522506fa7aa34c7f87ee7656ee848185591f8f5f483af0ad1485186d31d613ef216c8789674a42073931c81ccabd884b77ba1479cbfa6aa3f3ed1b9a420f7ce535d19d4da400fe4c32c981e2087aa0c29d1f0142ff5a9c153ddca84062e79406b8426c4f97924950b9ef82f6a097abce445a09f7f869030148c9f7a72195870a9eeea8aa29aa93ec2921103c5bd3432207786381afb0ee572f2ceccf0021d5a2ce58679660f61d0d2619a3449489dcdc282f178223ed4f4636cbdfcc2118d31fba11378eb82c9ff5bc03bd69f198fbf63a5f6befb633be1a9e8e2bbdb133751ac604cce3cec313b48633719e9dd0b8a7916771a4b945c48996d13909c2fb952d39ac4adb75ecc2a4cf5db2178ad83ac95355ed862621304fb3d86fac62c61cca81abb5b628bd37472ba4bf4dbb3b2667eaf3b476ad980d87561512d9a10317c74dd2157b5e6181f1ef7c73438b3a4d394c401ce9215d3d03e4d3fe9e8105e648c5c684be8cc1c57c6e7bc70e29a47dd1bb5663d9b49b0b8ff3e7456be1113c8c8eb409d034d5688d6d148d416a0fa3945dc3860f23ff1ee6f4d8ac219118a28944db7061c51457c09bf97c8871a6ba6fc71849ec5baa7420709bc53b21aedfedc384f01d9c01e0091ff2736074143cb080baafff845ddefff7700808e274a56bf03d38c256536603878e346d0f47ed7002e7da6347b63a996f4fff76b2e000b11d6acde02c82d54c02c6093f099b481dce32022d817f21968a9dfd4a623822000dc618333f1929e149b18176c476ae4962042cb735a78a9b38eb30dc629a45947e5259217eec6266b3245b6589abff779e7b07d875fa903304ee96a1c16f5ccb122445362c13a16d2396e55666509342b9a9007337c0f22ab153a07920000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001402f7659df3ce4b0bfa819b34f29c0f800d94162e03d2a4be37a2198f936ed70db4e58202eab407bdba483e989c8111922c71128e041a66da0d33f4835259d402d89783ff57170ab96b3aff910be4d2b64533b63d1c40433ed765c8a94cc6332e5f83b76282da1f46f08356349ad2582f792eb17a2673e895da46e01c2c8f350aab4e3cb5da218e9e596ba882ef9d62d950553b7f4f7ec360802011f5e85ff91bf63aafcdd53c44fe2db368a87455f21216924ef69539245eedfe6c6d32fb261564f88acfb671f82dec451fc8d19fa8a83ceb159999bd06396dba6a273bd093099f70a592e3cd931487dc21b8579419924a55b1eb48acd718d81d2188f854a22d2382f46605ffa664d0bbd3db337760273af98b957ad443d4304a08548aecaa1a4d6ed4e7169cd76a91b9fc30a006c4d32de3b2191fd868422affb2b6425a0e1d408d02105c088eec9cafab13a5c8581e09c0d7b46230ac8ce3eb78a18e0a9e300e2e5755002c308852d2d7a63bb4fcbb44b465bdedbfa618948505cc4b7ba23038d231dc8a11bfd7c078c21684edcb89b585bbe94ff795bbf76ad19642ab2d04c59ae6995141156908b56567f1aa2ff9fde626abda743706f3732c97460da423232162662b2d1ada17aa317cc8eaa705a07664c549b68f68837509f545c4f21f89a1cf2e9bf58f4c3826abd7e36442159374b0b9fbf1f068455ee46d5fab89217b00e1d5b92e9eb8e080ebde50fb3b142f2c7ad82359e56e7cfc08ecd802ab089aa2a8f458d4c5d20d5b4af86d7e93679d733ba41771d2c600b9841c012732215d655092a96f71ea81cf619fdbad73841d58444ee320316dc33a9a6247cc7f00636ddb0f5195c8cf49d66df0d2fa81e71bd0697589d7d16e9d66736e4ab21a1862ca3242544f5944ecfae168e77553b865263a1b5c4015284476549d4341ff0f0a9ff123dc5981de4646f53305305acddbf6879e0cb5e1913a2db655b2c3fb0e471d707375a93f30c500c1e6d84c2482e67f8781e2e7a970a7a5b819c179602dd80ef283ff3b9c6ecc7644d3995492acd0c6b34ce7a042b67ce44de924a5cf2895daf8f1953387d27048afad60b6625707aedfa2280a4dcf7800605534119f0a403b2e983004fdfc563ea25be5a8fbeec9a7977866e39376defe79a02c600816a39dd8f7151193c9acaf5ff453f9fb0f1287a54b886b3a73d22e7a8f350a7423abe64976b74963111ac5d96927dcd77d9c42e226815ef093e7aee71910f2410a4871f6f2f3fbc119cd73de82053a670e2d8271532c74dfc10b6f21e27f6d1623029782b7b3325589642a9b62b5646228f7761dddbfecdbe601dfe68dfdb4b100c68140a2e0c1f8547a8907d10c97228ef4ed84d836ec90895a8041c3b2f18323202006853989462ddd65da3e0fc9f341af8c027f49dfc3b6f450401c3bc61f05651b24f3cbfcb90076d8b52a653d214e5defa2a91106a01dd8b97701e7dad4166e196a20a4d78ee1d4fd6b759ebe21dc4749546367c3c8cc5ede0d04684b6101c3691c0bbaff670529eeccda5bd603065f4badb3b420f7ac3cd6df3cae9ce81427a4594869cc7ef87a05bd16d9fec0755be22d8379ec4455e3673e5e6e296110b58c1fbf16379a111301021f14f72bdb1d6823cfe3c3b0845ef2ecb4e14d1010af6857f22c5a75427ce225894454333b6cc21cbb530b73b62577773d55dd3d110f67b79bff7bf6bc29e6ea7d626e555374bc721c310bb584b06b0489ccc6f50060dcca1e966da7b611ee59a6aab337543b38f5523da01b751fabfcfcfde70a0000000000000000000000000000006e99400a2e669210b323b13e4a559562340000000000000000000000000000000000113587ff735be1bd07037d32afa6c20000000000000000000000000000006d61fb1ba9632b8cbc76132b5b2a4f5dbf0000000000000000000000000000000000264a56b9aaebc291ff766c2368d7b20000000000000000000000000000007fb5b38f675b9dd9adf1119e77bf6d1b2500000000000000000000000000000000001b5f6eecfd877030f4b801591720c400000000000000000000000000000044a28ec206f26f99a7fe98bdfb82bd225d000000000000000000000000000000000002dff7548595122ed0e4f353f5ad32000000000000000000000000000000bbc30b9415db001f70fdd8987beb1c3e9c00000000000000000000000000000000002d8652e9ad4e0a4c2ca8eda205c27c00000000000000000000000000000087b1b7f5e9abe2f8dc781bdac7fff1aa1100000000000000000000000000000000000d95630725a26fe91e15b78056b1500000000000000000000000000000009350c0aecfa2f72e376bf403ec8721f86d00000000000000000000000000000000000c6d69390ac401c6fc8096c173b49f000000000000000000000000000000b9a4dea2978f80a7fd5c8e51be6532ad97000000000000000000000000000000000015ac99e0063363eba179d9bddf370500000000000000000000000000000029692467d705f2920dcf22b32f79fd3be80000000000000000000000000000000000079354a1a7faf934f32b3869c64d6b000000000000000000000000000000f2617d01e89a14e588bd8f6a599b8f9e8f00000000000000000000000000000000002026b9dc6c9c2ea6c9b6d97ad5e7cf00000000000000000000000000000073167a42c43fb98d38ff8f48623b8027d400000000000000000000000000000000000d68131afcb0dd20f4972cf543772b000000000000000000000000000000afaf580c7bf00931cd0c4102f8aaa7fcbb00000000000000000000000000000000000c7217eaf7d8bb18f8748c77bdb31e0000000000000000000000000000000ed9d41f73191606c11301a7b542dcfea400000000000000000000000000000000001fd2713b9e5b9e5117fe3732873c9400000000000000000000000000000091750a4e48f1feefffe3c4cc8dfa11b384000000000000000000000000000000000020c1023a70b1d27bca3d24b06d5579000000000000000000000000000000d74a7d51338e01a28b236c60ff8fbbf394000000000000000000000000000000000004e1232c30bfcce815402234f0713f0000000000000000000000000000006bde145ebdd90ca2a689e65943777fd80600000000000000000000000000000000002df07a18ed3fe8b2c070a57c944bbc000000000000000000000000000000d5b24ca3dc8e1f9d29e2a17ade852f1b7b000000000000000000000000000000000026360c3bda49bc3f5f5093c2a1c5d5000000000000000000000000000000dba886e62edf0787e22c73d9fa6ade05830000000000000000000000000000000000178848e705cb1df7f400459540a5e700000000000000000000000000000025170aa9b693320182c04029c5e7e4121900000000000000000000000000000000000bd42d893c4e1c614c357437d6bc74000000000000000000000000000000c4ecd919483c1a2ab845f12dc62077900b000000000000000000000000000000000022f1c6248535576a0717d01d4bf1ea000000000000000000000000000000965739e421592c66c4afb6565d07df6a5900000000000000000000000000000000000c66b846cea6387827a86b53f06a69000000000000000000000000000000460c41dff84a6bce3104c5f6c492c66f7c0000000000000000000000000000000000064f261a0890bd5ef9598cf92611d7000000000000000000000000000000de718a32a28cfaa98d7295000e72c06fc6000000000000000000000000000000000009015a08cdef623230553bbef5b9ac000000000000000000000000000000b7858366c56a0c3da72210cb7b47ebd3ad000000000000000000000000000000000012c80e071fb1aff3b4afc0d80c0902000000000000000000000000000000b32fcd0ca6d0c4e2a35634876ae6b4bcfc00000000000000000000000000000000002295aec998986d3260001b2652da8500000000000000000000000000000073ea51d2509a870718aa82b7f00e974ad2000000000000000000000000000000000023324c74a3b371c2f5e5b31ccfbce80000000000000000000000000000000e2b8a28a33389a4c09c8af5d4e7422ea700000000000000000000000000000000000041d2e62390a06022c514c42745300000000000000000000000000000002b5f6ed66337998236038a6fff1fc69502000000000000000000000000000000000023d1351f04cd9ef7abe1048ddf6c3e000000000000000000000000000000ce251683e0567843df829e63031f4350df00000000000000000000000000000000002ec340753bd9e99424e8910d75ab02000000000000000000000000000000d35ee5cb042d4aec737803c5dea2630c1b00000000000000000000000000000000000daac357d6549124e57d6eedc0b98c000000000000000000000000000000b0309944ea7e471a09fd971bfb9c36c7e7000000000000000000000000000000000007a368b4c1f6e35c0a480af8414da900000000000000000000000000000021f1225266bea5ab62e97d6c3e2fd7048000000000000000000000000000000000000a9599125c1c84e9f03acd8fcf7a1f0000000000000000000000000000004f93b5557f54eeb37238973013387e6efc00000000000000000000000000000000002a543ca44d941e21b40b2aeaffd067000000000000000000000000000000a3ffd818a85aff4e9590b851012624dcd200000000000000000000000000000000000db87fb229661e5b4f3c1491b7036a00000000000000000000000000000087c95c65ed8c8c03b7ff4c8b83dab94254000000000000000000000000000000000004670b0675c3aa38c1e2fd7d32b6ea000000000000000000000000000000a602a4b43bf305b4c888b9a3ba01964ac3000000000000000000000000000000000012ab08c2a76a1a8f30626d315d20da0000000000000000000000000000005fb41fc6841b45666f000ec89dc579a2e800000000000000000000000000000000002d975efc23a624beb991500f03d4da0000000000000000000000000000004b7702c931ece3321f98d33e85c557ef13000000000000000000000000000000000007bac1ea635e4f038b3a994679d54d0000000000000000000000000000000d079e5da08c9dcb4de83eb932d9c9903c00000000000000000000000000000000000682058115f71bc5f523d1d22e30a600000000000000000000000000000054fd9150dcee9f00d909983a171c0a599500000000000000000000000000000000002d48075b83ac71ac534ae7d2aa536f000000000000000000000000000000ed5a96f25e597e90a24fb0c975b83a94a80000000000000000000000000000000000286dd35274d7ceddfadc89056807f8000000000000000000000000000000c00e574323056ecdbb5d95b5a47edd2aba00000000000000000000000000000000001608e6ba98f975d660532fe37b3a4e000000000000000000000000000000544f7a22b7c1d9abbde125f75aefd6aaa5000000000000000000000000000000000020ea76d9fa9beca8380bb22786eb610000000000000000000000000000007ccab9b2d3cf3fde1b40b5f4b8f805b8a10000000000000000000000000000000000209c01f19dc726d266498735ce39ff0000000000000000000000000000006623a5a32ef26f9cba849c2a3b5d83f4d0000000000000000000000000000000000008b8b0ca5a59ef76e1cf60c225e528000000000000000000000000000000b56ec3076bdb7efb74026f41615800a0d600000000000000000000000000000000001423b8dea35a8c0a50385d1b3fd90a0000000000000000000000000000002d1e81446b8c8b2f0ffc3e938cb93b9abc0000000000000000000000000000000000128e448ffc3b1d09bb6783e8058d6d0000000000000000000000000000007dd79fa7035ce3f454326310495ee858a7000000000000000000000000000000000000efb75639b2a3995e71dd437a87fe0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002f6e89e0c65369b14dcc2c500f1653e2ba0053cde393ff12a24aa7de7199043904f6e693ca4adb84f584bba58973a656fea999d21d2efed64d68ef99bdce42e8224cb7be17d12a3223468b5ad8b342779c65f128f23a4a871ff9ea0dac5f94ac19511f9f9e02b4e6cad2370327ba5cfd9f56a1eb61ecf26002ceaec5956a3e0c07cf7141c8ab2e596ab54faebe21f755ba27fd7827a62aa79077e68dffc9a5db202e77fc3a7b1ee01c71e10b4364e1d2f60b3914f243ce8cd2f618fc654680af1d043d652ea6e0f94a1ff8184d1801b34e194007dbcae2e2cc17bc7a07112d2c24cae6f901fd2ac5aa4b4d5f57a80f4ca19132fdb8394094abb6b644bc1eeaf60623ffd184eb42d69422fe3c8e7e0a5484104237c6d958ceeedf99115ebb23560a4ee4d99bd2cc2d9849764fb6559e84ab8c1d0e7b95035151f352b79276cf9e0b5c1b63ce6c1617492d76d8e142dda684bcb496c4cdde8690daddb45be1dbd127bb04a18858b34bacc49be594a39529f480c2aff0b8b67833e7953543f9a4a0057a24f76635c33bebfbc2781a62109d5210a5b13481ad512ddf9c36489be1c00d8989acb1cf7a2e02d624709d64b4aaecb354be0042c31be8c1a0711005482f27a30debe3a61beec341ea0be8357862e8eef1611d25a3aa5ef24d10e086e55d20781cb4cc82d176856102ed95e23228a3fcc1018c82af19eaff112f49ff2781177c7fab42b6ce9d966bc00cd97599627593135e2303cc474f901e61b9b89027069fc33f61a60b3e3bf3ae214db2fe8b94eccde58ffa6439c880bdd8d36f88d2241abbfe0d66f0d9293cd917e89d821159777eaaf33b161f1a486086ff4731dc16ea174843bc9db2c00b4d44221a51d99201bc6f9bbea6cc0c76750f9ea7adb117f445ef3bdbaeec5f74bdcc560dfb38070d574c5a36868d7e259599d32b44a015d26a96cf4ecf6b87753b90cfde8f7126bf21a2644bd8f4ef3c0496eb9b2fdc200267b60b708a173e0d9cf60d568bb809f330e66d07fcee343a558487037afb041f2f05543014ce39617d817df11c8bc033dca9b7879ff2e94653c5f4b979081c1ad70b66e6e75726d2a35d17bd4f1c63a0da3cf0ce7868061f4a6f0071dda90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006433fe684a939fe75a79663e5496d1680000000000000000000000000000000000000ba38b32961bbbd1dfb4742ae9ed5e000000000000000000000000000000638380b39c287b4e608ce046004a50e60600000000000000000000000000000000002b3900dc5cf28d0d8c086719f213ed0000000000000000000000000000005a49a0137d2c4bb49fb4aa0728b8989e97000000000000000000000000000000000027ebfae78d513cdef72f79f46392d3000000000000000000000000000000ca4f7981894ec601389fbb86e8c0941d7f00000000000000000000000000000000000604b2124e61269498e2e20f005a19000000b3","publicInputs":"0x06f32a63ab1a10c44b40a14c94fd4e693830a91920a63778c91df75b67c3a25900000001221894f21cae5e98d0c7a1a2658eaf169b0688cf8348dc7be4d5a944d568bd46000000030000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb00087e2b1632207a64d2be3430a622118411f15477dcf399a057660b8e566041001c2aa1e8a9c646939d1d0d3a1b789e2eb024aa538a4c7864db736646faf6cc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e586311f1581539435ce58c90ec4a9d291746a8b33999d1654faffb07f382db2efd3fd6b542f09e9f76c84337f46370f67729ce54c815d35866b4cb2a2672030000000000000000000000000000000000000000000000000000000000000000003f1c36600e57c2c3556b97fe6d9919a7c418380b539dcf74182dacf5baea2e16743433c1b3d551429cfbc09ab7899d4e14d2b5786a3243e29bc9c6c0d76bf10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}
1
+ {"proof":"0x000037401d2b0ace7ac4fbf52963e9b24dcc562a0da10fa52b4fbf5e55b2b6d587d8bae4047fbe8e6ab5633664ebd80615a60c25b32093ef31ccb533d403ce748075fe5b00c95e0ceb41951039e1592745ec2faea9866f6eaf01bf189a4463b4143af0930053eeeca2750c390a6b05c04c3eaf7148eaa37fc7f4677b1ea5c58207d438d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a1eb370e7929f0aa3638be832f05670dde96c539c0f377410bba9040bd0b1f281d963227735128f9f3b7d68bdc36e40df56b99c91d4490af4ad84d3cb072ac0000000000000000000000000000000000000000000000000000000000000000009d5ebb50ae6bb050adcc9b3cf872968e1aa337634853aafcce8e9818e94c25011df24633b43c3d7346227c4b84b70d3fb6c9fa5b2cbb698f5d500d60456adb00000000000000000000000000000000000d82c97ccbb9dfb5a09d0a47efd9de0000000000000000000000000000000000bd18f88e1691544daea4ab46e1cfac0000000000000000000000000000000000000000000000000000000000004e300096c6f7ce44c2b7c5d983b6d5b05c9ef1be47c4f5e93a2f99c3a04536c503fc000000000000000000000000000000967b0d22683d31e5b17e35426a3d6734a7000000000000000000000000000000847ef028539261225473627ddd0f8d18cf000000000000000000000000000000000001216ceaa8b5174d1cf9735d7cac060000000000000000000000000000001b55a7b492f10c0956c2b057f45069ab67000000000000000000000000000000000028a596b117f20bf5fe81a3fe27928900000000000000000000000000000021f20a78cb627a4ad3791652f224adff3b0000000000000000000000000000000000166403a92b86cf8b3786c6d6689bc900000000000000000000000000000054aee4df1be0aab6836278b2e07b6253f500000000000000000000000000000000000bc879c8af743bf9fe8cdb9edf641b1230f3240709381e84dcaef98cfbf65d781b584d8ccbfe86c67ade9d01f0d1d62349c9fe3dee70a5deffc982e456f2e08452c9cb24086d2051d6d3a31dcb5feb06a80455cdc287b36e71f3e7cba51872aa6c8956c82691053f96e283cba283101e6b727abb948ffe5dd37332abf949c841a3579018009e22f6843853710e133017603933ba8842f87aed9446150dc346d51ba93b3fec225511b924cbca4122800aff736906500019bd563c31f395a941de6666bd00f954484288f6283f2f6f7f193782db7b347fe2cd790ec1909d637cd360611d4ac4098134b48c576ba9d68115282242fa373432e29e5434049fcf9a19e6f6d19713297e90ac2ea20c3248852274438d5e01f4cc60bfcfd214d48dc18f59bdb6a7ed3f5f4ad6ef326dfd1db51e997e94591c00c715af82249a35d5420f1aaa2bb1372e6eba18c7a6224d8b5b014cb5dfc1ec646156de9d04768fd6a2a5b7e1a020f879c08f173f1ee3a9d1b32fef96cdab484f2f77d87efdd805afec744e88a06892d542f25f940e2039c9a4216d888dec263852e9a12c298ef408f500f571bdd79b46e3a49a4ef7492ffa3b093d108f129bc8fabc56f1bd2f848a51a29a8499cf8151d4e214ece3c00b7a710e80b0a039c8ed59e60e692cf8947b4cb3b67dafc6c7599349e11dea41f953251e4576ab418a0762c51b94b8b726c0191b9a9fe8deaafa19a763172704b9c741197aebb65892636d263b557f12f352eec433d9e52b9f0360ad000c95507f7dd016e962bc889f3cbc9214f0376e8e056e64000e634e1a6d3096e1e8fe9f8082312e21e6d94f1d49a7228756a0b48c87fc8e0a9024a18220db9aa3bf5bcb0883192f5f8fa9c51f62b15af530f829a3ea8438eddb110db79ea7c319bab353a44f532e18769d01b08b50430744dd274abba184186d0bfd3c1b6283144bfae15c1f5330635e714739208da837a09cc6548bf49ef8c062586d248cd1463fd86b0917b00424441ccc83e278ab68e9dfbc2d3b886cfbc42faabf52a2604e9dcd8596bff41636bbec86f259b2bd67479ead9b4aba8a93357a5c8060e949190d49e27adb980b76d2117206f8a5ecd1b102c7b51d63a7b40617228d75fc4823087485568f2a2cdae7da65634e3b4b0fd5dc25bb70823f701c85d2b5e91d640b654a6b06a3ab103648e577a38aa655e57020109e7e58745728bcfccbd21bc9d92332d81af9e706725153301904f2f2f89b51d46d2c41c89d4cc7e2cf4754bdc53b48232ba09f0695bfd151f1f8a0dd25e0bc5166e0a2ea6c7aa9f46ed8fb66a4609b385cbf47189b9a278d4b181ffc40bb8dc3d04b6c27d85480ad74d4f41f3681f992d04bc504fb15ba4f248e0ac1663b5c21e90a0850ebcc6f6890c5241c91860a6d65c2ed080975eefbf10b40ee825a3b1ebea01e4fd3765c41ef376cc517daa33374c13011b483f96780d7b35f09339eea08ce1d1745d4f02c2b307d9a7dd15c22079fff05ea1b17bb0699f34ac1665e73a08fb4102d9f619e889234104501a7dc81fe10270e8eb26dcfe587d05ea86e1bd2cf7f473d16f5c86017d990fd2ea9bc26f4140bd0cfbe16eb960adbb463e4189316cd4b050dc98d8c429b27b6946c3e36b80c0750e4c6c12da827c39aa8629e9a00ebfe52fe8cff2903c900c94894d83801d821ca58e309cdda4c02298081f66f63986c907cdd945ee8e38b36657e629809331fb9b317be60419780a8863930401073817d8bea66f9965a8c1fea2aed5e3a9a2c71d074e1be8cddd55fb3e7c4542bd4cdcebb4bca1a918f08724b8a5d7837c425bda7eefdc26da5e2e276006a0e3bde51244b367b91345d07dcdf075d920eb504f9e3d87b7cf7af3a1fe71704ccd3cd1649fe0225699b5b52139ebeff6c356109f38d1d029cb870c992752805364c021ae170758e1e9095df679aebb8d900aa1e2d347f767481387a099fa34d17b826c2a811e5e8278f10bd6226d8325c04a4182fae94aae2b8a35356b9216fda7a97435704c0d75b2d8de462467e2e56be9305e40a0e57bea2ba7ce90153e456f2b973dd3570c0c3013b49473b7a4642c226273b0974f765ccafec8213c12d5d6fd61c58a3c27540bbf2b9e727ce8cfc1a3114d0561768c28b8130e5e838f1a2f010a00e2e4ffebab8764089ac794c73a0fc0138fe5273e80d6ee57fed97cfcb8b2a6c728aadd1e979a00dffde8b57f7b5fe05f87ced5cdc0e75820cb49b37e2ca1f97dba23c23237f8161234668379d2e511c6546f086f2758e0df88d03f820f1802ecb2da684859b179ecb35fc21054c9605b094220562896abe675b9ff1678e66f2213e202dbc7198471f8c17f984897e2f9c66027cd8a8bfa36246747ce6d0cd5db6a053f79f8157802823e33d4d43ca179d24555a9d788b681f091697992bbd20c1f34fa5f7fef61a5c47bf770379881ef5a4c6a1dc7c15962ffdbe9ed0eae175d472ab0b631baf01b20eb24950fa7a14c7ab41a9d06d3c867997c64a37e29365db762c2e8298cb2f3eb6695205cb512f74e148268134083e82bc60287af30a3e33935523f74c6c3ae553a9448ad66f1249977a6c25eda4a5395d1aac5c7d5d3e9adf60e7fcdfd66aa46a656fed8bc204ec6ad59f9c88f9ef6f8b44fab34cdb5f48ce14a71e355877a265c59e84f70f1577bd08165a24abc5d89ffd9b31eedd510374639003ce5d6bf0179c2a58e7a10a30764f62bc9e9106a7bd2638054e45b2b77c81c205f614ba4334c11420bcab1f96dce8aa24acbb6c5aae9ae7863a52d7e7956b4e22b7003c18fc1afbdf96c02a67f8588cbf1486118b8428310187b584295ecfb280441d7e01fa2b0326930300b4665c2194cb0103f3e46a8c1dcc0d7dd448c47dfc0f5b2e3dc88ffbfcc7ec23bf76b3f5f6bf44bbf311cc41594db63544b93d14bf7f3c65fc6b86cfd4e65013c7c987f174a180ee17209cf420e790612a74f2ac356f674ca54f4ca0b8334324f6bdaac0c9377beb80138d20e17b7a1e2222ad37a0f416cc9b8bbba4f0c9ea2573ff282b6b9b64a4f808ff6aa5317ec987ca06f5c600699bde6ede4608293322a0b8d9d72b49c53a0de6993e301310f7b7ba8b92a7e5b5c07cb00cacb1dc6f034c39b454ba40df58f09545fe26864cf6cf65f8e59ca32456f4cbe9053c950c2c83d5c830d7c636c0d3d5fd0387a6c23bc0b4f22517d1ac35a8df9794d4dd000041dee56b9e0031f77b25ca46a884ae6df09decf0aed625832f97b3ed970e06128b10229a3b7f38aa50792bc52b7fef704a8d0464ceec284d5a5a272963960326eb718dcf1f03c08f271ad563680064f975381ce54dcd60b11b4232a723c77d02c3654c4cf8eb3f5f98dabe1ce91fe51fb585f66400b76ef886ec214d3d4e1e0322681bfd626f3f994153923af9f6aa279bf8b5917ccee77a2091366b8112a20d6408ae20fb63fcb64a1b1f96e749088801384caaa3830bca35d714e917192527667c80833a84ed70b3bff2abcd9b74e1d9e2f420b30f8c400016024faa696e18e740514afb42f9e98877aacec29aadb819ecf70b5c56c8261593c66957faea05b0c746cd36940c78e330d949827586976213306e50ea6b57c7a0f34cfe02b322b5d053ccfdb77b07b61ec65a33cb204c2aa9ec425d936a4ed11f709930db681569f38f6d04e66fb12e579aeba8fa1e4c6d00ba09100818053a7021ce6f81aa11fc375d0800714e30050cbe3ee25939c3949ead3ec9d8642769e0e5811731931e8f39b443e9e34d398a0dcd7871c1b54c1065cd66635702c5c7c3dc334d5d171f84b3c5f7faf0c57b0151193638465707a88e6b54fe235297da592540913f562778c2e80a201d144b27d8da7ca08ae99114c6a342cc93c4d941998106b89d0124aa6c77734f5ff4ab381453d934e7915ad634c5dd113248db818d9506e3136113496a219b7e1b1d92c1e34fc780f4b87e3b8c5e765b6efe6f2832cd304a6757030c05cdb6bf6f0ef20373baefeb765d5778fdbb5e090cfbc48a8d80c123f09d06f9d083a8fa4a99f47c6a2c54ab9372bf9862625c1df946081f9d367f884528305b15dccd93a85fe4ca37b3ae066d21435dcb4af0cdbcc73608f0fa5ad8ab1a05bf5bbb7c9927f31f03fdf729ec3084f162065cef6b225d223dd0807ce45cca1fbd66c2fe4629404099b8d781bd30e747ff602912ac0d2def73c734657c59531e2d7c3a9f9838022a499570fbe7c86adf0dc54d3f2ef1fd2e59e1d7ff70d2d4154fb270fbb70fb71c0a7b077befde6719b3e662505bfc37b424f6e1b8f0633707445b04fca697d2b9e029c8be3e6535967cae209d1957d4f3bf93e44989d1ab04531aa2a2feaa2bc724675123d1dad0fa2411261528f9ef91782c22874359722d54b62174f2cf4fff40a0aaca3ca3ef4e44a77f66d862d739344a921c7de1fc00a2ea2597b2e29a0bee5fdc657683ca7d1b5321979ed7f39c71c9fc1d9735db10895a10746389aa7e8edd78ec20bbb119248babe90986653acfe640f8d1c4920937eb32f6292d3c0b3e7d2817718dfa934f44f7c269d9673b7254e4ce8ef6562a98ac753ae9bcde69d6713862bce21bdad75e7ed259f93872f895994dfaa79a0363c5363d78f373455a8c0f4475157bb5fa469fcaebb22139e76030f75e2487278071ee51810df76484c3e5488185a33ef4fc2bf59836e567380928c02eb32c29dac2bc2f2d13ebe865a01e8689f9da4f0a08c0ab617a1406ae0c5f04999a001390dd0a2751f743eb8bd4d33eaef53131c8fd4fee098d20cdc00695a2396b5322cb1738ae736216f1b114db99e990dd5a2bb76705c6bccd139fc870b61cd610145451f46ce92691259b6892392d3ba0aab9726d396de2c4bea7cf6b1450eda9160955b7649d7036438a4126d5833d623be71374d649edcd468d666f7bf1846b2a161e6b99ac0d07d99b036bfc8d4080c864056fb4e38495bffb08e7a8049c1d28c63ee84b975624c39955ad785b0ce816d90ed66528553652db5e2da27897d822b26bb9c76b3e415e61dd145c2affee307fb4592784e248945b5e0057252ab61b2d4a7e39e47c1816c336df6bb00bd1dbf412fda941a817ca218019c2c449110415d5fd33c28b8c7edd9bc9b2d3b743698d251c79f09c5cc33a628c8ad4d9350d4132dc90c9c9e95b4003c6692c738905383ef21317541ac6964f45dd7a53482b79be7a28ed7eb33ce70cb76810c0b763a8bfb3b8125d33722a8861e977490700dd3a818ddf8822c9531dacfebed6a473a599287a7846fe6154aad3da7592300bad6bb710bc2e6a04fcba27ca9d6a77f565b8403f117bd5a28f9e1b453cb2a51443280aae14725582505c72784ff8a9689a94098869271031b97d84d8b2f45f2e7a8ee41b264085329471deea8da611900eb1f55043c5d5d36a5a8f4e4e40541e7b59a4f5b57e0f7c96241cec698512ff5ecaad61162bec7dbbaa4a0c629745195941175be77f726454231baf6c6d7725951add6fddc080256846033c9556c91a197b65c54f04245aa9356fcec2a69787a79a435bdcc98a29cc00d20624a2d11eb235ae6fdfb2c34d9c8593b0120ff100f9743b27a109fe3bd273bc67dbb7770661ec2c1d931aa1deee676924473a9d369a705944422aeec57db6f3a1ce24e82c60152e5a3308d97151ba03175d333dfd2d9b2eab6e0fef340a07b453b185312facefb814a5e4120e89dea1986c15118389298ec9787570f515a8141635d9660dfbc4f36157c4930c2da472e0193600adfb35d52675d99e3dd3d85bc9257ed7195031479ac64a93edf1f538a263c9a77332cfcb2179740f551cadcfb6061a8d1da6fd89ee8a09c2a1bb07db0a7ed7b927f7c0dfe51af6b0c1dac1d9d3e7bb5c1f58314ff3eddea73c992d2ed7a45ef6117f08a08908b70932b05c72b211b84d19fbec2a4fc61f00a1b509f43347bab0dab36075bdbcb1d6879e5a5e44f2e36c1b6f2df69b90302334b46ee6b4e347defc48efa97e51a0173b13507513cb0d6d1f29f62ae5733e7ea55f71d3e55cf54ff5a82d36cb43d639e4b9143512f018e516b5026876b79528e8f1eb42cbc6b381b50eb74154150a055a1283969878a375173fd1b1c62731daf637535a290b1717d9f58c77b2785beb51e297b4011a5cdc12c6e4e1570f6de5e964d4bedc21bbf440d17ced5b30e4bfe30b17a4ac013a320e87c9ce9358d6846c62f84f620a033b9c5fe48322f0e3de41c6d95350a873490371320681b5d82f7394bcb22113ea3c69b7057b7821b491147f945c7301b4472af1d0661c4ad1713ceaf1543c46e66ab6fcb8a8738b9051567ceb56b2efc0471a74bd19f7c2254cec6a2f10d94853b2bb0d9328f00dca76854f5b1991b851691e50e90b380f8a8842d8939ca5cd5cbb9f1733c533184d206ca54fe766e08427197573d439b29a48e284766d99e59dedd2fd15ad933b22ac10f777d90e081ace08a1132012eff9c7a621f3a509e82c0ba3f33e906cbbc494b83125f9d06650b518ec4edb63b193031084723e98adfaa4cbbb27c93d7b35ea51405317a54b5f481eaac5d4dd11a08e296c86673346757684c5caf3f01fe726d74b7ff532fde7b402e60b0e87d4bcb00bda5813294b5fccd6583104c15b7cef983f5e50510f4ac4134934b05bd150a742244457f7f4315a86cbface176db18cf863931d993bdac31481d871b9ebc4fbf0519e13731e3752238ae7c218cd8a94fd12341609fabe5d2581866e4a7498a33b7ddb54be930050c84c65caee1d7ff803053529f4bbbe732947d73d5abf41824f7bb103d45fc32b34c8c49ccc0958b87074e6c2b7d2b7310dda03396186e4e9694b9b7eb2c07dd6d4a78cf90ec480d5451f6456c2531fb81713d7e73ce5b65e9e9832e13a9f17c9dadca98fcc91c6c98f6ef2f5e480a16d04951ca7bde9bc1aa9ffd13013c4567e2decc5fbb3781af953b4ac1e7934203604e498b26fd15fae48951496307b306fbd413e0fc0999df3c50e41e81e4d16a32fce06e6a58a9a591d7ff2d4b6c12749d61dbf251a56ca0d973d1838f6cc32de226d4b0d20f985cf8983d9360011402eaf888b6ff0ddbea2c9492928b78e35e003e3b54833b8d0d456187c89dbcace080ae7e0b43aa01166b0545d4374ad490318a5d7a39faf93b890e73f3d56f7e1a157ba5bdd1020cf842f33305f40ad3fd420f3d67e4121d7f92f00bb6a2c01087a5560ac2d79489bf1e342d401f8f34dc12f852072b635384e6ac1c76a924f72ffc74a30abb68c79a2c7cbb012d4c6438902539b67d9c93cec8e0bcdf9865d195b7eece823e918814c65213851fc7d1cb42c54f20771c6adebaebe1e10f047fbc64bf0190b5960aaa9c32c32d68221e6c001bc9298f33c51f0a4ae2e1c1ad94f03566aa814ba1d0487c0072a3037381bd907988c3cffa0b252a9e72b677a6b64956e1c3ccdfeb22201ce22f134144ec63519b89e29b8776018eb8d2b7552930505eccc7d7eefd5c015b5e2c925a2bf332c17fa59aad8bb54fb28a03af550d2226f3df5535bc4f1307184b2f3eef1cb9f0c1bcfd9fe92c11f0cead04c3082770666346c66c406f8f924509e8f588789f7e103a0042da54e90d798eee38370fe5e6f32ff8f5863fcc656cf6cbf5d211768880430d1606f1d3c959186790269c8c619cf203ee69271a570d932a75f7dd90ca51506f2dceb63751cdbd75e9b9923deed45fe705aacbc0322ad09065a332f45d5113adaacb5855e823be6851a42fc65a450e3207e7fb8933c043b7acfe8141e22294db301a0bdb309b263e452f45b76ce7e51033232626e7b9bcc781f34a1ad891a7863c5e21470084e2a46695ae3e7211b2c69b717ccebc5ae03d44f6eb48b551a06ec9aac1734b47e22b9b79a55cd50f3326094514e79204b92256e5a33ca520679613333f74b7c147b2af2ccd2093e4d58dddb06129ad1f5a02af3c44b324a1d908d0b1bcaaa5a72c0195a9ef8f98280861bcd1b58e05c3871307b77f92e151248b8ac6063e0f8839a77a7d98606106988ff12870041d5c562dd077fce999b2e764223c913522f4be6986d1853091cd61cb80baaaff0f7c649cbf4f8f079fb1e850a548c9ca1120092178bbc5390a35b6a85cb627b6ac30ca8bef76cf24b6122b85885ba19e48b21b9eb56f70734abae2c7431d995898586bfce75dda17aff250e6968b574b21610b4835b34303b3246541215c71d219fc2e36211e316fbe722e3303b22d73d33ab2f351e8fbb0c2aaf702d53df5f97873128c29cc7d275bd20898a9803b56329bee77ab0d05f9981b4e7e54177ff2999db00b8c9f201834200303ec7d0955b5f395aa53b8cbe126b9b352d50514b34688223f03c17b00b501c8762e1c44344325fc5a1ec11ba7593fd06a3db105c97608c51dd42b2a8cae2074d2c7886df4ef332c5362c07e1c6f8006bf661cca91aab99418668fc5180f91f8d38680952f286b84e1e474e1e638144f385db37c6b6516d69aa8abe09ae6e2f098127f71dc9354f80091c9686f6f03099d409954522684da024d8b14d57270ebae3aa7255a3d3e0b568e0269e41886819fc89bc5002366f36c43a2ca269202378b89d398099553c09c98195a44003919252ec98b922bbfcea7f56d5cea0c90ec41550fa9e57e2a1112480ec41d51d46d16da89809c30044e710c20335cef8304a4c50425b1ff0c04510594222e1f88009b9bd3bd29d50cbcefc76f19bb20b16981bcf821cdc4a5fa276f6735c7d7c19932a757ea7a929849a03da50d7dee81522b3c346f098d9b7a0687000a0b19c9b25215a97d8ffa26c64f9f69bf9dc422c2d13ae924c9830523f113d6f6b74cbf578ebf9387643a98a04705e2c58107913deecac5f62013746f5a7bce6c05e2ee82e2797cc09e494c1f5559c726c7eb324ef72f32baedd84d92f44424609f41a0417f3b82695f65a7f9135ec5ea377a821624a1badea514b298f4b6216cebe76e7e6976e90678041e7a15c823883e2481386a9b070b0a081e5beb3fa2a7fbcac9a0de04c1261528ad8796bdde20891ec20352ad5523b8e808220fa16254a3daf7a72b6db2ab247c8dde97ac3db8d24d71bae4ebfd0a1e3037176913c8be42a1fcb123aa50799d28c421801a14425612d2c2634dde04c6f955e793db42b36767bb438bd35e419194137b9b7c4c261aa1018397c930334511e764f80c51bc6e79f0b4462de39a23b4db71f8e1eb0904b341dbfa71e50f9adea17d8d2a331a66275123faa18af436ca773b936bbb0e63c080ad5059e6b3d284013d1e3c15af021bc94aac1a6e7697abb88edffb6113d82ae18d6ba390dbbd58531c1f099d6c2a91c2ccf4626a140121930eeae06b13a296b2e1a80702d7efd08afb2818e28e2310d2315d9bea60605735321df837577b7081764a3989cc367c1b316c76777f8714759c8d8ae497274d0781312073e600b521d718762bce44836bbea72a38054cc7e75242b6eca88091d8d46fb04e28454430c08fd25f2857a1f3bd2f5677993bbcd470d6763cba2fc6529ca40e1d96752be033796304b5b95e2a75b7080446dd476faa6b3d5dd959b2a76ea04e0eab9a4f11295ef502e9dd29830d129d31d09e6a856587d36694641f7136578192fc573de0e50ffbbc8d4f0f0bf574344165b95f4c1c6f3362e6ff3610a23ee5daf8bacb21014126ffcf166e5a1c9ad60e3a82223f2ad09794818aa7ce26cb347873fe27d0ffcf63fe400ff70dd51e7233cad2a4d41451e258f0165494fb7d61c7bd574330846048901f46b492670fd05b2ad3816ff57cb9d9e1f6ff921ec06c93763e31f2d51687fa9ded4f81462933e455ad73f7c4787847e7e77c3cb8cbe720121ad0a2240cad647b8c1b429c25b22b90d889dd76570b53562bed0f5f530f3e28d62f020515889858729c101eb18b2c3300f8b5dd3d97628b828bac9783dadf7f3657a2029ff686851d8077f3ee87258a65073c3d63120bd355885347768b371dca45618353bdad01c3bde20d5b493271d06da4ca959689c8df11ea1b1c99cf26d90b8066fd2b03540cda23167f7eea76fb631e86ff305192371a0da4fd9fd331d97e307390316a7f296f64d945c1ad30edf4317ad680f2913213707e8ac1ae138c4f91a371a5e43d5848ee4c47681fa0443b6c21b1340b8cf5da35b64c7508b61c69d06a2ad9ac09742306975eb8b7af69f957a9debaf826cd58e28fa1004d7bbd6e60d847ad494dc8e0cd3579bff0e137fb087c143b70823a5fcc7a93f766055acaf1960558271a9f215d584fcd142113cc7dff6d7008fc27ad5005ad70174789bba1674102f8dafb55e53215eb637c6f52fda2bf9079b1e16402e13ff06261f54e71131fe16f0d4cabaa3ab95dfb593c1ac46b009aa7ffeb71fb843d57ff74908db1d64cab3080aca8ac059208f489a3b9c0abc83cf22e0526df38165ac201be12d13f2b581bd680df45a4ab2b69d16b97193ded7b829232174abf2b57b0d0634f306cd52b44e0514365fe138adc09a9797b7f962b7a7d5c4ed2088d4711ab983dc0eb0f10cba67009c1487dd4a178ac2477fc8f06efac26b22486494d53174b5a507ee53b96bacde952282fc7cf40fec74f7b2c8714d003734454eae18193d5b011bfbf713887ac271705dbbf52f60b798aab781e2e0a9fc18d95090da3604142a2ebce2d5f2cd7a57b7d271d6fea3045a5134a7587e79c5533eddffd290347b8c198132af43c7255b2e3c57b50cf087c2517d33ff84e72bfc3c34c3fd0b4a0cc01b1b0ed73d26eb9eb95cf650963371db6a35efb08f1654b464cfa0b9f0cd34581a67939eaa7b9a87b5b502b3ccb836f009eb5da5ff71db980ba9a9db2852071f3031d0007a6721f14fb3c74f535510d77046fa59e8a13a9f333737cfa8cbf0b805443687a8678321e80ba8c4a77a671770af4112ba8e39fdf475ee35d44e708703dda51b5c4c74fcdf54ec9c3b49464f575875a10f36c4e6c13203efecfab1391488a4a88eca9ad20d99405eec8aecd8a0c13c2454ef58a6efd94123780545360945c2ad36da244a07d55f4879edf37a113ab04ce5497c796ce07391a6e0a8a200d866e9083b19625828fd093f17f19966608756af95f330cca23084c49eee3d1feccf20c6c8285d537fde29e6f63ddcfffe7d3771ea8e0f709bc6b5b14198811be0985d0de150b9148d71422a5fd35623ca1cd8f93a20257e9d5779a505a89e01483712fe6f4d547a8b799763f0d3bde623f7484f69d22df5ba1586b955c44328daf70c164ce963f1276c7e24a0350405a9f2d54d60494c57d6959228ca64f3232158736227bcd1d79d18da4c0cacd4bb5c53957b3f1032a56a98ba00ec555507c9438105f9d9ad8b33f42f6fbf22c9ab3a84fd2e7fafe5525fc8e50ec0498a303ef9a74e7a0eb4ae1a53e132705d4bc208be2636689c2998577ce8bb51c3441f671a537fbf9abceaee7e35ccd96ee07ced7d2bc701900638e424227181e69c2bb7dc0a249fee4c9f98f70d6596491652ccea30e160d58096b0afc3e52e3c2616c62bb1714bd91a9c6f067feda66a9b5f908937c49a431aca4c4955c3c0598f2d932c84ea2bca2fd8b61f36ead421675b5ef3a167f49b7abdff33ae0e5bad421d2892726a75557ced30eda4664c666823c80dc865b1a95f83fcaa826f70036e0f2f7d8cf457863c345b08d528e77a9257f83caa6c04149f669254d3db77c67a0720e9a75d57691708f36591d2185d1a1ca61d2c2b3f47ebc5b6cdb78d7b4eb62fedc57fd72deb59150eb40ddc4bf5d29b055f6d268d9fc9c13a65225f44c704108e1fd52cf5d81af773ae9f2a23eb6177446344032da5e60f67aadffe281bce1985a46fb23f587de1d00cc981cf892f8d32a4221a8d8c0749121bd43b6946b81b1380b588db51f32a9d09e7f2189b06ca68d0e69545aac503adfd83a29bea9505fc3afeb9e11d0b9c618151163dd979bf6a32ae403598edcf68dc49ad7061061f63e90dc541625362963b76fc4b3bf9760b5652a4e78668ff02d83fa40461b02ae7728202beafdbeb841703f467e0d83dfd909f3ecd8be5b1b07901b1a062e100a4b405d0f8b75a1dfa0ff99310d4da652cd13131013f7dc765b6a8e9d45ec816bd712d321ddf8b167bb515ae04433acfd143d993b6fdbcd5364668add4b0d51b0c9a9040babcfffdd0add341551392856f335b913218d88b0febd958ee965717fa8876913b46960863ec32ad62cfdc1eae3770c76831fbd6febb4afbbb1424006c806b45c000d89396bf2a4dbb46f22708bc4d65cdc68d28fa7589ea6463bf1c8742d186eaba1d0ce77f8fc6e56cb297bdfd14f476eebbd4d7ff496a90f66508cbcfb0d0e332c591342db760578687090867fa35e58940d02148b31c6521900b01f00dc72389a9a05893c6dc10473e244a2fcb0590fb8fa6dc65bde2bd2e1d1b8c8546c6d65aed1f2cdb0bbc20bdfe2c9f9dcbd469a1fefdf4ebc21b40e62618b8333b7988aff9ebf25802e4192a698c396c091c9dbd4e594f3e852b40230e2d12ddbbdc7bbe0dcc785f0308036aa3b6ef339d346516ca1ec3d8e155f8be6d08a1ca67b2358f2a8b758f47783f4f34f974deea124920b941068340602efed12f7cb373868484322b652a77bc82f8b2ca3ccc67610294dc83aa9a9c04eedb701d7e4a736dc29b687c119b55b14611670921a946fddac0a9ab699de77632aaae07ed5403f182e4e202051fd4ae3481a221319cdc9e6958f0ea147443de3ab25222b405289e0d05addc5ff61ae69b4cbc069b9ef27a9e3ff37db6b9a4a118c7f5109a0ec73359a8bb6deb507b98ac8da6bc7e1f12b48b4d4f5246eed25140c2dc00279899805474826336b1be018b04de37f82bd5a088dafdf7808141749ccdf002b5e4cb9a33758415cfe2d15a5660dfcc18b1aa4e54ca184557bf30aa29e9cc14946eaef239d83fb7bebc340078e94b57cc1648d78853ce51aeed5a8bbc18102fdcccee178f1c8da645b121e778e5c8f1fc8a233daabbf5bea172cbd88df97b1001dc0612a38c7159acd4c8a3b75a383461520772cc716cb4f65234be05d65c1f1becb411fe5519cb8c9b022b6158177bdf24d65aa778ad0893b1628574610301767d14bec7bf8ad62b4e3340733cc005a444a934b65954de178e59a1c1f11d1cb3f177b7611fc98a0e07dd6e121ef2079c123523b70f976ef5c695c2a798440b9d458bc50fd2745afcac4f5a6958c7ae814dbb4587494b7494b98719507cac0bfb54d3c82395746c616e7a25e63005cd5948fcfbbe3fd8aa9b21ada39223b12d40dc8bb25832445122349e3cf9ed7795f942c34c44282f81d40a9bfa1df4991fee2598345f996ef808adf1b0ec72ccbe17ce688b520fdb3e84bea8c57699482b5d90c534d4c0945fae2deb0310b36c721c490c3536ec93d79aba399967addb1bcca91827b54cf3479b14fa93d70995c94006bbe9b0af7601eab7830612c50218eedfd48b3a229ad3d345552f320120c3e24d9659f423bad70a9be3aa3ce5e00b22b2de41404d37c2ac7424f13526e37ad4042d640c31cabc57b24f72d878f800e2321600093ac31a503ca1c6090c767af78e3c26cb3651d9d49d33c7a8008f0a7ea8c1963dbbc53d145130339a98a79d839b35fdf84eca22619e9327006912196203b3e22a91c62e181baaf86a771d1c39f0c3d0a6c4d2014280971ec22845064bfe5d8d67cae71f725ea8c84f87a127d7a1178ce290e2040270bc41f9ffb71473351ea395808ac920200fd04d484b7e502b6616ee0cfd96c3ddfd6c1cfff316f4a75ea09c94a3ac11d378a7598dab2bc76e8ac09c9a82a2ec47df3b0bcb572c25b106bc37cb71ee911bc841d489f2a0b6d4a9a1fde23d8061800447c0306c18c109f10c4fb3dcd9f091426b1756a8ec97e7c1ac79dfd4fc2b3f89b47bd68a13ceabce414bc9bfc357474d300e4a28bbe77566ac14f45cf07bcfcc9c5d6cb01082800db45568f8f11a59e79eee0b6680d35854cf0cfba4a362593396adf2b008260c014f79f3204f63e0a3f479c38c014f3121056f12133c73b662602f497117fc6eebe870a9cfe3f7f2ef654a6eeb473b8cab1c9010ffc2f1b62ecdd779200bff45b80e8575f5dc4e9bd8ad5b90561fbe2613575753ba6d898612895bd5d628ebb7970d821248fe62e1150175ecd0dd008360aa2df3ecd508ce56f4d738a3206867693760649d25b5e8443dd1eb6d805ebd783fc013fe6679f7af5ed6b2f22b7e66648b897aac615564c70cc97dd10c15c5f40864272a5a9468efda9fa89215dd201087439719ca9c03d69e7c8e289e608d099bc7e1b42406a949528854a603fac705ac5ede99fa6695dc1bf6a08205d92b9a8a768dfb3dc95e2bf73bbb16266cb44d88254c241c0a335f5b0c90f49eb6103dfc6184539d67aacad913a9b12d28f5b9a39430fc5a7bf54c8b12fcadf2f639d01d3559090681727d7aaab1600e6de0adf471a573d03b40b9c1b28e3df2dace28324398453527b8ca9c79b5850037087a896d4319291b0dd22eebd0cae462d8669cb4dfaa864a35c9df0f356109645a8a5a633e0da0b88e0686ab470d03b26f95b0dc8bf6987fc721f6fd440500000077","publicInputs":"0x1d2b0ace7ac4fbf52963e9b24dcc562a0da10fa52b4fbf5e55b2b6d587d8bae4047fbe8e6ab5633664ebd80615a60c25b32093ef31ccb533d403ce748075fe5b00c95e0ceb41951039e1592745ec2faea9866f6eaf01bf189a4463b4143af0930053eeeca2750c390a6b05c04c3eaf7148eaa37fc7f4677b1ea5c58207d438d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a1eb370e7929f0aa3638be832f05670dde96c539c0f377410bba9040bd0b1f281d963227735128f9f3b7d68bdc36e40df56b99c91d4490af4ad84d3cb072ac0000000000000000000000000000000000000000000000000000000000000000009d5ebb50ae6bb050adcc9b3cf872968e1aa337634853aafcce8e9818e94c25011df24633b43c3d7346227c4b84b70d3fb6c9fa5b2cbb698f5d500d60456adb4e30bd18f88e1691544daea4ab46e1cfac0d82c97ccbb9dfb5a09d0a47efd9de16c6f7ce44c2b7c5d983b6d5b05c9ef1be47c4f5e93a2f99c3a04536c503fc967b0d22683d31e5b17e35426a3d6734a706df32e687ab5239d9f94c6f781ec93788f5335299e7824d699b722d99f94c8ed3a09014fba85c2a284d5019e3bc749d"}