@layerzerolabs/layerzero-v2-ton 3.0.13-ton.0 → 3.0.18-ton.0

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 (208) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/package.json +10 -4
  3. package/src/classes/lz/EpConfig.fc +3 -3
  4. package/src/classes/lz/Packet.fc +16 -3
  5. package/src/classes/lz/Path.fc +10 -1
  6. package/src/classes/msgdata/Deploy.fc +15 -3
  7. package/src/classes/msgdata/LzSend.fc +1 -1
  8. package/src/classes/msgdata/OptionsV2.fc +7 -4
  9. package/src/funC++/abstract/contractMainAbstract.fc +12 -1
  10. package/src/funC++/abstract/handlerAbstract.fc +10 -2
  11. package/src/funC++/actions/call.fc +5 -3
  12. package/src/funC++/baseInterface.fc +9 -8
  13. package/src/funC++/classlib.fc +30 -33
  14. package/src/funC++/constants.fc +2 -2
  15. package/src/funC++/contractMain.fc +2 -0
  16. package/src/funC++/dataStructures/AddressList.fc +89 -0
  17. package/src/funC++/dataStructures/DeterministicInsertionCircularQueue.fc +1 -1
  18. package/src/funC++/dataStructures/PipelinedOutOfOrder.fc +25 -1
  19. package/src/funC++/handlerCore.fc +2 -0
  20. package/src/funC++/stdlib.fc +1 -1
  21. package/src/funC++/testutils.fc +99 -0
  22. package/src/funC++/utils.fc +66 -2
  23. package/src/multisig/bocs/MultiSig.compiled.json +5 -0
  24. package/src/multisig/bocs/MultiSigOrder.compiled.json +5 -0
  25. package/tests/baseContractTest.fc +15 -12
  26. package/build/AllStorages.boc +0 -0
  27. package/build/AllStorages.compiled.json +0 -1
  28. package/build/AllStorages.fif +0 -4176
  29. package/build/AllStorages.test.boc +0 -0
  30. package/build/AllStorages.test.compiled.json +0 -1
  31. package/build/AllStorages.test.fif +0 -1831
  32. package/build/BaseContract.test.boc +0 -0
  33. package/build/BaseContract.test.compiled.json +0 -1
  34. package/build/BaseContract.test.fif +0 -3560
  35. package/build/Channel.boc +0 -0
  36. package/build/Channel.compiled.json +0 -1
  37. package/build/Channel.fif +0 -5109
  38. package/build/Channel.permissions.test.boc +0 -0
  39. package/build/Channel.permissions.test.compiled.json +0 -1
  40. package/build/Channel.permissions.test.fif +0 -7601
  41. package/build/ChannelBurn.test.boc +0 -0
  42. package/build/ChannelBurn.test.compiled.json +0 -1
  43. package/build/ChannelBurn.test.fif +0 -7486
  44. package/build/ChannelCommitPacket.test.boc +0 -0
  45. package/build/ChannelCommitPacket.test.compiled.json +0 -1
  46. package/build/ChannelCommitPacket.test.fif +0 -8001
  47. package/build/ChannelConfig.test.boc +0 -0
  48. package/build/ChannelConfig.test.compiled.json +0 -1
  49. package/build/ChannelConfig.test.fif +0 -7474
  50. package/build/ChannelInitialize.test.boc +0 -0
  51. package/build/ChannelInitialize.test.compiled.json +0 -1
  52. package/build/ChannelInitialize.test.fif +0 -7321
  53. package/build/ChannelMsglibIntegration.test.boc +0 -0
  54. package/build/ChannelMsglibIntegration.test.compiled.json +0 -1
  55. package/build/ChannelMsglibIntegration.test.fif +0 -7437
  56. package/build/ChannelMsglibSendCallback.test.boc +0 -0
  57. package/build/ChannelMsglibSendCallback.test.compiled.json +0 -1
  58. package/build/ChannelMsglibSendCallback.test.fif +0 -7743
  59. package/build/ChannelNilify.test.boc +0 -0
  60. package/build/ChannelNilify.test.compiled.json +0 -1
  61. package/build/ChannelNilify.test.fif +0 -7702
  62. package/build/ChannelReceive.test.boc +0 -0
  63. package/build/ChannelReceive.test.compiled.json +0 -1
  64. package/build/ChannelReceive.test.fif +0 -7742
  65. package/build/ChannelReceiveCallback.test.boc +0 -0
  66. package/build/ChannelReceiveCallback.test.compiled.json +0 -1
  67. package/build/ChannelReceiveCallback.test.fif +0 -7581
  68. package/build/ChannelReceiveView.test.boc +0 -0
  69. package/build/ChannelReceiveView.test.compiled.json +0 -1
  70. package/build/ChannelReceiveView.test.fif +0 -7384
  71. package/build/ChannelSend.test.boc +0 -0
  72. package/build/ChannelSend.test.compiled.json +0 -1
  73. package/build/ChannelSend.test.fif +0 -7690
  74. package/build/Classlib.test.boc +0 -0
  75. package/build/Classlib.test.compiled.json +0 -1
  76. package/build/Classlib.test.fif +0 -4728
  77. package/build/Connection.boc +0 -0
  78. package/build/Connection.compiled.json +0 -1
  79. package/build/Connection.fif +0 -3586
  80. package/build/Connection.test.boc +0 -0
  81. package/build/Connection.test.compiled.json +0 -1
  82. package/build/Connection.test.fif +0 -6582
  83. package/build/Controller.assertions.test.boc +0 -0
  84. package/build/Controller.assertions.test.compiled.json +0 -1
  85. package/build/Controller.assertions.test.fif +0 -6137
  86. package/build/Controller.boc +0 -0
  87. package/build/Controller.compiled.json +0 -1
  88. package/build/Controller.fif +0 -3278
  89. package/build/Controller.permissions.test.boc +0 -0
  90. package/build/Controller.permissions.test.compiled.json +0 -1
  91. package/build/Controller.permissions.test.fif +0 -6244
  92. package/build/Controller.test.boc +0 -0
  93. package/build/Controller.test.compiled.json +0 -1
  94. package/build/Controller.test.fif +0 -6407
  95. package/build/Counter.boc +0 -0
  96. package/build/Counter.compiled.json +0 -1
  97. package/build/Counter.fif +0 -4816
  98. package/build/Counter.permissions.test.boc +0 -0
  99. package/build/Counter.permissions.test.compiled.json +0 -1
  100. package/build/Counter.permissions.test.fif +0 -7113
  101. package/build/Counter.setters.test.boc +0 -0
  102. package/build/Counter.setters.test.compiled.json +0 -1
  103. package/build/Counter.setters.test.fif +0 -7090
  104. package/build/Counter.test.boc +0 -0
  105. package/build/Counter.test.compiled.json +0 -1
  106. package/build/Counter.test.fif +0 -7547
  107. package/build/Dvn.boc +0 -0
  108. package/build/Dvn.compiled.json +0 -1
  109. package/build/Dvn.fif +0 -2923
  110. package/build/Dvn.test.boc +0 -0
  111. package/build/Dvn.test.compiled.json +0 -1
  112. package/build/Dvn.test.fif +0 -5760
  113. package/build/Endpoint.boc +0 -0
  114. package/build/Endpoint.compiled.json +0 -1
  115. package/build/Endpoint.fif +0 -3777
  116. package/build/Endpoint.permissions.test.boc +0 -0
  117. package/build/Endpoint.permissions.test.compiled.json +0 -1
  118. package/build/Endpoint.permissions.test.fif +0 -6218
  119. package/build/Endpoint.test.boc +0 -0
  120. package/build/Endpoint.test.compiled.json +0 -1
  121. package/build/Endpoint.test.fif +0 -6906
  122. package/build/EndpointSetEpConfigDefaults.test.boc +0 -0
  123. package/build/EndpointSetEpConfigDefaults.test.compiled.json +0 -1
  124. package/build/EndpointSetEpConfigDefaults.test.fif +0 -6536
  125. package/build/Executor.boc +0 -0
  126. package/build/Executor.compiled.json +0 -1
  127. package/build/Executor.fif +0 -2731
  128. package/build/Executor.test.boc +0 -0
  129. package/build/Executor.test.compiled.json +0 -1
  130. package/build/Executor.test.fif +0 -5829
  131. package/build/LzClasses.test.boc +0 -0
  132. package/build/LzClasses.test.compiled.json +0 -1
  133. package/build/LzClasses.test.fif +0 -4457
  134. package/build/LzUtil.test.boc +0 -0
  135. package/build/LzUtil.test.compiled.json +0 -1
  136. package/build/LzUtil.test.fif +0 -1831
  137. package/build/MsgData.test.boc +0 -0
  138. package/build/MsgData.test.compiled.json +0 -1
  139. package/build/MsgData.test.fif +0 -4318
  140. package/build/MsglibPacketCodec.test.boc +0 -0
  141. package/build/MsglibPacketCodec.test.compiled.json +0 -1
  142. package/build/MsglibPacketCodec.test.fif +0 -4851
  143. package/build/MultiSig.boc +0 -0
  144. package/build/MultiSig.compiled.json +0 -1
  145. package/build/MultiSig.fif +0 -727
  146. package/build/MultiSigOrder.boc +0 -0
  147. package/build/MultiSigOrder.compiled.json +0 -1
  148. package/build/MultiSigOrder.fif +0 -650
  149. package/build/PipelinedOutOfOrder.test.boc +0 -0
  150. package/build/PipelinedOutOfOrder.test.compiled.json +0 -1
  151. package/build/PipelinedOutOfOrder.test.fif +0 -2188
  152. package/build/SmlConnection.boc +0 -0
  153. package/build/SmlConnection.compiled.json +0 -1
  154. package/build/SmlConnection.fif +0 -2600
  155. package/build/SmlConnection.permissions.test.boc +0 -0
  156. package/build/SmlConnection.permissions.test.compiled.json +0 -1
  157. package/build/SmlConnection.permissions.test.fif +0 -5504
  158. package/build/SmlConnection.test.boc +0 -0
  159. package/build/SmlConnection.test.compiled.json +0 -1
  160. package/build/SmlConnection.test.fif +0 -5501
  161. package/build/SmlManager.boc +0 -0
  162. package/build/SmlManager.compiled.json +0 -1
  163. package/build/SmlManager.fif +0 -3987
  164. package/build/SmlManager.permissions.test.boc +0 -0
  165. package/build/SmlManager.permissions.test.compiled.json +0 -1
  166. package/build/SmlManager.permissions.test.fif +0 -6025
  167. package/build/SmlManager.test.boc +0 -0
  168. package/build/SmlManager.test.compiled.json +0 -1
  169. package/build/SmlManager.test.fif +0 -6054
  170. package/build/Uln.boc +0 -0
  171. package/build/Uln.compiled.json +0 -1
  172. package/build/Uln.fif +0 -4924
  173. package/build/Uln.test.boc +0 -0
  174. package/build/Uln.test.compiled.json +0 -1
  175. package/build/Uln.test.fif +0 -7084
  176. package/build/UlnManager.boc +0 -0
  177. package/build/UlnManager.compiled.json +0 -1
  178. package/build/UlnManager.fif +0 -3934
  179. package/build/UlnManager.test.boc +0 -0
  180. package/build/UlnManager.test.compiled.json +0 -1
  181. package/build/UlnManager.test.fif +0 -6578
  182. package/build/UlnReceiveConfig.test.boc +0 -0
  183. package/build/UlnReceiveConfig.test.compiled.json +0 -1
  184. package/build/UlnReceiveConfig.test.fif +0 -4413
  185. package/build/UlnSend.test.boc +0 -0
  186. package/build/UlnSend.test.compiled.json +0 -1
  187. package/build/UlnSend.test.fif +0 -6583
  188. package/build/UlnSendConfig.test.boc +0 -0
  189. package/build/UlnSendConfig.test.compiled.json +0 -1
  190. package/build/UlnSendConfig.test.fif +0 -4431
  191. package/build/UlnSendWorkerFactory.test.boc +0 -0
  192. package/build/UlnSendWorkerFactory.test.compiled.json +0 -1
  193. package/build/UlnSendWorkerFactory.test.fif +0 -6683
  194. package/build/UlnUtil.test.boc +0 -0
  195. package/build/UlnUtil.test.compiled.json +0 -1
  196. package/build/UlnUtil.test.fif +0 -5873
  197. package/build/WorkerCore.test.boc +0 -0
  198. package/build/WorkerCore.test.compiled.json +0 -1
  199. package/build/WorkerCore.test.fif +0 -5637
  200. package/build/ZroMinter.boc +0 -0
  201. package/build/ZroMinter.compiled.json +0 -1
  202. package/build/ZroMinter.fif +0 -2300
  203. package/build/ZroWallet.boc +0 -0
  204. package/build/ZroWallet.compiled.json +0 -1
  205. package/build/ZroWallet.fif +0 -2471
  206. package/src/classes/lz/Attestation.fc +0 -23
  207. package/src/classes/msgdata/ClaimUnaccountedPoolFunds.fc +0 -0
  208. package/src/classes/msgdata/InitUlnConnection.fc +0 -18
