@layerzerolabs/layerzero-v2-ton 3.0.19-ton.0 → 3.0.21-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.
- package/build/AllStorages.compiled.json +1 -1
- package/build/AllStorages.test.compiled.json +1 -1
- package/build/BaseContract.test.compiled.json +1 -1
- package/build/Channel.compiled.json +1 -1
- package/build/Channel.permissions.test.compiled.json +1 -1
- package/build/ChannelBurn.test.compiled.json +1 -1
- package/build/ChannelCommitPacket.test.compiled.json +1 -1
- package/build/ChannelConfig.test.compiled.json +1 -1
- package/build/ChannelInitialize.test.compiled.json +1 -1
- package/build/ChannelMsglibIntegration.test.compiled.json +1 -1
- package/build/ChannelMsglibSendCallback.test.compiled.json +1 -1
- package/build/ChannelNilify.test.compiled.json +1 -1
- package/build/ChannelReceive.test.compiled.json +1 -1
- package/build/ChannelReceiveCallback.test.compiled.json +1 -1
- package/build/ChannelReceiveView.test.compiled.json +1 -1
- package/build/ChannelSend.test.compiled.json +1 -1
- package/build/Classlib.test.compiled.json +1 -1
- package/build/ComputeDataSizeGas.test.compiled.json +1 -1
- package/build/Connection.compiled.json +1 -1
- package/build/Controller.assertions.test.compiled.json +1 -1
- package/build/Controller.compiled.json +1 -1
- package/build/Controller.permissions.test.compiled.json +1 -1
- package/build/Controller.test.compiled.json +1 -1
- package/build/Counter.compiled.json +1 -1
- package/build/Counter.permissions.test.compiled.json +1 -1
- package/build/Counter.setters.test.compiled.json +1 -1
- package/build/Counter.test.compiled.json +1 -1
- package/build/Dvn.compiled.json +1 -1
- package/build/Dvn.test.compiled.json +1 -1
- package/build/DvnFeeLib.compiled.json +1 -1
- package/build/DvnPermissions.test.compiled.json +1 -1
- package/build/Endpoint.compiled.json +1 -1
- package/build/Endpoint.permissions.test.compiled.json +1 -1
- package/build/Endpoint.test.compiled.json +1 -1
- package/build/EndpointSetEpConfigDefaults.test.compiled.json +1 -1
- package/build/Executor.compiled.json +1 -1
- package/build/Executor.test.compiled.json +1 -1
- package/build/ExecutorFeeLib.compiled.json +1 -1
- package/build/ExecutorPermissions.test.compiled.json +1 -1
- package/build/LzClasses.test.compiled.json +1 -1
- package/build/LzUtil.test.compiled.json +1 -1
- package/build/MsgData.test.compiled.json +1 -1
- package/build/MsglibPacketCodec.test.compiled.json +1 -1
- package/build/PipelinedOutOfOrder.test.compiled.json +1 -1
- package/build/PriceFeedCache.compiled.json +1 -1
- package/build/PriceFeedCache.test.compiled.json +1 -1
- package/build/Proxy.compiled.json +1 -1
- package/build/Proxy.permissions.test.compiled.json +1 -1
- package/build/Proxy.test.compiled.json +1 -1
- package/build/SmlConnection.compiled.json +1 -1
- package/build/SmlConnection.permissions.test.compiled.json +1 -1
- package/build/SmlConnection.test.compiled.json +1 -1
- package/build/SmlManager.compiled.json +1 -1
- package/build/SmlManager.permissions.test.compiled.json +1 -1
- package/build/SmlManager.test.compiled.json +1 -1
- package/build/Uln.compiled.json +1 -1
- package/build/Uln.test.compiled.json +1 -1
- package/build/UlnConnection.compiled.json +1 -1
- package/build/UlnConnection.test.compiled.json +1 -1
- package/build/UlnConnectionPermissions.test.compiled.json +1 -1
- package/build/UlnManagement.test.compiled.json +1 -1
- package/build/UlnManager.compiled.json +1 -1
- package/build/UlnManager.test.compiled.json +1 -1
- package/build/UlnManagerPermissions.test.compiled.json +1 -1
- package/build/UlnManagerUtil.test.compiled.json +1 -1
- package/build/UlnPermissions.test.compiled.json +1 -1
- package/build/UlnReceiveConfig.test.compiled.json +1 -1
- package/build/UlnSend.test.compiled.json +1 -1
- package/build/UlnSendConfig.test.compiled.json +1 -1
- package/build/UlnSendWithDvnFeeLib.test.compiled.json +1 -1
- package/build/UlnSendWithExecFeeLib.test.compiled.json +1 -1
- package/build/UlnSendWorkerFactory.test.compiled.json +1 -1
- package/build/UlnUtil.test.compiled.json +1 -1
- package/build/WorkerCore.test.compiled.json +1 -1
- package/build/badFeeLib1.test.compiled.json +1 -1
- package/build/badFeeLib10.test.compiled.json +1 -1
- package/build/badFeeLib11.test.compiled.json +1 -1
- package/build/badFeeLib12.test.compiled.json +1 -1
- package/build/badFeeLib2.test.compiled.json +1 -1
- package/build/badFeeLib3.test.compiled.json +1 -1
- package/build/badFeeLib4.test.compiled.json +1 -1
- package/build/badFeeLib5.test.compiled.json +1 -1
- package/build/badFeeLib6.test.compiled.json +1 -1
- package/build/badFeeLib7.test.compiled.json +1 -1
- package/build/badFeeLib8.test.compiled.json +1 -1
- package/build/badFeeLib9.test.compiled.json +1 -1
- package/package.json +6 -6
- package/src/classes/lz/EpConfig.fc +1 -1
- package/src/classes/msgdata/LzReceiveStatus.fc +0 -1
- package/src/funC++/actions/call.fc +3 -2
- package/src/funC++/actions/deploy.fc +2 -3
- package/src/funC++/actions/destroy.fc +1 -2
- package/src/funC++/actions/dispatch.fc +2 -3
- package/src/funC++/actions/event.fc +10 -5
- package/src/funC++/actions/payment.fc +2 -3
- package/src/funC++/actions/sendJettons.fc +2 -3
- package/src/funC++/actions/utils.fc +0 -2
- package/src/funC++/baseInterface.fc +0 -2
- package/src/funC++/classlib.fc +5 -37
- package/src/funC++/constants.fc +2 -2
- package/src/funC++/contractMain.fc +2 -8
- package/src/funC++/dataStructures/AddressList.fc +2 -1
- package/src/funC++/dataStructures/DeterministicInsertionCircularQueue.fc +0 -1
- package/src/funC++/dataStructures/PipelinedOutOfOrder.fc +0 -1
- package/src/funC++/handlerCore.fc +2 -6
- package/src/funC++/stringlib.fc +0 -2
- package/src/funC++/testutils.fc +0 -1
- package/src/funC++/txnContext.fc +1 -1
- package/src/funC++/utils.fc +35 -0
- package/src/protocol/channel/callbackOpcodes.fc +10 -0
- package/src/protocol/channel/handler.fc +1054 -0
- package/src/protocol/channel/interface.fc +61 -0
- package/src/protocol/channel/main.fc +39 -0
- package/src/protocol/channel/storage.fc +55 -0
- package/src/protocol/controller/handler.fc +347 -0
- package/src/protocol/controller/interface.fc +25 -0
- package/src/protocol/controller/main.fc +29 -0
- package/src/protocol/controller/storage.fc +31 -0
- package/src/protocol/core/abstract/protocolHandler.fc +110 -0
- package/src/protocol/core/abstract/protocolMain.fc +30 -0
- package/src/protocol/core/baseStorage.fc +1 -2
- package/src/protocol/endpoint/handler.fc +426 -0
- package/src/protocol/endpoint/interface.fc +20 -0
- package/src/protocol/endpoint/main.fc +23 -0
- package/src/protocol/interfaces.fc +4 -0
- package/src/protocol/msglibs/BytesDecoder.fc +135 -0
- package/src/protocol/msglibs/BytesEncoder.fc +150 -0
- package/src/protocol/msglibs/interface.fc +16 -0
- package/src/protocol/msglibs/simpleMsglib/smlConnection/handler.fc +125 -0
- package/src/protocol/msglibs/simpleMsglib/smlConnection/interface.fc +3 -0
- package/src/protocol/msglibs/simpleMsglib/smlConnection/main.fc +19 -0
- package/src/protocol/msglibs/simpleMsglib/smlConnection/storage.fc +20 -0
- package/src/protocol/msglibs/simpleMsglib/smlManager/handler.fc +281 -0
- package/src/protocol/msglibs/simpleMsglib/smlManager/interface.fc +14 -0
- package/src/protocol/msglibs/simpleMsglib/smlManager/main.fc +24 -0
- package/src/protocol/msglibs/simpleMsglib/smlManager/storage.fc +38 -0
- package/src/protocol/msglibs/ultralightnode/callbackOpcodes.fc +1 -0
- package/src/protocol/msglibs/ultralightnode/feeLibInterface.fc +10 -0
- package/src/protocol/msglibs/ultralightnode/feeLibUtils.fc +51 -0
- package/src/protocol/msglibs/ultralightnode/msgdata/Attestation.fc +49 -0
- package/src/protocol/msglibs/ultralightnode/msgdata/DvnFeesPaidEvent.fc +26 -0
- package/src/protocol/msglibs/ultralightnode/msgdata/ExecutorFeePaidEvent.fc +23 -0
- package/src/protocol/msglibs/ultralightnode/msgdata/InitUln.fc +18 -0
- package/src/protocol/msglibs/ultralightnode/msgdata/InitUlnConnection.fc +62 -0
- package/src/protocol/msglibs/ultralightnode/msgdata/InitUlnManager.fc +18 -0
- package/src/protocol/msglibs/ultralightnode/msgdata/RentRefill.fc +18 -0
- package/src/protocol/msglibs/ultralightnode/msgdata/SetAdminWorkerAddresses.fc +18 -0
- package/src/protocol/msglibs/ultralightnode/msgdata/TreasuryFeeBps.fc +16 -0
- package/src/protocol/msglibs/ultralightnode/msgdata/UlnEvents.fc +26 -0
- package/src/protocol/msglibs/ultralightnode/msgdata/UlnReceiveConfig.fc +249 -0
- package/src/protocol/msglibs/ultralightnode/msgdata/UlnSend.fc +27 -0
- package/src/protocol/msglibs/ultralightnode/msgdata/UlnSendConfig.fc +170 -0
- package/src/protocol/msglibs/ultralightnode/msgdata/UlnVerification.fc +21 -0
- package/src/protocol/msglibs/ultralightnode/msgdata/UlnWorkerFeelibBytecode.fc +16 -0
- package/src/protocol/msglibs/ultralightnode/msgdata/UlnWorkerFeelibEvents.fc +58 -0
- package/src/protocol/msglibs/ultralightnode/msgdata/UlnWorkerFeelibInfo.fc +56 -0
- package/src/protocol/msglibs/ultralightnode/msgdata/VerificationStatus.fc +18 -0
- package/src/protocol/msglibs/ultralightnode/uln/handler.fc +803 -0
- package/src/protocol/msglibs/ultralightnode/uln/interface.fc +63 -0
- package/src/protocol/msglibs/ultralightnode/uln/main.fc +37 -0
- package/src/protocol/msglibs/ultralightnode/uln/storage.fc +43 -0
- package/src/protocol/msglibs/ultralightnode/ulnConnection/handler.fc +600 -0
- package/src/protocol/msglibs/ultralightnode/ulnConnection/interface.fc +36 -0
- package/src/protocol/msglibs/ultralightnode/ulnConnection/main.fc +32 -0
- package/src/protocol/msglibs/ultralightnode/ulnConnection/storage.fc +49 -0
- package/src/protocol/msglibs/ultralightnode/ulnConnection/utils.fc +133 -0
- package/src/protocol/msglibs/ultralightnode/ulnManager/handler.fc +495 -0
- package/src/protocol/msglibs/ultralightnode/ulnManager/interface.fc +59 -0
- package/src/protocol/msglibs/ultralightnode/ulnManager/main.fc +40 -0
- package/src/protocol/msglibs/ultralightnode/ulnManager/storage.fc +44 -0
- package/src/protocol/msglibs/ultralightnode/workerFeeLibs/common.fc +27 -0
- package/src/protocol/msglibs/ultralightnode/workerFeeLibs/dvnFeeLib/handler.fc +80 -0
- package/src/protocol/msglibs/ultralightnode/workerFeeLibs/dvnFeeLib/main.fc +4 -0
- package/src/protocol/msglibs/ultralightnode/workerFeeLibs/dvnFeeLib/storage.fc +26 -0
- package/src/protocol/msglibs/ultralightnode/workerFeeLibs/executorFeeLib/handler.fc +123 -0
- package/src/protocol/msglibs/ultralightnode/workerFeeLibs/executorFeeLib/main.fc +4 -0
- package/src/protocol/msglibs/ultralightnode/workerFeeLibs/executorFeeLib/storage.fc +29 -0
- package/src/protocol/msglibs/ultralightnode/workerFeeLibs/main.fc +3 -0
- package/src/protocol/msglibs/ultralightnode/workerFeeLibs/priceFeedFeeLib/main.fc +1 -0
- package/src/protocol/msglibs/ultralightnode/workerFeeLibs/priceFeedFeeLib/storage.fc +39 -0
- package/src/protocol/msglibs/ultralightnode/workerFeeLibs/ulnSendWorkerV1.fc +363 -0
- package/src/workers/core/abstract/workerHandler.fc +150 -0
- package/src/workers/core/interface.fc +25 -0
- package/src/workers/core/workerCoreStorage.fc +44 -0
- package/src/workers/dvn/handler.fc +332 -0
- package/src/workers/dvn/interface.fc +25 -0
- package/src/workers/dvn/main.fc +36 -0
- package/src/workers/dvn/storage.fc +27 -0
- package/src/workers/executor/handler.fc +110 -0
- package/src/workers/executor/interface.fc +19 -0
- package/src/workers/executor/main.fc +26 -0
- package/src/workers/executor/storage.fc +19 -0
- package/src/workers/msgdata/ExecuteParams.fc +29 -0
- package/src/workers/msgdata/NativeDrop.fc +16 -0
- package/src/workers/msgdata/ProxyMessage.fc +20 -0
- package/src/workers/msgdata/SetDict.fc +20 -0
- package/src/workers/msgdata/SetQuorum.fc +20 -0
- package/src/workers/msgdata/SignedRequest.fc +18 -0
- package/src/workers/priceFeedCache/handler.fc +114 -0
- package/src/workers/priceFeedCache/interface.fc +4 -0
- package/src/workers/priceFeedCache/main.fc +25 -0
- package/src/workers/priceFeedCache/storage.fc +21 -0
- package/src/workers/proxy/handler.fc +81 -0
- package/src/workers/proxy/interface.fc +11 -0
- package/src/workers/proxy/main.fc +17 -0
- package/src/workers/proxy/storage.fc +21 -0
- package/tests/testMain.fc +0 -1
- package/CHANGELOG.md +0 -7
- package/build/PriceFeedCache.permissions.test.compiled.json +0 -1
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#include "../../funC++/classlib.fc";
|
|
2
|
+
|
|
3
|
+
;; required storage name
|
|
4
|
+
const int md::SetQuorum::NAME = "setQuorum"u;
|
|
5
|
+
|
|
6
|
+
;; field names
|
|
7
|
+
const int md::SetQuorum::nonce = 0;
|
|
8
|
+
const int md::SetQuorum::opcode = 1;
|
|
9
|
+
const int md::SetQuorum::quorum = 2;
|
|
10
|
+
|
|
11
|
+
cell md::SetQuorum::New(int nonce, int opcode, int quorum) inline method_id {
|
|
12
|
+
return cl::declare(
|
|
13
|
+
md::SetQuorum::NAME,
|
|
14
|
+
unsafeTuple([
|
|
15
|
+
[cl::t::uint64, nonce], ;; md::SetQuorum::nonce
|
|
16
|
+
[cl::t::uint64, opcode], ;; md::SetQuorum::opcode
|
|
17
|
+
[cl::t::uint64, quorum] ;; md::SetQuorum::quorum
|
|
18
|
+
])
|
|
19
|
+
);
|
|
20
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#include "../../funC++/classlib.fc";
|
|
2
|
+
|
|
3
|
+
;; required storage name
|
|
4
|
+
const int md::SignedRequest::NAME = "sgndReq"u;
|
|
5
|
+
|
|
6
|
+
;; field names
|
|
7
|
+
const int md::SignedRequest::request = 0;
|
|
8
|
+
const int md::SignedRequest::signatures = 1;
|
|
9
|
+
|
|
10
|
+
cell md::SignedRequest::New(cell $request, cell signatures) method_id {
|
|
11
|
+
return cl::declare(
|
|
12
|
+
md::SignedRequest::NAME,
|
|
13
|
+
unsafeTuple([
|
|
14
|
+
[cl::t::objRef, $request], ;; md::SignedRequest::request
|
|
15
|
+
[cl::t::dict256, signatures] ;; md::SignedRequest::signaturesk
|
|
16
|
+
])
|
|
17
|
+
);
|
|
18
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
#include "../core/abstract/workerHandler.fc";
|
|
2
|
+
|
|
3
|
+
#include "../core/interface.fc";
|
|
4
|
+
|
|
5
|
+
#include "../../funC++/handlerCore.fc";
|
|
6
|
+
|
|
7
|
+
#include "../../classes/msgdata/MdAddress.fc";
|
|
8
|
+
|
|
9
|
+
#include "../msgdata/ExecuteParams.fc";
|
|
10
|
+
|
|
11
|
+
#include "../proxy/interface.fc";
|
|
12
|
+
#include "../../protocol/channel/interface.fc";
|
|
13
|
+
#include "../../protocol/msglibs/ultralightnode/uln/interface.fc";
|
|
14
|
+
|
|
15
|
+
#include "../../protocol/msglibs/ultralightnode/workerFeeLibs/priceFeedFeeLib/storage.fc";
|
|
16
|
+
|
|
17
|
+
#include "interface.fc";
|
|
18
|
+
#include "storage.fc";
|
|
19
|
+
|
|
20
|
+
;;; ==========================PERMISSION FUNCTIONS=================================
|
|
21
|
+
|
|
22
|
+
;; any of the admins can update the priceFeed cache -> priceFeedFeeLib
|
|
23
|
+
;; but only the owner can call "callContract" from the priceFeedCache
|
|
24
|
+
() _checkPermissions(int op, cell $md) impure inline {
|
|
25
|
+
if (op == Proxy::OP::HANDLE_CALLBACK) {
|
|
26
|
+
return ();
|
|
27
|
+
}
|
|
28
|
+
return assertAdmin();
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
;;; ==========================HANDLERS=====================================
|
|
32
|
+
|
|
33
|
+
tuple claimTon(cell $coinsAmount) impure inline {
|
|
34
|
+
return _claimTon(emptyActions(), $coinsAmount);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
tuple updatePrice(cell $mdAddress) impure inline {
|
|
38
|
+
(cell $storage, tuple actions) = preamble();
|
|
39
|
+
|
|
40
|
+
cell $ulnPriceFeed = $mdAddress.cl::get<objRef>(md::MdAddress::md);
|
|
41
|
+
|
|
42
|
+
cell $pfStorage = $storage
|
|
43
|
+
.cl::get<objRef>(PriceFeedCache::priceFeedFeeLibStorage)
|
|
44
|
+
.cl::set(
|
|
45
|
+
PriceFeedFeelib::priceRatio,
|
|
46
|
+
$ulnPriceFeed.cl::get<coins>(PriceFeedFeelib::priceRatio)
|
|
47
|
+
)
|
|
48
|
+
.cl::set(
|
|
49
|
+
PriceFeedFeelib::gasPriceInUnit,
|
|
50
|
+
$ulnPriceFeed.cl::get<uint64>(PriceFeedFeelib::gasPriceInUnit)
|
|
51
|
+
)
|
|
52
|
+
.cl::set(
|
|
53
|
+
PriceFeedFeelib::gasPerByte,
|
|
54
|
+
$ulnPriceFeed.cl::get<uint32>(PriceFeedFeelib::gasPerByte)
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
setContractStorage(
|
|
58
|
+
$storage.cl::set(PriceFeedCache::priceFeedFeeLibStorage, $pfStorage)
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
;; call into the proxy to update the priceFeedFeeLib
|
|
62
|
+
return _callViaProxy(
|
|
63
|
+
actions,
|
|
64
|
+
md::ExecuteParams::New(
|
|
65
|
+
$mdAddress.cl::get<address>(md::MdAddress::address), ;; target address, usually the uln
|
|
66
|
+
$pfStorage, ;; new priceFeedFeeLib storage
|
|
67
|
+
0,
|
|
68
|
+
Uln::OP::UPDATE_WORKER_FEELIB
|
|
69
|
+
)
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
tuple updateNativePrice(cell $mdAddress) impure inline {
|
|
74
|
+
(cell $storage, tuple actions) = preamble();
|
|
75
|
+
|
|
76
|
+
cell $ulnPriceFeed = $mdAddress.cl::get<objRef>(md::MdAddress::md);
|
|
77
|
+
|
|
78
|
+
cell $pfStorage = $storage
|
|
79
|
+
.cl::get<objRef>(PriceFeedCache::priceFeedFeeLibStorage)
|
|
80
|
+
.cl::set(
|
|
81
|
+
PriceFeedFeelib::nativePriceUsd,
|
|
82
|
+
$ulnPriceFeed.cl::get<coins>(PriceFeedFeelib::nativePriceUsd)
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
setContractStorage(
|
|
86
|
+
$storage.cl::set(PriceFeedCache::priceFeedFeeLibStorage, $pfStorage)
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
;; call into the proxy to update the priceFeedFeeLib
|
|
90
|
+
return _callViaProxy(
|
|
91
|
+
actions,
|
|
92
|
+
md::ExecuteParams::New(
|
|
93
|
+
$mdAddress.cl::get<address>(md::MdAddress::address), ;; target address, usually the uln
|
|
94
|
+
$pfStorage, ;; new priceFeedFeeLib storage
|
|
95
|
+
0,
|
|
96
|
+
Uln::OP::UPDATE_WORKER_FEELIB
|
|
97
|
+
)
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
tuple callViaProxy(cell $executeParams) impure inline {
|
|
102
|
+
return _callViaProxy(emptyActions(), $executeParams);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
tuple setAdmins(cell $addressList) impure inline {
|
|
106
|
+
return _setAdmins(emptyActions(), $addressList);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
tuple setProxy(cell $setAddress) impure inline {
|
|
110
|
+
return _setProxyAddress(
|
|
111
|
+
emptyActions(),
|
|
112
|
+
$setAddress.cl::get<address>(md::SetAddress::address)
|
|
113
|
+
);
|
|
114
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#include "../../protocol/core/abstract/protocolMain.fc";
|
|
2
|
+
|
|
3
|
+
#include "handler.fc";
|
|
4
|
+
#include "interface.fc";
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
tuple _executeOpcode(int op, cell $md) impure inline {
|
|
8
|
+
if (op == PriceFeedCache::OP::UPDATE_PRICE) {
|
|
9
|
+
return updatePrice($md);
|
|
10
|
+
} elseif (op == PriceFeedCache::OP::UPDATE_NATIVE_PRICE) {
|
|
11
|
+
return updateNativePrice($md);
|
|
12
|
+
} elseif (op == Worker::OP::CALL_VIA_PROXY) {
|
|
13
|
+
return callViaProxy($md);
|
|
14
|
+
} elseif (op == Worker::OP::SET_ADMINS) {
|
|
15
|
+
return setAdmins($md);
|
|
16
|
+
} elseif (op == Worker::OP::CLAIM_TON) {
|
|
17
|
+
return claimTon($md);
|
|
18
|
+
} elseif (op == Worker::OP::SET_PROXY) {
|
|
19
|
+
return setProxy($md);
|
|
20
|
+
} elseif (op == Proxy::OP::HANDLE_CALLBACK) {
|
|
21
|
+
return emptyActions();
|
|
22
|
+
}
|
|
23
|
+
throw(BaseInterface::ERROR::invalidOpcode);
|
|
24
|
+
return empty_tuple();
|
|
25
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#include "../../funC++/classlib.fc";
|
|
2
|
+
|
|
3
|
+
#include "../core/workerCoreStorage.fc";
|
|
4
|
+
|
|
5
|
+
;; required object name
|
|
6
|
+
const int PriceFeedCache::NAME = "pfCache"u;
|
|
7
|
+
|
|
8
|
+
;; field names
|
|
9
|
+
const int PriceFeedCache::workerCoreStorage = 0;
|
|
10
|
+
const int PriceFeedCache::priceFeedFeeLibStorage = 1;
|
|
11
|
+
|
|
12
|
+
;; @owner manager
|
|
13
|
+
cell PriceFeedCache::New(cell admins, int version, cell $priceFeedFeeLib) method_id {
|
|
14
|
+
return cl::declare(
|
|
15
|
+
PriceFeedCache::NAME,
|
|
16
|
+
unsafeTuple([
|
|
17
|
+
[cl::t::objRef, WorkerCoreStorage::New(admins, NULLADDRESS, version)], ;; PriceFeedCache::workerCoreStorage
|
|
18
|
+
[cl::t::objRef, $priceFeedFeeLib] ;; PriceFeedCache::priceFeedFeeLibStorage
|
|
19
|
+
])
|
|
20
|
+
);
|
|
21
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
#include "../core/abstract/workerHandler.fc";
|
|
2
|
+
#include "../core/interface.fc";
|
|
3
|
+
|
|
4
|
+
#include "../../classes/msgdata/MdAddress.fc";
|
|
5
|
+
#include "../../classes/msgdata/Bool.fc";
|
|
6
|
+
|
|
7
|
+
#include "../msgdata/ProxyMessage.fc";
|
|
8
|
+
|
|
9
|
+
#include "../../protocol/msglibs/ultralightnode/uln/interface.fc";
|
|
10
|
+
|
|
11
|
+
#include "./interface.fc";
|
|
12
|
+
#include "./storage.fc";
|
|
13
|
+
|
|
14
|
+
;;; ==========================PERMISSION FUNCTIONS=================================
|
|
15
|
+
|
|
16
|
+
() assertLatestAdmin() impure inline {
|
|
17
|
+
throw_unless(
|
|
18
|
+
Proxy::ERROR::NOT_LATEST_ADMIN,
|
|
19
|
+
getCaller() == getLatestAdmin()
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
;; this is special in proxy, only the people in the address book can call 'callContract'
|
|
24
|
+
() _checkPermissions(int op, cell $md) impure inline {
|
|
25
|
+
if (op == Proxy::OP::CALL_CONTRACT) {
|
|
26
|
+
return assertLatestAdmin();
|
|
27
|
+
} elseif (
|
|
28
|
+
(op == Worker::OP::SET_ADMINS)
|
|
29
|
+
| (op == Worker::OP::CLAIM_TON)
|
|
30
|
+
| (op == Proxy::OP::TOGGLE_CALLBACK)
|
|
31
|
+
) {
|
|
32
|
+
return assertAdmin();
|
|
33
|
+
}
|
|
34
|
+
return ();
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
;;; ==========================HANDLERS=====================================
|
|
38
|
+
|
|
39
|
+
tuple setAdmins(cell $addressList) impure inline {
|
|
40
|
+
return _setAdmins(emptyActions(), $addressList);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
tuple claimTon(cell $coinsAmount) impure inline {
|
|
44
|
+
return _claimTon(emptyActions(), $coinsAmount);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
tuple callContract(cell $executeParams) impure inline {
|
|
48
|
+
return _callContract(emptyActions(), $executeParams);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
tuple callback(cell $md) impure inline {
|
|
52
|
+
(cell $storage, tuple actions) = preamble();
|
|
53
|
+
|
|
54
|
+
if ($storage.cl::get<bool>(Proxy::callbackEnabled)) {
|
|
55
|
+
actions~pushAction<call>(
|
|
56
|
+
getLatestAdmin(),
|
|
57
|
+
Proxy::OP::HANDLE_CALLBACK,
|
|
58
|
+
md::ExecuteParams::New(
|
|
59
|
+
getCaller(),
|
|
60
|
+
$md,
|
|
61
|
+
0,
|
|
62
|
+
getOpcode()
|
|
63
|
+
)
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return actions;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
tuple toggleCallback(cell $boolMd) impure inline {
|
|
71
|
+
(cell $storage, tuple actions) = preamble();
|
|
72
|
+
|
|
73
|
+
setContractStorage(
|
|
74
|
+
$storage.cl::set(
|
|
75
|
+
Proxy::callbackEnabled,
|
|
76
|
+
$boolMd.cl::get<bool>(md::Bool::bool)
|
|
77
|
+
)
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
return actions;
|
|
81
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
;;; ==========================OPCODES=====================================
|
|
2
|
+
const int Proxy::OP::CALL_CONTRACT = "Proxy::OP::CALL_CONTRACT"c;
|
|
3
|
+
|
|
4
|
+
;; this is the opcode that we will "send out" of proxy to specify the callback
|
|
5
|
+
;; note that every other opcode that's namespaced by some contract is handled by the contract itself
|
|
6
|
+
;; but in this case, this opcode is handled by the target contract
|
|
7
|
+
const int Proxy::OP::HANDLE_CALLBACK = "Proxy::OP::HANDLE_CALLBACK"c;
|
|
8
|
+
|
|
9
|
+
const int Proxy::OP::TOGGLE_CALLBACK = "Proxy::OP::TOGGLE_CALLBACK"c;
|
|
10
|
+
|
|
11
|
+
const int Proxy::ERROR::NOT_LATEST_ADMIN = 1919;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#include "../../protocol/core/abstract/protocolMain.fc";
|
|
2
|
+
|
|
3
|
+
#include "handler.fc";
|
|
4
|
+
#include "interface.fc";
|
|
5
|
+
|
|
6
|
+
tuple _executeOpcode(int op, cell $md) impure inline {
|
|
7
|
+
if (op == Worker::OP::SET_ADMINS) {
|
|
8
|
+
return setAdmins($md);
|
|
9
|
+
} elseif (op == Worker::OP::CLAIM_TON) {
|
|
10
|
+
return claimTon($md);
|
|
11
|
+
} elseif (op == Proxy::OP::CALL_CONTRACT) {
|
|
12
|
+
return callContract($md);
|
|
13
|
+
} elseif (op == Proxy::OP::TOGGLE_CALLBACK) {
|
|
14
|
+
return toggleCallback($md);
|
|
15
|
+
}
|
|
16
|
+
return callback($md);
|
|
17
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#include "../../funC++/classlib.fc";
|
|
2
|
+
|
|
3
|
+
#include "../core/workerCoreStorage.fc";
|
|
4
|
+
|
|
5
|
+
;; required object name
|
|
6
|
+
const int Proxy::NAME = "pfProxy"u;
|
|
7
|
+
|
|
8
|
+
;; field names
|
|
9
|
+
const int Proxy::workerCoreStorage = 0; ;; = WORKER_CORE_STORAGE_IDX
|
|
10
|
+
const int Proxy::callbackEnabled = 1;
|
|
11
|
+
|
|
12
|
+
;; @owner manager
|
|
13
|
+
cell Proxy::New(cell admins, int version) method_id {
|
|
14
|
+
return cl::declare(
|
|
15
|
+
Proxy::NAME,
|
|
16
|
+
unsafeTuple([
|
|
17
|
+
[cl::t::objRef, WorkerCoreStorage::New(admins, NULLADDRESS, version)], ;; Proxy::workerCoreStorage
|
|
18
|
+
[cl::t::bool, false] ;; Proxy::callbackEnabled
|
|
19
|
+
])
|
|
20
|
+
);
|
|
21
|
+
}
|
package/tests/testMain.fc
CHANGED
package/CHANGELOG.md
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"hash":"949919ea0730c2393a9ace19fa4794c735b74f843a85368d0007c58228e1d293","hashBase64":"lJkZ6gcwwjk6ms4Z+keUxzW3T4Q6hTaNAAfFgijh0pM=","hex":"b5ee9c72420201ba000100004b6800000114ff00f4a413f4bcf2c80b0001020162000200e00202c7000300bb0201200004005a020120000500230201200006001e020120000700180201200008000d0201200009000c01f1d106380492f82706d9e46834c4c2e6cabecae4e4dee4bedae6ce409c9ea840e6cae85c5c5c4107c317c20b789fc20b78cfc2080b8b7c2fc30f83b9037c429105f470badb838c18390c006646581e580e58465ffe5b0e4b87d80470e00b7c090378810b788fc310098784af6a2016d090176aa607f80f83df14000a01f621d074d701700271b098317f028020d72159de7f20706d04fa40fa4031fa003171d721fa003101fa44315307c7008e326c33058020d7018040d701fa0020d74981010bbe9c3827800b8307d724d70bff08de20c702953625d74c06df081035443012df02fa003073a9b400107b50a9105810471046503305046f0c000b0004f86100736807400740875d2c8b5d2d40cef5484ef44ac64d7c0dc238808300024d7c0dff81fdc24c8b0802754d035d214d075d23c0184ac007a0517c138a020120000e0013020120000f001000f54c000928015928014e2f8329a307f5470005470005300e1d020d749810250be9a307f5470005470005300e120d70b078100d1bd2181008878d724d70b078100debdb19a307f5470005470005300e0d3070130d33f0101d33f0101d33f0101d3070130d33f0101d33f0101d33f0101d33f0101d33f0101d33f013180201200011001200910875d24875d268205fa06f238c6342343616e6e6f7420636f6e636174656e6174653a20737472696e6720746f6f206c6f6e678083f850c3e406102ac3cbc37b21633c58073c5b2742000053c02a00201200014001702012000150016007722c20870402640a2c4b63c028068d63788700026600c3232c1f2743c02b7a4c870802384c85eaa42298c3232c1f274007c02c05eaa41007a0c7c02e000053c0320008d48b0821c000998030c8cb07c9d0f00ade9321c2008e2c21a93803c10a9e21a93803a630c8cb07c9d001f00b8e1021a93803a641a6f6c8cb07c9d001f00be201ab0301e831f00b80201200019001a001bd80c591d104780580f806ff0a18403f7f906001cc1845abab4b73a1c4701060024c9845b3ab4b73a189b470106002cc9845b3ab4b73a19994701060034c9845b3ab4b73a1b1a4701060044d1845bbab4b73a191a9b470106003cc1845ab1b7b4b739c701060044d1845bb0b2323932b9b9c70106004cd1845bb234b1ba191a9b470106004f181106004f1814001b001c001d0012308b66f626a52656680014308b763656c6c52656680026c000968b4626f6f6c8e08b7756e6b6e6f776e8020148001f0022020158002000210183521f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba9130e0018307f45b30209993d0307f925b70f2ffda118e823088df801b5006f420f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba93307f6de08307f4866fa59101e05b7f6d80071b243f20105e12d452da449e50b8cf7dd27861f146122afe1b546bb8b70fc8216f0c614139f8f7526b6fedbc003060fe8f8df4b2203c0b6fedb020120002400310201200025002c020120002600270001fc02014800280029001943082102051c71fba92f068df8010d4216f11216f118002a02fc8ef7eda2edfb2120f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba973082104e554c4c94d0d70b4fe22120f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba973082104e554c4c94d0d70b4fe2bd20945f038010e30ed8026f1001006a002b000e6f10ba01c0ffb0020120002d0030020120002e002f009fd76d176fd80e8384a90e3806000471e10eba590610080e00091549c03e1805858caaf82386d98f05583c709d200e9ff80e0002991de58caaf81b86d98f000f210eba561004a80eba66800ef742f81bfc005bd76a23800e800d38953282e5302396b926b8580a9115308396b926b858090e0004998eba44baceba46800eba4714003fba42de2042de217444de2244de23756044de2444de25756004de2602de277561020120003200430201580033003902012000340037010148003501bced447001d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e27001d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e2f8416f1101d0003600a88e4eeda2edfb8e19eda2edfb20d749c0009b20c7029370db31e0d74cd0ded3ff01d89320c2008e2422ba945b7fdb31e08e19eda2edfb20d749c0009b20c7029370db31e0d74cd0ded3ff01d8e85f0370d8f2e7df01e34f8416f112170830602d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e20270830602d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e21280038003c20c2009a236f1021a014706f8503de82287061796d656e7455206f046f8c020120003a003f020120003b003e03b50060ae15dbdc9ad95c8e8e995d995b9d0e8e905113525394d7d4d15508b6cf3b513b511c00740069c4a9941729811cb5c935c2c05488a9841cb5c935c2c048700024cc75d225d675d2340075d2389c160136cf049c0076cf3b5520003c01b701b704f48882186576656e747850046f027950036f0279586f026f036dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e282186576656e74016f0201b501a901ac003d00046f8c02753b513b511c00740069c4a9941729811cb5c935c2c05488a9841cb5c935c2c048700024cc75d225d675d2340075d2389c5600f6cf1c0076cf3b552001b701b701b942073802002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2208210f851d3f5ba218210beea5b26bab1218210a91df8babab1018210217607d4bab1f2e7dd8004001e6ed447001d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e271830702d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e20170821009f047d982015018ed43d8db3c004101dc2070830702d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e22173802002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e202710042007a01d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e2128240616374696f6e43616c6c55206f046f8c020120004400550201f400450046003d2341b50726963654665656443616368653a3a7065726d697373696f6e7382002f71bc024fc4043a342e636865636b5065726d697373696f6e733a3a75706461746550726963653a3a737563636573733a3a61646d696e3181bc09be324fc4043e342e636865636b5065726d697373696f6e733a3a75706461746550726963653a3a737563636573733a3a61646d696e3281bc09be324fc4044225bc0a0004700480052636865636b5065726d697373696f6e733a3a75706461746550726963653a3a6e6f745570646174657201fc6f8c93f101118d0d18da1958dad4195c9b5a5cdcda5bdb9cce8e9d5c19185d1953985d1a5d99541c9a58d94e8e9cdd58d8d95cdcce8e98591b5a5b8c606f026f8c93f101128d0d18da1958dad4195c9b5a5cdcda5bdb9cce8e9d5c19185d1953985d1a5d99541c9a58d94e8e9cdd58d8d95cdcce8e98591b5a5b8ca06f02004902fe6f8c93f101138d0bd8da1958dad4195c9b5a5cdcda5bdb9cce8e9d5c19185d1953985d1a5d99541c9a58d94e8e9b9bdd155c19185d195ca06f026f8c93f101148d0bd8da1958dad4195c9b5a5cdcda5bdb9cce8e98d85b1b159a58541c9bde1e4e8e9cdd58d8d95cdcce8e98591b5a5b8c606f026f8c93f10115896f026f8c004a004b005e636865636b5065726d697373696f6e733a3a63616c6c56696150726f78793a3a737563636573733a3a61646d696e3204fc8a8d0a98da1958dad4195c9b5a5cdcda5bdb9cce8e98d85b1b159a58541c9bde1e4e8e9b9bdd155c19185d195ca06f026f8c93f101178d0ad8da1958dad4195c9b5a5cdcda5bdb9cce8e98db185a5b551bdb8e8e9cdd58d8d95cdcce8e98591b5a5b8c606f026f8c93f10118896f026f8c93f10119896f026f8c93f1011a004c004d004e004f0006f101160056636865636b5065726d697373696f6e733a3a636c61696d546f6e3a3a737563636573733a3a61646d696e320058636865636b5065726d697373696f6e733a3a636c61696d546f6e3a3a7265766572743a3a6e6f7441646d696e04fc896f026f8c93f1011b8d0b18da1958dad4195c9b5a5cdcda5bdb9cce8e9cd95d10591b5a5b9cce8e9cdd58d8d95cdcce8e98591b5a5b8ca06f026f8c93f1011c8d0b58da1958dad4195c9b5a5cdcda5bdb9cce8e9cd95d10591b5a5b9cce8e9c995d995c9d0e8e9b9bdd10591b5a5ba06f026f8c93f1011d896f026f8c8a00500051005200530058636865636b5065726d697373696f6e733a3a73657441646d696e733a3a737563636573733a3a61646d696e310056636865636b5065726d697373696f6e733a3a73657450726f78793a3a737563636573733a3a61646d696e310006f1011e0178896f026f8c93f1011f8d0b18da1958dad4195c9b5a5cdcda5bdb9cce8e9cd95d141c9bde1e4e8e9c995d995c9d0e8e9b9bdd10591b5a5ba06f026f8c00540056636865636b5065726d697373696f6e733a3a73657450726f78793a3a737563636573733a3a61646d696e32020120005600590201580057005800713c1da2c8e8823c02fe10bc02e2c8e8823c02c87c02ff850c3c1da2c8e8823c02fe10bc02e2c8e8823c02c07c02c83f850c3e406102ac3cbc20000f00644c24bc1eb8a00037f49bfc584703846824e8cae6e87474e6d0deead8c884caa8e4eacb04020120005b008d020120005c007b020120005d0071020120005e005f004fb442de2042de217444de2244de23756044de2444de25756044de2644de27756004de2802de29756102012000600064010dd10b78910b7894006102fc8ef7eda2edfb2120f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba973082104e554c4c94d0d70b4fe22120f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba973082104e554c4c94d0d70b4fe2bd20945f038010e30ed8226f1522006a006202fe6f158ef7eda2edfb2120f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba973082104e554c4c94d0d70b4fe22120f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba973082104e554c4c94d0d70b4fe2bd20945f038010e30ed8236f10006a00630062236f10ba246f11f900246f11f900bab002c0ff12b0236f13236f13bab0236f14236f14bab001c0ffb0026f16016f16bab002012000650068010d5216f13216f138006602fc8ef7eda2edfb2120f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba973082104e554c4c94d0d70b4fe22120f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba973082104e554c4c94d0d70b4fe2bd20945f038010e30ed8226f1022006a006700326f10ba236f11236f11bab0036f12026f1212ba12b001c0ffb0010d5216f13216f138006902fc8ef7eda2edfb2120f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba973082104e554c4c94d0d70b4fe22120f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba973082104e554c4c94d0d70b4fe2bd20945f038010e30ed8226f1022006a007001962220f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba973082104e554c4c94d0d70b4fe282104e554c4cba935f037fe0709320c1108ae85f047f006b0286533001d001a712a65074d724d70b0320c0098e8a20c109945b801001e30de30d208e1d135f038bf4d616c666f726d6564206669656c648fe143020fe2030db31e001a4006c006e01f66c1220c10991ae923070e254731002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e254732102d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2bd209131e30d006d00f88b56c68733a20854753202d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2f0105d8b57268733a2080402d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e212f01001c43031532001d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e2f900532101d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e2f900bd20e300006f00c4533101d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e2f900fe2030532101d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e2f900fe2030003e6f10ba236f11236f11bab0236f12236f12bab001c0ffb0026f14016f14bab00201200072007502012000730074005bf4714f6d176fd90c108719dcc39dd48adc70c10c1087b2e74c45d49adf823cd10e00049aded98f0782471716c384000567c272020120007600790201580077007800af1c3b507b50fb513b517b51e496dffb59fb597b593b58fb5865167c24cc3b507b7c407cbfe38b1c234287065726d697373696f6e7320636865636b2073686f756c64206e6f742068617665207468726f776e824dfe2c238a000ad1c3b507b50fb513b517b51e456fb59fb597b593b58fb585c5ffb44653c24cc1ffb507b7c407cbfe38a1c234247065726d697373696f6e7320636865636b2073686f756c642068617665207468726f776e824dfe2c238a001e9d4083dcc083dd3781643780b84b1137c429085cc71910b7c452a91037c0906798c183d04204de4f1800e437c61037c452a90837c0896f2998b7c080e5ff9137c4528811b7c280d2741818b7c6ca90b7c461004b80b7c68164ac667418e4b8787ac100e05af6a1ec76aa383780c083dcc083dd37814007a00b4c86f017096226f885210b98e32216f88a552206f8120cf318307a08409bc9e3001c86f8c206f88a552106f8112de53316f8101cbff226f88a510236f8501a4e830316f8d95216f88c20097016f8d02c958cce831c9f06c30ed44020158007c0082020158007d0080020120007e007f02dd208e1b5bd8dad4dd1bdc995e1400dbc09e561bc09bc09b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a001a901ac011520196041f2e019a041f32000810115480668107cc80658107cb8008102e68210706174687550056f027850046f027550036f0278586f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201a901ac020120008300890201200084008501275f0b5807c82284d657373616765c8cbffcb3fc98008702012000860088015f3c2d601f0820bc13595cdcd859d94819dc99585d195c881d1a185b881b585e135cd9d09e5d195cf232fff2cff2cff260008702ea7082205061636b65747950046f027950036f0276586f0278706f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201a901ac012b3c2d601f208a13595cdcd859d97232fff2cff2600aa0008b020148008a008c01293c2da01f208a13595cdcd859d97232fff2cff25620008b02e882205061636b65747950046f027950036f0276586f0278706f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201a901ac0009200abc2f20020120008e00a6020120008f0092020158009000910009f6465ffe4c000bd3d6465ffe4c0201200093009c02012000940095042bf40324032ed9e6d9e785cc080646465ffe4ed9e382c400970098010a009a0201480096009b042b2019201976cf36cf3c2ea040323232fff276cf1c162000970098010a009a010c71728107cc730099010c74758107cc76009902f082384f7074696f6e7356317850056f027850046f027850036f0278586f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201a901ac031cdb3c718107c1db3c728107c2db3c01b701b701b700071c3c34e0020120009d00a50283d785ded9e1037c45290600049b7c0e4c717106000cd18103788e480b7886664f02e37c090d2a91837c0c9916100cd015280e4ac662990b7c0f41998e480e664f100c009e00a301c8207001d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e22173830702d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e22173009f01d8830702d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e22272802002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2237100a001d8830702d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e20470802002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2257200a101fa804002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e271c8cb07cb3fcb1f14cbff13cb1f12cbffcbff6f01017101d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e2d093206eb38ae83000a200ec20d74ac201f2d4c1216f88a553206f8120cf31ab0223d749ab025ca0c07f25d749a93802c300f2d4c25321a06c12c27f8e22807f58a120aa025250d71913cf165415036f8501aa0213d72101a4c851336f8c41349131e22370d72112cf1644046f8521c702936c216d9b029501c86f8c01ded74cd0e202a4206f8820c0008e825b888e3dc871935302bb8e305320a152406f812173a908c0008e10206f11016f1003c9c8cc13cbff12cb3f9d206f11016f105003cbff12cb3fe201a4e8135f03c9e2717880518020806401b500a403f88240536d6c4a6f6241737367788210deadbeef6f027750036f02126f026dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e21089107870db3c01a901ac0130001fd786ac100680691b7813780a198786c402012000a700ae02014800a800ab02015800a900aa009d0c1bc0321be308a38bc0a9489be229548c1be073cc60c1e821026f2540b21be300b7889be229548c1be054c8680072ffc8dbe22944091be1791b085be365485be2308025c05be340b256333a0c726000211bc01c00e614c4a81be300a900b91b086002014800ac00ad005132204134b232fff264c8f080238554c8e81632ffc8f000659484331484333780e9540cfa04d7c0f26000071c3c38a002012000af00b402012000b000b1000dd41006815f865c02012000b200b3001d57a800b800c800d8201a7fded43d880031482081c41cb82180861c468008103e880118201a7fded43d8802012000b500b6000df40855a80f871402012000b700ba02012000b800b9000d20422dc07c38a0000d2042ed007c38a0000d48109b601f0e280201c700bc00c102012000bd00be003bb304061a810050e1020f74e0e4e1e1f8e0e4e1e1fce04f040265c7da87b10201f400bf00c000330c2041ee7e10405c5be17e18608432027e843c3dbc6026b68ca000330c2041eebe10405c5be17e18608432027e843c3dbc6026b68ca002012000c200d102012000c300ca02012000c400c702012000c500c600330c2041edbe10405c5be17e18608432027e843c3dbc6026f68ca000330c2041ee7e10405c5be17e18608421dc003e7c3dbc6026b68ca002012000c800c900330c2041eebe10405c5be17e18608421dc003e7c3dbc6026b68ca000330c2041edbe10405c5be17e18608421dc003e7c3dbc6026f68ca002012000cb00ce02012000cc00cd00330c2041ee7e10405c5be17e186084385013fabc3d7c6026b68ca000330c2041eebe10405c5be17e186084385013fabc3d7c6026b68ca002012000cf00d000330c2041edbe10405c5be17e186084385013fabc3d7c6026f68ca001310c2041ee7e10405c5be17e186084085d81f5223c6026b68ca001b502012000d200d902012000d300d602012000d400d501310c2041eebe10405c5be17e186084085d81f5223c6026b68ca001b501310c2041edbe10405c5be17e186084085d81f5223c6026f68ca001b502012000d700d801310c2041ee7e10405c5be17e18608414f24b13a23c6026b68ca001b501310c2041eebe10405c5be17e18608414f24b13a23c6026b68ca001b502012000da00dd02012000db00dc01310c2041edbe10405c5be17e18608414f24b13a23c6026f68ca001b501310c2041ee7e10405c5be17e18608423aa7293e23c6026b68ca001b502012000de00df01310c2041eebe10405c5be17e18608423aa7293e23c6026b68ca001b501310c2041edbe10405c5be17e18608423aa7293e23c6026f68ca001b502012000e1014b02012000e2011f02012000e3010202012000e400f902012000e500ef02012000e600e70114ab5f705433334403db3c018302012000e800e90133a6d5020f83020f85020f89020f8b020f8f020f91f0474c79b679018302012000ea00ee01e3a0e89201fea422a8081601fea4108a01fea422a8080e01fea410234096a8088ea8094e06814d8681425ad82709fd4e16d826040fe2f2c7cb510cab000238c4cce4832021c35cc05f3c591c233c05c14492854c941040d9675cd04b3c5904133c048b5d2562848b5d28408f5ccb3c5b278c3a00eb02fe34366f00708ef25303ba534bbab08e565303ba8e20c8533970d730cf16546a91cf0123d749539aa0a124d74a2559d732cf16126f8c8e2e530aba8e20c8533670d730cf16546761cf0123d7495367a0a124d74a2559d732cf16126f8c97c823cf16126f8ce2e2e30d22d74ac2009502d74cd002de01a4530abee6195f09530100ec00ed0074532870d7305398a070538ba12ba153165530d73424d7495378a0a125d74a2659d732c85003cf16546cb1cf0101cf16546871cf0101cf16126f8c00266f81c99322c2009802a55c6f8113ccc9e86c2102e9a0b60841c185d1a1d54015bc09e14011bc09d5400dbc09e161bc09bc11b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a01a901ac02012000f000f502012000f100f20057a4bc03a0034e254ca0b94c08e5ae49ae1602a4454c20e5ae49ae16024380012663ae912eb3ae91a003ae91c50201c700f300f40087ad887e4020bc25a8a5b4893ca1719efba4f0c3e28c2455fc36a8d7716e1f9042de18c28273f1eea60c5b60c1fd039be865c060c1fd039be878a535c2ffdfe4cc1c1c38a002f1a9208c155b1b911d9b919b1d94015bc09d94011bc09d1400dbc09dd61bc09bc11b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a001a901ac02012000f600f70075a62ee1008005a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c50207fd410103a6c900f8016c8240556c6e57726b496e666f7850086f027950076f027950066f027850056f027550046f027750036f0276706f027050036f02126f08019d02012000fa00fb02edad22412027b83a34b7b739a2bc3a3aa80237813aa801b7813cac37813781b6e4378110b7c401e465a7b890394080af381049a984dcc5742f83361110b7889137c452906100f1804080af11e798d089e7a080e78b90e000c9b610e4c70c00e0014b80b7896480e664f010b789e48137896480e66664f14001a901ac02012000fc010102012000fd010002015800fe00ff0081bab830702d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e27074c8cb02ca07cbffc9d08006bbd320f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba973082104e554c4c94d0d70b4fe28006ba553002005a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c502eca82f82404d73676c6962496e666f7850046f027950036f0279586f026f036dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201a901ac020120010301100201200104010b020148010501090117a6e10440ead8dc9acee4f20d010604fc82386261736553746f726578586f0270706f0270706f0279886f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2166f027950056f027901b501a901ac0107043450046f027850036f0275586f0279886f0279886f0279886f027901b501b501b5010803c2886f0278706f026f0a6dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201b501a901ac0103a445010a017c82206c7a53656e6476706f0278706f0278706f027950066f0277500a6f027750096f027950086f027950076f027950056f02487010561059443049906f09019d020120010c010f020120010d010e02dda6450420a09e9e9eece2de04f39108139e8192de04de04db90de0442df100791969ee240e50202bce04126a6137315d0be0cd84442de2244df114a418403c6010202bc479e6342279e82039e2e43800326d843931c300380052e02de2592039993c042de279204de259203999993c501a901ac0041a7cae1e0102090be1104101e84816c135402e1f06d080f0407f602e1f0715403410224a9f77f707f217f887f8824820193afed43d801b501b50201200111011a020120011201190201200113011402d7a4b50480e6cae882c8c8e4cae6e6f0b0de04de02db90de0442df100791969ee240e50202bce04126a6137315d0be0cd84442de2244df114a418403c6010202bc479e6342279e82039e2e43800326d843931c300380052e02de2592039993c042de279204de259203999993c501a901ac0201200115011802039b880116011702e95824077726b436f7253746f727950046f027850036f0278586f026f036dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2801a901ac017f58240556c6e53656e6443666775500b6f0275500a6f027050096f027850086f027050076f027950066f027050056f027950046f027050036f0276586f026f0a8019d0065f005a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c502f6aad182186576656e747850046f027950036f0279586f026f036dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e282186576656e74016f0201a901ac0201c7011b011c02e7bb1823052637645704366677850046f027850036f0276586f026f036dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2801a901ac0103bd98011d01f6227101d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e2d02370804002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e25133a15123a1c8532370d730cf165214a113cf4184095003011e023ca170d732cf16c9d0d76171c858cf1622cf40c91024db3c017003a012db3c01b701b70201200120013a02012001210131020120012201230071aead917c8041784b514b69127942e33df749e187c51848abf86d51aee2dc3f2085bc318504e7e3dd4c360936894183fa0bca814183fa0bf1400201200124012502daab1982204d64416464727950036f0278586f026f026dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201a901ac0201200126012a011fa4230480c6dedcdccac6e8d2dedcf209012704fe82386261736553746f726578586f0270706f0270706f0279886f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2146f027950036f02787001b501a901ac012804626f0278706f027850046f027982015d9fed43d86f02797f707f217f887f8824820193afed43d86f0279886f0276716f027901b501b501b5012903c2886f02107810676f0a6dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201b501a901ac020158012b012f0111b918208756c6e79048012c04fe82386261736553746f726578586f0270706f0270706f0279886f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2146f027550036f02755801b501a901ac012d04486f02797f707f217f887f8824820193afed43d86f027982015d9fed43d86f0279886f027901b501b501b5012e03d2886f0274706f0274706f0274706f026f0a6dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201b501a901ac0103b9780130018482306c6962536e64436277500c6f0277500b6f0279500a6f027950096f027950086f027450076f027350066f027450056f027350046f027950036f0273586f026f0b019d020120013201350201c90133013402f5b310480caf0cac6a0c2e4c2dae6f0a00ade04f2a008de04eca006de04eab0de04de08db90de0442df100791969ee240e50202bce04126a6137315d0be0cd84442de2244df114a418403c6010202bc479e6342279e82039e2e43800326d843931c300380052e02de2592039993c042de279204de259203999993c5001a901ac002bb4a05a10202bdae43a7fe02b17403a67e0262b177610020120013601390201480137013802eba1ee088141858dad95d1e54011bc09e5400dbc09d961bc09e1c1bc09bc11b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a01a901ac02d7a066086135913d89a9e5400dbc09e561bc09bc09b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a01a901ac0226a99f70207f217f887f887f25820132e3ed43d801b501b5020120013b0144020120013c0141020120013d0140020120013e013f016ba72c43f20105e12d452da449e50b8cf7dd27861f146122afe1b546bb8b70fc8216f0c614139f8f751d06b710e12e03060fe81edf43c501b502dfa76f0470e6cae8a6dad886ccceeea006de04eeb0de04de04db90de0442df100791969ee240e50202bce04126a6137315d0be0cd84442de2244df114a418403c6010202bc479e6342279e82039e2e43800326d843931c300380052e02de2592039993c042de279204de259203999993c501a901ac02f0aa4a8228556c6e53656e647950056f027950046f027950036f0278586f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201a901ac0201200142014302daabce82204174746573747850036f0276586f026f026dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201a901ac006ca8b5830702d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e20201200145014602d5acd6411831b7b4b739a0b6ba3bac37813780b6e4378110b7c401e465a7b890394080af381049a984dcc5742f83361110b7889137c452906100f1804080af11e798d089e7a080e78b90e000c9b610e4c70c00e0014b80b7896480e664f010b789e48137896480e66664f14001a901ac0201200147014a0201200148014902eda4dce10440a0c2c6d6cae8f2a008de04f2a006de04ecb0de04f0e0de04de08db90de0442df100791969ee240e50202bce04126a6137315d0be0cd84442de2244df114a418403c6010202bc479e6342279e82039e2e43800326d843931c300380052e02de2592039993c042de279204de259203999993c501a901ac0103a5eb01b702e0aa0a823853656e6445704366677850036f0278586f026f026dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201a901ac020120014c018a020120014d0174020120014e0168020120014f015c02012001500157020158015101540201620152015302d5f6090155b1b989e5d1958dbd91e561bc09bc05b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a01a901ac011daf9fdc151c001c150cccd100f6cf2001830103a01a015501268238556c6e5665726966797650046f02027902015603de82204174746573747850036f0276586f026f026dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e26f026f0201a901ac019d0201200158015b0201cb0159015a02f1fc11c27b83a34b7b739ab18bc2802b7813c280237813c2801b7813c2c3781378236e4378110b7c401e465a7b890394080af381049a984dcc5742f83361110b7889137c452906100f1804080af11e798d089e7a080e78b90e000c9b610e4c70c00e0014b80b7896480e664f010b789e48137896480e66664f1401a901ac0067b6f005a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c5006ba587060e05a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c5020120015d015e0150abdd8240556c6e457865637574727650066f027450056f027750046f027750036f0276586f026f05019d0104a827015f02e05cdb3c24787802d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e22571802002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e226760160016401b67f227501d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e2237701d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e22474016102e67102d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2c300e30004767102d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2c3009132e30d120162016300d23122747102d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2c300c00012b0227501d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e25800d03321767102d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2c300c000b0017701d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e25901e27102d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2c3008e373124787802d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e201de2670016501e27102d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2c3008e37302471802002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2de5065016601ea21727102d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2c3008e363073804002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2e30d103540440167006c3173804002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e20201200169016a0179add7c1202ab6372932b1bb21b333b8280537813aa804b78138280437813b2803b78138280337813ca802b78138280237813ca801b78139ac37813784c0019d020158016b01720123a473020f8240eb9197ff93020f81e16be169016c03ec82404d73676c6962496e666f7850046f027950036f0279586f026f036dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2f0b501a901ac016d02ea217201d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e27158db3c017101d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e276c8cb04ccccc9f9008107c42075c8cbffc98107c3f0b5f0b401b7016e03ec82404d73676c6962496e666f7850046f027950036f0279586f026f036dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2f0b501a901ac016f02ea217201d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e27158db3c017101d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e276c8cb04ccccc9f9008107c72075c8cbffc98107c6f0b5f0b401b7017003ec82404d73676c6962496e666f7850046f027950036f0279586f026f036dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2f0b501a901ac017102d6217201d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e27158db3c017101d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e276c8cb04ccccc9f900f823a63cdb3c01b7018301e5a56a418201e5a90242e203a0034e254ca0b94c08e5ae49ae1602a4454c20e5ae49ae16024380012663ae912eb3ae91a003ae91c5a044e1008005a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c4a6417324be07c61d017302605122a171c85d70d730cf16cb00840958a1a51270d732cf16c9d0d76171c858cf1622cf40c91024db3c017003a012db3c01b701b7020120017501800201200176017f0201200177017a020120017801790103a52b01830073a7e443f20105e12d452da449e50b8cf7dd27861f146122afe1b546bb8b70fc8216f0c614139f8f753062db060fe81cdf432e03060fe81cdf43c5020120017b017c0093a453e0a8e3060e05a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c44180013861f0510017060fae49ae17ffbd020158017d017e02edbbf8240536d6c4a6f6241737367788210deadbeef6f027750036f02126f026dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2801a901ac02f1bfd823050464665656c69627750056f027650046f027550036f0277586f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2801a901ac0041aeaa01e86410c080af386b98678b09e59fe5ff8965ff80c081cf386b98e78b64c002012001810185020148018201840121a4a2fee0a826002046e0a866668807b6790183016682304570436f6e6669677050096f027850086f027850076f027850066f027850056f027850046f027850036f0276586f026f08019d0057a5ce03a0034e254ca0b94c08e5ae49ae1602a4454c20e5ae49ae16024380012663ae912eb3ae91a003ae91c502012001860187006ca80d802002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e20104aa12018801dc2173830702d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e22272802002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e22371018900f8830702d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e20470802002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e203c8cb3f13cb1f13cbffcb1fcbff71f90403020120018b019f020120018c0196020120018d018f0121ac5ac114383321b0b1b43281bcb8280240018e03fa824077726b436f7253746f727950046f027850036f0278586f026f036dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2126f0279586f026f0201a901ac019d020120019001950201200191019200dda47642e1008005a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c54202e203a0034e254ca0b94c08e5ae49ae1602a4454c20e5ae49ae16024380012663ae912eb3ae91a003ae91c5a002e3ae49ae1601800302012001930194006da009c40b40069c4a9941729811cb5c935c2c05488a9819eb5c935c2c248700025cc48b5c90075c0e6d675d2341444b5c90075c0f8b0c0200efa0f3b511c00740069c4a9941729811cb5c935c2c05488a9841cb5c935c2c048700024cc75d225d675d2340075d2389c00740069c4a9941729811cb5c935c2c05488a9841cb5c935c2c048700024cc75d225d675d2340075d238b423867b68bb7ec835d2700026c831c0a4dc36cc7835d33437b4ffc0760c6002ea8b27021f026309320c2ff985220f0293001a401e830310201200197019e020148019801990011a731e0ee02df02de23020148019a019b004fbfdd020d74b0181029eba01c000b0018306d701308250417474657374815ed897bfffbab0f2e42280103b918019c0148823053657445704366677050066f027850056f027850046f027850036f0276586f026f05019d02b06dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201a901ac006dad294183016800d38953282e5302396b926b8580a91153033d6b926b858490e0004b98916b9200eb81cdaceba46828896b9200eb81f14002012001a001ae02012001a101a203efae4fc11c3130b9b2a9ba37b932bc2c378138383781383837813cc43781378236e4378110b7c401e465a7b890394080af381049a984dcc5742f83361110b7889137c452906100f1804080af11e798d089e7a080e78b90e000c9b610e4c70c00e0014b80b7896480e664f010b789e48137896480e66664f14001b501a901ac02012001a301a702015801a401a601b5a26fb511c00740069c4a9941729811cb5c935c2c05488a9841cb5c935c2c048700024cc75d225d675d2340075d2389c00740069c4a9941729811cb5c935c2c05488a9841cb5c935c2c048700024cc75d225d675d2340075d238b4201a500a28e4eeda2edfb8e19eda2edfb20d749c0009b20c7029370db31e0d74cd0ded3ff01d89320c2008e2422ba945b7fdb31e08e19eda2edfb20d749c0009b20c7029370db31e0d74cd0ded3ff01d8e85f0370d80007a11fb51202014801a801ad02f9a0d60841413d3d3dd9c5bc09e721c73d01491a84573d0610254012844f3d03244dbc09bc09b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a01a901ac02fc53806f81206f102020c10991ae923070e25350a08409bc8e133507a4702a6f885220be950ac86f8c0ade5085de20c0008e1d24a427bc8e16343505a470742a6f885230be950ac86f8c0ade476604dede21c1098e2021c0099d026f1153a76f81cc541a076f859d026f1153a76f81cc541a076f85e2e30d5098cb0328c20001aa01ab0022026f11b60b53a86f8123cf01541a086f8500708e157327c00191709127e258cb015240cb09cb015038a08e1a38840925c00191709125e25009cb0118cb095210cb0101a44707e202a41067033e21cf32c0008f0788885003cc12cc8e8d21cf32c0018e848858cc01de01e20101b501b501b50057a10c0740069c4a9941729811cb5c935c2c05488a9841cb5c935c2c048700024cc75d225d675d2340075d238a02012001af01b101efaff6c77976d176fd9039c183816800d38953282e5302396b926b8580a91153033d6b926b858490e0004b98916b9200eb81cdaceba46828896b9200eb81f110bac183816800d38953282e5302396b926b8580a91153033d6b926b858490e0004b98916b9200eb81cdaceba46828896b9200eb81f1013bec4001b000c8804002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e222c00021c300b0955f038104038e2022c30001f823bbb0965b810402db31e020c30002bab095810401db31e0810455e202012001b201b602012001b301b4006ba6b7008005a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c50105a6351101b5000001ceabf9217201d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e27158db3c017101d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e276c8cb04ccccc9f90001b702f402d001a712a6505ca60472d724d70b01532174d724d70b035da6067ad724d70b095244a61072d724d70b012120c10991ae923070e223c0009125955353d748d0e221c300927433dec821d74927b60822d74a5250b6082359d730cf1624c0098e16323334505503cc7023d74a5006a1a54350d73213cf16e30e2201b801b9006404c0098e1431345055cc7023d74a5006a1a54350d73213cf168e163206b60b541026cf015035a022d74a1023d73113cf16e20048c2008e1bc9c822d749546351d730cf16cc7022d74a5004a1a513d732cf16c9936c21c9e26f775ef6"}
|