diff --git a/packages/contract-addresses/CHANGELOG.json b/packages/contract-addresses/CHANGELOG.json index 5c6a617fed..d7119bc57a 100644 --- a/packages/contract-addresses/CHANGELOG.json +++ b/packages/contract-addresses/CHANGELOG.json @@ -9,6 +9,18 @@ { "note": "Update `ERC20BridgeSampler` address on mainnet and kovan.", "pr": 2476 + }, + { + "note": "Removed OrderValidator and DutchAuction addresses", + "pr": 2469 + }, + { + "note": "Added Broker and GodsUnchainedValidator addresses", + "pr": 2469 + }, + { + "note": "Updated Forwarder addresses", + "pr": 2469 } ], "timestamp": 1581204851 diff --git a/packages/contract-addresses/addresses.json b/packages/contract-addresses/addresses.json index 19c2f01fd6..b3736b7126 100644 --- a/packages/contract-addresses/addresses.json +++ b/packages/contract-addresses/addresses.json @@ -4,13 +4,11 @@ "exchange": "0x61935cbdd02287b511119ddb11aeb42f1593b7ef", "erc20Proxy": "0x95e6f48254609a6ee006f7d493c8e5fb97094cef", "erc721Proxy": "0xefc70a1b18c432bdc64b596838b4d138f6bc6cad", - "forwarder": "0x4ef40d1bf0983899892946830abf99eca2dbc5ce", - "orderValidator": "0x0000000000000000000000000000000000000000", + "forwarder": "0x4aa817c6f383c8e8ae77301d18ce48efb16fd2be", "zrxToken": "0xe41d2489571d322189246dafa5ebde1f4699f498", "etherToken": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", "assetProxyOwner": "0xdffe798c7172dd6deb32baee68af322e8f495ce0", "zeroExGovernor": "0x7d3455421bbc5ed534a83c88fd80387dc8271392", - "dutchAuction": "0x0000000000000000000000000000000000000000", "coordinatorRegistry": "0x45797531b873fd5e519477a070a955764c1a5b07", "coordinator": "0x38a795580d0f687e399913a00ddef6a17612c722", "multiAssetProxy": "0xef701d5389ae74503d633396c4d654eabedc9d78", @@ -26,7 +24,9 @@ "kyberBridge": "0xf342f3a80fdc9b48713d58fe97e17f5cc764ee62", "eth2DaiBridge": "0xe3379a1956f4a79f39eb2e87bb441419e167538e", "chaiBridge": "0x77c31eba23043b9a72d13470f3a3a311344d7438", - "dydxBridge": "0x55dc8f21d20d4c6ed3c82916a438a413ca68e335" + "dydxBridge": "0x55dc8f21d20d4c6ed3c82916a438a413ca68e335", + "godsUnchainedValidator": "0x09A379Ef7218BCFD8913fAa8B281ebc5A2E0bC04", + "broker": "0xd4690a51044db77D91d7Aa8f7a3a5ad5dA331Af0" }, "3": { "erc20Proxy": "0xb1408f4c245a23c31b98d2c626777d4c0d766caa", @@ -37,9 +37,7 @@ "exchange": "0xfb2dd2a1366de37f7241c83d47da58fd503e2c64", "assetProxyOwner": "0x0000000000000000000000000000000000000000", "zeroExGovernor": "0x53993733d41a88ae86f77a18a024e5548ee26579", - "forwarder": "0x14e931e2439e211a13576bbec643c9130cbdd0c8", - "orderValidator": "0x0000000000000000000000000000000000000000", - "dutchAuction": "0x0000000000000000000000000000000000000000", + "forwarder": "0xe2bfd35306495d11e3c9db0d8de390cda24563cf", "coordinatorRegistry": "0x403cc23e88c17c4652fb904784d1af640a6722d9", "coordinator": "0x6ff734d96104965c9c1b0108f83abc46e6e501df", "multiAssetProxy": "0xab8fbd189c569ccdee3a4d929bb7f557be4028f6", @@ -55,7 +53,9 @@ "erc20BridgeSampler": "0x0000000000000000000000000000000000000000", "kyberBridge": "0x0000000000000000000000000000000000000000", "chaiBridge": "0x0000000000000000000000000000000000000000", - "dydxBridge": "0x0000000000000000000000000000000000000000" + "dydxBridge": "0x0000000000000000000000000000000000000000", + "godsUnchainedValidator": "0xd4690a51044db77D91d7Aa8f7a3a5ad5dA331Af0", + "broker": "0x4Aa817C6f383C8e8aE77301d18Ce48efb16Fd2BE" }, "4": { "exchangeV2": "0xbff9493f92a3df4b0429b6d00743b3cfb4c85831", @@ -66,9 +66,7 @@ "etherToken": "0xc778417e063141139fce010982780140aa0cd5ab", "assetProxyOwner": "0x0000000000000000000000000000000000000000", "zeroExGovernor": "0x3f46b98061a3e1e1f41dff296ec19402c298f8a9", - "forwarder": "0xd67f2f346f6e85db70632d9f18f50e04192ab54d", - "orderValidator": "0x0000000000000000000000000000000000000000", - "dutchAuction": "0x0000000000000000000000000000000000000000", + "forwarder": "0x263ccc190ccb1cb3342ab07e50f03edb2f05aa36", "coordinatorRegistry": "0x1084b6a398e47907bae43fec3ff4b677db6e4fee", "coordinator": "0x70c5385ee5ee4629ef72abd169e888c8b4a12238", "multiAssetProxy": "0xb34cde0ad3a83d04abebc0b66e75196f22216621", @@ -84,7 +82,9 @@ "erc20BridgeSampler": "0x0000000000000000000000000000000000000000", "kyberBridge": "0x0000000000000000000000000000000000000000", "chaiBridge": "0x0000000000000000000000000000000000000000", - "dydxBridge": "0x0000000000000000000000000000000000000000" + "dydxBridge": "0x0000000000000000000000000000000000000000", + "godsUnchainedValidator": "0x0000000000000000000000000000000000000000", + "broker": "0x0000000000000000000000000000000000000000" }, "42": { "erc20Proxy": "0xf1ec01d6236d3cd881a0bf0130ea25fe4234003e", @@ -95,9 +95,7 @@ "exchange": "0x4eacd0af335451709e1e7b570b8ea68edec8bc97", "assetProxyOwner": "0x0000000000000000000000000000000000000000", "zeroExGovernor": "0x6ff734d96104965c9c1b0108f83abc46e6e501df", - "forwarder": "0x2759a4c639fa4882d6d64973630ef81faf901d27", - "orderValidator": "0x0000000000000000000000000000000000000000", - "dutchAuction": "0x0000000000000000000000000000000000000000", + "forwarder": "0x263ccc190ccb1cb3342ab07e50f03edb2f05aa36", "coordinatorRegistry": "0x09fb99968c016a3ff537bf58fb3d9fe55a7975d5", "coordinator": "0xd29e59e51e8ab5f94121efaeebd935ca4214e257", "multiAssetProxy": "0xf6313a772c222f51c28f2304c0703b8cf5428fd8", @@ -113,7 +111,9 @@ "erc20BridgeSampler": "0x76a3d21fc9c16afd29eb12a5bdcedd5ddbf24357", "kyberBridge": "0xde7b2747624a647600fdb349184d0448ab954929", "chaiBridge": "0x0000000000000000000000000000000000000000", - "dydxBridge": "0x0000000000000000000000000000000000000000" + "dydxBridge": "0x0000000000000000000000000000000000000000", + "godsUnchainedValidator": "0x0000000000000000000000000000000000000000", + "broker": "0x0000000000000000000000000000000000000000" }, "1337": { "erc20Proxy": "0x1dc4c1cefef38a777b15aa20260a54e584b16c48", @@ -126,8 +126,6 @@ "erc20BridgeProxy": "0x038f9b392fb9a9676dbaddf78ea5fdbf6c7d9710", "zeroExGovernor": "0x0000000000000000000000000000000000000000", "forwarder": "0xe704967449b57b2382b7fa482718748c13c63190", - "orderValidator": "0x0000000000000000000000000000000000000000", - "dutchAuction": "0x0000000000000000000000000000000000000000", "coordinatorRegistry": "0xaa86dda78e9434aca114b6676fc742a18d15a1cc", "coordinator": "0x4d3d5c850dd5bd9d6f4adda3dd039a3c8054ca29", "multiAssetProxy": "0xcfc18cec799fbd1793b5c43e773c98d4d61cc2db", @@ -142,6 +140,8 @@ "erc20BridgeSampler": "0x0000000000000000000000000000000000000000", "kyberBridge": "0x0000000000000000000000000000000000000000", "chaiBridge": "0x0000000000000000000000000000000000000000", - "dydxBridge": "0x0000000000000000000000000000000000000000" + "dydxBridge": "0x0000000000000000000000000000000000000000", + "godsUnchainedValidator": "0x0000000000000000000000000000000000000000", + "broker": "0x0000000000000000000000000000000000000000" } } diff --git a/packages/contract-artifacts/CHANGELOG.json b/packages/contract-artifacts/CHANGELOG.json index f708d61cd8..27fed82bb5 100644 --- a/packages/contract-artifacts/CHANGELOG.json +++ b/packages/contract-artifacts/CHANGELOG.json @@ -1,4 +1,17 @@ [ + { + "version": "3.6.0", + "changes": [ + { + "note": "Add Broker and GodsUnchainedValidator artifacts", + "pr": 2469 + }, + { + "note": "Updated Forwarder artifact", + "pr": 2469 + } + ] + }, { "version": "3.5.0", "changes": [ diff --git a/packages/contract-artifacts/artifacts/Broker.json b/packages/contract-artifacts/artifacts/Broker.json new file mode 100644 index 0000000000..c2b63cd890 --- /dev/null +++ b/packages/contract-artifacts/artifacts/Broker.json @@ -0,0 +1,206 @@ +{ + "schemaVersion": "2.0.0", + "contractName": "Broker", + "compilerOutput": { + "abi": [ + { + "inputs": [ + { "internalType": "address", "name": "exchange", "type": "address" }, + { "internalType": "address", "name": "weth", "type": "address" } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + }, + { "payable": true, "stateMutability": "payable", "type": "fallback" }, + { + "constant": false, + "inputs": [ + { "internalType": "uint256[]", "name": "brokeredTokenIds", "type": "uint256[]" }, + { + "components": [ + { "internalType": "address", "name": "makerAddress", "type": "address" }, + { "internalType": "address", "name": "takerAddress", "type": "address" }, + { "internalType": "address", "name": "feeRecipientAddress", "type": "address" }, + { "internalType": "address", "name": "senderAddress", "type": "address" }, + { "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "makerFee", "type": "uint256" }, + { "internalType": "uint256", "name": "takerFee", "type": "uint256" }, + { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" }, + { "internalType": "uint256", "name": "salt", "type": "uint256" }, + { "internalType": "bytes", "name": "makerAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "takerAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" } + ], + "internalType": "struct LibOrder.Order[]", + "name": "orders", + "type": "tuple[]" + }, + { "internalType": "uint256[]", "name": "takerAssetFillAmounts", "type": "uint256[]" }, + { "internalType": "bytes[]", "name": "signatures", "type": "bytes[]" }, + { "internalType": "bytes4", "name": "batchFillFunctionSelector", "type": "bytes4" }, + { "internalType": "uint256[]", "name": "ethFeeAmounts", "type": "uint256[]" }, + { "internalType": "address payable[]", "name": "feeRecipients", "type": "address[]" } + ], + "name": "batchBrokerTrade", + "outputs": [ + { + "components": [ + { "internalType": "uint256", "name": "makerAssetFilledAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "takerAssetFilledAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "makerFeePaid", "type": "uint256" }, + { "internalType": "uint256", "name": "takerFeePaid", "type": "uint256" }, + { "internalType": "uint256", "name": "protocolFeePaid", "type": "uint256" } + ], + "internalType": "struct LibFillResults.FillResults[]", + "name": "fillResults", + "type": "tuple[]" + } + ], + "payable": true, + "stateMutability": "payable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "uint256[]", "name": "brokeredTokenIds", "type": "uint256[]" }, + { + "components": [ + { "internalType": "address", "name": "makerAddress", "type": "address" }, + { "internalType": "address", "name": "takerAddress", "type": "address" }, + { "internalType": "address", "name": "feeRecipientAddress", "type": "address" }, + { "internalType": "address", "name": "senderAddress", "type": "address" }, + { "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "makerFee", "type": "uint256" }, + { "internalType": "uint256", "name": "takerFee", "type": "uint256" }, + { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" }, + { "internalType": "uint256", "name": "salt", "type": "uint256" }, + { "internalType": "bytes", "name": "makerAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "takerAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" } + ], + "internalType": "struct LibOrder.Order", + "name": "order", + "type": "tuple" + }, + { "internalType": "uint256", "name": "takerAssetFillAmount", "type": "uint256" }, + { "internalType": "bytes", "name": "signature", "type": "bytes" }, + { "internalType": "bytes4", "name": "fillFunctionSelector", "type": "bytes4" }, + { "internalType": "uint256[]", "name": "ethFeeAmounts", "type": "uint256[]" }, + { "internalType": "address payable[]", "name": "feeRecipients", "type": "address[]" } + ], + "name": "brokerTrade", + "outputs": [ + { + "components": [ + { "internalType": "uint256", "name": "makerAssetFilledAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "takerAssetFilledAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "makerFeePaid", "type": "uint256" }, + { "internalType": "uint256", "name": "takerFeePaid", "type": "uint256" }, + { "internalType": "uint256", "name": "protocolFeePaid", "type": "uint256" } + ], + "internalType": "struct LibFillResults.FillResults", + "name": "fillResults", + "type": "tuple" + } + ], + "payable": true, + "stateMutability": "payable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "from", "type": "address" }, + { "internalType": "address", "name": "to", "type": "address" }, + { "internalType": "uint256[]", "name": "", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, + { "internalType": "bytes", "name": "data", "type": "bytes" } + ], + "name": "safeBatchTransferFrom", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + } + ], + "devdoc": { + "methods": { + "batchBrokerTrade(uint256[],(address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],uint256[],bytes[],bytes4,uint256[],address[])": { + "details": "Fills multiple property-based orders by the given amounts using the given assets. Pays protocol fees using either the ETH supplied by the taker to the transaction or WETH acquired from the maker during settlement. The final WETH balance is sent to the taker.", + "params": { + "batchFillFunctionSelector": "The selector for either `batchFillOrders`, `batchFillOrKillOrders`, or `batchFillOrdersNoThrow`.", + "brokeredTokenIds": "Token IDs specified by the taker to be used to fill the orders.", + "ethFeeAmounts": "Amounts of ETH, denominated in Wei, that are paid to corresponding feeRecipients.", + "feeRecipients": "Addresses that will receive ETH when orders are filled.", + "orders": "The property-based orders to fill. The format of a property-based order is the same as that of a normal order, except the takerAssetData. Instaed of specifying a specific ERC721 asset, the takerAssetData should be ERC1155 assetData where the underlying tokenAddress is this contract's address and the desired properties are encoded in the extra data field. Also note that takerFees must be denominated in WETH (or zero).", + "signatures": "The makers' signatures for the given orders.", + "takerAssetFillAmounts": "The amounts to fill the orders by." + }, + "return": "fillResults Amounts filled and fees paid by the makers and taker." + }, + "brokerTrade(uint256[],(address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes),uint256,bytes,bytes4,uint256[],address[])": { + "details": "Fills a single property-based order by the given amount using the given assets. Pays protocol fees using either the ETH supplied by the taker to the transaction or WETH acquired from the maker during settlement. The final WETH balance is sent to the taker.", + "params": { + "brokeredTokenIds": "Token IDs specified by the taker to be used to fill the orders.", + "ethFeeAmounts": "Amounts of ETH, denominated in Wei, that are paid to corresponding feeRecipients.", + "feeRecipients": "Addresses that will receive ETH when orders are filled.", + "fillFunctionSelector": "The selector for either `fillOrder` or `fillOrKillOrder`.", + "order": "The property-based order to fill. The format of a property-based order is the same as that of a normal order, except the takerAssetData. Instaed of specifying a specific ERC721 asset, the takerAssetData should be ERC1155 assetData where the underlying tokenAddress is this contract's address and the desired properties are encoded in the extra data field. Also note that takerFees must be denominated in WETH (or zero).", + "signature": "The maker's signature of the given order.", + "takerAssetFillAmount": "The amount to fill the order by." + }, + "return": "fillResults Amounts filled and fees paid by the maker and taker." + }, + "constructor": { "params": { "exchange": "Address of the 0x ERC1155 Asset Proxy contract." } }, + "safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)": { + "details": "The Broker implements the ERC1155 transfer function to be compatible with the ERC1155 asset proxy", + "params": { + "amounts": "Should be an array of just one `uint256`, specifying the amount of the brokered assets to transfer.", + "data": "Encodes the validator contract address and any auxiliary data it needs for property validation.", + "from": "Since the Broker serves as the taker of the order, this should equal `address(this)`", + "to": "This should be the maker of the order." + } + } + } + }, + "evm": { + "bytecode": { + "object": "0x60806040523480156200001157600080fd5b506040516200309a3803806200309a8339810160408190526200003491620004f1565b600080546001600160a01b0319166001600160a01b03831617905560405182908290630f47261b60e41b906200006f90839060240162000551565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217825251620000af916001916200041f565b50604051630c0e082160e31b81526000906001600160a01b03841690636070410890620000e890630f47261b60e41b906004016200057e565b60206040518083038186803b1580156200010157600080fd5b505afa15801562000116573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200013c9190810190620004c1565b90506001600160a01b03811662000177576200017762000166620003ea60201b62002a411760201c565b6200041760201b6200016e1760201c565b60005460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390620001ad9084906000199060040162000565565b602060405180830381600087803b158015620001c857600080fd5b505af1158015620001dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200020391908101906200052f565b506000836001600160a01b031663850a15016040518163ffffffff1660e01b815260040160206040518083038186803b1580156200024057600080fd5b505afa15801562000255573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200027b9190810190620004c1565b90506001600160a01b038116156200031b5760005460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390620002c39084906000199060040162000565565b602060405180830381600087803b158015620002de57600080fd5b505af1158015620002f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200031991908101906200052f565b505b5050600280546001600160a01b0319166001600160a01b038681169190911791829055604051630c0e082160e31b815291169250636070410891506200036d9063a7cb5fb760e01b906004016200057e565b60206040518083038186803b1580156200038657600080fd5b505afa1580156200039b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620003c19190810190620004c1565b600380546001600160a01b0319166001600160a01b039290921691909117905550620005ac9050565b6040805160048152602481019091526020810180516001600160e01b031663f3b96b8d60e01b1790525b90565b805160208201fd5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200046257805160ff191683800117855562000492565b8280016001018555821562000492579182015b828111156200049257825182559160200191906001019062000475565b50620004a0929150620004a4565b5090565b6200041491905b80821115620004a05760008155600101620004ab565b600060208284031215620004d3578081fd5b81516001600160a01b0381168114620004ea578182fd5b9392505050565b6000806040838503121562000504578081fd5b8251620005118162000593565b6020840151909250620005248162000593565b809150509250929050565b60006020828403121562000541578081fd5b81518015158114620004ea578182fd5b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160e01b031991909116815260200190565b6001600160a01b0381168114620005a957600080fd5b50565b612ade80620005bc6000396000f3fe6080604052600436106100345760003560e01c80632eb2c2d61461006657806385afeaa014610086578063a2b18d95146100af575b60005473ffffffffffffffffffffffffffffffffffffffff1633146100645761006461005f336100cf565b61016e565b005b34801561007257600080fd5b5061006461008136600461208a565b610176565b610099610094366004612312565b6103bc565b6040516100a691906128f9565b60405180910390f35b6100c26100bd366004612211565b610789565b6040516100a69190612749565b60606308b1869860e01b826040516024016100ea9190612667565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b805160208201fd5b60035473ffffffffffffffffffffffffffffffffffffffff1633146101a1576101a161005f33610b88565b73ffffffffffffffffffffffffffffffffffffffff881630146101ca576101ca61005f89610ba3565b600183146101de576101de61005f84610bbe565b6005546000858582816101ed57fe5b9050602002013590508061020f83600480549050610bd990919063ffffffff16565b1015610225576004546102259061005f90610bfd565b600080606061023686880188611f92565b9250925092505b83156103a85760006004868154811061025257fe5b6000918252602090912001546040517f9256050a00000000000000000000000000000000000000000000000000000000815260019097019690915073ffffffffffffffffffffffffffffffffffffffff841690639256050a906102bb908490869060040161293b565b60006040518083038186803b1580156102d357600080fd5b505afa1580156102e7573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff166323b872dd600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168f846040518463ffffffff1660e01b815260040161034a939291906126f2565b600060405180830381600087803b15801561036457600080fd5b505af1158015610378573d6000803e3d6000fd5b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909601955061023d915050565b505050600591909155505050505050505050565b6103c4611a31565b87516103d79060049060208b0190611a60565b50600680547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790557fffffffff0000000000000000000000000000000000000000000000000000000084167f9b44d556000000000000000000000000000000000000000000000000000000001480159061049657507fffffffff0000000000000000000000000000000000000000000000000000000084167fe14b58c40000000000000000000000000000000000000000000000000000000014155b156104a6576104a484610c18565b505b6104b08383610c33565b506060848888886040516024016104c993929190612907565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252600254915190925060009160609173ffffffffffffffffffffffffffffffffffffffff9091169061057890859061264b565b6000604051808303816000865af19150503d80600081146105b5576040519150601f19603f3d011682016040523d82523d6000602084013e6105ba565b606091505b509150915081156105e057808060200190516105d99190810190612448565b93506105e9565b6105e98161016e565b60018054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100878916150201909516949094049384018190048102820181019092528281526106ab93909290918301828280156106935780601f1061066857610100808354040283529160200191610693565b820191906000526020600020905b81548152906001019060200180831161067657829003601f168201915b5050506101408e01519291505063ffffffff610d8a16565b6106c65783516101408b01516106c69163ffffffff610db116565b6000546040517f70a082310000000000000000000000000000000000000000000000000000000081526107739173ffffffffffffffffffffffffffffffffffffffff16906370a082319061071e903090600401612667565b60206040518083038186803b15801561073657600080fd5b505afa15801561074a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061076e9190810190612463565b610dc7565b61077b610e85565b505050979650505050505050565b865160609061079f9060049060208b0190611a60565b50600680547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790557fffffffff0000000000000000000000000000000000000000000000000000000084167f9694a402000000000000000000000000000000000000000000000000000000001480159061085e57507fffffffff0000000000000000000000000000000000000000000000000000000084167fbeee2e140000000000000000000000000000000000000000000000000000000014155b80156108ac57507fffffffff0000000000000000000000000000000000000000000000000000000084167f8ea8dfe40000000000000000000000000000000000000000000000000000000014155b156108bc576108ba84610c18565b505b6108c68383610c33565b506060848888886040516024016108df93929190612797565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252600254915190925060009160609173ffffffffffffffffffffffffffffffffffffffff9091169061098e90859061264b565b6000604051808303816000865af19150503d80600081146109cb576040519150601f19603f3d011682016040523d82523d6000602084013e6109d0565b606091505b509150915081156109f657808060200190516109ef919081019061216f565b93506109ff565b6109ff8161016e565b60005b8a51811015610b2f5760018054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010087891615020190951694909404938401819004810282018101909252828152610ae19390929091830182828015610ab55780601f10610a8a57610100808354040283529160200191610ab5565b820191906000526020600020905b815481529060010190602001808311610a9857829003601f168201915b50505050508c8381518110610ac657fe5b60200260200101516101400151610d8a90919063ffffffff16565b610b2757610b27858281518110610af457fe5b6020026020010151600001518c8381518110610b0c57fe5b60200260200101516101400151610db190919063ffffffff16565b600101610a02565b506000546040517f70a082310000000000000000000000000000000000000000000000000000000081526107739173ffffffffffffffffffffffffffffffffffffffff16906370a082319061071e903090600401612667565b606063ccc529af60e01b826040516024016100ea9190612667565b606063906bfb3c60e01b826040516024016100ea9190612667565b606063ba9be20060e01b826040516024016100ea9190612932565b600082821115610bf257610bf261005f60028585610ec0565b508082035b92915050565b6060635527258660e01b826040516024016100ea9190612932565b606063540943f160e01b826040516024016100ea919061289c565b81518151600091908114610c4f57610c4f61005f828551610f65565b34915060005b818114610cfe576000858281518110610c6a57fe5b6020026020010151905080841015610c8957610c8961005f8286611007565b610c99848263ffffffff610bd916565b9350848281518110610ca757fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610cf4573d6000803e3d6000fd5b5050600101610c55565b5060008054604080517fd0e30db0000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263d0e30db0928692600480820193929182900301818588803b158015610d6a57600080fd5b505af1158015610d7e573d6000803e3d6000fd5b50505050505092915050565b600081518351148015610daa575081805190602001208380519060200120145b9392505050565b610dc38230338463ffffffff61102416565b5050565b8015610e82576000546040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690632e1a7d4d90610e23908490600401612932565b600060405180830381600087803b158015610e3d57600080fd5b505af1158015610e51573d6000803e3d6000fd5b505060405133925083156108fc02915083906000818181858888f19350505050158015610dc3573d6000803e3d6000fd5b50565b610e9160046000611aab565b6000600555600680547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b606063e946c1bb60e01b848484604051602401610edf939291906128c9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b6060633ecb6ceb60e01b8383604051602401610f8292919061295c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905092915050565b606063ecf40fd960e01b8383604051602401610f8292919061295c565b8061102e5761125a565b6000611040858263ffffffff61126016565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167ff47261b00000000000000000000000000000000000000000000000000000000014806110d357507fffffffff0000000000000000000000000000000000000000000000000000000081167fdc1600f300000000000000000000000000000000000000000000000000000000145b156110ef576110ea8585858563ffffffff6112ac16565b611258565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f0257179200000000000000000000000000000000000000000000000000000000141561114b576110ea8585858563ffffffff6112f616565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fa7cb5fb70000000000000000000000000000000000000000000000000000000014156111a7576110ea8585858563ffffffff6113c516565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f94cfcdd7000000000000000000000000000000000000000000000000000000001415611203576110ea8585858563ffffffff61151b16565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fc339d10a00000000000000000000000000000000000000000000000000000000146112585761125861005f826115af565b505b50505050565b600081600401835110156112815761128161005f60038551856004016115ca565b5001602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b60006112bf85601063ffffffff6115e916565b905073ffffffffffffffffffffffffffffffffffffffff84163014156112ea576110ea818484611629565b611258818585856116ea565b8060011461130a5761130a61005f826117ad565b600061131d85601063ffffffff6115e916565b9050600061133286602463ffffffff6117c816565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8316906323b872dd9061138b908890889086906004016126f2565b600060405180830381600087803b1580156113a557600080fd5b505af11580156113b9573d6000803e3d6000fd5b50505050505050505050565b600060608060606113e3600489518a6117d49092919063ffffffff16565b8060200190516113f69190810190611ff2565b9350935093509350600082519050606081604051908082528060200260200182016040528015611430578160200160208202803883390190505b50905060005b828114611482576114638886838151811061144d57fe5b602002602001015161185490919063ffffffff16565b82828151811061146f57fe5b6020908102919091010152600101611436565b506040517f2eb2c2d600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871690632eb2c2d6906114dd908c908c908a9087908a90600401612688565b600060405180830381600087803b1580156114f757600080fd5b505af115801561150b573d6000803e3d6000fd5b5050505050505050505050505050565b60608061153560048751886117d49092919063ffffffff16565b8060200190516115489190810190612398565b8051919350915060005b8181146115a55761159d83828151811061156857fe5b6020026020010151888861159888868151811061158157fe5b60200260200101518a61185490919063ffffffff16565b611024565b600101611552565b5050505050505050565b6060637996a27160e01b826040516024016100ea919061289c565b6060632800659560e01b848484604051602401610edf939291906128eb565b6000816014018351101561160a5761160a61005f60048551856014016115ca565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b6040516060907fa9059cbb00000000000000000000000000000000000000000000000000000000906116619085908590602401612723565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905061125a8482611885565b6040516060907f23b872dd0000000000000000000000000000000000000000000000000000000090611724908690869086906024016126f2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506112588582611885565b606063baffa47460e01b826040516024016100ea9190612932565b6000610daa838361193d565b6060818311156117ed576117ed61005f600085856115ca565b83518211156118065761180661005f60018487516115ca565b8282036040519080825280601f01601f191660200182016040528015611833576020820181803883390190505b509050610daa61184282611967565b8461184c87611967565b01835161196d565b60008261186357506000610bf7565b8282028284828161187057fe5b0414610daa57610daa61005f60018686610ec0565b600060608373ffffffffffffffffffffffffffffffffffffffff16836040516118ae919061264b565b6000604051808303816000865af19150503d80600081146118eb576040519150601f19603f3d011682016040523d82523d6000602084013e6118f0565b606091505b50915091508115611934578051611908575050610dc3565b80516020141561193457600061191f8260006117c8565b9050806001141561193257505050610dc3565b505b61125a8161016e565b6000816020018351101561195e5761195e61005f60058551856020016115ca565b50016020015190565b60200190565b6020811015611997576001816020036101000a038019835116818551168082178652505050611a2c565b828214156119a457611a2c565b828211156119de5760208103905080820181840181515b828510156119d65784518652602095860195909401936119bb565b905250611a2c565b60208103905080820181840183515b81861215611a2757825182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe092830192909101906119ed565b855250505b505050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b828054828255906000526020600020908101928215611a9b579160200282015b82811115611a9b578251825591602001919060010190611a80565b50611aa7929150611ac5565b5090565b5080546000825590600052602060002090810190610e8291905b611adf91905b80821115611aa75760008155600101611acb565b90565b8035610bf781612a1f565b600082601f830112611afd578081fd5b8135611b10611b0b82612991565b61296a565b818152915060208083019084810181840286018201871015611b3157600080fd5b60005b84811015611b59578135611b4781612a1f565b84529282019290820190600101611b34565b505050505092915050565b600082601f830112611b74578081fd5b8135611b82611b0b82612991565b8181529150602080830190840160005b83811015611bbf57611baa8760208435890101611d59565b83526020928301929190910190600101611b92565b5050505092915050565b600082601f830112611bd9578081fd5b8135611be7611b0b82612991565b8181529150602080830190840160005b83811015611bbf57611c0f8760208435890101611e43565b83526020928301929190910190600101611bf7565b60008083601f840112611c35578182fd5b50813567ffffffffffffffff811115611c4c578182fd5b6020830191508360208083028501011115611c6657600080fd5b9250929050565b600082601f830112611c7d578081fd5b8151611c8b611b0b82612991565b818152915060208083019084810181840286018201871015611cac57600080fd5b60005b84811015611b5957815184529282019290820190600101611caf565b600082601f830112611cdb578081fd5b8135611ce9611b0b82612991565b818152915060208083019084810181840286018201871015611d0a57600080fd5b60005b84811015611b5957813584529282019290820190600101611d0d565b80357fffffffff0000000000000000000000000000000000000000000000000000000081168114610bf757600080fd5b600082601f830112611d69578081fd5b8135611d77611b0b826129b1565b9150808252836020828501011115611d8e57600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112611db7578081fd5b8151611dc5611b0b826129b1565b9150808252836020828501011115611ddc57600080fd5b611ded8160208401602086016129f3565b5092915050565b600060a08284031215611e05578081fd5b611e0f60a061296a565b9050815181526020820151602082015260408201516040820152606082015160608201526080820151608082015292915050565b60006101c0808385031215611e56578182fd5b611e5f8161296a565b915050611e6c8383611ae2565b8152611e7b8360208401611ae2565b6020820152611e8d8360408401611ae2565b6040820152611e9f8360608401611ae2565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013567ffffffffffffffff80821115611f0157600080fd5b611f0d86838701611d59565b83850152610160925082850135915080821115611f2957600080fd5b611f3586838701611d59565b83850152610180925082850135915080821115611f5157600080fd5b611f5d86838701611d59565b838501526101a0925082850135915080821115611f7957600080fd5b50611f8685828601611d59565b82840152505092915050565b600080600060608486031215611fa6578283fd5b8335611fb181612a1f565b92506020840135611fc181612a1f565b9150604084013567ffffffffffffffff811115611fdc578182fd5b611fe886828701611d59565b9150509250925092565b60008060008060808587031215612007578182fd5b845161201281612a1f565b602086015190945067ffffffffffffffff8082111561202f578384fd5b61203b88838901611c6d565b94506040870151915080821115612050578384fd5b61205c88838901611c6d565b93506060870151915080821115612071578283fd5b5061207e87828801611da7565b91505092959194509250565b60008060008060008060008060a0898b0312156120a5578586fd5b88356120b081612a1f565b975060208901356120c081612a1f565b9650604089013567ffffffffffffffff808211156120dc578788fd5b6120e88c838d01611c24565b909850965060608b0135915080821115612100578586fd5b61210c8c838d01611c24565b909650945060808b0135915080821115612124578384fd5b818b018c601f820112612135578485fd5b8035925081831115612145578485fd5b8c6020848301011115612156578485fd5b6020810194505050809150509295985092959890939650565b600060208284031215612180578081fd5b815167ffffffffffffffff811115612196578182fd5b80830184601f8201126121a7578283fd5b805191506121b7611b0b83612991565b808382526020820191506020830187602060a0870286010111156121d9578586fd5b8593505b84841015612206576121ef8882611df4565b83526001939093019260209092019160a0016121dd565b509695505050505050565b600080600080600080600060e0888a03121561222b578081fd5b873567ffffffffffffffff80821115612242578283fd5b61224e8b838c01611ccb565b985060208a0135915080821115612263578283fd5b61226f8b838c01611bc9565b975060408a0135915080821115612284578283fd5b6122908b838c01611ccb565b965060608a01359150808211156122a5578283fd5b6122b18b838c01611b64565b95506122c08b60808c01611d29565b945060a08a01359150808211156122d5578283fd5b6122e18b838c01611ccb565b935060c08a01359150808211156122f6578283fd5b506123038a828b01611aed565b91505092959891949750929550565b600080600080600080600060e0888a03121561232c578081fd5b873567ffffffffffffffff80821115612343578283fd5b61234f8b838c01611ccb565b985060208a0135915080821115612364578283fd5b6123708b838c01611e43565b975060408a0135965060608a013591508082111561238c578283fd5b6122b18b838c01611d59565b600080604083850312156123aa578182fd5b825167ffffffffffffffff808211156123c1578384fd5b6123cd86838701611c6d565b93506020915081850151818111156123e3578384fd5b85019050601f810186136123f5578283fd5b8051612403611b0b82612991565b81815283810190838501865b84811015612438576124268b888451890101611da7565b8452928601929086019060010161240f565b5096999098509650505050505050565b600060a08284031215612459578081fd5b610daa8383611df4565b600060208284031215612474578081fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208401935060208301825b828110156124c65781518652602095860195909101906001016124a8565b5093949350505050565b600081518084526124e88160208601602086016129f3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b80518252602081015160208301526040810151604083015260608101516060830152608081015160808301525050565b60006101c061255a84845161247b565b602083015161256c602086018261247b565b50604083015161257f604086018261247b565b506060830151612592606086018261247b565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e08501526101008084015181860152506101208084015181860152506101408084015182828701526125eb838701826124d0565b9150506101609150818401518582038387015261260882826124d0565b92505050610180808401518583038287015261262483826124d0565b9150506101a09150818401518582038387015261264182826124d0565b9695505050505050565b6000825161265d8184602087016129f3565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526126c160a0830186612495565b82810360608401526126d38186612495565b83810360808501526126e581866124d0565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000918401906040840190835b8181101561278c5761277683855161251a565b6020939093019260a09290920191600101612763565b509095945050505050565b60006060820160608352808651808352608085019150602092506080838202860101838901855b8381101561280a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808884030185526127f883835161254a565b948601949250908501906001016127be565b50508581038487015261281d8189612495565b925050508381036040850152808551808352838301915083848202840101848801865b8381101561288c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe086840301855261287a8383516124d0565b94870194925090860190600101612840565b50909a9950505050505050505050565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b60608101600485106128d757fe5b938152602081019290925260409091015290565b60608101600885106128d757fe5b60a08101610bf7828461251a565b60006060825261291a606083018661254a565b846020840152828103604084015261264181856124d0565b90815260200190565b60008382526040602083015261295460408301846124d0565b949350505050565b918252602082015260400190565b60405181810167ffffffffffffffff8111828210171561298957600080fd5b604052919050565b600067ffffffffffffffff8211156129a7578081fd5b5060209081020190565b600067ffffffffffffffff8211156129c7578081fd5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b83811015612a0e5781810151838201526020016129f6565b8381111561125a5750506000910152565b73ffffffffffffffffffffffffffffffffffffffff81168114610e8257600080fd5b6040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff3b96b8d000000000000000000000000000000000000000000000000000000001790529056fea365627a7a723158208d14f5d218c3a076c1d9cc46cc7bba85eb91343de1b83a38afec0fae47158b036c6578706572696d656e74616cf564736f6c63430005100040" + }, + "deployedBytecode": { + "object": "0x6080604052600436106100345760003560e01c80632eb2c2d61461006657806385afeaa014610086578063a2b18d95146100af575b60005473ffffffffffffffffffffffffffffffffffffffff1633146100645761006461005f336100cf565b61016e565b005b34801561007257600080fd5b5061006461008136600461208a565b610176565b610099610094366004612312565b6103bc565b6040516100a691906128f9565b60405180910390f35b6100c26100bd366004612211565b610789565b6040516100a69190612749565b60606308b1869860e01b826040516024016100ea9190612667565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b805160208201fd5b60035473ffffffffffffffffffffffffffffffffffffffff1633146101a1576101a161005f33610b88565b73ffffffffffffffffffffffffffffffffffffffff881630146101ca576101ca61005f89610ba3565b600183146101de576101de61005f84610bbe565b6005546000858582816101ed57fe5b9050602002013590508061020f83600480549050610bd990919063ffffffff16565b1015610225576004546102259061005f90610bfd565b600080606061023686880188611f92565b9250925092505b83156103a85760006004868154811061025257fe5b6000918252602090912001546040517f9256050a00000000000000000000000000000000000000000000000000000000815260019097019690915073ffffffffffffffffffffffffffffffffffffffff841690639256050a906102bb908490869060040161293b565b60006040518083038186803b1580156102d357600080fd5b505afa1580156102e7573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff166323b872dd600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168f846040518463ffffffff1660e01b815260040161034a939291906126f2565b600060405180830381600087803b15801561036457600080fd5b505af1158015610378573d6000803e3d6000fd5b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909601955061023d915050565b505050600591909155505050505050505050565b6103c4611a31565b87516103d79060049060208b0190611a60565b50600680547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790557fffffffff0000000000000000000000000000000000000000000000000000000084167f9b44d556000000000000000000000000000000000000000000000000000000001480159061049657507fffffffff0000000000000000000000000000000000000000000000000000000084167fe14b58c40000000000000000000000000000000000000000000000000000000014155b156104a6576104a484610c18565b505b6104b08383610c33565b506060848888886040516024016104c993929190612907565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252600254915190925060009160609173ffffffffffffffffffffffffffffffffffffffff9091169061057890859061264b565b6000604051808303816000865af19150503d80600081146105b5576040519150601f19603f3d011682016040523d82523d6000602084013e6105ba565b606091505b509150915081156105e057808060200190516105d99190810190612448565b93506105e9565b6105e98161016e565b60018054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100878916150201909516949094049384018190048102820181019092528281526106ab93909290918301828280156106935780601f1061066857610100808354040283529160200191610693565b820191906000526020600020905b81548152906001019060200180831161067657829003601f168201915b5050506101408e01519291505063ffffffff610d8a16565b6106c65783516101408b01516106c69163ffffffff610db116565b6000546040517f70a082310000000000000000000000000000000000000000000000000000000081526107739173ffffffffffffffffffffffffffffffffffffffff16906370a082319061071e903090600401612667565b60206040518083038186803b15801561073657600080fd5b505afa15801561074a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061076e9190810190612463565b610dc7565b61077b610e85565b505050979650505050505050565b865160609061079f9060049060208b0190611a60565b50600680547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790557fffffffff0000000000000000000000000000000000000000000000000000000084167f9694a402000000000000000000000000000000000000000000000000000000001480159061085e57507fffffffff0000000000000000000000000000000000000000000000000000000084167fbeee2e140000000000000000000000000000000000000000000000000000000014155b80156108ac57507fffffffff0000000000000000000000000000000000000000000000000000000084167f8ea8dfe40000000000000000000000000000000000000000000000000000000014155b156108bc576108ba84610c18565b505b6108c68383610c33565b506060848888886040516024016108df93929190612797565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252600254915190925060009160609173ffffffffffffffffffffffffffffffffffffffff9091169061098e90859061264b565b6000604051808303816000865af19150503d80600081146109cb576040519150601f19603f3d011682016040523d82523d6000602084013e6109d0565b606091505b509150915081156109f657808060200190516109ef919081019061216f565b93506109ff565b6109ff8161016e565b60005b8a51811015610b2f5760018054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010087891615020190951694909404938401819004810282018101909252828152610ae19390929091830182828015610ab55780601f10610a8a57610100808354040283529160200191610ab5565b820191906000526020600020905b815481529060010190602001808311610a9857829003601f168201915b50505050508c8381518110610ac657fe5b60200260200101516101400151610d8a90919063ffffffff16565b610b2757610b27858281518110610af457fe5b6020026020010151600001518c8381518110610b0c57fe5b60200260200101516101400151610db190919063ffffffff16565b600101610a02565b506000546040517f70a082310000000000000000000000000000000000000000000000000000000081526107739173ffffffffffffffffffffffffffffffffffffffff16906370a082319061071e903090600401612667565b606063ccc529af60e01b826040516024016100ea9190612667565b606063906bfb3c60e01b826040516024016100ea9190612667565b606063ba9be20060e01b826040516024016100ea9190612932565b600082821115610bf257610bf261005f60028585610ec0565b508082035b92915050565b6060635527258660e01b826040516024016100ea9190612932565b606063540943f160e01b826040516024016100ea919061289c565b81518151600091908114610c4f57610c4f61005f828551610f65565b34915060005b818114610cfe576000858281518110610c6a57fe5b6020026020010151905080841015610c8957610c8961005f8286611007565b610c99848263ffffffff610bd916565b9350848281518110610ca757fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610cf4573d6000803e3d6000fd5b5050600101610c55565b5060008054604080517fd0e30db0000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263d0e30db0928692600480820193929182900301818588803b158015610d6a57600080fd5b505af1158015610d7e573d6000803e3d6000fd5b50505050505092915050565b600081518351148015610daa575081805190602001208380519060200120145b9392505050565b610dc38230338463ffffffff61102416565b5050565b8015610e82576000546040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690632e1a7d4d90610e23908490600401612932565b600060405180830381600087803b158015610e3d57600080fd5b505af1158015610e51573d6000803e3d6000fd5b505060405133925083156108fc02915083906000818181858888f19350505050158015610dc3573d6000803e3d6000fd5b50565b610e9160046000611aab565b6000600555600680547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b606063e946c1bb60e01b848484604051602401610edf939291906128c9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b6060633ecb6ceb60e01b8383604051602401610f8292919061295c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905092915050565b606063ecf40fd960e01b8383604051602401610f8292919061295c565b8061102e5761125a565b6000611040858263ffffffff61126016565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167ff47261b00000000000000000000000000000000000000000000000000000000014806110d357507fffffffff0000000000000000000000000000000000000000000000000000000081167fdc1600f300000000000000000000000000000000000000000000000000000000145b156110ef576110ea8585858563ffffffff6112ac16565b611258565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f0257179200000000000000000000000000000000000000000000000000000000141561114b576110ea8585858563ffffffff6112f616565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fa7cb5fb70000000000000000000000000000000000000000000000000000000014156111a7576110ea8585858563ffffffff6113c516565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f94cfcdd7000000000000000000000000000000000000000000000000000000001415611203576110ea8585858563ffffffff61151b16565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fc339d10a00000000000000000000000000000000000000000000000000000000146112585761125861005f826115af565b505b50505050565b600081600401835110156112815761128161005f60038551856004016115ca565b5001602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b60006112bf85601063ffffffff6115e916565b905073ffffffffffffffffffffffffffffffffffffffff84163014156112ea576110ea818484611629565b611258818585856116ea565b8060011461130a5761130a61005f826117ad565b600061131d85601063ffffffff6115e916565b9050600061133286602463ffffffff6117c816565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8316906323b872dd9061138b908890889086906004016126f2565b600060405180830381600087803b1580156113a557600080fd5b505af11580156113b9573d6000803e3d6000fd5b50505050505050505050565b600060608060606113e3600489518a6117d49092919063ffffffff16565b8060200190516113f69190810190611ff2565b9350935093509350600082519050606081604051908082528060200260200182016040528015611430578160200160208202803883390190505b50905060005b828114611482576114638886838151811061144d57fe5b602002602001015161185490919063ffffffff16565b82828151811061146f57fe5b6020908102919091010152600101611436565b506040517f2eb2c2d600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871690632eb2c2d6906114dd908c908c908a9087908a90600401612688565b600060405180830381600087803b1580156114f757600080fd5b505af115801561150b573d6000803e3d6000fd5b5050505050505050505050505050565b60608061153560048751886117d49092919063ffffffff16565b8060200190516115489190810190612398565b8051919350915060005b8181146115a55761159d83828151811061156857fe5b6020026020010151888861159888868151811061158157fe5b60200260200101518a61185490919063ffffffff16565b611024565b600101611552565b5050505050505050565b6060637996a27160e01b826040516024016100ea919061289c565b6060632800659560e01b848484604051602401610edf939291906128eb565b6000816014018351101561160a5761160a61005f60048551856014016115ca565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b6040516060907fa9059cbb00000000000000000000000000000000000000000000000000000000906116619085908590602401612723565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905061125a8482611885565b6040516060907f23b872dd0000000000000000000000000000000000000000000000000000000090611724908690869086906024016126f2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506112588582611885565b606063baffa47460e01b826040516024016100ea9190612932565b6000610daa838361193d565b6060818311156117ed576117ed61005f600085856115ca565b83518211156118065761180661005f60018487516115ca565b8282036040519080825280601f01601f191660200182016040528015611833576020820181803883390190505b509050610daa61184282611967565b8461184c87611967565b01835161196d565b60008261186357506000610bf7565b8282028284828161187057fe5b0414610daa57610daa61005f60018686610ec0565b600060608373ffffffffffffffffffffffffffffffffffffffff16836040516118ae919061264b565b6000604051808303816000865af19150503d80600081146118eb576040519150601f19603f3d011682016040523d82523d6000602084013e6118f0565b606091505b50915091508115611934578051611908575050610dc3565b80516020141561193457600061191f8260006117c8565b9050806001141561193257505050610dc3565b505b61125a8161016e565b6000816020018351101561195e5761195e61005f60058551856020016115ca565b50016020015190565b60200190565b6020811015611997576001816020036101000a038019835116818551168082178652505050611a2c565b828214156119a457611a2c565b828211156119de5760208103905080820181840181515b828510156119d65784518652602095860195909401936119bb565b905250611a2c565b60208103905080820181840183515b81861215611a2757825182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe092830192909101906119ed565b855250505b505050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b828054828255906000526020600020908101928215611a9b579160200282015b82811115611a9b578251825591602001919060010190611a80565b50611aa7929150611ac5565b5090565b5080546000825590600052602060002090810190610e8291905b611adf91905b80821115611aa75760008155600101611acb565b90565b8035610bf781612a1f565b600082601f830112611afd578081fd5b8135611b10611b0b82612991565b61296a565b818152915060208083019084810181840286018201871015611b3157600080fd5b60005b84811015611b59578135611b4781612a1f565b84529282019290820190600101611b34565b505050505092915050565b600082601f830112611b74578081fd5b8135611b82611b0b82612991565b8181529150602080830190840160005b83811015611bbf57611baa8760208435890101611d59565b83526020928301929190910190600101611b92565b5050505092915050565b600082601f830112611bd9578081fd5b8135611be7611b0b82612991565b8181529150602080830190840160005b83811015611bbf57611c0f8760208435890101611e43565b83526020928301929190910190600101611bf7565b60008083601f840112611c35578182fd5b50813567ffffffffffffffff811115611c4c578182fd5b6020830191508360208083028501011115611c6657600080fd5b9250929050565b600082601f830112611c7d578081fd5b8151611c8b611b0b82612991565b818152915060208083019084810181840286018201871015611cac57600080fd5b60005b84811015611b5957815184529282019290820190600101611caf565b600082601f830112611cdb578081fd5b8135611ce9611b0b82612991565b818152915060208083019084810181840286018201871015611d0a57600080fd5b60005b84811015611b5957813584529282019290820190600101611d0d565b80357fffffffff0000000000000000000000000000000000000000000000000000000081168114610bf757600080fd5b600082601f830112611d69578081fd5b8135611d77611b0b826129b1565b9150808252836020828501011115611d8e57600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112611db7578081fd5b8151611dc5611b0b826129b1565b9150808252836020828501011115611ddc57600080fd5b611ded8160208401602086016129f3565b5092915050565b600060a08284031215611e05578081fd5b611e0f60a061296a565b9050815181526020820151602082015260408201516040820152606082015160608201526080820151608082015292915050565b60006101c0808385031215611e56578182fd5b611e5f8161296a565b915050611e6c8383611ae2565b8152611e7b8360208401611ae2565b6020820152611e8d8360408401611ae2565b6040820152611e9f8360608401611ae2565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013567ffffffffffffffff80821115611f0157600080fd5b611f0d86838701611d59565b83850152610160925082850135915080821115611f2957600080fd5b611f3586838701611d59565b83850152610180925082850135915080821115611f5157600080fd5b611f5d86838701611d59565b838501526101a0925082850135915080821115611f7957600080fd5b50611f8685828601611d59565b82840152505092915050565b600080600060608486031215611fa6578283fd5b8335611fb181612a1f565b92506020840135611fc181612a1f565b9150604084013567ffffffffffffffff811115611fdc578182fd5b611fe886828701611d59565b9150509250925092565b60008060008060808587031215612007578182fd5b845161201281612a1f565b602086015190945067ffffffffffffffff8082111561202f578384fd5b61203b88838901611c6d565b94506040870151915080821115612050578384fd5b61205c88838901611c6d565b93506060870151915080821115612071578283fd5b5061207e87828801611da7565b91505092959194509250565b60008060008060008060008060a0898b0312156120a5578586fd5b88356120b081612a1f565b975060208901356120c081612a1f565b9650604089013567ffffffffffffffff808211156120dc578788fd5b6120e88c838d01611c24565b909850965060608b0135915080821115612100578586fd5b61210c8c838d01611c24565b909650945060808b0135915080821115612124578384fd5b818b018c601f820112612135578485fd5b8035925081831115612145578485fd5b8c6020848301011115612156578485fd5b6020810194505050809150509295985092959890939650565b600060208284031215612180578081fd5b815167ffffffffffffffff811115612196578182fd5b80830184601f8201126121a7578283fd5b805191506121b7611b0b83612991565b808382526020820191506020830187602060a0870286010111156121d9578586fd5b8593505b84841015612206576121ef8882611df4565b83526001939093019260209092019160a0016121dd565b509695505050505050565b600080600080600080600060e0888a03121561222b578081fd5b873567ffffffffffffffff80821115612242578283fd5b61224e8b838c01611ccb565b985060208a0135915080821115612263578283fd5b61226f8b838c01611bc9565b975060408a0135915080821115612284578283fd5b6122908b838c01611ccb565b965060608a01359150808211156122a5578283fd5b6122b18b838c01611b64565b95506122c08b60808c01611d29565b945060a08a01359150808211156122d5578283fd5b6122e18b838c01611ccb565b935060c08a01359150808211156122f6578283fd5b506123038a828b01611aed565b91505092959891949750929550565b600080600080600080600060e0888a03121561232c578081fd5b873567ffffffffffffffff80821115612343578283fd5b61234f8b838c01611ccb565b985060208a0135915080821115612364578283fd5b6123708b838c01611e43565b975060408a0135965060608a013591508082111561238c578283fd5b6122b18b838c01611d59565b600080604083850312156123aa578182fd5b825167ffffffffffffffff808211156123c1578384fd5b6123cd86838701611c6d565b93506020915081850151818111156123e3578384fd5b85019050601f810186136123f5578283fd5b8051612403611b0b82612991565b81815283810190838501865b84811015612438576124268b888451890101611da7565b8452928601929086019060010161240f565b5096999098509650505050505050565b600060a08284031215612459578081fd5b610daa8383611df4565b600060208284031215612474578081fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208401935060208301825b828110156124c65781518652602095860195909101906001016124a8565b5093949350505050565b600081518084526124e88160208601602086016129f3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b80518252602081015160208301526040810151604083015260608101516060830152608081015160808301525050565b60006101c061255a84845161247b565b602083015161256c602086018261247b565b50604083015161257f604086018261247b565b506060830151612592606086018261247b565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e08501526101008084015181860152506101208084015181860152506101408084015182828701526125eb838701826124d0565b9150506101609150818401518582038387015261260882826124d0565b92505050610180808401518583038287015261262483826124d0565b9150506101a09150818401518582038387015261264182826124d0565b9695505050505050565b6000825161265d8184602087016129f3565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526126c160a0830186612495565b82810360608401526126d38186612495565b83810360808501526126e581866124d0565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000918401906040840190835b8181101561278c5761277683855161251a565b6020939093019260a09290920191600101612763565b509095945050505050565b60006060820160608352808651808352608085019150602092506080838202860101838901855b8381101561280a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808884030185526127f883835161254a565b948601949250908501906001016127be565b50508581038487015261281d8189612495565b925050508381036040850152808551808352838301915083848202840101848801865b8381101561288c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe086840301855261287a8383516124d0565b94870194925090860190600101612840565b50909a9950505050505050505050565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b60608101600485106128d757fe5b938152602081019290925260409091015290565b60608101600885106128d757fe5b60a08101610bf7828461251a565b60006060825261291a606083018661254a565b846020840152828103604084015261264181856124d0565b90815260200190565b60008382526040602083015261295460408301846124d0565b949350505050565b918252602082015260400190565b60405181810167ffffffffffffffff8111828210171561298957600080fd5b604052919050565b600067ffffffffffffffff8211156129a7578081fd5b5060209081020190565b600067ffffffffffffffff8211156129c7578081fd5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b83811015612a0e5781810151838201526020016129f6565b8381111561125a5750506000910152565b73ffffffffffffffffffffffffffffffffffffffff81168114610e8257600080fd5b6040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff3b96b8d000000000000000000000000000000000000000000000000000000001790529056fea365627a7a723158208d14f5d218c3a076c1d9cc46cc7bba85eb91343de1b83a38afec0fae47158b036c6578706572696d656e74616cf564736f6c63430005100040" + } + } + }, + "compiler": { + "name": "solc", + "version": "soljson-v0.5.16+commit.9c3226ce.js", + "settings": { + "optimizer": { + "enabled": true, + "runs": 1000000, + "details": { "yul": true, "deduplicate": true, "cse": true, "constantOptimizer": true } + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "devdoc", + "evm.bytecode.object", + "evm.bytecode.sourceMap", + "evm.deployedBytecode.object", + "evm.deployedBytecode.sourceMap" + ] + } + }, + "evmVersion": "istanbul" + } + }, + "chains": {} +} diff --git a/packages/contract-artifacts/artifacts/Forwarder.json b/packages/contract-artifacts/artifacts/Forwarder.json index 4ae9adfab3..7b91d4a8e0 100644 --- a/packages/contract-artifacts/artifacts/Forwarder.json +++ b/packages/contract-artifacts/artifacts/Forwarder.json @@ -259,10 +259,10 @@ }, "evm": { "bytecode": { - "object": "0x60806040523480156200001157600080fd5b5060405162003c9d38038062003c9d833981016040819052620000349162000472565b60008054336001600160a01b031991821617909155600180549091166001600160a01b0383161790556040518390839082908490630f47261b60e41b9062000081908390602401620004e7565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217825251620000c191600291620003a0565b50604051630c0e082160e31b81526000906001600160a01b03841690636070410890620000fa90630f47261b60e41b9060040162000514565b60206040518083038186803b1580156200011357600080fd5b505afa15801562000128573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200014e919081019062000442565b90506001600160a01b038116620001895762000189620001786200036b60201b620007b11760201c565b6200039860201b620002d81760201c565b60015460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390620001bf90849060001990600401620004fb565b602060405180830381600087803b158015620001da57600080fd5b505af1158015620001ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002159190810190620004c5565b506000836001600160a01b031663850a15016040518163ffffffff1660e01b815260040160206040518083038186803b1580156200025257600080fd5b505afa15801562000267573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200028d919081019062000442565b90506001600160a01b038116156200032d5760015460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390620002d590849060001990600401620004fb565b602060405180830381600087803b158015620002f057600080fd5b505af115801562000305573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200032b9190810190620004c5565b505b5050600380546001600160a01b039586166001600160a01b031991821617909155600480549490951693169290921790925550620005429350505050565b6040805160048152602481019091526020810180516001600160e01b031663f3b96b8d60e01b1790525b90565b805160208201fd5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620003e357805160ff191683800117855562000413565b8280016001018555821562000413579182015b8281111562000413578251825591602001919060010190620003f6565b506200042192915062000425565b5090565b6200039591905b808211156200042157600081556001016200042c565b60006020828403121562000454578081fd5b81516001600160a01b03811681146200046b578182fd5b9392505050565b60008060006060848603121562000487578182fd5b8351620004948162000529565b6020850151909350620004a78162000529565b6040850151909250620004ba8162000529565b809150509250925092565b600060208284031215620004d7578081fd5b815180151581146200046b578182fd5b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160e01b031991909116815260200190565b6001600160a01b03811681146200053f57600080fd5b50565b61374b80620005526000396000f3fe6080604052600436106100bc5760003560e01c8063bc197c8111610074578063f23a6e611161004e578063f23a6e61146101e4578063f2fde38b14610204578063fc67bf1c14610224576100bc565b8063bc197c811461018d578063e0a5c949146101ba578063e196001b146101cf576100bc565b80638da5cb5b116100a55780638da5cb5b1461012e578063907e5cc3146101595780639e8323151461017a576100bc565b8063442026ed146100ee578063630f1e6c1461010e575b60015473ffffffffffffffffffffffffffffffffffffffff1633146100ec576100ec6100e733610239565b6102d8565b005b3480156100fa57600080fd5b506100ec610109366004613075565b6102e0565b34801561011a57600080fd5b506100ec6101293660046130b5565b6104ca565b34801561013a57600080fd5b50610143610520565b6040516101509190613246565b60405180910390f35b61016c610167366004612e77565b61053c565b604051610150929190613623565b61016c610188366004612f13565b610597565b34801561019957600080fd5b506101ad6101a8366004612d42565b6105f3565b604051610150919061334f565b3480156101c657600080fd5b506101ad610620565b3480156101db57600080fd5b506101ad610644565b3480156101f057600080fd5b506101ad6101ff366004612dfd565b610668565b34801561021057600080fd5b506100ec61021f366004612c72565b610693565b34801561023057600080fd5b506101ad610737565b60606308b1869860e01b826040516024016102549190613246565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b805160208201fd5b600061032c600084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff61075b169050565b90507ff47261b0000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082168114156104c4576003546040517f6070410800000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906360704108906103d090859060040161334f565b60206040518083038186803b1580156103e857600080fd5b505afa1580156103fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506104209190810190612c8e565b905073ffffffffffffffffffffffffffffffffffffffff8116610448576104486100e76107b1565b6000610494601087878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff61080b169050565b90506104c181837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61084b565b50505b50505050565b6104d261090c565b61051b8184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff610955169050565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b600080600061054b858561096b565b9050610558878288610ac1565b909350915080831115610572576105726100e78434610f28565b610582818463ffffffff610fca16565b905061058d81610fe9565b5094509492505050565b60008060006105a6858561096b565b90506105b38888886110a4565b9093509150808311156105cd576105cd6100e78434610f28565b6105dd818463ffffffff610fca16565b90506105e881610fe9565b509550959350505050565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b7ff23a6e610000000000000000000000000000000000000000000000000000000081565b7f770501f80000000000000000000000000000000000000000000000000000000081565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b61069b61090c565b73ffffffffffffffffffffffffffffffffffffffff81166106c6576106c16100e76113e0565b610734565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35b50565b7fbc197c810000000000000000000000000000000000000000000000000000000081565b6000816004018351101561077c5761077c6100e76003855185600401611417565b5060208183018101519101907fffffffff00000000000000000000000000000000000000000000000000000000165b92915050565b6040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff3b96b8d0000000000000000000000000000000000000000000000000000000017905290565b6000816014018351101561082c5761082c6100e76004855185601401611417565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b6040516060907f095ea7b300000000000000000000000000000000000000000000000000000000906108839085908590602401613329565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506104c484826114bd565b60005473ffffffffffffffffffffffffffffffffffffffff16331461095357600054610953906100e790339073ffffffffffffffffffffffffffffffffffffffff16611575565b565b6109678230338463ffffffff61159216565b5050565b81518151600091908114610987576109876100e78285516117cd565b34915060005b818114610a365760008582815181106109a257fe5b60200260200101519050808410156109c1576109c16100e782866117ea565b6109d1848263ffffffff610fca16565b93508482815181106109df57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610a2c573d6000803e3d6000fd5b505060010161098d565b50600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015610aa157600080fd5b505af1158015610ab5573d6000803e3d6000fd5b50505050505092915050565b6000806000610b76600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631ce4c78b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610b3157600080fd5b505afa158015610b45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b699190810190613150565b3a9063ffffffff61180716565b90507fdc1600f30000000000000000000000000000000000000000000000000000000060005b87518114610f1d57878181518110610bb057fe5b60200260200101516080015160001480610be15750878181518110610bd157fe5b602002602001015160a001516000145b15610beb57610f15565b6000610c35610c0c8a8481518110610bff57fe5b6020026020010151611838565b610c165784610c19565b60005b610c298a8963ffffffff610fca16565b9063ffffffff610fca16565b90506000610c6560008b8581518110610c4a57fe5b6020026020010151610140015161075b90919063ffffffff16565b90506000807fffffffff000000000000000000000000000000000000000000000000000000008084169087161415610d6b57610cc360108d8781518110610ca857fe5b6020026020010151610140015161080b90919063ffffffff16565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190610d18903090600401613246565b60206040518083038186803b158015610d3057600080fd5b505afa158015610d44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d689190810190613150565b90505b600080610d9f8e8881518110610d7d57fe5b60200260200101518d8981518110610d9157fe5b6020026020010151886118ad565b91509150877bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610ead576040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8616906370a0823190610e3e903090600401613246565b60206040518083038186803b158015610e5657600080fd5b505afa158015610e6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e8e9190810190613150565b9050610ea9610ea3828663ffffffff610fca16565b836119d7565b9150505b610ed8818f8981518110610ebd57fe5b6020026020010151610140015161095590919063ffffffff16565b610ee88b8363ffffffff6119ee16565b9a50610efa8a8263ffffffff6119ee16565b99508c8b10610f0e57505050505050610f1d565b5050505050505b600101610b9c565b505050935093915050565b606063cdcbed5d60e01b8383604051602401610f45929190613623565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905092915050565b600082821115610fe357610fe36100e760028585611a06565b50900390565b8015610734576001546040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690632e1a7d4d9061104590849060040161361a565b600060405180830381600087803b15801561105f57600080fd5b505af1158015611073573d6000803e3d6000fd5b505060405133925083156108fc02915083906000818181858888f19350505050158015610967573d6000803e3d6000fd5b825160009081907fdc1600f30000000000000000000000000000000000000000000000000000000090825b8181146113c0578781815181106110e257fe5b60200260200101516080015160001480611113575087818151811061110357fe5b602002602001015160a001516000145b1561111d576113b8565b600061112f888663ffffffff610fca16565b9050600061114460008b8581518110610c4a57fe5b90506000807fffffffff00000000000000000000000000000000000000000000000000000000808416908816141561122f5761118760108d8781518110610ca857fe5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff8316906370a08231906111dc903090600401613246565b60206040518083038186803b1580156111f457600080fd5b505afa158015611208573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061122c9190810190613150565b90505b6000806112638e888151811061124157fe5b60200260200101518d898151811061125557fe5b602002602001015188611a25565b91509150887bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561136b576040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8616906370a0823190611302903090600401613246565b60206040518083038186803b15801561131a57600080fd5b505afa15801561132e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113529190810190613150565b9050611367610ea3828663ffffffff610fca16565b9150505b61137b818f8981518110610ebd57fe5b61138b8b8363ffffffff6119ee16565b9a5061139d8a8263ffffffff6119ee16565b99508c8a106113b1575050505050506113c0565b5050505050505b6001016110cf565b50858310156113d6576113d66100e78785611af7565b5050935093915050565b60408051808201909152600481527fe69edc3e00000000000000000000000000000000000000000000000000000000602082015290565b6060632800659560e01b848484604051602401611436939291906133b1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290505b9392505050565b600060608373ffffffffffffffffffffffffffffffffffffffff16836040516114e6919061322a565b6000604051808303816000865af19150503d8060008114611523576040519150601f19603f3d011682016040523d82523d6000602084013e611528565b606091505b5091509150811561156c578051611540575050610967565b80516020141561156c576000611557826000611b14565b9050806001141561156a57505050610967565b505b6104c4816102d8565b6060631de45ad160e01b8383604051602401610f45929190613267565b8061159c576104c4565b60006115ae858263ffffffff61075b16565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167ff47261b000000000000000000000000000000000000000000000000000000000148061164157507fffffffff0000000000000000000000000000000000000000000000000000000081167fdc1600f300000000000000000000000000000000000000000000000000000000145b1561165d576116588585858563ffffffff611b2016565b6117c6565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f025717920000000000000000000000000000000000000000000000000000000014156116b9576116588585858563ffffffff611b6a16565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fa7cb5fb7000000000000000000000000000000000000000000000000000000001415611715576116588585858563ffffffff611c3916565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f94cfcdd7000000000000000000000000000000000000000000000000000000001415611771576116588585858563ffffffff611d8f16565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fc339d10a00000000000000000000000000000000000000000000000000000000146117c6576117c66100e782611e23565b5050505050565b6060633ecb6ceb60e01b8383604051602401610f45929190613623565b606063ecf40fd960e01b8383604051602401610f45929190613623565b600082611816575060006107ab565b8282028284828161182357fe5b04146114b6576114b66100e760018686611a06565b60006003826101800151511180156107ab57506101808201517f770501f8000000000000000000000000000000000000000000000000000000009061188490600063ffffffff61075b16565b7fffffffff00000000000000000000000000000000000000000000000000000000161492915050565b6000808460e00151600014806118d257506118d2856101a00151866101400151611e3e565b15611929576118df612710565b6118ea868587611feb565b9050611907816080015182602001516119ee90919063ffffffff16565b60608201518251919450611921919063ffffffff610fca16565b9150506119cf565b61193d856101a00151866101600151611e3e565b156119be5760a085015160e086015160009161196a9161196490829063ffffffff6119ee16565b86612026565b9050611974612710565b61197f878388611feb565b90506119b081608001516119a4836060015184602001516119ee90919063ffffffff16565b9063ffffffff6119ee16565b905190935091506119cf9050565b6119cf6100e7866101a0015161205c565b935093915050565b6000818310156119e757816114b6565b5090919050565b6000828201838110156114b6576114b66100e7600086865b606063e946c1bb60e01b8484846040516024016114369392919061338f565b6000808460e0015160001480611a4a5750611a4a856101a00151866101600151611e3e565b15611a6457600061196a8660a00151876080015186612026565b611a78856101a00151866101400151611e3e565b156119be576000611aa28660a001516119648860e001518960800151610fca90919063ffffffff16565b9050611aac612710565b611ab7878388611feb565b9050611ad4816080015182602001516119ee90919063ffffffff16565b60608201518251919550611aee919063ffffffff610fca16565b925050506119cf565b60606391353a0c60e01b8383604051602401610f45929190613623565b60006114b68383612077565b6000611b3385601063ffffffff61080b16565b905073ffffffffffffffffffffffffffffffffffffffff8416301415611b5e576116588184846120a1565b6117c6818585856120d9565b80600114611b7e57611b7e6100e78261219c565b6000611b9185601063ffffffff61080b16565b90506000611ba686602463ffffffff611b1416565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8316906323b872dd90611bff908890889086906004016132f8565b600060405180830381600087803b158015611c1957600080fd5b505af1158015611c2d573d6000803e3d6000fd5b50505050505050505050565b60006060806060611c57600489518a6121b79092919063ffffffff16565b806020019051611c6a9190810190612caa565b9350935093509350600082519050606081604051908082528060200260200182016040528015611ca4578160200160208202803883390190505b50905060005b828114611cf657611cd788868381518110611cc157fe5b602002602001015161180790919063ffffffff16565b828281518110611ce357fe5b6020908102919091010152600101611caa565b506040517f2eb2c2d600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871690632eb2c2d690611d51908c908c908a9087908a9060040161328e565b600060405180830381600087803b158015611d6b57600080fd5b505af1158015611d7f573d6000803e3d6000fd5b5050505050505050505050505050565b606080611da960048751886121b79092919063ffffffff16565b806020019051611dbc9190810190612fc5565b8051919350915060005b818114611e1957611e11838281518110611ddc57fe5b60200260200101518888611e0c888681518110611df557fe5b60200260200101518a61180790919063ffffffff16565b611592565b600101611dc6565b5050505050505050565b6060637996a27160e01b82604051602401610254919061334f565b600080611e51848263ffffffff61075b16565b90506000611e65848263ffffffff61075b16565b90507ff47261b0000000000000000000000000000000000000000000000000000000007fdc1600f3000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008416821480611efd57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b8015611f5b57507fffffffff000000000000000000000000000000000000000000000000000000008381169083161480611f5b57507fffffffff00000000000000000000000000000000000000000000000000000000838116908216145b15611fc6576000611f7388601063ffffffff61080b16565b90506000611f8888601063ffffffff61080b16565b90508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161496505050505050506107ab565b611fd6878763ffffffff61223716565b9450505050506107ab565b5050505092915050565b611ff3612710565b611ffc84611838565b156120135761200c84848461225c565b90506114b6565b61201e8484846124b0565b949350505050565b600061201e8361205061204082600163ffffffff610fca16565b6119a4888763ffffffff61180716565b9063ffffffff61261d16565b60606331360af160e01b82604051602401610254919061337c565b60008160200183511015612098576120986100e76005855185602001611417565b50016020015190565b6040516060907fa9059cbb00000000000000000000000000000000000000000000000000000000906108839085908590602401613329565b6040516060907f23b872dd0000000000000000000000000000000000000000000000000000000090612113908690869086906024016132f8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506117c685826114bd565b606063baffa47460e01b82604051602401610254919061361a565b6060818311156121d0576121d06100e760008585611417565b83518211156121e9576121e96100e76001848751611417565b8282036040519080825280601f01601f191660200182016040528015612216576020820181803883390190505b5090506114b661222582612647565b8461222f87612647565b01835161264d565b6000815183511480156114b65750508051602091820120825192909101919091201490565b612264612710565b61226c61273f565b604051806101800160405280866000015173ffffffffffffffffffffffffffffffffffffffff168152602001866020015173ffffffffffffffffffffffffffffffffffffffff168152602001866040015173ffffffffffffffffffffffffffffffffffffffff168152602001866060015173ffffffffffffffffffffffffffffffffffffffff168152602001866080015181526020018660a001518152602001600081526020016000815260200186610100015181526020018661012001518152602001866101400151815260200186610160015181525090506060600073ffffffffffffffffffffffffffffffffffffffff1663b4be83d5905060e01b82868660405160240161237f939291906133bf565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252600454915190925073ffffffffffffffffffffffffffffffffffffffff90911690600090606090839061243090869061322a565b6000604051808303816000865af19150503d806000811461246d576040519150601f19603f3d011682016040523d82523d6000602084013e612472565b606091505b509150915081156124a457805160801461248857fe5b8080602001905161249c9190810190613168565b602088015286525b50505050509392505050565b6124b8612710565b6040516060907f9b44d55600000000000000000000000000000000000000000000000000000000906124f2908790879087906024016134df565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252600354915190925073ffffffffffffffffffffffffffffffffffffffff9091169060009060609083906125a390869061322a565b6000604051808303816000865af19150503d80600081146125e0576040519150601f19603f3d011682016040523d82523d6000602084013e6125e5565b606091505b5091509150811561261257805160a0146125fb57fe5b8080602001905161260f91908101906130ff565b94505b505050509392505050565b600081612633576126336100e760038585611a06565b600082848161263e57fe5b04949350505050565b60200190565b6020811015612677576001816020036101000a03801983511681855116808217865250505061051b565b828214156126845761051b565b828211156126be5760208103905080820181840181515b828510156126b657845186526020958601959094019361269b565b90525061051b565b60208103905080820181840183515b8186121561270757825182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe092830192909101906126cd565b85525050505050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160608152602001606081525090565b80356107ab816136e6565b600082601f830112612813578081fd5b813561282661282182613658565b613631565b81815291506020808301908481018184028601820187101561284757600080fd5b60005b8481101561286f57813561285d816136e6565b8452928201929082019060010161284a565b505050505092915050565b600082601f83011261288a578081fd5b813561289861282182613658565b8181529150602080830190840160005b83811015611fe1576128c08760208435890101612bd7565b835260209283019291909101906001016128a8565b600082601f8301126128e5578081fd5b81356128f361282182613658565b818152915060208083019084810160005b8481101561286f57813587016101c0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838c0301121561294457600080fd5b61294d81613631565b6129598b8785016127f8565b81526129688b604085016127f8565b868201526129798b606085016127f8565b604082015261298b8b608085016127f8565b606082015260a0830135608082015260c083013560a082015260e083013560c08201526101008084013560e0830152610120808501358284015261014091508185013581840152506101608085013567ffffffffffffffff808211156129f057600080fd5b6129fe8f8b848a0101612bd7565b84860152610180935083870135915080821115612a1a57600080fd5b612a288f8b848a0101612bd7565b838601526101a0925082870135915080821115612a4457600080fd5b612a528f8b848a0101612bd7565b8486015285870135935080841115612a6957600080fd5b5050612a798d8984880101612bd7565b9083015250865250509282019290820190600101612904565b60008083601f840112612aa3578182fd5b50813567ffffffffffffffff811115612aba578182fd5b6020830191508360208083028501011115612ad457600080fd5b9250929050565b600082601f830112612aeb578081fd5b8151612af961282182613658565b818152915060208083019084810181840286018201871015612b1a57600080fd5b60005b8481101561286f57815184529282019290820190600101612b1d565b600082601f830112612b49578081fd5b8135612b5761282182613658565b818152915060208083019084810181840286018201871015612b7857600080fd5b60005b8481101561286f57813584529282019290820190600101612b7b565b60008083601f840112612ba8578182fd5b50813567ffffffffffffffff811115612bbf578182fd5b602083019150836020828501011115612ad457600080fd5b600082601f830112612be7578081fd5b8135612bf561282182613678565b9150808252836020828501011115612c0c57600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112612c35578081fd5b8151612c4361282182613678565b9150808252836020828501011115612c5a57600080fd5b612c6b8160208401602086016136ba565b5092915050565b600060208284031215612c83578081fd5b81356114b6816136e6565b600060208284031215612c9f578081fd5b81516114b6816136e6565b60008060008060808587031215612cbf578283fd5b8451612cca816136e6565b602086015190945067ffffffffffffffff80821115612ce7578485fd5b612cf388838901612adb565b94506040870151915080821115612d08578384fd5b612d1488838901612adb565b93506060870151915080821115612d29578283fd5b50612d3687828801612c25565b91505092959194509250565b60008060008060008060008060a0898b031215612d5d578586fd5b8835612d68816136e6565b97506020890135612d78816136e6565b9650604089013567ffffffffffffffff80821115612d94578788fd5b612da08c838d01612a92565b909850965060608b0135915080821115612db8578586fd5b612dc48c838d01612a92565b909650945060808b0135915080821115612ddc578384fd5b50612de98b828c01612b97565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215612e15578384fd5b8635612e20816136e6565b95506020870135612e30816136e6565b94506040870135935060608701359250608087013567ffffffffffffffff811115612e59578283fd5b612e6589828a01612b97565b979a9699509497509295939492505050565b60008060008060808587031215612e8c578182fd5b843567ffffffffffffffff80821115612ea3578384fd5b612eaf888389016128d5565b95506020870135915080821115612ec4578384fd5b612ed08883890161287a565b94506040870135915080821115612ee5578384fd5b612ef188838901612b39565b93506060870135915080821115612f06578283fd5b50612d3687828801612803565b600080600080600060a08688031215612f2a578283fd5b853567ffffffffffffffff80821115612f41578485fd5b612f4d89838a016128d5565b9650602088013595506040880135915080821115612f69578485fd5b612f7589838a0161287a565b94506060880135915080821115612f8a578283fd5b612f9689838a01612b39565b93506080880135915080821115612fab578283fd5b50612fb888828901612803565b9150509295509295909350565b60008060408385031215612fd7578182fd5b825167ffffffffffffffff80821115612fee578384fd5b612ffa86838701612adb565b9350602091508185015181811115613010578384fd5b85019050601f81018613613022578283fd5b805161303061282182613658565b81815283810190838501865b84811015613065576130538b888451890101612c25565b8452928601929086019060010161303c565b5096999098509650505050505050565b60008060208385031215613087578182fd5b823567ffffffffffffffff81111561309d578283fd5b6130a985828601612b97565b90969095509350505050565b6000806000604084860312156130c9578081fd5b833567ffffffffffffffff8111156130df578182fd5b6130eb86828701612b97565b909790965060209590950135949350505050565b600060a08284031215613110578081fd5b61311a60a0613631565b82518152602083015160208201526040830151604082015260608301516060820152608083015160808201528091505092915050565b600060208284031215613161578081fd5b5051919050565b6000806040838503121561317a578182fd5b505080516020909101519092909150565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208401935060208301825b828110156131d65781518652602095860195909101906001016131b8565b5093949350505050565b600081518084526131f88160208601602086016136ba565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000825161323c8184602087016136ba565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526132c760a08301866131a5565b82810360608401526132d981866131a5565b83810360808501526132eb81866131e0565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b6000602082526114b660208301846131e0565b606081016004851061339d57fe5b938152602081019290925260409091015290565b606081016008851061339d57fe5b6000606082526133d360608301865161318b565b60208501516133e5608084018261318b565b5060408501516133f860a084018261318b565b50606085015161340b60c084018261318b565b50608085015160e083015260a0850151610100818185015260c08701519150610120828186015260e088015192506101408381870152828901519350610160925083838701528189015193506101809150838287015280890151935050806101a08601525061347e6101e08501836131e0565b8188015192507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0858203016101c08601526134b981846131e0565b91505085602085015283810360408501526134d481866131e0565b979650505050505050565b6000606082526134f360608301865161318b565b6020850151613505608084018261318b565b50604085015161351860a084018261318b565b50606085015161352b60c084018261318b565b50608085015160e083015260a0850151610100818185015260c08701519150610120828186015260e0880151925061014083818701528289015193506101609250838387015281890151935061018091508382870152808901519350506101c06101a081818801526135a16102208801866131e0565b848b015195507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa094508488820301838901526135dd81876131e0565b925050828a0151945083878303016101e08801526135fb82866131e0565b9250808a01519450505081858203016102008601526134b981846131e0565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff8111828210171561365057600080fd5b604052919050565b600067ffffffffffffffff82111561366e578081fd5b5060209081020190565b600067ffffffffffffffff82111561368e578081fd5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b838110156136d55781810151838201526020016136bd565b838111156104c45750506000910152565b73ffffffffffffffffffffffffffffffffffffffff8116811461073457600080fdfea365627a7a7231582046e7b4801e4017360012dc9f596c66d1113c57a190987d4f3089965a65faa3c56c6578706572696d656e74616cf564736f6c63430005100040" + "object": "0x60806040523480156200001157600080fd5b5060405162003c9d38038062003c9d833981016040819052620000349162000472565b60008054336001600160a01b031991821617909155600180549091166001600160a01b0383161790556040518390839082908490630f47261b60e41b9062000081908390602401620004e7565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217825251620000c191600291620003a0565b50604051630c0e082160e31b81526000906001600160a01b03841690636070410890620000fa90630f47261b60e41b9060040162000514565b60206040518083038186803b1580156200011357600080fd5b505afa15801562000128573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200014e919081019062000442565b90506001600160a01b038116620001895762000189620001786200036b60201b620007b11760201c565b6200039860201b620002d81760201c565b60015460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390620001bf90849060001990600401620004fb565b602060405180830381600087803b158015620001da57600080fd5b505af1158015620001ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002159190810190620004c5565b506000836001600160a01b031663850a15016040518163ffffffff1660e01b815260040160206040518083038186803b1580156200025257600080fd5b505afa15801562000267573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200028d919081019062000442565b90506001600160a01b038116156200032d5760015460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390620002d590849060001990600401620004fb565b602060405180830381600087803b158015620002f057600080fd5b505af115801562000305573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200032b9190810190620004c5565b505b5050600380546001600160a01b039586166001600160a01b031991821617909155600480549490951693169290921790925550620005429350505050565b6040805160048152602481019091526020810180516001600160e01b031663f3b96b8d60e01b1790525b90565b805160208201fd5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620003e357805160ff191683800117855562000413565b8280016001018555821562000413579182015b8281111562000413578251825591602001919060010190620003f6565b506200042192915062000425565b5090565b6200039591905b808211156200042157600081556001016200042c565b60006020828403121562000454578081fd5b81516001600160a01b03811681146200046b578182fd5b9392505050565b60008060006060848603121562000487578182fd5b8351620004948162000529565b6020850151909350620004a78162000529565b6040850151909250620004ba8162000529565b809150509250925092565b600060208284031215620004d7578081fd5b815180151581146200046b578182fd5b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160e01b031991909116815260200190565b6001600160a01b03811681146200053f57600080fd5b50565b61374b80620005526000396000f3fe6080604052600436106100bc5760003560e01c8063bc197c8111610074578063f23a6e611161004e578063f23a6e61146101e4578063f2fde38b14610204578063fc67bf1c14610224576100bc565b8063bc197c811461018d578063e0a5c949146101ba578063e196001b146101cf576100bc565b80638da5cb5b116100a55780638da5cb5b1461012e578063907e5cc3146101595780639e8323151461017a576100bc565b8063442026ed146100ee578063630f1e6c1461010e575b60015473ffffffffffffffffffffffffffffffffffffffff1633146100ec576100ec6100e733610239565b6102d8565b005b3480156100fa57600080fd5b506100ec610109366004613075565b6102e0565b34801561011a57600080fd5b506100ec6101293660046130b5565b6104ca565b34801561013a57600080fd5b50610143610520565b6040516101509190613246565b60405180910390f35b61016c610167366004612e77565b61053c565b604051610150929190613623565b61016c610188366004612f13565b610597565b34801561019957600080fd5b506101ad6101a8366004612d42565b6105f3565b604051610150919061334f565b3480156101c657600080fd5b506101ad610620565b3480156101db57600080fd5b506101ad610644565b3480156101f057600080fd5b506101ad6101ff366004612dfd565b610668565b34801561021057600080fd5b506100ec61021f366004612c72565b610693565b34801561023057600080fd5b506101ad610737565b60606308b1869860e01b826040516024016102549190613246565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b805160208201fd5b600061032c600084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff61075b169050565b90507ff47261b0000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082168114156104c4576003546040517f6070410800000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906360704108906103d090859060040161334f565b60206040518083038186803b1580156103e857600080fd5b505afa1580156103fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506104209190810190612c8e565b905073ffffffffffffffffffffffffffffffffffffffff8116610448576104486100e76107b1565b6000610494601087878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff61080b169050565b90506104c181837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61084b565b50505b50505050565b6104d261090c565b61051b8184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff610955169050565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b600080600061054b858561096b565b9050610558878288610ac1565b909350915080831115610572576105726100e78434610f28565b610582818463ffffffff610fca16565b905061058d81610fe9565b5094509492505050565b60008060006105a6858561096b565b90506105b38888886110a4565b9093509150808311156105cd576105cd6100e78434610f28565b6105dd818463ffffffff610fca16565b90506105e881610fe9565b509550959350505050565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b7ff23a6e610000000000000000000000000000000000000000000000000000000081565b7f770501f80000000000000000000000000000000000000000000000000000000081565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b61069b61090c565b73ffffffffffffffffffffffffffffffffffffffff81166106c6576106c16100e76113e0565b610734565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35b50565b7fbc197c810000000000000000000000000000000000000000000000000000000081565b6000816004018351101561077c5761077c6100e76003855185600401611417565b5060208183018101519101907fffffffff00000000000000000000000000000000000000000000000000000000165b92915050565b6040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff3b96b8d0000000000000000000000000000000000000000000000000000000017905290565b6000816014018351101561082c5761082c6100e76004855185601401611417565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b6040516060907f095ea7b300000000000000000000000000000000000000000000000000000000906108839085908590602401613329565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506104c484826114bd565b60005473ffffffffffffffffffffffffffffffffffffffff16331461095357600054610953906100e790339073ffffffffffffffffffffffffffffffffffffffff16611575565b565b6109678230338463ffffffff61159216565b5050565b81518151600091908114610987576109876100e78285516117cd565b34915060005b818114610a365760008582815181106109a257fe5b60200260200101519050808410156109c1576109c16100e782866117ea565b6109d1848263ffffffff610fca16565b93508482815181106109df57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610a2c573d6000803e3d6000fd5b505060010161098d565b50600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015610aa157600080fd5b505af1158015610ab5573d6000803e3d6000fd5b50505050505092915050565b6000806000610b76600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631ce4c78b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610b3157600080fd5b505afa158015610b45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b699190810190613150565b3a9063ffffffff61180716565b90507fdc1600f30000000000000000000000000000000000000000000000000000000060005b87518114610f1d57878181518110610bb057fe5b60200260200101516080015160001480610be15750878181518110610bd157fe5b602002602001015160a001516000145b15610beb57610f15565b6000610c35610c0c8a8481518110610bff57fe5b6020026020010151611838565b610c165784610c19565b60005b610c298a8963ffffffff610fca16565b9063ffffffff610fca16565b90506000610c6560008b8581518110610c4a57fe5b6020026020010151610140015161075b90919063ffffffff16565b90506000807fffffffff000000000000000000000000000000000000000000000000000000008084169087161415610d6b57610cc360108d8781518110610ca857fe5b6020026020010151610140015161080b90919063ffffffff16565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190610d18903090600401613246565b60206040518083038186803b158015610d3057600080fd5b505afa158015610d44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d689190810190613150565b90505b600080610d9f8e8881518110610d7d57fe5b60200260200101518d8981518110610d9157fe5b6020026020010151886118ad565b91509150877bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610ead576040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8616906370a0823190610e3e903090600401613246565b60206040518083038186803b158015610e5657600080fd5b505afa158015610e6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e8e9190810190613150565b9050610ea9610ea3828663ffffffff610fca16565b836119d7565b9150505b610ed8818f8981518110610ebd57fe5b6020026020010151610140015161095590919063ffffffff16565b610ee88b8363ffffffff6119ee16565b9a50610efa8a8263ffffffff6119ee16565b99508c8b10610f0e57505050505050610f1d565b5050505050505b600101610b9c565b505050935093915050565b606063cdcbed5d60e01b8383604051602401610f45929190613623565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905092915050565b600082821115610fe357610fe36100e760028585611a06565b50900390565b8015610734576001546040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690632e1a7d4d9061104590849060040161361a565b600060405180830381600087803b15801561105f57600080fd5b505af1158015611073573d6000803e3d6000fd5b505060405133925083156108fc02915083906000818181858888f19350505050158015610967573d6000803e3d6000fd5b825160009081907fdc1600f30000000000000000000000000000000000000000000000000000000090825b8181146113c0578781815181106110e257fe5b60200260200101516080015160001480611113575087818151811061110357fe5b602002602001015160a001516000145b1561111d576113b8565b600061112f888663ffffffff610fca16565b9050600061114460008b8581518110610c4a57fe5b90506000807fffffffff00000000000000000000000000000000000000000000000000000000808416908816141561122f5761118760108d8781518110610ca857fe5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff8316906370a08231906111dc903090600401613246565b60206040518083038186803b1580156111f457600080fd5b505afa158015611208573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061122c9190810190613150565b90505b6000806112638e888151811061124157fe5b60200260200101518d898151811061125557fe5b602002602001015188611a25565b91509150887bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561136b576040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8616906370a0823190611302903090600401613246565b60206040518083038186803b15801561131a57600080fd5b505afa15801561132e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113529190810190613150565b9050611367610ea3828663ffffffff610fca16565b9150505b61137b818f8981518110610ebd57fe5b61138b8b8363ffffffff6119ee16565b9a5061139d8a8263ffffffff6119ee16565b99508c8a106113b1575050505050506113c0565b5050505050505b6001016110cf565b50858310156113d6576113d66100e78785611af7565b5050935093915050565b60408051808201909152600481527fe69edc3e00000000000000000000000000000000000000000000000000000000602082015290565b6060632800659560e01b848484604051602401611436939291906133b1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290505b9392505050565b600060608373ffffffffffffffffffffffffffffffffffffffff16836040516114e6919061322a565b6000604051808303816000865af19150503d8060008114611523576040519150601f19603f3d011682016040523d82523d6000602084013e611528565b606091505b5091509150811561156c578051611540575050610967565b80516020141561156c576000611557826000611b14565b9050806001141561156a57505050610967565b505b6104c4816102d8565b6060631de45ad160e01b8383604051602401610f45929190613267565b8061159c576104c4565b60006115ae858263ffffffff61075b16565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167ff47261b000000000000000000000000000000000000000000000000000000000148061164157507fffffffff0000000000000000000000000000000000000000000000000000000081167fdc1600f300000000000000000000000000000000000000000000000000000000145b1561165d576116588585858563ffffffff611b2016565b6117c6565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f025717920000000000000000000000000000000000000000000000000000000014156116b9576116588585858563ffffffff611b6a16565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fa7cb5fb7000000000000000000000000000000000000000000000000000000001415611715576116588585858563ffffffff611c3916565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f94cfcdd7000000000000000000000000000000000000000000000000000000001415611771576116588585858563ffffffff611d8f16565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fc339d10a00000000000000000000000000000000000000000000000000000000146117c6576117c66100e782611e23565b5050505050565b6060633ecb6ceb60e01b8383604051602401610f45929190613623565b606063ecf40fd960e01b8383604051602401610f45929190613623565b600082611816575060006107ab565b8282028284828161182357fe5b04146114b6576114b66100e760018686611a06565b60006003826101800151511180156107ab57506101808201517f770501f8000000000000000000000000000000000000000000000000000000009061188490600063ffffffff61075b16565b7fffffffff00000000000000000000000000000000000000000000000000000000161492915050565b6000808460e00151600014806118d257506118d2856101a00151866101400151611e3e565b15611929576118df612710565b6118ea868587611feb565b9050611907816080015182602001516119ee90919063ffffffff16565b60608201518251919450611921919063ffffffff610fca16565b9150506119cf565b61193d856101a00151866101600151611e3e565b156119be5760a085015160e086015160009161196a9161196490829063ffffffff6119ee16565b86612026565b9050611974612710565b61197f878388611feb565b90506119b081608001516119a4836060015184602001516119ee90919063ffffffff16565b9063ffffffff6119ee16565b905190935091506119cf9050565b6119cf6100e7866101a0015161205c565b935093915050565b6000818310156119e757816114b6565b5090919050565b6000828201838110156114b6576114b66100e7600086865b606063e946c1bb60e01b8484846040516024016114369392919061338f565b6000808460e0015160001480611a4a5750611a4a856101a00151866101600151611e3e565b15611a6457600061196a8660a00151876080015186612026565b611a78856101a00151866101400151611e3e565b156119be576000611aa28660a001516119648860e001518960800151610fca90919063ffffffff16565b9050611aac612710565b611ab7878388611feb565b9050611ad4816080015182602001516119ee90919063ffffffff16565b60608201518251919550611aee919063ffffffff610fca16565b925050506119cf565b60606391353a0c60e01b8383604051602401610f45929190613623565b60006114b68383612077565b6000611b3385601063ffffffff61080b16565b905073ffffffffffffffffffffffffffffffffffffffff8416301415611b5e576116588184846120a1565b6117c6818585856120d9565b80600114611b7e57611b7e6100e78261219c565b6000611b9185601063ffffffff61080b16565b90506000611ba686602463ffffffff611b1416565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8316906323b872dd90611bff908890889086906004016132f8565b600060405180830381600087803b158015611c1957600080fd5b505af1158015611c2d573d6000803e3d6000fd5b50505050505050505050565b60006060806060611c57600489518a6121b79092919063ffffffff16565b806020019051611c6a9190810190612caa565b9350935093509350600082519050606081604051908082528060200260200182016040528015611ca4578160200160208202803883390190505b50905060005b828114611cf657611cd788868381518110611cc157fe5b602002602001015161180790919063ffffffff16565b828281518110611ce357fe5b6020908102919091010152600101611caa565b506040517f2eb2c2d600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871690632eb2c2d690611d51908c908c908a9087908a9060040161328e565b600060405180830381600087803b158015611d6b57600080fd5b505af1158015611d7f573d6000803e3d6000fd5b5050505050505050505050505050565b606080611da960048751886121b79092919063ffffffff16565b806020019051611dbc9190810190612fc5565b8051919350915060005b818114611e1957611e11838281518110611ddc57fe5b60200260200101518888611e0c888681518110611df557fe5b60200260200101518a61180790919063ffffffff16565b611592565b600101611dc6565b5050505050505050565b6060637996a27160e01b82604051602401610254919061334f565b600080611e51848263ffffffff61075b16565b90506000611e65848263ffffffff61075b16565b90507ff47261b0000000000000000000000000000000000000000000000000000000007fdc1600f3000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008416821480611efd57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b8015611f5b57507fffffffff000000000000000000000000000000000000000000000000000000008381169083161480611f5b57507fffffffff00000000000000000000000000000000000000000000000000000000838116908216145b15611fc6576000611f7388601063ffffffff61080b16565b90506000611f8888601063ffffffff61080b16565b90508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161496505050505050506107ab565b611fd6878763ffffffff61223716565b9450505050506107ab565b5050505092915050565b611ff3612710565b611ffc84611838565b156120135761200c84848461225c565b90506114b6565b61201e8484846124b0565b949350505050565b600061201e8361205061204082600163ffffffff610fca16565b6119a4888763ffffffff61180716565b9063ffffffff61261d16565b60606331360af160e01b82604051602401610254919061337c565b60008160200183511015612098576120986100e76005855185602001611417565b50016020015190565b6040516060907fa9059cbb00000000000000000000000000000000000000000000000000000000906108839085908590602401613329565b6040516060907f23b872dd0000000000000000000000000000000000000000000000000000000090612113908690869086906024016132f8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506117c685826114bd565b606063baffa47460e01b82604051602401610254919061361a565b6060818311156121d0576121d06100e760008585611417565b83518211156121e9576121e96100e76001848751611417565b8282036040519080825280601f01601f191660200182016040528015612216576020820181803883390190505b5090506114b661222582612647565b8461222f87612647565b01835161264d565b6000815183511480156114b65750508051602091820120825192909101919091201490565b612264612710565b61226c61273f565b604051806101800160405280866000015173ffffffffffffffffffffffffffffffffffffffff168152602001866020015173ffffffffffffffffffffffffffffffffffffffff168152602001866040015173ffffffffffffffffffffffffffffffffffffffff168152602001866060015173ffffffffffffffffffffffffffffffffffffffff168152602001866080015181526020018660a001518152602001600081526020016000815260200186610100015181526020018661012001518152602001866101400151815260200186610160015181525090506060600073ffffffffffffffffffffffffffffffffffffffff1663b4be83d5905060e01b82868660405160240161237f939291906133bf565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252600454915190925073ffffffffffffffffffffffffffffffffffffffff90911690600090606090839061243090869061322a565b6000604051808303816000865af19150503d806000811461246d576040519150601f19603f3d011682016040523d82523d6000602084013e612472565b606091505b509150915081156124a457805160801461248857fe5b8080602001905161249c9190810190613168565b602088015286525b50505050509392505050565b6124b8612710565b6040516060907f9b44d55600000000000000000000000000000000000000000000000000000000906124f2908790879087906024016134df565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252600354915190925073ffffffffffffffffffffffffffffffffffffffff9091169060009060609083906125a390869061322a565b6000604051808303816000865af19150503d80600081146125e0576040519150601f19603f3d011682016040523d82523d6000602084013e6125e5565b606091505b5091509150811561261257805160a0146125fb57fe5b8080602001905161260f91908101906130ff565b94505b505050509392505050565b600081612633576126336100e760038585611a06565b600082848161263e57fe5b04949350505050565b60200190565b6020811015612677576001816020036101000a03801983511681855116808217865250505061051b565b828214156126845761051b565b828211156126be5760208103905080820181840181515b828510156126b657845186526020958601959094019361269b565b90525061051b565b60208103905080820181840183515b8186121561270757825182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe092830192909101906126cd565b85525050505050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160608152602001606081525090565b80356107ab816136e6565b600082601f830112612813578081fd5b813561282661282182613658565b613631565b81815291506020808301908481018184028601820187101561284757600080fd5b60005b8481101561286f57813561285d816136e6565b8452928201929082019060010161284a565b505050505092915050565b600082601f83011261288a578081fd5b813561289861282182613658565b8181529150602080830190840160005b83811015611fe1576128c08760208435890101612bd7565b835260209283019291909101906001016128a8565b600082601f8301126128e5578081fd5b81356128f361282182613658565b818152915060208083019084810160005b8481101561286f57813587016101c0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838c0301121561294457600080fd5b61294d81613631565b6129598b8785016127f8565b81526129688b604085016127f8565b868201526129798b606085016127f8565b604082015261298b8b608085016127f8565b606082015260a0830135608082015260c083013560a082015260e083013560c08201526101008084013560e0830152610120808501358284015261014091508185013581840152506101608085013567ffffffffffffffff808211156129f057600080fd5b6129fe8f8b848a0101612bd7565b84860152610180935083870135915080821115612a1a57600080fd5b612a288f8b848a0101612bd7565b838601526101a0925082870135915080821115612a4457600080fd5b612a528f8b848a0101612bd7565b8486015285870135935080841115612a6957600080fd5b5050612a798d8984880101612bd7565b9083015250865250509282019290820190600101612904565b60008083601f840112612aa3578182fd5b50813567ffffffffffffffff811115612aba578182fd5b6020830191508360208083028501011115612ad457600080fd5b9250929050565b600082601f830112612aeb578081fd5b8151612af961282182613658565b818152915060208083019084810181840286018201871015612b1a57600080fd5b60005b8481101561286f57815184529282019290820190600101612b1d565b600082601f830112612b49578081fd5b8135612b5761282182613658565b818152915060208083019084810181840286018201871015612b7857600080fd5b60005b8481101561286f57813584529282019290820190600101612b7b565b60008083601f840112612ba8578182fd5b50813567ffffffffffffffff811115612bbf578182fd5b602083019150836020828501011115612ad457600080fd5b600082601f830112612be7578081fd5b8135612bf561282182613678565b9150808252836020828501011115612c0c57600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112612c35578081fd5b8151612c4361282182613678565b9150808252836020828501011115612c5a57600080fd5b612c6b8160208401602086016136ba565b5092915050565b600060208284031215612c83578081fd5b81356114b6816136e6565b600060208284031215612c9f578081fd5b81516114b6816136e6565b60008060008060808587031215612cbf578283fd5b8451612cca816136e6565b602086015190945067ffffffffffffffff80821115612ce7578485fd5b612cf388838901612adb565b94506040870151915080821115612d08578384fd5b612d1488838901612adb565b93506060870151915080821115612d29578283fd5b50612d3687828801612c25565b91505092959194509250565b60008060008060008060008060a0898b031215612d5d578586fd5b8835612d68816136e6565b97506020890135612d78816136e6565b9650604089013567ffffffffffffffff80821115612d94578788fd5b612da08c838d01612a92565b909850965060608b0135915080821115612db8578586fd5b612dc48c838d01612a92565b909650945060808b0135915080821115612ddc578384fd5b50612de98b828c01612b97565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215612e15578384fd5b8635612e20816136e6565b95506020870135612e30816136e6565b94506040870135935060608701359250608087013567ffffffffffffffff811115612e59578283fd5b612e6589828a01612b97565b979a9699509497509295939492505050565b60008060008060808587031215612e8c578182fd5b843567ffffffffffffffff80821115612ea3578384fd5b612eaf888389016128d5565b95506020870135915080821115612ec4578384fd5b612ed08883890161287a565b94506040870135915080821115612ee5578384fd5b612ef188838901612b39565b93506060870135915080821115612f06578283fd5b50612d3687828801612803565b600080600080600060a08688031215612f2a578283fd5b853567ffffffffffffffff80821115612f41578485fd5b612f4d89838a016128d5565b9650602088013595506040880135915080821115612f69578485fd5b612f7589838a0161287a565b94506060880135915080821115612f8a578283fd5b612f9689838a01612b39565b93506080880135915080821115612fab578283fd5b50612fb888828901612803565b9150509295509295909350565b60008060408385031215612fd7578182fd5b825167ffffffffffffffff80821115612fee578384fd5b612ffa86838701612adb565b9350602091508185015181811115613010578384fd5b85019050601f81018613613022578283fd5b805161303061282182613658565b81815283810190838501865b84811015613065576130538b888451890101612c25565b8452928601929086019060010161303c565b5096999098509650505050505050565b60008060208385031215613087578182fd5b823567ffffffffffffffff81111561309d578283fd5b6130a985828601612b97565b90969095509350505050565b6000806000604084860312156130c9578081fd5b833567ffffffffffffffff8111156130df578182fd5b6130eb86828701612b97565b909790965060209590950135949350505050565b600060a08284031215613110578081fd5b61311a60a0613631565b82518152602083015160208201526040830151604082015260608301516060820152608083015160808201528091505092915050565b600060208284031215613161578081fd5b5051919050565b6000806040838503121561317a578182fd5b505080516020909101519092909150565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208401935060208301825b828110156131d65781518652602095860195909101906001016131b8565b5093949350505050565b600081518084526131f88160208601602086016136ba565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000825161323c8184602087016136ba565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526132c760a08301866131a5565b82810360608401526132d981866131a5565b83810360808501526132eb81866131e0565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b6000602082526114b660208301846131e0565b606081016004851061339d57fe5b938152602081019290925260409091015290565b606081016008851061339d57fe5b6000606082526133d360608301865161318b565b60208501516133e5608084018261318b565b5060408501516133f860a084018261318b565b50606085015161340b60c084018261318b565b50608085015160e083015260a0850151610100818185015260c08701519150610120828186015260e088015192506101408381870152828901519350610160925083838701528189015193506101809150838287015280890151935050806101a08601525061347e6101e08501836131e0565b8188015192507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0858203016101c08601526134b981846131e0565b91505085602085015283810360408501526134d481866131e0565b979650505050505050565b6000606082526134f360608301865161318b565b6020850151613505608084018261318b565b50604085015161351860a084018261318b565b50606085015161352b60c084018261318b565b50608085015160e083015260a0850151610100818185015260c08701519150610120828186015260e0880151925061014083818701528289015193506101609250838387015281890151935061018091508382870152808901519350506101c06101a081818801526135a16102208801866131e0565b848b015195507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa094508488820301838901526135dd81876131e0565b925050828a0151945083878303016101e08801526135fb82866131e0565b9250808a01519450505081858203016102008601526134b981846131e0565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff8111828210171561365057600080fd5b604052919050565b600067ffffffffffffffff82111561366e578081fd5b5060209081020190565b600067ffffffffffffffff82111561368e578081fd5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b838110156136d55781810151838201526020016136bd565b838111156104c45750506000910152565b73ffffffffffffffffffffffffffffffffffffffff8116811461073457600080fdfea365627a7a72315820ebedf6ba0823da75dd29d928186748ec6baa07f40f145a90097baa22da29b56a6c6578706572696d656e74616cf564736f6c63430005100040" }, "deployedBytecode": { - "object": "0x6080604052600436106100bc5760003560e01c8063bc197c8111610074578063f23a6e611161004e578063f23a6e61146101e4578063f2fde38b14610204578063fc67bf1c14610224576100bc565b8063bc197c811461018d578063e0a5c949146101ba578063e196001b146101cf576100bc565b80638da5cb5b116100a55780638da5cb5b1461012e578063907e5cc3146101595780639e8323151461017a576100bc565b8063442026ed146100ee578063630f1e6c1461010e575b60015473ffffffffffffffffffffffffffffffffffffffff1633146100ec576100ec6100e733610239565b6102d8565b005b3480156100fa57600080fd5b506100ec610109366004613075565b6102e0565b34801561011a57600080fd5b506100ec6101293660046130b5565b6104ca565b34801561013a57600080fd5b50610143610520565b6040516101509190613246565b60405180910390f35b61016c610167366004612e77565b61053c565b604051610150929190613623565b61016c610188366004612f13565b610597565b34801561019957600080fd5b506101ad6101a8366004612d42565b6105f3565b604051610150919061334f565b3480156101c657600080fd5b506101ad610620565b3480156101db57600080fd5b506101ad610644565b3480156101f057600080fd5b506101ad6101ff366004612dfd565b610668565b34801561021057600080fd5b506100ec61021f366004612c72565b610693565b34801561023057600080fd5b506101ad610737565b60606308b1869860e01b826040516024016102549190613246565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b805160208201fd5b600061032c600084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff61075b169050565b90507ff47261b0000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082168114156104c4576003546040517f6070410800000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906360704108906103d090859060040161334f565b60206040518083038186803b1580156103e857600080fd5b505afa1580156103fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506104209190810190612c8e565b905073ffffffffffffffffffffffffffffffffffffffff8116610448576104486100e76107b1565b6000610494601087878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff61080b169050565b90506104c181837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61084b565b50505b50505050565b6104d261090c565b61051b8184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff610955169050565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b600080600061054b858561096b565b9050610558878288610ac1565b909350915080831115610572576105726100e78434610f28565b610582818463ffffffff610fca16565b905061058d81610fe9565b5094509492505050565b60008060006105a6858561096b565b90506105b38888886110a4565b9093509150808311156105cd576105cd6100e78434610f28565b6105dd818463ffffffff610fca16565b90506105e881610fe9565b509550959350505050565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b7ff23a6e610000000000000000000000000000000000000000000000000000000081565b7f770501f80000000000000000000000000000000000000000000000000000000081565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b61069b61090c565b73ffffffffffffffffffffffffffffffffffffffff81166106c6576106c16100e76113e0565b610734565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35b50565b7fbc197c810000000000000000000000000000000000000000000000000000000081565b6000816004018351101561077c5761077c6100e76003855185600401611417565b5060208183018101519101907fffffffff00000000000000000000000000000000000000000000000000000000165b92915050565b6040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff3b96b8d0000000000000000000000000000000000000000000000000000000017905290565b6000816014018351101561082c5761082c6100e76004855185601401611417565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b6040516060907f095ea7b300000000000000000000000000000000000000000000000000000000906108839085908590602401613329565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506104c484826114bd565b60005473ffffffffffffffffffffffffffffffffffffffff16331461095357600054610953906100e790339073ffffffffffffffffffffffffffffffffffffffff16611575565b565b6109678230338463ffffffff61159216565b5050565b81518151600091908114610987576109876100e78285516117cd565b34915060005b818114610a365760008582815181106109a257fe5b60200260200101519050808410156109c1576109c16100e782866117ea565b6109d1848263ffffffff610fca16565b93508482815181106109df57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610a2c573d6000803e3d6000fd5b505060010161098d565b50600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015610aa157600080fd5b505af1158015610ab5573d6000803e3d6000fd5b50505050505092915050565b6000806000610b76600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631ce4c78b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610b3157600080fd5b505afa158015610b45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b699190810190613150565b3a9063ffffffff61180716565b90507fdc1600f30000000000000000000000000000000000000000000000000000000060005b87518114610f1d57878181518110610bb057fe5b60200260200101516080015160001480610be15750878181518110610bd157fe5b602002602001015160a001516000145b15610beb57610f15565b6000610c35610c0c8a8481518110610bff57fe5b6020026020010151611838565b610c165784610c19565b60005b610c298a8963ffffffff610fca16565b9063ffffffff610fca16565b90506000610c6560008b8581518110610c4a57fe5b6020026020010151610140015161075b90919063ffffffff16565b90506000807fffffffff000000000000000000000000000000000000000000000000000000008084169087161415610d6b57610cc360108d8781518110610ca857fe5b6020026020010151610140015161080b90919063ffffffff16565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190610d18903090600401613246565b60206040518083038186803b158015610d3057600080fd5b505afa158015610d44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d689190810190613150565b90505b600080610d9f8e8881518110610d7d57fe5b60200260200101518d8981518110610d9157fe5b6020026020010151886118ad565b91509150877bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610ead576040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8616906370a0823190610e3e903090600401613246565b60206040518083038186803b158015610e5657600080fd5b505afa158015610e6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e8e9190810190613150565b9050610ea9610ea3828663ffffffff610fca16565b836119d7565b9150505b610ed8818f8981518110610ebd57fe5b6020026020010151610140015161095590919063ffffffff16565b610ee88b8363ffffffff6119ee16565b9a50610efa8a8263ffffffff6119ee16565b99508c8b10610f0e57505050505050610f1d565b5050505050505b600101610b9c565b505050935093915050565b606063cdcbed5d60e01b8383604051602401610f45929190613623565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905092915050565b600082821115610fe357610fe36100e760028585611a06565b50900390565b8015610734576001546040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690632e1a7d4d9061104590849060040161361a565b600060405180830381600087803b15801561105f57600080fd5b505af1158015611073573d6000803e3d6000fd5b505060405133925083156108fc02915083906000818181858888f19350505050158015610967573d6000803e3d6000fd5b825160009081907fdc1600f30000000000000000000000000000000000000000000000000000000090825b8181146113c0578781815181106110e257fe5b60200260200101516080015160001480611113575087818151811061110357fe5b602002602001015160a001516000145b1561111d576113b8565b600061112f888663ffffffff610fca16565b9050600061114460008b8581518110610c4a57fe5b90506000807fffffffff00000000000000000000000000000000000000000000000000000000808416908816141561122f5761118760108d8781518110610ca857fe5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff8316906370a08231906111dc903090600401613246565b60206040518083038186803b1580156111f457600080fd5b505afa158015611208573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061122c9190810190613150565b90505b6000806112638e888151811061124157fe5b60200260200101518d898151811061125557fe5b602002602001015188611a25565b91509150887bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561136b576040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8616906370a0823190611302903090600401613246565b60206040518083038186803b15801561131a57600080fd5b505afa15801561132e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113529190810190613150565b9050611367610ea3828663ffffffff610fca16565b9150505b61137b818f8981518110610ebd57fe5b61138b8b8363ffffffff6119ee16565b9a5061139d8a8263ffffffff6119ee16565b99508c8a106113b1575050505050506113c0565b5050505050505b6001016110cf565b50858310156113d6576113d66100e78785611af7565b5050935093915050565b60408051808201909152600481527fe69edc3e00000000000000000000000000000000000000000000000000000000602082015290565b6060632800659560e01b848484604051602401611436939291906133b1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290505b9392505050565b600060608373ffffffffffffffffffffffffffffffffffffffff16836040516114e6919061322a565b6000604051808303816000865af19150503d8060008114611523576040519150601f19603f3d011682016040523d82523d6000602084013e611528565b606091505b5091509150811561156c578051611540575050610967565b80516020141561156c576000611557826000611b14565b9050806001141561156a57505050610967565b505b6104c4816102d8565b6060631de45ad160e01b8383604051602401610f45929190613267565b8061159c576104c4565b60006115ae858263ffffffff61075b16565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167ff47261b000000000000000000000000000000000000000000000000000000000148061164157507fffffffff0000000000000000000000000000000000000000000000000000000081167fdc1600f300000000000000000000000000000000000000000000000000000000145b1561165d576116588585858563ffffffff611b2016565b6117c6565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f025717920000000000000000000000000000000000000000000000000000000014156116b9576116588585858563ffffffff611b6a16565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fa7cb5fb7000000000000000000000000000000000000000000000000000000001415611715576116588585858563ffffffff611c3916565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f94cfcdd7000000000000000000000000000000000000000000000000000000001415611771576116588585858563ffffffff611d8f16565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fc339d10a00000000000000000000000000000000000000000000000000000000146117c6576117c66100e782611e23565b5050505050565b6060633ecb6ceb60e01b8383604051602401610f45929190613623565b606063ecf40fd960e01b8383604051602401610f45929190613623565b600082611816575060006107ab565b8282028284828161182357fe5b04146114b6576114b66100e760018686611a06565b60006003826101800151511180156107ab57506101808201517f770501f8000000000000000000000000000000000000000000000000000000009061188490600063ffffffff61075b16565b7fffffffff00000000000000000000000000000000000000000000000000000000161492915050565b6000808460e00151600014806118d257506118d2856101a00151866101400151611e3e565b15611929576118df612710565b6118ea868587611feb565b9050611907816080015182602001516119ee90919063ffffffff16565b60608201518251919450611921919063ffffffff610fca16565b9150506119cf565b61193d856101a00151866101600151611e3e565b156119be5760a085015160e086015160009161196a9161196490829063ffffffff6119ee16565b86612026565b9050611974612710565b61197f878388611feb565b90506119b081608001516119a4836060015184602001516119ee90919063ffffffff16565b9063ffffffff6119ee16565b905190935091506119cf9050565b6119cf6100e7866101a0015161205c565b935093915050565b6000818310156119e757816114b6565b5090919050565b6000828201838110156114b6576114b66100e7600086865b606063e946c1bb60e01b8484846040516024016114369392919061338f565b6000808460e0015160001480611a4a5750611a4a856101a00151866101600151611e3e565b15611a6457600061196a8660a00151876080015186612026565b611a78856101a00151866101400151611e3e565b156119be576000611aa28660a001516119648860e001518960800151610fca90919063ffffffff16565b9050611aac612710565b611ab7878388611feb565b9050611ad4816080015182602001516119ee90919063ffffffff16565b60608201518251919550611aee919063ffffffff610fca16565b925050506119cf565b60606391353a0c60e01b8383604051602401610f45929190613623565b60006114b68383612077565b6000611b3385601063ffffffff61080b16565b905073ffffffffffffffffffffffffffffffffffffffff8416301415611b5e576116588184846120a1565b6117c6818585856120d9565b80600114611b7e57611b7e6100e78261219c565b6000611b9185601063ffffffff61080b16565b90506000611ba686602463ffffffff611b1416565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8316906323b872dd90611bff908890889086906004016132f8565b600060405180830381600087803b158015611c1957600080fd5b505af1158015611c2d573d6000803e3d6000fd5b50505050505050505050565b60006060806060611c57600489518a6121b79092919063ffffffff16565b806020019051611c6a9190810190612caa565b9350935093509350600082519050606081604051908082528060200260200182016040528015611ca4578160200160208202803883390190505b50905060005b828114611cf657611cd788868381518110611cc157fe5b602002602001015161180790919063ffffffff16565b828281518110611ce357fe5b6020908102919091010152600101611caa565b506040517f2eb2c2d600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871690632eb2c2d690611d51908c908c908a9087908a9060040161328e565b600060405180830381600087803b158015611d6b57600080fd5b505af1158015611d7f573d6000803e3d6000fd5b5050505050505050505050505050565b606080611da960048751886121b79092919063ffffffff16565b806020019051611dbc9190810190612fc5565b8051919350915060005b818114611e1957611e11838281518110611ddc57fe5b60200260200101518888611e0c888681518110611df557fe5b60200260200101518a61180790919063ffffffff16565b611592565b600101611dc6565b5050505050505050565b6060637996a27160e01b82604051602401610254919061334f565b600080611e51848263ffffffff61075b16565b90506000611e65848263ffffffff61075b16565b90507ff47261b0000000000000000000000000000000000000000000000000000000007fdc1600f3000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008416821480611efd57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b8015611f5b57507fffffffff000000000000000000000000000000000000000000000000000000008381169083161480611f5b57507fffffffff00000000000000000000000000000000000000000000000000000000838116908216145b15611fc6576000611f7388601063ffffffff61080b16565b90506000611f8888601063ffffffff61080b16565b90508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161496505050505050506107ab565b611fd6878763ffffffff61223716565b9450505050506107ab565b5050505092915050565b611ff3612710565b611ffc84611838565b156120135761200c84848461225c565b90506114b6565b61201e8484846124b0565b949350505050565b600061201e8361205061204082600163ffffffff610fca16565b6119a4888763ffffffff61180716565b9063ffffffff61261d16565b60606331360af160e01b82604051602401610254919061337c565b60008160200183511015612098576120986100e76005855185602001611417565b50016020015190565b6040516060907fa9059cbb00000000000000000000000000000000000000000000000000000000906108839085908590602401613329565b6040516060907f23b872dd0000000000000000000000000000000000000000000000000000000090612113908690869086906024016132f8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506117c685826114bd565b606063baffa47460e01b82604051602401610254919061361a565b6060818311156121d0576121d06100e760008585611417565b83518211156121e9576121e96100e76001848751611417565b8282036040519080825280601f01601f191660200182016040528015612216576020820181803883390190505b5090506114b661222582612647565b8461222f87612647565b01835161264d565b6000815183511480156114b65750508051602091820120825192909101919091201490565b612264612710565b61226c61273f565b604051806101800160405280866000015173ffffffffffffffffffffffffffffffffffffffff168152602001866020015173ffffffffffffffffffffffffffffffffffffffff168152602001866040015173ffffffffffffffffffffffffffffffffffffffff168152602001866060015173ffffffffffffffffffffffffffffffffffffffff168152602001866080015181526020018660a001518152602001600081526020016000815260200186610100015181526020018661012001518152602001866101400151815260200186610160015181525090506060600073ffffffffffffffffffffffffffffffffffffffff1663b4be83d5905060e01b82868660405160240161237f939291906133bf565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252600454915190925073ffffffffffffffffffffffffffffffffffffffff90911690600090606090839061243090869061322a565b6000604051808303816000865af19150503d806000811461246d576040519150601f19603f3d011682016040523d82523d6000602084013e612472565b606091505b509150915081156124a457805160801461248857fe5b8080602001905161249c9190810190613168565b602088015286525b50505050509392505050565b6124b8612710565b6040516060907f9b44d55600000000000000000000000000000000000000000000000000000000906124f2908790879087906024016134df565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252600354915190925073ffffffffffffffffffffffffffffffffffffffff9091169060009060609083906125a390869061322a565b6000604051808303816000865af19150503d80600081146125e0576040519150601f19603f3d011682016040523d82523d6000602084013e6125e5565b606091505b5091509150811561261257805160a0146125fb57fe5b8080602001905161260f91908101906130ff565b94505b505050509392505050565b600081612633576126336100e760038585611a06565b600082848161263e57fe5b04949350505050565b60200190565b6020811015612677576001816020036101000a03801983511681855116808217865250505061051b565b828214156126845761051b565b828211156126be5760208103905080820181840181515b828510156126b657845186526020958601959094019361269b565b90525061051b565b60208103905080820181840183515b8186121561270757825182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe092830192909101906126cd565b85525050505050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160608152602001606081525090565b80356107ab816136e6565b600082601f830112612813578081fd5b813561282661282182613658565b613631565b81815291506020808301908481018184028601820187101561284757600080fd5b60005b8481101561286f57813561285d816136e6565b8452928201929082019060010161284a565b505050505092915050565b600082601f83011261288a578081fd5b813561289861282182613658565b8181529150602080830190840160005b83811015611fe1576128c08760208435890101612bd7565b835260209283019291909101906001016128a8565b600082601f8301126128e5578081fd5b81356128f361282182613658565b818152915060208083019084810160005b8481101561286f57813587016101c0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838c0301121561294457600080fd5b61294d81613631565b6129598b8785016127f8565b81526129688b604085016127f8565b868201526129798b606085016127f8565b604082015261298b8b608085016127f8565b606082015260a0830135608082015260c083013560a082015260e083013560c08201526101008084013560e0830152610120808501358284015261014091508185013581840152506101608085013567ffffffffffffffff808211156129f057600080fd5b6129fe8f8b848a0101612bd7565b84860152610180935083870135915080821115612a1a57600080fd5b612a288f8b848a0101612bd7565b838601526101a0925082870135915080821115612a4457600080fd5b612a528f8b848a0101612bd7565b8486015285870135935080841115612a6957600080fd5b5050612a798d8984880101612bd7565b9083015250865250509282019290820190600101612904565b60008083601f840112612aa3578182fd5b50813567ffffffffffffffff811115612aba578182fd5b6020830191508360208083028501011115612ad457600080fd5b9250929050565b600082601f830112612aeb578081fd5b8151612af961282182613658565b818152915060208083019084810181840286018201871015612b1a57600080fd5b60005b8481101561286f57815184529282019290820190600101612b1d565b600082601f830112612b49578081fd5b8135612b5761282182613658565b818152915060208083019084810181840286018201871015612b7857600080fd5b60005b8481101561286f57813584529282019290820190600101612b7b565b60008083601f840112612ba8578182fd5b50813567ffffffffffffffff811115612bbf578182fd5b602083019150836020828501011115612ad457600080fd5b600082601f830112612be7578081fd5b8135612bf561282182613678565b9150808252836020828501011115612c0c57600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112612c35578081fd5b8151612c4361282182613678565b9150808252836020828501011115612c5a57600080fd5b612c6b8160208401602086016136ba565b5092915050565b600060208284031215612c83578081fd5b81356114b6816136e6565b600060208284031215612c9f578081fd5b81516114b6816136e6565b60008060008060808587031215612cbf578283fd5b8451612cca816136e6565b602086015190945067ffffffffffffffff80821115612ce7578485fd5b612cf388838901612adb565b94506040870151915080821115612d08578384fd5b612d1488838901612adb565b93506060870151915080821115612d29578283fd5b50612d3687828801612c25565b91505092959194509250565b60008060008060008060008060a0898b031215612d5d578586fd5b8835612d68816136e6565b97506020890135612d78816136e6565b9650604089013567ffffffffffffffff80821115612d94578788fd5b612da08c838d01612a92565b909850965060608b0135915080821115612db8578586fd5b612dc48c838d01612a92565b909650945060808b0135915080821115612ddc578384fd5b50612de98b828c01612b97565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215612e15578384fd5b8635612e20816136e6565b95506020870135612e30816136e6565b94506040870135935060608701359250608087013567ffffffffffffffff811115612e59578283fd5b612e6589828a01612b97565b979a9699509497509295939492505050565b60008060008060808587031215612e8c578182fd5b843567ffffffffffffffff80821115612ea3578384fd5b612eaf888389016128d5565b95506020870135915080821115612ec4578384fd5b612ed08883890161287a565b94506040870135915080821115612ee5578384fd5b612ef188838901612b39565b93506060870135915080821115612f06578283fd5b50612d3687828801612803565b600080600080600060a08688031215612f2a578283fd5b853567ffffffffffffffff80821115612f41578485fd5b612f4d89838a016128d5565b9650602088013595506040880135915080821115612f69578485fd5b612f7589838a0161287a565b94506060880135915080821115612f8a578283fd5b612f9689838a01612b39565b93506080880135915080821115612fab578283fd5b50612fb888828901612803565b9150509295509295909350565b60008060408385031215612fd7578182fd5b825167ffffffffffffffff80821115612fee578384fd5b612ffa86838701612adb565b9350602091508185015181811115613010578384fd5b85019050601f81018613613022578283fd5b805161303061282182613658565b81815283810190838501865b84811015613065576130538b888451890101612c25565b8452928601929086019060010161303c565b5096999098509650505050505050565b60008060208385031215613087578182fd5b823567ffffffffffffffff81111561309d578283fd5b6130a985828601612b97565b90969095509350505050565b6000806000604084860312156130c9578081fd5b833567ffffffffffffffff8111156130df578182fd5b6130eb86828701612b97565b909790965060209590950135949350505050565b600060a08284031215613110578081fd5b61311a60a0613631565b82518152602083015160208201526040830151604082015260608301516060820152608083015160808201528091505092915050565b600060208284031215613161578081fd5b5051919050565b6000806040838503121561317a578182fd5b505080516020909101519092909150565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208401935060208301825b828110156131d65781518652602095860195909101906001016131b8565b5093949350505050565b600081518084526131f88160208601602086016136ba565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000825161323c8184602087016136ba565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526132c760a08301866131a5565b82810360608401526132d981866131a5565b83810360808501526132eb81866131e0565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b6000602082526114b660208301846131e0565b606081016004851061339d57fe5b938152602081019290925260409091015290565b606081016008851061339d57fe5b6000606082526133d360608301865161318b565b60208501516133e5608084018261318b565b5060408501516133f860a084018261318b565b50606085015161340b60c084018261318b565b50608085015160e083015260a0850151610100818185015260c08701519150610120828186015260e088015192506101408381870152828901519350610160925083838701528189015193506101809150838287015280890151935050806101a08601525061347e6101e08501836131e0565b8188015192507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0858203016101c08601526134b981846131e0565b91505085602085015283810360408501526134d481866131e0565b979650505050505050565b6000606082526134f360608301865161318b565b6020850151613505608084018261318b565b50604085015161351860a084018261318b565b50606085015161352b60c084018261318b565b50608085015160e083015260a0850151610100818185015260c08701519150610120828186015260e0880151925061014083818701528289015193506101609250838387015281890151935061018091508382870152808901519350506101c06101a081818801526135a16102208801866131e0565b848b015195507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa094508488820301838901526135dd81876131e0565b925050828a0151945083878303016101e08801526135fb82866131e0565b9250808a01519450505081858203016102008601526134b981846131e0565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff8111828210171561365057600080fd5b604052919050565b600067ffffffffffffffff82111561366e578081fd5b5060209081020190565b600067ffffffffffffffff82111561368e578081fd5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b838110156136d55781810151838201526020016136bd565b838111156104c45750506000910152565b73ffffffffffffffffffffffffffffffffffffffff8116811461073457600080fdfea365627a7a7231582046e7b4801e4017360012dc9f596c66d1113c57a190987d4f3089965a65faa3c56c6578706572696d656e74616cf564736f6c63430005100040" + "object": "0x6080604052600436106100bc5760003560e01c8063bc197c8111610074578063f23a6e611161004e578063f23a6e61146101e4578063f2fde38b14610204578063fc67bf1c14610224576100bc565b8063bc197c811461018d578063e0a5c949146101ba578063e196001b146101cf576100bc565b80638da5cb5b116100a55780638da5cb5b1461012e578063907e5cc3146101595780639e8323151461017a576100bc565b8063442026ed146100ee578063630f1e6c1461010e575b60015473ffffffffffffffffffffffffffffffffffffffff1633146100ec576100ec6100e733610239565b6102d8565b005b3480156100fa57600080fd5b506100ec610109366004613075565b6102e0565b34801561011a57600080fd5b506100ec6101293660046130b5565b6104ca565b34801561013a57600080fd5b50610143610520565b6040516101509190613246565b60405180910390f35b61016c610167366004612e77565b61053c565b604051610150929190613623565b61016c610188366004612f13565b610597565b34801561019957600080fd5b506101ad6101a8366004612d42565b6105f3565b604051610150919061334f565b3480156101c657600080fd5b506101ad610620565b3480156101db57600080fd5b506101ad610644565b3480156101f057600080fd5b506101ad6101ff366004612dfd565b610668565b34801561021057600080fd5b506100ec61021f366004612c72565b610693565b34801561023057600080fd5b506101ad610737565b60606308b1869860e01b826040516024016102549190613246565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b805160208201fd5b600061032c600084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff61075b169050565b90507ff47261b0000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082168114156104c4576003546040517f6070410800000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906360704108906103d090859060040161334f565b60206040518083038186803b1580156103e857600080fd5b505afa1580156103fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506104209190810190612c8e565b905073ffffffffffffffffffffffffffffffffffffffff8116610448576104486100e76107b1565b6000610494601087878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff61080b169050565b90506104c181837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61084b565b50505b50505050565b6104d261090c565b61051b8184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff610955169050565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b600080600061054b858561096b565b9050610558878288610ac1565b909350915080831115610572576105726100e78434610f28565b610582818463ffffffff610fca16565b905061058d81610fe9565b5094509492505050565b60008060006105a6858561096b565b90506105b38888886110a4565b9093509150808311156105cd576105cd6100e78434610f28565b6105dd818463ffffffff610fca16565b90506105e881610fe9565b509550959350505050565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b7ff23a6e610000000000000000000000000000000000000000000000000000000081565b7f770501f80000000000000000000000000000000000000000000000000000000081565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b61069b61090c565b73ffffffffffffffffffffffffffffffffffffffff81166106c6576106c16100e76113e0565b610734565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35b50565b7fbc197c810000000000000000000000000000000000000000000000000000000081565b6000816004018351101561077c5761077c6100e76003855185600401611417565b5060208183018101519101907fffffffff00000000000000000000000000000000000000000000000000000000165b92915050565b6040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff3b96b8d0000000000000000000000000000000000000000000000000000000017905290565b6000816014018351101561082c5761082c6100e76004855185601401611417565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b6040516060907f095ea7b300000000000000000000000000000000000000000000000000000000906108839085908590602401613329565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506104c484826114bd565b60005473ffffffffffffffffffffffffffffffffffffffff16331461095357600054610953906100e790339073ffffffffffffffffffffffffffffffffffffffff16611575565b565b6109678230338463ffffffff61159216565b5050565b81518151600091908114610987576109876100e78285516117cd565b34915060005b818114610a365760008582815181106109a257fe5b60200260200101519050808410156109c1576109c16100e782866117ea565b6109d1848263ffffffff610fca16565b93508482815181106109df57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610a2c573d6000803e3d6000fd5b505060010161098d565b50600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015610aa157600080fd5b505af1158015610ab5573d6000803e3d6000fd5b50505050505092915050565b6000806000610b76600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631ce4c78b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610b3157600080fd5b505afa158015610b45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b699190810190613150565b3a9063ffffffff61180716565b90507fdc1600f30000000000000000000000000000000000000000000000000000000060005b87518114610f1d57878181518110610bb057fe5b60200260200101516080015160001480610be15750878181518110610bd157fe5b602002602001015160a001516000145b15610beb57610f15565b6000610c35610c0c8a8481518110610bff57fe5b6020026020010151611838565b610c165784610c19565b60005b610c298a8963ffffffff610fca16565b9063ffffffff610fca16565b90506000610c6560008b8581518110610c4a57fe5b6020026020010151610140015161075b90919063ffffffff16565b90506000807fffffffff000000000000000000000000000000000000000000000000000000008084169087161415610d6b57610cc360108d8781518110610ca857fe5b6020026020010151610140015161080b90919063ffffffff16565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190610d18903090600401613246565b60206040518083038186803b158015610d3057600080fd5b505afa158015610d44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d689190810190613150565b90505b600080610d9f8e8881518110610d7d57fe5b60200260200101518d8981518110610d9157fe5b6020026020010151886118ad565b91509150877bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610ead576040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8616906370a0823190610e3e903090600401613246565b60206040518083038186803b158015610e5657600080fd5b505afa158015610e6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e8e9190810190613150565b9050610ea9610ea3828663ffffffff610fca16565b836119d7565b9150505b610ed8818f8981518110610ebd57fe5b6020026020010151610140015161095590919063ffffffff16565b610ee88b8363ffffffff6119ee16565b9a50610efa8a8263ffffffff6119ee16565b99508c8b10610f0e57505050505050610f1d565b5050505050505b600101610b9c565b505050935093915050565b606063cdcbed5d60e01b8383604051602401610f45929190613623565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905092915050565b600082821115610fe357610fe36100e760028585611a06565b50900390565b8015610734576001546040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690632e1a7d4d9061104590849060040161361a565b600060405180830381600087803b15801561105f57600080fd5b505af1158015611073573d6000803e3d6000fd5b505060405133925083156108fc02915083906000818181858888f19350505050158015610967573d6000803e3d6000fd5b825160009081907fdc1600f30000000000000000000000000000000000000000000000000000000090825b8181146113c0578781815181106110e257fe5b60200260200101516080015160001480611113575087818151811061110357fe5b602002602001015160a001516000145b1561111d576113b8565b600061112f888663ffffffff610fca16565b9050600061114460008b8581518110610c4a57fe5b90506000807fffffffff00000000000000000000000000000000000000000000000000000000808416908816141561122f5761118760108d8781518110610ca857fe5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff8316906370a08231906111dc903090600401613246565b60206040518083038186803b1580156111f457600080fd5b505afa158015611208573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061122c9190810190613150565b90505b6000806112638e888151811061124157fe5b60200260200101518d898151811061125557fe5b602002602001015188611a25565b91509150887bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561136b576040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8616906370a0823190611302903090600401613246565b60206040518083038186803b15801561131a57600080fd5b505afa15801561132e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113529190810190613150565b9050611367610ea3828663ffffffff610fca16565b9150505b61137b818f8981518110610ebd57fe5b61138b8b8363ffffffff6119ee16565b9a5061139d8a8263ffffffff6119ee16565b99508c8a106113b1575050505050506113c0565b5050505050505b6001016110cf565b50858310156113d6576113d66100e78785611af7565b5050935093915050565b60408051808201909152600481527fe69edc3e00000000000000000000000000000000000000000000000000000000602082015290565b6060632800659560e01b848484604051602401611436939291906133b1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290505b9392505050565b600060608373ffffffffffffffffffffffffffffffffffffffff16836040516114e6919061322a565b6000604051808303816000865af19150503d8060008114611523576040519150601f19603f3d011682016040523d82523d6000602084013e611528565b606091505b5091509150811561156c578051611540575050610967565b80516020141561156c576000611557826000611b14565b9050806001141561156a57505050610967565b505b6104c4816102d8565b6060631de45ad160e01b8383604051602401610f45929190613267565b8061159c576104c4565b60006115ae858263ffffffff61075b16565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167ff47261b000000000000000000000000000000000000000000000000000000000148061164157507fffffffff0000000000000000000000000000000000000000000000000000000081167fdc1600f300000000000000000000000000000000000000000000000000000000145b1561165d576116588585858563ffffffff611b2016565b6117c6565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f025717920000000000000000000000000000000000000000000000000000000014156116b9576116588585858563ffffffff611b6a16565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fa7cb5fb7000000000000000000000000000000000000000000000000000000001415611715576116588585858563ffffffff611c3916565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f94cfcdd7000000000000000000000000000000000000000000000000000000001415611771576116588585858563ffffffff611d8f16565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fc339d10a00000000000000000000000000000000000000000000000000000000146117c6576117c66100e782611e23565b5050505050565b6060633ecb6ceb60e01b8383604051602401610f45929190613623565b606063ecf40fd960e01b8383604051602401610f45929190613623565b600082611816575060006107ab565b8282028284828161182357fe5b04146114b6576114b66100e760018686611a06565b60006003826101800151511180156107ab57506101808201517f770501f8000000000000000000000000000000000000000000000000000000009061188490600063ffffffff61075b16565b7fffffffff00000000000000000000000000000000000000000000000000000000161492915050565b6000808460e00151600014806118d257506118d2856101a00151866101400151611e3e565b15611929576118df612710565b6118ea868587611feb565b9050611907816080015182602001516119ee90919063ffffffff16565b60608201518251919450611921919063ffffffff610fca16565b9150506119cf565b61193d856101a00151866101600151611e3e565b156119be5760a085015160e086015160009161196a9161196490829063ffffffff6119ee16565b86612026565b9050611974612710565b61197f878388611feb565b90506119b081608001516119a4836060015184602001516119ee90919063ffffffff16565b9063ffffffff6119ee16565b905190935091506119cf9050565b6119cf6100e7866101a0015161205c565b935093915050565b6000818310156119e757816114b6565b5090919050565b6000828201838110156114b6576114b66100e7600086865b606063e946c1bb60e01b8484846040516024016114369392919061338f565b6000808460e0015160001480611a4a5750611a4a856101a00151866101600151611e3e565b15611a6457600061196a8660a00151876080015186612026565b611a78856101a00151866101400151611e3e565b156119be576000611aa28660a001516119648860e001518960800151610fca90919063ffffffff16565b9050611aac612710565b611ab7878388611feb565b9050611ad4816080015182602001516119ee90919063ffffffff16565b60608201518251919550611aee919063ffffffff610fca16565b925050506119cf565b60606391353a0c60e01b8383604051602401610f45929190613623565b60006114b68383612077565b6000611b3385601063ffffffff61080b16565b905073ffffffffffffffffffffffffffffffffffffffff8416301415611b5e576116588184846120a1565b6117c6818585856120d9565b80600114611b7e57611b7e6100e78261219c565b6000611b9185601063ffffffff61080b16565b90506000611ba686602463ffffffff611b1416565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8316906323b872dd90611bff908890889086906004016132f8565b600060405180830381600087803b158015611c1957600080fd5b505af1158015611c2d573d6000803e3d6000fd5b50505050505050505050565b60006060806060611c57600489518a6121b79092919063ffffffff16565b806020019051611c6a9190810190612caa565b9350935093509350600082519050606081604051908082528060200260200182016040528015611ca4578160200160208202803883390190505b50905060005b828114611cf657611cd788868381518110611cc157fe5b602002602001015161180790919063ffffffff16565b828281518110611ce357fe5b6020908102919091010152600101611caa565b506040517f2eb2c2d600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871690632eb2c2d690611d51908c908c908a9087908a9060040161328e565b600060405180830381600087803b158015611d6b57600080fd5b505af1158015611d7f573d6000803e3d6000fd5b5050505050505050505050505050565b606080611da960048751886121b79092919063ffffffff16565b806020019051611dbc9190810190612fc5565b8051919350915060005b818114611e1957611e11838281518110611ddc57fe5b60200260200101518888611e0c888681518110611df557fe5b60200260200101518a61180790919063ffffffff16565b611592565b600101611dc6565b5050505050505050565b6060637996a27160e01b82604051602401610254919061334f565b600080611e51848263ffffffff61075b16565b90506000611e65848263ffffffff61075b16565b90507ff47261b0000000000000000000000000000000000000000000000000000000007fdc1600f3000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008416821480611efd57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b8015611f5b57507fffffffff000000000000000000000000000000000000000000000000000000008381169083161480611f5b57507fffffffff00000000000000000000000000000000000000000000000000000000838116908216145b15611fc6576000611f7388601063ffffffff61080b16565b90506000611f8888601063ffffffff61080b16565b90508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161496505050505050506107ab565b611fd6878763ffffffff61223716565b9450505050506107ab565b5050505092915050565b611ff3612710565b611ffc84611838565b156120135761200c84848461225c565b90506114b6565b61201e8484846124b0565b949350505050565b600061201e8361205061204082600163ffffffff610fca16565b6119a4888763ffffffff61180716565b9063ffffffff61261d16565b60606331360af160e01b82604051602401610254919061337c565b60008160200183511015612098576120986100e76005855185602001611417565b50016020015190565b6040516060907fa9059cbb00000000000000000000000000000000000000000000000000000000906108839085908590602401613329565b6040516060907f23b872dd0000000000000000000000000000000000000000000000000000000090612113908690869086906024016132f8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506117c685826114bd565b606063baffa47460e01b82604051602401610254919061361a565b6060818311156121d0576121d06100e760008585611417565b83518211156121e9576121e96100e76001848751611417565b8282036040519080825280601f01601f191660200182016040528015612216576020820181803883390190505b5090506114b661222582612647565b8461222f87612647565b01835161264d565b6000815183511480156114b65750508051602091820120825192909101919091201490565b612264612710565b61226c61273f565b604051806101800160405280866000015173ffffffffffffffffffffffffffffffffffffffff168152602001866020015173ffffffffffffffffffffffffffffffffffffffff168152602001866040015173ffffffffffffffffffffffffffffffffffffffff168152602001866060015173ffffffffffffffffffffffffffffffffffffffff168152602001866080015181526020018660a001518152602001600081526020016000815260200186610100015181526020018661012001518152602001866101400151815260200186610160015181525090506060600073ffffffffffffffffffffffffffffffffffffffff1663b4be83d5905060e01b82868660405160240161237f939291906133bf565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252600454915190925073ffffffffffffffffffffffffffffffffffffffff90911690600090606090839061243090869061322a565b6000604051808303816000865af19150503d806000811461246d576040519150601f19603f3d011682016040523d82523d6000602084013e612472565b606091505b509150915081156124a457805160801461248857fe5b8080602001905161249c9190810190613168565b602088015286525b50505050509392505050565b6124b8612710565b6040516060907f9b44d55600000000000000000000000000000000000000000000000000000000906124f2908790879087906024016134df565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252600354915190925073ffffffffffffffffffffffffffffffffffffffff9091169060009060609083906125a390869061322a565b6000604051808303816000865af19150503d80600081146125e0576040519150601f19603f3d011682016040523d82523d6000602084013e6125e5565b606091505b5091509150811561261257805160a0146125fb57fe5b8080602001905161260f91908101906130ff565b94505b505050509392505050565b600081612633576126336100e760038585611a06565b600082848161263e57fe5b04949350505050565b60200190565b6020811015612677576001816020036101000a03801983511681855116808217865250505061051b565b828214156126845761051b565b828211156126be5760208103905080820181840181515b828510156126b657845186526020958601959094019361269b565b90525061051b565b60208103905080820181840183515b8186121561270757825182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe092830192909101906126cd565b85525050505050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160608152602001606081525090565b80356107ab816136e6565b600082601f830112612813578081fd5b813561282661282182613658565b613631565b81815291506020808301908481018184028601820187101561284757600080fd5b60005b8481101561286f57813561285d816136e6565b8452928201929082019060010161284a565b505050505092915050565b600082601f83011261288a578081fd5b813561289861282182613658565b8181529150602080830190840160005b83811015611fe1576128c08760208435890101612bd7565b835260209283019291909101906001016128a8565b600082601f8301126128e5578081fd5b81356128f361282182613658565b818152915060208083019084810160005b8481101561286f57813587016101c0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838c0301121561294457600080fd5b61294d81613631565b6129598b8785016127f8565b81526129688b604085016127f8565b868201526129798b606085016127f8565b604082015261298b8b608085016127f8565b606082015260a0830135608082015260c083013560a082015260e083013560c08201526101008084013560e0830152610120808501358284015261014091508185013581840152506101608085013567ffffffffffffffff808211156129f057600080fd5b6129fe8f8b848a0101612bd7565b84860152610180935083870135915080821115612a1a57600080fd5b612a288f8b848a0101612bd7565b838601526101a0925082870135915080821115612a4457600080fd5b612a528f8b848a0101612bd7565b8486015285870135935080841115612a6957600080fd5b5050612a798d8984880101612bd7565b9083015250865250509282019290820190600101612904565b60008083601f840112612aa3578182fd5b50813567ffffffffffffffff811115612aba578182fd5b6020830191508360208083028501011115612ad457600080fd5b9250929050565b600082601f830112612aeb578081fd5b8151612af961282182613658565b818152915060208083019084810181840286018201871015612b1a57600080fd5b60005b8481101561286f57815184529282019290820190600101612b1d565b600082601f830112612b49578081fd5b8135612b5761282182613658565b818152915060208083019084810181840286018201871015612b7857600080fd5b60005b8481101561286f57813584529282019290820190600101612b7b565b60008083601f840112612ba8578182fd5b50813567ffffffffffffffff811115612bbf578182fd5b602083019150836020828501011115612ad457600080fd5b600082601f830112612be7578081fd5b8135612bf561282182613678565b9150808252836020828501011115612c0c57600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112612c35578081fd5b8151612c4361282182613678565b9150808252836020828501011115612c5a57600080fd5b612c6b8160208401602086016136ba565b5092915050565b600060208284031215612c83578081fd5b81356114b6816136e6565b600060208284031215612c9f578081fd5b81516114b6816136e6565b60008060008060808587031215612cbf578283fd5b8451612cca816136e6565b602086015190945067ffffffffffffffff80821115612ce7578485fd5b612cf388838901612adb565b94506040870151915080821115612d08578384fd5b612d1488838901612adb565b93506060870151915080821115612d29578283fd5b50612d3687828801612c25565b91505092959194509250565b60008060008060008060008060a0898b031215612d5d578586fd5b8835612d68816136e6565b97506020890135612d78816136e6565b9650604089013567ffffffffffffffff80821115612d94578788fd5b612da08c838d01612a92565b909850965060608b0135915080821115612db8578586fd5b612dc48c838d01612a92565b909650945060808b0135915080821115612ddc578384fd5b50612de98b828c01612b97565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215612e15578384fd5b8635612e20816136e6565b95506020870135612e30816136e6565b94506040870135935060608701359250608087013567ffffffffffffffff811115612e59578283fd5b612e6589828a01612b97565b979a9699509497509295939492505050565b60008060008060808587031215612e8c578182fd5b843567ffffffffffffffff80821115612ea3578384fd5b612eaf888389016128d5565b95506020870135915080821115612ec4578384fd5b612ed08883890161287a565b94506040870135915080821115612ee5578384fd5b612ef188838901612b39565b93506060870135915080821115612f06578283fd5b50612d3687828801612803565b600080600080600060a08688031215612f2a578283fd5b853567ffffffffffffffff80821115612f41578485fd5b612f4d89838a016128d5565b9650602088013595506040880135915080821115612f69578485fd5b612f7589838a0161287a565b94506060880135915080821115612f8a578283fd5b612f9689838a01612b39565b93506080880135915080821115612fab578283fd5b50612fb888828901612803565b9150509295509295909350565b60008060408385031215612fd7578182fd5b825167ffffffffffffffff80821115612fee578384fd5b612ffa86838701612adb565b9350602091508185015181811115613010578384fd5b85019050601f81018613613022578283fd5b805161303061282182613658565b81815283810190838501865b84811015613065576130538b888451890101612c25565b8452928601929086019060010161303c565b5096999098509650505050505050565b60008060208385031215613087578182fd5b823567ffffffffffffffff81111561309d578283fd5b6130a985828601612b97565b90969095509350505050565b6000806000604084860312156130c9578081fd5b833567ffffffffffffffff8111156130df578182fd5b6130eb86828701612b97565b909790965060209590950135949350505050565b600060a08284031215613110578081fd5b61311a60a0613631565b82518152602083015160208201526040830151604082015260608301516060820152608083015160808201528091505092915050565b600060208284031215613161578081fd5b5051919050565b6000806040838503121561317a578182fd5b505080516020909101519092909150565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208401935060208301825b828110156131d65781518652602095860195909101906001016131b8565b5093949350505050565b600081518084526131f88160208601602086016136ba565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000825161323c8184602087016136ba565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526132c760a08301866131a5565b82810360608401526132d981866131a5565b83810360808501526132eb81866131e0565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b6000602082526114b660208301846131e0565b606081016004851061339d57fe5b938152602081019290925260409091015290565b606081016008851061339d57fe5b6000606082526133d360608301865161318b565b60208501516133e5608084018261318b565b5060408501516133f860a084018261318b565b50606085015161340b60c084018261318b565b50608085015160e083015260a0850151610100818185015260c08701519150610120828186015260e088015192506101408381870152828901519350610160925083838701528189015193506101809150838287015280890151935050806101a08601525061347e6101e08501836131e0565b8188015192507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0858203016101c08601526134b981846131e0565b91505085602085015283810360408501526134d481866131e0565b979650505050505050565b6000606082526134f360608301865161318b565b6020850151613505608084018261318b565b50604085015161351860a084018261318b565b50606085015161352b60c084018261318b565b50608085015160e083015260a0850151610100818185015260c08701519150610120828186015260e0880151925061014083818701528289015193506101609250838387015281890151935061018091508382870152808901519350506101c06101a081818801526135a16102208801866131e0565b848b015195507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa094508488820301838901526135dd81876131e0565b925050828a0151945083878303016101e08801526135fb82866131e0565b9250808a01519450505081858203016102008601526134b981846131e0565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff8111828210171561365057600080fd5b604052919050565b600067ffffffffffffffff82111561366e578081fd5b5060209081020190565b600067ffffffffffffffff82111561368e578081fd5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b838110156136d55781810151838201526020016136bd565b838111156104c45750506000910152565b73ffffffffffffffffffffffffffffffffffffffff8116811461073457600080fdfea365627a7a72315820ebedf6ba0823da75dd29d928186748ec6baa07f40f145a90097baa22da29b56a6c6578706572696d656e74616cf564736f6c63430005100040" } } }, diff --git a/packages/contract-artifacts/artifacts/GodsUnchainedValidator.json b/packages/contract-artifacts/artifacts/GodsUnchainedValidator.json new file mode 100644 index 0000000000..60eca2282a --- /dev/null +++ b/packages/contract-artifacts/artifacts/GodsUnchainedValidator.json @@ -0,0 +1,70 @@ +{ + "schemaVersion": "2.0.0", + "contractName": "GodsUnchainedValidator", + "compilerOutput": { + "abi": [ + { + "inputs": [{ "internalType": "address", "name": "_godsUnchained", "type": "address" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "constant": true, + "inputs": [ + { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, + { "internalType": "bytes", "name": "propertyData", "type": "bytes" } + ], + "name": "checkBrokerAsset", + "outputs": [], + "payable": false, + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "methods": { + "checkBrokerAsset(uint256,bytes)": { + "details": "Checks that the given card (encoded as assetData) has the proto and quality encoded in `propertyData`. Reverts if the card doesn't match the specified proto and quality.", + "params": { + "propertyData": "Encoded proto and quality that the card is expected to have.", + "tokenId": "The ERC721 tokenId of the card to check." + } + } + } + }, + "evm": { + "bytecode": { + "object": "0x608060405234801561001057600080fd5b5060405161042b38038061042b83398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610082565b600060208284031215610065578081fd5b81516001600160a01b038116811461007b578182fd5b9392505050565b61039a806100916000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80639256050a14610030575b600080fd5b61004361003e3660046101fd565b610045565b005b60008061005483850185610197565b600080546040517fb93a89f700000000000000000000000000000000000000000000000000000000815293955091935091829173ffffffffffffffffffffffffffffffffffffffff169063b93a89f7906100b2908a9060040161032c565b604080518083038186803b1580156100c957600080fd5b505afa1580156100dd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061010191908101906101cf565b915091508361ffff168261ffff161461014f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610146906102cf565b60405180910390fd5b8260ff168160ff161461018e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014690610272565b50505050505050565b600080604083850312156101a9578182fd5b82356101b481610335565b915060208301356101c481610348565b809150509250929050565b600080604083850312156101e1578182fd5b82516101ec81610335565b60208401519092506101c481610348565b600080600060408486031215610211578081fd5b83359250602084013567ffffffffffffffff8082111561022f578283fd5b81860187601f820112610240578384fd5b8035925081831115610250578384fd5b876020848301011115610261578384fd5b949760209095019650909450505050565b60208082526027908201527f476f6473556e636861696e656456616c696461746f722f5155414c4954595f4d60408201527f49534d4154434800000000000000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f476f6473556e636861696e656456616c696461746f722f50524f544f5f4d495360408201527f4d41544348000000000000000000000000000000000000000000000000000000606082015260800190565b90815260200190565b61ffff8116811461034557600080fd5b50565b60ff8116811461034557600080fdfea365627a7a723158203028b97b542e7c9694b2dfadb335cd83bec3bff6276b5f2cdb1d7c1abed796e46c6578706572696d656e74616cf564736f6c63430005100040" + }, + "deployedBytecode": { + "object": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80639256050a14610030575b600080fd5b61004361003e3660046101fd565b610045565b005b60008061005483850185610197565b600080546040517fb93a89f700000000000000000000000000000000000000000000000000000000815293955091935091829173ffffffffffffffffffffffffffffffffffffffff169063b93a89f7906100b2908a9060040161032c565b604080518083038186803b1580156100c957600080fd5b505afa1580156100dd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061010191908101906101cf565b915091508361ffff168261ffff161461014f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610146906102cf565b60405180910390fd5b8260ff168160ff161461018e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014690610272565b50505050505050565b600080604083850312156101a9578182fd5b82356101b481610335565b915060208301356101c481610348565b809150509250929050565b600080604083850312156101e1578182fd5b82516101ec81610335565b60208401519092506101c481610348565b600080600060408486031215610211578081fd5b83359250602084013567ffffffffffffffff8082111561022f578283fd5b81860187601f820112610240578384fd5b8035925081831115610250578384fd5b876020848301011115610261578384fd5b949760209095019650909450505050565b60208082526027908201527f476f6473556e636861696e656456616c696461746f722f5155414c4954595f4d60408201527f49534d4154434800000000000000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f476f6473556e636861696e656456616c696461746f722f50524f544f5f4d495360408201527f4d41544348000000000000000000000000000000000000000000000000000000606082015260800190565b90815260200190565b61ffff8116811461034557600080fd5b50565b60ff8116811461034557600080fdfea365627a7a723158203028b97b542e7c9694b2dfadb335cd83bec3bff6276b5f2cdb1d7c1abed796e46c6578706572696d656e74616cf564736f6c63430005100040" + } + } + }, + "compiler": { + "name": "solc", + "version": "soljson-v0.5.16+commit.9c3226ce.js", + "settings": { + "optimizer": { + "enabled": true, + "runs": 1000000, + "details": { "yul": true, "deduplicate": true, "cse": true, "constantOptimizer": true } + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "devdoc", + "evm.bytecode.object", + "evm.bytecode.sourceMap", + "evm.deployedBytecode.object", + "evm.deployedBytecode.sourceMap" + ] + } + }, + "evmVersion": "istanbul" + } + }, + "chains": {} +} diff --git a/packages/contract-artifacts/src/index.ts b/packages/contract-artifacts/src/index.ts index c9f07ebfb6..78d92a62ba 100644 --- a/packages/contract-artifacts/src/index.ts +++ b/packages/contract-artifacts/src/index.ts @@ -1,4 +1,5 @@ import * as AssetProxyOwner from '../artifacts/AssetProxyOwner.json'; +import * as Broker from '../artifacts/Broker.json'; import * as Coordinator from '../artifacts/Coordinator.json'; import * as CoordinatorRegistry from '../artifacts/CoordinatorRegistry.json'; import * as DevUtils from '../artifacts/DevUtils.json'; @@ -12,6 +13,7 @@ import * as ERC721Proxy from '../artifacts/ERC721Proxy.json'; import * as ERC721Token from '../artifacts/ERC721Token.json'; import * as Exchange from '../artifacts/Exchange.json'; import * as Forwarder from '../artifacts/Forwarder.json'; +import * as GodsUnchainedValidator from '../artifacts/GodsUnchainedValidator.json'; import * as IAssetProxy from '../artifacts/IAssetProxy.json'; import * as IValidator from '../artifacts/IValidator.json'; import * as IWallet from '../artifacts/IWallet.json'; @@ -27,6 +29,7 @@ import * as IERC20BridgeSampler from '../artifacts/IERC20BridgeSampler.json'; export { AssetProxyOwner, + Broker, DevUtils, DummyERC20Token, DummyERC721Token, @@ -39,6 +42,7 @@ export { ERC721Token, Exchange, Forwarder, + GodsUnchainedValidator, IAssetProxy, IValidator, IWallet, diff --git a/packages/contract-artifacts/tsconfig.json b/packages/contract-artifacts/tsconfig.json index 36866ab760..1c174c6d3b 100644 --- a/packages/contract-artifacts/tsconfig.json +++ b/packages/contract-artifacts/tsconfig.json @@ -8,6 +8,7 @@ "include": ["./src/**/*", "./test/**/*"], "files": [ "./artifacts/AssetProxyOwner.json", + "./artifacts/Broker.json", "./artifacts/DevUtils.json", "./artifacts/DutchAuction.json", "./artifacts/DummyERC20Token.json", @@ -19,6 +20,7 @@ "./artifacts/ERC721Token.json", "./artifacts/Exchange.json", "./artifacts/Forwarder.json", + "./artifacts/GodsUnchainedValidator.json", "./artifacts/IAssetProxy.json", "./artifacts/IValidator.json", "./artifacts/IWallet.json", diff --git a/packages/contract-wrappers/CHANGELOG.json b/packages/contract-wrappers/CHANGELOG.json index 2cbde1720f..f3509b19ab 100644 --- a/packages/contract-wrappers/CHANGELOG.json +++ b/packages/contract-wrappers/CHANGELOG.json @@ -1,4 +1,17 @@ [ + { + "version": "13.6.0", + "changes": [ + { + "note": "Add Broker and GodsUnchainedValidator wrappers", + "pr": 2469 + }, + { + "note": "Updated Forwarder wrapper", + "pr": 2469 + } + ] + }, { "version": "13.5.0", "changes": [ diff --git a/packages/contract-wrappers/package.json b/packages/contract-wrappers/package.json index a65ecc5807..8f7e37e487 100644 --- a/packages/contract-wrappers/package.json +++ b/packages/contract-wrappers/package.json @@ -31,7 +31,7 @@ "wrappers:generate": "abi-gen --abis ${npm_package_config_abis} --output src/generated-wrappers --backend ethers" }, "config": { - "abis": "../contract-artifacts/artifacts/@(DevUtils|ERC20Token|ERC721Token|Exchange|Forwarder|IAssetData|LibTransactionDecoder|WETH9|Coordinator|Staking|StakingProxy|IERC20BridgeSampler).json" + "abis": "../contract-artifacts/artifacts/@(DevUtils|ERC20Token|ERC721Token|Exchange|Forwarder|IAssetData|LibTransactionDecoder|WETH9|Coordinator|Staking|StakingProxy|IERC20BridgeSampler|GodsUnchainedValidator|Broker).json" }, "repository": { "type": "git", diff --git a/packages/contract-wrappers/src/generated-wrappers/broker.ts b/packages/contract-wrappers/src/generated-wrappers/broker.ts new file mode 100644 index 0000000000..2efeafabc1 --- /dev/null +++ b/packages/contract-wrappers/src/generated-wrappers/broker.ts @@ -0,0 +1,826 @@ +// tslint:disable:no-consecutive-blank-lines ordered-imports align trailing-comma enum-naming +// tslint:disable:whitespace no-unbound-method no-trailing-whitespace +// tslint:disable:no-unused-variable +import { + AwaitTransactionSuccessOpts, + ContractFunctionObj, + ContractTxFunctionObj, + SendTransactionOpts, + BaseContract, + PromiseWithTransactionHash, + methodAbiToFunctionSignature, +} from '@0x/base-contract'; +import { schemas } from '@0x/json-schemas'; +import { + BlockParam, + BlockParamLiteral, + BlockRange, + CallData, + ContractAbi, + ContractArtifact, + DecodedLogArgs, + MethodAbi, + TransactionReceiptWithDecodedLogs, + TxData, + TxDataPayable, + SupportedProvider, +} from 'ethereum-types'; +import { BigNumber, classUtils, logUtils, providerUtils } from '@0x/utils'; +import { EventCallback, IndexedFilterValues, SimpleContractArtifact } from '@0x/types'; +import { Web3Wrapper } from '@0x/web3-wrapper'; +import { assert } from '@0x/assert'; +import * as ethers from 'ethers'; +// tslint:enable:no-unused-variable + +/* istanbul ignore next */ +// tslint:disable:no-parameter-reassignment +// tslint:disable-next-line:class-name +export class BrokerContract extends BaseContract { + /** + * @ignore + */ + public static deployedBytecode: string | undefined; + public static contractName = 'Broker'; + private readonly _methodABIIndex: { [name: string]: number } = {}; + public static async deployFrom0xArtifactAsync( + artifact: ContractArtifact | SimpleContractArtifact, + supportedProvider: SupportedProvider, + txDefaults: Partial, + logDecodeDependencies: { [contractName: string]: ContractArtifact | SimpleContractArtifact }, + exchange: string, + weth: string, + ): Promise { + assert.doesConformToSchema('txDefaults', txDefaults, schemas.txDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + if (artifact.compilerOutput === undefined) { + throw new Error('Compiler output not found in the artifact file'); + } + const provider = providerUtils.standardizeOrThrow(supportedProvider); + const bytecode = artifact.compilerOutput.evm.bytecode.object; + const abi = artifact.compilerOutput.abi; + const logDecodeDependenciesAbiOnly: { [contractName: string]: ContractAbi } = {}; + if (Object.keys(logDecodeDependencies) !== undefined) { + for (const key of Object.keys(logDecodeDependencies)) { + logDecodeDependenciesAbiOnly[key] = logDecodeDependencies[key].compilerOutput.abi; + } + } + return BrokerContract.deployAsync( + bytecode, + abi, + provider, + txDefaults, + logDecodeDependenciesAbiOnly, + exchange, + weth, + ); + } + public static async deployAsync( + bytecode: string, + abi: ContractAbi, + supportedProvider: SupportedProvider, + txDefaults: Partial, + logDecodeDependencies: { [contractName: string]: ContractAbi }, + exchange: string, + weth: string, + ): Promise { + assert.isHexString('bytecode', bytecode); + assert.doesConformToSchema('txDefaults', txDefaults, schemas.txDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + const provider = providerUtils.standardizeOrThrow(supportedProvider); + const constructorAbi = BaseContract._lookupConstructorAbi(abi); + [exchange, weth] = BaseContract._formatABIDataItemList( + constructorAbi.inputs, + [exchange, weth], + BaseContract._bigNumberToString, + ); + const iface = new ethers.utils.Interface(abi); + const deployInfo = iface.deployFunction; + const txData = deployInfo.encode(bytecode, [exchange, weth]); + const web3Wrapper = new Web3Wrapper(provider); + const txDataWithDefaults = await BaseContract._applyDefaultsToContractTxDataAsync( + { + data: txData, + ...txDefaults, + }, + web3Wrapper.estimateGasAsync.bind(web3Wrapper), + ); + const txHash = await web3Wrapper.sendTransactionAsync(txDataWithDefaults); + logUtils.log(`transactionHash: ${txHash}`); + const txReceipt = await web3Wrapper.awaitTransactionSuccessAsync(txHash); + logUtils.log(`Broker successfully deployed at ${txReceipt.contractAddress}`); + const contractInstance = new BrokerContract( + txReceipt.contractAddress as string, + provider, + txDefaults, + logDecodeDependencies, + ); + contractInstance.constructorArgs = [exchange, weth]; + return contractInstance; + } + + /** + * @returns The contract ABI + */ + public static ABI(): ContractAbi { + const abi = [ + { + inputs: [ + { + name: 'exchange', + type: 'address', + }, + { + name: 'weth', + type: 'address', + }, + ], + outputs: [], + payable: false, + stateMutability: 'nonpayable', + type: 'constructor', + }, + { + inputs: [], + outputs: [], + payable: true, + stateMutability: 'payable', + type: 'fallback', + }, + { + constant: false, + inputs: [ + { + name: 'brokeredTokenIds', + type: 'uint256[]', + }, + { + name: 'orders', + type: 'tuple[]', + components: [ + { + name: 'makerAddress', + type: 'address', + }, + { + name: 'takerAddress', + type: 'address', + }, + { + name: 'feeRecipientAddress', + type: 'address', + }, + { + name: 'senderAddress', + type: 'address', + }, + { + name: 'makerAssetAmount', + type: 'uint256', + }, + { + name: 'takerAssetAmount', + type: 'uint256', + }, + { + name: 'makerFee', + type: 'uint256', + }, + { + name: 'takerFee', + type: 'uint256', + }, + { + name: 'expirationTimeSeconds', + type: 'uint256', + }, + { + name: 'salt', + type: 'uint256', + }, + { + name: 'makerAssetData', + type: 'bytes', + }, + { + name: 'takerAssetData', + type: 'bytes', + }, + { + name: 'makerFeeAssetData', + type: 'bytes', + }, + { + name: 'takerFeeAssetData', + type: 'bytes', + }, + ], + }, + { + name: 'takerAssetFillAmounts', + type: 'uint256[]', + }, + { + name: 'signatures', + type: 'bytes[]', + }, + { + name: 'batchFillFunctionSelector', + type: 'bytes4', + }, + { + name: 'ethFeeAmounts', + type: 'uint256[]', + }, + { + name: 'feeRecipients', + type: 'address[]', + }, + ], + name: 'batchBrokerTrade', + outputs: [ + { + name: 'fillResults', + type: 'tuple[]', + components: [ + { + name: 'makerAssetFilledAmount', + type: 'uint256', + }, + { + name: 'takerAssetFilledAmount', + type: 'uint256', + }, + { + name: 'makerFeePaid', + type: 'uint256', + }, + { + name: 'takerFeePaid', + type: 'uint256', + }, + { + name: 'protocolFeePaid', + type: 'uint256', + }, + ], + }, + ], + payable: true, + stateMutability: 'payable', + type: 'function', + }, + { + constant: false, + inputs: [ + { + name: 'brokeredTokenIds', + type: 'uint256[]', + }, + { + name: 'order', + type: 'tuple', + components: [ + { + name: 'makerAddress', + type: 'address', + }, + { + name: 'takerAddress', + type: 'address', + }, + { + name: 'feeRecipientAddress', + type: 'address', + }, + { + name: 'senderAddress', + type: 'address', + }, + { + name: 'makerAssetAmount', + type: 'uint256', + }, + { + name: 'takerAssetAmount', + type: 'uint256', + }, + { + name: 'makerFee', + type: 'uint256', + }, + { + name: 'takerFee', + type: 'uint256', + }, + { + name: 'expirationTimeSeconds', + type: 'uint256', + }, + { + name: 'salt', + type: 'uint256', + }, + { + name: 'makerAssetData', + type: 'bytes', + }, + { + name: 'takerAssetData', + type: 'bytes', + }, + { + name: 'makerFeeAssetData', + type: 'bytes', + }, + { + name: 'takerFeeAssetData', + type: 'bytes', + }, + ], + }, + { + name: 'takerAssetFillAmount', + type: 'uint256', + }, + { + name: 'signature', + type: 'bytes', + }, + { + name: 'fillFunctionSelector', + type: 'bytes4', + }, + { + name: 'ethFeeAmounts', + type: 'uint256[]', + }, + { + name: 'feeRecipients', + type: 'address[]', + }, + ], + name: 'brokerTrade', + outputs: [ + { + name: 'fillResults', + type: 'tuple', + components: [ + { + name: 'makerAssetFilledAmount', + type: 'uint256', + }, + { + name: 'takerAssetFilledAmount', + type: 'uint256', + }, + { + name: 'makerFeePaid', + type: 'uint256', + }, + { + name: 'takerFeePaid', + type: 'uint256', + }, + { + name: 'protocolFeePaid', + type: 'uint256', + }, + ], + }, + ], + payable: true, + stateMutability: 'payable', + type: 'function', + }, + { + constant: false, + inputs: [ + { + name: 'from', + type: 'address', + }, + { + name: 'to', + type: 'address', + }, + { + name: 'index_2', + type: 'uint256[]', + }, + { + name: 'amounts', + type: 'uint256[]', + }, + { + name: 'data', + type: 'bytes', + }, + ], + name: 'safeBatchTransferFrom', + outputs: [], + payable: false, + stateMutability: 'nonpayable', + type: 'function', + }, + ] as ContractAbi; + return abi; + } + + public getFunctionSignature(methodName: string): string { + const index = this._methodABIIndex[methodName]; + const methodAbi = BrokerContract.ABI()[index] as MethodAbi; // tslint:disable-line:no-unnecessary-type-assertion + const functionSignature = methodAbiToFunctionSignature(methodAbi); + return functionSignature; + } + public getABIDecodedTransactionData(methodName: string, callData: string): T { + const functionSignature = this.getFunctionSignature(methodName); + const self = (this as any) as BrokerContract; + const abiEncoder = self._lookupAbiEncoder(functionSignature); + const abiDecodedCallData = abiEncoder.strictDecode(callData); + return abiDecodedCallData; + } + public getABIDecodedReturnData(methodName: string, callData: string): T { + const functionSignature = this.getFunctionSignature(methodName); + const self = (this as any) as BrokerContract; + const abiEncoder = self._lookupAbiEncoder(functionSignature); + const abiDecodedCallData = abiEncoder.strictDecodeReturnValue(callData); + return abiDecodedCallData; + } + public getSelector(methodName: string): string { + const functionSignature = this.getFunctionSignature(methodName); + const self = (this as any) as BrokerContract; + const abiEncoder = self._lookupAbiEncoder(functionSignature); + return abiEncoder.getSelector(); + } + + /** + * Fills multiple property-based orders by the given amounts using the given assets. + * Pays protocol fees using either the ETH supplied by the taker to the transaction or + * WETH acquired from the maker during settlement. The final WETH balance is sent to the taker. + * @param brokeredTokenIds Token IDs specified by the taker to be used to fill + * the orders. + * @param orders The property-based orders to fill. The format of a property- + * based order is the same as that of a normal order, except the + * takerAssetData. Instaed of specifying a specific ERC721 asset, + * the takerAssetData should be ERC1155 assetData where the + * underlying tokenAddress is this contract's address and the desired + * properties are encoded in the extra data field. Also note that + * takerFees must be denominated in WETH (or zero). + * @param takerAssetFillAmounts The amounts to fill the orders by. + * @param signatures The makers' signatures for the given orders. + * @param batchFillFunctionSelector The selector for either `batchFillOrders`, + * `batchFillOrKillOrders`, or `batchFillOrdersNoThrow`. + * @param ethFeeAmounts Amounts of ETH, denominated in Wei, that are paid to + * corresponding feeRecipients. + * @param feeRecipients Addresses that will receive ETH when orders are filled. + * @returns fillResults Amounts filled and fees paid by the makers and taker. + */ + public batchBrokerTrade( + brokeredTokenIds: BigNumber[], + orders: Array<{ + makerAddress: string; + takerAddress: string; + feeRecipientAddress: string; + senderAddress: string; + makerAssetAmount: BigNumber; + takerAssetAmount: BigNumber; + makerFee: BigNumber; + takerFee: BigNumber; + expirationTimeSeconds: BigNumber; + salt: BigNumber; + makerAssetData: string; + takerAssetData: string; + makerFeeAssetData: string; + takerFeeAssetData: string; + }>, + takerAssetFillAmounts: BigNumber[], + signatures: string[], + batchFillFunctionSelector: string, + ethFeeAmounts: BigNumber[], + feeRecipients: string[], + ): ContractTxFunctionObj< + Array<{ + makerAssetFilledAmount: BigNumber; + takerAssetFilledAmount: BigNumber; + makerFeePaid: BigNumber; + takerFeePaid: BigNumber; + protocolFeePaid: BigNumber; + }> + > { + const self = (this as any) as BrokerContract; + assert.isArray('brokeredTokenIds', brokeredTokenIds); + assert.isArray('orders', orders); + assert.isArray('takerAssetFillAmounts', takerAssetFillAmounts); + assert.isArray('signatures', signatures); + assert.isString('batchFillFunctionSelector', batchFillFunctionSelector); + assert.isArray('ethFeeAmounts', ethFeeAmounts); + assert.isArray('feeRecipients', feeRecipients); + const functionSignature = + 'batchBrokerTrade(uint256[],(address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],uint256[],bytes[],bytes4,uint256[],address[])'; + + return { + async sendTransactionAsync( + txData?: Partial | undefined, + opts: SendTransactionOpts = { shouldValidate: true }, + ): Promise { + const txDataWithDefaults = await self._applyDefaultsToTxDataAsync( + { ...txData, data: this.getABIEncodedTransactionData() }, + this.estimateGasAsync.bind(this), + ); + if (opts.shouldValidate !== false) { + await this.callAsync(txDataWithDefaults); + } + return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults); + }, + awaitTransactionSuccessAsync( + txData?: Partial, + opts: AwaitTransactionSuccessOpts = { shouldValidate: true }, + ): PromiseWithTransactionHash { + return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts); + }, + async estimateGasAsync(txData?: Partial | undefined): Promise { + const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({ + ...txData, + data: this.getABIEncodedTransactionData(), + }); + return self._web3Wrapper.estimateGasAsync(txDataWithDefaults); + }, + async callAsync( + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise< + Array<{ + makerAssetFilledAmount: BigNumber; + takerAssetFilledAmount: BigNumber; + makerFeePaid: BigNumber; + takerFeePaid: BigNumber; + protocolFeePaid: BigNumber; + }> + > { + BaseContract._assertCallParams(callData, defaultBlock); + const rawCallResult = await self._performCallAsync( + { ...callData, data: this.getABIEncodedTransactionData() }, + defaultBlock, + ); + const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); + return abiEncoder.strictDecodeReturnValue< + Array<{ + makerAssetFilledAmount: BigNumber; + takerAssetFilledAmount: BigNumber; + makerFeePaid: BigNumber; + takerFeePaid: BigNumber; + protocolFeePaid: BigNumber; + }> + >(rawCallResult); + }, + getABIEncodedTransactionData(): string { + return self._strictEncodeArguments(functionSignature, [ + brokeredTokenIds, + orders, + takerAssetFillAmounts, + signatures, + batchFillFunctionSelector, + ethFeeAmounts, + feeRecipients, + ]); + }, + }; + } + /** + * Fills a single property-based order by the given amount using the given assets. + * Pays protocol fees using either the ETH supplied by the taker to the transaction or + * WETH acquired from the maker during settlement. The final WETH balance is sent to the taker. + * @param brokeredTokenIds Token IDs specified by the taker to be used to fill + * the orders. + * @param order The property-based order to fill. The format of a property- + * based order is the same as that of a normal order, except the + * takerAssetData. Instaed of specifying a specific ERC721 asset, + * the takerAssetData should be ERC1155 assetData where the + * underlying tokenAddress is this contract's address and the desired + * properties are encoded in the extra data field. Also note that + * takerFees must be denominated in WETH (or zero). + * @param takerAssetFillAmount The amount to fill the order by. + * @param signature The maker's signature of the given order. + * @param fillFunctionSelector The selector for either `fillOrder` or + * `fillOrKillOrder`. + * @param ethFeeAmounts Amounts of ETH, denominated in Wei, that are paid to + * corresponding feeRecipients. + * @param feeRecipients Addresses that will receive ETH when orders are filled. + * @returns fillResults Amounts filled and fees paid by the maker and taker. + */ + public brokerTrade( + brokeredTokenIds: BigNumber[], + order: { + makerAddress: string; + takerAddress: string; + feeRecipientAddress: string; + senderAddress: string; + makerAssetAmount: BigNumber; + takerAssetAmount: BigNumber; + makerFee: BigNumber; + takerFee: BigNumber; + expirationTimeSeconds: BigNumber; + salt: BigNumber; + makerAssetData: string; + takerAssetData: string; + makerFeeAssetData: string; + takerFeeAssetData: string; + }, + takerAssetFillAmount: BigNumber, + signature: string, + fillFunctionSelector: string, + ethFeeAmounts: BigNumber[], + feeRecipients: string[], + ): ContractTxFunctionObj<{ + makerAssetFilledAmount: BigNumber; + takerAssetFilledAmount: BigNumber; + makerFeePaid: BigNumber; + takerFeePaid: BigNumber; + protocolFeePaid: BigNumber; + }> { + const self = (this as any) as BrokerContract; + assert.isArray('brokeredTokenIds', brokeredTokenIds); + + assert.isBigNumber('takerAssetFillAmount', takerAssetFillAmount); + assert.isString('signature', signature); + assert.isString('fillFunctionSelector', fillFunctionSelector); + assert.isArray('ethFeeAmounts', ethFeeAmounts); + assert.isArray('feeRecipients', feeRecipients); + const functionSignature = + 'brokerTrade(uint256[],(address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes),uint256,bytes,bytes4,uint256[],address[])'; + + return { + async sendTransactionAsync( + txData?: Partial | undefined, + opts: SendTransactionOpts = { shouldValidate: true }, + ): Promise { + const txDataWithDefaults = await self._applyDefaultsToTxDataAsync( + { ...txData, data: this.getABIEncodedTransactionData() }, + this.estimateGasAsync.bind(this), + ); + if (opts.shouldValidate !== false) { + await this.callAsync(txDataWithDefaults); + } + return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults); + }, + awaitTransactionSuccessAsync( + txData?: Partial, + opts: AwaitTransactionSuccessOpts = { shouldValidate: true }, + ): PromiseWithTransactionHash { + return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts); + }, + async estimateGasAsync(txData?: Partial | undefined): Promise { + const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({ + ...txData, + data: this.getABIEncodedTransactionData(), + }); + return self._web3Wrapper.estimateGasAsync(txDataWithDefaults); + }, + async callAsync( + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise<{ + makerAssetFilledAmount: BigNumber; + takerAssetFilledAmount: BigNumber; + makerFeePaid: BigNumber; + takerFeePaid: BigNumber; + protocolFeePaid: BigNumber; + }> { + BaseContract._assertCallParams(callData, defaultBlock); + const rawCallResult = await self._performCallAsync( + { ...callData, data: this.getABIEncodedTransactionData() }, + defaultBlock, + ); + const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); + return abiEncoder.strictDecodeReturnValue<{ + makerAssetFilledAmount: BigNumber; + takerAssetFilledAmount: BigNumber; + makerFeePaid: BigNumber; + takerFeePaid: BigNumber; + protocolFeePaid: BigNumber; + }>(rawCallResult); + }, + getABIEncodedTransactionData(): string { + return self._strictEncodeArguments(functionSignature, [ + brokeredTokenIds, + order, + takerAssetFillAmount, + signature, + fillFunctionSelector, + ethFeeAmounts, + feeRecipients, + ]); + }, + }; + } + /** + * The Broker implements the ERC1155 transfer function to be compatible with the ERC1155 asset proxy + * @param from Since the Broker serves as the taker of the order, this should + * equal `address(this)` + * @param to This should be the maker of the order. + * @param amounts Should be an array of just one `uint256`, specifying the + * amount of the brokered assets to transfer. + * @param data Encodes the validator contract address and any auxiliary data it + * needs for property validation. + */ + public safeBatchTransferFrom( + from: string, + to: string, + index_2: BigNumber[], + amounts: BigNumber[], + data: string, + ): ContractTxFunctionObj { + const self = (this as any) as BrokerContract; + assert.isString('from', from); + assert.isString('to', to); + assert.isArray('index_2', index_2); + assert.isArray('amounts', amounts); + assert.isString('data', data); + const functionSignature = 'safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)'; + + return { + async sendTransactionAsync( + txData?: Partial | undefined, + opts: SendTransactionOpts = { shouldValidate: true }, + ): Promise { + const txDataWithDefaults = await self._applyDefaultsToTxDataAsync( + { ...txData, data: this.getABIEncodedTransactionData() }, + this.estimateGasAsync.bind(this), + ); + if (opts.shouldValidate !== false) { + await this.callAsync(txDataWithDefaults); + } + return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults); + }, + awaitTransactionSuccessAsync( + txData?: Partial, + opts: AwaitTransactionSuccessOpts = { shouldValidate: true }, + ): PromiseWithTransactionHash { + return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts); + }, + async estimateGasAsync(txData?: Partial | undefined): Promise { + const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({ + ...txData, + data: this.getABIEncodedTransactionData(), + }); + return self._web3Wrapper.estimateGasAsync(txDataWithDefaults); + }, + async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { + BaseContract._assertCallParams(callData, defaultBlock); + const rawCallResult = await self._performCallAsync( + { ...callData, data: this.getABIEncodedTransactionData() }, + defaultBlock, + ); + const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); + return abiEncoder.strictDecodeReturnValue(rawCallResult); + }, + getABIEncodedTransactionData(): string { + return self._strictEncodeArguments(functionSignature, [ + from.toLowerCase(), + to.toLowerCase(), + index_2, + amounts, + data, + ]); + }, + }; + } + + constructor( + address: string, + supportedProvider: SupportedProvider, + txDefaults?: Partial, + logDecodeDependencies?: { [contractName: string]: ContractAbi }, + deployedBytecode: string | undefined = BrokerContract.deployedBytecode, + ) { + super( + 'Broker', + BrokerContract.ABI(), + address, + supportedProvider, + txDefaults, + logDecodeDependencies, + deployedBytecode, + ); + classUtils.bindAll(this, ['_abiEncoderByFunctionSignature', 'address', '_web3Wrapper']); + BrokerContract.ABI().forEach((item, index) => { + if (item.type === 'function') { + const methodAbi = item as MethodAbi; + this._methodABIIndex[methodAbi.name] = index; + } + }); + } +} + +// tslint:disable:max-file-line-count +// tslint:enable:no-unbound-method no-parameter-reassignment no-consecutive-blank-lines ordered-imports align +// tslint:enable:trailing-comma whitespace no-trailing-whitespace diff --git a/packages/contract-wrappers/src/generated-wrappers/gods_unchained_validator.ts b/packages/contract-wrappers/src/generated-wrappers/gods_unchained_validator.ts new file mode 100644 index 0000000000..cfacae76af --- /dev/null +++ b/packages/contract-wrappers/src/generated-wrappers/gods_unchained_validator.ts @@ -0,0 +1,248 @@ +// tslint:disable:no-consecutive-blank-lines ordered-imports align trailing-comma enum-naming +// tslint:disable:whitespace no-unbound-method no-trailing-whitespace +// tslint:disable:no-unused-variable +import { + AwaitTransactionSuccessOpts, + ContractFunctionObj, + ContractTxFunctionObj, + SendTransactionOpts, + BaseContract, + PromiseWithTransactionHash, + methodAbiToFunctionSignature, +} from '@0x/base-contract'; +import { schemas } from '@0x/json-schemas'; +import { + BlockParam, + BlockParamLiteral, + BlockRange, + CallData, + ContractAbi, + ContractArtifact, + DecodedLogArgs, + MethodAbi, + TransactionReceiptWithDecodedLogs, + TxData, + TxDataPayable, + SupportedProvider, +} from 'ethereum-types'; +import { BigNumber, classUtils, logUtils, providerUtils } from '@0x/utils'; +import { EventCallback, IndexedFilterValues, SimpleContractArtifact } from '@0x/types'; +import { Web3Wrapper } from '@0x/web3-wrapper'; +import { assert } from '@0x/assert'; +import * as ethers from 'ethers'; +// tslint:enable:no-unused-variable + +/* istanbul ignore next */ +// tslint:disable:no-parameter-reassignment +// tslint:disable-next-line:class-name +export class GodsUnchainedValidatorContract extends BaseContract { + /** + * @ignore + */ + public static deployedBytecode: string | undefined; + public static contractName = 'GodsUnchainedValidator'; + private readonly _methodABIIndex: { [name: string]: number } = {}; + public static async deployFrom0xArtifactAsync( + artifact: ContractArtifact | SimpleContractArtifact, + supportedProvider: SupportedProvider, + txDefaults: Partial, + logDecodeDependencies: { [contractName: string]: ContractArtifact | SimpleContractArtifact }, + _godsUnchained: string, + ): Promise { + assert.doesConformToSchema('txDefaults', txDefaults, schemas.txDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + if (artifact.compilerOutput === undefined) { + throw new Error('Compiler output not found in the artifact file'); + } + const provider = providerUtils.standardizeOrThrow(supportedProvider); + const bytecode = artifact.compilerOutput.evm.bytecode.object; + const abi = artifact.compilerOutput.abi; + const logDecodeDependenciesAbiOnly: { [contractName: string]: ContractAbi } = {}; + if (Object.keys(logDecodeDependencies) !== undefined) { + for (const key of Object.keys(logDecodeDependencies)) { + logDecodeDependenciesAbiOnly[key] = logDecodeDependencies[key].compilerOutput.abi; + } + } + return GodsUnchainedValidatorContract.deployAsync( + bytecode, + abi, + provider, + txDefaults, + logDecodeDependenciesAbiOnly, + _godsUnchained, + ); + } + public static async deployAsync( + bytecode: string, + abi: ContractAbi, + supportedProvider: SupportedProvider, + txDefaults: Partial, + logDecodeDependencies: { [contractName: string]: ContractAbi }, + _godsUnchained: string, + ): Promise { + assert.isHexString('bytecode', bytecode); + assert.doesConformToSchema('txDefaults', txDefaults, schemas.txDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + const provider = providerUtils.standardizeOrThrow(supportedProvider); + const constructorAbi = BaseContract._lookupConstructorAbi(abi); + [_godsUnchained] = BaseContract._formatABIDataItemList( + constructorAbi.inputs, + [_godsUnchained], + BaseContract._bigNumberToString, + ); + const iface = new ethers.utils.Interface(abi); + const deployInfo = iface.deployFunction; + const txData = deployInfo.encode(bytecode, [_godsUnchained]); + const web3Wrapper = new Web3Wrapper(provider); + const txDataWithDefaults = await BaseContract._applyDefaultsToContractTxDataAsync( + { + data: txData, + ...txDefaults, + }, + web3Wrapper.estimateGasAsync.bind(web3Wrapper), + ); + const txHash = await web3Wrapper.sendTransactionAsync(txDataWithDefaults); + logUtils.log(`transactionHash: ${txHash}`); + const txReceipt = await web3Wrapper.awaitTransactionSuccessAsync(txHash); + logUtils.log(`GodsUnchainedValidator successfully deployed at ${txReceipt.contractAddress}`); + const contractInstance = new GodsUnchainedValidatorContract( + txReceipt.contractAddress as string, + provider, + txDefaults, + logDecodeDependencies, + ); + contractInstance.constructorArgs = [_godsUnchained]; + return contractInstance; + } + + /** + * @returns The contract ABI + */ + public static ABI(): ContractAbi { + const abi = [ + { + inputs: [ + { + name: '_godsUnchained', + type: 'address', + }, + ], + outputs: [], + payable: false, + stateMutability: 'nonpayable', + type: 'constructor', + }, + { + constant: true, + inputs: [ + { + name: 'tokenId', + type: 'uint256', + }, + { + name: 'propertyData', + type: 'bytes', + }, + ], + name: 'checkBrokerAsset', + outputs: [], + payable: false, + stateMutability: 'view', + type: 'function', + }, + ] as ContractAbi; + return abi; + } + + public getFunctionSignature(methodName: string): string { + const index = this._methodABIIndex[methodName]; + const methodAbi = GodsUnchainedValidatorContract.ABI()[index] as MethodAbi; // tslint:disable-line:no-unnecessary-type-assertion + const functionSignature = methodAbiToFunctionSignature(methodAbi); + return functionSignature; + } + public getABIDecodedTransactionData(methodName: string, callData: string): T { + const functionSignature = this.getFunctionSignature(methodName); + const self = (this as any) as GodsUnchainedValidatorContract; + const abiEncoder = self._lookupAbiEncoder(functionSignature); + const abiDecodedCallData = abiEncoder.strictDecode(callData); + return abiDecodedCallData; + } + public getABIDecodedReturnData(methodName: string, callData: string): T { + const functionSignature = this.getFunctionSignature(methodName); + const self = (this as any) as GodsUnchainedValidatorContract; + const abiEncoder = self._lookupAbiEncoder(functionSignature); + const abiDecodedCallData = abiEncoder.strictDecodeReturnValue(callData); + return abiDecodedCallData; + } + public getSelector(methodName: string): string { + const functionSignature = this.getFunctionSignature(methodName); + const self = (this as any) as GodsUnchainedValidatorContract; + const abiEncoder = self._lookupAbiEncoder(functionSignature); + return abiEncoder.getSelector(); + } + + /** + * Checks that the given card (encoded as assetData) has the proto and quality encoded in `propertyData`. + * Reverts if the card doesn't match the specified proto and quality. + * @param tokenId The ERC721 tokenId of the card to check. + * @param propertyData Encoded proto and quality that the card is expected to + * have. + */ + public checkBrokerAsset(tokenId: BigNumber, propertyData: string): ContractFunctionObj { + const self = (this as any) as GodsUnchainedValidatorContract; + assert.isBigNumber('tokenId', tokenId); + assert.isString('propertyData', propertyData); + const functionSignature = 'checkBrokerAsset(uint256,bytes)'; + + return { + async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { + BaseContract._assertCallParams(callData, defaultBlock); + const rawCallResult = await self._performCallAsync( + { ...callData, data: this.getABIEncodedTransactionData() }, + defaultBlock, + ); + const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); + return abiEncoder.strictDecodeReturnValue(rawCallResult); + }, + getABIEncodedTransactionData(): string { + return self._strictEncodeArguments(functionSignature, [tokenId, propertyData]); + }, + }; + } + + constructor( + address: string, + supportedProvider: SupportedProvider, + txDefaults?: Partial, + logDecodeDependencies?: { [contractName: string]: ContractAbi }, + deployedBytecode: string | undefined = GodsUnchainedValidatorContract.deployedBytecode, + ) { + super( + 'GodsUnchainedValidator', + GodsUnchainedValidatorContract.ABI(), + address, + supportedProvider, + txDefaults, + logDecodeDependencies, + deployedBytecode, + ); + classUtils.bindAll(this, ['_abiEncoderByFunctionSignature', 'address', '_web3Wrapper']); + GodsUnchainedValidatorContract.ABI().forEach((item, index) => { + if (item.type === 'function') { + const methodAbi = item as MethodAbi; + this._methodABIIndex[methodAbi.name] = index; + } + }); + } +} + +// tslint:disable:max-file-line-count +// tslint:enable:no-unbound-method no-parameter-reassignment no-consecutive-blank-lines ordered-imports align +// tslint:enable:trailing-comma whitespace no-trailing-whitespace diff --git a/packages/migrations/src/migration.ts b/packages/migrations/src/migration.ts index 2b39e40078..6a8044c9c0 100644 --- a/packages/migrations/src/migration.ts +++ b/packages/migrations/src/migration.ts @@ -287,8 +287,6 @@ export async function runMigrationsAsync( erc20BridgeProxy: erc20BridgeProxy.address, zeroExGovernor: constants.NULL_ADDRESS, forwarder: forwarder.address, - orderValidator: constants.NULL_ADDRESS, - dutchAuction: constants.NULL_ADDRESS, coordinatorRegistry: coordinatorRegistry.address, coordinator: coordinator.address, multiAssetProxy: multiAssetProxy.address, diff --git a/python-packages/contract_addresses/src/zero_ex/contract_addresses/__init__.py b/python-packages/contract_addresses/src/zero_ex/contract_addresses/__init__.py index 506afd118f..f99153ea93 100644 --- a/python-packages/contract_addresses/src/zero_ex/contract_addresses/__init__.py +++ b/python-packages/contract_addresses/src/zero_ex/contract_addresses/__init__.py @@ -46,12 +46,6 @@ class ContractAddresses(NamedTuple): forwarder: str """Address of the Forwarder contract.""" - order_validator: str - """Address of the OrderValidator contract.""" - - dutch_auction: str - """Address of the DutchAuction contract.""" - coordinator_registry: str """Address of the CoordinatorRegistry contract.""" @@ -146,8 +140,6 @@ def chain_to_addresses(chain_id: ChainId) -> ContractAddresses: asset_proxy_owner=addresses["assetProxyOwner"], zero_ex_governor=addresses["zeroExGovernor"], forwarder=addresses["forwarder"], - order_validator=addresses["orderValidator"], - dutch_auction=addresses["dutchAuction"], coordinator_registry=addresses["coordinatorRegistry"], coordinator=addresses["coordinator"], multi_asset_proxy=addresses["multiAssetProxy"],