@keep-network/tbtc-v2 0.1.1-dev.40 → 0.1.1-dev.41

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 (36) hide show
  1. package/artifacts/TBTC.json +3 -3
  2. package/artifacts/TBTCToken.json +3 -3
  3. package/artifacts/VendingMachine.json +10 -10
  4. package/artifacts/solcInputs/{f1a50b67569d88ee54efa3e22c6b484e.json → e9b173393b9fd7287a0bfaa6d4eb4b71.json} +4 -4
  5. package/build/contracts/GovernanceUtils.sol/GovernanceUtils.dbg.json +1 -1
  6. package/build/contracts/bank/Bank.sol/Bank.dbg.json +1 -1
  7. package/build/contracts/bridge/BitcoinTx.sol/BitcoinTx.dbg.json +1 -1
  8. package/build/contracts/bridge/Bridge.sol/Bridge.dbg.json +1 -1
  9. package/build/contracts/bridge/Bridge.sol/Bridge.json +71 -95
  10. package/build/contracts/bridge/BridgeState.sol/BridgeState.dbg.json +1 -1
  11. package/build/contracts/bridge/BridgeState.sol/BridgeState.json +2 -2
  12. package/build/contracts/bridge/Deposit.sol/Deposit.dbg.json +1 -1
  13. package/build/contracts/bridge/Deposit.sol/Deposit.json +2 -2
  14. package/build/contracts/bridge/EcdsaLib.sol/EcdsaLib.dbg.json +1 -1
  15. package/build/contracts/bridge/Fraud.sol/Fraud.dbg.json +4 -0
  16. package/build/contracts/bridge/Fraud.sol/Fraud.json +138 -0
  17. package/build/contracts/bridge/IRelay.sol/IRelay.dbg.json +1 -1
  18. package/build/contracts/bridge/MovingFunds.sol/MovingFunds.dbg.json +1 -1
  19. package/build/contracts/bridge/MovingFunds.sol/MovingFunds.json +2 -2
  20. package/build/contracts/bridge/Redeem.sol/OutboundTx.dbg.json +1 -1
  21. package/build/contracts/bridge/Redeem.sol/OutboundTx.json +2 -2
  22. package/build/contracts/bridge/Redeem.sol/Redeem.dbg.json +1 -1
  23. package/build/contracts/bridge/Redeem.sol/Redeem.json +2 -2
  24. package/build/contracts/bridge/Sweep.sol/Sweep.dbg.json +1 -1
  25. package/build/contracts/bridge/Sweep.sol/Sweep.json +2 -2
  26. package/build/contracts/bridge/VendingMachine.sol/VendingMachine.dbg.json +1 -1
  27. package/build/contracts/bridge/Wallets.sol/Wallets.dbg.json +1 -1
  28. package/build/contracts/token/TBTC.sol/TBTC.dbg.json +1 -1
  29. package/build/contracts/vault/IVault.sol/IVault.dbg.json +1 -1
  30. package/build/contracts/vault/TBTCVault.sol/TBTCVault.dbg.json +1 -1
  31. package/contracts/bridge/Bridge.sol +37 -78
  32. package/contracts/bridge/BridgeState.sol +115 -110
  33. package/contracts/bridge/{Frauds.sol → Fraud.sol} +58 -131
  34. package/package.json +1 -1
  35. package/build/contracts/bridge/Frauds.sol/Frauds.dbg.json +0 -4
  36. package/build/contracts/bridge/Frauds.sol/Frauds.json +0 -138
@@ -18,32 +18,18 @@ pragma solidity ^0.8.9;
18
18
  import {BytesLib} from "@keep-network/bitcoin-spv-sol/contracts/BytesLib.sol";
19
19
  import {BTCUtils} from "@keep-network/bitcoin-spv-sol/contracts/BTCUtils.sol";
20
20
  import {CheckBitcoinSigs} from "@keep-network/bitcoin-spv-sol/contracts/CheckBitcoinSigs.sol";
21
+
21
22
  import "./BitcoinTx.sol";
22
23
  import "./EcdsaLib.sol";
23
- import "./Bridge.sol";
24
+ import "./BridgeState.sol";
25
+ import "./Wallets.sol";
24
26
 