@@ -0,0 +1,99 @@
1
+ #include "stdlib.fc";
2
+ #include "utils.fc";
3
+
4
+ cell _garbageFilledCell() {
5
+ cell garbage2 = begin_cell()
6
+ .store_uint256("garbage2"c)
7
+ .end_cell();
8
+
9
+ cell garbage3 = begin_cell()
10
+ .store_uint256("garbage3"c)
11
+ .end_cell();
12
+
13
+ return begin_cell()
14
+ .store_uint256("garbage"c)
15
+ .store_ref(garbage2)
16
+ .store_ref(garbage3)
17
+ .end_cell();
18
+ }
19
+
20
+ cell _garbigify(cell $input, cell garbage) impure {
21
+ slice inputSlice = $input.begin_parse();
22
+ int numrefs = inputSlice.slice_refs();
23
+
24
+ if (numrefs <= 2) {
25
+ builder b = begin_cell().store_slice(inputSlice);
26
+ repeat (4 - numrefs) {
27
+ b = b.store_ref(garbage);
28
+ }
29
+ return b.end_cell();
30
+ } elseif (numrefs == 3) {
31
+ slice cutfirst = scutfirst(inputSlice, inputSlice.slice_bits(), 2);
32
+ builder b = begin_cell().store_slice(cutfirst);
33
+ slice s = inputSlice.preload_ref_at(2).begin_parse();
34
+ builder innerB = begin_cell().store_slice(s);
35
+ int innerNumRefs = s.slice_refs();
36
+
37
+ repeat (4 - innerNumRefs) {
38
+ innerB = innerB.store_ref(garbage);
39
+ }
40
+
41
+ return b.store_ref(innerB.end_cell()).store_ref(garbage).end_cell();
42
+ } elseif (numrefs == 4) {
43
+ builder b = begin_cell().store_slice(scutfirst(inputSlice, inputSlice.slice_bits(), 2));
44
+ slice s1 = inputSlice.preload_ref_at(2).begin_parse();
45
+ slice s2 = inputSlice.preload_ref_at(3).begin_parse();
46
+ builder innerb1 = begin_cell().store_slice(s1);
47
+ builder innerb2 = begin_cell().store_slice(s2);
48
+ int refs1 = s1.slice_refs();
49
+ int refs2 = s2.slice_refs();
50
+
51
+ repeat (4 - refs1) {
52
+ innerb1 = innerb1.store_ref(garbage);
53
+ }
54
+
55
+ repeat (4 - refs2) {
56
+ innerb2 = innerb2.store_ref(garbage);
57
+ }
58
+
59
+ return b.store_ref(innerb1.end_cell()).store_ref(innerb2.end_cell()).end_cell();
60
+ }
61
+
62
+ ;; Should never happen as the above checks and returns from all cases
63
+ ;; The compiler needs you to return from all possible control flows
64
+ ;; and it isn't smart enough to know that this will never be reached.
65
+ ~strdump("garbigify: this print should never happen");
66
+ return empty_cell();
67
+ }
68
+
69
+ () profile_gas(var func, tuple args) {
70
+ int gas_consumed = get_gas_consumed();
71
+ int gas_consumed_consumed = get_gas_consumed();
72
+ int gas_consumed_of_gas_consumed = gas_consumed_consumed - gas_consumed;
73
+ int gas0 = get_gas_consumed();
74
+ var x = func(args);
75
+ int gas1 = get_gas_consumed();
76
+ ~strdump("ignore this dump, this is to not optimize out");
77
+ ~dump(x);
78
+ int final_gas = gas1 - gas0 - gas_consumed_of_gas_consumed;
79
+ ~dump(final_gas);
80
+ }
81
+
82
+ cell _dupWithGarbage(cell $input) {
83
+ return _garbigify($input, _garbageFilledCell());
84
+ }
85
+
86
+ cell headerCellGarbage(cell $input) {
87
+ int ind = 0;
88
+ slice inputSlice = $input.begin_parse();
89
+ builder b = begin_cell();
90
+ while (ind < inputSlice.slice_refs()) {
91
+ b = b.store_ref(inputSlice.preload_ref_at(ind));
92
+ ind += 1;
93
+ }
94
+ b = b.store_slice(
95
+ inputSlice
96
+ .scutfirst(min(inputSlice.slice_bits(), 512), 0))
97
+ .store_uint256("garbage1"c);
98
+ return b.end_cell();
99
+ }
@@ -76,13 +76,14 @@ int _SDCNTLEAD0(slice x) asm "SDCNTLEAD0";
76
76
  int POW2(int y) asm "POW2";
