diff --git a/contracts/snapshots/BoundlessMarketBasicTest.json b/contracts/snapshots/BoundlessMarketBasicTest.json index 1cf15bc67..73e75e970 100644 --- a/contracts/snapshots/BoundlessMarketBasicTest.json +++ b/contracts/snapshots/BoundlessMarketBasicTest.json @@ -1,6 +1,6 @@ { "ERC20 approve: required for depositCollateral": "45966", - "bytecode size implementation": "24312", + "bytecode size implementation": "24383", "bytecode size proxy": "89", "deposit: first ever deposit": "50942", "deposit: second deposit": "33842", diff --git a/contracts/src/BoundlessMarket.sol b/contracts/src/BoundlessMarket.sol index bbc3753be..72f846d0b 100644 --- a/contracts/src/BoundlessMarket.sol +++ b/contracts/src/BoundlessMarket.sol @@ -562,10 +562,17 @@ contract BoundlessMarket is // If the price is higher, we charge the client the difference. // If the price is lower, we refund the client the difference. uint96 lockPrice = lock.price; + bool partialPayment = false; + uint96 finalPrice = price; + if (price > lockPrice) { uint96 clientOwes = price - lockPrice; if (clientAccount.balance < clientOwes) { - return abi.encodeWithSelector(InsufficientBalance.selector, client); + // If the client does not have enough balance to cover the full amount owed, + // we will only charge them what they have available. + clientOwes = clientAccount.balance; + finalPrice = lockPrice + clientOwes; + partialPayment = true; } unchecked { clientAccount.balance -= clientOwes; @@ -577,9 +584,12 @@ contract BoundlessMarket is requestLocks[id].setProverPaidAfterLockDeadline(assessorProver); if (MARKET_FEE_BPS > 0) { - price = _applyMarketFee(price); + finalPrice = _applyMarketFee(finalPrice); + } + accounts[assessorProver].balance += finalPrice; + if (partialPayment) { + return abi.encodeWithSelector(PartialPayment.selector, price, finalPrice); } - accounts[assessorProver].balance += price; } /// @notice For a request that has never been locked. Marks the request as fulfilled, and transfers payment if eligible. diff --git a/contracts/src/IBoundlessMarket.sol b/contracts/src/IBoundlessMarket.sol index 7df0d7f2b..9b460880e 100644 --- a/contracts/src/IBoundlessMarket.sol +++ b/contracts/src/IBoundlessMarket.sol @@ -148,6 +148,12 @@ interface IBoundlessMarket { /// @dev selector 0x897f6c58 error InsufficientBalance(address account); + /// @notice Error when a payment is partially settled due to insufficient funds. + /// @param fullAmount The full amount that was required. + /// @param paidAmount The amount that was actually paid. + /// @dev selector 0x6008fdcb + error PartialPayment(uint256 fullAmount, uint256 paidAmount); + /// @notice Error when a signature did not pass verification checks. /// @dev selector 0x8baa579f error InvalidSignature(); diff --git a/contracts/test/BoundlessMarket.t.sol b/contracts/test/BoundlessMarket.t.sol index 3cc4a7cef..27ce9ce97 100644 --- a/contracts/test/BoundlessMarket.t.sol +++ b/contracts/test/BoundlessMarket.t.sol @@ -3920,6 +3920,11 @@ contract BoundlessMarketBasicTest is BoundlessMarketTest { client.snapshotBalance(); testProver.snapshotBalance(); + // Withdraw some funds so we only have funds to cover for the first offer + // and we have a deficit for the second offer to test the partial payment path + vm.prank(client.addr()); + boundlessMarket.withdraw(DEFAULT_BALANCE - 2 ether); + // Lock request A vm.prank(testProverAddress); boundlessMarket.lockRequest(requestA, clientSignatureA); @@ -3944,16 +3949,27 @@ contract BoundlessMarketBasicTest is BoundlessMarketTest { vm.expectEmit(true, true, true, true); bytes32 imageId = bytesToBytes32(requestB.requirements.predicate.data); emit MockCallback.MockCallbackCalled(imageId, APP_JOURNAL, fill.seal); - boundlessMarket.priceAndFulfill(requests, clientSignatures, fills, assessorReceipt); + bytes[] memory errors = boundlessMarket.priceAndFulfill(requests, clientSignatures, fills, assessorReceipt); + // Verify that the second request was partially payed + assertEq(errors.length, 1, "Expected one error"); + assertEq( + errors[0], + abi.encodeWithSelector(IBoundlessMarket.PartialPayment.selector, 3 ether, 2 ether), + "Unexpected error" + ); // Verify only the second request's callback was called assertEq(mockCallback.getCallCount(), 0, "First request's callback should not be called"); assertEq(mockHighGasCallback.getCallCount(), 1, "Second request's callback should be called once"); + // Deposit back original funds so that the Market original balance is restored + vm.prank(client.addr()); + boundlessMarket.deposit{value: DEFAULT_BALANCE - 2 ether}(); + // Verify request state and balances expectRequestFulfilled(fill.id); - client.expectBalanceChange(-3 ether); - testProver.expectBalanceChange(3 ether); + client.expectBalanceChange(-2 ether); + testProver.expectBalanceChange(2 ether); testProver.expectCollateralBalanceChange(-1 ether); // Lost stake from lock expectMarketBalanceUnchanged(); } diff --git a/crates/boundless-market/src/contracts/artifacts/IBoundlessMarket.sol b/crates/boundless-market/src/contracts/artifacts/IBoundlessMarket.sol index 7df0d7f2b..9b460880e 100644 --- a/crates/boundless-market/src/contracts/artifacts/IBoundlessMarket.sol +++ b/crates/boundless-market/src/contracts/artifacts/IBoundlessMarket.sol @@ -148,6 +148,12 @@ interface IBoundlessMarket { /// @dev selector 0x897f6c58 error InsufficientBalance(address account); + /// @notice Error when a payment is partially settled due to insufficient funds. + /// @param fullAmount The full amount that was required. + /// @param paidAmount The amount that was actually paid. + /// @dev selector 0x6008fdcb + error PartialPayment(uint256 fullAmount, uint256 paidAmount); + /// @notice Error when a signature did not pass verification checks. /// @dev selector 0x8baa579f error InvalidSignature(); diff --git a/crates/boundless-market/src/contracts/bytecode.rs b/crates/boundless-market/src/contracts/bytecode.rs index e23822c45..111de8c11 100644 --- a/crates/boundless-market/src/contracts/bytecode.rs +++ b/crates/boundless-market/src/contracts/bytecode.rs @@ -1,7 +1,7 @@ // Auto-generated file, do not edit manually alloy::sol! { - #[sol(rpc, bytecode = "6101403461035357601f61626438819003918201601f19168301916001600160401b038311848410176103575780849260a0946040528339810103126103535780516001600160a01b03811680820361035357602083015160408401519260608501519463ffffffff86168096036103535760800151926001600160a01b0384169081850361035357306080521561031b5782156102d65715610291578461023d575b60a05260c05260e052610100526001600160401b034281169190910190811161022957610120527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460ff8160401c1661021a576002600160401b03196001600160401b038216016101b1575b604051615ef8908161036c823960805181818161189b015261192e015260a0518181816122650152818161310e015281816135a70152613652015260c051818181610d2b015281816110c80152613164015260e051818181610b0d0152818161122301528181611656015281816117ab01528181611cbc015261455a015261010051818181611e5a01526131fe015261012051818181610f1801526131a80152f35b6001600160401b0319166001600160401b039081177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f61010f565b63f92ee8a960e01b5f5260045ffd5b634e487b7160e01b5f52601160045260245ffd5b836100a25760405162461bcd60e51b815260206004820152602160248201527f496e76616c69642064657072656361746564206173736573736f7220696d61676044820152606560f81b6064820152608490fd5b60405162461bcd60e51b815260206004820152601860248201527f496e76616c696420636f6c6c61746572616c20746f6b656e00000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601660248201527f496e76616c6964206173736573736f7220696d616765000000000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b2103b32b934b334b2b960811b6044820152606490fd5b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f905f3560e01c90816301ffc9a7146122945750806308c84e70146122505780630b7ae1a7146121c357806315d7a240146121a85780631ce030241461218a578063248a9ca31461216b5780632abff1f2146120605780632e107a9014611fde5780632e1a7d4d14611fc05780632f2ff15d14611f8e57806336568abe14611f4957806341451f9414611e9857806341d3ab6914611e7d578063444161da14611e4257806345bc4d1014611ad45780634f1ef286146118ef57806352d1902d14611888578063553c02481461186c5780635b07fdd8146118495780635d704b331461178557806360dfd4a9146116ed5780636112fe2e146115b6578063612bee0c1461159557806363555624146114d157806370a082311461148e5780637136a7f31461147657806375b238fc146110ab5780637870d4811461145557806381bf6c241461140c57806384b0196e146112e45780638f2b50a71461117b57806391d1485414611125578063956b0960146111085780639f04f420146110eb5780639fe9428c146110b0578063a217fddf146110ab578063ad2fa6c814611023578063ad3cb1cc14610fda578063ae7330f114610f3c578063afe171fd14610ef8578063b09c980b14610eb2578063bad4a01f14610e94578063c515c15f14610e0f578063c64067a214610df7578063cb74db1114610dce578063cdc9712314610cd8578063d0e30db014610cc4578063d4bd257b14610c27578063d547741f14610bec578063df2e670614610b7a578063eba2ecc814610b3c578063ef1ae1c814610af7578063f2800f1a14610aa0578063f399e22e146104a7578063ff1214a5146102a45763ffa1ad7414610286575f80fd5b346102a157806003193601126102a157602060405160018152f35b80fd5b50346102a15760603660031901126102a1576004356001600160401b0381116104a357610160816004019160031990360301126104a3576024356001600160401b03811161049f576102fa90369060040161233c565b916044356001600160401b03811161049b5761031a90369060040161233c565b6103248335614402565b9161033187878488614741565b604051919591610342606082612653565b60218152602081017f4c6f636b526571756573742850726f6f66526571756573742072657175657374815260408201602960f81b90526103806152bb565b90610389615305565b8d61039261534a565b61039a615408565b6103a2615455565b916103ab6154dc565b94604051978897602089019a5180918c5e880160208101918783528051926020849201905e0160200185815281516020819301825e0184815281516020819301825e0183815281516020819301825e0182815281516020819301825e0190815281516020819301825e018d815203601f198101825261042a9082612653565b51902090604051906020820192835260408201526040815261044d606082612653565b519020610458615a43565b9061046291615af8565b91369061046e9261268f565b61047791615b15565b61048391959295615b4f565b61048c85614d4f565b96610498989196614eef565b80f35b8480fd5b8280fd5b5080fd5b50346102a15760403660031901126102a1576104c1612312565b906024356001600160401b0381116104a3576104e190369060040161233c565b5f80516020615e8c833981519152939193549060ff8260401c1615916001600160401b03811680159081610a98575b6001149081610a8e575b159081610a85575b50610a765767ffffffffffffffff1981166001175f80516020615e8c8339815191525582610a4a575b506001600160a01b03831615610a0d57610563615acd565b61056b615acd565b604092835161057a8582612653565b601081526f12509bdd5b991b195cdcd3585c9ad95d60821b60208201528451906105a48683612653565b60018252603160f81b60208301526105ba615acd565b6105c2615acd565b8051906001600160401b0382116109f9576105ea5f80516020615dcc833981519152546128a7565b601f811161098a575b50602090601f831160011461090e576106239291899183610800575b50508160011b915f199060031b1c19161790565b5f80516020615dcc833981519152555b8051906001600160401b0382116108fa5761065b5f80516020615dec833981519152546128a7565b601f811161088b575b50602090601f831160011461080b579180610698926106cd95948a926108005750508160011b915f199060031b1c19161790565b5f80516020615dec833981519152555b855f80516020615e0c83398151915255855f80516020615eac83398151915255613e90565b506001600160401b0381116107ec576106f0816106eb6002546128a7565b6128df565b83601f821160011461077d578190859661071f949596926107725750508160011b915f199060031b1c19161790565b6002555b61072b575080f35b5f80516020615e8c833981519152805460ff60401b1916905551600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a180f35b013590505f8061060f565b60028552601f198216955f80516020615dac83398151915291865b8881106107d4575083600195969798106107bb575b505050811b01600255610723565b01355f19600384901b60f8161c191690555f80806107ad565b90926020600181928686013581550194019101610798565b634e487b7160e01b84526041600452602484fd5b015190505f8061060f565b5f80516020615dec83398151915288528188209190601f198416895b81811061087357509160019391856106cd9796941061085b575b505050811b015f80516020615dec833981519152556106a8565b01515f1960f88460031b161c191690555f8080610841565b92936020600181928786015181550195019301610827565b5f80516020615dec83398151915288527f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b75601f840160051c810191602085106108f0575b601f0160051c01905b8181106108e55750610664565b8881556001016108d8565b90915081906108cf565b634e487b7160e01b87526041600452602487fd5b5f80516020615dcc83398151915289528189209190601f1984168a5b818110610972575090846001959493921061095a575b505050811b015f80516020615dcc83398151915255610633565b01515f1960f88460031b161c191690555f8080610940565b9293602060018192878601518155019501930161092a565b5f80516020615dcc83398151915289527f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d601f840160051c810191602085106109ef575b601f0160051c01905b8181106109e457506105f3565b8981556001016109d7565b90915081906109ce565b634e487b7160e01b88526041600452602488fd5b60405162461bcd60e51b815260206004820152601560248201527424b73b30b634b21034b734ba34b0b61037bbb732b960591b6044820152606490fd5b68ffffffffffffffffff191668010000000000000001175f80516020615e8c833981519152555f61054b565b63f92ee8a960e01b8552600485fd5b9050155f610522565b303b15915061051a565b849150610510565b50346102a15760203660031901126102a15760043590610abf82613921565b15610ae5576040816020936001600160401b039352808452205460a01c16604051908152f35b60249163d2be005d60e01b8252600452fd5b50346102a157806003193601126102a1576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346102a157610498610b4e36612796565b91610b598135614402565b90610b6685858386614741565b50610b7084614d4f565b9690953395614eef565b507fc354af001adff0e8c35481c5ce3df3edee370c71572514d281e884c8cb552203610ba536612796565b9291909234610bdf575b610bd960405192839260408452610bc96040850183613b82565b91848303602086015235966127e9565b0390a280f35b610be7613ac8565b610baf565b50346102a15760403660031901126102a157610c23600435610c0c6122fc565b90610c1e610c1982612889565b613e4a565b613fbd565b5080f35b50346102a157610c3636612544565b969095919490936001600160a01b039092169190823b1561049b5791610c77939185809460405196879586948593636691f64760e01b855260048501612809565b03925af18015610cb957610ca4575b610ca0610c94868686612834565b60405191829182612490565b0390f35b610caf828092612653565b6102a15780610c86565b6040513d84823e3d90fd5b50806003193601126102a157610498613ac8565b50346102a157806003193601126102a157604051908060025490610cfb826128a7565b8085529160018116908115610da75750600114610d5d575b610ca084610d2381860382612653565b6040519182917f0000000000000000000000000000000000000000000000000000000000000000835260406020840152604083019061246c565b600281525f80516020615dac833981519152939250905b808210610d8d57509091508101602001610d2382610d13565b919260018160209254838588010152019101909291610d74565b60ff191660208087019190915292151560051b85019092019250610d239150839050610d13565b50346102a15760203660031901126102a1576020610ded600435613921565b6040519015158152f35b50346102a157610498610e0936612796565b91613887565b50346102a15760203660031901126102a157604060e091600435815280602052208054906001600160601b0360026001830154920154916040519360018060a01b03811685526001600160401b038160a01c16602086015262ffffff81871c16604086015260f81c6060850152818116608085015260601c1660a083015260c0820152f35b50346102a15760203660031901126102a1576104986004353361452a565b50346102a15760203660031901126102a1576020906001600160601b03906040906001600160a01b03610ee3612312565b16815260018452205460601c16604051908152f35b50346102a157806003193601126102a15760206040516001600160401b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102a15760603660031901126102a15780610f57612312565b6044356001600160401b038111610fd657610f7690369060040161233c565b6001600160a01b0390921691823b15610fd157610faf92849283604051809681958294636691f64760e01b845260243560048501612809565b03925af18015610cb957610fc05750f35b81610fca91612653565b6102a15780f35b505050fd5b5050fd5b50346102a157806003193601126102a15750610ca0604051610ffd604082612653565b60058152640352e302e360dc1b602082015260405191829160208352602083019061246c565b50346102a15761103236612399565b9a93969297909960018060a09b949b9897981b031691823b1561049b5791611075939185809460405196879586948593636691f64760e01b855260048501612809565b03925af18015610cb957611096575b610ca0610c948a8a8a8a8a8a8a6137b0565b6110a1828092612653565b6102a15780611084565b61277c565b50346102a157806003193601126102a15760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b50346102a157806003193601126102a157602060405161c3508152f35b50346102a157806003193601126102a15760206040516113888152f35b50346102a15760403660031901126102a15760406111416122fc565b9160043581525f80516020615e6c833981519152602052209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b50346102a15760203660031901126102a157600435611198613e0e565b30825260016020526001600160601b03604083205460601c166001600160601b036111c2836144f9565b16116112d1576111f86111d4826144f9565b30845260016020526001600160601b03604085209181835460601c16031690612d51565b60405163a9059cbb60e01b815233600482015260248101829052602081604481866001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af19081156112c6578391611297575b5015611288576040519081527fa315121c7f539fd811176ad2735d5d3981237b261889ec13ae4d617ad06e39bc60203092a280f35b6312171d8360e31b8252600482fd5b6112b9915060203d6020116112bf575b6112b18183612653565b810190612d84565b5f611253565b503d6112a7565b6040513d85823e3d90fd5b63112fed8b60e31b825230600452602482fd5b50346102a157806003193601126102a1575f80516020615e0c8339815191525415806113f6575b156113b95761135d9061131c61394e565b90611325613a1b565b90602061136b604051936113398386612653565b8385525f368137604051968796600f60f81b885260e08589015260e088019061246c565b90868203604088015261246c565b904660608601523060808601528260a086015284820360c08601528080855193848152019401925b8281106113a257505050500390f35b835185528695509381019392810192600101611393565b60405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606490fd5b505f80516020615eac833981519152541561130b565b50346102a15760203660031901126102a1576114496020916040611431600435614402565b6001600160a01b03909116835260018552912061444b565b90506040519015158152f35b50346102a157610ca0610c9461146a366126e3565b959490949391936137b0565b50346102a157610498611488366124ef565b91612ef8565b50346102a15760203660031901126102a1576020906001600160601b03906040906001600160a01b036114bf612312565b16815260018452205416604051908152f35b50346102a15760203660031901126102a1576004356114ee613e0e565b30825260016020526001600160601b036040832054166001600160601b03611515836144f9565b16116112d157611524816144f9565b30835260016020526001600160601b03806040852092818454160316166001600160601b03198254161790558180808084335af1611560612e18565b5015611288576040519081527f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b6560203092a280f35b50346102a157610ca0610c946115aa366126e3565b95949094939193612dd6565b50346102a15760203660031901126102a15760043533825260016020526001600160601b03604083205460601c166001600160601b036115f5836144f9565b16116116da5761162b611607826144f9565b33845260016020526001600160601b03604085209181835460601c16031690612d51565b60405163a9059cbb60e01b815233600482015260248101829052602081604481866001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af19081156112c65783916116bb575b5015611288576040519081527fa315121c7f539fd811176ad2735d5d3981237b261889ec13ae4d617ad06e39bc60203392a280f35b6116d4915060203d6020116112bf576112b18183612653565b5f611686565b63112fed8b60e31b825233600452602482fd5b50346102a15760203660031901126102a157600460606040602093833581528085522060026040519161171f836125d3565b805460018060a01b03811684526001600160401b038160a01c168785015262ffffff8160e01c16604085015260f81c848401526001600160601b0360018201548181166080860152851c1660a0840152015460c082015201511615156040519015158152f35b50346102a15760a03660031901126102a1576004358160443560ff81168091036104a3577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b1561049f57829160e48392604051948593849263d505accf60e01b84523360048501523060248501528960448501526024356064850152608484015260643560a484015260843560c48401525af1611834575b50610498823361452a565b8161183e91612653565b6104a357815f611829565b50346102a157806003193601126102a1576020611864615a43565b604051908152f35b50346102a157806003193601126102a157602090604051908152f35b50346102a157806003193601126102a1577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630036118e05760206040515f80516020615e4c8339815191528152f35b63703e46dd60e11b8152600490fd5b5060403660031901126102a157611904612312565b906024356001600160401b0381116104a3576119249036906004016126c5565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016308114908115611ab2575b50611aa357611966613e0e565b6040516352d1902d60e01b8152926001600160a01b0381169190602085600481865afa80958596611a6f575b506119ab57634c9c8ce360e01b84526004839052602484fd5b9091845f80516020615e4c8339815191528103611a5d5750813b15611a4b575f80516020615e4c83398151915280546001600160a01b031916821790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8480a28151839015611a315780836020610c2395519101845af4611a2b612e18565b91615d4d565b50505034611a3c5780f35b63b398979f60e01b8152600490fd5b634c9c8ce360e01b8452600452602483fd5b632a87526960e21b8552600452602484fd5b9095506020813d602011611a9b575b81611a8b60209383612653565b8101031261049b5751945f611992565b3d9150611a7e565b63703e46dd60e11b8252600482fd5b5f80516020615e4c833981519152546001600160a01b0316141590505f611959565b50346102a15760203660031901126102a157600435611b15611af582614402565b6001600160a01b039091168085526001602052604085209092919061444b565b5015611e2e57818352826020526040832060405190611b33826125d3565b805460018060a01b03811683526001600160401b038160a01c16602084015262ffffff8160e01c16604084015260f81c60608301526001810154600260808401926001600160601b03831684526001600160601b0360a086019360601c168352015460c08401526004606084015116611e1a576001606084015116611e06576001600160401b03611bc384614079565b16421115611ddd5784865260208690526040862080546001600160f81b03811660f891821c60041790911b6001600160f81b0319161781558690600101556001600160601b038151166113888102908082046113881490151715611dc957611c406001600160601b039392612710611c4593049485915116612a64565b6144f9565b936002606060018060a01b038651169501511615155f14611d6557505060018060a01b03821685526001602052611c9660408620611c90856001600160601b03835460601c16612d31565b90612d51565b60405163a9059cbb60e01b815261dead60048201526024810182905291602083604481897f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af18015611d5a577f79ca7c80cf57b513ffdf8aa37ec70e40757f5e0d35219241860bb4b4c2fa7616946060946001600160601b0392611d3d575b5060405193845216602083015260018060a01b03166040820152a280f35b611d559060203d6020116112bf576112b18183612653565b611d1f565b6040513d88823e3d90fd5b9092506001600160601b0330933088526001602052611d9160408920611c908885835460601c16612d31565b511690865260016020526001600160601b03611db4604088209282845416612d31565b166001600160601b0319825416179055611c96565b634e487b7160e01b87526011600452602487fd5b6044866001600160401b0387611df287614079565b9063079c66ab60e41b845260045216602452fd5b631cfdeebb60e01b86526004859052602486fd5b633231064d60e11b86526004859052602486fd5b63d2be005d60e01b83526004829052602483fd5b50346102a157806003193601126102a15760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b50346102a157610ca0610c94611e92366124ef565b91612a71565b50346102a15760203660031901126102a15760043590611eb782613921565b15610ae557604081602093611f38935280845220600260405191611eda836125d3565b805460018060a01b03811684526001600160401b038160a01c168685015262ffffff8160e01c16604085015260f81c60608401526001600160601b036001820154818116608086015260601c1660a0840152015460c0820152614079565b6001600160401b0360405191168152f35b50346102a15760403660031901126102a157611f636122fc565b336001600160a01b03821603611f7f57610c2390600435613fbd565b63334bd91960e11b8252600482fd5b50346102a15760403660031901126102a157610c23600435611fae6122fc565b90611fbb610c1982612889565b613f19565b50346102a15760203660031901126102a15761049860043533613d3c565b50346102a157611fed36612544565b969095919490936001600160a01b039092169190823b1561049b579161202e939185809460405196879586948593636691f64760e01b855260048501612809565b03925af18015610cb95761204b575b610ca0610c94868686612a71565b612056828092612653565b6102a1578061203d565b50346102a15760203660031901126102a1576004356001600160401b0381116104a35761209190369060040161233c565b61209c929192613e0e565b6001600160401b038111612157576120b9816106eb6002546128a7565b81601f82116001146120ec57819083946120e694926107725750508160011b915f199060031b1c19161790565b60025580f35b60028352601f198216935f80516020615dac83398151915291845b86811061213f5750836001959610612126575b505050811b0160025580f35b01355f19600384901b60f8161c191690555f808061211a565b90926020600181928686013581550194019101612107565b634e487b7160e01b82526041600452602482fd5b50346102a15760203660031901126102a1576020611864600435612889565b50346102a157806003193601126102a1576020604051620186a08152f35b50346102a157610ca0610c946121bd366124ef565b91612834565b3461224c576121d136612399565b97999598909691959294929091906001600160a01b0316803b1561224c576122139a5f80946040519d8e9586948593636691f64760e01b855260048501612809565b03925af196871561224157610ca098610c9498612231575b50612dd6565b5f61223b91612653565b5f61222b565b6040513d5f823e3d90fd5b5f80fd5b3461224c575f36600319011261224c576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461224c57602036600319011261224c576004359063ffffffff60e01b821680920361224c57602091637965db0b60e01b81149081156122d6575b5015158152f35b6301ffc9a760e01b149050836122cf565b35906001600160e01b03198216820361224c57565b602435906001600160a01b038216820361224c57565b600435906001600160a01b038216820361224c57565b35906001600160a01b038216820361224c57565b9181601f8401121561224c578235916001600160401b03831161224c576020838186019501011161224c57565b9181601f8401121561224c578235916001600160401b03831161224c576020808501948460051b01011161224c57565b60e060031982011261224c576004356001600160a01b038116810361224c5791602435916044356001600160401b03811161224c57816123db9160040161233c565b929092916064356001600160401b03811161224c57816123fd91600401612369565b929092916084356001600160401b03811161224c578161241f91600401612369565b9290929160a4356001600160401b03811161224c578161244191600401612369565b9290929160c435906001600160401b03821161224c57608090829003600319011261224c5760040190565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b602081016020825282518091526040820191602060408360051b8301019401925f915b8383106124c257505050505090565b90919293946020806124e0600193603f19868203018752895161246c565b970193019301919392906124b3565b604060031982011261224c576004356001600160401b03811161224c578161251991600401612369565b92909291602435906001600160401b03821161224c57608090829003600319011261224c5760040190565b60a060031982011261224c576004356001600160a01b038116810361224c5791602435916044356001600160401b03811161224c57816125869160040161233c565b929092916064356001600160401b03811161224c57816125a891600401612369565b92909291608435906001600160401b03821161224c57608090829003600319011261224c5760040190565b60e081019081106001600160401b038211176125ee57604052565b634e487b7160e01b5f52604160045260245ffd5b60a081019081106001600160401b038211176125ee57604052565b604081019081106001600160401b038211176125ee57604052565b606081019081106001600160401b038211176125ee57604052565b90601f801991011681019081106001600160401b038211176125ee57604052565b6001600160401b0381116125ee57601f01601f191660200190565b92919261269b82612674565b916126a96040519384612653565b82948184528183011161224c578281602093845f960137010152565b9080601f8301121561224c578160206126e09335910161268f565b90565b608060031982011261224c576004356001600160401b03811161224c578161270d91600401612369565b929092916024356001600160401b03811161224c578161272f91600401612369565b929092916044356001600160401b03811161224c578161275191600401612369565b92909291606435906001600160401b03821161224c57608090829003600319011261224c5760040190565b3461224c575f36600319011261224c5760206040515f8152f35b90604060031983011261224c576004356001600160401b03811161224c57610160818403600319011261224c5760040191602435906001600160401b03821161224c576127e59160040161233c565b9091565b908060209392818452848401375f828201840152601f01601f1916010190565b6040906126e09492815281602082015201916127e9565b356001600160a01b038116810361224c5790565b8260609261284492959495612a71565b92016001600160a01b0361285782612820565b165f5260016020526001600160601b0360405f20541680612876575050565b61288261288792612820565b613d3c565b565b5f525f80516020615e6c833981519152602052600160405f20015490565b90600182811c921680156128d5575b60208310146128c157565b634e487b7160e01b5f52602260045260245ffd5b91607f16916128b6565b601f81116128eb575050565b60025f5260205f20906020601f840160051c83019310612925575b601f0160051c01905b81811061291a575050565b5f815560010161290f565b9091508190612906565b6001600160401b0381116125ee5760051b60200190565b903590601e198136030182121561224c57018035906001600160401b03821161224c5760200191606082023603831361224c57565b919081101561298b576060020190565b634e487b7160e01b5f52603260045260245ffd5b3561ffff8116810361224c5790565b80511561298b5760200190565b805182101561298b5760209160051b010190565b919081101561298b5760051b8101359060be198136030182121561224c570190565b600211156129fb57565b634e487b7160e01b5f52602160045260245ffd5b903590601e198136030182121561224c57018035906001600160401b03821161224c5760200191813603831361224c57565b601f19810191908211612a5057565b634e487b7160e01b5f52601160045260245ffd5b91908203918211612a5057565b929192612a7f848383612ef8565b612a888261292f565b93612a966040519586612653565b828552601f19612aa58461292f565b015f5b818110612d2057505084612abb8461292f565b612ac86040519182612653565b848152601f19612ad78661292f565b013660208301376020830194612aed8685612946565b90505f5b818110612ce15750505f5b818110612b0c5750505050505050565b612b178183886129cf565b90612b2d612b2760608801612820565b8361409b565b90612b3883886129bb565b52612cd857612b4781856129bb565b5180612b5a575b50600191505b01612afc565b6060830135600281101561224c57600190612b74816129f1565b03612cc957612b866080840184612a0f565b50926040840135840191612b9a8b8a612946565b90915f19810191908211612a5057612bb19261297b565b916040612bc060208501612820565b930135926001600160601b03841680940361224c57612be260a0840184612a0f565b6001600160a01b039092169491929091853b1561224c5760205f8760019a612c508397612c3e996040519a8b998a98899663a12da43f60e01b8852013560048701526060602487015260648601906040602082013591016127e9565b848103600319016044860152916127e9565b0393f19081612cb9575b50612cb2577f5c5960582bfc7a494183b4e9a66bfe8ecffc07a83a48d136e732400f7b98bf5090612c89612e18565b92612ca86040519283928352604060208401523594604083019061246c565b0390a25b5f612b4e565b5050612cac565b5f612cc391612653565b5f612c5a565b63b90a25b160e01b5f5260045ffd5b60019150612b54565b612cf581612cef8a89612946565b9061297b565b9060018101808211612a5057612d1961ffff612d1260019561299f565b16876129bb565b5201612af1565b806060602080938a01015201612aa8565b906001600160601b03809116911601906001600160601b038211612a5057565b80546bffffffffffffffffffffffff60601b191660609290921b6bffffffffffffffffffffffff60601b16919091179055565b9081602091031261224c5751801515810361224c5790565b919081101561298b5760051b8101359061015e198136030182121561224c570190565b9082101561298b576127e59160051b810190612a0f565b919695949392905f5b818110612df557505050506126e0939450612834565b80612e128a610e098387612e0c600197898c612d9c565b93612dbf565b01612ddf565b3d15612e42573d90612e2982612674565b91612e376040519384612653565b82523d5f602084013e565b606090565b903590601e198136030182121561224c57018035906001600160401b03821161224c57602001918160061b3603831361224c57565b919081101561298b5760061b0190565b6020815260406020612ea884518383860152606085019061246c565b93015191015290565b359061ffff8216820361224c57565b35906001600160601b038216820361224c57565b90612eee90604093969594966060845260608401916127e9565b9460208201520152565b61ffff821161379757612f0a8261292f565b90612f186040519283612653565b828252601f19612f278461292f565b01366020840137612f378361292f565b90612f456040519283612653565b838252601f19612f548561292f565b013660208401376040850193612f6a8587612e47565b90505f5b8181106136dd5750505f5b81811061336b5750505050612f8d90614644565b612fa6612f9d6020850185612946565b91909385612e47565b612fb560608796939601612820565b9160405193608085018581106001600160401b038211176125ee57604052612fdc8161292f565b91612fea6040519384612653565b818352606060208401920281019036821161224c57915b81831061331a5750505083526130168161292f565b946130246040519687612653565b818652602086019160061b81019036821161224c57915b8183106132db575050506020820193845260408201928352606082019060018060a01b031681526040519260208401946020865260c08501935193608060408701528451809152602060e087019501905f5b818110613296575050505192603f19858203016060860152602080855192838152019401905f5b8181106132665750509051608085015250516001600160a01b031660a0830152819003601f19810182526020925f9290916130ef9082612653565b604051918291518091835e8101838152039060025afa15612241575f517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316916131418180612a0f565b843b1561224c5760405163ab750e7560e01b8152915f918391829161318d9188917f00000000000000000000000000000000000000000000000000000000000000009160048601612ed4565b0381875afa9081613256575b50613251576001600160401b037f000000000000000000000000000000000000000000000000000000000000000016421161324257806131d891612a0f565b919092803b1561224c57613227935f936040519586948593849363ab750e7560e01b85527f00000000000000000000000000000000000000000000000000000000000000009160048601612ed4565b03915afa8015612241576132385750565b5f61288791612653565b63439cc0cd60e01b5f5260045ffd5b505050565b5f61326091612653565b5f613199565b8251805161ffff1687526020908101516001600160e01b03191681880152604090960195909201916001016130b4565b8251805161ffff1688526020818101516001600160a01b0316818a01526040918201516001600160601b0316918901919091526060909701969092019160010161308d565b60408336031261224c57602060409182516132f58161261d565b6132fe86612eb1565b815261330b8387016122e7565b8382015281520192019161303b565b60608336031261224c57602060609160405161333581612638565b61333e86612eb1565b815261334b838701612328565b8382015261335b60408701612ec0565b6040820152815201920191613001565b6133768183856129cf565b9060c08236031261224c576040519160c083018381106001600160401b038211176125ee57604052803580845260208201358060208601526040830135918260408701526060840135600281101561224c576060870190815260808501356001600160401b03811161224c576133ef90369087016126c5565b906080880191825260a086019788356001600160401b03811161224c576020926134729260a061342460219436908d016126c5565b9101525193613432856129f1565b61343b856129f1565b516040519384918183019660ff60f81b9060f81b1687528051918291018484015e81015f838201520301601f198101835282612653565b519020916040519261348384612602565b8684526020840192835260408401918252606084018581526080850191825260a09060746040516134b48482612653565b818152736c66696c6c6d656e74446174614469676573742960601b608060208301927f4173736573736f72436f6d6d69746d656e742875696e7432353620696e64657884527f2c75696e743235362069642c627974657333322072657175657374446967657360408201527f742c6279746573333220636c61696d4469676573742c6279746573333220667560608201520152209551945193519051925193604051956020870197885260408701526060860152608085015283015260c082015260c0815261358460e082612653565b519020613591848a6129bb565b5261359c83886129bb565b5161364c576135f0937f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316926135da9190612a0f565b9490604051956135e98761261d565b369161268f565b84526020840152803b1561224c5761361f925f916040518080968194631599ead560e01b835260048301612e8c565b039161c350fa9182156122415760019261363c575b505b01612f79565b5f61364691612653565b5f613634565b613685937f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316926135da9190612a0f565b84526020840152803b1561224c576136b4925f916040518080968194631599ead560e01b835260048301612e8c565b03915afa918215612241576001926136cd575b50613636565b5f6136d791612653565b5f6136c7565b60206136f3826136ed8a8c612e47565b90612e7c565b013563ffffffff60e01b811680910361224c5761373861372e61ffff613726613721866136ed8f8f90612e47565b61299f565b1686886129cf565b60a0810190612a0f565b60049291921161224c57600161377061ffff613769613721878f978f6136ed9163ffffffff60e01b90351699612e47565b16896129bb565b52818103613782575050600101612f6e565b632e2ce35360e21b5f5260045260245260445ffd5b506377e4aa5360e11b5f5260045261ffff60245260445ffd5b919695949392905f5b8181106137cf57505050506126e0939450612a71565b806137e68a610e098387612e0c600197898c612d9c565b016137b9565b35906001600160401b038216820361224c57565b359063ffffffff8216820361224c57565b91908260e091031261224c57604051613829816125d3565b60c08082948035845260208101356020850152613848604082016137ec565b604085015261385960608201613800565b606085015261386a60808201613800565b608085015261387b60a08201613800565b60a08501520135910152565b916138a091833560201c6001600160a01b031684614741565b509060406138df611c406138cf6138b685614d4f565b90506001600160401b0342911610946080369101613811565b6001600160401b03421690614deb565b6001600160601b038251916138f383612638565b60018352602083018590521691018190526001607f1b911561391b576001607e1b5b1717905d565b5f613915565b61392d61394a91614402565b6001600160a01b039091165f90815260016020526040902061444b565b5090565b604051905f825f80516020615dcc833981519152549161396d836128a7565b80835292600181169081156139fc5750600114613991575b61288792500383612653565b505f80516020615dcc8339815191525f90815290917f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d5b8183106139e057505090602061288792820101613985565b60209193508060019154838589010152019101909184926139c8565b6020925061288794915060ff191682840152151560051b820101613985565b604051905f825f80516020615dec8339815191525491613a3a836128a7565b80835292600181169081156139fc5750600114613a5d5761288792500383612653565b505f80516020615dec8339815191525f90815290917f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b755b818310613aac57505090602061288792820101613985565b6020919350806001915483858901015201910190918492613a94565b613ad1346144f9565b335f5260016020526001600160601b03613af260405f209282845416612d31565b166001600160601b03198254161790556040513481527fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c60203392a2565b9035603e198236030181121561224c570190565b9060038210156129fb5752565b9035601e198236030181121561224c5701602081359101916001600160401b03821161224c57813603831361224c57565b90813581526020820135607e198336030181121561224c57610160602083015282016001600160a01b03613bb582612328565b166101608301526001600160601b03613bd060208301612ec0565b16610180830152613be46040820182613b30565b9060806101a0840152813591600383101561224c57613c1c613c2f91613c12613c68956101e0880190613b44565b6020810190613b51565b60406102008701526102208601916127e9565b906001600160e01b031990613c46906060016122e7565b166101c0840152613c5a6040850185613b51565b9084830360408601526127e9565b613c756060840184613b30565b82820360608401528035600281101561224c57610140926040613cac859484613ca0613cbc966129f1565b84526020810190613b51565b91909281602082015201916127e9565b936080810135608085015260a081013560a08501526001600160401b03613ce560c083016137ec565b1660c085015263ffffffff613cfc60e08301613800565b1660e085015263ffffffff613d146101008301613800565b1661010085015263ffffffff613d2d6101208301613800565b16610120850152013591015290565b9060018060a01b03821691825f5260016020526001600160601b0360405f2054166001600160601b03613d6e846144f9565b1611613dfb575f8080848194613d83826144f9565b88845260016020526001600160601b03806040862092818454160316166001600160601b03198254161790555af1613db9612e18565b5015613dec5760207f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b6591604051908152a2565b6312171d8360e31b5f5260045ffd5b8263112fed8b60e31b5f5260045260245ffd5b335f9081525f80516020615e2c833981519152602052604090205460ff1615613e3357565b63e2517d3f60e01b5f52336004525f60245260445ffd5b5f8181525f80516020615e6c8339815191526020908152604080832033845290915290205460ff1615613e7a5750565b63e2517d3f60e01b5f523360045260245260445ffd5b6001600160a01b0381165f9081525f80516020615e2c833981519152602052604090205460ff16613f14576001600160a01b03165f8181525f80516020615e2c83398151915260205260408120805460ff191660011790553391907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8180a4600190565b505f90565b5f8181525f80516020615e6c833981519152602090815260408083206001600160a01b038616845290915290205460ff16613fb7575f8181525f80516020615e6c833981519152602090815260408083206001600160a01b0395909516808452949091528120805460ff19166001179055339291907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080a4600190565b50505f90565b5f8181525f80516020615e6c833981519152602090815260408083206001600160a01b038616845290915290205460ff1615613fb7575f8181525f80516020615e6c833981519152602090815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b906001600160401b03809116911601906001600160401b038211612a5057565b6126e09062ffffff60406001600160401b036020840151169201511690614059565b90916060925f928035906140ae82614402565b969060018060a01b0381165f5260016020526140cd8860405f2061444b565b91819991936040516140de816125d3565b5f81525f60208201525f60408201525f828201525f60808201525f60a08201525f60c08201529a614386575b50602085013599614119615549565b508a5c94614125615549565b506040516001607f1b8716151561413b82612638565b8082526001600160601b03604060208401936001607e1b8b161515855201981688525f1461433357516142c35791878995949288945b156142ab5760208101516001600160401b0316421161428e5761419497506158b6565b955b8651614250575b6040519060208252836020830152604082015260408201356060820152606082013591600283101561224c5761424b8291846141f97faf1db8f86d3f32029a484ff54c7ac1d7ef8f038ab050fc065af9e82eb9b850ca966129f1565b608084015261422d6142226142116080840184613b51565b60c060a088015260e08701916127e9565b9160a0810190613b51565b848303601f190160c08601526001600160a01b0390981697906127e9565b0390a3565b7f210e4fd706e561df48472433bcc50b4589f2c13e784e9992f4c3e6de26eb35646040516020815280614286602082018b61246c565b0390a161419d565b9291906001600160601b036142a5985116936156a3565b95614196565b5050906001600160601b036142a59651169188615567565b5050505050505092505091506040519063873fd26b60e01b60208301526024820152602481526142f4604482612653565b7f210e4fd706e561df48472433bcc50b4589f2c13e784e9992f4c3e6de26eb3564604051602081528061432a602082018561246c565b0390a190600190565b508080614379575b156143665761434982614079565b6001600160401b03429116106142c3579187899594928894614171565b8763c274d3e360e01b5f5260045260245ffd5b508b60c08301511461433b565b909950855f525f602052600260405f206001600160601b03604051936143ab856125d3565b825460018060a01b03811686526001600160401b038160a01c16602087015262ffffff8160e01c16604087015260f81c8186015260018301549082821660808701521c1660a0840152015460c0820152985f61410a565b906001600160c11b0319821661442a57602082901c6001600160a01b03169163ffffffff1690565b6341abc80160e01b5f5260045ffd5b630200000082101561298b5701905f90565b63ffffffff82169190602083101561449d576401fffffffe905460c01c9160011b169180830460021490151715612a50576001600160401b03906003831b1616901c9060026001831615159216151590565b916144a89150612a41565b908160011b9180830460021481151715612a505760ff916144d89160071c6001600160f81b031690600101614439565b90549060031b1c9116906003821b16901c9060026001831615159216151590565b6001600160601b038111614513576001600160601b031690565b6306dfcc6560e41b5f52606060045260245260445ffd5b6040516323b872dd60e01b81526001600160a01b03918216600482018190523060248301526044820184905292917f000000000000000000000000000000000000000000000000000000000000000016906020905f9060649082855af19081601f3d1160015f5114161516614637575b50156145fb576020816145f26145d07ff645c19720906ca336d36d26058a9489c6c757fe35843b75a74e3b8aa972ecf5946144f9565b855f5260018452611c9060405f20916001600160601b03835460601c16612d31565b604051908152a2565b60405162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b6044820152606490fd5b3b153d171590505f61459a565b80511561442a5760018151146147385780515b6001811161466d5750614669906129ae565b5190565b60018101808211612a505760011c905f5b8160011c81106146cc575060018082161461469a575b50614657565b5f198101908111612a50576146af90836129bb565b515f198201828111612a50576146c590846129bb565b525f614694565b600181901b906001600160ff1b0381168103612a50576146ec82866129bb565b5160018301809311612a5057614704600193876129bb565b519081811015614729575f5260205260405f205b61472282876129bb565b520161467e565b905f5260205260405f20614718565b614669906129ae565b919392906101608336031261224c5760405161475c81612602565b83359384825260208101356001600160401b03811161224c57810190813603916080831261224c57604080519361479285612638565b1261224c576040516147a38161261d565b6147ac82612328565b81526147ba60208301612ec0565b6020820152835260408101356001600160401b03811161224c57810160408136031261224c57604051916147ed8361261d565b8135600381101561224c5783526020820135926001600160401b03841161224c57614820606093614830953691016126c5565b60208201526020860152016122e7565b60408301526020830191825260408101356001600160401b03811161224c57810136601f8201121561224c5761486d90369060208135910161268f565b906040840191825260608101356001600160401b03811161224c5781019060408236031261224c57604051916148a28361261d565b8035600281101561224c57835260208101356001600160401b03811161224c576148ce913691016126c5565b6020830152606085019182526148e8903690608001613811565b90608085019182526148f8615455565b6149006152bb565b614908615305565b9061491161534a565b614919615408565b6149216154dc565b916040519485946020860197805160208192018a5e860160208101915f83528051926020849201905e016020015f815281516020819301825e015f815281516020819301825e015f815281516020819301825e015f815281516020819301825e015f815203601f19810182526149979082612653565b519020945193516149a66154dc565b6149ae6152bb565b6149b6615408565b90604051918291602083019480516020819201875e830160208101915f83528051926020849201905e016020015f815281516020819301825e015f815203601f1981018252614a059082612653565b519020908051614a136152bb565b8051906020012090600160a01b6001900381511690602001516001600160601b031660405191602083019384526040830152606082015260608152614a59608082612653565b519020906020810151614a6a615408565b805190602001209080519060038210156129fb576020015160208151910120614aa160405192602084019485526040840190613b44565b606082015260608152614ab5608082612653565b51902090604063ffffffff60e01b9101511690604051926020840194855260408401526060830152608082015260808152614af160a082612653565b5190209251602081519101209051614b07615305565b60208151910120906020815191614b1d836129f1565b0151602081519101206040519160208301938452614b3a816129f1565b6040830152606082015260608152614b53608082612653565b5190209151614b6061534a565b604051614b8c6020828180820195805191829101875e81015f838201520301601f198101835282612653565b519020908051906020810151906001600160401b0360408201511663ffffffff60608301511663ffffffff6080840151169160c063ffffffff60a08601511694015194604051966020880198895260408801526060870152608086015260a085015260c084015260e08301526101008201526101008152614c0f61012082612653565b51902092604051946020860196875260408601526060850152608084015260a083015260c082015260c08152614c4660e082612653565b51902094614c5b86614c56615a43565b615af8565b93600160c01b1615614d185791602091614c8c93604051809581948293630b135d3f60e11b84528960048501612809565b03916001600160a01b0316620186a0fa908115612241575f91614cd5575b506001600160e01b0319166374eca2c160e11b01614cc6579190565b638baa579f60e01b5f5260045ffd5b90506020813d602011614d10575b81614cf060209383612653565b8101031261224c57516001600160e01b03198116810361224c575f614caa565b3d9150614ce3565b614d2a614d3091614d3994369161268f565b84615b15565b90939193615b4f565b6001600160a01b03908116911603614cc6579190565b614d5d906080369101613811565b90815160208301511061442a5763ffffffff606083015116608083019063ffffffff8251161061442a5763ffffffff90511660a083019063ffffffff8251161061442a57614dca9063ffffffff6001600160401b036040614dbd87615aaa565b9601511691511690614059565b9162ffffff6001600160401b03614de18386614ecf565b161161442a579190565b9060408201906001600160401b0380835116911690811115614ec9576001600160401b03614e1884615aaa565b168111614ec2576001600160401b03825116906001600160401b03614e49606086019363ffffffff85511690614059565b16811115614e5b575050506020015190565b614e88906001600160401b0363ffffffff614e7c6020880151885190612a64565b94511694511690612a64565b925192818102918183041490151715612a50578115614eae57048101809111612a505790565b634e487b7160e01b5f52601260045260245ffd5b5050505f90565b50505190565b906001600160401b03809116911603906001600160401b038211612a5057565b9590929796949360018060a01b031697885f526001602052614f148560405f2061444b565b906152a757615293576001600160401b0386169889421161527b57614f42611c406138cf3660808c01613811565b96815f52600160205260405f20996001600160601b038b5416946001600160601b038a1693848710615269575060018060a01b031698895f52600160205260405f20906001600160601b03825460601c16966101408d013580981061525657918d6001600160601b0380614fe894614fed9897960316166001600160601b03198254161790556001600160601b03614fd9896144f9565b81835460601c16031690612d51565b614ecf565b926001600160401b03841662ffffff811161523f575061500c906144f9565b60405193615019856125d3565b88855260208086019c8d5262ffffff90911660408087019182525f60608801818152608089019687526001600160601b0390951660a0808a0191825260c08a019889528e35808452958390529290912097519e51925194519290911b67ffffffffffffffff60a01b166001600160a01b039e909e169d909d1760e09390931b62ffffff60e01b169290921760f89290921b6001600160f81b031916919091178455996001840191516001600160601b03166001600160601b03166001600160601b0319835416178255516001600160601b03166150f591612d51565b51906002015563ffffffff831692602084105f146151b0576401fffffffe9060011b169280840460021490151715612a505785546001600160c01b038116600190941b6001600160401b031660c091821c17901b6001600160c01b031916929092179094557fe5e43c93dc0ec595ed3b122bdc6d39a480e9d17fb6812e0f90cfc4ba33b0969e936151ab915b61519d6040519586958652606060208701526060860190613b82565b9184830360408601526127e9565b0390a2565b50916151bb90612a41565b918260011b9583870460021484151715612a50577fe5e43c93dc0ec595ed3b122bdc6d39a480e9d17fb6812e0f90cfc4ba33b0969e966151ab9461523a9260ff916001916152179160071c6001600160f81b0316908301614439565b929093161b82548260031b1c179082549060031b91821b915f19901b1916179055565b615181565b6306dfcc6560e41b5f52601860045260245260445ffd5b8b63112fed8b60e31b5f5260045260245ffd5b63112fed8b60e31b5f5260045260245ffd5b898863cfe6a8fd60e01b5f523560045260245260445ffd5b86631cfdeebb60e01b5f523560045260245ffd5b8763a905765160e01b5f523560045260245ffd5b604051906152ca606083612653565b60268252654c696d69742960d01b6040837f43616c6c6261636b286164647265737320616464722c75696e7439362067617360208201520152565b60405190615314606083612653565b60218252602960f81b6040837f496e7075742875696e743820696e707574547970652c6279746573206461746160208201520152565b6040519061535960c083612653565b60888252676c61746572616c2960c01b60a0837f4f666665722875696e74323536206d696e50726963652c75696e74323536206d60208201527f617850726963652c75696e7436342072616d70557053746172742c75696e743360408201527f322072616d705570506572696f642c75696e743332206c6f636b54696d656f7560608201527f742c75696e7433322074696d656f75742c75696e74323536206c6f636b436f6c60808201520152565b60405190615417606083612653565b602982526874657320646174612960b81b6040837f5072656469636174652875696e743820707265646963617465547970652c627960208201520152565b60405190615464608083612653565b605a82527f6c2c496e70757420696e7075742c4f66666572206f66666572290000000000006060837f50726f6f66526571756573742875696e743235362069642c526571756972656d60208201527f656e747320726571756972656d656e74732c737472696e6720696d616765557260408201520152565b604051906154eb608083612653565b60438252626f722960e81b6060837f526571756972656d656e74732843616c6c6261636b2063616c6c6261636b2c5060208201527f7265646963617465207072656469636174652c6279746573342073656c65637460408201520152565b6040519061555682612638565b5f6040838281528260208201520152565b9694959192939096606096615656575f80516020615ecc83398151915260209596979860018060a01b031693845f52600187526155a860405f209687615c38565b6040519387013584526001600160a01b0316958693a36001600160601b03825416906001600160601b038516821061562a57506001600160601b038481920316166001600160601b03198254161790555f5260016020526001600160601b0361561860405f209282845416612d31565b166001600160601b0319825416179055565b949550505050506040519063112fed8b60e31b60208301526024820152602481526126e0604482612653565b955050505050915060405190631cfdeebb60e01b60208301526024820152602481526126e0604482612653565b906001600160601b03809116911603906001600160601b038211612a5057565b92979694909395976060986001606086015116151580156158a6575b6158775715615826575b505060018060a01b0316805f5260016020526001600160601b03608060405f209301511685816001600160601b038216115f146157f1579061570a91615683565b906001600160601b03835416906001600160601b03831682106157c3575082546bffffffffffffffffffffffff19169190036001600160601b03161790555b5f90815260208190526040902080546affffffffffffffffffffff60a01b81166001600160a01b0384169081176001600160a01b0319929092161760f890811c600217901b6001600160f81b03191617905560018060a01b03165f5260016020526001600160601b0361561860405f209282845416612d31565b9697505050505050506040519063112fed8b60e31b60208301526024820152602481526126e0604482612653565b6001600160601b0392506158089061581192615683565b82845416612d31565b166001600160601b0319825416179055615749565b6001600160a01b0383165f9081526001602052604090206158479190615c38565b60405160209182013581526001600160a01b0386169185915f80516020615ecc8339815191529190a35f806156c9565b5050505050929350505060405190631cfdeebb60e01b60208301526024820152602481526126e0604482612653565b50600260608601511615156156bf565b9391909296959496606097600160608701511615158015615a33575b615a0557156159ba575b505082516001600160a01b0394851694168414801591906159a6575b5061597c5760a061288793926001600160601b03925f525f6020525f6001604082208160f81b828060f81b03825416178155015582608082015116845f5260016020528361594d60405f209282845416612d31565b168419825416179055015116905f526001602052611c9060405f20916001600160601b03835460601c16612d31565b92935050506040519063a905765160e01b60208301526024820152602481526126e0604482612653565b9050602060c084015191013514155f6158f8565b6159d69160018060a01b03165f52600160205260405f20615c38565b60405160208281013582526001600160a01b0386169184915f80516020615ecc83398151915291a35f806158dc565b50505050929350505060405190631cfdeebb60e01b60208301526024820152602481526126e0604482612653565b50600260608701511615156158d2565b615a4b615baf565b615a53615c06565b6040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a08152615aa460c082612653565b51902090565b6126e09063ffffffff60806001600160401b036040840151169201511690614059565b60ff5f80516020615e8c8339815191525460401c1615615ae957565b631afcd79f60e31b5f5260045ffd5b6042916040519161190160f01b8352600283015260228201522090565b8151919060418303615b4557615b3e9250602082015190606060408401519301515f1a90615cd5565b9192909190565b50505f9160029190565b60048110156129fb5780615b61575050565b60018103615b785763f645eedf60e01b5f5260045ffd5b60028103615b93575063fce698f760e01b5f5260045260245ffd5b600314615b9d5750565b6335e2f38360e21b5f5260045260245ffd5b615bb761394e565b8051908115615bc7576020012090565b50505f80516020615e0c833981519152548015615be15790565b507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47090565b615c0e613a1b565b8051908115615c1e576020012090565b50505f80516020615eac833981519152548015615be15790565b9063ffffffff8116906020821015615c95576401fffffffe9060011b169080820460021490151715612a505781546001600160c01b038116600290921b6001600160401b031660c091821c17901b6001600160c01b031916179055565b50615c9f90612a41565b8060011b9080820460021481151715612a50576128879260ff916002916152179160071c6001600160f81b031690600101614439565b91906fa2a8918ca85bafe22016d0b997e4df60600160ff1b038411615d42579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15612241575f516001600160a01b03811615615d3857905f905f90565b505f906001905f90565b5050505f9160039190565b90615d715750805115615d6257602081519101fd5b63d6bda27560e01b5f5260045ffd5b81511580615da2575b615d82575090565b639996b31560e01b5f9081526001600160a01b0391909116600452602490fd5b50803b15615d7a56fe405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acea16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d103a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100b7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d101120ea8d7610aa46e4a31b254c5d07489ebe8f1a93dc7bbbe60eaf3db2c62c0cca164736f6c634300081a000a")] + #[sol(rpc, bytecode = "6101403461035357601f6162ab38819003918201601f19168301916001600160401b038311848410176103575780849260a0946040528339810103126103535780516001600160a01b03811680820361035357602083015160408401519260608501519463ffffffff86168096036103535760800151926001600160a01b0384169081850361035357306080521561031b5782156102d65715610291578461023d575b60a05260c05260e052610100526001600160401b034281169190910190811161022957610120527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460ff8160401c1661021a576002600160401b03196001600160401b038216016101b1575b604051615f3f908161036c823960805181818161189b015261192e015260a0518181816122650152818161310e015281816135a70152613652015260c051818181610d2b015281816110c80152613164015260e051818181610b0d0152818161122301528181611656015281816117ab01528181611cbc015261455a015261010051818181611e5a01526131fe015261012051818181610f1801526131a80152f35b6001600160401b0319166001600160401b039081177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f61010f565b63f92ee8a960e01b5f5260045ffd5b634e487b7160e01b5f52601160045260245ffd5b836100a25760405162461bcd60e51b815260206004820152602160248201527f496e76616c69642064657072656361746564206173736573736f7220696d61676044820152606560f81b6064820152608490fd5b60405162461bcd60e51b815260206004820152601860248201527f496e76616c696420636f6c6c61746572616c20746f6b656e00000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601660248201527f496e76616c6964206173736573736f7220696d616765000000000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b2103b32b934b334b2b960811b6044820152606490fd5b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f905f3560e01c90816301ffc9a7146122945750806308c84e70146122505780630b7ae1a7146121c357806315d7a240146121a85780631ce030241461218a578063248a9ca31461216b5780632abff1f2146120605780632e107a9014611fde5780632e1a7d4d14611fc05780632f2ff15d14611f8e57806336568abe14611f4957806341451f9414611e9857806341d3ab6914611e7d578063444161da14611e4257806345bc4d1014611ad45780634f1ef286146118ef57806352d1902d14611888578063553c02481461186c5780635b07fdd8146118495780635d704b331461178557806360dfd4a9146116ed5780636112fe2e146115b6578063612bee0c1461159557806363555624146114d157806370a082311461148e5780637136a7f31461147657806375b238fc146110ab5780637870d4811461145557806381bf6c241461140c57806384b0196e146112e45780638f2b50a71461117b57806391d1485414611125578063956b0960146111085780639f04f420146110eb5780639fe9428c146110b0578063a217fddf146110ab578063ad2fa6c814611023578063ad3cb1cc14610fda578063ae7330f114610f3c578063afe171fd14610ef8578063b09c980b14610eb2578063bad4a01f14610e94578063c515c15f14610e0f578063c64067a214610df7578063cb74db1114610dce578063cdc9712314610cd8578063d0e30db014610cc4578063d4bd257b14610c27578063d547741f14610bec578063df2e670614610b7a578063eba2ecc814610b3c578063ef1ae1c814610af7578063f2800f1a14610aa0578063f399e22e146104a7578063ff1214a5146102a45763ffa1ad7414610286575f80fd5b346102a157806003193601126102a157602060405160018152f35b80fd5b50346102a15760603660031901126102a1576004356001600160401b0381116104a357610160816004019160031990360301126104a3576024356001600160401b03811161049f576102fa90369060040161233c565b916044356001600160401b03811161049b5761031a90369060040161233c565b6103248335614402565b9161033187878488614741565b604051919591610342606082612653565b60218152602081017f4c6f636b526571756573742850726f6f66526571756573742072657175657374815260408201602960f81b90526103806152bb565b90610389615305565b8d61039261534a565b61039a615408565b6103a2615455565b916103ab6154dc565b94604051978897602089019a5180918c5e880160208101918783528051926020849201905e0160200185815281516020819301825e0184815281516020819301825e0183815281516020819301825e0182815281516020819301825e0190815281516020819301825e018d815203601f198101825261042a9082612653565b51902090604051906020820192835260408201526040815261044d606082612653565b519020610458615a8a565b9061046291615b3f565b91369061046e9261268f565b61047791615b5c565b61048391959295615b96565b61048c85614d4f565b96610498989196614eef565b80f35b8480fd5b8280fd5b5080fd5b50346102a15760403660031901126102a1576104c1612312565b906024356001600160401b0381116104a3576104e190369060040161233c565b5f80516020615ed3833981519152939193549060ff8260401c1615916001600160401b03811680159081610a98575b6001149081610a8e575b159081610a85575b50610a765767ffffffffffffffff1981166001175f80516020615ed38339815191525582610a4a575b506001600160a01b03831615610a0d57610563615b14565b61056b615b14565b604092835161057a8582612653565b601081526f12509bdd5b991b195cdcd3585c9ad95d60821b60208201528451906105a48683612653565b60018252603160f81b60208301526105ba615b14565b6105c2615b14565b8051906001600160401b0382116109f9576105ea5f80516020615e13833981519152546128a7565b601f811161098a575b50602090601f831160011461090e576106239291899183610800575b50508160011b915f199060031b1c19161790565b5f80516020615e13833981519152555b8051906001600160401b0382116108fa5761065b5f80516020615e33833981519152546128a7565b601f811161088b575b50602090601f831160011461080b579180610698926106cd95948a926108005750508160011b915f199060031b1c19161790565b5f80516020615e33833981519152555b855f80516020615e5383398151915255855f80516020615ef383398151915255613e90565b506001600160401b0381116107ec576106f0816106eb6002546128a7565b6128df565b83601f821160011461077d578190859661071f949596926107725750508160011b915f199060031b1c19161790565b6002555b61072b575080f35b5f80516020615ed3833981519152805460ff60401b1916905551600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a180f35b013590505f8061060f565b60028552601f198216955f80516020615df383398151915291865b8881106107d4575083600195969798106107bb575b505050811b01600255610723565b01355f19600384901b60f8161c191690555f80806107ad565b90926020600181928686013581550194019101610798565b634e487b7160e01b84526041600452602484fd5b015190505f8061060f565b5f80516020615e3383398151915288528188209190601f198416895b81811061087357509160019391856106cd9796941061085b575b505050811b015f80516020615e33833981519152556106a8565b01515f1960f88460031b161c191690555f8080610841565b92936020600181928786015181550195019301610827565b5f80516020615e3383398151915288527f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b75601f840160051c810191602085106108f0575b601f0160051c01905b8181106108e55750610664565b8881556001016108d8565b90915081906108cf565b634e487b7160e01b87526041600452602487fd5b5f80516020615e1383398151915289528189209190601f1984168a5b818110610972575090846001959493921061095a575b505050811b015f80516020615e1383398151915255610633565b01515f1960f88460031b161c191690555f8080610940565b9293602060018192878601518155019501930161092a565b5f80516020615e1383398151915289527f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d601f840160051c810191602085106109ef575b601f0160051c01905b8181106109e457506105f3565b8981556001016109d7565b90915081906109ce565b634e487b7160e01b88526041600452602488fd5b60405162461bcd60e51b815260206004820152601560248201527424b73b30b634b21034b734ba34b0b61037bbb732b960591b6044820152606490fd5b68ffffffffffffffffff191668010000000000000001175f80516020615ed3833981519152555f61054b565b63f92ee8a960e01b8552600485fd5b9050155f610522565b303b15915061051a565b849150610510565b50346102a15760203660031901126102a15760043590610abf82613921565b15610ae5576040816020936001600160401b039352808452205460a01c16604051908152f35b60249163d2be005d60e01b8252600452fd5b50346102a157806003193601126102a1576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346102a157610498610b4e36612796565b91610b598135614402565b90610b6685858386614741565b50610b7084614d4f565b9690953395614eef565b507fc354af001adff0e8c35481c5ce3df3edee370c71572514d281e884c8cb552203610ba536612796565b9291909234610bdf575b610bd960405192839260408452610bc96040850183613b82565b91848303602086015235966127e9565b0390a280f35b610be7613ac8565b610baf565b50346102a15760403660031901126102a157610c23600435610c0c6122fc565b90610c1e610c1982612889565b613e4a565b613fbd565b5080f35b50346102a157610c3636612544565b969095919490936001600160a01b039092169190823b1561049b5791610c77939185809460405196879586948593636691f64760e01b855260048501612809565b03925af18015610cb957610ca4575b610ca0610c94868686612834565b60405191829182612490565b0390f35b610caf828092612653565b6102a15780610c86565b6040513d84823e3d90fd5b50806003193601126102a157610498613ac8565b50346102a157806003193601126102a157604051908060025490610cfb826128a7565b8085529160018116908115610da75750600114610d5d575b610ca084610d2381860382612653565b6040519182917f0000000000000000000000000000000000000000000000000000000000000000835260406020840152604083019061246c565b600281525f80516020615df3833981519152939250905b808210610d8d57509091508101602001610d2382610d13565b919260018160209254838588010152019101909291610d74565b60ff191660208087019190915292151560051b85019092019250610d239150839050610d13565b50346102a15760203660031901126102a1576020610ded600435613921565b6040519015158152f35b50346102a157610498610e0936612796565b91613887565b50346102a15760203660031901126102a157604060e091600435815280602052208054906001600160601b0360026001830154920154916040519360018060a01b03811685526001600160401b038160a01c16602086015262ffffff81871c16604086015260f81c6060850152818116608085015260601c1660a083015260c0820152f35b50346102a15760203660031901126102a1576104986004353361452a565b50346102a15760203660031901126102a1576020906001600160601b03906040906001600160a01b03610ee3612312565b16815260018452205460601c16604051908152f35b50346102a157806003193601126102a15760206040516001600160401b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102a15760603660031901126102a15780610f57612312565b6044356001600160401b038111610fd657610f7690369060040161233c565b6001600160a01b0390921691823b15610fd157610faf92849283604051809681958294636691f64760e01b845260243560048501612809565b03925af18015610cb957610fc05750f35b81610fca91612653565b6102a15780f35b505050fd5b5050fd5b50346102a157806003193601126102a15750610ca0604051610ffd604082612653565b60058152640352e302e360dc1b602082015260405191829160208352602083019061246c565b50346102a15761103236612399565b9a93969297909960018060a09b949b9897981b031691823b1561049b5791611075939185809460405196879586948593636691f64760e01b855260048501612809565b03925af18015610cb957611096575b610ca0610c948a8a8a8a8a8a8a6137b0565b6110a1828092612653565b6102a15780611084565b61277c565b50346102a157806003193601126102a15760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b50346102a157806003193601126102a157602060405161c3508152f35b50346102a157806003193601126102a15760206040516113888152f35b50346102a15760403660031901126102a15760406111416122fc565b9160043581525f80516020615eb3833981519152602052209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b50346102a15760203660031901126102a157600435611198613e0e565b30825260016020526001600160601b03604083205460601c166001600160601b036111c2836144f9565b16116112d1576111f86111d4826144f9565b30845260016020526001600160601b03604085209181835460601c16031690612d51565b60405163a9059cbb60e01b815233600482015260248101829052602081604481866001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af19081156112c6578391611297575b5015611288576040519081527fa315121c7f539fd811176ad2735d5d3981237b261889ec13ae4d617ad06e39bc60203092a280f35b6312171d8360e31b8252600482fd5b6112b9915060203d6020116112bf575b6112b18183612653565b810190612d84565b5f611253565b503d6112a7565b6040513d85823e3d90fd5b63112fed8b60e31b825230600452602482fd5b50346102a157806003193601126102a1575f80516020615e538339815191525415806113f6575b156113b95761135d9061131c61394e565b90611325613a1b565b90602061136b604051936113398386612653565b8385525f368137604051968796600f60f81b885260e08589015260e088019061246c565b90868203604088015261246c565b904660608601523060808601528260a086015284820360c08601528080855193848152019401925b8281106113a257505050500390f35b835185528695509381019392810192600101611393565b60405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606490fd5b505f80516020615ef3833981519152541561130b565b50346102a15760203660031901126102a1576114496020916040611431600435614402565b6001600160a01b03909116835260018552912061444b565b90506040519015158152f35b50346102a157610ca0610c9461146a366126e3565b959490949391936137b0565b50346102a157610498611488366124ef565b91612ef8565b50346102a15760203660031901126102a1576020906001600160601b03906040906001600160a01b036114bf612312565b16815260018452205416604051908152f35b50346102a15760203660031901126102a1576004356114ee613e0e565b30825260016020526001600160601b036040832054166001600160601b03611515836144f9565b16116112d157611524816144f9565b30835260016020526001600160601b03806040852092818454160316166001600160601b03198254161790558180808084335af1611560612e18565b5015611288576040519081527f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b6560203092a280f35b50346102a157610ca0610c946115aa366126e3565b95949094939193612dd6565b50346102a15760203660031901126102a15760043533825260016020526001600160601b03604083205460601c166001600160601b036115f5836144f9565b16116116da5761162b611607826144f9565b33845260016020526001600160601b03604085209181835460601c16031690612d51565b60405163a9059cbb60e01b815233600482015260248101829052602081604481866001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af19081156112c65783916116bb575b5015611288576040519081527fa315121c7f539fd811176ad2735d5d3981237b261889ec13ae4d617ad06e39bc60203392a280f35b6116d4915060203d6020116112bf576112b18183612653565b5f611686565b63112fed8b60e31b825233600452602482fd5b50346102a15760203660031901126102a157600460606040602093833581528085522060026040519161171f836125d3565b805460018060a01b03811684526001600160401b038160a01c168785015262ffffff8160e01c16604085015260f81c848401526001600160601b0360018201548181166080860152851c1660a0840152015460c082015201511615156040519015158152f35b50346102a15760a03660031901126102a1576004358160443560ff81168091036104a3577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b1561049f57829160e48392604051948593849263d505accf60e01b84523360048501523060248501528960448501526024356064850152608484015260643560a484015260843560c48401525af1611834575b50610498823361452a565b8161183e91612653565b6104a357815f611829565b50346102a157806003193601126102a1576020611864615a8a565b604051908152f35b50346102a157806003193601126102a157602090604051908152f35b50346102a157806003193601126102a1577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630036118e05760206040515f80516020615e938339815191528152f35b63703e46dd60e11b8152600490fd5b5060403660031901126102a157611904612312565b906024356001600160401b0381116104a3576119249036906004016126c5565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016308114908115611ab2575b50611aa357611966613e0e565b6040516352d1902d60e01b8152926001600160a01b0381169190602085600481865afa80958596611a6f575b506119ab57634c9c8ce360e01b84526004839052602484fd5b9091845f80516020615e938339815191528103611a5d5750813b15611a4b575f80516020615e9383398151915280546001600160a01b031916821790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8480a28151839015611a315780836020610c2395519101845af4611a2b612e18565b91615d94565b50505034611a3c5780f35b63b398979f60e01b8152600490fd5b634c9c8ce360e01b8452600452602483fd5b632a87526960e21b8552600452602484fd5b9095506020813d602011611a9b575b81611a8b60209383612653565b8101031261049b5751945f611992565b3d9150611a7e565b63703e46dd60e11b8252600482fd5b5f80516020615e93833981519152546001600160a01b0316141590505f611959565b50346102a15760203660031901126102a157600435611b15611af582614402565b6001600160a01b039091168085526001602052604085209092919061444b565b5015611e2e57818352826020526040832060405190611b33826125d3565b805460018060a01b03811683526001600160401b038160a01c16602084015262ffffff8160e01c16604084015260f81c60608301526001810154600260808401926001600160601b03831684526001600160601b0360a086019360601c168352015460c08401526004606084015116611e1a576001606084015116611e06576001600160401b03611bc384614079565b16421115611ddd5784865260208690526040862080546001600160f81b03811660f891821c60041790911b6001600160f81b0319161781558690600101556001600160601b038151166113888102908082046113881490151715611dc957611c406001600160601b039392612710611c4593049485915116612a64565b6144f9565b936002606060018060a01b038651169501511615155f14611d6557505060018060a01b03821685526001602052611c9660408620611c90856001600160601b03835460601c16612d31565b90612d51565b60405163a9059cbb60e01b815261dead60048201526024810182905291602083604481897f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af18015611d5a577f79ca7c80cf57b513ffdf8aa37ec70e40757f5e0d35219241860bb4b4c2fa7616946060946001600160601b0392611d3d575b5060405193845216602083015260018060a01b03166040820152a280f35b611d559060203d6020116112bf576112b18183612653565b611d1f565b6040513d88823e3d90fd5b9092506001600160601b0330933088526001602052611d9160408920611c908885835460601c16612d31565b511690865260016020526001600160601b03611db4604088209282845416612d31565b166001600160601b0319825416179055611c96565b634e487b7160e01b87526011600452602487fd5b6044866001600160401b0387611df287614079565b9063079c66ab60e41b845260045216602452fd5b631cfdeebb60e01b86526004859052602486fd5b633231064d60e11b86526004859052602486fd5b63d2be005d60e01b83526004829052602483fd5b50346102a157806003193601126102a15760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b50346102a157610ca0610c94611e92366124ef565b91612a71565b50346102a15760203660031901126102a15760043590611eb782613921565b15610ae557604081602093611f38935280845220600260405191611eda836125d3565b805460018060a01b03811684526001600160401b038160a01c168685015262ffffff8160e01c16604085015260f81c60608401526001600160601b036001820154818116608086015260601c1660a0840152015460c0820152614079565b6001600160401b0360405191168152f35b50346102a15760403660031901126102a157611f636122fc565b336001600160a01b03821603611f7f57610c2390600435613fbd565b63334bd91960e11b8252600482fd5b50346102a15760403660031901126102a157610c23600435611fae6122fc565b90611fbb610c1982612889565b613f19565b50346102a15760203660031901126102a15761049860043533613d3c565b50346102a157611fed36612544565b969095919490936001600160a01b039092169190823b1561049b579161202e939185809460405196879586948593636691f64760e01b855260048501612809565b03925af18015610cb95761204b575b610ca0610c94868686612a71565b612056828092612653565b6102a1578061203d565b50346102a15760203660031901126102a1576004356001600160401b0381116104a35761209190369060040161233c565b61209c929192613e0e565b6001600160401b038111612157576120b9816106eb6002546128a7565b81601f82116001146120ec57819083946120e694926107725750508160011b915f199060031b1c19161790565b60025580f35b60028352601f198216935f80516020615df383398151915291845b86811061213f5750836001959610612126575b505050811b0160025580f35b01355f19600384901b60f8161c191690555f808061211a565b90926020600181928686013581550194019101612107565b634e487b7160e01b82526041600452602482fd5b50346102a15760203660031901126102a1576020611864600435612889565b50346102a157806003193601126102a1576020604051620186a08152f35b50346102a157610ca0610c946121bd366124ef565b91612834565b3461224c576121d136612399565b97999598909691959294929091906001600160a01b0316803b1561224c576122139a5f80946040519d8e9586948593636691f64760e01b855260048501612809565b03925af196871561224157610ca098610c9498612231575b50612dd6565b5f61223b91612653565b5f61222b565b6040513d5f823e3d90fd5b5f80fd5b3461224c575f36600319011261224c576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461224c57602036600319011261224c576004359063ffffffff60e01b821680920361224c57602091637965db0b60e01b81149081156122d6575b5015158152f35b6301ffc9a760e01b149050836122cf565b35906001600160e01b03198216820361224c57565b602435906001600160a01b038216820361224c57565b600435906001600160a01b038216820361224c57565b35906001600160a01b038216820361224c57565b9181601f8401121561224c578235916001600160401b03831161224c576020838186019501011161224c57565b9181601f8401121561224c578235916001600160401b03831161224c576020808501948460051b01011161224c57565b60e060031982011261224c576004356001600160a01b038116810361224c5791602435916044356001600160401b03811161224c57816123db9160040161233c565b929092916064356001600160401b03811161224c57816123fd91600401612369565b929092916084356001600160401b03811161224c578161241f91600401612369565b9290929160a4356001600160401b03811161224c578161244191600401612369565b9290929160c435906001600160401b03821161224c57608090829003600319011261224c5760040190565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b602081016020825282518091526040820191602060408360051b8301019401925f915b8383106124c257505050505090565b90919293946020806124e0600193603f19868203018752895161246c565b970193019301919392906124b3565b604060031982011261224c576004356001600160401b03811161224c578161251991600401612369565b92909291602435906001600160401b03821161224c57608090829003600319011261224c5760040190565b60a060031982011261224c576004356001600160a01b038116810361224c5791602435916044356001600160401b03811161224c57816125869160040161233c565b929092916064356001600160401b03811161224c57816125a891600401612369565b92909291608435906001600160401b03821161224c57608090829003600319011261224c5760040190565b60e081019081106001600160401b038211176125ee57604052565b634e487b7160e01b5f52604160045260245ffd5b60a081019081106001600160401b038211176125ee57604052565b604081019081106001600160401b038211176125ee57604052565b606081019081106001600160401b038211176125ee57604052565b90601f801991011681019081106001600160401b038211176125ee57604052565b6001600160401b0381116125ee57601f01601f191660200190565b92919261269b82612674565b916126a96040519384612653565b82948184528183011161224c578281602093845f960137010152565b9080601f8301121561224c578160206126e09335910161268f565b90565b608060031982011261224c576004356001600160401b03811161224c578161270d91600401612369565b929092916024356001600160401b03811161224c578161272f91600401612369565b929092916044356001600160401b03811161224c578161275191600401612369565b92909291606435906001600160401b03821161224c57608090829003600319011261224c5760040190565b3461224c575f36600319011261224c5760206040515f8152f35b90604060031983011261224c576004356001600160401b03811161224c57610160818403600319011261224c5760040191602435906001600160401b03821161224c576127e59160040161233c565b9091565b908060209392818452848401375f828201840152601f01601f1916010190565b6040906126e09492815281602082015201916127e9565b356001600160a01b038116810361224c5790565b8260609261284492959495612a71565b92016001600160a01b0361285782612820565b165f5260016020526001600160601b0360405f20541680612876575050565b61288261288792612820565b613d3c565b565b5f525f80516020615eb3833981519152602052600160405f20015490565b90600182811c921680156128d5575b60208310146128c157565b634e487b7160e01b5f52602260045260245ffd5b91607f16916128b6565b601f81116128eb575050565b60025f5260205f20906020601f840160051c83019310612925575b601f0160051c01905b81811061291a575050565b5f815560010161290f565b9091508190612906565b6001600160401b0381116125ee5760051b60200190565b903590601e198136030182121561224c57018035906001600160401b03821161224c5760200191606082023603831361224c57565b919081101561298b576060020190565b634e487b7160e01b5f52603260045260245ffd5b3561ffff8116810361224c5790565b80511561298b5760200190565b805182101561298b5760209160051b010190565b919081101561298b5760051b8101359060be198136030182121561224c570190565b600211156129fb57565b634e487b7160e01b5f52602160045260245ffd5b903590601e198136030182121561224c57018035906001600160401b03821161224c5760200191813603831361224c57565b601f19810191908211612a5057565b634e487b7160e01b5f52601160045260245ffd5b91908203918211612a5057565b929192612a7f848383612ef8565b612a888261292f565b93612a966040519586612653565b828552601f19612aa58461292f565b015f5b818110612d2057505084612abb8461292f565b612ac86040519182612653565b848152601f19612ad78661292f565b013660208301376020830194612aed8685612946565b90505f5b818110612ce15750505f5b818110612b0c5750505050505050565b612b178183886129cf565b90612b2d612b2760608801612820565b8361409b565b90612b3883886129bb565b52612cd857612b4781856129bb565b5180612b5a575b50600191505b01612afc565b6060830135600281101561224c57600190612b74816129f1565b03612cc957612b866080840184612a0f565b50926040840135840191612b9a8b8a612946565b90915f19810191908211612a5057612bb19261297b565b916040612bc060208501612820565b930135926001600160601b03841680940361224c57612be260a0840184612a0f565b6001600160a01b039092169491929091853b1561224c5760205f8760019a612c508397612c3e996040519a8b998a98899663a12da43f60e01b8852013560048701526060602487015260648601906040602082013591016127e9565b848103600319016044860152916127e9565b0393f19081612cb9575b50612cb2577f5c5960582bfc7a494183b4e9a66bfe8ecffc07a83a48d136e732400f7b98bf5090612c89612e18565b92612ca86040519283928352604060208401523594604083019061246c565b0390a25b5f612b4e565b5050612cac565b5f612cc391612653565b5f612c5a565b63b90a25b160e01b5f5260045ffd5b60019150612b54565b612cf581612cef8a89612946565b9061297b565b9060018101808211612a5057612d1961ffff612d1260019561299f565b16876129bb565b5201612af1565b806060602080938a01015201612aa8565b906001600160601b03809116911601906001600160601b038211612a5057565b80546bffffffffffffffffffffffff60601b191660609290921b6bffffffffffffffffffffffff60601b16919091179055565b9081602091031261224c5751801515810361224c5790565b919081101561298b5760051b8101359061015e198136030182121561224c570190565b9082101561298b576127e59160051b810190612a0f565b919695949392905f5b818110612df557505050506126e0939450612834565b80612e128a610e098387612e0c600197898c612d9c565b93612dbf565b01612ddf565b3d15612e42573d90612e2982612674565b91612e376040519384612653565b82523d5f602084013e565b606090565b903590601e198136030182121561224c57018035906001600160401b03821161224c57602001918160061b3603831361224c57565b919081101561298b5760061b0190565b6020815260406020612ea884518383860152606085019061246c565b93015191015290565b359061ffff8216820361224c57565b35906001600160601b038216820361224c57565b90612eee90604093969594966060845260608401916127e9565b9460208201520152565b61ffff821161379757612f0a8261292f565b90612f186040519283612653565b828252601f19612f278461292f565b01366020840137612f378361292f565b90612f456040519283612653565b838252601f19612f548561292f565b013660208401376040850193612f6a8587612e47565b90505f5b8181106136dd5750505f5b81811061336b5750505050612f8d90614644565b612fa6612f9d6020850185612946565b91909385612e47565b612fb560608796939601612820565b9160405193608085018581106001600160401b038211176125ee57604052612fdc8161292f565b91612fea6040519384612653565b818352606060208401920281019036821161224c57915b81831061331a5750505083526130168161292f565b946130246040519687612653565b818652602086019160061b81019036821161224c57915b8183106132db575050506020820193845260408201928352606082019060018060a01b031681526040519260208401946020865260c08501935193608060408701528451809152602060e087019501905f5b818110613296575050505192603f19858203016060860152602080855192838152019401905f5b8181106132665750509051608085015250516001600160a01b031660a0830152819003601f19810182526020925f9290916130ef9082612653565b604051918291518091835e8101838152039060025afa15612241575f517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316916131418180612a0f565b843b1561224c5760405163ab750e7560e01b8152915f918391829161318d9188917f00000000000000000000000000000000000000000000000000000000000000009160048601612ed4565b0381875afa9081613256575b50613251576001600160401b037f000000000000000000000000000000000000000000000000000000000000000016421161324257806131d891612a0f565b919092803b1561224c57613227935f936040519586948593849363ab750e7560e01b85527f00000000000000000000000000000000000000000000000000000000000000009160048601612ed4565b03915afa8015612241576132385750565b5f61288791612653565b63439cc0cd60e01b5f5260045ffd5b505050565b5f61326091612653565b5f613199565b8251805161ffff1687526020908101516001600160e01b03191681880152604090960195909201916001016130b4565b8251805161ffff1688526020818101516001600160a01b0316818a01526040918201516001600160601b0316918901919091526060909701969092019160010161308d565b60408336031261224c57602060409182516132f58161261d565b6132fe86612eb1565b815261330b8387016122e7565b8382015281520192019161303b565b60608336031261224c57602060609160405161333581612638565b61333e86612eb1565b815261334b838701612328565b8382015261335b60408701612ec0565b6040820152815201920191613001565b6133768183856129cf565b9060c08236031261224c576040519160c083018381106001600160401b038211176125ee57604052803580845260208201358060208601526040830135918260408701526060840135600281101561224c576060870190815260808501356001600160401b03811161224c576133ef90369087016126c5565b906080880191825260a086019788356001600160401b03811161224c576020926134729260a061342460219436908d016126c5565b9101525193613432856129f1565b61343b856129f1565b516040519384918183019660ff60f81b9060f81b1687528051918291018484015e81015f838201520301601f198101835282612653565b519020916040519261348384612602565b8684526020840192835260408401918252606084018581526080850191825260a09060746040516134b48482612653565b818152736c66696c6c6d656e74446174614469676573742960601b608060208301927f4173736573736f72436f6d6d69746d656e742875696e7432353620696e64657884527f2c75696e743235362069642c627974657333322072657175657374446967657360408201527f742c6279746573333220636c61696d4469676573742c6279746573333220667560608201520152209551945193519051925193604051956020870197885260408701526060860152608085015283015260c082015260c0815261358460e082612653565b519020613591848a6129bb565b5261359c83886129bb565b5161364c576135f0937f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316926135da9190612a0f565b9490604051956135e98761261d565b369161268f565b84526020840152803b1561224c5761361f925f916040518080968194631599ead560e01b835260048301612e8c565b039161c350fa9182156122415760019261363c575b505b01612f79565b5f61364691612653565b5f613634565b613685937f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316926135da9190612a0f565b84526020840152803b1561224c576136b4925f916040518080968194631599ead560e01b835260048301612e8c565b03915afa918215612241576001926136cd575b50613636565b5f6136d791612653565b5f6136c7565b60206136f3826136ed8a8c612e47565b90612e7c565b013563ffffffff60e01b811680910361224c5761373861372e61ffff613726613721866136ed8f8f90612e47565b61299f565b1686886129cf565b60a0810190612a0f565b60049291921161224c57600161377061ffff613769613721878f978f6136ed9163ffffffff60e01b90351699612e47565b16896129bb565b52818103613782575050600101612f6e565b632e2ce35360e21b5f5260045260245260445ffd5b506377e4aa5360e11b5f5260045261ffff60245260445ffd5b919695949392905f5b8181106137cf57505050506126e0939450612a71565b806137e68a610e098387612e0c600197898c612d9c565b016137b9565b35906001600160401b038216820361224c57565b359063ffffffff8216820361224c57565b91908260e091031261224c57604051613829816125d3565b60c08082948035845260208101356020850152613848604082016137ec565b604085015261385960608201613800565b606085015261386a60808201613800565b608085015261387b60a08201613800565b60a08501520135910152565b916138a091833560201c6001600160a01b031684614741565b509060406138df611c406138cf6138b685614d4f565b90506001600160401b0342911610946080369101613811565b6001600160401b03421690614deb565b6001600160601b038251916138f383612638565b60018352602083018590521691018190526001607f1b911561391b576001607e1b5b1717905d565b5f613915565b61392d61394a91614402565b6001600160a01b039091165f90815260016020526040902061444b565b5090565b604051905f825f80516020615e13833981519152549161396d836128a7565b80835292600181169081156139fc5750600114613991575b61288792500383612653565b505f80516020615e138339815191525f90815290917f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d5b8183106139e057505090602061288792820101613985565b60209193508060019154838589010152019101909184926139c8565b6020925061288794915060ff191682840152151560051b820101613985565b604051905f825f80516020615e338339815191525491613a3a836128a7565b80835292600181169081156139fc5750600114613a5d5761288792500383612653565b505f80516020615e338339815191525f90815290917f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b755b818310613aac57505090602061288792820101613985565b6020919350806001915483858901015201910190918492613a94565b613ad1346144f9565b335f5260016020526001600160601b03613af260405f209282845416612d31565b166001600160601b03198254161790556040513481527fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c60203392a2565b9035603e198236030181121561224c570190565b9060038210156129fb5752565b9035601e198236030181121561224c5701602081359101916001600160401b03821161224c57813603831361224c57565b90813581526020820135607e198336030181121561224c57610160602083015282016001600160a01b03613bb582612328565b166101608301526001600160601b03613bd060208301612ec0565b16610180830152613be46040820182613b30565b9060806101a0840152813591600383101561224c57613c1c613c2f91613c12613c68956101e0880190613b44565b6020810190613b51565b60406102008701526102208601916127e9565b906001600160e01b031990613c46906060016122e7565b166101c0840152613c5a6040850185613b51565b9084830360408601526127e9565b613c756060840184613b30565b82820360608401528035600281101561224c57610140926040613cac859484613ca0613cbc966129f1565b84526020810190613b51565b91909281602082015201916127e9565b936080810135608085015260a081013560a08501526001600160401b03613ce560c083016137ec565b1660c085015263ffffffff613cfc60e08301613800565b1660e085015263ffffffff613d146101008301613800565b1661010085015263ffffffff613d2d6101208301613800565b16610120850152013591015290565b9060018060a01b03821691825f5260016020526001600160601b0360405f2054166001600160601b03613d6e846144f9565b1611613dfb575f8080848194613d83826144f9565b88845260016020526001600160601b03806040862092818454160316166001600160601b03198254161790555af1613db9612e18565b5015613dec5760207f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b6591604051908152a2565b6312171d8360e31b5f5260045ffd5b8263112fed8b60e31b5f5260045260245ffd5b335f9081525f80516020615e73833981519152602052604090205460ff1615613e3357565b63e2517d3f60e01b5f52336004525f60245260445ffd5b5f8181525f80516020615eb38339815191526020908152604080832033845290915290205460ff1615613e7a5750565b63e2517d3f60e01b5f523360045260245260445ffd5b6001600160a01b0381165f9081525f80516020615e73833981519152602052604090205460ff16613f14576001600160a01b03165f8181525f80516020615e7383398151915260205260408120805460ff191660011790553391907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8180a4600190565b505f90565b5f8181525f80516020615eb3833981519152602090815260408083206001600160a01b038616845290915290205460ff16613fb7575f8181525f80516020615eb3833981519152602090815260408083206001600160a01b0395909516808452949091528120805460ff19166001179055339291907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080a4600190565b50505f90565b5f8181525f80516020615eb3833981519152602090815260408083206001600160a01b038616845290915290205460ff1615613fb7575f8181525f80516020615eb3833981519152602090815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b906001600160401b03809116911601906001600160401b038211612a5057565b6126e09062ffffff60406001600160401b036020840151169201511690614059565b90916060925f928035906140ae82614402565b969060018060a01b0381165f5260016020526140cd8860405f2061444b565b91819991936040516140de816125d3565b5f81525f60208201525f60408201525f828201525f60808201525f60a08201525f60c08201529a614386575b50602085013599614119615549565b508a5c94614125615549565b506040516001607f1b8716151561413b82612638565b8082526001600160601b03604060208401936001607e1b8b161515855201981688525f1461433357516142c35791878995949288945b156142ab5760208101516001600160401b0316421161428e5761419497506158fd565b955b8651614250575b6040519060208252836020830152604082015260408201356060820152606082013591600283101561224c5761424b8291846141f97faf1db8f86d3f32029a484ff54c7ac1d7ef8f038ab050fc065af9e82eb9b850ca966129f1565b608084015261422d6142226142116080840184613b51565b60c060a088015260e08701916127e9565b9160a0810190613b51565b848303601f190160c08601526001600160a01b0390981697906127e9565b0390a3565b7f210e4fd706e561df48472433bcc50b4589f2c13e784e9992f4c3e6de26eb35646040516020815280614286602082018b61246c565b0390a161419d565b9291906001600160601b036142a5985116936156a3565b95614196565b5050906001600160601b036142a59651169188615567565b5050505050505092505091506040519063873fd26b60e01b60208301526024820152602481526142f4604482612653565b7f210e4fd706e561df48472433bcc50b4589f2c13e784e9992f4c3e6de26eb3564604051602081528061432a602082018561246c565b0390a190600190565b508080614379575b156143665761434982614079565b6001600160401b03429116106142c3579187899594928894614171565b8763c274d3e360e01b5f5260045260245ffd5b508b60c08301511461433b565b909950855f525f602052600260405f206001600160601b03604051936143ab856125d3565b825460018060a01b03811686526001600160401b038160a01c16602087015262ffffff8160e01c16604087015260f81c8186015260018301549082821660808701521c1660a0840152015460c0820152985f61410a565b906001600160c11b0319821661442a57602082901c6001600160a01b03169163ffffffff1690565b6341abc80160e01b5f5260045ffd5b630200000082101561298b5701905f90565b63ffffffff82169190602083101561449d576401fffffffe905460c01c9160011b169180830460021490151715612a50576001600160401b03906003831b1616901c9060026001831615159216151590565b916144a89150612a41565b908160011b9180830460021481151715612a505760ff916144d89160071c6001600160f81b031690600101614439565b90549060031b1c9116906003821b16901c9060026001831615159216151590565b6001600160601b038111614513576001600160601b031690565b6306dfcc6560e41b5f52606060045260245260445ffd5b6040516323b872dd60e01b81526001600160a01b03918216600482018190523060248301526044820184905292917f000000000000000000000000000000000000000000000000000000000000000016906020905f9060649082855af19081601f3d1160015f5114161516614637575b50156145fb576020816145f26145d07ff645c19720906ca336d36d26058a9489c6c757fe35843b75a74e3b8aa972ecf5946144f9565b855f5260018452611c9060405f20916001600160601b03835460601c16612d31565b604051908152a2565b60405162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b6044820152606490fd5b3b153d171590505f61459a565b80511561442a5760018151146147385780515b6001811161466d5750614669906129ae565b5190565b60018101808211612a505760011c905f5b8160011c81106146cc575060018082161461469a575b50614657565b5f198101908111612a50576146af90836129bb565b515f198201828111612a50576146c590846129bb565b525f614694565b600181901b906001600160ff1b0381168103612a50576146ec82866129bb565b5160018301809311612a5057614704600193876129bb565b519081811015614729575f5260205260405f205b61472282876129bb565b520161467e565b905f5260205260405f20614718565b614669906129ae565b919392906101608336031261224c5760405161475c81612602565b83359384825260208101356001600160401b03811161224c57810190813603916080831261224c57604080519361479285612638565b1261224c576040516147a38161261d565b6147ac82612328565b81526147ba60208301612ec0565b6020820152835260408101356001600160401b03811161224c57810160408136031261224c57604051916147ed8361261d565b8135600381101561224c5783526020820135926001600160401b03841161224c57614820606093614830953691016126c5565b60208201526020860152016122e7565b60408301526020830191825260408101356001600160401b03811161224c57810136601f8201121561224c5761486d90369060208135910161268f565b906040840191825260608101356001600160401b03811161224c5781019060408236031261224c57604051916148a28361261d565b8035600281101561224c57835260208101356001600160401b03811161224c576148ce913691016126c5565b6020830152606085019182526148e8903690608001613811565b90608085019182526148f8615455565b6149006152bb565b614908615305565b9061491161534a565b614919615408565b6149216154dc565b916040519485946020860197805160208192018a5e860160208101915f83528051926020849201905e016020015f815281516020819301825e015f815281516020819301825e015f815281516020819301825e015f815281516020819301825e015f815203601f19810182526149979082612653565b519020945193516149a66154dc565b6149ae6152bb565b6149b6615408565b90604051918291602083019480516020819201875e830160208101915f83528051926020849201905e016020015f815281516020819301825e015f815203601f1981018252614a059082612653565b519020908051614a136152bb565b8051906020012090600160a01b6001900381511690602001516001600160601b031660405191602083019384526040830152606082015260608152614a59608082612653565b519020906020810151614a6a615408565b805190602001209080519060038210156129fb576020015160208151910120614aa160405192602084019485526040840190613b44565b606082015260608152614ab5608082612653565b51902090604063ffffffff60e01b9101511690604051926020840194855260408401526060830152608082015260808152614af160a082612653565b5190209251602081519101209051614b07615305565b60208151910120906020815191614b1d836129f1565b0151602081519101206040519160208301938452614b3a816129f1565b6040830152606082015260608152614b53608082612653565b5190209151614b6061534a565b604051614b8c6020828180820195805191829101875e81015f838201520301601f198101835282612653565b519020908051906020810151906001600160401b0360408201511663ffffffff60608301511663ffffffff6080840151169160c063ffffffff60a08601511694015194604051966020880198895260408801526060870152608086015260a085015260c084015260e08301526101008201526101008152614c0f61012082612653565b51902092604051946020860196875260408601526060850152608084015260a083015260c082015260c08152614c4660e082612653565b51902094614c5b86614c56615a8a565b615b3f565b93600160c01b1615614d185791602091614c8c93604051809581948293630b135d3f60e11b84528960048501612809565b03916001600160a01b0316620186a0fa908115612241575f91614cd5575b506001600160e01b0319166374eca2c160e11b01614cc6579190565b638baa579f60e01b5f5260045ffd5b90506020813d602011614d10575b81614cf060209383612653565b8101031261224c57516001600160e01b03198116810361224c575f614caa565b3d9150614ce3565b614d2a614d3091614d3994369161268f565b84615b5c565b90939193615b96565b6001600160a01b03908116911603614cc6579190565b614d5d906080369101613811565b90815160208301511061442a5763ffffffff606083015116608083019063ffffffff8251161061442a5763ffffffff90511660a083019063ffffffff8251161061442a57614dca9063ffffffff6001600160401b036040614dbd87615af1565b9601511691511690614059565b9162ffffff6001600160401b03614de18386614ecf565b161161442a579190565b9060408201906001600160401b0380835116911690811115614ec9576001600160401b03614e1884615af1565b168111614ec2576001600160401b03825116906001600160401b03614e49606086019363ffffffff85511690614059565b16811115614e5b575050506020015190565b614e88906001600160401b0363ffffffff614e7c6020880151885190612a64565b94511694511690612a64565b925192818102918183041490151715612a50578115614eae57048101809111612a505790565b634e487b7160e01b5f52601260045260245ffd5b5050505f90565b50505190565b906001600160401b03809116911603906001600160401b038211612a5057565b9590929796949360018060a01b031697885f526001602052614f148560405f2061444b565b906152a757615293576001600160401b0386169889421161527b57614f42611c406138cf3660808c01613811565b96815f52600160205260405f20996001600160601b038b5416946001600160601b038a1693848710615269575060018060a01b031698895f52600160205260405f20906001600160601b03825460601c16966101408d013580981061525657918d6001600160601b0380614fe894614fed9897960316166001600160601b03198254161790556001600160601b03614fd9896144f9565b81835460601c16031690612d51565b614ecf565b926001600160401b03841662ffffff811161523f575061500c906144f9565b60405193615019856125d3565b88855260208086019c8d5262ffffff90911660408087019182525f60608801818152608089019687526001600160601b0390951660a0808a0191825260c08a019889528e35808452958390529290912097519e51925194519290911b67ffffffffffffffff60a01b166001600160a01b039e909e169d909d1760e09390931b62ffffff60e01b169290921760f89290921b6001600160f81b031916919091178455996001840191516001600160601b03166001600160601b03166001600160601b0319835416178255516001600160601b03166150f591612d51565b51906002015563ffffffff831692602084105f146151b0576401fffffffe9060011b169280840460021490151715612a505785546001600160c01b038116600190941b6001600160401b031660c091821c17901b6001600160c01b031916929092179094557fe5e43c93dc0ec595ed3b122bdc6d39a480e9d17fb6812e0f90cfc4ba33b0969e936151ab915b61519d6040519586958652606060208701526060860190613b82565b9184830360408601526127e9565b0390a2565b50916151bb90612a41565b918260011b9583870460021484151715612a50577fe5e43c93dc0ec595ed3b122bdc6d39a480e9d17fb6812e0f90cfc4ba33b0969e966151ab9461523a9260ff916001916152179160071c6001600160f81b0316908301614439565b929093161b82548260031b1c179082549060031b91821b915f19901b1916179055565b615181565b6306dfcc6560e41b5f52601860045260245260445ffd5b8b63112fed8b60e31b5f5260045260245ffd5b63112fed8b60e31b5f5260045260245ffd5b898863cfe6a8fd60e01b5f523560045260245260445ffd5b86631cfdeebb60e01b5f523560045260245ffd5b8763a905765160e01b5f523560045260245ffd5b604051906152ca606083612653565b60268252654c696d69742960d01b6040837f43616c6c6261636b286164647265737320616464722c75696e7439362067617360208201520152565b60405190615314606083612653565b60218252602960f81b6040837f496e7075742875696e743820696e707574547970652c6279746573206461746160208201520152565b6040519061535960c083612653565b60888252676c61746572616c2960c01b60a0837f4f666665722875696e74323536206d696e50726963652c75696e74323536206d60208201527f617850726963652c75696e7436342072616d70557053746172742c75696e743360408201527f322072616d705570506572696f642c75696e743332206c6f636b54696d656f7560608201527f742c75696e7433322074696d656f75742c75696e74323536206c6f636b436f6c60808201520152565b60405190615417606083612653565b602982526874657320646174612960b81b6040837f5072656469636174652875696e743820707265646963617465547970652c627960208201520152565b60405190615464608083612653565b605a82527f6c2c496e70757420696e7075742c4f66666572206f66666572290000000000006060837f50726f6f66526571756573742875696e743235362069642c526571756972656d60208201527f656e747320726571756972656d656e74732c737472696e6720696d616765557260408201520152565b604051906154eb608083612653565b60438252626f722960e81b6060837f526571756972656d656e74732843616c6c6261636b2063616c6c6261636b2c5060208201527f7265646963617465207072656469636174652c6279746573342073656c65637460408201520152565b6040519061555682612638565b5f6040838281528260208201520152565b9694959192939096606096615656575f80516020615f1383398151915260209596979860018060a01b031693845f52600187526155a860405f209687615c7f565b6040519387013584526001600160a01b0316958693a36001600160601b03825416906001600160601b038516821061562a57506001600160601b038481920316166001600160601b03198254161790555f5260016020526001600160601b0361561860405f209282845416612d31565b166001600160601b0319825416179055565b949550505050506040519063112fed8b60e31b60208301526024820152602481526126e0604482612653565b955050505050915060405190631cfdeebb60e01b60208301526024820152602481526126e0604482612653565b906001600160601b03809116911603906001600160601b038211612a5057565b93959796929490946060986001606087015116151580156158ed575b6158be571561586d575b50506001600160a01b03165f908152600160205260408120608093909301516001600160601b03868116969592949116858188111561583a578161570c91615683565b906001600160601b03835416906001600160601b0383168210615815575b5082546bffffffffffffffffffffffff19169190036001600160601b03161790555b5f90815260208190526040902080546affffffffffffffffffffff60a01b81166001600160a01b0384169081176001600160a01b0319929092161760f890811c600217901b6001600160f81b03191617905560018060a01b03165f52600160205260405f206001600160601b036157c68482845416612d31565b166001600160601b03198254161790556157de575050565b6001600160601b039192935060405192636008fdcb60e01b60208501526024840152166044820152604481526126e0606482612653565b96509450506001600160601b038061582e868098612d31565b9660019691509161572a565b61584f615858916001600160601b0393615683565b82845416612d31565b166001600160601b031982541617905561574c565b6001600160a01b0383165f90815260016020526040902061588e9190615c7f565b60405160209182013581526001600160a01b0384169186915f80516020615f138339815191529190a35f806156c9565b5050505050509192505060405190631cfdeebb60e01b60208301526024820152602481526126e0604482612653565b50600260608701511615156156bf565b9391909296959496606097600160608701511615158015615a7a575b615a4c5715615a01575b505082516001600160a01b0394851694168414801591906159ed575b506159c35760a061288793926001600160601b03925f525f6020525f6001604082208160f81b828060f81b03825416178155015582608082015116845f5260016020528361599460405f209282845416612d31565b168419825416179055015116905f526001602052611c9060405f20916001600160601b03835460601c16612d31565b92935050506040519063a905765160e01b60208301526024820152602481526126e0604482612653565b9050602060c084015191013514155f61593f565b615a1d9160018060a01b03165f52600160205260405f20615c7f565b60405160208281013582526001600160a01b0386169184915f80516020615f1383398151915291a35f80615923565b50505050929350505060405190631cfdeebb60e01b60208301526024820152602481526126e0604482612653565b5060026060870151161515615919565b615a92615bf6565b615a9a615c4d565b6040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a08152615aeb60c082612653565b51902090565b6126e09063ffffffff60806001600160401b036040840151169201511690614059565b60ff5f80516020615ed38339815191525460401c1615615b3057565b631afcd79f60e31b5f5260045ffd5b6042916040519161190160f01b8352600283015260228201522090565b8151919060418303615b8c57615b859250602082015190606060408401519301515f1a90615d1c565b9192909190565b50505f9160029190565b60048110156129fb5780615ba8575050565b60018103615bbf5763f645eedf60e01b5f5260045ffd5b60028103615bda575063fce698f760e01b5f5260045260245ffd5b600314615be45750565b6335e2f38360e21b5f5260045260245ffd5b615bfe61394e565b8051908115615c0e576020012090565b50505f80516020615e53833981519152548015615c285790565b507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47090565b615c55613a1b565b8051908115615c65576020012090565b50505f80516020615ef3833981519152548015615c285790565b9063ffffffff8116906020821015615cdc576401fffffffe9060011b169080820460021490151715612a505781546001600160c01b038116600290921b6001600160401b031660c091821c17901b6001600160c01b031916179055565b50615ce690612a41565b8060011b9080820460021481151715612a50576128879260ff916002916152179160071c6001600160f81b031690600101614439565b91906fa2a8918ca85bafe22016d0b997e4df60600160ff1b038411615d89579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15612241575f516001600160a01b03811615615d7f57905f905f90565b505f906001905f90565b5050505f9160039190565b90615db85750805115615da957602081519101fd5b63d6bda27560e01b5f5260045ffd5b81511580615de9575b615dc9575090565b639996b31560e01b5f9081526001600160a01b0391909116600452602490fd5b50803b15615dc156fe405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acea16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d103a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100b7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d101120ea8d7610aa46e4a31b254c5d07489ebe8f1a93dc7bbbe60eaf3db2c62c0cca164736f6c634300081a000a")] contract BoundlessMarket { constructor(address verifier, bytes32 assessorId, bytes32 deprecatedAssessorId, uint32 deprecatedAssessorDuration, address stakeTokenContract) {} function initialize(address initialOwner, string calldata imageUrl) {}