25
- library Frauds {
27
+ library Fraud {
26
28
  using BytesLib for bytes;
27
29
  using BTCUtils for bytes;
28
30
  using BTCUtils for uint32;
29
31
  using EcdsaLib for bytes;
30
32
 
31
- struct Data {
32
- /// The amount of stake slashed from each member of a wallet for a fraud.
33
- uint256 slashingAmount;
34
- /// The percentage of the notifier reward from the staking contract
35
- /// the notifier of a fraud receives. The value is in the range [0, 100].
36
- uint256 notifierRewardMultiplier;
37
- /// The amount of time the wallet has to defeat a fraud challenge.
38
- uint256 challengeDefeatTimeout;
39
- /// The amount of ETH in wei the party challenging the wallet for fraud
40
- /// needs to deposit.
41
- uint256 challengeDepositAmount;
42
- /// Collection of all submitted fraud challenges indexed by challenge
43
- /// key built as keccak256(walletPublicKey|sighash).
44
- mapping(uint256 => FraudChallenge) challenges;
45
- }
46
-
47
33
  struct FraudChallenge {
48
34
  // The address of the party challenging the wallet.
49
35
  address challenger;
@@ -101,8 +87,6 @@ library Frauds {
101
87
  /// challenge or confiscated otherwise
102
88
  /// @param walletPublicKey The public key of the wallet in the uncompressed
103
89
  /// and unprefixed format (64 bytes)
104
- /// @param walletPubKeyHash 20-byte public key hash (computed using Bitcoin
105
- // HASH160 over the compressed ECDSA public key) of the wallet
106
90
  /// @param sighash The hash that was used to produce the ECDSA signature
107
91
  /// that is the subject of the fraud claim. This hash is constructed
108
92
  /// by applying double SHA-256 over a serialized subset of the
@@ -111,20 +95,22 @@ library Frauds {
111
95
  /// for reference
112
96
  /// @param signature Bitcoin signature in the R/S/V format
113
97
  /// @dev Requirements:
98
+ /// - Wallet behind `walletPublicKey` must be in `Live` or `MovingFunds`
99
+ /// state
114
100
  /// - The challenger must send appropriate amount of ETH used as
115
101
  /// fraud challenge deposit
116
102
  /// - The signature (represented by r, s and v) must be generated by
117
- /// the wallet behind `walletPubKey` during signing of `sighash`
103
+ /// the wallet behind `walletPublicKey` during signing of `sighash`
118
104
  /// - Wallet can be challenged for the given signature only once
119
- function submitChallenge(
120
- Data storage self,
105
+ function submitFraudChallenge(
106
+ BridgeState.Storage storage self,
107
+ Wallets.Data storage wallets,
121
108
  bytes calldata walletPublicKey,
122
- bytes20 walletPubKeyHash,
123
109
  bytes32 sighash,
124
110
  BitcoinTx.RSVSignature calldata signature
125
111
  ) external {
126
112
  require(
127
- msg.value >= self.challengeDepositAmount,
113
+ msg.value >= self.fraudChallengeDepositAmount,
128
114
  "The amount of ETH deposited is too low"
129
115
  );
130
116
 
@@ -139,11 +125,27 @@ library Frauds {
139
125
  "Signature verification failure"
140
126
  );
141
127
 
128
+ bytes memory compressedWalletPublicKey = EcdsaLib.compressPublicKey(
129
+ walletPublicKey.slice32(0),
130
+ walletPublicKey.slice32(32)
131
+ );
132
+ bytes20 walletPubKeyHash = compressedWalletPublicKey.hash160View();
133
+
134
+ Wallets.Wallet storage wallet = wallets.registeredWallets[
135
+ walletPubKeyHash
136
+ ];
137
+
138
+ require(
139
+ wallet.state == Wallets.WalletState.Live ||
140
+ wallet.state == Wallets.WalletState.MovingFunds,
141
+ "Wallet is neither in Live nor MovingFunds state"
142
+ );
143
+
142
144
  uint256 challengeKey = uint256(
143
145
  keccak256(abi.encodePacked(walletPublicKey, sighash))
144
146
  );
145
147
 
146
- FraudChallenge storage challenge = self.challenges[challengeKey];
148
+ FraudChallenge storage challenge = self.fraudChallenges[challengeKey];
147
149
  require(challenge.reportedAt == 0, "Fraud challenge already exists");
148
150
 
149
151
  challenge.challenger = msg.sender;
@@ -161,8 +163,18 @@ library Frauds {
161
163
  );
162
164
  }
163
165
 
164
- /// @notice Unwraps the fraud challenge by verifying the given challenge
165
- /// and returns the UTXO key extracted from the preimage.
166
+ /// @notice Allows to defeat a pending fraud challenge against a wallet if
167
+ /// the transaction that spends the UTXO follows the protocol rules.
168
+ /// In order to defeat the challenge the same `walletPublicKey` and
169
+ /// signature (represented by `r`, `s` and `v`) must be provided as
170
+ /// were used to calculate the sighash during input signing.
171
+ /// The fraud challenge defeat attempt will only succeed if the
172
+ /// inputs in the preimage are considered honestly spent by the
173
+ /// wallet. Therefore the transaction spending the UTXO must be
174
+ /// proven in the Bridge before a challenge defeat is called.
175
+ /// If successfully defeated, the fraud challenge is marked as
176
+ /// resolved and the amount of ether deposited by the challenger is
177
+ /// sent to the treasury.
166
178
  /// @param walletPublicKey The public key of the wallet in the uncompressed
167
179
  /// and unprefixed format (64 bytes)
168
180
  /// @param preimage The preimage which produces sighash used to generate the
@@ -172,25 +184,26 @@ library Frauds {
172
184
  /// produced for. See BIP-143 for reference
173
185
  /// @param witness Flag indicating whether the preimage was produced for a
174
186
  /// witness input. True for witness, false for non-witness input.
175
- /// @return utxoKey UTXO key that identifies spent input.
176
187
  /// @dev Requirements:
177
188
  /// - `walletPublicKey` and `sighash` calculated as `hash256(preimage)`
178
189
  /// must identify an open fraud challenge
179
190
  /// - the preimage must be a valid preimage of a transaction generated
180
191
  /// according to the protocol rules and already proved in the Bridge
181
- function unwrapChallenge(
182
- Data storage self,
192
+ /// - before a defeat attempt is made the transaction that spends the
193
+ /// given UTXO must be proven in the Bridge
194
+ function defeatFraudChallenge(
195
+ BridgeState.Storage storage self,
183
196
  bytes calldata walletPublicKey,
184
197
  bytes calldata preimage,
185
198
  bool witness
186
- ) external returns (uint256 utxoKey) {
199
+ ) external {
187
200
  bytes32 sighash = preimage.hash256();
188
201
 
189
202
  uint256 challengeKey = uint256(
190
203
  keccak256(abi.encodePacked(walletPublicKey, sighash))
191
204
  );
192
205
 
193
- FraudChallenge storage challenge = self.challenges[challengeKey];
206
+ FraudChallenge storage challenge = self.fraudChallenges[challengeKey];
194
207
 
195
208
  require(challenge.reportedAt > 0, "Fraud challenge does not exist");
196
209
  require(
@@ -202,55 +215,23 @@ library Frauds {
202
215
  // by type value `1`.
203
216
  require(extractSighashType(preimage) == 1, "Wrong sighash type");
204
217
 
205
- return
206
- witness
207
- ? extractUtxoKeyFromWitnessPreimage(preimage)
208
- : extractUtxoKeyFromNonWitnessPreimage(preimage);
209
- }
210
-
211
- /// @notice Finalizes fraud challenge defeat by marking a pending fraud
212
- /// challenge against the wallet as resolved and sending the ether
213
- /// deposited by the challenger to the treasury.
214
- /// In order to finalize the challenge defeat the same
215
- /// `walletPublicKey` must be provided as was used in the fraud
216
- /// challenge. Additionally a preimage must be provided which was
217
- /// used to calculate the sighash during input signing.
218
- /// @param walletPublicKey The public key of the wallet in the uncompressed
219
- /// and unprefixed format (64 bytes)
220
- /// @param preimage The preimage which produces sighash used to generate the
221
- /// ECDSA signature that is the subject of the fraud claim. It is a
222
- /// serialized subset of the transaction. The exact subset used as
223
- /// the preimage depends on the transaction input the signature is
224
- /// produced for. See BIP-143 for reference
225
- /// @param treasury Treasury associated with the Bridge
226
- /// @dev Requirements:
227
- /// - `walletPublicKey` and `sighash` calculated as `hash256(preimage)`
228
- /// must identify an open fraud challenge
229
- /// - the preimage must be a valid preimage of a transaction generated
230
- /// according to the protocol rules and already proved in the Bridge
231
- /// - before a defeat attempt is made the transaction that spends the
232
- /// given UTXO must be proven in the Bridge
233
- function defeatChallenge(
234
- Data storage self,
235
- bytes calldata walletPublicKey,
236
- bytes calldata preimage,
237
- address treasury
238
- ) external {
239
- bytes32 sighash = preimage.hash256();
218
+ uint256 utxoKey = witness
219
+ ? extractUtxoKeyFromWitnessPreimage(preimage)
220
+ : extractUtxoKeyFromNonWitnessPreimage(preimage);
240
221
 
241
- uint256 challengeKey = uint256(
242
- keccak256(abi.encodePacked(walletPublicKey, sighash))
222
+ // Check that the UTXO key identifies a correctly spent UTXO.
223
+ require(
224
+ self.deposits[utxoKey].sweptAt > 0 || self.spentMainUTXOs[utxoKey],
225
+ "Spent UTXO not found among correctly spent UTXOs"
243
226
  );
244
227
 
245
- FraudChallenge storage challenge = self.challenges[challengeKey];
246
-
247
228
  // Mark the challenge as resolved as it was successfully defeated
248
229
  challenge.resolved = true;
249
230
 
250
231
  // Send the ether deposited by the challenger to the treasury
251
232
  /* solhint-disable avoid-low-level-calls */
252
233
  // slither-disable-next-line low-level-calls
253
- treasury.call{gas: 100000, value: challenge.depositAmount}("");
234
+ self.treasury.call{gas: 100000, value: challenge.depositAmount}("");
254
235
  /* solhint-enable avoid-low-level-calls */
255
236
 
256
237
  bytes memory compressedWalletPublicKey = EcdsaLib.compressPublicKey(
@@ -285,8 +266,8 @@ library Frauds {
285
266
  /// challenge
286
267
  /// - the amount of time indicated by `challengeDefeatTimeout` must pass
287
268
  /// after the challenge was reported
288
- function notifyChallengeDefeatTimeout(
289
- Data storage self,
269
+ function notifyFraudChallengeDefeatTimeout(
270
+ BridgeState.Storage storage self,
290
271
  bytes calldata walletPublicKey,
291
272
  bytes32 sighash
292
273
  ) external {
@@ -294,7 +275,7 @@ library Frauds {
294
275
  keccak256(abi.encodePacked(walletPublicKey, sighash))
295
276
  );
296
277
 
297
- FraudChallenge storage challenge = self.challenges[challengeKey];
278
+ FraudChallenge storage challenge = self.fraudChallenges[challengeKey];
298
279
  require(challenge.reportedAt > 0, "Fraud challenge does not exist");
299
280
  require(
300
281
  !challenge.resolved,
@@ -303,7 +284,7 @@ library Frauds {
303
284
  require(
304
285
  /* solhint-disable-next-line not-rely-on-time */
305
286
  block.timestamp >=
306
- challenge.reportedAt + self.challengeDefeatTimeout,
287
+ challenge.reportedAt + self.fraudChallengeDefeatTimeout,
307
288
  "Fraud challenge defeat period did not time out yet"
308
289
  );
309
290
 
@@ -329,60 +310,6 @@ library Frauds {
329
310
  emit FraudChallengeDefeatTimedOut(walletPubKeyHash, sighash);
330
311
  }
331
312
 
332
- /// @notice Sets the new value for the `slashingAmount` parameter.
333
- /// @param _newSlashingAmount the new value for `slashingAmount`
334
- function setSlashingAmount(Data storage self, uint256 _newSlashingAmount)
335
- external
336
- {
337
- self.slashingAmount = _newSlashingAmount;
338
- emit FraudSlashingAmountUpdated(_newSlashingAmount);
339
- }
340
-
341
- /// @notice Sets the new value for the `notifierRewardMultiplier` parameter.
342
- /// @param _newNotifierRewardMultiplier the new value for `notifierRewardMultiplier`
343
- /// @dev The value of `notifierRewardMultiplier` must be <= 100.
344
- function setNotifierRewardMultiplier(
345
- Data storage self,
346
- uint256 _newNotifierRewardMultiplier
347
- ) external {
348
- require(
349
- _newNotifierRewardMultiplier <= 100,
350
- "Fraud notifier reward multiplier must be <= 100"
351
- );
352
- self.notifierRewardMultiplier = _newNotifierRewardMultiplier;
353
- emit FraudNotifierRewardMultiplierUpdated(_newNotifierRewardMultiplier);
354
- }
355
-
356
- /// @notice Sets the new value for the `challengeDefeatTimeout` parameter.
357
- /// @param _newChallengeDefeatTimeout the new value for `challengeDefeatTimeout`
358
- /// @dev The value of `challengeDefeatTimeout` must be > 0.
359
- function setChallengeDefeatTimeout(
360
- Data storage self,
361
- uint256 _newChallengeDefeatTimeout
362
- ) external {
363
- require(
364
- _newChallengeDefeatTimeout > 0,
365
- "Fraud challenge defeat timeout must be > 0"
366
- );
367
- self.challengeDefeatTimeout = _newChallengeDefeatTimeout;
368
- emit FraudChallengeDefeatTimeoutUpdated(_newChallengeDefeatTimeout);
369
- }
370
-
371
- /// @notice Sets the new value for the `challengeDepositAmount` parameter.
372
- /// @param _newChallengeDepositAmount the new value for `challengeDepositAmount`
373
- /// @dev The value of `challengeDepositAmount` must be > 0.
374
- function setChallengeDepositAmount(
375
- Data storage self,
376
- uint256 _newChallengeDepositAmount
377
- ) external {
378
- require(
379
- _newChallengeDepositAmount > 0,
380
- "Fraud challenge deposit amount must be > 0"
381
- );
382
- self.challengeDepositAmount = _newChallengeDepositAmount;
383
- emit FraudChallengeDepositAmountUpdated(_newChallengeDepositAmount);
384
- }
385
-
386
313
  /// @notice Extracts the UTXO keys from the given preimage used during
387
314
  /// signing of a witness input.
388
315
  /// @param preimage The preimage which produces sighash used to generate the
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@keep-network/tbtc-v2",
3
- "version": "0.1.1-dev.40+main.9a5b599fb35eae76fbce4bc68292febc3c8fcb2f",
3
+ "version": "0.1.1-dev.41+main.4a1165e2e997e16ed16872972456ac724f86b2f3",
4
4
  "license": "MIT",
5
5
  "files": [
6
6
  "artifacts/",
@@ -1,4 +0,0 @@
1
- {
2
- "_format": "hh-sol-dbg-1",
3
- "buildInfo": "../../../build-info/2fd33b4cd2b603ef68afefbc37f08651.json"
4
- }
@@ -1,138 +0,0 @@
1
- {
2
- "_format": "hh-sol-artifact-1",
3
- "contractName": "Frauds",
4
- "sourceName": "contracts/bridge/Frauds.sol",
5
- "abi": [
6
- {
7
- "anonymous": false,
8
- "inputs": [
9
- {
10
- "indexed": false,
11
- "internalType": "bytes20",
12
- "name": "walletPublicKeyHash",
13
- "type": "bytes20"
14
- },
15
- {
16
- "indexed": false,
17
- "internalType": "bytes32",
18
- "name": "sighash",
19
- "type": "bytes32"
20
- }
21
- ],
22
- "name": "FraudChallengeDefeatTimedOut",
23
- "type": "event"
24
- },
25
- {
26
- "anonymous": false,
27
- "inputs": [
28
- {
29
- "indexed": false,
30
- "internalType": "uint256",
31
- "name": "newFraudChallengeDefeatTimeout",
32
- "type": "uint256"
33
- }
34
- ],
35
- "name": "FraudChallengeDefeatTimeoutUpdated",
36
- "type": "event"
37
- },
38
- {
39
- "anonymous": false,
40
- "inputs": [
41
- {
42
- "indexed": false,
43
- "internalType": "bytes20",
44
- "name": "walletPublicKeyHash",
45
- "type": "bytes20"
46
- },
47
- {
48
- "indexed": false,
49
- "internalType": "bytes32",
50
- "name": "sighash",
51
- "type": "bytes32"
52
- }
53
- ],
54
- "name": "FraudChallengeDefeated",
55
- "type": "event"
56
- },
57
- {
58
- "anonymous": false,
59
- "inputs": [
60
- {
61
- "indexed": false,
62
- "internalType": "uint256",
63
- "name": "newFraudChallengeDepositAmount",
64
- "type": "uint256"
65
- }
66
- ],
67
- "name": "FraudChallengeDepositAmountUpdated",
68
- "type": "event"
69
- },
70
- {
71
- "anonymous": false,
72
- "inputs": [
73
- {
74
- "indexed": false,
75
- "internalType": "bytes20",
76
- "name": "walletPublicKeyHash",
77
- "type": "bytes20"
78
- },
79
- {
80
- "indexed": false,
81
- "internalType": "bytes32",
82
- "name": "sighash",
83
- "type": "bytes32"
84
- },
85
- {
86
- "indexed": false,
87
- "internalType": "uint8",
88
- "name": "v",
89
- "type": "uint8"
90
- },
91
- {
92
- "indexed": false,
93
- "internalType": "bytes32",
94
- "name": "r",
95
- "type": "bytes32"
96
- },
97
- {
98
- "indexed": false,
99
- "internalType": "bytes32",
100
- "name": "s",
101
- "type": "bytes32"
102
- }
103
- ],
104
- "name": "FraudChallengeSubmitted",
105
- "type": "event"
106
- },
107
- {
108
- "anonymous": false,
109
- "inputs": [
110
- {
111
- "indexed": false,
112
- "internalType": "uint256",
113
- "name": "newFraudNotifierRewardMultiplier",
114
- "type": "uint256"
115
- }
116
- ],
117
- "name": "FraudNotifierRewardMultiplierUpdated",
118
- "type": "event"
119
- },
120
- {
121
- "anonymous": false,
122
- "inputs": [
123
- {
124
- "indexed": false,
125
- "internalType": "uint256",
126
- "name": "newFraudSlashingAmount",
127
- "type": "uint256"
128
- }
129
- ],
130
- "name": "FraudSlashingAmountUpdated",
131
- "type": "event"
132
- }
133
- ],
134
- "bytecode": "0x611aad61003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100925760003560e01c8063545227871161006557806354522787146101195780639a08b74014610139578063c945968614610159578063e6d20d451461018b57600080fd5b80632123f1c41461009757806321e76ee8146100b95780633f31f49f146100d957806340399403146100f9575b600080fd5b8180156100a357600080fd5b506100b76100b23660046116bd565b6101ab565b005b8180156100c557600080fd5b506100b76100d4366004611721565b6101e6565b8180156100e557600080fd5b506100b76100f4366004611774565b6104f3565b81801561010557600080fd5b506100b76101143660046116bd565b6106e4565b81801561012557600080fd5b506100b76101343660046116bd565b61077e565b81801561014557600080fd5b506100b7610154366004611819565b61082c565b81801561016557600080fd5b506101796101743660046118ae565b610a9c565b60405190815260200160405180910390f35b81801561019757600080fd5b506100b76101a63660046116bd565b610c72565b8082556040518181527fdf25ccd778c4ac0298894525a8bd99ba018936d0c6ea0b6fc212507531c0adb7906020015b60405180910390a15050565b60008383836040516020016101fd93929190611931565b60408051601f198184030181529181528151602092830120600081815260048901909352912060028101549192509063ffffffff166102835760405162461bcd60e51b815260206004820152601e60248201527f4672617564206368616c6c656e676520646f6573206e6f74206578697374000060448201526064015b60405180910390fd5b6002810154640100000000900460ff16156102f25760405162461bcd60e51b815260206004820152602960248201527f4672617564206368616c6c656e67652068617320616c7265616479206265656e604482015268081c995cdbdb1d995960ba1b606482015260840161027a565b6002808701549082015461030c919063ffffffff16611959565b4210156103815760405162461bcd60e51b815260206004820152603260248201527f4672617564206368616c6c656e67652064656665617420706572696f6420646960448201527f64206e6f742074696d65206f7574207965740000000000000000000000000000606482015260840161027a565b60028101805464ff0000000019166401000000001790558054600182015460405173ffffffffffffffffffffffffffffffffffffffff90921691620186a091906000818181858888f193505050503d80600081146103fb576040519150601f19603f3d011682016040523d82523d6000602084013e610400565b606091505b505050600061049061044c600088888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050610d0c9050565b604080516020601f8a0181900481028201810190925288815261048b91908a8a808385018382808284376000920191909152509293925050610d0c9050565b610d14565b9050600061049d82610dbf565b604080516bffffffffffffffffffffffff1983168152602081018890529192507f635230b60143449f10a365568e2bd95e3e8aaed03855631722941c2bad634b7791015b60405180910390a15050505050505050565b600061053484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610de692505050565b9050600086868360405160200161054d93929190611931565b60408051601f198184030181528282528051602091820120600081815260048d0190925291902060028101805464ff00000000191664010000000017905560018101549193509173ffffffffffffffffffffffffffffffffffffffff861691620186a091600060405180830381858888f193505050503d80600081146105ef576040519150601f19603f3d011682016040523d82523d6000602084013e6105f4565b606091505b505050600061067f61064060008b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050610d0c9050565b604080516020601f8d018190048102820181019092528b815261048b91908d8d808385018382808284376000920191909152509293925050610d0c9050565b9050600061068c82610dbf565b604080516bffffffffffffffffffffffff1983168152602081018890529192507f6ff720470ffad78f316655e2c7fc77a76763c13de0e19ee52149916ba7e44d3b910160405180910390a15050505050505050505050565b600081116107475760405162461bcd60e51b815260206004820152602a60248201527f4672617564206368616c6c656e6765206465666561742074696d656f7574206d6044820152690757374206265203e20360b41b606482015260840161027a565b600282018190556040518181527f1e833ee8be2754de7dae1749a8438b691fda5b0695db2b2b8311b23270406d5a906020016101da565b60648111156107f55760405162461bcd60e51b815260206004820152602f60248201527f4672617564206e6f74696669657220726577617264206d756c7469706c69657260448201527f206d757374206265203c3d203130300000000000000000000000000000000000606482015260840161027a565b600182018190556040518181527feddb2abfc2e3aa166fbafa0dbaa077f0ec7663ddc8a535253bb35ed4ab70c877906020016101da565b85600301543410156108a65760405162461bcd60e51b815260206004820152602660248201527f54686520616d6f756e74206f6620455448206465706f7369746564206973207460448201527f6f6f206c6f770000000000000000000000000000000000000000000000000000606482015260840161027a565b6108fe85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508692506108f29150506060850160408601611971565b84356020860135610ea5565b61094a5760405162461bcd60e51b815260206004820152601e60248201527f5369676e617475726520766572696669636174696f6e206661696c7572650000604482015260640161027a565b600085858460405160200161096193929190611931565b60408051601f198184030181529181528151602092830120600081815260048b01909352912060028101549192509063ffffffff16156109e35760405162461bcd60e51b815260206004820152601e60248201527f4672617564206368616c6c656e676520616c7265616479206578697374730000604482015260640161027a565b80547fffffffffffffffffffffffff0000000000000000000000000000000000000000163317815534600182015560028101805464ffffffffff191663ffffffff42161790557ff4aa58d09ba5de017eac597806dfcfc2cad287816cb1eb7729a032c82680c94d8585610a5c6060870160408801611971565b604080516bffffffffffffffffffffffff19909416845260208085019390935260ff9091169083015285356060830152850135608082015260a0016104e1565b600080610ade85858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610de692505050565b90506000878783604051602001610af793929190611931565b60408051601f198184030181529181528151602092830120600081815260048d01909352912060028101549192509063ffffffff16610b785760405162461bcd60e51b815260206004820152601e60248201527f4672617564206368616c6c656e676520646f6573206e6f742065786973740000604482015260640161027a565b6002810154640100000000900460ff1615610be75760405162461bcd60e51b815260206004820152602960248201527f4672617564206368616c6c656e67652068617320616c7265616479206265656e604482015268081c995cdbdb1d995960ba1b606482015260840161027a565b610bf18787610fb5565b63ffffffff16600114610c465760405162461bcd60e51b815260206004820152601260248201527f57726f6e67207369676861736820747970650000000000000000000000000000604482015260640161027a565b84610c5a57610c558787611035565b610c64565b610c648787611279565b9a9950505050505050505050565b60008111610cd55760405162461bcd60e51b815260206004820152602a60248201527f4672617564206368616c6c656e6765206465706f73697420616d6f756e74206d6044820152690757374206265203e20360b41b606482015260840161027a565b600382018190556040518181527fac6cc6a5e862456c7f1a3827f078d9a355cb82eef2353c4167e872673b48570c906020016101da565b016020015190565b60606000610d23600284611994565b610d4e57507f0200000000000000000000000000000000000000000000000000000000000000610d71565b507f03000000000000000000000000000000000000000000000000000000000000005b6040517fff0000000000000000000000000000000000000000000000000000000000000082166020820152602181018590526041016040516020818303038152906040529150505b92915050565b60006020600083516020850160025afa50602060006020600060035afa5050600c51919050565b600060028083604051610df991906119b6565b602060405180830381855afa158015610e16573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610e3991906119f1565b604051602001610e4b91815260200190565b60408051601f1981840301815290829052610e65916119b6565b602060405180830381855afa158015610e82573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610db991906119f1565b60008551604014610f1e5760405162461bcd60e51b815260206004820152602760248201527f526571756972657320756e636f6d7072657373656420756e707265666978656460448201527f207075626b657900000000000000000000000000000000000000000000000000606482015260840161027a565b6000610f298761136f565b604080516000808252602082018084528a905260ff89169282019290925260608101879052608081018690529192509060019060a0016020604051602081039080840390855afa158015610f81573d6000803e3d6000fd5b5050604051601f19015173ffffffffffffffffffffffffffffffffffffffff90811693169290921498975050505050505050565b600080611005610fc6600485611a0a565b85858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506113f49050565b905060e081901c60d882901c63ff00ff001662ff00ff60e884901c1617601081811b91901c175b95945050505050565b600080600061107e600486868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505061140a9050565b90925090506000611090836005611959565b905060005b8281101561126f5760006110e28389898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506115889050565b90506000611129848a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506115d39050565b915050801561124e576000611177858b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506113f49050565b905060006111e76111c1878d8d8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505061161a9050565b60d881901c63ff00ff001662ff00ff60e89290921c9190911617601081811b91901c1790565b9050818160405160200161122a92919091825260e01b7fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6040516020818303038152906040528051906020012060001c98505050505061126f565b6112588285611959565b93505050808061126790611a21565b915050611095565b5050505092915050565b6000806112c0604485858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506113f49050565b9050600061130b6111c1604487878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505061161a9050565b9050818160405160200161134e92919091825260e01b7fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b60408051601f19818403018152919052805160209091012095945050505050565b600081516040146113e85760405162461bcd60e51b815260206004820152602d60248201527f5075626b6579206d7573742062652036342d62797465207261772c20756e636f60448201527f6d70726573736564206b65792e00000000000000000000000000000000000000606482015260840161027a565b50805160209091012090565b60006114038383016020015190565b9392505050565b60008060006114198585611631565b905060ff811661144b57600085858151811061143757611437611a3c565b016020015190935060f81c91506115819050565b83611457826001611a52565b60ff166114649190611959565b8551101561147b5760001960009250925050611581565b60008160ff16600214156114c0576114b56114a161149a876001611959565b88906113f4565b62ffff0060e882901c1660f89190911c1790565b61ffff169050611577565b8160ff16600414156114ea576114dd6111c161149a876001611959565b63ffffffff169050611577565b8160ff16600814156115775761156a61150761149a876001611959565b60c01c64ff000000ff600882811c91821665ff000000ff009390911b92831617601090811b67ffffffffffffffff1666ff00ff00ff00ff9290921667ff00ff00ff00ff009093169290921790911c65ffff0000ffff1617602081811c91901b1790565b67ffffffffffffffff1690505b60ff909116925090505b9250929050565b600080600061159785856115d3565b90925090506000198214156115b25760001992505050610db9565b806115be836025611959565b6115c89190611959565b61102c906004611959565b6000806115e1836025611959565b845110156115f6575060001990506000611581565b60008061160d86611608876024611959565b61140a565b9097909650945050505050565b600061140361162a836020611959565b84906113f4565b600082828151811061164557611645611a3c565b60209101015160f81c60ff141561165e57506008610db9565b82828151811061167057611670611a3c565b60209101015160f81c60fe141561168957506004610db9565b82828151811061169b5761169b611a3c565b60209101015160f81c60fd14156116b457506002610db9565b50600092915050565b600080604083850312156116d057600080fd5b50508035926020909101359150565b60008083601f8401126116f157600080fd5b50813567ffffffffffffffff81111561170957600080fd5b60208301915083602082850101111561158157600080fd5b6000806000806060858703121561173757600080fd5b84359350602085013567ffffffffffffffff81111561175557600080fd5b611761878288016116df565b9598909750949560400135949350505050565b6000806000806000806080878903121561178d57600080fd5b86359550602087013567ffffffffffffffff808211156117ac57600080fd5b6117b88a838b016116df565b909750955060408901359150808211156117d157600080fd5b506117de89828a016116df565b909450925050606087013573ffffffffffffffffffffffffffffffffffffffff8116811461180b57600080fd5b809150509295509295509295565b60008060008060008086880360e081121561183357600080fd5b87359650602088013567ffffffffffffffff81111561185157600080fd5b61185d8a828b016116df565b90975095505060408801356bffffffffffffffffffffffff198116811461188357600080fd5b93506060888101359350607f198201121561189d57600080fd5b506080870190509295509295509295565b600080600080600080608087890312156118c757600080fd5b86359550602087013567ffffffffffffffff808211156118e657600080fd5b6118f28a838b016116df565b9097509550604089013591508082111561190b57600080fd5b5061191889828a016116df565b9094509250506060870135801515811461180b57600080fd5b82848237909101908152602001919050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561196c5761196c611943565b500190565b60006020828403121561198357600080fd5b813560ff8116811461140357600080fd5b6000826119b157634e487b7160e01b600052601260045260246000fd5b500690565b6000825160005b818110156119d757602081860181015185830152016119bd565b818111156119e6576000828501525b509190910192915050565b600060208284031215611a0357600080fd5b5051919050565b600082821015611a1c57611a1c611943565b500390565b6000600019821415611a3557611a35611943565b5060010190565b634e487b7160e01b600052603260045260246000fd5b600060ff821660ff84168060ff03821115611a6f57611a6f611943565b01939250505056fea2646970667358221220a7852305a50b8d90eec1ab9ee1801ea51a07a1ee5abc1ae4beb865d85e9cf0fa64736f6c63430008090033",
135
- "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100925760003560e01c8063545227871161006557806354522787146101195780639a08b74014610139578063c945968614610159578063e6d20d451461018b57600080fd5b80632123f1c41461009757806321e76ee8146100b95780633f31f49f146100d957806340399403146100f9575b600080fd5b8180156100a357600080fd5b506100b76100b23660046116bd565b6101ab565b005b8180156100c557600080fd5b506100b76100d4366004611721565b6101e6565b8180156100e557600080fd5b506100b76100f4366004611774565b6104f3565b81801561010557600080fd5b506100b76101143660046116bd565b6106e4565b81801561012557600080fd5b506100b76101343660046116bd565b61077e565b81801561014557600080fd5b506100b7610154366004611819565b61082c565b81801561016557600080fd5b506101796101743660046118ae565b610a9c565b60405190815260200160405180910390f35b81801561019757600080fd5b506100b76101a63660046116bd565b610c72565b8082556040518181527fdf25ccd778c4ac0298894525a8bd99ba018936d0c6ea0b6fc212507531c0adb7906020015b60405180910390a15050565b60008383836040516020016101fd93929190611931565b60408051601f198184030181529181528151602092830120600081815260048901909352912060028101549192509063ffffffff166102835760405162461bcd60e51b815260206004820152601e60248201527f4672617564206368616c6c656e676520646f6573206e6f74206578697374000060448201526064015b60405180910390fd5b6002810154640100000000900460ff16156102f25760405162461bcd60e51b815260206004820152602960248201527f4672617564206368616c6c656e67652068617320616c7265616479206265656e604482015268081c995cdbdb1d995960ba1b606482015260840161027a565b6002808701549082015461030c919063ffffffff16611959565b4210156103815760405162461bcd60e51b815260206004820152603260248201527f4672617564206368616c6c656e67652064656665617420706572696f6420646960448201527f64206e6f742074696d65206f7574207965740000000000000000000000000000606482015260840161027a565b60028101805464ff0000000019166401000000001790558054600182015460405173ffffffffffffffffffffffffffffffffffffffff90921691620186a091906000818181858888f193505050503d80600081146103fb576040519150601f19603f3d011682016040523d82523d6000602084013e610400565b606091505b505050600061049061044c600088888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050610d0c9050565b604080516020601f8a0181900481028201810190925288815261048b91908a8a808385018382808284376000920191909152509293925050610d0c9050565b610d14565b9050600061049d82610dbf565b604080516bffffffffffffffffffffffff1983168152602081018890529192507f635230b60143449f10a365568e2bd95e3e8aaed03855631722941c2bad634b7791015b60405180910390a15050505050505050565b600061053484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610de692505050565b9050600086868360405160200161054d93929190611931565b60408051601f198184030181528282528051602091820120600081815260048d0190925291902060028101805464ff00000000191664010000000017905560018101549193509173ffffffffffffffffffffffffffffffffffffffff861691620186a091600060405180830381858888f193505050503d80600081146105ef576040519150601f19603f3d011682016040523d82523d6000602084013e6105f4565b606091505b505050600061067f61064060008b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050610d0c9050565b604080516020601f8d018190048102820181019092528b815261048b91908d8d808385018382808284376000920191909152509293925050610d0c9050565b9050600061068c82610dbf565b604080516bffffffffffffffffffffffff1983168152602081018890529192507f6ff720470ffad78f316655e2c7fc77a76763c13de0e19ee52149916ba7e44d3b910160405180910390a15050505050505050505050565b600081116107475760405162461bcd60e51b815260206004820152602a60248201527f4672617564206368616c6c656e6765206465666561742074696d656f7574206d6044820152690757374206265203e20360b41b606482015260840161027a565b600282018190556040518181527f1e833ee8be2754de7dae1749a8438b691fda5b0695db2b2b8311b23270406d5a906020016101da565b60648111156107f55760405162461bcd60e51b815260206004820152602f60248201527f4672617564206e6f74696669657220726577617264206d756c7469706c69657260448201527f206d757374206265203c3d203130300000000000000000000000000000000000606482015260840161027a565b600182018190556040518181527feddb2abfc2e3aa166fbafa0dbaa077f0ec7663ddc8a535253bb35ed4ab70c877906020016101da565b85600301543410156108a65760405162461bcd60e51b815260206004820152602660248201527f54686520616d6f756e74206f6620455448206465706f7369746564206973207460448201527f6f6f206c6f770000000000000000000000000000000000000000000000000000606482015260840161027a565b6108fe85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508692506108f29150506060850160408601611971565b84356020860135610ea5565b61094a5760405162461bcd60e51b815260206004820152601e60248201527f5369676e617475726520766572696669636174696f6e206661696c7572650000604482015260640161027a565b600085858460405160200161096193929190611931565b60408051601f198184030181529181528151602092830120600081815260048b01909352912060028101549192509063ffffffff16156109e35760405162461bcd60e51b815260206004820152601e60248201527f4672617564206368616c6c656e676520616c7265616479206578697374730000604482015260640161027a565b80547fffffffffffffffffffffffff0000000000000000000000000000000000000000163317815534600182015560028101805464ffffffffff191663ffffffff42161790557ff4aa58d09ba5de017eac597806dfcfc2cad287816cb1eb7729a032c82680c94d8585610a5c6060870160408801611971565b604080516bffffffffffffffffffffffff19909416845260208085019390935260ff9091169083015285356060830152850135608082015260a0016104e1565b600080610ade85858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610de692505050565b90506000878783604051602001610af793929190611931565b60408051601f198184030181529181528151602092830120600081815260048d01909352912060028101549192509063ffffffff16610b785760405162461bcd60e51b815260206004820152601e60248201527f4672617564206368616c6c656e676520646f6573206e6f742065786973740000604482015260640161027a565b6002810154640100000000900460ff1615610be75760405162461bcd60e51b815260206004820152602960248201527f4672617564206368616c6c656e67652068617320616c7265616479206265656e604482015268081c995cdbdb1d995960ba1b606482015260840161027a565b610bf18787610fb5565b63ffffffff16600114610c465760405162461bcd60e51b815260206004820152601260248201527f57726f6e67207369676861736820747970650000000000000000000000000000604482015260640161027a565b84610c5a57610c558787611035565b610c64565b610c648787611279565b9a9950505050505050505050565b60008111610cd55760405162461bcd60e51b815260206004820152602a60248201527f4672617564206368616c6c656e6765206465706f73697420616d6f756e74206d6044820152690757374206265203e20360b41b606482015260840161027a565b600382018190556040518181527fac6cc6a5e862456c7f1a3827f078d9a355cb82eef2353c4167e872673b48570c906020016101da565b016020015190565b60606000610d23600284611994565b610d4e57507f0200000000000000000000000000000000000000000000000000000000000000610d71565b507f03000000000000000000000000000000000000000000000000000000000000005b6040517fff0000000000000000000000000000000000000000000000000000000000000082166020820152602181018590526041016040516020818303038152906040529150505b92915050565b60006020600083516020850160025afa50602060006020600060035afa5050600c51919050565b600060028083604051610df991906119b6565b602060405180830381855afa158015610e16573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610e3991906119f1565b604051602001610e4b91815260200190565b60408051601f1981840301815290829052610e65916119b6565b602060405180830381855afa158015610e82573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610db991906119f1565b60008551604014610f1e5760405162461bcd60e51b815260206004820152602760248201527f526571756972657320756e636f6d7072657373656420756e707265666978656460448201527f207075626b657900000000000000000000000000000000000000000000000000606482015260840161027a565b6000610f298761136f565b604080516000808252602082018084528a905260ff89169282019290925260608101879052608081018690529192509060019060a0016020604051602081039080840390855afa158015610f81573d6000803e3d6000fd5b5050604051601f19015173ffffffffffffffffffffffffffffffffffffffff90811693169290921498975050505050505050565b600080611005610fc6600485611a0a565b85858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506113f49050565b905060e081901c60d882901c63ff00ff001662ff00ff60e884901c1617601081811b91901c175b95945050505050565b600080600061107e600486868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505061140a9050565b90925090506000611090836005611959565b905060005b8281101561126f5760006110e28389898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506115889050565b90506000611129848a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506115d39050565b915050801561124e576000611177858b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506113f49050565b905060006111e76111c1878d8d8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505061161a9050565b60d881901c63ff00ff001662ff00ff60e89290921c9190911617601081811b91901c1790565b9050818160405160200161122a92919091825260e01b7fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6040516020818303038152906040528051906020012060001c98505050505061126f565b6112588285611959565b93505050808061126790611a21565b915050611095565b5050505092915050565b6000806112c0604485858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506113f49050565b9050600061130b6111c1604487878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505061161a9050565b9050818160405160200161134e92919091825260e01b7fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b60408051601f19818403018152919052805160209091012095945050505050565b600081516040146113e85760405162461bcd60e51b815260206004820152602d60248201527f5075626b6579206d7573742062652036342d62797465207261772c20756e636f60448201527f6d70726573736564206b65792e00000000000000000000000000000000000000606482015260840161027a565b50805160209091012090565b60006114038383016020015190565b9392505050565b60008060006114198585611631565b905060ff811661144b57600085858151811061143757611437611a3c565b016020015190935060f81c91506115819050565b83611457826001611a52565b60ff166114649190611959565b8551101561147b5760001960009250925050611581565b60008160ff16600214156114c0576114b56114a161149a876001611959565b88906113f4565b62ffff0060e882901c1660f89190911c1790565b61ffff169050611577565b8160ff16600414156114ea576114dd6111c161149a876001611959565b63ffffffff169050611577565b8160ff16600814156115775761156a61150761149a876001611959565b60c01c64ff000000ff600882811c91821665ff000000ff009390911b92831617601090811b67ffffffffffffffff1666ff00ff00ff00ff9290921667ff00ff00ff00ff009093169290921790911c65ffff0000ffff1617602081811c91901b1790565b67ffffffffffffffff1690505b60ff909116925090505b9250929050565b600080600061159785856115d3565b90925090506000198214156115b25760001992505050610db9565b806115be836025611959565b6115c89190611959565b61102c906004611959565b6000806115e1836025611959565b845110156115f6575060001990506000611581565b60008061160d86611608876024611959565b61140a565b9097909650945050505050565b600061140361162a836020611959565b84906113f4565b600082828151811061164557611645611a3c565b60209101015160f81c60ff141561165e57506008610db9565b82828151811061167057611670611a3c565b60209101015160f81c60fe141561168957506004610db9565b82828151811061169b5761169b611a3c565b60209101015160f81c60fd14156116b457506002610db9565b50600092915050565b600080604083850312156116d057600080fd5b50508035926020909101359150565b60008083601f8401126116f157600080fd5b50813567ffffffffffffffff81111561170957600080fd5b60208301915083602082850101111561158157600080fd5b6000806000806060858703121561173757600080fd5b84359350602085013567ffffffffffffffff81111561175557600080fd5b611761878288016116df565b9598909750949560400135949350505050565b6000806000806000806080878903121561178d57600080fd5b86359550602087013567ffffffffffffffff808211156117ac57600080fd5b6117b88a838b016116df565b909750955060408901359150808211156117d157600080fd5b506117de89828a016116df565b909450925050606087013573ffffffffffffffffffffffffffffffffffffffff8116811461180b57600080fd5b809150509295509295509295565b60008060008060008086880360e081121561183357600080fd5b87359650602088013567ffffffffffffffff81111561185157600080fd5b61185d8a828b016116df565b90975095505060408801356bffffffffffffffffffffffff198116811461188357600080fd5b93506060888101359350607f198201121561189d57600080fd5b506080870190509295509295509295565b600080600080600080608087890312156118c757600080fd5b86359550602087013567ffffffffffffffff808211156118e657600080fd5b6118f28a838b016116df565b9097509550604089013591508082111561190b57600080fd5b5061191889828a016116df565b9094509250506060870135801515811461180b57600080fd5b82848237909101908152602001919050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561196c5761196c611943565b500190565b60006020828403121561198357600080fd5b813560ff8116811461140357600080fd5b6000826119b157634e487b7160e01b600052601260045260246000fd5b500690565b6000825160005b818110156119d757602081860181015185830152016119bd565b818111156119e6576000828501525b509190910192915050565b600060208284031215611a0357600080fd5b5051919050565b600082821015611a1c57611a1c611943565b500390565b6000600019821415611a3557611a35611943565b5060010190565b634e487b7160e01b600052603260045260246000fd5b600060ff821660ff84168060ff03821115611a6f57611a6f611943565b01939250505056fea2646970667358221220a7852305a50b8d90eec1ab9ee1801ea51a07a1ee5abc1ae4beb865d85e9cf0fa64736f6c63430008090033",
136
- "linkReferences": {},
137
- "deployedLinkReferences": {}
138
- }