77
77
 
78
78
  ;; numCells, num_bits
79
- (int, int) getContractStateSize(cell code, cell init_storage) inline {
79
+ (int, int) getContractStateSize(cell code, cell init_storage) impure inline {
80
80
  cell stateInit = begin_cell()
81
81
  .store_uint(6, 5)
82
82
  .store_ref(code)
83
83
  .store_ref(init_storage)
84
84
  .end_cell();
85
- (int cellsCount, int bitsCount, _) = stateInit.compute_data_size(MAX_U16);
85
+ (int cellsCount, int bitsCount, int success) = stateInit.compute_data_size(MAX_U16);
86
+ throw_unless(8, success);
86
87
  return (cellsCount, bitsCount);
87
88
  }
88
89
 
@@ -117,3 +118,66 @@ int treeShapeEqual(cell lhs, cell rhs) inline {
117
118
  }
118
119
 
119
120
  int _globvarIsNull(int idx) impure asm "GETGLOBVAR ISNULL";
121
+
122
+ int _gasToNanoton(int gas) inline {
123
+ return get_compute_fee(false, gas);
124
+ }
125
+
126
+ (cell, int) getConfigParam(int idx) inline asm "CONFIGPARAM";
127
+
128
+ ;; https://github.com/ton-blockchain/ton/blob/master/crypto/block/block.tlb
129
+ ;; gas_prices#dd gas_price:uint64 gas_limit:uint64 gas_credit:uint64
130
+ ;; block_gas_limit:uint64 freeze_due_limit:uint64 delete_due_limit:uint64
131
+ ;; = GasLimitsPrices;
132
+ ;;
133
+ ;; gas_prices_ext#de gas_price:uint64 gas_limit:uint64 special_gas_limit:uint64 gas_credit:uint64
134
+ ;; block_gas_limit:uint64 freeze_due_limit:uint64 delete_due_limit:uint64
135
+ ;; = GasLimitsPrices;
136
+ ;;
137
+ ;; gas_flat_pfx#d1 flat_gas_limit:uint64 flat_gas_price:uint64 other:GasLimitsPrices
138
+ ;; = GasLimitsPrices;
139
+ ;;
140
+ ;; config_mc_gas_prices#_ GasLimitsPrices = ConfigParam 20;
141
+ ;; config_gas_prices#_ GasLimitsPrices = ConfigParam 21;
142
+ ;; return -1 on any failure
143
+ (int, int, int, int, int, int, int, int, int) parseGasLimitsPrices(int workchainId) impure {
144
+ int configIdx = workchainId == BASECHAIN ? 21 : 20;
145
+ (cell cfg, int success) = getConfigParam(configIdx);
146
+ ifnot (success) {
147
+ return (-1, -1, -1, -1, -1, -1, -1, -1, -1);
148
+ }
149
+ slice cfgSlice = cfg.begin_parse();
150
+ ifnot (cfgSlice.slice_bits() >= 592) {
151
+ return (-1, -1, -1, -1, -1, -1, -1, -1, -1);
152
+ }
153
+
154
+ if (
155
+ (cfgSlice.preload_uint(8) != 0xd1)
156
+ | (cfgSlice.preload_bits_offset(136, 8).preload_uint(8) != 0xde)
157
+ ) {
158
+ return (-1, -1, -1, -1, -1, -1, -1, -1, -1);
159
+ }
160
+
161
+ cfgSlice~load_uint8();
162
+ int specialGasLimit = cfgSlice~load_uint64();
163
+ int flatGasLimit = cfgSlice~load_uint64();
164
+ int flatGasPrice = cfgSlice~load_uint64();
165
+ cfgSlice~load_uint8();
166
+ int gasPrice = cfgSlice~load_uint64();
167
+ int gasLimit = cfgSlice~load_uint64();
168
+ int gasCredit = cfgSlice~load_uint64();
169
+ int blockGasLimit = cfgSlice~load_uint64();
170
+ int freezeDueLimit = cfgSlice~load_uint64();
171
+ int deleteDueLimit = cfgSlice~load_uint64();
172
+ return (
173
+ specialGasLimit,
174
+ flatGasLimit,
175
+ flatGasPrice,
176
+ gasPrice,
177
+ gasLimit,
178
+ gasCredit,
179
+ blockGasLimit,
180
+ freezeDueLimit,
181
+ deleteDueLimit
182
+ );
183
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "hash": "1a9652b3a16a6fd12a1df3d44a9d24516bb82ae00306e758be7b53f8fa726261",
3
+ "hashBase64": "GpZSs6Fqb9EqHfPUSp0kUWu4KuADBudYvntT+PpyYmE=",
4
+ "hex": "b5ee9c7241021201000495000114ff00f4a413f4bcf2c80b01020162020b02cad033d0d3030171b0925f03e0fa403022d749c000925f03e002d31f0120c000925f04e001d33f01ed44d0d3ff0101d3070101d4d3070101f404d2000101d1288210f718510fbae30f054443c8500601cbff500401cb0712cc0101cb07f4000101ca00c9ed540307019e3806d3ff0128b38e122084ffba923024965305baf2e3f0e205a405de01d2000101d3070101d32f0101d4d1239126912ae2523078f40e6fa1f2e3ef1ec705f2e3ef20f823bef2e06f20f823a1546d700401d4f80703830cf94130038308f94130f8075006a18127f801a070f83681120670f836a0812bec70f836a0811d9870f836a022a60622a081053926a027a070f83823a481029827a070f838a003a60658a08106e05005a05005a0430370f83759a001a01cbef2e064f82850030502b8017002c858cf160101cbffc98822c8cb01f400f400cb00c97021f90074c8cb0212ca07cbffc9d0c882109c73fba2580a02cb1fcb3f2601cb075250cc500b01cb2f1bcc2a01ca000a951901cb07089130e2102470408980188050db3c110600928e45c85801cb055005cf165003fa0254712323ed44ed45ed479f5bc85003cf17c913775003cb6bcccced67ed65ed64747fed11987601cb6bcc01cf17ed41edf101f2ffc901fb00db06029a363826821075097f5dba8eba068210a32c59bfba8ea9f82818c705f2e06503d4d1103410364650f8007f8e8d2178f47c6fa5209132e30d01b3e65b10355034923436e2505413e30d4015503304090802e23604d3ff0101d32f0101d3070101d3ff0101d4d1f8285005017002c858cf160101cbffc98822c8cb01f400f400cb00c97001f90074c8cb0212ca07cbffc9d01bc705f2e06526f9001aba5193be19b0f2e06607f823bef2e06f44145056f8007f8e8d2178f47c6fa5209132e30d01b3e65b110901fa02d74cd0d31f01208210f1381e5bba8e6a82101d0cfbd3ba8e5e6c44d3070101d4217f708e17511278f47c6fa53221995302baf2e06702a402de01b312e66c2120c200f2e06e23c200f2e06d5330bbf2e06d01f404217f708e17511278f47c6fa53221995302baf2e06702a402de01b312e66c2130d155239130e2e30d0a001030d307d402fb00d10201200c0e0143bf74ff6a26869ff8080e9838080ea69838080fa0269000080e8881aaf8280fc11d0c0d00c2f80703830cf94130038308f94130f8075006a18127f801a070f83681120670f836a0812bec70f836a0811d9870f836a022a60622a081053926a027a070f83823a481029827a070f838a003a60658a08106e05005a05005a0430370f83759a001a00201660f1000f1b0cafb513434ffc04074c1c0407534c1c0407d01348000407448dfdc2385d4449e3d1f1be94c886654c0aebcb819c0a900b7806cc4b99b08548c2ebcb81b085fdc2385d4449e3d1f1be94c886654c0aebcb819c0a900b7806cc4b99b084c08b0803cb81b8930803cb81b5490eefcb81b40648cdfe440f880e00159b0c9fe0a00405c00b21633c5804072fff26208b232c07d003d0032c0325c007e401d3232c084b281f2fff27420110842024ebdec6e60259521d325e0baebe89b9a7901619805a4dfa624e5a3549349fcbf3e76e893"
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "hash": "4ebdec6e60259521d325e0baebe89b9a7901619805a4dfa624e5a3549349fcbf",
3
+ "hashBase64": "Tr3sbmAllSHTJeC66+ibmnkBYZgFpN+mJOWjVJNJ/L8=",
4
+ "hex": "b5ee9c7241020d01000372000114ff00f4a413f4bcf2c80b01020162020c04f8d03331d0d3030171b0915be0fa403001d31f01ed44d0fa4001f861d3ff01f86220d749c0008e13306df8636df8646df8656df8666df8676df8688e22d30701f863d20001f864d401f865d3ff01f866d30701f867d32f01f868d401f869d1e220c000e30201d33f012282109c73fba2bae302028210a762230fbae3020304060b01c83020d74ac0008e23c8708e1a22d7495230d71912cf1622d74a9402d74cd093317f58e2541220e63031c9d0df840f018b7617070726f76658c705f2f420707f8e19f84578f47c6fa5209b5243c70595317f327001de9132e201b3e632f2e06af82512db3c0702fe32f84113c705f2e068f8436e8ef101d30701f86370f864d401f86570f86670f867d32f01f868f848f823bef2e06fd401f869d200018e99d30701aef84621b0f2d06bf847a4f867f84601b1f86601db3c9131e2d1f849f846f845c8f841cf16f84201cbfff84301cb07f84401ca00cccbfff84701cb07f84801cb2fccc9ed540905018ce001d30701f843baf2e069d401f900f845f900baf2e069d32f01f848baf2e069d401f900f849f900baf2e069d20001f2e069d3070101d1f845521078f40e6fa1f2e06a58db3c070136d3070101d1f845521078f40e6fa1f2e06a5230c705f2e06a59db3c07026e8f335ced44ed45ed478e983170c88210afaf283e580402cb1fcb3fcb1f80108050db3ced67ed65ed64727fed118aed41edf101f2ffdb030a0802b4f844f2d07002aef84621b0f2d06bf847a4f867f84601b1f86670c8821082609bf62402cb1fcb3f80108050db3cdb3cf849f846f845c8f841cf16f84201cbfff84301cb07f84401ca00cccbfff84701cb07f84801cb2fccc9ed540a090180f847f843ba8eb6f84170f849c8821075097f5d580502cb1fcb3ff84201cbfff84801cb2ff84701cb07f845f90001cbff13cc128010810090db3c7ff8649130e20a00888e40c85801cb055004cf1658fa02547120ed44ed45ed479d5bc85003cf17c9127158cb6acced67ed65ed64737fed11977001cb6a01cf17ed41edf101f2ffc901fb00db05000c5f03840ff2f000c1a1c771da89a1f48003f0c3a7fe03f0c441ae9380011c2660dbf0c6dbf0c8dbf0cadbf0ccdbf0cedbf0d11c45a60e03f0c7a40003f0c9a803f0cba7fe03f0cda60e03f0cfa65e03f0d1a803f0d3a3c5f083f085f087f089f08bf08df08ff091f09326d3be81"
5
+ }
@@ -106,20 +106,23 @@ cell baseTest::prepare(tuple args) impure {
106
106
  if (terminalIndices.tlen() > 1) {
107
107
  test::throwError("Multiple terminal actions");
108
108
  }
109
-
110
109
  ;; Check that the storage after running the handler matches the expected storage
111
- int wrongField = compareObjectFields(getContractStorage(), $expectedStorage);
112
- if (wrongField == INVALID_CLASS_MEMBER) {
113
- return (
114
- TEST_FAILED,
115
- "Storage and expected storage not of the same type"
116
- );
117
- } elseif (wrongField != -1) {
118
- return (
119
- TEST_FAILED,
120
- "malformed field ".str::concatInt(wrongField)
121
- );
110
+ if ($expectedStorage.cl::hash() != getContractStorage().cl::hash()) {
111
+ ~strdump("Checking individual fields");
112
+ int wrongField = compareObjectFields(getContractStorage(), $expectedStorage);
113
+ if (wrongField == INVALID_CLASS_MEMBER) {
114
+ return (
115
+ TEST_FAILED,
116
+ "Storage and expected storage not of the same type"
117
+ );
118
+ } elseif (wrongField != -1) {
119
+ return (
120
+ TEST_FAILED,
121
+ "malformed field ".str::concatInt(wrongField)
122
+ );
123
+ }
122
124
  }
125
+
123
126
  if (expectedTxnContext.tlen() != txnContext.tlen()) {
124
127
  return (TEST_FAILED, "malformed txn context");
125
128
  }
Binary file
@@ -1 +0,0 @@
1
- {"hash":"753d6f1fec72bb79d40e159ece0c56c59a7280d17d11e5c43560a996b8c0cead","hashBase64":"dT1vH+xyu3nUDhWezgxWxZpygNF9EeXENWCplrjAzq0=","hex":"b5ee9c724202012e0001000037cf00000114ff00f4a413f4bcf2c80b00010201620002001c0202ca000300190201200004001302012000050008020120000600070001d400736807400740875d2c8b5d2d40cef5484ef44ac64d7c0dc238808300024d7c0dff81fdc24c8b0802754d035d214d075d23c0184ac007a0517c138a02012000090010020120000a000d020120000b000c00910875d24875d268205fa06f238c6342343616e6e6f7420636f6e636174656e6174653a20737472696e6720746f6f206c6f6e678083f850c3e406102ac3cbc37b21633c58073c5b2742000053c0220020120000e000f007722c20870402640a2c4b63c020068d63788700026600c3232c1f2743c0237a4c870802384c85eaa42298c3232c1f274007c02405eaa41007a0c7c026000053c02a002012000110012008d48b0821c000998030c8cb07c9d0f008de9321c2008e2c21a93803c10a9e21a93803a630c8cb07c9d001f0098e1021a93803a641a6f6c8cb07c9d001f009e201ab0301e831f0098001b4018b23a208f00901f00bfe1430802016e0014001803f7420c00398308b575696e74388e020c00499308b675696e7431368e020c00599308b675696e7433328e020c00699308b675696e7436348e020c0089a308b775696e743235368e020c00798308b5636f696e738e020c0089a308b7616464726573738e020c0099a308b7646963743235368e020c009e30220c009e30280015001600170012308b66f626a52656680014308b763656c6c52656680026c000968b4626f6f6c8e08b7756e6b6e6f776e80183521f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba9130e0018307f45b30209993d0307f925b70f2ffda118e823088df801250201ce001a001b006f420f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba93307f6de08307f4866fa59101e05b7f6d80071521f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba935b7f6de0018307f47c6fa59101e05b7f6d8020120001d00b4020120001e0063020120001f0047020120002000340201200021002d020120002200230114ab5f705433334403db3c00e00201580024002c0201200025002901e3bba24807fa908aa0205807fa90422807fa908aa0203807fa90408d025aa0223aa025381a05361a05096b609c27f5385b6098103f8bcb1f2d27d2ac0008e31333920c80870d73017cf164708cf01705124a1532504103659d73412cf164104cf0122d74958a122d74a1023d732cf16c9e30e8002602fe34366f00708ef25303ba534bbab08e565303ba8e20c8533970d730cf16546a91cf0123d749539aa0a124d74a2559d732cf16126f8c8e2e530aba8e20c8533670d730cf16546761cf0123d7495367a0a124d74a2559d732cf16126f8c97c823cf16126f8ce2e2e30d22d74ac2009502d74cd002de01a4530abee6195f095301002700280074532870d7305398a070538ba12ba153165530d73424d7495378a0a125d74a2659d732c85003cf16546cb1cf0101cf16546871cf0101cf16126f8c00266f81c99322c2009802a55c6f8113ccc9e86c210117bbc8220736d6c4d677279088002a04fc82386261736553746f726578586f0270706f0270706f0279886f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2186f027550076f02730125011a011e002b025c50066f0277706f0277706f0279886f027850086f027950076f027950066f027950056f0210374650103441306f0a0125011902e9a0b60841c185d1a1d54015bc09e14011bc09d5400dbc09e161bc09bc11b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a011a011e020120002e0033020120002f00300057a4bc03a0034e254ca0b94c08e5ae49ae1602a4454c20e5ae49ae16024380012663ae912eb3ae91a003ae91c5020120003100320087a05887e4020bc25a8a5b4893ca1719efba4f0c3e28c2455fc36a8d7716e1f9042de18c28273f1eea60c5b60c1fd039be865c060c1fd039be878a535c2ffdfe4cc1c1c38a01e3a061640740069c4a9941729811cb5c935c2c05488a9841cb5c935c2c048700024cc75d225d675d2340075d23880487e4020bc25a8a5b4893ca1719efba4f0c3e28c2455fc36a8d7716e1f9042de18c28273f1eea60c5b60c1fd039be865c060c1fd039be87888250075d30063a0cc620078a01250076a91770804002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e28103fea00201200035003c020120003600390201200037003802e1a6f50480cecae89ae6ce98c486c4f0a006de04f2b0de04de04db90de0442df100791969ee240e50202bce04126a6137315d0be0cd84442de2244df114a418403c6010202bc479e6342279e82039e2e43800326d843931c300380052e02de2592039993c042de279204de259203999993c5011a011e02eba48904809ee0e8d2dedce68af0e8eaa008de04eaa006de04f2b0de04de06db90de0442df100791969ee240e50202bce04126a6137315d0be0cd84442de2244df114a418403c6010202bc479e6342279e82039e2e43800326d843931c300380052e02de2592039993c042de279204de259203999993c5011a011e020148003a003b02e3a2220881cd95d1118dd1d94011bc09d9400dbc09e561bc09bc0db721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a011a011e02e5a3c608a10db541c985b5cde54011bc09e1400dbc09e161bc09bc0db721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a011a011e020120003d0042020120003e0041020158003f00400081bab830702d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e27074c8cb02ca07cbffc9d08006bbd320f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba973082104e554c4c94d0d70b4fe28006ba553002005a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c50201c70043004402ebb5f04809ae6ced8d2c492dcccdef0a008de04f2a006de04f2b0de04de06db90de0442df100791969ee240e50202bce04126a6137315d0be0cd84442de2244df114a418403c6010202bc479e6342279e82039e2e43800326d843931c300380052e02de2592039993c042de279204de259203999993c50011a011e0119b7d0450e6dad886dedcdcf2070004504fc82386261736553746f726578586f0270706f0270706f0279886f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2136f0279586f0278700125011a011e004602b86f026f036dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2011a011e0201200048005a02012000490050020120004a004f020120004b004d0103a621004c045c82384c7a526563765374737050036f0276586f0277706f0279886f0279886f0278706f0279886f0273706f026f0801250125012501190103a445004e017c82206c7a53656e6476706f0278706f0278706f027950066f0277500a6f027750096f027950086f027950076f027950056f02487010561059443049906f0901190166a81c532101d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e201f01fdb3c012b0201200051005902014800520056020120005300550103bf980054014a8238636f756e74496e63727550066f027350056f027950046f027750036f0277586f026f05011901cbba95d01d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e25922f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba986c126d128307f41795028307f417e2db3c8012b0201200057005802ddba28210504f4f4f76716f0279c88409cf40c96f026f026dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e28011a011e0009bdcd70bff80224a9f77f707f217f887f8824820193afed43d801250125020120005b0060020148005c005d02d7a4b50480e6cae882c8c8e4cae6e6f0b0de04de02db90de0442df100791969ee240e50202bce04126a6137315d0be0cd84442de2244df114a418403c6010202bc479e6342279e82039e2e43800326d843931c300380052e02de2592039993c042de279204de259203999993c5011a011e020120005e005f0103a38601180065f005a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c50201200061006202eaa83182385263764d73676c69627850046f027850036f0276586f026f036dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2011a011e02e6aa2982287365745172756d7650046f027650036f0276586f026f036dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2011a011e0201200064008d02012000650076020120006600700201580067006f0201200068006e0103a0420069011682286368616e6e656c7904006a04fe82386261736553746f726578586f0270706f0270706f0279886f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2146f027950036f0278580125011a011e006b033e6f02797f70547000705433334403db3c6f0276706f0279886f0276706f027900e00125006c03e08210504f4f4f76716f0279c88409cf40c96f026f026dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e26f0279011a011e006d04f28210504f4f4f76716f0279c88409cf40c96f026f026dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e26f0279886f0277706f026f0b011a011e01250119006fa16c8be4020bc25a8a5b4893ca1719efba4f0c3e28c2455fc36a8d7716e1f9042de18c28273f1eea61b049b44a0c1fd05e540a0c1fd05f8a02f5a5730480dae6cee4cac6cad2e0e8f2a00ade04eea008de04eea006de04e8b0de04de08db90de0442df100791969ee240e50202bce04126a6137315d0be0cd84442de2244df114a418403c6010202bc479e6342279e82039e2e43800326d843931c300380052e02de2592039993c042de279204de259203999993c5011a011e02012000710074020397100072007302dff20901b1e9c9958dd9c1c995c1d9400dbc09dd61bc09bc09b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a011a011e02d9a4c11026b220b232393ca801b7813c2c3781378136e4378110b7c401e465a7b890394080af381049a984dcc5742f83361110b7889137c452906100f1804080af11e798d089e7a080e78b90e000c9b610e4c70c00e0014b80b7896480e664f010b789e48137896480e66664f140011a011e0104ab970075018482306c6962536e64436277500c6f0277500b6f0279500a6f027950096f027950086f027450076f027350066f027450056f027350046f027950036f0273586f026f0b01190201200077007c0201200078007b0201580079007a02d7a0f20901a5b9a5d14db5b10dbdb9e161bc09bc05b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a011a011e0097a0b0875d248b5d2b080486a4e00b0c02c64fcb15337882ac094c0afa596ea80b5c0406389944c75c0548d684135d33409208054cb3b50f604b2140133c0412a808533c07274006a80b5c0f8a02d0a86582204d644469637479586f026f016dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2011a011e020120007d008c020148007e007f02eba1ee088141858dad95d1e54011bc09e5400dbc09d961bc09e1c1bc09bc11b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a011a011e0201200080008102d7b9982184d644f626a7950036f0279586f026f026dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e28011a011e0103bce80082019e01d07121d74922d74ac20121a93802c300b193f2c54cde20ab025302be965baa02d701018e265131d7015235a104d74cd0248201532ced43d812c85004cf0104aa0214cf01c9d001aa02d703e230780083019821d74922d74ac20121a93802c300b193f2c54cde20ab025302be965baa02d701018e265131d7015235a104d74cd0248201532ced43d812c85004cf0104aa0214cf01c9d001aa02d703e230740084019a21d74922d74ac20121a93802c300b193f2c54cde20ab025302be965baa02d701018e265131d7015235a104d74cd0248201532ced43d812c85004cf0104aa0214cf01c9d001aa02d703e20180200085019821d74922d74ac20121a93802c300b193f2c54cde20ab025302be965baa02d701018e265131d7015235a104d74cd0248201532ced43d812c85004cf0104aa0214cf01c9d001aa02d703e201740086019a21d74922d74ac20121a93802c300b193f2c54cde20ab025302be965baa02d701018e265131d7015235a104d74cd0248201532ced43d812c85004cf0104aa0214cf01c9d001aa02d703e20180200087019a21d74922d74ac20121a93802c300b193f2c54cde20ab025302be965baa02d701018e265131d7015235a104d74cd0248201532ced43d812c85004cf0104aa0214cf01c9d001aa02d703e20180200088019a21d74922d74ac20121a93802c300b193f2c54cde20ab025302be965baa02d701018e265131d7015235a104d74cd0248201532ced43d812c85004cf0104aa0214cf01c9d001aa02d703e2305530008903e88210706174687550056f027850046f027550036f0278586f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201011a011e008a039e20d74921d74ac10221a93802c000b0f2e5c720c0008e825b888eb221d74ac0009630c801cf16c9e06f009522d74ac2008ae86c21206f88a55c6f819321c2009901a501c953216f81cce86c21c9e258012500fe008b02e882205061636b65747950046f027950036f0276586f0278706f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2011a011e0104a96f00a2020120008e00a6020120008f009b0201200090009a020120009100940201200092009300dfa261640740069c4a9941729811cb5c935c2c05488a9841cb5c935c2c048700024cc75d225d675d2340075d23880487e4020bc25a8a5b4893ca1719efba4f0c3e28c2455fc36a8d7716e1f9042de18c28273f1eea60c5b60c1fd039be865c060c1fd039be878a535c2ffdfe4cc1c1c38a016ba25887e4020bc25a8a5b4893ca1719efba4f0c3e28c2455fc36a8d7716e1f9042de18c28273f1eea3a0d6e21c25c060c1fd03dbe878a0125020120009500990103a386009601168228636f756e7465727907009704f882386261736553746f726578586f0270706f0270706f0279886f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2176f02454579050125011a011e00980438db3c126f0279886f0279886f0270706f027350056f02103441306f0600a001250125011902dfa2de08e1cd95d14db5b10d999ddd400dbc09dd61bc09bc09b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a011a011e00e6a8f52270830702d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e258ba0271804002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e201bbb0020120009c009d02daabce82204174746573747850036f0276586f026f026dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2011a011e020120009e009f006ba56b060e05a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c50103a7fd00a004708230626173654f41707078256f0275256f0279886f0277820186a06f0279886f0279886f0278706f0279500a6f027950096f020a7970500d01250125012500a103dadb3c1b6f021059104810374650104a103a102a6f0a6dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e200a2011a011e01188230656e64706f696e74790200a304fc82386261736553746f726578586f0270706f0270706f0279886f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2126f027550046f02750125011a011e00a4042a50036f0279886f0273706f0279886f0279886f027901250125012500a5042a886f0279886f0279886f0276706f0210ab109b6f0b012501250125011902015800a700aa02012000a800a902eda4dce10440a0c2c6d6cae8f2a008de04f2a006de04ecb0de04f0e0de04de08db90de0442df100791969ee240e50202bce04126a6137315d0be0cd84442de2244df114a418403c6010202bc479e6342279e82039e2e43800326d843931c300380052e02de2592039993c042de279204de259203999993c5011a011e0103a5eb012b02012000ab00af02015800ac00ae0103b8e800ad034a328220576f726b65727850046f0279886f0279886f027950046f027950056f024430126f0501250125011902e3b9c82206465706c6f797750046f027550036f0278586f026f036dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e28011a011e02014800b000b302014800b100b202dfaaa08e14d95b99115c10d999de1400dbc09e161bc09bc09b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a0011a011e03e3a9e08c195e1958dd5d1bdc80de40f6cf049bc09dd61bc09bc09b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a00118011a011e02ebbec8240657874656e6465644d647950046f027950036f0278586f026f036dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e28011a011e02012000b500ef02012000b600d502012000b700c802012000b800c502012000b900be02012000ba00bb02dda6d704609c88e4e092e8cadaf0a006de04eeb0de04de04db90de0442df100791969ee240e50202bce04126a6137315d0be0cd84442de2244df114a418403c6010202bc479e6342279e82039e2e43800326d843931c300380052e02de2592039993c042de279204de259203999993c5011a011e02012000bc00bd011da0f9fdc151c001c150cccd100f6cf200e002dfa0b608e185919135cd9d31a589e1400dbc09d561bc09bc09b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a011a011e02012000bf00c20201cb00c000c102f1fc11c27b83a34b7b739ab18bc2802b7813c280237813c2801b7813c2c3781378236e4378110b7c401e465a7b890394080af381049a984dcc5742f83361110b7889137c452906100f1804080af11e798d089e7a080e78b90e000c9b610e4c70c00e0014b80b7896480e664f010b789e48137896480e66664f14011a011e0067b6f005a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c502012000c300c4006ba30e0c1c0b40069c4a9941729811cb5c935c2c05488a9819eb5c935c2c248700025cc48b5c90075c0e6d675d2341444b5c90075c0f8a02b3a139b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a011a011e02027300c600c7000dbe3c8cbffc9d080105bc6888012502012000c900cf02012000ca00cd02015800cb00cc02d7a09a0861c1add12591e5400dbc09d961bc09bc09b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a011a011e0171a2be08a155b1b90dbdb999c14029bc09d54025bc09c14021bc09d9401dbc09c14019bc09e54015bc09c14011bc09e5400dbc09cd61bc09bc2601190104a8b400ce01648228706b7453656e747750096f027750086f027950076f027950066f027950056f027650046f027850036f0279586f026f08011902012000d000d30104ab0900d101f42480208e30eda2edfb01d0018e2220d74b20c0009c3031a93802c300f2d57adb31e0c301018103f8bdb1f2d57ad74cd0e430f2c57ad82380208e30eda2edfb01d0018e2220d74b20c0009c3031a93802c300f2d57adb31e0c301018103f8bdb1f2d57ad74cd0e430f2c57ad882384c7a5265637653747370500900d202fc6f027650086f027750076f027950066f027950056f027850046f027950036f0273586f026f086dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2011a011e01e6aab520c100f2d633217101d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e2d02270804002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e25320b9925f03e30e00d402605122a171c85d70d730cf16cb00840958a1a51270d732cf16c9d0d76171c858cf1622cf40c91024db3c017003a012db3c012b012b02012000d600dd02012000d700dc02012000d800db02012000d900da0103a52b00e00073a7e443f20105e12d452da449e50b8cf7dd27861f146122afe1b546bb8b70fc8216f0c614139f8f753062db060fe81cdf432e03060fe81cdf43c502d0aa268220696e6974457079586f026f016dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2011a011e02cfaeda410c3737b731b2bb2c37813780b6e4378110b7c401e465a7b890394080af381049a984dcc5742f83361110b7889137c452906100f1804080af11e798d089e7a080e78b90e000c9b610e4c70c00e0014b80b7896480e664f010b789e48137896480e66664f140011a011e02012000de00e402014800df00e10121a4a2fee0a826002046e0a866668807b67900e0016682304570436f6e6669677050096f027850086f027850076f027850066f027850056f027850046f027850036f0276586f026f08011902012000e200e30057a39c0740069c4a9941729811cb5c935c2c05488a9841cb5c935c2c048700024cc75d225d675d2340075d238a00cba299640740069c4a9941729811cb5c935c2c05488a9841cb5c935c2c048700024cc75d225d675d2340075d23880487e4020bc25a8a5b4893ca1719efba4f0c3e28c2455fc36a8d7716e1f9042de18c28273f1eea60c5b60c1fd039be865c060c1fd039be878a02012000e500e802012000e600e7006ba41b004005a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c502e9a66304709ac886d886e8e4c6e8f2a008de04f0a006de04eab0de04de06db90de0442df100791969ee240e50202bce04126a6137315d0be0cd84442de2244df114a418403c6010202bc479e6342279e82039e2e43800326d843931c300380052e02de2592039993c042de279204de259203999993c5011a011e02015800e900ec0103a04a00ea01dc2173830702d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e22272802002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2237100eb00f8830702d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e20470802002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e203c8cb3f13cb1f13cbffcb1fcbff71f90403011fa00609018dbdb9d1c9bdb1b195c9e41600ed04fc82386261736553746f726578586f0270706f0270706f0279886f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2156f027550046f02790125011a011e00ee02d450036f0279586f0278706f0278706f026f066dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2011a011e02012000f0010902012000f1010302012000f2010002012000f300f402eeaa108220436f6e6669677950056f027850046f027550036f0279586f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2011a011e0104ab4700f5019cd07121d74922d74ac20121a93802c300b193f2c54cde20ab025302be965baa02d701018e265131d7015235a104d74cd0248201532ced43d812c85004cf0104aa0214cf01c9d001aa02d703e2307800f6019821d74922d74ac20121a93802c300b193f2c54cde20ab025302be965baa02d701018e265131d7015235a104d74cd0248201532ced43d812c85004cf0104aa0214cf01c9d001aa02d703e2017400f7019a21d74922d74ac20121a93802c300b193f2c54cde20ab025302be965baa02d701018e265131d7015235a104d74cd0248201532ced43d812c85004cf0104aa0214cf01c9d001aa02d703e201802000f8019821d74922d74ac20121a93802c300b193f2c54cde20ab025302be965baa02d701018e265131d7015235a104d74cd0248201532ced43d812c85004cf0104aa0214cf01c9d001aa02d703e2017400f9019a21d74922d74ac20121a93802c300b193f2c54cde20ab025302be965baa02d701018e265131d7015235a104d74cd0248201532ced43d812c85004cf0104aa0214cf01c9d001aa02d703e201802000fa019a21d74922d74ac20121a93802c300b193f2c54cde20ab025302be965baa02d701018e265131d7015235a104d74cd0248201532ced43d812c85004cf0104aa0214cf01c9d001aa02d703e201802000fb019821d74922d74ac20121a93802c300b193f2c54cde20ab025302be965baa02d701018e265131d7015235a104d74cd0248201532ced43d812c85004cf0104aa0214cf01c9d001aa02d703e2553100fc03e88210706174687550056f027850046f027550036f0278586f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e202011a011e00fd03a020d74921d74ac10221a93802c000b0f2e5c720c0008e825b888eb221d74ac0009630c801cf16c9e06f009522d74ac2008ae86c21206f88a55c6f819321c2009901a501c953216f81cce86c21c9e25003012500fe00ff00d222d74cd020d7495303a08103f8bb9120958103f824a1e222d74ac2009a22d7498103f8bdf2d5c7de22d74ac10222c200b022a93802c000b0f2e5c7c8516570d73216cf16532570d730cf16136f8c21d74ac0005135a1c20013b09b20c80570d73114cf166f8c9133e203f082205061636b65747950046f027950036f0276586f0278706f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e27358db3c011a011e012b0201480101010200dda47642e1008005a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c54202e203a0034e254ca0b94c08e5ae49ae1602a4454c20e5ae49ae16024380012663ae912eb3ae91a003ae91c5a002e3ae49ae16018003006da404e205a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c58601020120010401060105ad48c001050148823053657445704366677050066f027850056f027850046f027850036f0276586f026f05011902012001070108006caa52830602d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e20058ab7901d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e2020120010a0115020120010b010e020158010c010d03eda53f0470c4c2e6caa6e8dee4caf0b0de04e0e0de04e0e0de04f310de04de08db90de0442df100791969ee240e50202bce04126a6137315d0be0cd84442de2244df114a418403c6010202bc479e6342279e82039e2e43800326d843931c300380052e02de2592039993c042de279204de259203999993c50125011a011e02dba5d50450e6cae8a0cacae4eaa006de04f0b0de04de04db90de0442df100791969ee240e50202bce04126a6137315d0be0cd84442de2244df114a418403c6010202bc479e6342279e82039e2e43800326d843931c300380052e02de2592039993c042de279204de259203999993c5011a011e020120010f01100008ab47ed44020120011101140201200112011302f9a0d60841413d3d3dd9c5bc09e721c73d01491a84573d0610254012844f3d03244dbc09bc09b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a011a011e0057a10c0740069c4a9941729811cb5c935c2c05488a9841cb5c935c2c048700024cc75d225d675d2340075d238a02dba5a30450e6cedcc8a4cae2f2a006de04f2b0de04de04db90de0442df100791969ee240e50202bce04126a6137315d0be0cd84442de2244df114a418403c6010202bc479e6342279e82039e2e43800326d843931c300380052e02de2592039993c042de279204de259203999993c5011a011e020120011601210201200117011f034aa943820864766e037903db3c126f0276586f0279886f0276716f0276716f0276716f026f06011801250119025c824077726b436f7253746f727850036f0278706f0270706f0270706f0279886f027850066f021045103441306f060125011902b06dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2011a011e03fc53806f81206f102020c10991ae923070e25350a08409bc8e133507a4702a6f885220be950ac86f8c0ade5085de24a427bc8e16343505a470742a6f885230be950ac86f8c0ade476604de21c1098e2021c0099d026f1153a76f81cc541a076f859d026f1153a76f81cc541a076f85e2e30d5098cb0328c200e30f02a41067011b011c011d0022026f11b60b53a86f8123cf01541a086f85002a7327c00191709127e258cb015240cb09cb015038a0003438840925c00191709125e25009cb0118cb095210cb0101a44707033e21cf32c0008f0788885003cc12cc8e8d21cf32c0018e848858cc01de01e20101250125012501eeabed8ef2eda2edfb2073830702d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e22175830702d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e20277d8012000c8804002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e222c00021c300b0955f0381072c8e2022c30001f823bbb0965b81027ddb31e020c30002bab0958103ebdb31e0810455e20201200122012602012001230124006ba6b7008005a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c50105a63511012500000201580127012801f1a241740740069c4a9941729811cb5c935c2c05488a9841cb5c935c2c048700024cc75d225d675d2340075d238964826a535d24c1fe496dc3cbff684657232fff27437c8be4020bc25a8a5b4893ca1719efba4f0c3e28c2455fc36a8d7716e1f9042de18c28273f1eea58c9b60c1fd05a540a0c1fd05b8b6cf2012b0201580129012a0005b7da1001cdb7242e403a0034e254ca0b94c08e5ae49ae1602a4454c20e5ae49ae16024380012663ae912eb3ae91a003ae91c4e2b1b67802e203a0034e254ca0b94c08e5ae49ae1602a4454c20e5ae49ae16024380012663ae912eb3ae91a003ae91c4ed919609999993f2010012b02f402d001a712a6505ca60472d724d70b01532174d724d70b035da6067ad724d70b095244a61072d724d70b012120c10991ae923070e223c0009125955353d748d0e221c300927433dec821d74927b60822d74a5250b6082359d730cf1624c0098e16323334505503cc7023d74a5006a1a54350d73213cf16e30e22012c012d006404c0098e1431345055cc7023d74a5006a1a54350d73213cf168e163206b60b541026cf015035a022d74a1023d73113cf16e20048c2008e1bc9c822d749546351d730cf16cc7022d74a5004a1a513d732cf16c9936c21c9e2f854f487"}