diff --git a/packages/0x.js/src/index.ts b/packages/0x.js/src/index.ts index 6656decc7c..3b7e0591a2 100644 --- a/packages/0x.js/src/index.ts +++ b/packages/0x.js/src/index.ts @@ -10,6 +10,9 @@ export { export { ContractWrappers, + CoordinatorWrapper, + CoordinatorServerCancellationResponse, + CoordinatorServerError, DutchAuctionWrapper, ERC20TokenWrapper, ERC721TokenWrapper, diff --git a/packages/contract-artifacts/artifacts/Coordinator.json b/packages/contract-artifacts/artifacts/Coordinator.json index 3c56715a8d..d7f985e8d9 100644 --- a/packages/contract-artifacts/artifacts/Coordinator.json +++ b/packages/contract-artifacts/artifacts/Coordinator.json @@ -27,7 +27,7 @@ "type": "function" }, { - "constant": false, + "constant": true, "inputs": [ { "components": [ @@ -46,32 +46,58 @@ ], "name": "transaction", "type": "tuple" - }, - { - "name": "txOrigin", - "type": "address" - }, + } + ], + "name": "getTransactionHash", + "outputs": [ { - "name": "transactionSignature", - "type": "bytes" - }, + "name": "transactionHash", + "type": "bytes32" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ { - "name": "approvalExpirationTimeSeconds", - "type": "uint256[]" - }, + "components": [ + { + "name": "txOrigin", + "type": "address" + }, + { + "name": "transactionHash", + "type": "bytes32" + }, + { + "name": "transactionSignature", + "type": "bytes" + }, + { + "name": "approvalExpirationTimeSeconds", + "type": "uint256" + } + ], + "name": "approval", + "type": "tuple" + } + ], + "name": "getCoordinatorApprovalHash", + "outputs": [ { - "name": "approvalSignatures", - "type": "bytes[]" + "name": "approvalHash", + "type": "bytes32" } ], - "name": "executeTransaction", - "outputs": [], "payable": false, - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "constant": true, + "constant": false, "inputs": [ { "components": [ @@ -108,16 +134,16 @@ "type": "bytes[]" } ], - "name": "assertValidCoordinatorApprovals", + "name": "executeTransaction", "outputs": [], "payable": false, - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [], - "name": "EIP712_DOMAIN_HASH", + "name": "EIP712_EXCHANGE_DOMAIN_HASH", "outputs": [ { "name": "", @@ -149,6 +175,39 @@ "name": "transaction", "type": "tuple" }, + { + "name": "txOrigin", + "type": "address" + }, + { + "name": "transactionSignature", + "type": "bytes" + }, + { + "name": "approvalExpirationTimeSeconds", + "type": "uint256[]" + }, + { + "name": "approvalSignatures", + "type": "bytes[]" + } + ], + "name": "assertValidCoordinatorApprovals", + "outputs": [], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "data", + "type": "bytes" + } + ], + "name": "decodeOrdersFromFillData", + "outputs": [ { "components": [ { @@ -202,26 +261,22 @@ ], "name": "orders", "type": "tuple[]" - }, - { - "name": "txOrigin", - "type": "address" - }, - { - "name": "transactionSignature", - "type": "bytes" - }, - { - "name": "approvalExpirationTimeSeconds", - "type": "uint256[]" - }, + } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "EIP712_COORDINATOR_DOMAIN_HASH", + "outputs": [ { - "name": "approvalSignatures", - "type": "bytes[]" + "name": "", + "type": "bytes32" } ], - "name": "assertValidTransactionOrdersApproval", - "outputs": [], "payable": false, "stateMutability": "view", "type": "function" @@ -241,9 +296,16 @@ "evm": { "bytecode": { "linkReferences": {}, - "object": "0x60806040523480156200001157600080fd5b506040516020806200238083398101806040526200003391908101906200022b565b604080517f454950373132446f6d61696e28000000000000000000000000000000000000006020808301919091527f737472696e67206e616d652c0000000000000000000000000000000000000000602d8301527f737472696e672076657273696f6e2c000000000000000000000000000000000060398301527f6164647265737320766572696679696e67436f6e74726163740000000000000060488301527f29000000000000000000000000000000000000000000000000000000000000006061830152825180830360420181526062830180855281519183019190912060a28401855260179091527f30782050726f746f636f6c20436f6f7264696e61746f7200000000000000000060829093019290925282518084018452600581527f312e302e30000000000000000000000000000000000000000000000000000000908201528251808201929092527f626d101e477fd17dd52afb3f9ad9eb016bf60f6e377877f34e8f3ea84c930236828401527f06c015bd22b4c69690933c1058878ebdfef31f9aaae40bbe86d8a09fe1b2972c6060830152306080808401919091528351808403909101815260a0909201909252805191012060005560018054600160a060020a031916600160a060020a039290921691909117905562000273565b600062000224825162000260565b9392505050565b6000602082840312156200023e57600080fd5b60006200024c848462000216565b949350505050565b600160a060020a031690565b60006200026d8262000254565b92915050565b6120fd80620002836000396000f3fe608060405234801561001057600080fd5b5060043610610084576000357c010000000000000000000000000000000000000000000000000000000090048063d2df07331161006d578063d2df0733146100c7578063e306f779146100da578063e3b1aa86146100ef57610084565b80630f7d8e391461008957806390c3bc3f146100b2575b600080fd5b61009c610097366004611888565b610102565b6040516100a99190611e6f565b60405180910390f35b6100c56100c036600461196e565b6104f7565b005b6100c56100d536600461196e565b6105a3565b6100e26105d4565b6040516100a99190611e7d565b6100c56100fd366004611a42565b6105da565b6000808251111515610149576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090611f3b565b60405180910390fd5b600061015483610821565b7f010000000000000000000000000000000000000000000000000000000000000090049050600360ff8216106101b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090611efb565b60008160ff1660038111156101c757fe5b905060008160038111156101d757fe5b141561020f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090611f2b565b600181600381111561021d57fe5b141561035b57835160411461025e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090611e8b565b600084600081518110151561026f57fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090819004810204905060006102b186600163ffffffff6108e516565b905060006102c687602163ffffffff6108e516565b905060018884848460405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015610325573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015196506104f195505050505050565b600281600381111561036957fe5b14156104bf5783516041146103aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090611e8b565b60008460008151811015156103bb57fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090819004810204905060006103fd86600163ffffffff6108e516565b9050600061041287602163ffffffff6108e516565b905060018860405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012084848460405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015610325573d6000803e3d6000fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090611efb565b92915050565b61050485858585856105a3565b6001548551602087015160408089015190517fbfc8bfce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9094169363bfc8bfce9361056a93909290918990600401611f5b565b600060405180830381600087803b15801561058457600080fd5b505af1158015610598573d6000803e3d6000fd5b505050505050505050565b60606105b28660400151610930565b90506000815111156105cc576105cc8682878787876105da565b505050505050565b60005481565b3273ffffffffffffffffffffffffffffffffffffffff851614610629576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090611f0b565b600061063487610de8565b60408051600080825260208201909252845192935091905b80821461073c576000868281518110151561066357fe5b906020019060200201519050610677611220565b506040805160808101825273ffffffffffffffffffffffffffffffffffffffff8b16815260208101879052908101899052606081018290524282116106e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090611edb565b60006106f382610dfb565b90506000610718828a8781518110151561070957fe5b90602001906020020151610102565b905061072a878263ffffffff610e0916565b9650506001909301925061064c915050565b5061074d823263ffffffff610e0916565b885190925060005b8082146108145789516000908b908390811061076d57fe5b906020019060200201516060015173ffffffffffffffffffffffffffffffffffffffff16141561079c5761080c565b60008a828151811015156107ac57fe5b6020908102909101015160400151905060006107ce868363ffffffff610ed316565b9050801515610809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090611e9b565b50505b600101610755565b5050505050505050505050565b600080825111151561085f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090611f1b565b815182907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190811061088f57fe5b016020015182517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01909252507f0100000000000000000000000000000000000000000000000000000000000000908190040290565b600081602001835110151515610927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090611eeb565b50016020015190565b60606000610944838263ffffffff610f1016565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167fb4be83d50000000000000000000000000000000000000000000000000000000014806109d757507fffffffff0000000000000000000000000000000000000000000000000000000081167f3e228bae00000000000000000000000000000000000000000000000000000000145b80610a2357507fffffffff0000000000000000000000000000000000000000000000000000000081167f64a3bc1500000000000000000000000000000000000000000000000000000000145b15610aad57610a30611248565b8351610a4690859060049063ffffffff610f7d16565b806020019051610a5991908101906118da565b604080516001808252818301909252919250816020015b610a78611248565b815260200190600190039081610a7057905050925080836000815181101515610a9d57fe5b6020908102909101015250610de2565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f297bb70b000000000000000000000000000000000000000000000000000000001480610b3e57507fffffffff0000000000000000000000000000000000000000000000000000000081167f50dde19000000000000000000000000000000000000000000000000000000000145b80610b8a57507fffffffff0000000000000000000000000000000000000000000000000000000081167f4d0ae54600000000000000000000000000000000000000000000000000000000145b80610bd657507fffffffff0000000000000000000000000000000000000000000000000000000081167fe5fa431b00000000000000000000000000000000000000000000000000000000145b80610c2257507fffffffff0000000000000000000000000000000000000000000000000000000081167fa3e2038000000000000000000000000000000000000000000000000000000000145b80610c6e57507fffffffff0000000000000000000000000000000000000000000000000000000081167f7e1d980800000000000000000000000000000000000000000000000000000000145b80610cba57507fffffffff0000000000000000000000000000000000000000000000000000000081167fdd1c7d1800000000000000000000000000000000000000000000000000000000145b15610cef578251610cd590849060049063ffffffff610f7d16565b806020019051610ce8919081019061184b565b9150610de2565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f3c28d861000000000000000000000000000000000000000000000000000000001415610de257610d41611248565b610d49611248565b8451610d5f90869060049063ffffffff610f7d16565b806020019051610d72919081019061190f565b60408051600280825260608201909252929450909250816020015b610d95611248565b815260200190600190039081610d8d57905050935081846000815181101515610dba57fe5b602090810290910101528351819085906001908110610dd557fe5b6020908102909101015250505b50919050565b60006104f1610df683611049565b6110b7565b60006104f1610df6836110f7565b815160405160609184906020808202808401820192910182851015610e5a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090611ecb565b82851115610e7457610e6d858583611156565b8497508793505b600182019150602081019050808401925082945081885284604052868860018403815181101515610ea157fe5b73ffffffffffffffffffffffffffffffffffffffff909216602092830290910190910152508694505050505092915050565b6000602083510260208401818101815b81811015610f0657805180871415610efd57600195508291505b50602001610ee3565b5050505092915050565b600081600401835110151515610f52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090611f4b565b5001602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b606081831115610fb9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090611eab565b8351821115610ff4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090611ebb565b8282036040519080825280601f01601f191660200182016040528015611021576020820181803883390190505b5090506110426110308261121a565b8461103a8761121a565b018351611156565b9392505050565b604081810151825160209384015182519285019290922083517f213c6f636f3ea94e701c0adf9b2624aa45a6c694f9a292c094f9a81c24b5df4c81529485019190915273ffffffffffffffffffffffffffffffffffffffff9091169183019190915260608201526080902090565b6000546040517f19010000000000000000000000000000000000000000000000000000000000008152600281019190915260228101919091526042902090565b604080820151825160208085015160608681015185519584019590952086517f2fbcdbaa76bc7589916958ae919dfbef04d23f6bbf26de6ff317b32c6cc01e058152938401949094529482015292830152608082015260a09020919050565b6020811015611180576001816020036101000a038019835116818551168082178652505050611215565b8282141561118d57611215565b828211156111c75760208103905080820181840181515b828510156111bf5784518652602095860195909401936111a4565b905250611215565b60208103905080820181840183515b8186121561121057825182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe092830192909101906111d6565b855250505b505050565b60200190565b6040805160808101825260008082526020820181905260609282018390529181019190915290565b61018060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160608152602001606081525090565b60006110428235612038565b60006110428251612038565b6000601f8201831361132b57600080fd5b813561133e61133982611fcd565b611fa6565b81815260209384019390925082018360005b83811015610f06578135860161136688826114b2565b8452506020928301929190910190600101611350565b6000601f8201831361138d57600080fd5b815161139b61133982611fcd565b81815260209384019390925082018360005b83811015610f0657815186016113c38882611690565b84525060209283019291909101906001016113ad565b6000601f820183136113ea57600080fd5b81356113f861133982611fcd565b81815260209384019390925082018360005b83811015610f0657813586016114208882611547565b845250602092830192919091019060010161140a565b6000601f8201831361144757600080fd5b813561145561133982611fcd565b9150818183526020840193506020810190508385602084028201111561147a57600080fd5b60005b83811015610f06578161149088826114a6565b845250602092830192919091019060010161147d565b60006110428235612043565b6000601f820183136114c357600080fd5b81356114d161133982611fee565b915080825260208301602083018583830111156114ed57600080fd5b6114f883828461205f565b50505092915050565b6000601f8201831361151257600080fd5b815161152061133982611fee565b9150808252602083016020830185838301111561153c57600080fd5b6114f883828461206b565b6000610180828403121561155a57600080fd5b611565610180611fa6565b905060006115738484611302565b825250602061158484848301611302565b602083015250604061159884828501611302565b60408301525060606115ac84828501611302565b60608301525060806115c0848285016114a6565b60808301525060a06115d4848285016114a6565b60a08301525060c06115e8848285016114a6565b60c08301525060e06115fc848285016114a6565b60e083015250610100611611848285016114a6565b61010083015250610120611627848285016114a6565b6101208301525061014082013567ffffffffffffffff81111561164957600080fd5b611655848285016114b2565b6101408301525061016082013567ffffffffffffffff81111561167757600080fd5b611683848285016114b2565b6101608301525092915050565b600061018082840312156116a357600080fd5b6116ae610180611fa6565b905060006116bc848461130e565b82525060206116cd8484830161130e565b60208301525060406116e18482850161130e565b60408301525060606116f58482850161130e565b60608301525060806117098482850161183f565b60808301525060a061171d8482850161183f565b60a08301525060c06117318482850161183f565b60c08301525060e06117458482850161183f565b60e08301525061010061175a8482850161183f565b610100830152506101206117708482850161183f565b6101208301525061014082015167ffffffffffffffff81111561179257600080fd5b61179e84828501611501565b6101408301525061016082015167ffffffffffffffff8111156117c057600080fd5b61168384828501611501565b6000606082840312156117de57600080fd5b6117e86060611fa6565b905060006117f684846114a6565b825250602061180784848301611302565b602083015250604082013567ffffffffffffffff81111561182757600080fd5b611833848285016114b2565b60408301525092915050565b60006110428251612043565b60006020828403121561185d57600080fd5b815167ffffffffffffffff81111561187457600080fd5b6118808482850161137c565b949350505050565b6000806040838503121561189b57600080fd5b60006118a785856114a6565b925050602083013567ffffffffffffffff8111156118c457600080fd5b6118d0858286016114b2565b9150509250929050565b6000602082840312156118ec57600080fd5b815167ffffffffffffffff81111561190357600080fd5b61188084828501611690565b6000806040838503121561192257600080fd5b825167ffffffffffffffff81111561193957600080fd5b61194585828601611690565b925050602083015167ffffffffffffffff81111561196257600080fd5b6118d085828601611690565b600080600080600060a0868803121561198657600080fd5b853567ffffffffffffffff81111561199d57600080fd5b6119a9888289016117cc565b95505060206119ba88828901611302565b945050604086013567ffffffffffffffff8111156119d757600080fd5b6119e3888289016114b2565b935050606086013567ffffffffffffffff811115611a0057600080fd5b611a0c88828901611436565b925050608086013567ffffffffffffffff811115611a2957600080fd5b611a358882890161131a565b9150509295509295909350565b60008060008060008060c08789031215611a5b57600080fd5b863567ffffffffffffffff811115611a7257600080fd5b611a7e89828a016117cc565b965050602087013567ffffffffffffffff811115611a9b57600080fd5b611aa789828a016113d9565b9550506040611ab889828a01611302565b945050606087013567ffffffffffffffff811115611ad557600080fd5b611ae189828a016114b2565b935050608087013567ffffffffffffffff811115611afe57600080fd5b611b0a89828a01611436565b92505060a087013567ffffffffffffffff811115611b2757600080fd5b611b3389828a0161131a565b9150509295509295509295565b611b4981612038565b82525050565b611b4981612043565b6000611b6382612034565b808452611b7781602086016020860161206b565b611b808161209b565b9093016020019392505050565b601281527f4c454e4754485f36355f52455155495245440000000000000000000000000000602082015260400190565b601a81527f494e56414c49445f415050524f56414c5f5349474e4154555245000000000000602082015260400190565b601a81527f46524f4d5f4c4553535f5448414e5f544f5f5245515549524544000000000000602082015260400190565b601c81527f544f5f4c4553535f5448414e5f4c454e4754485f524551554952454400000000602082015260400190565b601781527f494e56414c49445f465245455f4d454d4f52595f505452000000000000000000602082015260400190565b601081527f415050524f56414c5f4558504952454400000000000000000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601581527f5349474e41545552455f554e535550504f525445440000000000000000000000602082015260400190565b600e81527f494e56414c49445f4f524947494e000000000000000000000000000000000000602082015260400190565b602181527f475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524560208201527f4400000000000000000000000000000000000000000000000000000000000000604082015260600190565b601181527f5349474e41545552455f494c4c4547414c000000000000000000000000000000602082015260400190565b601e81527f4c454e4754485f475245415445525f5448414e5f305f52455155495245440000602082015260400190565b602581527f475245415445525f4f525f455155414c5f544f5f345f4c454e4754485f52455160208201527f5549524544000000000000000000000000000000000000000000000000000000604082015260600190565b602081016104f18284611b40565b602081016104f18284611b4f565b602080825281016104f181611b8d565b602080825281016104f181611bbd565b602080825281016104f181611bed565b602080825281016104f181611c1d565b602080825281016104f181611c4d565b602080825281016104f181611c7d565b602080825281016104f181611cad565b602080825281016104f181611d03565b602080825281016104f181611d33565b602080825281016104f181611d63565b602080825281016104f181611db9565b602080825281016104f181611de9565b602080825281016104f181611e19565b60808101611f698287611b4f565b611f766020830186611b40565b8181036040830152611f888185611b58565b90508181036060830152611f9c8184611b58565b9695505050505050565b60405181810167ffffffffffffffff81118282101715611fc557600080fd5b604052919050565b600067ffffffffffffffff821115611fe457600080fd5b5060209081020190565b600067ffffffffffffffff82111561200557600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b5190565b60006104f182612046565b90565b73ffffffffffffffffffffffffffffffffffffffff1690565b82818337506000910152565b60005b8381101561208657818101518382015260200161206e565b83811115612095576000848401525b50505050565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169056fea265627a7a7230582013be4e9e281ff59b6be3d1c4c7af6075c7d255edc60be429d25841f98f287b3e6c6578706572696d656e74616cf50037" + "object": "0x60806040523480156200001157600080fd5b506040516020806200235b833981018060405262000033919081019062000252565b600080546001600160a01b0319166001600160a01b0383161790556040516200005f906020016200029f565b60408051601f1981840301815282825280516020918201208383018352601784527f30782050726f746f636f6c20436f6f7264696e61746f720000000000000000009382019390935281518083018352600581527f312e302e300000000000000000000000000000000000000000000000000000009082015290516200012d92917f626d101e477fd17dd52afb3f9ad9eb016bf60f6e377877f34e8f3ea84c930236917f06c015bd22b4c69690933c1058878ebdfef31f9aaae40bbe86d8a09fe1b2972c9130910162000284565b60408051601f198184030181529082905280516020918201206001556200015591016200029f565b60408051601f1981840301815282825280516020918201208383018352600b84527f30782050726f746f636f6c0000000000000000000000000000000000000000009382019390935281518083018352600181527f32000000000000000000000000000000000000000000000000000000000000009082015260005491516200023093927ff0f24618f4c4be1e62e026fb039a20ef96f4495294817d1027ffaa6d1f70e61e927fad7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a5926001600160a01b03909216910162000284565b60408051601f1981840301815291905280516020909101206002555062000360565b6000602082840312156200026557600080fd5b81516001600160a01b03811681146200027d57600080fd5b9392505050565b93845260208401929092526040830152606082015260800190565b7f454950373132446f6d61696e280000000000000000000000000000000000000081527f737472696e67206e616d652c0000000000000000000000000000000000000000600d8201527f737472696e672076657273696f6e2c000000000000000000000000000000000060198201527f6164647265737320766572696679696e67436f6e74726163740000000000000060288201527f2900000000000000000000000000000000000000000000000000000000000000604182015260420190565b611feb80620003706000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063c26cfecd1161005b578063c26cfecd146100fe578063d2df073314610106578063ee55b96814610119578063fb6961cc1461013957610088565b80630f7d8e391461008d57806323872f55146100b657806348a321d6146100d657806390c3bc3f146100e9575b600080fd5b6100a061009b3660046115d7565b610141565b6040516100ad9190611958565b60405180910390f35b6100c96100c436600461177c565b6104d4565b6040516100ad9190611aad565b6100c96100e436600461165b565b6104e7565b6100fc6100f73660046117b1565b6104fa565b005b6100c96105a6565b6100fc6101143660046117b1565b6105ac565b61012c61012736600461161e565b6105db565b6040516100ad9190611979565b6100c9610a8f565b600080825111610186576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611d7d565b60405180910390fd5b600061019183610a95565b60f81c9050600481106101d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611c7b565b60008160ff1660048111156101e157fe5b905060008160048111156101f157fe5b1415610229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611d46565b600181600481111561023757fe5b14156102a857835115610276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611e48565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611db4565b60028160048111156102b657fe5b14156103bb5783516041146102f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611ad4565b60008460008151811061030657fe5b016020015160f890811c811b901c9050600061032986600163ffffffff610b1816565b9050600061033e87602163ffffffff610b1816565b9050600188848484604051600081526020016040526040516103639493929190611ab6565b6020604051602081039080840390855afa158015610385573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015196506104ce95505050505050565b60038160048111156103c957fe5b141561049c57835160411461040a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611ad4565b60008460008151811061041957fe5b016020015160f890811c811b901c9050600061043c86600163ffffffff610b1816565b9050600061045187602163ffffffff610b1816565b90506001886040516020016104669190611927565b60405160208183030381529060405280519060200120848484604051600081526020016040526040516103639493929190611ab6565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611c7b565b92915050565b60006104ce6104e283610b61565b610bcf565b60006104ce6104f583610bdd565b610c3c565b61050785858585856105ac565b6000548551602087015160408089015190517fbfc8bfce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9094169363bfc8bfce9361056d93909290918990600401611e7f565b600060405180830381600087803b15801561058757600080fd5b505af115801561059b573d6000803e3d6000fd5b505050505050505050565b60025481565b60606105bb86604001516105db565b8051909150156105d3576105d3868287878787610c4a565b505050505050565b606060006105ef838263ffffffff610e9816565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167fb4be83d500000000000000000000000000000000000000000000000000000000148061068257507fffffffff0000000000000000000000000000000000000000000000000000000081167f3e228bae00000000000000000000000000000000000000000000000000000000145b806106ce57507fffffffff0000000000000000000000000000000000000000000000000000000081167f64a3bc1500000000000000000000000000000000000000000000000000000000145b15610757576106db6111db565b83516106f190859060049063ffffffff610f0316565b80602001905161070491908101906116ed565b604080516001808252818301909252919250816020015b6107236111db565b81526020019060019003908161071b579050509250808360008151811061074657fe5b602002602001018190525050610a89565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f297bb70b0000000000000000000000000000000000000000000000000000000014806107e857507fffffffff0000000000000000000000000000000000000000000000000000000081167f50dde19000000000000000000000000000000000000000000000000000000000145b8061083457507fffffffff0000000000000000000000000000000000000000000000000000000081167f4d0ae54600000000000000000000000000000000000000000000000000000000145b8061088057507fffffffff0000000000000000000000000000000000000000000000000000000081167fe5fa431b00000000000000000000000000000000000000000000000000000000145b806108cc57507fffffffff0000000000000000000000000000000000000000000000000000000081167fa3e2038000000000000000000000000000000000000000000000000000000000145b8061091857507fffffffff0000000000000000000000000000000000000000000000000000000081167f7e1d980800000000000000000000000000000000000000000000000000000000145b8061096457507fffffffff0000000000000000000000000000000000000000000000000000000081167fdd1c7d1800000000000000000000000000000000000000000000000000000000145b1561099957825161097f90849060049063ffffffff610f0316565b806020019051610992919081019061154b565b9150610a89565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f3c28d861000000000000000000000000000000000000000000000000000000001415610a89576109eb6111db565b6109f36111db565b8451610a0990869060049063ffffffff610f0316565b806020019051610a1c9190810190611722565b60408051600280825260608201909252929450909250816020015b610a3f6111db565b815260200190600190039081610a375790505093508184600081518110610a6257fe5b60200260200101819052508084600181518110610a7b57fe5b602002602001018190525050505b50919050565b60015481565b600080825111610ad1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611ce9565b81600183510381518110610ae157fe5b016020015182517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019092525060f890811c901b90565b60008160200183511015610b58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611c1e565b50016020015190565b604081810151825160209384015182519285019290922083517f213c6f636f3ea94e701c0adf9b2624aa45a6c694f9a292c094f9a81c24b5df4c81529485019190915273ffffffffffffffffffffffffffffffffffffffff9091169183019190915260608201526080902090565b60006104ce60025483610fcf565b604080820151825160208085015160608681015185519584019590952086517f2fbcdbaa76bc7589916958ae919dfbef04d23f6bbf26de6ff317b32c6cc01e058152938401949094529482015292830152608082015260a09020919050565b60006104ce60015483610fcf565b3273ffffffffffffffffffffffffffffffffffffffff851614610c99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611cb2565b6000610ca4876104d4565b60408051600080825260208201909252845192935091905b818114610da5576000868281518110610cd157fe5b60200260200101519050610ce3611294565b60405180608001604052808b73ffffffffffffffffffffffffffffffffffffffff1681526020018781526020018a8152602001838152509050428211610d55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611be7565b6000610d60826104e7565b90506000610d81828a8781518110610d7457fe5b6020026020010151610141565b9050610d93878263ffffffff61100916565b96505060019093019250610cbc915050565b50610db6823263ffffffff61100916565b885190925060005b818114610e8b57600073ffffffffffffffffffffffffffffffffffffffff168a8281518110610de957fe5b60200260200101516060015173ffffffffffffffffffffffffffffffffffffffff161415610e1657610e83565b60008a8281518110610e2457fe5b60200260200101516040015190506000610e4782876110d090919063ffffffff16565b905080610e80576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611b0b565b50505b600101610dbe565b5050505050505050505050565b60008160040183511015610ed8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611deb565b5001602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b606081831115610f3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611b42565b8351821115610f7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611b79565b8282036040519080825280601f01601f191660200182016040528015610fa7576020820181803883390190505b509050610fc8610fb682611111565b84610fc087611111565b018351611117565b9392505050565b6040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b81516040516060918490602080820280840182019291018285101561105a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611bb0565b828511156110745761106d858583611117565b8497508793505b6001820191506020810190508084019250829450818852846040528688600184038151811061109f57fe5b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015250959695505050505050565b60006020835102602084018181018192505b80831015611108578251808614156110fc57600194508193505b506020830192506110e2565b50505092915050565b60200190565b6020811015611141576001816020036101000a0380198351168185511680821786525050506111d6565b8282141561114e576111d6565b828211156111885760208103905080820181840181515b82851015611180578451865260209586019590940193611165565b9052506111d6565b60208103905080820181840183515b818612156111d157825182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09283019290910190611197565b855250505b505050565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160608152602001606081525090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000801916815260200160608152602001600081525090565b80516104ce81611f8c565b600082601f8301126112f0578081fd5b81356113036112fe82611ef8565b611ed1565b8181529150602080830190840160005b838110156113405761132b876020843589010161134a565b83526020928301929190910190600101611313565b5050505092915050565b600082601f83011261135a578081fd5b81356113686112fe82611f19565b915080825283602082850101111561137f57600080fd5b8060208401602084013760009082016020015292915050565b600082601f8301126113a957600080fd5b81516113b76112fe82611f19565b91508082528360208285010111156113ce57600080fd5b6113df816020840160208601611f5c565b5092915050565b60006101808083850312156113f9578182fd5b61140281611ed1565b91505061140f83836112d5565b815261141e83602084016112d5565b602082015261143083604084016112d5565b604082015261144283606084016112d5565b60608201526080820151608082015260a082015160a082015260c082015160c082015260e082015160e08201526101008083015181830152506101208083015181830152506101408083015167ffffffffffffffff808211156114a457600080fd5b6114b086838701611398565b838501526101609250828501519150808211156114cc57600080fd5b506114d985828601611398565b82840152505092915050565b6000606082840312156114f6578081fd5b6115006060611ed1565b905081358152602082013561151481611f8c565b6020820152604082013567ffffffffffffffff81111561153357600080fd5b61153f8482850161134a565b60408301525092915050565b6000602080838503121561155d578182fd5b825167ffffffffffffffff811115611573578283fd5b80840185601f820112611584578384fd5b805191506115946112fe83611ef8565b82815283810190828501865b858110156115c9576115b78a8884518801016113e6565b845292860192908601906001016115a0565b509098975050505050505050565b600080604083850312156115ea57600080fd5b82359150602083013567ffffffffffffffff81111561160857600080fd5b6116148582860161134a565b9150509250929050565b60006020828403121561163057600080fd5b813567ffffffffffffffff81111561164757600080fd5b6116538482850161134a565b949350505050565b60006020828403121561166c578081fd5b813567ffffffffffffffff80821115611683578283fd5b81840160808187031215611695578384fd5b61169f6080611ed1565b925080356116ac81611f8c565b8352602081810135908401526040810135828111156116c9578485fd5b6116d58782840161134a565b60408501525060609081013590830152509392505050565b6000602082840312156116ff57600080fd5b815167ffffffffffffffff81111561171657600080fd5b611653848285016113e6565b6000806040838503121561173557600080fd5b825167ffffffffffffffff8082111561174d57600080fd5b611759868387016113e6565b9350602085015191508082111561176f57600080fd5b50611614858286016113e6565b60006020828403121561178e57600080fd5b813567ffffffffffffffff8111156117a557600080fd5b611653848285016114e5565b600080600080600060a086880312156117c8578081fd5b853567ffffffffffffffff808211156117df578283fd5b6117eb89838a016114e5565b965060209150818801356117fe81611f8c565b9550604088013581811115611811578384fd5b61181d8a828b0161134a565b955050606088013581811115611831578384fd5b8089018a601f820112611842578485fd5b803591506118526112fe83611ef8565b82815284810190828601868502840187018e101561186e578788fd5b8793505b84841015611890578035835260019390930192918601918601611872565b50965050505060808801359150808211156118a9578283fd5b506118b6888289016112e0565b9150509295509295909350565b73ffffffffffffffffffffffffffffffffffffffff169052565b600081518084526118f5816020860160208601611f5c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600060208083018184528085518083526040860191506040848202870101925083870160005b82811015611aa0577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845281516101806119de8783516118c3565b878201516119ee898901826118c3565b506040820151611a0160408901826118c3565b506060820151611a1460608901826118c3565b506080820151608088015260a082015160a088015260c082015160c088015260e082015160e08801526101008083015181890152506101208083015181890152506101408083015182828a0152611a6d838a01826118dd565b915050610160915081830151888203838a0152611a8a82826118dd565b985050509487019450509085019060010161199f565b5092979650505050505050565b90815260200190565b93845260ff9290921660208401526040830152606082015260800190565b60208082526012908201527f4c454e4754485f36355f52455155495245440000000000000000000000000000604082015260600190565b6020808252601a908201527f494e56414c49445f415050524f56414c5f5349474e4154555245000000000000604082015260600190565b6020808252601a908201527f46524f4d5f4c4553535f5448414e5f544f5f5245515549524544000000000000604082015260600190565b6020808252601c908201527f544f5f4c4553535f5448414e5f4c454e4754485f524551554952454400000000604082015260600190565b60208082526017908201527f494e56414c49445f465245455f4d454d4f52595f505452000000000000000000604082015260600190565b60208082526010908201527f415050524f56414c5f4558504952454400000000000000000000000000000000604082015260600190565b60208082526026908201527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560408201527f5155495245440000000000000000000000000000000000000000000000000000606082015260800190565b60208082526015908201527f5349474e41545552455f554e535550504f525445440000000000000000000000604082015260600190565b6020808252600e908201527f494e56414c49445f4f524947494e000000000000000000000000000000000000604082015260600190565b60208082526021908201527f475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524560408201527f4400000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526011908201527f5349474e41545552455f494c4c4547414c000000000000000000000000000000604082015260600190565b6020808252601e908201527f4c454e4754485f475245415445525f5448414e5f305f52455155495245440000604082015260600190565b60208082526011908201527f5349474e41545552455f494e56414c4944000000000000000000000000000000604082015260600190565b60208082526025908201527f475245415445525f4f525f455155414c5f544f5f345f4c454e4754485f52455160408201527f5549524544000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526011908201527f4c454e4754485f305f5245515549524544000000000000000000000000000000604082015260600190565b600085825273ffffffffffffffffffffffffffffffffffffffff8516602083015260806040830152611eb460808301856118dd565b8281036060840152611ec681856118dd565b979650505050505050565b60405181810167ffffffffffffffff81118282101715611ef057600080fd5b604052919050565b600067ffffffffffffffff821115611f0f57600080fd5b5060209081020190565b600067ffffffffffffffff821115611f3057600080fd5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b83811015611f77578181015183820152602001611f5f565b83811115611f86576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611fae57600080fd5b5056fea265627a7a72305820bcdb4aab3e1a04ea5cd6c138911116ceac3fac88de1995c4d3f24fdd3f420fb66c6578706572696d656e74616cf50037" + }, + "deployedBytecode": { + "linkReferences": {}, + "object": "0x608060405234801561001057600080fd5b50600436106100885760003560e01c8063c26cfecd1161005b578063c26cfecd146100fe578063d2df073314610106578063ee55b96814610119578063fb6961cc1461013957610088565b80630f7d8e391461008d57806323872f55146100b657806348a321d6146100d657806390c3bc3f146100e9575b600080fd5b6100a061009b3660046115d7565b610141565b6040516100ad9190611958565b60405180910390f35b6100c96100c436600461177c565b6104d4565b6040516100ad9190611aad565b6100c96100e436600461165b565b6104e7565b6100fc6100f73660046117b1565b6104fa565b005b6100c96105a6565b6100fc6101143660046117b1565b6105ac565b61012c61012736600461161e565b6105db565b6040516100ad9190611979565b6100c9610a8f565b600080825111610186576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611d7d565b60405180910390fd5b600061019183610a95565b60f81c9050600481106101d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611c7b565b60008160ff1660048111156101e157fe5b905060008160048111156101f157fe5b1415610229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611d46565b600181600481111561023757fe5b14156102a857835115610276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611e48565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611db4565b60028160048111156102b657fe5b14156103bb5783516041146102f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611ad4565b60008460008151811061030657fe5b016020015160f890811c811b901c9050600061032986600163ffffffff610b1816565b9050600061033e87602163ffffffff610b1816565b9050600188848484604051600081526020016040526040516103639493929190611ab6565b6020604051602081039080840390855afa158015610385573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015196506104ce95505050505050565b60038160048111156103c957fe5b141561049c57835160411461040a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611ad4565b60008460008151811061041957fe5b016020015160f890811c811b901c9050600061043c86600163ffffffff610b1816565b9050600061045187602163ffffffff610b1816565b90506001886040516020016104669190611927565b60405160208183030381529060405280519060200120848484604051600081526020016040526040516103639493929190611ab6565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611c7b565b92915050565b60006104ce6104e283610b61565b610bcf565b60006104ce6104f583610bdd565b610c3c565b61050785858585856105ac565b6000548551602087015160408089015190517fbfc8bfce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9094169363bfc8bfce9361056d93909290918990600401611e7f565b600060405180830381600087803b15801561058757600080fd5b505af115801561059b573d6000803e3d6000fd5b505050505050505050565b60025481565b60606105bb86604001516105db565b8051909150156105d3576105d3868287878787610c4a565b505050505050565b606060006105ef838263ffffffff610e9816565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167fb4be83d500000000000000000000000000000000000000000000000000000000148061068257507fffffffff0000000000000000000000000000000000000000000000000000000081167f3e228bae00000000000000000000000000000000000000000000000000000000145b806106ce57507fffffffff0000000000000000000000000000000000000000000000000000000081167f64a3bc1500000000000000000000000000000000000000000000000000000000145b15610757576106db6111db565b83516106f190859060049063ffffffff610f0316565b80602001905161070491908101906116ed565b604080516001808252818301909252919250816020015b6107236111db565b81526020019060019003908161071b579050509250808360008151811061074657fe5b602002602001018190525050610a89565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f297bb70b0000000000000000000000000000000000000000000000000000000014806107e857507fffffffff0000000000000000000000000000000000000000000000000000000081167f50dde19000000000000000000000000000000000000000000000000000000000145b8061083457507fffffffff0000000000000000000000000000000000000000000000000000000081167f4d0ae54600000000000000000000000000000000000000000000000000000000145b8061088057507fffffffff0000000000000000000000000000000000000000000000000000000081167fe5fa431b00000000000000000000000000000000000000000000000000000000145b806108cc57507fffffffff0000000000000000000000000000000000000000000000000000000081167fa3e2038000000000000000000000000000000000000000000000000000000000145b8061091857507fffffffff0000000000000000000000000000000000000000000000000000000081167f7e1d980800000000000000000000000000000000000000000000000000000000145b8061096457507fffffffff0000000000000000000000000000000000000000000000000000000081167fdd1c7d1800000000000000000000000000000000000000000000000000000000145b1561099957825161097f90849060049063ffffffff610f0316565b806020019051610992919081019061154b565b9150610a89565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f3c28d861000000000000000000000000000000000000000000000000000000001415610a89576109eb6111db565b6109f36111db565b8451610a0990869060049063ffffffff610f0316565b806020019051610a1c9190810190611722565b60408051600280825260608201909252929450909250816020015b610a3f6111db565b815260200190600190039081610a375790505093508184600081518110610a6257fe5b60200260200101819052508084600181518110610a7b57fe5b602002602001018190525050505b50919050565b60015481565b600080825111610ad1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611ce9565b81600183510381518110610ae157fe5b016020015182517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019092525060f890811c901b90565b60008160200183511015610b58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611c1e565b50016020015190565b604081810151825160209384015182519285019290922083517f213c6f636f3ea94e701c0adf9b2624aa45a6c694f9a292c094f9a81c24b5df4c81529485019190915273ffffffffffffffffffffffffffffffffffffffff9091169183019190915260608201526080902090565b60006104ce60025483610fcf565b604080820151825160208085015160608681015185519584019590952086517f2fbcdbaa76bc7589916958ae919dfbef04d23f6bbf26de6ff317b32c6cc01e058152938401949094529482015292830152608082015260a09020919050565b60006104ce60015483610fcf565b3273ffffffffffffffffffffffffffffffffffffffff851614610c99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611cb2565b6000610ca4876104d4565b60408051600080825260208201909252845192935091905b818114610da5576000868281518110610cd157fe5b60200260200101519050610ce3611294565b60405180608001604052808b73ffffffffffffffffffffffffffffffffffffffff1681526020018781526020018a8152602001838152509050428211610d55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611be7565b6000610d60826104e7565b90506000610d81828a8781518110610d7457fe5b6020026020010151610141565b9050610d93878263ffffffff61100916565b96505060019093019250610cbc915050565b50610db6823263ffffffff61100916565b885190925060005b818114610e8b57600073ffffffffffffffffffffffffffffffffffffffff168a8281518110610de957fe5b60200260200101516060015173ffffffffffffffffffffffffffffffffffffffff161415610e1657610e83565b60008a8281518110610e2457fe5b60200260200101516040015190506000610e4782876110d090919063ffffffff16565b905080610e80576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611b0b565b50505b600101610dbe565b5050505050505050505050565b60008160040183511015610ed8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611deb565b5001602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b606081831115610f3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611b42565b8351821115610f7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611b79565b8282036040519080825280601f01601f191660200182016040528015610fa7576020820181803883390190505b509050610fc8610fb682611111565b84610fc087611111565b018351611117565b9392505050565b6040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b81516040516060918490602080820280840182019291018285101561105a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611bb0565b828511156110745761106d858583611117565b8497508793505b6001820191506020810190508084019250829450818852846040528688600184038151811061109f57fe5b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015250959695505050505050565b60006020835102602084018181018192505b80831015611108578251808614156110fc57600194508193505b506020830192506110e2565b50505092915050565b60200190565b6020811015611141576001816020036101000a0380198351168185511680821786525050506111d6565b8282141561114e576111d6565b828211156111885760208103905080820181840181515b82851015611180578451865260209586019590940193611165565b9052506111d6565b60208103905080820181840183515b818612156111d157825182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09283019290910190611197565b855250505b505050565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160608152602001606081525090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000801916815260200160608152602001600081525090565b80516104ce81611f8c565b600082601f8301126112f0578081fd5b81356113036112fe82611ef8565b611ed1565b8181529150602080830190840160005b838110156113405761132b876020843589010161134a565b83526020928301929190910190600101611313565b5050505092915050565b600082601f83011261135a578081fd5b81356113686112fe82611f19565b915080825283602082850101111561137f57600080fd5b8060208401602084013760009082016020015292915050565b600082601f8301126113a957600080fd5b81516113b76112fe82611f19565b91508082528360208285010111156113ce57600080fd5b6113df816020840160208601611f5c565b5092915050565b60006101808083850312156113f9578182fd5b61140281611ed1565b91505061140f83836112d5565b815261141e83602084016112d5565b602082015261143083604084016112d5565b604082015261144283606084016112d5565b60608201526080820151608082015260a082015160a082015260c082015160c082015260e082015160e08201526101008083015181830152506101208083015181830152506101408083015167ffffffffffffffff808211156114a457600080fd5b6114b086838701611398565b838501526101609250828501519150808211156114cc57600080fd5b506114d985828601611398565b82840152505092915050565b6000606082840312156114f6578081fd5b6115006060611ed1565b905081358152602082013561151481611f8c565b6020820152604082013567ffffffffffffffff81111561153357600080fd5b61153f8482850161134a565b60408301525092915050565b6000602080838503121561155d578182fd5b825167ffffffffffffffff811115611573578283fd5b80840185601f820112611584578384fd5b805191506115946112fe83611ef8565b82815283810190828501865b858110156115c9576115b78a8884518801016113e6565b845292860192908601906001016115a0565b509098975050505050505050565b600080604083850312156115ea57600080fd5b82359150602083013567ffffffffffffffff81111561160857600080fd5b6116148582860161134a565b9150509250929050565b60006020828403121561163057600080fd5b813567ffffffffffffffff81111561164757600080fd5b6116538482850161134a565b949350505050565b60006020828403121561166c578081fd5b813567ffffffffffffffff80821115611683578283fd5b81840160808187031215611695578384fd5b61169f6080611ed1565b925080356116ac81611f8c565b8352602081810135908401526040810135828111156116c9578485fd5b6116d58782840161134a565b60408501525060609081013590830152509392505050565b6000602082840312156116ff57600080fd5b815167ffffffffffffffff81111561171657600080fd5b611653848285016113e6565b6000806040838503121561173557600080fd5b825167ffffffffffffffff8082111561174d57600080fd5b611759868387016113e6565b9350602085015191508082111561176f57600080fd5b50611614858286016113e6565b60006020828403121561178e57600080fd5b813567ffffffffffffffff8111156117a557600080fd5b611653848285016114e5565b600080600080600060a086880312156117c8578081fd5b853567ffffffffffffffff808211156117df578283fd5b6117eb89838a016114e5565b965060209150818801356117fe81611f8c565b9550604088013581811115611811578384fd5b61181d8a828b0161134a565b955050606088013581811115611831578384fd5b8089018a601f820112611842578485fd5b803591506118526112fe83611ef8565b82815284810190828601868502840187018e101561186e578788fd5b8793505b84841015611890578035835260019390930192918601918601611872565b50965050505060808801359150808211156118a9578283fd5b506118b6888289016112e0565b9150509295509295909350565b73ffffffffffffffffffffffffffffffffffffffff169052565b600081518084526118f5816020860160208601611f5c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600060208083018184528085518083526040860191506040848202870101925083870160005b82811015611aa0577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845281516101806119de8783516118c3565b878201516119ee898901826118c3565b506040820151611a0160408901826118c3565b506060820151611a1460608901826118c3565b506080820151608088015260a082015160a088015260c082015160c088015260e082015160e08801526101008083015181890152506101208083015181890152506101408083015182828a0152611a6d838a01826118dd565b915050610160915081830151888203838a0152611a8a82826118dd565b985050509487019450509085019060010161199f565b5092979650505050505050565b90815260200190565b93845260ff9290921660208401526040830152606082015260800190565b60208082526012908201527f4c454e4754485f36355f52455155495245440000000000000000000000000000604082015260600190565b6020808252601a908201527f494e56414c49445f415050524f56414c5f5349474e4154555245000000000000604082015260600190565b6020808252601a908201527f46524f4d5f4c4553535f5448414e5f544f5f5245515549524544000000000000604082015260600190565b6020808252601c908201527f544f5f4c4553535f5448414e5f4c454e4754485f524551554952454400000000604082015260600190565b60208082526017908201527f494e56414c49445f465245455f4d454d4f52595f505452000000000000000000604082015260600190565b60208082526010908201527f415050524f56414c5f4558504952454400000000000000000000000000000000604082015260600190565b60208082526026908201527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560408201527f5155495245440000000000000000000000000000000000000000000000000000606082015260800190565b60208082526015908201527f5349474e41545552455f554e535550504f525445440000000000000000000000604082015260600190565b6020808252600e908201527f494e56414c49445f4f524947494e000000000000000000000000000000000000604082015260600190565b60208082526021908201527f475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524560408201527f4400000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526011908201527f5349474e41545552455f494c4c4547414c000000000000000000000000000000604082015260600190565b6020808252601e908201527f4c454e4754485f475245415445525f5448414e5f305f52455155495245440000604082015260600190565b60208082526011908201527f5349474e41545552455f494e56414c4944000000000000000000000000000000604082015260600190565b60208082526025908201527f475245415445525f4f525f455155414c5f544f5f345f4c454e4754485f52455160408201527f5549524544000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526011908201527f4c454e4754485f305f5245515549524544000000000000000000000000000000604082015260600190565b600085825273ffffffffffffffffffffffffffffffffffffffff8516602083015260806040830152611eb460808301856118dd565b8281036060840152611ec681856118dd565b979650505050505050565b60405181810167ffffffffffffffff81118282101715611ef057600080fd5b604052919050565b600067ffffffffffffffff821115611f0f57600080fd5b5060209081020190565b600067ffffffffffffffff821115611f3057600080fd5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b83811015611f77578181015183820152602001611f5f565b83811115611f86576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611fae57600080fd5b5056fea265627a7a72305820bcdb4aab3e1a04ea5cd6c138911116ceac3fac88de1995c4d3f24fdd3f420fb66c6578706572696d656e74616cf50037", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x88 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xC26CFECD GT PUSH2 0x5B JUMPI DUP1 PUSH4 0xC26CFECD EQ PUSH2 0xFE JUMPI DUP1 PUSH4 0xD2DF0733 EQ PUSH2 0x106 JUMPI DUP1 PUSH4 0xEE55B968 EQ PUSH2 0x119 JUMPI DUP1 PUSH4 0xFB6961CC EQ PUSH2 0x139 JUMPI PUSH2 0x88 JUMP JUMPDEST DUP1 PUSH4 0xF7D8E39 EQ PUSH2 0x8D JUMPI DUP1 PUSH4 0x23872F55 EQ PUSH2 0xB6 JUMPI DUP1 PUSH4 0x48A321D6 EQ PUSH2 0xD6 JUMPI DUP1 PUSH4 0x90C3BC3F EQ PUSH2 0xE9 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xA0 PUSH2 0x9B CALLDATASIZE PUSH1 0x4 PUSH2 0x15D7 JUMP JUMPDEST PUSH2 0x141 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xAD SWAP2 SWAP1 PUSH2 0x1958 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xC9 PUSH2 0xC4 CALLDATASIZE PUSH1 0x4 PUSH2 0x177C JUMP JUMPDEST PUSH2 0x4D4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xAD SWAP2 SWAP1 PUSH2 0x1AAD JUMP JUMPDEST PUSH2 0xC9 PUSH2 0xE4 CALLDATASIZE PUSH1 0x4 PUSH2 0x165B JUMP JUMPDEST PUSH2 0x4E7 JUMP JUMPDEST PUSH2 0xFC PUSH2 0xF7 CALLDATASIZE PUSH1 0x4 PUSH2 0x17B1 JUMP JUMPDEST PUSH2 0x4FA JUMP JUMPDEST STOP JUMPDEST PUSH2 0xC9 PUSH2 0x5A6 JUMP JUMPDEST PUSH2 0xFC PUSH2 0x114 CALLDATASIZE PUSH1 0x4 PUSH2 0x17B1 JUMP JUMPDEST PUSH2 0x5AC JUMP JUMPDEST PUSH2 0x12C PUSH2 0x127 CALLDATASIZE PUSH1 0x4 PUSH2 0x161E JUMP JUMPDEST PUSH2 0x5DB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xAD SWAP2 SWAP1 PUSH2 0x1979 JUMP JUMPDEST PUSH2 0xC9 PUSH2 0xA8F JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD GT PUSH2 0x186 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x17D SWAP1 PUSH2 0x1D7D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x191 DUP4 PUSH2 0xA95 JUMP JUMPDEST PUSH1 0xF8 SHR SWAP1 POP PUSH1 0x4 DUP2 LT PUSH2 0x1D0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x17D SWAP1 PUSH2 0x1C7B JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0xFF AND PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1E1 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1F1 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x229 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x17D SWAP1 PUSH2 0x1D46 JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x237 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x2A8 JUMPI DUP4 MLOAD ISZERO PUSH2 0x276 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x17D SWAP1 PUSH2 0x1E48 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x17D SWAP1 PUSH2 0x1DB4 JUMP JUMPDEST PUSH1 0x2 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x2B6 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x3BB JUMPI DUP4 MLOAD PUSH1 0x41 EQ PUSH2 0x2F7 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x17D SWAP1 PUSH2 0x1AD4 JUMP JUMPDEST PUSH1 0x0 DUP5 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x306 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 SWAP1 DUP2 SHR DUP2 SHL SWAP1 SHR SWAP1 POP PUSH1 0x0 PUSH2 0x329 DUP7 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0xB18 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x33E DUP8 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0xB18 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x1 DUP9 DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x363 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1AB6 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x385 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD SWAP7 POP PUSH2 0x4CE SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x3 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x3C9 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x49C JUMPI DUP4 MLOAD PUSH1 0x41 EQ PUSH2 0x40A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x17D SWAP1 PUSH2 0x1AD4 JUMP JUMPDEST PUSH1 0x0 DUP5 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x419 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 SWAP1 DUP2 SHR DUP2 SHL SWAP1 SHR SWAP1 POP PUSH1 0x0 PUSH2 0x43C DUP7 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0xB18 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x451 DUP8 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0xB18 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x1 DUP9 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x466 SWAP2 SWAP1 PUSH2 0x1927 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x363 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1AB6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x17D SWAP1 PUSH2 0x1C7B JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4CE PUSH2 0x4E2 DUP4 PUSH2 0xB61 JUMP JUMPDEST PUSH2 0xBCF JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4CE PUSH2 0x4F5 DUP4 PUSH2 0xBDD JUMP JUMPDEST PUSH2 0xC3C JUMP JUMPDEST PUSH2 0x507 DUP6 DUP6 DUP6 DUP6 DUP6 PUSH2 0x5AC JUMP JUMPDEST PUSH1 0x0 SLOAD DUP6 MLOAD PUSH1 0x20 DUP8 ADD MLOAD PUSH1 0x40 DUP1 DUP10 ADD MLOAD SWAP1 MLOAD PUSH32 0xBFC8BFCE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP5 AND SWAP4 PUSH4 0xBFC8BFCE SWAP4 PUSH2 0x56D SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x1E7F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x587 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x59B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x5BB DUP7 PUSH1 0x40 ADD MLOAD PUSH2 0x5DB JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x5D3 JUMPI PUSH2 0x5D3 DUP7 DUP3 DUP8 DUP8 DUP8 DUP8 PUSH2 0xC4A JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x5EF DUP4 DUP3 PUSH4 0xFFFFFFFF PUSH2 0xE98 AND JUMP JUMPDEST SWAP1 POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0x682 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x3E228BAE00000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x6CE JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x64A3BC1500000000000000000000000000000000000000000000000000000000 EQ JUMPDEST ISZERO PUSH2 0x757 JUMPI PUSH2 0x6DB PUSH2 0x11DB JUMP JUMPDEST DUP4 MLOAD PUSH2 0x6F1 SWAP1 DUP6 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0xF03 AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x704 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x16ED JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE SWAP2 SWAP3 POP DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0x723 PUSH2 0x11DB JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x71B JUMPI SWAP1 POP POP SWAP3 POP DUP1 DUP4 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x746 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP POP PUSH2 0xA89 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x297BB70B00000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0x7E8 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x50DDE19000000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x834 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x4D0AE54600000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x880 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xE5FA431B00000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x8CC JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xA3E2038000000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x918 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x7E1D980800000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x964 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xDD1C7D1800000000000000000000000000000000000000000000000000000000 EQ JUMPDEST ISZERO PUSH2 0x999 JUMPI DUP3 MLOAD PUSH2 0x97F SWAP1 DUP5 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0xF03 AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x992 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x154B JUMP JUMPDEST SWAP2 POP PUSH2 0xA89 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x3C28D86100000000000000000000000000000000000000000000000000000000 EQ ISZERO PUSH2 0xA89 JUMPI PUSH2 0x9EB PUSH2 0x11DB JUMP JUMPDEST PUSH2 0x9F3 PUSH2 0x11DB JUMP JUMPDEST DUP5 MLOAD PUSH2 0xA09 SWAP1 DUP7 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0xF03 AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0xA1C SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1722 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x2 DUP1 DUP3 MSTORE PUSH1 0x60 DUP3 ADD SWAP1 SWAP3 MSTORE SWAP3 SWAP5 POP SWAP1 SWAP3 POP DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0xA3F PUSH2 0x11DB JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0xA37 JUMPI SWAP1 POP POP SWAP4 POP DUP2 DUP5 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0xA62 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP DUP1 DUP5 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0xA7B JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP POP POP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x1 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD GT PUSH2 0xAD1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x17D SWAP1 PUSH2 0x1CE9 JUMP JUMPDEST DUP2 PUSH1 0x1 DUP4 MLOAD SUB DUP2 MLOAD DUP2 LT PUSH2 0xAE1 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD DUP3 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP3 MSTORE POP PUSH1 0xF8 SWAP1 DUP2 SHR SWAP1 SHL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH2 0xB58 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x17D SWAP1 PUSH2 0x1C1E JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP2 DUP2 ADD MLOAD DUP3 MLOAD PUSH1 0x20 SWAP4 DUP5 ADD MLOAD DUP3 MLOAD SWAP3 DUP6 ADD SWAP3 SWAP1 SWAP3 KECCAK256 DUP4 MLOAD PUSH32 0x213C6F636F3EA94E701C0ADF9B2624AA45A6C694F9A292C094F9A81C24B5DF4C DUP2 MSTORE SWAP5 DUP6 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4CE PUSH1 0x2 SLOAD DUP4 PUSH2 0xFCF JUMP JUMPDEST PUSH1 0x40 DUP1 DUP3 ADD MLOAD DUP3 MLOAD PUSH1 0x20 DUP1 DUP6 ADD MLOAD PUSH1 0x60 DUP7 DUP2 ADD MLOAD DUP6 MLOAD SWAP6 DUP5 ADD SWAP6 SWAP1 SWAP6 KECCAK256 DUP7 MLOAD PUSH32 0x2FBCDBAA76BC7589916958AE919DFBEF04D23F6BBF26DE6FF317B32C6CC01E05 DUP2 MSTORE SWAP4 DUP5 ADD SWAP5 SWAP1 SWAP5 MSTORE SWAP5 DUP3 ADD MSTORE SWAP3 DUP4 ADD MSTORE PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 SWAP1 KECCAK256 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4CE PUSH1 0x1 SLOAD DUP4 PUSH2 0xFCF JUMP JUMPDEST ORIGIN PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND EQ PUSH2 0xC99 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x17D SWAP1 PUSH2 0x1CB2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xCA4 DUP8 PUSH2 0x4D4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 SWAP3 MSTORE DUP5 MLOAD SWAP3 SWAP4 POP SWAP2 SWAP1 JUMPDEST DUP2 DUP2 EQ PUSH2 0xDA5 JUMPI PUSH1 0x0 DUP7 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0xCD1 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP1 POP PUSH2 0xCE3 PUSH2 0x1294 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 DUP12 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP8 DUP2 MSTORE PUSH1 0x20 ADD DUP11 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE POP SWAP1 POP TIMESTAMP DUP3 GT PUSH2 0xD55 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x17D SWAP1 PUSH2 0x1BE7 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xD60 DUP3 PUSH2 0x4E7 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xD81 DUP3 DUP11 DUP8 DUP2 MLOAD DUP2 LT PUSH2 0xD74 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x141 JUMP JUMPDEST SWAP1 POP PUSH2 0xD93 DUP8 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x1009 AND JUMP JUMPDEST SWAP7 POP POP PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 POP PUSH2 0xCBC SWAP2 POP POP JUMP JUMPDEST POP PUSH2 0xDB6 DUP3 ORIGIN PUSH4 0xFFFFFFFF PUSH2 0x1009 AND JUMP JUMPDEST DUP9 MLOAD SWAP1 SWAP3 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0xE8B JUMPI PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP11 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0xDE9 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xE16 JUMPI PUSH2 0xE83 JUMP JUMPDEST PUSH1 0x0 DUP11 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0xE24 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 ADD MLOAD SWAP1 POP PUSH1 0x0 PUSH2 0xE47 DUP3 DUP8 PUSH2 0x10D0 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP DUP1 PUSH2 0xE80 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x17D SWAP1 PUSH2 0x1B0B JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x1 ADD PUSH2 0xDBE JUMP JUMPDEST POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 ADD DUP4 MLOAD LT ISZERO PUSH2 0xED8 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x17D SWAP1 PUSH2 0x1DEB JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 DUP4 GT ISZERO PUSH2 0xF3F JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x17D SWAP1 PUSH2 0x1B42 JUMP JUMPDEST DUP4 MLOAD DUP3 GT ISZERO PUSH2 0xF7A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x17D SWAP1 PUSH2 0x1B79 JUMP JUMPDEST DUP3 DUP3 SUB PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xFA7 JUMPI PUSH1 0x20 DUP3 ADD DUP2 DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH2 0xFC8 PUSH2 0xFB6 DUP3 PUSH2 0x1111 JUMP JUMPDEST DUP5 PUSH2 0xFC0 DUP8 PUSH2 0x1111 JUMP JUMPDEST ADD DUP4 MLOAD PUSH2 0x1117 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x2 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x22 DUP3 ADD MSTORE PUSH1 0x42 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x40 MLOAD PUSH1 0x60 SWAP2 DUP5 SWAP1 PUSH1 0x20 DUP1 DUP3 MUL DUP1 DUP5 ADD DUP3 ADD SWAP3 SWAP2 ADD DUP3 DUP6 LT ISZERO PUSH2 0x105A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x17D SWAP1 PUSH2 0x1BB0 JUMP JUMPDEST DUP3 DUP6 GT ISZERO PUSH2 0x1074 JUMPI PUSH2 0x106D DUP6 DUP6 DUP4 PUSH2 0x1117 JUMP JUMPDEST DUP5 SWAP8 POP DUP8 SWAP4 POP JUMPDEST PUSH1 0x1 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP1 DUP5 ADD SWAP3 POP DUP3 SWAP5 POP DUP2 DUP9 MSTORE DUP5 PUSH1 0x40 MSTORE DUP7 DUP9 PUSH1 0x1 DUP5 SUB DUP2 MLOAD DUP2 LT PUSH2 0x109F JUMPI INVALID JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x20 SWAP3 DUP4 MUL SWAP2 SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE POP SWAP6 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP4 MLOAD MUL PUSH1 0x20 DUP5 ADD DUP2 DUP2 ADD DUP2 SWAP3 POP JUMPDEST DUP1 DUP4 LT ISZERO PUSH2 0x1108 JUMPI DUP3 MLOAD DUP1 DUP7 EQ ISZERO PUSH2 0x10FC JUMPI PUSH1 0x1 SWAP5 POP DUP2 SWAP4 POP JUMPDEST POP PUSH1 0x20 DUP4 ADD SWAP3 POP PUSH2 0x10E2 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1141 JUMPI PUSH1 0x1 DUP2 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP4 MLOAD AND DUP2 DUP6 MLOAD AND DUP1 DUP3 OR DUP7 MSTORE POP POP POP PUSH2 0x11D6 JUMP JUMPDEST DUP3 DUP3 EQ ISZERO PUSH2 0x114E JUMPI PUSH2 0x11D6 JUMP JUMPDEST DUP3 DUP3 GT ISZERO PUSH2 0x1188 JUMPI PUSH1 0x20 DUP2 SUB SWAP1 POP DUP1 DUP3 ADD DUP2 DUP5 ADD DUP2 MLOAD JUMPDEST DUP3 DUP6 LT ISZERO PUSH2 0x1180 JUMPI DUP5 MLOAD DUP7 MSTORE PUSH1 0x20 SWAP6 DUP7 ADD SWAP6 SWAP1 SWAP5 ADD SWAP4 PUSH2 0x1165 JUMP JUMPDEST SWAP1 MSTORE POP PUSH2 0x11D6 JUMP JUMPDEST PUSH1 0x20 DUP2 SUB SWAP1 POP DUP1 DUP3 ADD DUP2 DUP5 ADD DUP4 MLOAD JUMPDEST DUP2 DUP7 SLT ISZERO PUSH2 0x11D1 JUMPI DUP3 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x1197 JUMP JUMPDEST DUP6 MSTORE POP POP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH2 0x180 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP1 NOT AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH2 0x4CE DUP2 PUSH2 0x1F8C JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x12F0 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1303 PUSH2 0x12FE DUP3 PUSH2 0x1EF8 JUMP JUMPDEST PUSH2 0x1ED1 JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 ADD PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1340 JUMPI PUSH2 0x132B DUP8 PUSH1 0x20 DUP5 CALLDATALOAD DUP10 ADD ADD PUSH2 0x134A JUMP JUMPDEST DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1313 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x135A JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1368 PUSH2 0x12FE DUP3 PUSH2 0x1F19 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x137F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP5 ADD CALLDATACOPY PUSH1 0x0 SWAP1 DUP3 ADD PUSH1 0x20 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x13A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x13B7 PUSH2 0x12FE DUP3 PUSH2 0x1F19 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x13CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x13DF DUP2 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x1F5C JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x13F9 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x1402 DUP2 PUSH2 0x1ED1 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x140F DUP4 DUP4 PUSH2 0x12D5 JUMP JUMPDEST DUP2 MSTORE PUSH2 0x141E DUP4 PUSH1 0x20 DUP5 ADD PUSH2 0x12D5 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x1430 DUP4 PUSH1 0x40 DUP5 ADD PUSH2 0x12D5 JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x1442 DUP4 PUSH1 0x60 DUP5 ADD PUSH2 0x12D5 JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 DUP3 ADD MLOAD PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 DUP3 ADD MLOAD PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 DUP3 ADD MLOAD PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xE0 DUP3 ADD MLOAD PUSH1 0xE0 DUP3 ADD MSTORE PUSH2 0x100 DUP1 DUP4 ADD MLOAD DUP2 DUP4 ADD MSTORE POP PUSH2 0x120 DUP1 DUP4 ADD MLOAD DUP2 DUP4 ADD MSTORE POP PUSH2 0x140 DUP1 DUP4 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x14A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x14B0 DUP7 DUP4 DUP8 ADD PUSH2 0x1398 JUMP JUMPDEST DUP4 DUP6 ADD MSTORE PUSH2 0x160 SWAP3 POP DUP3 DUP6 ADD MLOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x14CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x14D9 DUP6 DUP3 DUP7 ADD PUSH2 0x1398 JUMP JUMPDEST DUP3 DUP5 ADD MSTORE POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x14F6 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x1500 PUSH1 0x60 PUSH2 0x1ED1 JUMP JUMPDEST SWAP1 POP DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH2 0x1514 DUP2 PUSH2 0x1F8C JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1533 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x153F DUP5 DUP3 DUP6 ADD PUSH2 0x134A JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x155D JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1573 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP1 DUP5 ADD DUP6 PUSH1 0x1F DUP3 ADD SLT PUSH2 0x1584 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP1 MLOAD SWAP2 POP PUSH2 0x1594 PUSH2 0x12FE DUP4 PUSH2 0x1EF8 JUMP JUMPDEST DUP3 DUP2 MSTORE DUP4 DUP2 ADD SWAP1 DUP3 DUP6 ADD DUP7 JUMPDEST DUP6 DUP2 LT ISZERO PUSH2 0x15C9 JUMPI PUSH2 0x15B7 DUP11 DUP9 DUP5 MLOAD DUP9 ADD ADD PUSH2 0x13E6 JUMP JUMPDEST DUP5 MSTORE SWAP3 DUP7 ADD SWAP3 SWAP1 DUP7 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x15A0 JUMP JUMPDEST POP SWAP1 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x15EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1608 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1614 DUP6 DUP3 DUP7 ADD PUSH2 0x134A JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1630 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1647 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1653 DUP5 DUP3 DUP6 ADD PUSH2 0x134A JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x166C JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1683 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP5 ADD PUSH1 0x80 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x1695 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x169F PUSH1 0x80 PUSH2 0x1ED1 JUMP JUMPDEST SWAP3 POP DUP1 CALLDATALOAD PUSH2 0x16AC DUP2 PUSH2 0x1F8C JUMP JUMPDEST DUP4 MSTORE PUSH1 0x20 DUP2 DUP2 ADD CALLDATALOAD SWAP1 DUP5 ADD MSTORE PUSH1 0x40 DUP2 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0x16C9 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x16D5 DUP8 DUP3 DUP5 ADD PUSH2 0x134A JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MSTORE POP PUSH1 0x60 SWAP1 DUP2 ADD CALLDATALOAD SWAP1 DUP4 ADD MSTORE POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x16FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1716 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1653 DUP5 DUP3 DUP6 ADD PUSH2 0x13E6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1735 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x174D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1759 DUP7 DUP4 DUP8 ADD PUSH2 0x13E6 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD MLOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x176F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1614 DUP6 DUP3 DUP7 ADD PUSH2 0x13E6 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x178E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x17A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1653 DUP5 DUP3 DUP6 ADD PUSH2 0x14E5 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x17C8 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x17DF JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x17EB DUP10 DUP4 DUP11 ADD PUSH2 0x14E5 JUMP JUMPDEST SWAP7 POP PUSH1 0x20 SWAP2 POP DUP2 DUP9 ADD CALLDATALOAD PUSH2 0x17FE DUP2 PUSH2 0x1F8C JUMP JUMPDEST SWAP6 POP PUSH1 0x40 DUP9 ADD CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1811 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x181D DUP11 DUP3 DUP12 ADD PUSH2 0x134A JUMP JUMPDEST SWAP6 POP POP PUSH1 0x60 DUP9 ADD CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1831 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP1 DUP10 ADD DUP11 PUSH1 0x1F DUP3 ADD SLT PUSH2 0x1842 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP2 POP PUSH2 0x1852 PUSH2 0x12FE DUP4 PUSH2 0x1EF8 JUMP JUMPDEST DUP3 DUP2 MSTORE DUP5 DUP2 ADD SWAP1 DUP3 DUP7 ADD DUP7 DUP6 MUL DUP5 ADD DUP8 ADD DUP15 LT ISZERO PUSH2 0x186E JUMPI DUP8 DUP9 REVERT JUMPDEST DUP8 SWAP4 POP JUMPDEST DUP5 DUP5 LT ISZERO PUSH2 0x1890 JUMPI DUP1 CALLDATALOAD DUP4 MSTORE PUSH1 0x1 SWAP4 SWAP1 SWAP4 ADD SWAP3 SWAP2 DUP7 ADD SWAP2 DUP7 ADD PUSH2 0x1872 JUMP JUMPDEST POP SWAP7 POP POP POP POP PUSH1 0x80 DUP9 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x18A9 JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x18B6 DUP9 DUP3 DUP10 ADD PUSH2 0x12E0 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x18F5 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x1F5C JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE PUSH1 0x1C DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x3C ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 ADD DUP2 DUP5 MSTORE DUP1 DUP6 MLOAD DUP1 DUP4 MSTORE PUSH1 0x40 DUP7 ADD SWAP2 POP PUSH1 0x40 DUP5 DUP3 MUL DUP8 ADD ADD SWAP3 POP DUP4 DUP8 ADD PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x1AA0 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 DUP9 DUP7 SUB ADD DUP5 MSTORE DUP2 MLOAD PUSH2 0x180 PUSH2 0x19DE DUP8 DUP4 MLOAD PUSH2 0x18C3 JUMP JUMPDEST DUP8 DUP3 ADD MLOAD PUSH2 0x19EE DUP10 DUP10 ADD DUP3 PUSH2 0x18C3 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x1A01 PUSH1 0x40 DUP10 ADD DUP3 PUSH2 0x18C3 JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH2 0x1A14 PUSH1 0x60 DUP10 ADD DUP3 PUSH2 0x18C3 JUMP JUMPDEST POP PUSH1 0x80 DUP3 ADD MLOAD PUSH1 0x80 DUP9 ADD MSTORE PUSH1 0xA0 DUP3 ADD MLOAD PUSH1 0xA0 DUP9 ADD MSTORE PUSH1 0xC0 DUP3 ADD MLOAD PUSH1 0xC0 DUP9 ADD MSTORE PUSH1 0xE0 DUP3 ADD MLOAD PUSH1 0xE0 DUP9 ADD MSTORE PUSH2 0x100 DUP1 DUP4 ADD MLOAD DUP2 DUP10 ADD MSTORE POP PUSH2 0x120 DUP1 DUP4 ADD MLOAD DUP2 DUP10 ADD MSTORE POP PUSH2 0x140 DUP1 DUP4 ADD MLOAD DUP3 DUP3 DUP11 ADD MSTORE PUSH2 0x1A6D DUP4 DUP11 ADD DUP3 PUSH2 0x18DD JUMP JUMPDEST SWAP2 POP POP PUSH2 0x160 SWAP2 POP DUP2 DUP4 ADD MLOAD DUP9 DUP3 SUB DUP4 DUP11 ADD MSTORE PUSH2 0x1A8A DUP3 DUP3 PUSH2 0x18DD JUMP JUMPDEST SWAP9 POP POP POP SWAP5 DUP8 ADD SWAP5 POP POP SWAP1 DUP6 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x199F JUMP JUMPDEST POP SWAP3 SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x12 SWAP1 DUP3 ADD MSTORE PUSH32 0x4C454E4754485F36355F52455155495245440000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1A SWAP1 DUP3 ADD MSTORE PUSH32 0x494E56414C49445F415050524F56414C5F5349474E4154555245000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1A SWAP1 DUP3 ADD MSTORE PUSH32 0x46524F4D5F4C4553535F5448414E5F544F5F5245515549524544000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x544F5F4C4553535F5448414E5F4C454E4754485F524551554952454400000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x17 SWAP1 DUP3 ADD MSTORE PUSH32 0x494E56414C49445F465245455F4D454D4F52595F505452000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x10 SWAP1 DUP3 ADD MSTORE PUSH32 0x415050524F56414C5F4558504952454400000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x15 SWAP1 DUP3 ADD MSTORE PUSH32 0x5349474E41545552455F554E535550504F525445440000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xE SWAP1 DUP3 ADD MSTORE PUSH32 0x494E56414C49445F4F524947494E000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x21 SWAP1 DUP3 ADD MSTORE PUSH32 0x475245415445525F5448414E5F5A45524F5F4C454E4754485F52455155495245 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4400000000000000000000000000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x11 SWAP1 DUP3 ADD MSTORE PUSH32 0x5349474E41545552455F494C4C4547414C000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1E SWAP1 DUP3 ADD MSTORE PUSH32 0x4C454E4754485F475245415445525F5448414E5F305F52455155495245440000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x11 SWAP1 DUP3 ADD MSTORE PUSH32 0x5349474E41545552455F494E56414C4944000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x25 SWAP1 DUP3 ADD MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F345F4C454E4754485F524551 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x5549524544000000000000000000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x11 SWAP1 DUP3 ADD MSTORE PUSH32 0x4C454E4754485F305F5245515549524544000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP6 DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x1EB4 PUSH1 0x80 DUP4 ADD DUP6 PUSH2 0x18DD JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x60 DUP5 ADD MSTORE PUSH2 0x1EC6 DUP2 DUP6 PUSH2 0x18DD JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x1EF0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1F0F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1F30 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1F77 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1F5F JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x1F86 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x1FAE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG2 PUSH6 0x627A7A723058 KECCAK256 0xbc 0xdb 0x4a 0xab RETURNDATACOPY BYTE DIV 0xea 0x5c 0xd6 0xc1 CODESIZE SWAP2 GT AND 0xce 0xac EXTCODEHASH 0xac DUP9 0xde NOT SWAP6 0xc4 0xd3 CALLCODE 0x4f 0xdd EXTCODEHASH TIMESTAMP 0xf 0xb6 PUSH13 0x6578706572696D656E74616CF5 STOP CALLDATACOPY ", + "sourceMap": "838:227:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;838:227:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;988:3006:3;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;1646:352:11;;;;;;;;;:::i;:::-;;;;;;;;1996:268:9;;;;;;;;;:::i;1627:801:2:-;;;;;;;;;:::i;:::-;;1870:42:10;;;:::i;2108:917:1:-;;;;;;;;;:::i;3237:1762::-;;;;;;;;;:::i;:::-;;;;;;;;1701:45:10;;;:::i;988:3006:3:-;1097:21;1174:1;1155:9;:16;:20;1134:97;;;;;;;;;;;;;;;;;;;;;;1296:22;1327:23;:9;:21;:23::i;:::-;1321:30;;;-1:-1:-1;1449:29:3;1424:55;;1403:123;;;;;;;;;;;;;;1537:27;1581:16;1567:31;;;;;;;;;;1537:61;-1:-1:-1;1948:21:3;1931:13;:38;;;;;;;;;1927:1717;;;1985:27;;;;;;;;;;;1927:1717;2294:21;2277:13;:38;;;;;;;;;2273:1371;;;2356:16;;:21;2331:97;;;;;;;;;;;;;;2442:27;;;;;;;;;;;2273:1371;2542:20;2525:13;:37;;;;;;;;;2521:1123;;;2603:9;:16;2623:2;2603:22;2578:99;;;;;;;;;;;;;;2691:7;2707:9;2717:1;2707:12;;;;;;;;;;;;;;;;;;2701:19;;;-1:-1:-1;2734:9:3;2746:24;:9;2768:1;2746:24;:21;:24;:::i;:::-;2734:36;-1:-1:-1;2784:9:3;2796:25;:9;2818:2;2796:25;:21;:25;:::i;:::-;2784:37;;2851:102;2878:4;2900:1;2919;2938;2851:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;2851:102:3;;;;;;-1:-1:-1;2967:20:3;;-1:-1:-1;;;;;;2967:20:3;2521:1123;3064:21;3047:13;:38;;;;;;;;;3043:601;;;3126:9;:16;3146:2;3126:22;3101:99;;;;;;;;;;;;;;3214:7;3230:9;3240:1;3230:12;;;;;;;;;;;;;;;;;;3224:19;;;-1:-1:-1;3257:9:3;3269:24;:9;3291:1;3269:24;:21;:24;:::i;:::-;3257:36;-1:-1:-1;3307:9:3;3319:25;:9;3341:2;3319:25;:21;:25;:::i;:::-;3307:37;;3374:225;3505:4;3411:116;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;3411:116:3;;;3401:127;;;;;;3546:1;3565;3584;3374:225;;;;;;;;;;;;;;;;;;;3043:601;3956:31;;;;;;;;;;;988:3006;;;;;:::o;1646:352:11:-;1757:23;1898:61;1924:34;1946:11;1924:21;:34::i;:::-;1898:25;:61::i;1996:268:9:-;2114:20;2165:63;2194:33;2218:8;2194:23;:33::i;:::-;2165:28;:63::i;1627:801:2:-;2008:197;2053:11;2078:8;2100:20;2134:29;2177:18;2008:31;:197::i;:::-;2251:8;;2292:16;;2322:25;;;;2361:16;;;;;2251:170;;;;;:8;;;;;:27;;:170;;2292:16;;2322:25;;2391:20;;2251:170;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2251:170:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2251:170:2;;;;1627:801;;;;;:::o;1870:42:10:-;;;;:::o;2108:917:1:-;2511:30;2544:42;2569:11;:16;;;2544:24;:42::i;:::-;2657:13;;2511:75;;-1:-1:-1;2657:17:1;2653:366;;2758:250;2812:11;2841:6;2865:8;2891:20;2929:29;2976:18;2758:36;:250::i;:::-;2108:917;;;;;;:::o;3237:1762::-;3335:30;3381:15;3399:18;:4;3381:15;3399:18;:15;:18;:::i;:::-;3381:36;-1:-1:-1;3444:31:1;;;3456:19;3444:31;;:87;;-1:-1:-1;3491:40:1;;;3503:28;3491:40;3444:87;:142;;;-1:-1:-1;3547:39:1;;;3559:27;3547:39;3444:142;3427:1543;;;3647:27;;:::i;:::-;3720:11;;3706:26;;3720:4;;3717:1;;3706:26;:10;:26;:::i;:::-;3678:102;;;;;;;;;;;;;;3803:23;;;3824:1;3803:23;;;;;;;;;3646:134;;-1:-1:-1;3803:23:1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;3794:32;;3852:5;3840:6;3847:1;3840:9;;;;;;;;;;;;;:17;;;;3427:1543;;;;3891:38;;;3903:26;3891:38;;:101;;-1:-1:-1;3945:47:1;;;3957:35;3945:47;3891:101;:163;;;-1:-1:-1;4008:46:1;;;4020:34;4008:46;3891:163;:217;;;-1:-1:-1;4070:38:1;;;4082:26;4070:38;3891:217;:280;;;-1:-1:-1;4124:47:1;;;4136:35;4124:47;3891:280;:335;;;-1:-1:-1;4187:39:1;;;4199:27;4187:39;3891:335;:399;;;-1:-1:-1;4242:48:1;;;4254:36;4242:48;3891:399;3874:1096;;;4439:11;;4425:26;;4439:4;;4436:1;;4425:26;:10;:26;:::i;:::-;4397:104;;;;;;;;;;;;;;4386:115;;3874:1096;;;4522:33;;;4534:21;4522:33;4518:452;;;4616:31;;:::i;:::-;4649:32;;:::i;:::-;4727:11;;4713:26;;4727:4;;4724:1;;4713:26;:10;:26;:::i;:::-;4685:118;;;;;;;;;;;;;;4865:23;;;4886:1;4865:23;;;;;;;;;4615:188;;-1:-1:-1;4615:188:1;;-1:-1:-1;4865:23:1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;4856:32;;4914:9;4902:6;4909:1;4902:9;;;;;;;;;;;;;:21;;;;4949:10;4937:6;4944:1;4937:9;;;;;;;;;;;;;:22;;;;4518:452;;;-1:-1:-1;3237:1762:1;;;:::o;1701:45:10:-;;;;:::o;8315:448:21:-;8399:13;8460:1;8449;:8;:12;8428:92;;;;;;;;;;;;;;8568:1;8581;8570;:8;:12;8568:15;;;;;;;;;;;;8682:8;;8678:16;;8707:17;;;-1:-1:-1;8568:15:21;;;;;;;8315:448::o;13292:490::-;13413:14;13476:5;13484:2;13476:10;13464:1;:8;:22;;13443:107;;;;;;;;;;;;;;-1:-1:-1;13729:13:21;13631:2;13729:13;13723:20;;13292:490::o;2245:1415:11:-;2479:16;;;;;2520;;2570:25;;;;;2994:11;;2979:13;;;2969:37;;;;3074:9;;1028:66;3097:26;;3223:15;;;3216:29;;;;3368:42;3349:62;;;3332:15;;;3325:87;;;;2459:17;3450:15;;3443:33;3617:3;3599:22;;;2245:1415::o;3216:204:10:-;3318:14;3355:58;3373:27;;3402:10;3355:17;:58::i;2604:1658:9:-;2857:29;;;;;2915:17;;2968:24;;;;;2821:33;3042:38;;;;3589:27;;3558:29;;;3548:69;;;;3685:9;;1121:66;3708:26;;3802:15;;;3795:33;;;;3883:15;;;3876:40;3971:15;;;3964:49;4080:3;4068:16;;4061:55;4219:3;4201:22;;2604:1658;;;:::o;2765:210:10:-;2870:14;2907:61;2925:30;;2957:10;2907:17;:61::i;5691:2759:1:-;6162:9;:21;;;;6141:82;;;;;;;;;;;;;;6265:23;6291:31;6310:11;6291:18;:31::i;:::-;6425:16;;;6439:1;6425:16;;;;;;;;;6479:25;;6265:57;;-1:-1:-1;6425:16:1;6479:25;6514:1147;6539:16;6534:1;:21;6514:1147;;6615:44;6662:29;6692:1;6662:32;;;;;;;;;;;;;;6615:79;;6708:35;;:::i;:::-;6746:266;;;;;;;;6794:8;6746:266;;;;;;6837:15;6746:266;;;;6892:20;6746:266;;;;6961:36;6746:266;;;6708:304;;7200:15;7161:36;:54;7074:191;;;;;;;;;;;;;;7344:20;7367:36;7394:8;7367:26;:36::i;:::-;7344:59;;7417:29;7449:53;7466:12;7480:18;7499:1;7480:21;;;;;;;;;;;;;;7449:16;:53::i;:::-;7417:85;-1:-1:-1;7597:53:1;:23;7417:85;7597:53;:30;:53;:::i;:::-;7571:79;-1:-1:-1;;6557:3:1;;;;;-1:-1:-1;6514:1147:1;;-1:-1:-1;;6514:1147:1;;-1:-1:-1;7773:41:1;:23;7804:9;7773:41;:30;:41;:::i;:::-;7848:13;;7747:67;;-1:-1:-1;7825:20:1;7871:573;7896:12;7891:1;:17;7871:573;;8042:1;8007:37;;:6;8014:1;8007:9;;;;;;;;;;;;;;:23;;;:37;;;8003:84;;;8064:8;;8003:84;8178:23;8204:6;8211:1;8204:9;;;;;;;;;;;;;;:29;;;8178:55;;8247:20;8270:49;8303:15;8270:23;:32;;:49;;;;:::i;:::-;8247:72;;8358:15;8333:100;;;;;;;;;;;;;;7871:573;;;7910:3;;7871:573;;;;5691:2759;;;;;;;;;;:::o;15595:687:21:-;15715:13;15777:5;15785:1;15777:9;15765:1;:8;:21;;15744:105;;;;;;;;;;;;;;-1:-1:-1;16023:13:21;15926:2;16023:13;16017:20;16176:66;16164:79;;15595:687::o;6453:617::-;6587:19;6651:2;6643:4;:10;;6622:83;;;;;;;;;;;;;;6742:1;:8;6736:2;:14;;6715:89;;;;;;;;;;;;;;6905:4;6900:2;:9;6890:20;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;6890:20:21;87:34:-1;135:17;;-1:-1;6890:20:21;;6881:29;;6920:120;6941:23;:6;:21;:23::i;:::-;6999:4;6978:18;:1;:16;:18::i;:::-;:25;7017:6;:13;6920:7;:120::i;:::-;6453:617;;;;;:::o;3701:890:10:-;4130:2;4124:9;4162:66;4147:82;;4279:1;4267:14;;4260:40;;;;4397:2;4385:15;;4378:35;4549:2;4531:21;;;3701:890::o;1089:2102:20:-;1437:19;;1586:4;1580:11;1208:16;;1437:12;;1509:2;:23;;;1675:45;;;;;;1437:19;1503:30;2075:32;;;;2054:102;;;;;;;;;;;;;;2410:18;2397:10;:31;2393:273;;;2444:78;2461:10;2473:20;2495:26;2444:16;:78::i;:::-;2579:10;2563:26;;2630:12;2606:36;;2545:111;2734:1;2712:23;;;;2775:2;2745:32;;;;2831:26;2808:20;:49;2787:70;;2880:18;2867:31;;2990:18;2976:12;2969:40;3071:10;3065:4;3058:24;3140:15;3101:12;3135:1;3114:18;:22;3101:36;;;;;;;;:54;;;;:36;;;;;;;;;;;:54;-1:-1:-1;3172:12:20;;1089:2102;-1:-1:-1;;;;;;1089:2102:20:o;3430:1034::-;3542:12;3685:2;3670:12;3664:19;3660:28;3798:2;3784:12;3780:21;3910:12;3890:18;3886:37;3984:18;3976:26;;3971:453;4010:16;4007:1;4004:23;3971:453;;;4129:1;4123:8;4225:12;4217:6;4214:24;4211:2;;;4315:1;4304:12;;4376:16;4371:21;;4211:2;;4041;4038:1;4034:10;4029:15;;3971:453;;;-1:-1:-1;;;3430:1034:20;;;;:::o;1341:228:21:-;1520:2;1509:14;;1341:228::o;1808:4337::-;1958:2;1949:6;:11;1945:4194;;;2247:1;2237:6;2233:2;2229:15;2224:3;2220:25;2216:33;2298:4;2294:9;2285:6;2279:13;2275:29;2347:4;2340;2334:11;2330:22;2388:1;2385;2382:8;2376:4;2369:22;;;;2186:219;;;2509:4;2499:6;:14;2495:59;;;2533:7;;2495:59;3243:4;3234:6;:13;3230:2899;;;3569:2;3561:6;3557:15;3547:25;;3617:6;3609;3605:19;3667:6;3661:4;3657:17;3974:4;3968:11;4242:198;4260:4;4252:6;4249:16;4242:198;;;4308:13;;4295:27;;4369:2;4405:13;;;;4357:15;;;;4242:198;;;4529:18;;-1:-1:-1;3276:1289:21;;;4810:2;4802:6;4798:15;4788:25;;4858:6;4850;4846:19;4908:6;4902:4;4898:17;5218:6;5212:13;5797:191;5814:4;5808;5804:15;5797:191;;;5862:11;;5849:25;;5907:13;;;;;5953;;;;5797:191;;;6078:19;;-1:-1:-1;;4612:1503:21;1808:4337;;;:::o;838:227:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;142:134:-1:-;220:13;;238:33;220:13;238:33;;299:693;;421:3;414:4;406:6;402:17;398:27;388:2;;-1:-1;;429:12;388:2;476:6;463:20;498:85;513:69;575:6;513:69;;;498:85;;;611:21;;;489:94;-1:-1;655:4;668:14;;;;643:17;;763:1;748:238;773:6;770:1;767:13;748:238;;;880:42;918:3;655:4;856:3;843:17;647:6;831:30;;880:42;;;868:55;;655:4;937:14;;;;965;;;;;795:1;788:9;748:238;;;752:14;;;;381:611;;;;;2646:432;;2743:3;2736:4;2728:6;2724:17;2720:27;2710:2;;-1:-1;;2751:12;2710:2;2798:6;2785:20;2820:60;2835:44;2872:6;2835:44;;2820:60;2811:69;;2900:6;2893:5;2886:21;3004:3;2936:4;2995:6;2928;2986:16;;2983:25;2980:2;;;3021:1;;3011:12;2980:2;37105:6;2936:4;2928:6;2924:17;2936:4;2962:5;2958:16;37082:30;37161:1;37143:16;;;2936:4;37143:16;37136:27;2962:5;2703:375;-1:-1;;2703:375;3087:434;;3195:3;3188:4;3180:6;3176:17;3172:27;3162:2;;-1:-1;;3203:12;3162:2;3243:6;3237:13;3265:60;3280:44;3317:6;3280:44;;3265:60;3256:69;;3345:6;3338:5;3331:21;3449:3;3381:4;3440:6;3373;3431:16;;3428:25;3425:2;;;3466:1;;3456:12;3425:2;3476:39;3508:6;3381:4;3407:5;3403:16;3381:4;3373:6;3369:17;3476:39;;;;3155:366;;;;;4981:2334;;5100:5;;5088:9;5083:3;5079:19;5075:31;5072:2;;;-1:-1;;5109:12;5072:2;5137:21;5152:5;5137:21;;;5128:30;;;5247:60;5303:3;5279:22;5247:60;;;5230:15;5223:85;5410:60;5466:3;5377:2;5446:9;5442:22;5410:60;;;5377:2;5396:5;5392:16;5385:86;5580:60;5636:3;5547:2;5616:9;5612:22;5580:60;;;5547:2;5566:5;5562:16;5555:86;5744:60;5800:3;5711:2;5780:9;5776:22;5744:60;;;5711:2;5730:5;5726:16;5719:86;5878:3;5948:9;5944:22;8315:13;5878:3;5898:5;5894:16;5887:86;6046:3;6116:9;6112:22;8315:13;6046:3;6066:5;6062:16;6055:86;6206:3;6276:9;6272:22;8315:13;6206:3;6226:5;6222:16;6215:86;6366:3;6436:9;6432:22;8315:13;6366:3;6386:5;6382:16;6375:86;6539:3;6621:6;6610:9;6606:22;8315:13;6566:5;6559;6555:17;6548:87;;6696:3;6778:6;6767:9;6763:22;8315:13;6723:5;6716;6712:17;6705:87;;6884:3;;6873:9;6869:19;6863:26;6909:18;;6901:6;6898:30;6895:2;;;5216:1;;6931:12;6895:2;6977:65;7038:3;7029:6;7018:9;7014:22;6977:65;;;6969:5;6962;6958:17;6951:92;7135:3;;;;7124:9;7120:19;7114:26;7100:40;;7160:18;7152:6;7149:30;7146:2;;;5216:1;;7182:12;7146:2;;7228:65;7289:3;7280:6;7269:9;7265:22;7228:65;;;7220:5;7213;7209:17;7202:92;;;5066:2249;;;;;7374:719;;7497:4;7485:9;7480:3;7476:19;7472:30;7469:2;;;-1:-1;;7505:12;7469:2;7533:20;7497:4;7533:20;;;7524:29;;8180:6;8167:20;7617:15;7610:74;7754:2;7812:9;7808:22;72:20;97:33;124:5;97:33;;;7754:2;7769:16;;7762:75;7926:2;7911:18;;7898:32;7950:18;7939:30;;7936:2;;;7603:1;;7972:12;7936:2;8017:54;8067:3;8058:6;8047:9;8043:22;8017:54;;;7926:2;8003:5;7999:16;7992:80;;7463:630;;;;;8378:422;;8533:2;;8521:9;8512:7;8508:23;8504:32;8501:2;;;8549:1;8546;8539:12;8501:2;8590:17;8584:24;8628:18;8620:6;8617:30;8614:2;;;8660:1;8657;8650:12;8614:2;8767:6;8756:9;8752:22;1175:3;1168:4;1160:6;1156:17;1152:27;1142:2;;1193:1;1190;1183:12;1142:2;1223:6;1217:13;1203:27;;1245:95;1260:79;1332:6;1260:79;;1245:95;1368:21;;;1425:14;;;;1400:17;;;1511:10;1505:256;1530:6;1527:1;1524:13;1505:256;;;1630:67;1693:3;1412:4;1606:3;1600:10;1404:6;1588:23;;1630:67;;;1618:80;;1712:14;;;;1740;;;;1552:1;1545:9;1505:256;;;-1:-1;8670:114;;8495:305;-1:-1;;;;;;;;8495:305;8807:470;;;8937:2;8925:9;8916:7;8912:23;8908:32;8905:2;;;-1:-1;;8943:12;8905:2;2588:6;2575:20;8995:63;;9123:2;9112:9;9108:18;9095:32;9147:18;9139:6;9136:30;9133:2;;;-1:-1;;9169:12;9133:2;9199:62;9253:7;9244:6;9233:9;9229:22;9199:62;;;9189:72;;;8899:378;;;;;;9284:345;;9397:2;9385:9;9376:7;9372:23;9368:32;9365:2;;;-1:-1;;9403:12;9365:2;9461:17;9448:31;9499:18;9491:6;9488:30;9485:2;;;-1:-1;;9521:12;9485:2;9551:62;9605:7;9596:6;9585:9;9581:22;9551:62;;;9541:72;9359:270;-1:-1;;;;9359:270;9636:399;;9776:2;9764:9;9755:7;9751:23;9747:32;9744:2;;;9792:1;9789;9782:12;9744:2;9840:17;9827:31;9878:18;;9870:6;9867:30;9864:2;;;9910:1;9907;9900:12;9864:2;10002:6;9991:9;9987:22;4159:4;4147:9;4142:3;4138:19;4134:30;4131:2;;;4177:1;4174;4167:12;4131:2;4195:20;4159:4;4195:20;;;4186:29;;85:6;72:20;97:33;124:5;97:33;;;4276:74;;9776:2;4476:22;;;2575:20;4437:16;;;4430:75;4610:2;4595:18;;4582:32;4623:30;;;4620:2;;;4666:1;4663;4656:12;4620:2;4701:54;4751:3;4742:6;4731:9;4727:22;4701:54;;;4610:2;4683:16;;4676:80;-1:-1;4842:2;4896:22;;;8167:20;4857:16;;;4850:75;-1:-1;4687:5;9738:297;-1:-1;;;9738:297;10042:380;;10176:2;10164:9;10155:7;10151:23;10147:32;10144:2;;;-1:-1;;10182:12;10144:2;10233:17;10227:24;10271:18;10263:6;10260:30;10257:2;;;-1:-1;;10293:12;10257:2;10323:83;10398:7;10389:6;10378:9;10374:22;10323:83;;10429:633;;;10599:2;10587:9;10578:7;10574:23;10570:32;10567:2;;;-1:-1;;10605:12;10567:2;10656:17;10650:24;10694:18;;10686:6;10683:30;10680:2;;;-1:-1;;10716:12;10680:2;10746:83;10821:7;10812:6;10801:9;10797:22;10746:83;;;10736:93;;10887:2;10876:9;10872:18;10866:25;10852:39;;10911:18;10903:6;10900:30;10897:2;;;-1:-1;;10933:12;10897:2;;10963:83;11038:7;11029:6;11018:9;11014:22;10963:83;;11069:395;;11207:2;11195:9;11186:7;11182:23;11178:32;11175:2;;;-1:-1;;11213:12;11175:2;11271:17;11258:31;11309:18;11301:6;11298:30;11295:2;;;-1:-1;;11331:12;11295:2;11361:87;11440:7;11431:6;11420:9;11416:22;11361:87;;11471:1283;;;;;;11741:3;11729:9;11720:7;11716:23;11712:33;11709:2;;;11758:1;11755;11748:12;11709:2;11806:17;11793:31;11844:18;;11836:6;11833:30;11830:2;;;11876:1;11873;11866:12;11830:2;11896:87;11975:7;11966:6;11955:9;11951:22;11896:87;;;11886:97;;12020:2;;;;12063:9;12059:22;72:20;97:33;124:5;97:33;;;12028:63;-1:-1;12156:2;12141:18;;12128:32;12169:30;;;12166:2;;;12212:1;12209;12202:12;12166:2;12232:62;12286:7;12277:6;12266:9;12262:22;12232:62;;;12222:72;;;12359:2;12348:9;12344:18;12331:32;12383:18;12375:6;12372:30;12369:2;;;12415:1;12412;12405:12;12369:2;12496:6;12485:9;12481:22;1910:3;1903:4;1895:6;1891:17;1887:27;1877:2;;1928:1;1925;1918:12;1877:2;1965:6;1952:20;1938:34;;1987:80;2002:64;2059:6;2002:64;;1987:80;2095:21;;;2152:14;;;;2127:17;;;2241;;;2232:27;;;;2229:36;-1:-1;2226:2;;;2278:1;2275;2268:12;2226:2;2294:10;;;2288:206;2313:6;2310:1;2307:13;2288:206;;;8167:20;;2381:50;;2335:1;2328:9;;;;;2445:14;;;;2473;;2288:206;;;-1:-1;12425:88;-1:-1;;;;12578:3;12563:19;;12550:33;;-1:-1;12592:30;;;12589:2;;;12635:1;12632;12625:12;12589:2;;12655:83;12730:7;12721:6;12710:9;12706:22;12655:83;;;12645:93;;;11703:1051;;;;;;;;;13003:103;36801:42;36790:54;13064:37;;13058:48;14579:343;;14721:5;35317:12;35837:6;35832:3;35825:19;14814:52;14859:6;35874:4;35869:3;35865:14;35874:4;14840:5;14836:16;14814:52;;;37623:2;37603:14;37619:7;37599:28;14878:39;;;;35874:4;14878:39;;14669:253;-1:-1;;14669:253;24577:511;16636:66;16616:87;;16600:2;16722:12;;14371:37;;;;25051:12;;;24785:303;25095:213;36801:42;36790:54;;;;13064:37;;25213:2;25198:18;;25184:124;25315:437;;25521:2;;25510:9;25506:18;25561:20;25542:17;25535:47;25596:146;13542:5;35317:12;35837:6;35832:3;35825:19;35865:14;25510:9;35865:14;13554:112;;35865:14;13731:4;13723:6;13719:17;25510:9;13710:27;;13698:39;;35185:4;13827:5;35173:17;-1:-1;13866:387;13891:6;13888:1;13885:13;13866:387;;;13943:20;25510:9;13947:4;13943:20;;13938:3;13931:33;13998:6;13992:13;22086:5;22189:62;22237:13;22167:15;22161:22;22189:62;;;22338:4;22331:5;22327:16;22321:23;22350:63;22407:4;22402:3;22398:14;22384:12;22350:63;;;;35865:14;22500:5;22496:16;22490:23;22519:63;35865:14;22571:3;22567:14;22553:12;22519:63;;;;22670:4;22663:5;22659:16;22653:23;22682:63;22670:4;22734:3;22730:14;22716:12;22682:63;;;;22836:4;22829:5;22825:16;22819:23;22836:4;22900:3;22896:14;14371:37;23002:4;22995:5;22991:16;22985:23;23002:4;23066:3;23062:14;14371:37;23160:4;23153:5;23149:16;23143:23;23160:4;23224:3;23220:14;14371:37;23318:4;23311:5;23307:16;23301:23;23318:4;23382:3;23378:14;14371:37;23489:5;;23482;23478:17;23472:24;23559:5;23554:3;23550:15;14371:37;;23645:5;;23638;23634:17;23628:24;23715:5;23710:3;23706:15;14371:37;;23811:5;;23804;23800:17;23794:24;23855:14;23847:5;23842:3;23838:15;23831:39;23885:67;22086:5;22081:3;22077:15;23933:12;23885:67;;;23877:75;;;24047:5;;;;24040;24036:17;24030:24;24101:3;24095:4;24091:14;24083:5;24078:3;24074:15;24067:39;24121:67;24183:4;24169:12;24121:67;;;14012:110;-1:-1;;;14232:14;;;;-1:-1;;35173:17;;;;13913:1;13906:9;13866:387;;;-1:-1;25588:154;;25492:260;-1:-1;;;;;;;25492:260;25759:213;14371:37;;;25877:2;25862:18;;25848:124;25979:539;14371:37;;;37006:4;36995:16;;;;26338:2;26323:18;;24530:35;26421:2;26406:18;;14371:37;26504:2;26489:18;;14371:37;26177:3;26162:19;;26148:370;26525:407;26716:2;26730:47;;;15818:2;26701:18;;;35825:19;15854:66;35865:14;;;15834:87;15940:12;;;26687:245;26939:407;27130:2;27144:47;;;16191:2;27115:18;;;35825:19;16227:66;35865:14;;;16207:87;16313:12;;;27101:245;27353:407;27544:2;27558:47;;;16973:2;27529:18;;;35825:19;17009:66;35865:14;;;16989:87;17095:12;;;27515:245;27767:407;27958:2;27972:47;;;17346:2;27943:18;;;35825:19;17382:66;35865:14;;;17362:87;17468:12;;;27929:245;28181:407;28372:2;28386:47;;;17719:2;28357:18;;;35825:19;17755:66;35865:14;;;17735:87;17841:12;;;28343:245;28595:407;28786:2;28800:47;;;18092:2;28771:18;;;35825:19;18128:66;35865:14;;;18108:87;18214:12;;;28757:245;29009:407;29200:2;29214:47;;;18465:2;29185:18;;;35825:19;18501:66;35865:14;;;18481:87;18602:66;18588:12;;;18581:88;18688:12;;;29171:245;29423:407;29614:2;29628:47;;;18939:2;29599:18;;;35825:19;18975:66;35865:14;;;18955:87;19061:12;;;29585:245;29837:407;30028:2;30042:47;;;19312:2;30013:18;;;35825:19;19348:66;35865:14;;;19328:87;19434:12;;;29999:245;30251:407;30442:2;30456:47;;;19685:2;30427:18;;;35825:19;19721:66;35865:14;;;19701:87;19822:66;19808:12;;;19801:88;19908:12;;;30413:245;30665:407;30856:2;30870:47;;;20159:2;30841:18;;;35825:19;20195:66;35865:14;;;20175:87;20281:12;;;30827:245;31079:407;31270:2;31284:47;;;20532:2;31255:18;;;35825:19;20568:66;35865:14;;;20548:87;20654:12;;;31241:245;31493:407;31684:2;31698:47;;;20905:2;31669:18;;;35825:19;20941:66;35865:14;;;20921:87;21027:12;;;31655:245;31907:407;32098:2;32112:47;;;21278:2;32083:18;;;35825:19;21314:66;35865:14;;;21294:87;21415:66;21401:12;;;21394:88;21501:12;;;32069:245;32321:407;32512:2;32526:47;;;21752:2;32497:18;;;35825:19;21788:66;35865:14;;;21768:87;21874:12;;;32483:245;32735:707;;14401:5;14378:3;14371:37;36801:42;13094:5;36790:54;33134:2;33123:9;33119:18;13064:37;32969:3;33171:2;33160:9;33156:18;33149:48;33211:72;32969:3;32958:9;32954:19;33269:6;33211:72;;;33331:9;33325:4;33321:20;33316:2;33305:9;33301:18;33294:48;33356:76;33427:4;33418:6;33356:76;;;33348:84;32940:502;-1:-1;;;;;;;32940:502;33449:256;33511:2;33505:9;33537:17;;;33612:18;33597:34;;33633:22;;;33594:62;33591:2;;;33669:1;;33659:12;33591:2;33511;33678:22;33489:216;;-1:-1;33489:216;33712:263;;33876:18;33868:6;33865:30;33862:2;;;-1:-1;;33898:12;33862:2;-1:-1;33937:4;33925:17;;;33955:15;;33799:176;34527:254;;34666:18;34658:6;34655:30;34652:2;;;-1:-1;;34688:12;34652:2;-1:-1;34742:4;34719:17;34738:9;34715:33;34771:4;34761:15;;34589:192;37178:268;37243:1;37250:101;37264:6;37261:1;37258:13;37250:101;;;37331:11;;;37325:18;37312:11;;;37305:39;37286:2;37279:10;37250:101;;;37366:6;37363:1;37360:13;37357:2;;;37243:1;37422:6;37417:3;37413:16;37406:27;37357:2;;37227:219;;;;37640:117;36801:42;37727:5;36790:54;37702:5;37699:35;37689:2;;37748:1;;37738:12;37689:2;37683:74;" } } }, + "sourceTreeHashHex": "0xcd3a1dbf858b46a5820dab320baad978613f07ec73d35b6cbbde13c2937bbc04", "networks": {} } diff --git a/packages/contract-wrappers/CHANGELOG.json b/packages/contract-wrappers/CHANGELOG.json index d50ece68f3..a7f4195cd9 100644 --- a/packages/contract-wrappers/CHANGELOG.json +++ b/packages/contract-wrappers/CHANGELOG.json @@ -1,4 +1,13 @@ [ + { + "version": "9.1.0", + "changes": [ + { + "note": "Added CoordinatorWrapper to support orders with the Coordinator extension contract", + "pr": 1792 + } + ] + }, { "version": "9.0.0", "changes": [ diff --git a/packages/contract-wrappers/package.json b/packages/contract-wrappers/package.json index 83f0869e48..7b30781da7 100644 --- a/packages/contract-wrappers/package.json +++ b/packages/contract-wrappers/package.json @@ -39,6 +39,7 @@ }, "devDependencies": { "@0x/contracts-test-utils": "^3.1.2", + "@0x/coordinator-server": "0.1.1", "@0x/dev-utils": "^2.2.1", "@0x/fill-scenarios": "^3.0.5", "@0x/migrations": "^4.1.1", @@ -46,6 +47,7 @@ "@0x/tslint-config": "^3.0.1", "@types/lodash": "4.14.104", "@types/mocha": "^2.2.42", + "@types/nock": "^10.0.1", "@types/node": "*", "@types/sinon": "^2.2.2", "@types/uuid": "^3.4.3", @@ -56,6 +58,7 @@ "dirty-chai": "^2.0.1", "make-promises-safe": "^1.1.0", "mocha": "^4.1.0", + "nock": "^10.0.6", "npm-run-all": "^4.1.2", "nyc": "^11.0.1", "opn-cli": "^3.1.0", @@ -83,6 +86,7 @@ "ethereumjs-blockstream": "6.0.0", "ethereumjs-util": "^5.1.1", "ethers": "~4.0.4", + "http-status-codes": "^1.3.2", "js-sha3": "^0.7.0", "lodash": "^4.17.11", "uuid": "^3.3.2" diff --git a/packages/contract-wrappers/src/contract_wrappers.ts b/packages/contract-wrappers/src/contract_wrappers.ts index c8731551be..370a191d43 100644 --- a/packages/contract-wrappers/src/contract_wrappers.ts +++ b/packages/contract-wrappers/src/contract_wrappers.ts @@ -1,4 +1,5 @@ import { + Coordinator, DutchAuction, ERC20Proxy, ERC20Token, @@ -14,6 +15,7 @@ import { Web3Wrapper } from '@0x/web3-wrapper'; import { SupportedProvider } from 'ethereum-types'; import * as _ from 'lodash'; +import { CoordinatorWrapper } from './contract_wrappers/coordinator_wrapper'; import { DutchAuctionWrapper } from './contract_wrappers/dutch_auction_wrapper'; import { ERC20ProxyWrapper } from './contract_wrappers/erc20_proxy_wrapper'; import { ERC20TokenWrapper } from './contract_wrappers/erc20_token_wrapper'; @@ -73,6 +75,11 @@ export class ContractWrappers { */ public dutchAuction: DutchAuctionWrapper; + /** + * An instance of the CoordinatorWrapper class containing methods for interacting with the Coordinator extension contract. + */ + public coordinator: CoordinatorWrapper; + private readonly _web3Wrapper: Web3Wrapper; /** * Instantiates a new ContractWrappers instance. @@ -88,6 +95,7 @@ export class ContractWrappers { }; this._web3Wrapper = new Web3Wrapper(supportedProvider, txDefaults); const artifactsArray = [ + Coordinator, DutchAuction, ERC20Proxy, ERC20Token, @@ -155,6 +163,13 @@ export class ContractWrappers { config.networkId, contractAddresses.dutchAuction, ); + this.coordinator = new CoordinatorWrapper( + this._web3Wrapper, + config.networkId, + contractAddresses.coordinator, + contractAddresses.exchange, + contractAddresses.coordinatorRegistry, + ); } /** * Unsubscribes from all subscriptions for all contracts. diff --git a/packages/contract-wrappers/src/contract_wrappers/coordinator_wrapper.ts b/packages/contract-wrappers/src/contract_wrappers/coordinator_wrapper.ts new file mode 100644 index 0000000000..44b88a99e1 --- /dev/null +++ b/packages/contract-wrappers/src/contract_wrappers/coordinator_wrapper.ts @@ -0,0 +1,856 @@ +import { CoordinatorContract, CoordinatorRegistryContract, ExchangeContract } from '@0x/abi-gen-wrappers'; +import { getContractAddressesForNetworkOrThrow } from '@0x/contract-addresses'; +import { Coordinator, CoordinatorRegistry, Exchange } from '@0x/contract-artifacts'; +import { schemas } from '@0x/json-schemas'; +import { generatePseudoRandomSalt, signatureUtils } from '@0x/order-utils'; +import { Order, SignedOrder, SignedZeroExTransaction, ZeroExTransaction } from '@0x/types'; +import { BigNumber, fetchAsync } from '@0x/utils'; +import { Web3Wrapper } from '@0x/web3-wrapper'; +import { ContractAbi } from 'ethereum-types'; +import * as HttpStatus from 'http-status-codes'; +import { flatten } from 'lodash'; + +import { orderTxOptsSchema } from '../schemas/order_tx_opts_schema'; +import { txOptsSchema } from '../schemas/tx_opts_schema'; +import { CoordinatorTransaction, OrderTransactionOpts } from '../types'; +import { assert } from '../utils/assert'; +import { + CoordinatorServerApprovalRawResponse, + CoordinatorServerApprovalResponse, + CoordinatorServerCancellationResponse, + CoordinatorServerError, + CoordinatorServerErrorMsg, + CoordinatorServerResponse, +} from '../utils/coordinator_server_types'; +import { decorators } from '../utils/decorators'; +import { TransactionEncoder } from '../utils/transaction_encoder'; + +import { ContractWrapper } from './contract_wrapper'; +/** + * This class includes all the functionality related to filling or cancelling orders through + * the 0x V2 Coordinator extension contract. + */ +export class CoordinatorWrapper extends ContractWrapper { + public abi: ContractAbi = Coordinator.compilerOutput.abi; + public networkId: number; + public address: string; + public exchangeAddress: string; + public registryAddress: string; + private readonly _contractInstance: CoordinatorContract; + private readonly _registryInstance: CoordinatorRegistryContract; + private readonly _exchangeInstance: ExchangeContract; + private readonly _transactionEncoder: TransactionEncoder; + private readonly _feeRecipientToEndpoint: { [feeRecipient: string]: string } = {}; + + /** + * Instantiate CoordinatorWrapper + * @param web3Wrapper Web3Wrapper instance to use. + * @param networkId Desired networkId. + * @param address The address of the Coordinator contract. If undefined, will + * default to the known address corresponding to the networkId. + * @param exchangeAddress The address of the Exchange contract. If undefined, will + * default to the known address corresponding to the networkId. + * @param registryAddress The address of the CoordinatorRegistry contract. If undefined, will + * default to the known address corresponding to the networkId. + */ + constructor( + web3Wrapper: Web3Wrapper, + networkId: number, + address?: string, + exchangeAddress?: string, + registryAddress?: string, + ) { + super(web3Wrapper, networkId); + this.networkId = networkId; + + const contractAddresses = getContractAddressesForNetworkOrThrow(networkId); + this.address = address === undefined ? contractAddresses.coordinator : address; + this.exchangeAddress = exchangeAddress === undefined ? contractAddresses.coordinator : exchangeAddress; + this.registryAddress = registryAddress === undefined ? contractAddresses.coordinatorRegistry : registryAddress; + + this._contractInstance = new CoordinatorContract( + this.abi, + this.address, + this._web3Wrapper.getProvider(), + this._web3Wrapper.getContractDefaults(), + ); + this._registryInstance = new CoordinatorRegistryContract( + CoordinatorRegistry.compilerOutput.abi, + this.registryAddress, + this._web3Wrapper.getProvider(), + this._web3Wrapper.getContractDefaults(), + ); + this._exchangeInstance = new ExchangeContract( + Exchange.compilerOutput.abi, + this.exchangeAddress, + this._web3Wrapper.getProvider(), + this._web3Wrapper.getContractDefaults(), + ); + + this._transactionEncoder = new TransactionEncoder(this._exchangeInstance); + } + + /** + * Fills a signed order with an amount denominated in baseUnits of the taker asset. Under-the-hood, this + * method uses the `feeRecipientAddress` of the order to look up the coordinator server endpoint registered in the + * coordinator registry contract. It requests a signature from that coordinator server before + * submitting the order and signature as a 0x transaction to the coordinator extension contract. The coordinator extension + * contract validates signatures and then fills the order via the Exchange contract. + * @param signedOrder An object that conforms to the SignedOrder interface. + * @param takerAssetFillAmount The amount of the order (in taker asset baseUnits) that you wish to fill. + * @param takerAddress The user Ethereum address who would like to fill this order. Must be available via the supplied + * Provider provided at instantiation. + * @param orderTransactionOpts Optional arguments this method accepts. + * @return Transaction hash. + */ + @decorators.asyncZeroExErrorHandler + public async fillOrderAsync( + signedOrder: SignedOrder, + takerAssetFillAmount: BigNumber, + takerAddress: string, + orderTransactionOpts: OrderTransactionOpts = { shouldValidate: true }, + ): Promise { + assert.doesConformToSchema('signedOrder', signedOrder, schemas.signedOrderSchema); + assert.isValidBaseUnitAmount('takerAssetFillAmount', takerAssetFillAmount); + assert.isETHAddressHex('takerAddress', takerAddress); + assert.doesConformToSchema('orderTransactionOpts', orderTransactionOpts, orderTxOptsSchema, [txOptsSchema]); + await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper); + + const data = this._transactionEncoder.fillOrderTx(signedOrder, takerAssetFillAmount); + const txHash = await this._handleFillsAsync(data, takerAddress, [signedOrder], orderTransactionOpts); + return txHash; + } + + /** + * No-throw version of fillOrderAsync. This version will not throw if the fill fails. This allows the caller to save gas at the expense of not knowing the reason the fill failed. + * @param signedOrder An object that conforms to the SignedOrder interface. + * @param takerAssetFillAmount The amount of the order (in taker asset baseUnits) that you wish to fill. + * @param takerAddress The user Ethereum address who would like to fill this order. + * Must be available via the supplied Provider provided at instantiation. + * @param orderTransactionOpts Optional arguments this method accepts. + * @return Transaction hash. + */ + @decorators.asyncZeroExErrorHandler + public async fillOrderNoThrowAsync( + signedOrder: SignedOrder, + takerAssetFillAmount: BigNumber, + takerAddress: string, + orderTransactionOpts: OrderTransactionOpts = { shouldValidate: true }, + ): Promise { + assert.doesConformToSchema('signedOrder', signedOrder, schemas.signedOrderSchema); + assert.isValidBaseUnitAmount('takerAssetFillAmount', takerAssetFillAmount); + assert.isETHAddressHex('takerAddress', takerAddress); + assert.doesConformToSchema('orderTransactionOpts', orderTransactionOpts, orderTxOptsSchema, [txOptsSchema]); + await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper); + + const data = this._transactionEncoder.fillOrderNoThrowTx(signedOrder, takerAssetFillAmount); + const txHash = await this._handleFillsAsync(data, takerAddress, [signedOrder], orderTransactionOpts); + return txHash; + } + + /** + * Attempts to fill a specific amount of an order. If the entire amount specified cannot be filled, + * the fill order is abandoned. + * @param signedOrder An object that conforms to the SignedOrder interface. + * @param takerAssetFillAmount The amount of the order (in taker asset baseUnits) that you wish to fill. + * @param takerAddress The user Ethereum address who would like to fill this order. Must be available via the supplied + * Provider provided at instantiation. + * @param orderTransactionOpts Optional arguments this method accepts. + * @return Transaction hash. + */ + @decorators.asyncZeroExErrorHandler + public async fillOrKillOrderAsync( + signedOrder: SignedOrder, + takerAssetFillAmount: BigNumber, + takerAddress: string, + orderTransactionOpts: OrderTransactionOpts = { shouldValidate: true }, + ): Promise { + assert.doesConformToSchema('signedOrder', signedOrder, schemas.signedOrderSchema); + assert.isValidBaseUnitAmount('takerAssetFillAmount', takerAssetFillAmount); + assert.isETHAddressHex('takerAddress', takerAddress); + assert.doesConformToSchema('orderTransactionOpts', orderTransactionOpts, orderTxOptsSchema, [txOptsSchema]); + await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper); + + const data = this._transactionEncoder.fillOrKillOrderTx(signedOrder, takerAssetFillAmount); + const txHash = await this._handleFillsAsync(data, takerAddress, [signedOrder], orderTransactionOpts); + return txHash; + } + + /** + * Batch version of fillOrderAsync. Executes multiple fills atomically in a single transaction. + * Under-the-hood, this method uses the `feeRecipientAddress`s of the orders to looks up the coordinator server endpoints + * registered in the coordinator registry contract. It requests a signature from each coordinator server before + * submitting the orders and signatures as a 0x transaction to the coordinator extension contract, which validates the + * signatures and then fills the order through the Exchange contract. + * If any `feeRecipientAddress` in the batch is not registered to a coordinator server, the whole batch fails. + * @param signedOrders An array of signed orders to fill. + * @param takerAssetFillAmounts The amounts of the orders (in taker asset baseUnits) that you wish to fill. + * @param takerAddress The user Ethereum address who would like to fill these orders. Must be available via the supplied + * Provider provided at instantiation. + * @param orderTransactionOpts Optional arguments this method accepts. + * @return Transaction hash. + */ + @decorators.asyncZeroExErrorHandler + public async batchFillOrdersAsync( + signedOrders: SignedOrder[], + takerAssetFillAmounts: BigNumber[], + takerAddress: string, + orderTransactionOpts: OrderTransactionOpts = { shouldValidate: true }, + ): Promise { + assert.doesConformToSchema('signedOrders', signedOrders, schemas.signedOrdersSchema); + for (const takerAssetFillAmount of takerAssetFillAmounts) { + assert.isBigNumber('takerAssetFillAmount', takerAssetFillAmount); + } + assert.isETHAddressHex('takerAddress', takerAddress); + assert.doesConformToSchema('orderTransactionOpts', orderTransactionOpts, orderTxOptsSchema, [txOptsSchema]); + await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper); + + const data = this._transactionEncoder.batchFillOrdersTx(signedOrders, takerAssetFillAmounts); + const txHash = await this._handleFillsAsync(data, takerAddress, signedOrders, orderTransactionOpts); + return txHash; + } + + /** + * No throw version of batchFillOrdersAsync + * @param signedOrders An array of signed orders to fill. + * @param takerAssetFillAmounts The amounts of the orders (in taker asset baseUnits) that you wish to fill. + * @param takerAddress The user Ethereum address who would like to fill these orders. Must be available via the supplied + * Provider provided at instantiation. + * @param orderTransactionOpts Optional arguments this method accepts. + * @return Transaction hash. + */ + @decorators.asyncZeroExErrorHandler + public async batchFillOrdersNoThrowAsync( + signedOrders: SignedOrder[], + takerAssetFillAmounts: BigNumber[], + takerAddress: string, + orderTransactionOpts: OrderTransactionOpts = { shouldValidate: true }, + ): Promise { + assert.doesConformToSchema('signedOrders', signedOrders, schemas.signedOrdersSchema); + for (const takerAssetFillAmount of takerAssetFillAmounts) { + assert.isBigNumber('takerAssetFillAmount', takerAssetFillAmount); + } + assert.isETHAddressHex('takerAddress', takerAddress); + assert.doesConformToSchema('orderTransactionOpts', orderTransactionOpts, orderTxOptsSchema, [txOptsSchema]); + await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper); + + const data = this._transactionEncoder.batchFillOrdersNoThrowTx(signedOrders, takerAssetFillAmounts); + const txHash = await this._handleFillsAsync(data, takerAddress, signedOrders, orderTransactionOpts); + return txHash; + } + + /** + * Batch version of fillOrKillOrderAsync. Executes multiple fills atomically in a single transaction. + * @param signedOrders An array of signed orders to fill. + * @param takerAssetFillAmounts The amounts of the orders (in taker asset baseUnits) that you wish to fill. + * @param takerAddress The user Ethereum address who would like to fill these orders. Must be available via the supplied + * Provider provided at instantiation. + * @param orderTransactionOpts Optional arguments this method accepts. + * @return Transaction hash. + */ + @decorators.asyncZeroExErrorHandler + public async batchFillOrKillOrdersAsync( + signedOrders: SignedOrder[], + takerAssetFillAmounts: BigNumber[], + takerAddress: string, + orderTransactionOpts: OrderTransactionOpts = { shouldValidate: true }, + ): Promise { + assert.doesConformToSchema('signedOrders', signedOrders, schemas.signedOrdersSchema); + for (const takerAssetFillAmount of takerAssetFillAmounts) { + assert.isBigNumber('takerAssetFillAmount', takerAssetFillAmount); + } + assert.isETHAddressHex('takerAddress', takerAddress); + assert.doesConformToSchema('orderTransactionOpts', orderTransactionOpts, orderTxOptsSchema, [txOptsSchema]); + await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper); + + const data = this._transactionEncoder.batchFillOrKillOrdersTx(signedOrders, takerAssetFillAmounts); + const txHash = await this._handleFillsAsync(data, takerAddress, signedOrders, orderTransactionOpts); + return txHash; + } + + /** + * Synchronously executes multiple calls to fillOrder until total amount of makerAsset is bought by taker. + * Under-the-hood, this method uses the `feeRecipientAddress`s of the orders to looks up the coordinator server endpoints + * registered in the coordinator registry contract. It requests a signature from each coordinator server before + * submitting the orders and signatures as a 0x transaction to the coordinator extension contract, which validates the + * signatures and then fills the order through the Exchange contract. + * If any `feeRecipientAddress` in the batch is not registered to a coordinator server, the whole batch fails. + * @param signedOrders An array of signed orders to fill. + * @param makerAssetFillAmount Maker asset fill amount. + * @param takerAddress The user Ethereum address who would like to fill these orders. Must be available via the supplied + * Provider provided at instantiation. + * @param orderTransactionOpts Optional arguments this method accepts. + * @return Transaction hash. + */ + @decorators.asyncZeroExErrorHandler + public async marketBuyOrdersAsync( + signedOrders: SignedOrder[], + makerAssetFillAmount: BigNumber, + takerAddress: string, + orderTransactionOpts: OrderTransactionOpts = { shouldValidate: true }, + ): Promise { + assert.doesConformToSchema('signedOrders', signedOrders, schemas.signedOrdersSchema); + assert.isBigNumber('makerAssetFillAmount', makerAssetFillAmount); + assert.isETHAddressHex('takerAddress', takerAddress); + assert.doesConformToSchema('orderTransactionOpts', orderTransactionOpts, orderTxOptsSchema, [txOptsSchema]); + await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper); + + const data = this._transactionEncoder.marketBuyOrdersTx(signedOrders, makerAssetFillAmount); + const txHash = await this._handleFillsAsync(data, takerAddress, signedOrders, orderTransactionOpts); + return txHash; + } + + /** + * Synchronously executes multiple calls to fillOrder until total amount of makerAsset is bought by taker. + * Under-the-hood, this method uses the `feeRecipientAddress`s of the orders to looks up the coordinator server endpoints + * registered in the coordinator registry contract. It requests a signature from each coordinator server before + * submitting the orders and signatures as a 0x transaction to the coordinator extension contract, which validates the + * signatures and then fills the order through the Exchange contract. + * If any `feeRecipientAddress` in the batch is not registered to a coordinator server, the whole batch fails. + * @param signedOrders An array of signed orders to fill. + * @param takerAssetFillAmount Taker asset fill amount. + * @param takerAddress The user Ethereum address who would like to fill these orders. Must be available via the supplied + * Provider provided at instantiation. + * @param orderTransactionOpts Optional arguments this method accepts. + * @return Transaction hash. + */ + @decorators.asyncZeroExErrorHandler + public async marketSellOrdersAsync( + signedOrders: SignedOrder[], + takerAssetFillAmount: BigNumber, + takerAddress: string, + orderTransactionOpts: OrderTransactionOpts = { shouldValidate: true }, + ): Promise { + assert.doesConformToSchema('signedOrders', signedOrders, schemas.signedOrdersSchema); + assert.isBigNumber('takerAssetFillAmount', takerAssetFillAmount); + assert.isETHAddressHex('takerAddress', takerAddress); + assert.doesConformToSchema('orderTransactionOpts', orderTransactionOpts, orderTxOptsSchema, [txOptsSchema]); + await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper); + + const data = this._transactionEncoder.marketSellOrdersTx(signedOrders, takerAssetFillAmount); + const txHash = await this._handleFillsAsync(data, takerAddress, signedOrders, orderTransactionOpts); + return txHash; + } + + /** + * No throw version of marketBuyOrdersAsync + * @param signedOrders An array of signed orders to fill. + * @param makerAssetFillAmount Maker asset fill amount. + * @param takerAddress The user Ethereum address who would like to fill these orders. Must be available via the supplied + * Provider provided at instantiation. + * @param orderTransactionOpts Optional arguments this method accepts. + * @return Transaction hash. + */ + @decorators.asyncZeroExErrorHandler + public async marketBuyOrdersNoThrowAsync( + signedOrders: SignedOrder[], + makerAssetFillAmount: BigNumber, + takerAddress: string, + orderTransactionOpts: OrderTransactionOpts = { shouldValidate: true }, + ): Promise { + assert.doesConformToSchema('signedOrders', signedOrders, schemas.signedOrdersSchema); + assert.isBigNumber('makerAssetFillAmount', makerAssetFillAmount); + assert.isETHAddressHex('takerAddress', takerAddress); + assert.doesConformToSchema('orderTransactionOpts', orderTransactionOpts, orderTxOptsSchema, [txOptsSchema]); + await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper); + + const data = this._transactionEncoder.marketBuyOrdersNoThrowTx(signedOrders, makerAssetFillAmount); + const txHash = await this._handleFillsAsync(data, takerAddress, signedOrders, orderTransactionOpts); + return txHash; + } + + /** + * No throw version of marketSellOrdersAsync + * @param signedOrders An array of signed orders to fill. + * @param takerAssetFillAmount Taker asset fill amount. + * @param takerAddress The user Ethereum address who would like to fill these orders. Must be available via the supplied + * Provider provided at instantiation. + * @param orderTransactionOpts Optional arguments this method accepts. + * @return Transaction hash. + */ + @decorators.asyncZeroExErrorHandler + public async marketSellOrdersNoThrowAsync( + signedOrders: SignedOrder[], + takerAssetFillAmount: BigNumber, + takerAddress: string, + orderTransactionOpts: OrderTransactionOpts = { shouldValidate: true }, + ): Promise { + assert.doesConformToSchema('signedOrders', signedOrders, schemas.signedOrdersSchema); + assert.isBigNumber('takerAssetFillAmount', takerAssetFillAmount); + assert.isETHAddressHex('takerAddress', takerAddress); + assert.doesConformToSchema('orderTransactionOpts', orderTransactionOpts, orderTxOptsSchema, [txOptsSchema]); + await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper); + + const data = this._transactionEncoder.marketSellOrdersNoThrowTx(signedOrders, takerAssetFillAmount); + const txHash = await this._handleFillsAsync(data, takerAddress, signedOrders, orderTransactionOpts); + return txHash; + } + + /** + * Soft cancel a given order. + * Soft cancels are recorded only on coordinator operator servers and do not involve an Ethereum transaction. + * See [soft cancels](https://github.com/0xProject/0x-protocol-specification/blob/master/v2/coordinator-specification.md#soft-cancels). + * @param order An object that conforms to the Order or SignedOrder interface. The order you would like to cancel. + * @return CoordinatorServerCancellationResponse. See [Cancellation Response](https://github.com/0xProject/0x-protocol-specification/blob/master/v2/coordinator-specification.md#response). + */ + public async softCancelOrderAsync(order: Order | SignedOrder): Promise { + assert.doesConformToSchema('order', order, schemas.orderSchema); + assert.isETHAddressHex('feeRecipientAddress', order.feeRecipientAddress); + assert.isSenderAddressAsync('makerAddress', order.makerAddress, this._web3Wrapper); + + const data = this._transactionEncoder.cancelOrderTx(order); + const transaction = await this._generateSignedZeroExTransactionAsync(data, order.makerAddress); + const endpoint = await this._getServerEndpointOrThrowAsync(order.feeRecipientAddress); + + const response = await this._executeServerRequestAsync(transaction, order.makerAddress, endpoint); + if (response.isError) { + const approvedOrders = new Array(); + const cancellations = new Array(); + const errors = [ + { + ...response, + orders: [order], + }, + ]; + throw new CoordinatorServerError( + CoordinatorServerErrorMsg.CancellationFailed, + approvedOrders, + cancellations, + errors, + ); + } else { + return response.body as CoordinatorServerCancellationResponse; + } + } + + /** + * Batch version of softCancelOrderAsync. Requests multiple soft cancels + * @param orders An array of orders to cancel. + * @return CoordinatorServerCancellationResponse. See [Cancellation Response](https://github.com/0xProject/0x-protocol-specification/blob/master/v2/coordinator-specification.md#response). + */ + public async batchSoftCancelOrdersAsync(orders: SignedOrder[]): Promise { + assert.doesConformToSchema('orders', orders, schemas.ordersSchema); + const makerAddress = getMakerAddressOrThrow(orders); + assert.isSenderAddressAsync('makerAddress', makerAddress, this._web3Wrapper); + const data = this._transactionEncoder.batchCancelOrdersTx(orders); + + const serverEndpointsToOrders = await this._mapServerEndpointsToOrdersAsync(orders); + + // make server requests + const errorResponses: CoordinatorServerResponse[] = []; + const successResponses: CoordinatorServerCancellationResponse[] = []; + const transaction = await this._generateSignedZeroExTransactionAsync(data, makerAddress); + for (const endpoint of Object.keys(serverEndpointsToOrders)) { + const response = await this._executeServerRequestAsync(transaction, makerAddress, endpoint); + if (response.isError) { + errorResponses.push(response); + } else { + successResponses.push(response.body as CoordinatorServerCancellationResponse); + } + } + + // if no errors + if (errorResponses.length === 0) { + return successResponses; + } else { + // lookup orders with errors + const errorsWithOrders = errorResponses.map(resp => { + const endpoint = resp.coordinatorOperator; + const _orders = serverEndpointsToOrders[endpoint]; + return { + ...resp, + orders: _orders, + }; + }); + + const approvedOrders = new Array(); + const cancellations = successResponses; + // return errors and approvals + throw new CoordinatorServerError( + CoordinatorServerErrorMsg.CancellationFailed, + approvedOrders, + cancellations, + errorsWithOrders, + ); + } + } + + /** + * Cancels an order on-chain by submitting an Ethereum transaction. + * @param order An object that conforms to the Order or SignedOrder interface. The order you would like to cancel. + * @param orderTransactionOpts Optional arguments this method accepts. + * @return Transaction hash. + */ + @decorators.asyncZeroExErrorHandler + public async hardCancelOrderAsync( + order: Order | SignedOrder, + orderTransactionOpts: OrderTransactionOpts = { shouldValidate: true }, + ): Promise { + assert.doesConformToSchema('order', order, schemas.orderSchema); + assert.doesConformToSchema('orderTransactionOpts', orderTransactionOpts, orderTxOptsSchema, [txOptsSchema]); + await assert.isSenderAddressAsync('makerAddress', order.makerAddress, this._web3Wrapper); + + const data = this._transactionEncoder.cancelOrderTx(order); + const transaction = await this._generateSignedZeroExTransactionAsync(data, order.makerAddress); + + const approvalSignatures = new Array(); + const approvalExpirationTimeSeconds = new Array(); + const txHash = await this._submitCoordinatorTransactionAsync( + transaction, + order.makerAddress, + transaction.signature, + approvalExpirationTimeSeconds, + approvalSignatures, + orderTransactionOpts, + ); + return txHash; + } + + /** + * Batch version of hardCancelOrderAsync. Cancels orders on-chain by submitting an Ethereum transaction. + * Executes multiple cancels atomically in a single transaction. + * @param orders An array of orders to cancel. + * @param orderTransactionOpts Optional arguments this method accepts. + * @return Transaction hash. + */ + @decorators.asyncZeroExErrorHandler + public async batchHardCancelOrdersAsync( + orders: SignedOrder[], + orderTransactionOpts: OrderTransactionOpts = { shouldValidate: true }, + ): Promise { + assert.doesConformToSchema('orders', orders, schemas.ordersSchema); + const makerAddress = getMakerAddressOrThrow(orders); + assert.doesConformToSchema('orderTransactionOpts', orderTransactionOpts, orderTxOptsSchema, [txOptsSchema]); + await assert.isSenderAddressAsync('makerAddress', makerAddress, this._web3Wrapper); + + const data = this._transactionEncoder.batchCancelOrdersTx(orders); + const transaction = await this._generateSignedZeroExTransactionAsync(data, makerAddress); + + const approvalSignatures = new Array(); + const approvalExpirationTimeSeconds = new Array(); + const txHash = await this._submitCoordinatorTransactionAsync( + transaction, + makerAddress, + transaction.signature, + approvalExpirationTimeSeconds, + approvalSignatures, + orderTransactionOpts, + ); + return txHash; + } + + /** + * Cancels orders on-chain by submitting an Ethereum transaction. + * Cancels all orders created by makerAddress with a salt less than or equal to the targetOrderEpoch + * and senderAddress equal to coordinator extension contract address. + * @param targetOrderEpoch Target order epoch. + * @param senderAddress Address that should send the transaction. + * @param orderTransactionOpts Optional arguments this method accepts. + * @return Transaction hash. + */ + @decorators.asyncZeroExErrorHandler + public async hardCancelOrdersUpToAsync( + targetOrderEpoch: BigNumber, + senderAddress: string, + orderTransactionOpts: OrderTransactionOpts = { shouldValidate: true }, + ): Promise { + assert.isBigNumber('targetOrderEpoch', targetOrderEpoch); + assert.doesConformToSchema('orderTransactionOpts', orderTransactionOpts, orderTxOptsSchema, [txOptsSchema]); + await assert.isSenderAddressAsync('senderAddress', senderAddress, this._web3Wrapper); + + const data = this._transactionEncoder.cancelOrdersUpToTx(targetOrderEpoch); + const transaction = await this._generateSignedZeroExTransactionAsync(data, senderAddress); + + const approvalSignatures = new Array(); + const approvalExpirationTimeSeconds = new Array(); + const txHash = await this._submitCoordinatorTransactionAsync( + transaction, + senderAddress, + transaction.signature, + approvalExpirationTimeSeconds, + approvalSignatures, + orderTransactionOpts, + ); + return txHash; + } + + /** + * Validates that the 0x transaction has been approved by all of the feeRecipients that correspond to each order in the transaction's Exchange calldata. + * Throws an error if the transaction approvals are not valid. Will not detect failures that would occur when the transaction is executed on the Exchange contract. + * @param transaction 0x transaction containing salt, signerAddress, and data. + * @param txOrigin Required signer of Ethereum transaction calling this function. + * @param transactionSignature Proof that the transaction has been signed by the signer. + * @param approvalExpirationTimeSeconds Array of expiration times in seconds for which each corresponding approval signature expires. + * @param approvalSignatures Array of signatures that correspond to the feeRecipients of each order in the transaction's Exchange calldata. + */ + public async assertValidCoordinatorApprovalsOrThrowAsync( + transaction: ZeroExTransaction, + txOrigin: string, + transactionSignature: string, + approvalExpirationTimeSeconds: BigNumber[], + approvalSignatures: string[], + ): Promise { + assert.doesConformToSchema('transaction', transaction, schemas.zeroExTransactionSchema); + assert.isETHAddressHex('txOrigin', txOrigin); + assert.isHexString('transactionSignature', transactionSignature); + for (const expirationTime of approvalExpirationTimeSeconds) { + assert.isBigNumber('expirationTime', expirationTime); + } + for (const approvalSignature of approvalSignatures) { + assert.isHexString('approvalSignature', approvalSignature); + } + + await this._contractInstance.assertValidCoordinatorApprovals.callAsync( + transaction, + txOrigin, + transactionSignature, + approvalExpirationTimeSeconds, + approvalSignatures, + ); + } + + /** + * Recovers the address of a signer given a hash and signature. + * @param hash Any 32 byte hash. + * @param signature Proof that the hash has been signed by signer. + * @returns Signer address. + */ + public async getSignerAddressAsync(hash: string, signature: string): Promise { + assert.isHexString('hash', hash); + assert.isHexString('signature', signature); + const signerAddress = await this._contractInstance.getSignerAddress.callAsync(hash, signature); + return signerAddress; + } + + private async _handleFillsAsync( + data: string, + takerAddress: string, + signedOrders: SignedOrder[], + orderTransactionOpts: OrderTransactionOpts, + ): Promise { + const coordinatorOrders = signedOrders.filter(o => o.senderAddress === this.address); + const serverEndpointsToOrders = await this._mapServerEndpointsToOrdersAsync(coordinatorOrders); + + // make server requests + const errorResponses: CoordinatorServerResponse[] = []; + const approvalResponses: CoordinatorServerResponse[] = []; + const transaction = await this._generateSignedZeroExTransactionAsync(data, takerAddress); + for (const endpoint of Object.keys(serverEndpointsToOrders)) { + const response = await this._executeServerRequestAsync(transaction, takerAddress, endpoint); + if (response.isError) { + errorResponses.push(response); + } else { + approvalResponses.push(response); + } + } + + // if no errors + if (errorResponses.length === 0) { + // concatenate all approval responses + const allApprovals = approvalResponses.map(resp => + formatRawResponse(resp.body as CoordinatorServerApprovalRawResponse), + ); + + const allSignatures = flatten(allApprovals.map(a => a.signatures)); + const allExpirationTimes = flatten(allApprovals.map(a => a.expirationTimeSeconds)); + + // submit transaction with approvals + const txHash = await this._submitCoordinatorTransactionAsync( + transaction, + takerAddress, + transaction.signature, + allExpirationTimes, + allSignatures, + orderTransactionOpts, + ); + return txHash; + } else { + // format errors and approvals + // concatenate approvals + const notCoordinatorOrders = signedOrders.filter(o => o.senderAddress !== this.address); + const approvedOrdersNested = approvalResponses.map(resp => { + const endpoint = resp.coordinatorOperator; + const orders = serverEndpointsToOrders[endpoint]; + return orders; + }); + const approvedOrders = flatten(approvedOrdersNested.concat(notCoordinatorOrders)); + + // lookup orders with errors + const errorsWithOrders = errorResponses.map(resp => { + const endpoint = resp.coordinatorOperator; + const orders = serverEndpointsToOrders[endpoint]; + return { + ...resp, + orders, + }; + }); + + // throw informative error + const cancellations = new Array(); + throw new CoordinatorServerError( + CoordinatorServerErrorMsg.FillFailed, + approvedOrders, + cancellations, + errorsWithOrders, + ); + } + function formatRawResponse( + rawResponse: CoordinatorServerApprovalRawResponse, + ): CoordinatorServerApprovalResponse { + return { + signatures: ([] as string[]).concat(rawResponse.signatures), + expirationTimeSeconds: ([] as BigNumber[]).concat( + Array(rawResponse.signatures.length).fill(rawResponse.expirationTimeSeconds), + ), + }; + } + } + + private async _getServerEndpointOrThrowAsync(feeRecipientAddress: string): Promise { + const cached = this._feeRecipientToEndpoint[feeRecipientAddress]; + const endpoint = + cached !== undefined + ? cached + : await _fetchServerEndpointOrThrowAsync(feeRecipientAddress, this._registryInstance); + return endpoint; + + async function _fetchServerEndpointOrThrowAsync( + feeRecipient: string, + registryInstance: CoordinatorRegistryContract, + ): Promise { + const coordinatorOperatorEndpoint = await registryInstance.getCoordinatorEndpoint.callAsync(feeRecipient); + if (coordinatorOperatorEndpoint === '' || coordinatorOperatorEndpoint === undefined) { + throw new Error( + `No Coordinator server endpoint found in Coordinator Registry for feeRecipientAddress: ${feeRecipient}. Registry contract address: ${ + registryInstance.address + }`, + ); + } + return coordinatorOperatorEndpoint; + } + } + + private async _generateSignedZeroExTransactionAsync( + data: string, + signerAddress: string, + ): Promise { + const transaction: ZeroExTransaction = { + salt: generatePseudoRandomSalt(), + signerAddress, + data, + verifyingContractAddress: this.exchangeAddress, + }; + const signedTransaction = await signatureUtils.ecSignTypedDataTransactionAsync( + this._web3Wrapper.getProvider(), + transaction, + transaction.signerAddress, + ); + + return signedTransaction; + } + + private async _executeServerRequestAsync( + signedTransaction: SignedZeroExTransaction, + txOrigin: string, + endpoint: string, + ): Promise { + const requestPayload = { + signedTransaction, + txOrigin, + }; + const response = await fetchAsync(`${endpoint}/v1/request_transaction?networkId=${this.networkId}`, { + body: JSON.stringify(requestPayload), + method: 'POST', + headers: { + 'Content-Type': 'application/json; charset=utf-8', + }, + }); + + const isError = response.status !== HttpStatus.OK; + const isValidationError = response.status === HttpStatus.BAD_REQUEST; + const json = isError && !isValidationError ? undefined : await response.json(); + + const result = { + isError, + status: response.status, + body: isError ? undefined : json, + error: isError ? json : undefined, + request: requestPayload, + coordinatorOperator: endpoint, + }; + + return result; + } + + private async _submitCoordinatorTransactionAsync( + transaction: CoordinatorTransaction, + txOrigin: string, + transactionSignature: string, + approvalExpirationTimeSeconds: BigNumber[], + approvalSignatures: string[], + orderTransactionOpts: OrderTransactionOpts, + ): Promise { + if (orderTransactionOpts.shouldValidate) { + await this._contractInstance.executeTransaction.callAsync( + transaction, + txOrigin, + transactionSignature, + approvalExpirationTimeSeconds, + approvalSignatures, + { + from: txOrigin, + gas: orderTransactionOpts.gasLimit, + gasPrice: orderTransactionOpts.gasPrice, + nonce: orderTransactionOpts.nonce, + }, + ); + } + const txHash = await this._contractInstance.executeTransaction.sendTransactionAsync( + transaction, + txOrigin, + transactionSignature, + approvalExpirationTimeSeconds, + approvalSignatures, + { + from: txOrigin, + gas: orderTransactionOpts.gasLimit, + gasPrice: orderTransactionOpts.gasPrice, + nonce: orderTransactionOpts.nonce, + }, + ); + return txHash; + } + + private async _mapServerEndpointsToOrdersAsync( + coordinatorOrders: SignedOrder[], + ): Promise<{ [endpoint: string]: SignedOrder[] }> { + const feeRecipientsToOrders: { [feeRecipient: string]: SignedOrder[] } = {}; + for (const order of coordinatorOrders) { + const feeRecipient = order.feeRecipientAddress; + if (feeRecipientsToOrders[feeRecipient] === undefined) { + feeRecipientsToOrders[feeRecipient] = [] as SignedOrder[]; + } + feeRecipientsToOrders[feeRecipient].push(order); + } + const serverEndpointsToOrders: { [endpoint: string]: SignedOrder[] } = {}; + for (const feeRecipient of Object.keys(feeRecipientsToOrders)) { + const endpoint = await this._getServerEndpointOrThrowAsync(feeRecipient); + const orders = feeRecipientsToOrders[feeRecipient]; + if (serverEndpointsToOrders[endpoint] === undefined) { + serverEndpointsToOrders[endpoint] = []; + } + serverEndpointsToOrders[endpoint] = serverEndpointsToOrders[endpoint].concat(orders); + } + return serverEndpointsToOrders; + } +} + +function getMakerAddressOrThrow(orders: Array): string { + const uniqueMakerAddresses = new Set(orders.map(o => o.makerAddress)); + if (uniqueMakerAddresses.size > 1) { + throw new Error(`All orders in a batch must have the same makerAddress`); + } + return orders[0].makerAddress; +} + +// tslint:disable:max-file-line-count diff --git a/packages/contract-wrappers/src/index.ts b/packages/contract-wrappers/src/index.ts index 9a1579104f..1cb77bfb69 100644 --- a/packages/contract-wrappers/src/index.ts +++ b/packages/contract-wrappers/src/index.ts @@ -26,6 +26,7 @@ export { } from '@0x/abi-gen-wrappers'; export { ContractWrappers } from './contract_wrappers'; +export { CoordinatorWrapper } from './contract_wrappers/coordinator_wrapper'; export { ERC20TokenWrapper } from './contract_wrappers/erc20_token_wrapper'; export { ERC721TokenWrapper } from './contract_wrappers/erc721_token_wrapper'; export { EtherTokenWrapper } from './contract_wrappers/ether_token_wrapper'; @@ -58,6 +59,8 @@ export { TraderInfo, ValidateOrderFillableOpts, DutchAuctionData, + CoordinatorServerCancellationResponse, + CoordinatorServerError, } from './types'; export { @@ -72,6 +75,8 @@ export { Order, SignedOrder, AssetProxyId, + SignedZeroExTransaction, + ZeroExTransaction, } from '@0x/types'; export { diff --git a/packages/contract-wrappers/src/types.ts b/packages/contract-wrappers/src/types.ts index 624b9ac301..7ae38a5f08 100644 --- a/packages/contract-wrappers/src/types.ts +++ b/packages/contract-wrappers/src/types.ts @@ -225,3 +225,11 @@ export interface DutchAuctionData { beginTimeSeconds: BigNumber; beginAmount: BigNumber; } + +export { CoordinatorServerCancellationResponse, CoordinatorServerError } from './utils/coordinator_server_types'; + +export interface CoordinatorTransaction { + salt: BigNumber; + signerAddress: string; + data: string; +} diff --git a/packages/contract-wrappers/src/utils/coordinator_server_types.ts b/packages/contract-wrappers/src/utils/coordinator_server_types.ts new file mode 100644 index 0000000000..9fe360094b --- /dev/null +++ b/packages/contract-wrappers/src/utils/coordinator_server_types.ts @@ -0,0 +1,61 @@ +import { Order, SignedOrder, SignedZeroExTransaction } from '@0x/types'; +import { BigNumber } from '@0x/utils'; + +export interface CoordinatorServerApprovalResponse { + signatures: string[]; + expirationTimeSeconds: BigNumber[]; +} +export interface CoordinatorServerApprovalRawResponse { + signatures: string[]; + expirationTimeSeconds: BigNumber; +} + +export interface CoordinatorServerCancellationResponse { + outstandingFillSignatures: CoordinatorOutstandingFillSignatures[]; + cancellationSignatures: string[]; +} +export interface CoordinatorOutstandingFillSignatures { + orderHash: string; + approvalSignatures: string[]; + expirationTimeSeconds: BigNumber; + takerAssetFillAmount: BigNumber; +} + +export interface CoordinatorServerResponse { + isError: boolean; + status: number; + body?: CoordinatorServerCancellationResponse | CoordinatorServerApprovalRawResponse; + error?: any; + request: CoordinatorServerRequest; + coordinatorOperator: string; + orders?: Array; +} + +export interface CoordinatorServerRequest { + signedTransaction: SignedZeroExTransaction; + txOrigin: string; +} + +export class CoordinatorServerError extends Error { + public message: CoordinatorServerErrorMsg; + public approvedOrders?: SignedOrder[] = []; + public cancellations?: CoordinatorServerCancellationResponse[] = []; + public errors: CoordinatorServerResponse[]; + constructor( + message: CoordinatorServerErrorMsg, + approvedOrders: SignedOrder[], + cancellations: CoordinatorServerCancellationResponse[], + errors: CoordinatorServerResponse[], + ) { + super(); + this.message = message; + this.approvedOrders = approvedOrders; + this.cancellations = cancellations; + this.errors = errors; + } +} + +export enum CoordinatorServerErrorMsg { + CancellationFailed = 'Failed to cancel with some coordinator server(s). See errors for more info. See cancellations for successful cancellations.', + FillFailed = 'Failed to obtain approval signatures from some coordinator server(s). See errors for more info. Current transaction has been abandoned but you may resubmit with only approvedOrders (a new ZeroEx transaction will have to be signed).', +} diff --git a/packages/contract-wrappers/test/coordinator_wrapper_test.ts b/packages/contract-wrappers/test/coordinator_wrapper_test.ts new file mode 100644 index 0000000000..72afd3dba5 --- /dev/null +++ b/packages/contract-wrappers/test/coordinator_wrapper_test.ts @@ -0,0 +1,715 @@ +import { CoordinatorRegistryContract } from '@0x/abi-gen-wrappers'; +import { CoordinatorRegistry } from '@0x/contract-artifacts'; +import { constants } from '@0x/contracts-test-utils'; +import { defaultOrmConfig, getAppAsync } from '@0x/coordinator-server'; +import { BlockchainLifecycle } from '@0x/dev-utils'; +import { FillScenarios } from '@0x/fill-scenarios'; +import { assetDataUtils } from '@0x/order-utils'; +import { SignedOrder } from '@0x/types'; +import { BigNumber, fetchAsync, logUtils } from '@0x/utils'; +import * as chai from 'chai'; +import * as http from 'http'; +import 'mocha'; +import * as nock from 'nock'; + +import { ContractWrappers } from '../src'; +import { CoordinatorServerErrorMsg } from '../src/utils/coordinator_server_types'; + +import { chaiSetup } from './utils/chai_setup'; +import { migrateOnceAsync } from './utils/migrate'; +import { tokenUtils } from './utils/token_utils'; +import { provider, web3Wrapper } from './utils/web3_wrapper'; + +chaiSetup.configure(); +const expect = chai.expect; +const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper); +const coordinatorPort = '3000'; +const anotherCoordinatorPort = '4000'; +const coordinatorEndpoint = 'http://localhost:'; + +// tslint:disable:custom-no-magic-numbers +describe('CoordinatorWrapper', () => { + const fillableAmount = new BigNumber(5); + const takerTokenFillAmount = new BigNumber(5); + let coordinatorServerApp: http.Server; + let anotherCoordinatorServerApp: http.Server; + let contractWrappers: ContractWrappers; + let fillScenarios: FillScenarios; + let exchangeContractAddress: string; + let zrxTokenAddress: string; + let userAddresses: string[]; + let makerAddress: string; + let takerAddress: string; + let feeRecipientAddressOne: string; + let feeRecipientAddressTwo: string; + let feeRecipientAddressThree: string; + let feeRecipientAddressFour: string; + + let makerTokenAddress: string; + let takerTokenAddress: string; + let makerAssetData: string; + let takerAssetData: string; + let txHash: string; + let signedOrder: SignedOrder; + let anotherSignedOrder: SignedOrder; + let signedOrderWithDifferentFeeRecipient: SignedOrder; + let signedOrderWithDifferentCoordinatorOperator: SignedOrder; + let coordinatorRegistryInstance: CoordinatorRegistryContract; + + // for testing server error responses + let serverValidationError: any; + let serverCancellationSuccess: any; + let serverApprovalSuccess: any; + + before(async () => { + const contractAddresses = await migrateOnceAsync(); + await blockchainLifecycle.startAsync(); + const config = { + networkId: constants.TESTRPC_NETWORK_ID, + contractAddresses, + blockPollingIntervalMs: 10, + }; + contractWrappers = new ContractWrappers(provider, config); + exchangeContractAddress = contractWrappers.exchange.address; + userAddresses = await web3Wrapper.getAvailableAddressesAsync(); + zrxTokenAddress = contractWrappers.exchange.zrxTokenAddress; + fillScenarios = new FillScenarios( + provider, + userAddresses, + zrxTokenAddress, + exchangeContractAddress, + contractWrappers.erc20Proxy.address, + contractWrappers.erc721Proxy.address, + ); + [ + , + makerAddress, + takerAddress, + feeRecipientAddressOne, + feeRecipientAddressTwo, + feeRecipientAddressThree, + feeRecipientAddressFour, + ] = userAddresses.slice(0, 7); + [makerTokenAddress, takerTokenAddress] = tokenUtils.getDummyERC20TokenAddresses(); + [makerAssetData, takerAssetData] = [ + assetDataUtils.encodeERC20AssetData(makerTokenAddress), + assetDataUtils.encodeERC20AssetData(takerTokenAddress), + ]; + + // set up mock coordinator server + const coordinatorServerConfigs = { + HTTP_PORT: 3000, // Only used in default instantiation in 0x-coordinator-server/server.js; not used here + NETWORK_ID_TO_SETTINGS: { + 50: { + FEE_RECIPIENTS: [ + { + ADDRESS: feeRecipientAddressOne, + PRIVATE_KEY: constants.TESTRPC_PRIVATE_KEYS[ + userAddresses.indexOf(feeRecipientAddressOne) + ].toString('hex'), + }, + { + ADDRESS: feeRecipientAddressTwo, + PRIVATE_KEY: constants.TESTRPC_PRIVATE_KEYS[ + userAddresses.indexOf(feeRecipientAddressTwo) + ].toString('hex'), + }, + { + ADDRESS: feeRecipientAddressThree, + PRIVATE_KEY: constants.TESTRPC_PRIVATE_KEYS[ + userAddresses.indexOf(feeRecipientAddressThree) + ].toString('hex'), + }, + ], + // Ethereum RPC url, only used in the default instantiation in 0x-coordinator-server/server.js + // Not used here when instantiating with the imported app + RPC_URL: 'http://ignore', + }, + }, + // Optional selective delay on fill requests + SELECTIVE_DELAY_MS: 0, + EXPIRATION_DURATION_SECONDS: 60, // 1 minute + }; + coordinatorServerApp = await getAppAsync( + { + [config.networkId]: provider, + }, + coordinatorServerConfigs, + defaultOrmConfig, + ); + + coordinatorServerApp.listen(coordinatorPort, () => { + logUtils.log(`Coordinator SERVER API (HTTP) listening on port ${coordinatorPort}!`); + }); + + anotherCoordinatorServerApp = await getAppAsync( + { + [config.networkId]: provider, + }, + coordinatorServerConfigs, + { + type: 'sqlite', + database: 'database.sqlite_2', + entities: defaultOrmConfig.entities, + cli: defaultOrmConfig.cli, + logging: defaultOrmConfig.logging, + synchronize: defaultOrmConfig.synchronize, + }, + ); + + anotherCoordinatorServerApp.listen(anotherCoordinatorPort, () => { + logUtils.log(`Coordinator SERVER API (HTTP) listening on port ${anotherCoordinatorPort}!`); + }); + + // setup coordinator registry + coordinatorRegistryInstance = new CoordinatorRegistryContract( + CoordinatorRegistry.compilerOutput.abi, + contractAddresses.coordinatorRegistry, + provider, + ); + + // register coordinator server + await web3Wrapper.awaitTransactionSuccessAsync( + await coordinatorRegistryInstance.setCoordinatorEndpoint.sendTransactionAsync( + `${coordinatorEndpoint}${coordinatorPort}`, + { + from: feeRecipientAddressOne, + }, + ), + constants.AWAIT_TRANSACTION_MINED_MS, + ); + await web3Wrapper.awaitTransactionSuccessAsync( + await coordinatorRegistryInstance.setCoordinatorEndpoint.sendTransactionAsync( + `${coordinatorEndpoint}${coordinatorPort}`, + { + from: feeRecipientAddressTwo, + }, + ), + constants.AWAIT_TRANSACTION_MINED_MS, + ); + + // register another coordinator server + await web3Wrapper.awaitTransactionSuccessAsync( + await coordinatorRegistryInstance.setCoordinatorEndpoint.sendTransactionAsync( + `${coordinatorEndpoint}${anotherCoordinatorPort}`, + { + from: feeRecipientAddressThree, + }, + ), + constants.AWAIT_TRANSACTION_MINED_MS, + ); + }); + after(async () => { + await blockchainLifecycle.revertAsync(); + }); + beforeEach(async () => { + await blockchainLifecycle.startAsync(); + + signedOrder = await fillScenarios.createFillableSignedOrderWithFeesAsync( + makerAssetData, + takerAssetData, + new BigNumber(1), + new BigNumber(1), + makerAddress, + takerAddress, + fillableAmount, + feeRecipientAddressOne, + undefined, + contractWrappers.coordinator.address, + ); + anotherSignedOrder = await fillScenarios.createFillableSignedOrderWithFeesAsync( + makerAssetData, + takerAssetData, + new BigNumber(1), + new BigNumber(1), + makerAddress, + takerAddress, + fillableAmount, + feeRecipientAddressOne, + undefined, + contractWrappers.coordinator.address, + ); + signedOrderWithDifferentFeeRecipient = await fillScenarios.createFillableSignedOrderWithFeesAsync( + makerAssetData, + takerAssetData, + new BigNumber(1), + new BigNumber(1), + makerAddress, + takerAddress, + fillableAmount, + feeRecipientAddressTwo, + undefined, + contractWrappers.coordinator.address, + ); + signedOrderWithDifferentCoordinatorOperator = await fillScenarios.createFillableSignedOrderWithFeesAsync( + makerAssetData, + takerAssetData, + new BigNumber(1), + new BigNumber(1), + makerAddress, + takerAddress, + fillableAmount, + feeRecipientAddressThree, + undefined, + contractWrappers.coordinator.address, + ); + }); + afterEach(async () => { + await blockchainLifecycle.revertAsync(); + }); + describe('test setup', () => { + it('should have coordinator registry which returns an endpoint', async () => { + const setCoordinatorEndpoint = await coordinatorRegistryInstance.getCoordinatorEndpoint.callAsync( + feeRecipientAddressOne, + ); + const anotherSetCoordinatorEndpoint = await coordinatorRegistryInstance.getCoordinatorEndpoint.callAsync( + feeRecipientAddressThree, + ); + expect(setCoordinatorEndpoint).to.be.equal(`${coordinatorEndpoint}${coordinatorPort}`); + expect(anotherSetCoordinatorEndpoint).to.be.equal(`${coordinatorEndpoint}${anotherCoordinatorPort}`); + }); + it('should have coordinator server endpoints which respond to pings', async () => { + let result = await fetchAsync(`${coordinatorEndpoint}${coordinatorPort}/v1/ping`); + expect(result.status).to.be.equal(200); + expect(await result.text()).to.be.equal('pong'); + + result = await fetchAsync(`${coordinatorEndpoint}${anotherCoordinatorPort}/v1/ping`); + expect(result.status).to.be.equal(200); + expect(await result.text()).to.be.equal('pong'); + }); + }); + // fill handling is the same for all fill methods so we can test them all through the fillOrder and batchFillOrders interfaces + describe('fill order(s)', () => { + describe('#fillOrderAsync', () => { + it('should fill a valid order', async () => { + txHash = await contractWrappers.coordinator.fillOrderAsync( + signedOrder, + takerTokenFillAmount, + takerAddress, + ); + + await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS); + }); + }); + describe('#batchFillOrdersAsync', () => { + it('should fill a batch of valid orders', async () => { + const signedOrders = [signedOrder, anotherSignedOrder]; + const takerAssetFillAmounts = Array(2).fill(takerTokenFillAmount); + txHash = await contractWrappers.coordinator.batchFillOrdersAsync( + signedOrders, + takerAssetFillAmounts, + takerAddress, + ); + + await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS); + }); + it('should fill a batch of orders with different feeRecipientAddresses with the same coordinator server', async () => { + const signedOrders = [signedOrder, anotherSignedOrder, signedOrderWithDifferentFeeRecipient]; + const takerAssetFillAmounts = Array(3).fill(takerTokenFillAmount); + txHash = await contractWrappers.coordinator.batchFillOrdersAsync( + signedOrders, + takerAssetFillAmounts, + takerAddress, + ); + + await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS); + }); + // coordinator-server, as currently implemented, shares a singleton database connection across + // all instantiations. Making the request to two different mocked server endpoints still hits the + // same database and fails because of the uniqueness constraint on transactions in the database. + it.skip('should fill a batch of orders with different feeRecipientAddresses with different coordinator servers', async () => { + const signedOrders = [ + signedOrder, + anotherSignedOrder, + signedOrderWithDifferentFeeRecipient, + signedOrderWithDifferentCoordinatorOperator, + ]; + const takerAssetFillAmounts = Array(4).fill(takerTokenFillAmount); + txHash = await contractWrappers.coordinator.batchFillOrdersAsync( + signedOrders, + takerAssetFillAmounts, + takerAddress, + ); + + await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS); + }); + + it('should fill a batch of mixed coordinator and non-coordinator orders', async () => { + const nonCoordinatorOrder = await fillScenarios.createFillableSignedOrderWithFeesAsync( + makerAssetData, + takerAssetData, + new BigNumber(1), + new BigNumber(1), + makerAddress, + takerAddress, + fillableAmount, + feeRecipientAddressOne, + undefined, + ); + const signedOrders = [signedOrder, nonCoordinatorOrder]; + const takerAssetFillAmounts = Array(2).fill(takerTokenFillAmount); + txHash = await contractWrappers.coordinator.batchFillOrdersAsync( + signedOrders, + takerAssetFillAmounts, + takerAddress, + ); + await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS); + }); + }); + }); + describe('soft cancel order(s)', () => { + describe('#softCancelOrderAsync', () => { + it('should soft cancel a valid order', async () => { + const response = await contractWrappers.coordinator.softCancelOrderAsync(signedOrder); + expect(response.outstandingFillSignatures).to.have.lengthOf(0); + expect(response.cancellationSignatures).to.have.lengthOf(1); + }); + }); + describe('#batchSoftCancelOrdersAsync', () => { + it('should soft cancel a batch of valid orders', async () => { + const orders = [signedOrder, anotherSignedOrder]; + const response = await contractWrappers.coordinator.batchSoftCancelOrdersAsync(orders); + expect(response).to.have.lengthOf(1); + expect(response[0].outstandingFillSignatures).to.have.lengthOf(0); + expect(response[0].cancellationSignatures).to.have.lengthOf(1); + }); + it('should soft cancel a batch of orders with different feeRecipientAddresses', async () => { + const orders = [signedOrder, anotherSignedOrder, signedOrderWithDifferentFeeRecipient]; + const response = await contractWrappers.coordinator.batchSoftCancelOrdersAsync(orders); + expect(response).to.have.lengthOf(1); + expect(response[0].outstandingFillSignatures).to.have.lengthOf(0); + expect(response[0].cancellationSignatures).to.have.lengthOf(2); + }); + it('should soft cancel a batch of orders with different coordinatorOperator and concatenate responses', async () => { + const orders = [ + signedOrder, + anotherSignedOrder, + signedOrderWithDifferentFeeRecipient, + signedOrderWithDifferentCoordinatorOperator, + ]; + const response = await contractWrappers.coordinator.batchSoftCancelOrdersAsync(orders); + expect(response).to.have.lengthOf(2); + expect(response[0].outstandingFillSignatures).to.have.lengthOf(0); + expect(response[0].cancellationSignatures).to.have.lengthOf(3); + expect(response[1].cancellationSignatures).to.have.lengthOf(3); // both coordinator servers support the same feeRecipients + }); + }); + }); + describe('hard cancel order(s)', () => { + describe('#hardCancelOrderAsync', () => { + it('should hard cancel a valid order', async () => { + txHash = await contractWrappers.coordinator.hardCancelOrderAsync(signedOrder); + await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS); + }); + }); + describe('#batchHardCancelOrdersAsync', () => { + it('should hard cancel a batch of valid orders', async () => { + const orders = [signedOrder, anotherSignedOrder]; + txHash = await contractWrappers.coordinator.batchHardCancelOrdersAsync(orders); + await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS); + }); + }); + describe('#cancelOrdersUpTo/getOrderEpochAsync', () => { + it('should hard cancel orders up to target order epoch', async () => { + const targetOrderEpoch = new BigNumber(42); + txHash = await contractWrappers.coordinator.hardCancelOrdersUpToAsync(targetOrderEpoch, makerAddress); + + await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS); + const orderEpoch = await contractWrappers.exchange.getOrderEpochAsync( + makerAddress, + contractWrappers.coordinator.address, + ); + expect(orderEpoch).to.be.bignumber.equal(targetOrderEpoch.plus(1)); + }); + }); + }); + describe('coordinator edge cases', () => { + it('should throw error when feeRecipientAddress is not in registry', async () => { + const badOrder = await fillScenarios.createFillableSignedOrderWithFeesAsync( + makerAssetData, + takerAssetData, + new BigNumber(1), + new BigNumber(1), + makerAddress, + takerAddress, + fillableAmount, + feeRecipientAddressFour, + ); + + expect( + contractWrappers.coordinator.fillOrderAsync(badOrder, takerTokenFillAmount, takerAddress), + ).to.be.rejected(); + }); + it('should throw error when coordinator endpoint is malformed', async () => { + await web3Wrapper.awaitTransactionSuccessAsync( + await coordinatorRegistryInstance.setCoordinatorEndpoint.sendTransactionAsync('localhost', { + from: feeRecipientAddressFour, + }), + constants.AWAIT_TRANSACTION_MINED_MS, + ); + expect( + contractWrappers.coordinator.fillOrderAsync(signedOrder, takerTokenFillAmount, takerAddress), + ).to.be.rejected(); + }); + }); + describe('coordinator server errors', () => { + beforeEach('setup', () => { + serverValidationError = { + code: 100, + reason: 'Validation Failed', + validationErrors: [ + { + field: 'signedTransaction', + code: 1011, + reason: + 'A transaction can only be approved once. To request approval to perform the same actions, generate and sign an identical transaction with a different salt value.', + }, + ], + }; + serverCancellationSuccess = { + outstandingFillSignatures: [ + { + orderHash: '0xd1dc61f3e7e5f41d72beae7863487beea108971de678ca00d903756f842ef3ce', + approvalSignatures: [ + '0x1c7383ca8ebd6de8b5b20b1c2d49bea166df7dfe4af1932c9c52ec07334e859cf2176901da35f4480ceb3ab63d8d0339d851c31929c40d88752689b9a8a535671303', + ], + expirationTimeSeconds: 1552390380, + takerAssetFillAmount: 100000000000000000000, + }, + ], + cancellationSignatures: [ + '0x2ea3117a8ebd6de8b5b20b1c2d49bea166df7dfe4af1932c9c52ec07334e859cf2176901da35f4480ceb3ab63d8d0339d851c31929c40d88752689b9a855b5a7b401', + ], + }; + serverApprovalSuccess = { + signatures: [ + '0x1cc07d7ae39679690a91418d46491520f058e4fb14debdf2e98f2376b3970de8512ace44af0be6d1c65617f7aae8c2364ff63f241515ee1559c3eeecb0f671d9e903', + ], + expirationTimeSeconds: 1552390014, + }; + + nock(`${coordinatorEndpoint}${coordinatorPort}`) + .post('/v1/request_transaction', () => true) + .query({ + networkId: 50, + }) + .reply(400, serverValidationError); + }); + it('should throw error when softCancel fails', done => { + contractWrappers.coordinator + .softCancelOrderAsync(signedOrder) + .then(res => { + expect(res).to.be.undefined(); + }) + .catch(err => { + expect(err.message).equal(CoordinatorServerErrorMsg.CancellationFailed); + expect(err.approvedOrders).to.be.empty('array'); + expect(err.cancellations).to.be.empty('array'); + + const errorBody = err.errors[0]; + expect(errorBody.isError).to.be.true(); + expect(errorBody.status).to.equal(400); + expect(errorBody.error).to.deep.equal(serverValidationError); + expect(errorBody.orders).to.deep.equal([signedOrder]); + expect(errorBody.coordinatorOperator).to.equal(`${coordinatorEndpoint}${coordinatorPort}`); + done(); + }); + }); + it('should throw error when batch soft cancel fails with single coordinator operator', done => { + const orders = [signedOrder, signedOrderWithDifferentFeeRecipient]; + contractWrappers.coordinator + .batchSoftCancelOrdersAsync(orders) + .then(res => { + expect(res).to.be.undefined(); + }) + .catch(err => { + expect(err.message).equal(CoordinatorServerErrorMsg.CancellationFailed); + expect(err.approvedOrders).to.be.empty('array'); + expect(err.cancellations).to.be.empty('array'); + + const errorBody = err.errors[0]; + expect(errorBody.isError).to.be.true(); + expect(errorBody.status).to.equal(400); + expect(errorBody.error).to.deep.equal(serverValidationError); + expect(errorBody.orders).to.deep.equal(orders); + expect(errorBody.coordinatorOperator).to.equal(`${coordinatorEndpoint}${coordinatorPort}`); + done(); + }); + }); + it('should throw consolidated error when batch soft cancel partially fails with different coordinator operators', done => { + nock(`${coordinatorEndpoint}${anotherCoordinatorPort}`) + .post('/v1/request_transaction', () => true) + .query({ + networkId: 50, + }) + .reply(200, serverCancellationSuccess); + + const signedOrders = [signedOrder, signedOrderWithDifferentCoordinatorOperator]; + contractWrappers.coordinator + .batchSoftCancelOrdersAsync(signedOrders) + .then(res => { + expect(res).to.be.undefined(); + }) + .catch(err => { + expect(err.message).equal(CoordinatorServerErrorMsg.CancellationFailed); + expect(err.approvedOrders).to.be.empty('array'); + expect(err.cancellations).to.deep.equal([serverCancellationSuccess]); + + const errorBody = err.errors[0]; + expect(errorBody.isError).to.be.true(); + expect(errorBody.status).to.equal(400); + expect(errorBody.error).to.deep.equal(serverValidationError); + expect(errorBody.orders).to.deep.equal([signedOrder]); + expect(errorBody.coordinatorOperator).to.equal(`${coordinatorEndpoint}${coordinatorPort}`); + done(); + }); + }); + it('should throw consolidated error when batch soft cancel totally fails with different coordinator operators', done => { + nock(`${coordinatorEndpoint}${anotherCoordinatorPort}`) + .post('/v1/request_transaction', () => true) + .query({ + networkId: 50, + }) + .reply(400, serverValidationError); + + const signedOrders = [signedOrder, signedOrderWithDifferentCoordinatorOperator]; + contractWrappers.coordinator + .batchSoftCancelOrdersAsync(signedOrders) + .then(res => { + expect(res).to.be.undefined(); + }) + .catch(err => { + expect(err.message).equal(CoordinatorServerErrorMsg.CancellationFailed); + expect(err.approvedOrders).to.be.empty('array'); + expect(err.cancellations).to.be.empty('array'); + + const errorBody = err.errors[0]; + expect(errorBody.isError).to.be.true(); + expect(errorBody.status).to.equal(400); + expect(errorBody.error).to.deep.equal(serverValidationError); + expect(errorBody.orders).to.deep.equal([signedOrder]); + expect(errorBody.coordinatorOperator).to.equal(`${coordinatorEndpoint}${coordinatorPort}`); + + const anotherErrorBody = err.errors[1]; + expect(anotherErrorBody.isError).to.be.true(); + expect(anotherErrorBody.status).to.equal(400); + expect(anotherErrorBody.error).to.deep.equal(serverValidationError); + expect(anotherErrorBody.orders).to.deep.equal([signedOrderWithDifferentCoordinatorOperator]); + expect(anotherErrorBody.coordinatorOperator).to.equal( + `${coordinatorEndpoint}${anotherCoordinatorPort}`, + ); + done(); + }); + }); + it('should throw error when a fill fails', done => { + contractWrappers.coordinator + .fillOrderAsync(signedOrder, takerTokenFillAmount, takerAddress) + .then(res => { + expect(res).to.be.undefined(); + }) + .catch(err => { + expect(err.message).equal(CoordinatorServerErrorMsg.FillFailed); + expect(err.approvedOrders).to.be.empty('array'); + expect(err.cancellations).to.be.empty('array'); + + const errorBody = err.errors[0]; + expect(errorBody.isError).to.be.true(); + expect(errorBody.status).to.equal(400); + expect(errorBody.error).to.deep.equal(serverValidationError); + expect(errorBody.orders).to.deep.equal([signedOrder]); + expect(errorBody.coordinatorOperator).to.equal(`${coordinatorEndpoint}${coordinatorPort}`); + done(); + }); + }); + it('should throw error when batch fill fails with single coordinator operator', done => { + const signedOrders = [signedOrder, signedOrderWithDifferentFeeRecipient]; + const takerAssetFillAmounts = [takerTokenFillAmount, takerTokenFillAmount, takerTokenFillAmount]; + contractWrappers.coordinator + .batchFillOrdersAsync(signedOrders, takerAssetFillAmounts, takerAddress) + .then(res => { + expect(res).to.be.undefined(); + }) + .catch(err => { + expect(err.message).equal(CoordinatorServerErrorMsg.FillFailed); + expect(err.approvedOrders).to.be.empty('array'); + expect(err.cancellations).to.be.empty('array'); + + const errorBody = err.errors[0]; + expect(errorBody.isError).to.be.true(); + expect(errorBody.status).to.equal(400); + expect(errorBody.error).to.deep.equal(serverValidationError); + expect(errorBody.orders).to.deep.equal(signedOrders); + expect(errorBody.coordinatorOperator).to.equal(`${coordinatorEndpoint}${coordinatorPort}`); + done(); + }); + }); + it('should throw consolidated error when batch fill partially fails with different coordinator operators', done => { + nock(`${coordinatorEndpoint}${anotherCoordinatorPort}`) + .post('/v1/request_transaction', () => true) + .query({ + networkId: 50, + }) + .reply(200, serverApprovalSuccess); + + const signedOrders = [signedOrder, signedOrderWithDifferentCoordinatorOperator]; + const takerAssetFillAmounts = [takerTokenFillAmount, takerTokenFillAmount, takerTokenFillAmount]; + contractWrappers.coordinator + .batchFillOrdersAsync(signedOrders, takerAssetFillAmounts, takerAddress) + .then(res => { + expect(res).to.be.undefined(); + }) + .catch(err => { + expect(err.message).equal(CoordinatorServerErrorMsg.FillFailed); + expect(err.approvedOrders).to.deep.equal([signedOrderWithDifferentCoordinatorOperator]); + expect(err.cancellations).to.be.empty('array'); + + const errorBody = err.errors[0]; + expect(errorBody.isError).to.be.true(); + expect(errorBody.status).to.equal(400); + expect(errorBody.error).to.deep.equal(serverValidationError); + expect(errorBody.orders).to.deep.equal([signedOrder]); + expect(errorBody.coordinatorOperator).to.equal(`${coordinatorEndpoint}${coordinatorPort}`); + done(); + }); + }); + it('should throw consolidated error when batch fill totally fails with different coordinator operators', done => { + nock(`${coordinatorEndpoint}${anotherCoordinatorPort}`) + .post('/v1/request_transaction', () => true) + .query({ + networkId: 50, + }) + .reply(400, serverValidationError); + + const signedOrders = [signedOrder, signedOrderWithDifferentCoordinatorOperator]; + const takerAssetFillAmounts = [takerTokenFillAmount, takerTokenFillAmount, takerTokenFillAmount]; + contractWrappers.coordinator + .batchFillOrdersAsync(signedOrders, takerAssetFillAmounts, takerAddress) + .then(res => { + expect(res).to.be.undefined(); + }) + .catch(err => { + expect(err.message).equal(CoordinatorServerErrorMsg.FillFailed); + expect(err.approvedOrders).to.be.empty('array'); + expect(err.cancellations).to.be.empty('array'); + + const errorBody = err.errors[0]; + expect(errorBody.isError).to.be.true(); + expect(errorBody.status).to.equal(400); + expect(errorBody.error).to.deep.equal(serverValidationError); + expect(errorBody.orders).to.deep.equal([signedOrder]); + expect(errorBody.coordinatorOperator).to.equal(`${coordinatorEndpoint}${coordinatorPort}`); + + const anotherErrorBody = err.errors[1]; + expect(anotherErrorBody.isError).to.be.true(); + expect(anotherErrorBody.status).to.equal(400); + expect(anotherErrorBody.error).to.deep.equal(serverValidationError); + expect(anotherErrorBody.orders).to.deep.equal([signedOrderWithDifferentCoordinatorOperator]); + expect(anotherErrorBody.coordinatorOperator).to.equal( + `${coordinatorEndpoint}${anotherCoordinatorPort}`, + ); + done(); + }); + }); + }); +}); +// tslint:disable:max-file-line-count diff --git a/packages/fill-scenarios/src/fill_scenarios.ts b/packages/fill-scenarios/src/fill_scenarios.ts index 2bdb8a19a1..4d5597885b 100644 --- a/packages/fill-scenarios/src/fill_scenarios.ts +++ b/packages/fill-scenarios/src/fill_scenarios.ts @@ -62,6 +62,7 @@ export class FillScenarios { fillableAmount: BigNumber, feeRecipientAddress: string, expirationTimeSeconds?: BigNumber, + senderAddress?: string, ): Promise { return this._createAsymmetricFillableSignedOrderWithFeesAsync( makerAssetData, @@ -74,6 +75,7 @@ export class FillScenarios { fillableAmount, feeRecipientAddress, expirationTimeSeconds, + senderAddress, ); } public async createAsymmetricFillableSignedOrderAsync( @@ -149,6 +151,7 @@ export class FillScenarios { takerFillableAmount: BigNumber, feeRecipientAddress: string, expirationTimeSeconds?: BigNumber, + senderAddress?: string, ): Promise { await this._increaseBalanceAndAllowanceWithAssetDataAsync(makerAssetData, makerAddress, makerFillableAmount); await this._increaseBalanceAndAllowanceWithAssetDataAsync(takerAssetData, takerAddress, takerFillableAmount); @@ -157,7 +160,7 @@ export class FillScenarios { this._increaseERC20BalanceAndAllowanceAsync(this._zrxTokenAddress, makerAddress, makerFee), this._increaseERC20BalanceAndAllowanceAsync(this._zrxTokenAddress, takerAddress, takerFee), ]); - const senderAddress = constants.NULL_ADDRESS; + const _senderAddress = senderAddress ? senderAddress : constants.NULL_ADDRESS; const signedOrder = await orderFactory.createSignedOrderAsync( this._web3Wrapper.getProvider(), @@ -169,7 +172,7 @@ export class FillScenarios { this._exchangeAddress, { takerAddress, - senderAddress, + senderAddress: _senderAddress, makerFee, takerFee, feeRecipientAddress, diff --git a/packages/monorepo-scripts/src/doc_gen_configs.ts b/packages/monorepo-scripts/src/doc_gen_configs.ts index 7a4e6bb2c3..68c07dbb22 100644 --- a/packages/monorepo-scripts/src/doc_gen_configs.ts +++ b/packages/monorepo-scripts/src/doc_gen_configs.ts @@ -38,6 +38,7 @@ export const docGenConfigs: DocGenConfigs = { // and getting confused. Any class name in this list will not have it's constructor rendered in our docs. CLASSES_WITH_HIDDEN_CONSTRUCTORS: [ 'AssetBuyer', + 'CoordinatorWrapper', 'DutchAuctionWrapper', 'ERC20ProxyWrapper', 'ERC20TokenWrapper', @@ -56,9 +57,11 @@ export const docGenConfigs: DocGenConfigs = { 'NonceSubproviderErrors', 'Web3WrapperErrors', 'ContractWrappersError', - 'OrderError', + 'TypedDataError', 'AssetBuyerError', 'ForwarderWrapperError', + 'CoordinatorServerError', + 'CoordinatorServerCancellationResponse', ], // Some libraries only export types. In those cases, we cannot check if the exported types are part of the // "exported public interface". Thus we add them here and skip those checks. diff --git a/packages/order-utils/CHANGELOG.json b/packages/order-utils/CHANGELOG.json index fe19ba8c23..49d7c7a6a9 100644 --- a/packages/order-utils/CHANGELOG.json +++ b/packages/order-utils/CHANGELOG.json @@ -1,4 +1,13 @@ [ + { + "version": "8.0.0", + "changes": [ + { + "note": "Renamed `OrderError` to `TypedDataError`", + "pr": 1792 + } + ] + }, { "version": "7.2.0", "changes": [ diff --git a/packages/order-utils/src/index.ts b/packages/order-utils/src/index.ts index 3d90e7043b..e22cf09236 100644 --- a/packages/order-utils/src/index.ts +++ b/packages/order-utils/src/index.ts @@ -68,7 +68,7 @@ export { } from '@0x/types'; export { - OrderError, + TypedDataError, TradeSide, TransferType, FindFeeOrdersThatCoverFeesForTargetOrdersOpts, diff --git a/packages/order-utils/src/order_validation_utils.ts b/packages/order-utils/src/order_validation_utils.ts index 51ab62141d..b0c2c2b219 100644 --- a/packages/order-utils/src/order_validation_utils.ts +++ b/packages/order-utils/src/order_validation_utils.ts @@ -3,7 +3,7 @@ import { BigNumber, providerUtils } from '@0x/utils'; import { SupportedProvider, ZeroExProvider } from 'ethereum-types'; import * as _ from 'lodash'; -import { OrderError, TradeSide, TransferType } from './types'; +import { TradeSide, TransferType, TypedDataError } from './types'; import { AbstractOrderFilledCancelledFetcher } from './abstract/abstract_order_filled_cancelled_fetcher'; import { constants } from './constants'; @@ -211,7 +211,7 @@ export class OrderValidationUtils { signedOrder.makerAddress, ); if (!isValid) { - throw new Error(OrderError.InvalidSignature); + throw new Error(TypedDataError.InvalidSignature); } const filledTakerTokenAmount = await this._orderFilledCancelledFetcher.getFilledTakerAmountAsync(orderHash); if (signedOrder.takerAssetAmount.eq(filledTakerTokenAmount)) { diff --git a/packages/order-utils/src/signature_utils.ts b/packages/order-utils/src/signature_utils.ts index 6301236d45..bc393f3cf7 100644 --- a/packages/order-utils/src/signature_utils.ts +++ b/packages/order-utils/src/signature_utils.ts @@ -2,7 +2,15 @@ import { ExchangeContract, IValidatorContract, IWalletContract } from '@0x/abi-g import { getContractAddressesForNetworkOrThrow } from '@0x/contract-addresses'; import * as artifacts from '@0x/contract-artifacts'; import { schemas } from '@0x/json-schemas'; -import { ECSignature, Order, SignatureType, SignedOrder, ValidatorSignature } from '@0x/types'; +import { + ECSignature, + Order, + SignatureType, + SignedOrder, + SignedZeroExTransaction, + ValidatorSignature, + ZeroExTransaction, +} from '@0x/types'; import { providerUtils } from '@0x/utils'; import { Web3Wrapper } from '@0x/web3-wrapper'; import { SupportedProvider } from 'ethereum-types'; @@ -12,7 +20,7 @@ import * as _ from 'lodash'; import { assert } from './assert'; import { eip712Utils } from './eip712_utils'; import { orderHashUtils } from './order_hash'; -import { OrderError } from './types'; +import { TypedDataError } from './types'; import { utils } from './utils'; export const signatureUtils = { @@ -278,7 +286,50 @@ export const signatureUtils = { } catch (err) { // Detect if Metamask to transition users to the MetamaskSubprovider if ((provider as any).isMetaMask) { - throw new Error(OrderError.InvalidMetamaskSigner); + throw new Error(TypedDataError.InvalidMetamaskSigner); + } else { + throw err; + } + } + }, + /** + * Signs a ZeroExTransaction using `eth_signTypedData` and returns a SignedZeroExTransaction. + * @param supportedProvider Web3 provider to use for all JSON RPC requests + * @param transaction The ZeroEx Transaction to sign. + * @param signerAddress The hex encoded Ethereum address you wish to sign it with. This address + * must be available via the supplied Provider. + * @return A SignedZeroExTransaction containing the ZeroExTransaction and Elliptic curve signature with Signature Type. + */ + async ecSignTypedDataTransactionAsync( + supportedProvider: SupportedProvider, + transaction: ZeroExTransaction, + signerAddress: string, + ): Promise { + const provider = providerUtils.standardizeOrThrow(supportedProvider); + assert.isETHAddressHex('signerAddress', signerAddress); + assert.doesConformToSchema('transaction', transaction, schemas.zeroExTransactionSchema, [schemas.hexSchema]); + const web3Wrapper = new Web3Wrapper(provider); + await assert.isSenderAddressAsync('signerAddress', signerAddress, web3Wrapper); + const normalizedSignerAddress = signerAddress.toLowerCase(); + const typedData = eip712Utils.createZeroExTransactionTypedData(transaction); + try { + const signature = await web3Wrapper.signTypedDataAsync(normalizedSignerAddress, typedData); + const ecSignatureRSV = parseSignatureHexAsRSV(signature); + const signatureBuffer = Buffer.concat([ + ethUtil.toBuffer(ecSignatureRSV.v), + ethUtil.toBuffer(ecSignatureRSV.r), + ethUtil.toBuffer(ecSignatureRSV.s), + ethUtil.toBuffer(SignatureType.EIP712), + ]); + const signatureHex = `0x${signatureBuffer.toString('hex')}`; + return { + ...transaction, + signature: signatureHex, + }; + } catch (err) { + // Detect if Metamask to transition users to the MetamaskSubprovider + if ((provider as any).isMetaMask) { + throw new Error(TypedDataError.InvalidMetamaskSigner); } else { throw err; } @@ -339,9 +390,9 @@ export const signatureUtils = { } // Detect if Metamask to transition users to the MetamaskSubprovider if ((provider as any).isMetaMask) { - throw new Error(OrderError.InvalidMetamaskSigner); + throw new Error(TypedDataError.InvalidMetamaskSigner); } else { - throw new Error(OrderError.InvalidSignature); + throw new Error(TypedDataError.InvalidSignature); } }, /** diff --git a/packages/order-utils/src/types.ts b/packages/order-utils/src/types.ts index 55ec553dbd..5afd07b112 100644 --- a/packages/order-utils/src/types.ts +++ b/packages/order-utils/src/types.ts @@ -1,6 +1,6 @@ import { BigNumber } from '@0x/utils'; -export enum OrderError { +export enum TypedDataError { InvalidSignature = 'INVALID_SIGNATURE', InvalidMetamaskSigner = "MetaMask provider must be wrapped in a MetamaskSubprovider (from the '@0x/subproviders' package) in order to work with this method.", } diff --git a/packages/pipeline/package.json b/packages/pipeline/package.json index 5e9188588b..bfd9468d27 100644 --- a/packages/pipeline/package.json +++ b/packages/pipeline/package.json @@ -30,7 +30,7 @@ "devDependencies": { "@0x/tslint-config": "^3.0.1", "@types/axios": "^0.14.0", - "@types/ramda": "^0.25.38", + "@types/ramda": "^0.26.8", "chai": "^4.0.1", "chai-as-promised": "^7.1.0", "chai-bignumber": "^3.0.0", @@ -60,9 +60,9 @@ "ethereum-types": "^2.1.2", "pg": "^7.5.0", "prettier": "^1.16.3", - "ramda": "^0.25.0", + "ramda": "^0.26.1", "reflect-metadata": "^0.1.12", "sqlite3": "^4.0.2", - "typeorm": "^0.2.7" + "typeorm": "0.2.7" } } diff --git a/packages/pipeline/src/scripts/pull_radar_relay_orders.ts b/packages/pipeline/src/scripts/pull_radar_relay_orders.ts index 8e87208039..d032ab4880 100644 --- a/packages/pipeline/src/scripts/pull_radar_relay_orders.ts +++ b/packages/pipeline/src/scripts/pull_radar_relay_orders.ts @@ -32,7 +32,7 @@ async function getOrderbookAsync(): Promise { // Parse the sra orders, then add source url to each. const orders = R.pipe( parseSraOrders, - R.map(setSourceUrl(RADAR_RELAY_URL)), + R.map(o => R.set(sourceUrlProp, RADAR_RELAY_URL, o)), )(rawOrders); // Save all the orders and update the observed time stamps in a single // transaction. @@ -50,13 +50,3 @@ async function getOrderbookAsync(): Promise { } const sourceUrlProp = R.lensProp('sourceUrl'); - -/** - * Sets the source url for a single order. Returns a new order instead of - * mutating the given one. - */ -const setSourceUrl = R.curry( - (sourceURL: string, order: SraOrder): SraOrder => { - return R.set(sourceUrlProp, sourceURL, order); - }, -); diff --git a/packages/website/ts/utils/utils.ts b/packages/website/ts/utils/utils.ts index bdd7afa199..5944e34c6b 100644 --- a/packages/website/ts/utils/utils.ts +++ b/packages/website/ts/utils/utils.ts @@ -1,5 +1,5 @@ import { ContractWrappersError } from '@0x/contract-wrappers'; -import { assetDataUtils, OrderError } from '@0x/order-utils'; +import { assetDataUtils, TypedDataError } from '@0x/order-utils'; import { constants as sharedConstants, Networks } from '@0x/react-shared'; import { ExchangeContractErrs } from '@0x/types'; import { BigNumber } from '@0x/utils'; @@ -232,7 +232,7 @@ export const utils = { zeroExErrToHumanReadableErrMsg(error: ContractWrappersError | ExchangeContractErrs, takerAddress: string): string { const ContractWrappersErrorToHumanReadableError: { [error: string]: string } = { [BlockchainCallErrs.UserHasNoAssociatedAddresses]: 'User has no addresses available', - [OrderError.InvalidSignature]: 'Order signature is not valid', + [TypedDataError.InvalidSignature]: 'Order signature is not valid', [ContractWrappersError.ContractNotDeployedOnNetwork]: 'Contract is not deployed on the detected network', [ContractWrappersError.InvalidJump]: 'Invalid jump occured while executing the transaction', [ContractWrappersError.OutOfGas]: 'Transaction ran out of gas', diff --git a/python-packages/contract_artifacts/src/zero_ex/contract_artifacts/artifacts/Coordinator.json b/python-packages/contract_artifacts/src/zero_ex/contract_artifacts/artifacts/Coordinator.json index 3c56715a8d..d7f985e8d9 100644 --- a/python-packages/contract_artifacts/src/zero_ex/contract_artifacts/artifacts/Coordinator.json +++ b/python-packages/contract_artifacts/src/zero_ex/contract_artifacts/artifacts/Coordinator.json @@ -27,7 +27,7 @@ "type": "function" }, { - "constant": false, + "constant": true, "inputs": [ { "components": [ @@ -46,32 +46,58 @@ ], "name": "transaction", "type": "tuple" - }, - { - "name": "txOrigin", - "type": "address" - }, + } + ], + "name": "getTransactionHash", + "outputs": [ { - "name": "transactionSignature", - "type": "bytes" - }, + "name": "transactionHash", + "type": "bytes32" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ { - "name": "approvalExpirationTimeSeconds", - "type": "uint256[]" - }, + "components": [ + { + "name": "txOrigin", + "type": "address" + }, + { + "name": "transactionHash", + "type": "bytes32" + }, + { + "name": "transactionSignature", + "type": "bytes" + }, + { + "name": "approvalExpirationTimeSeconds", + "type": "uint256" + } + ], + "name": "approval", + "type": "tuple" + } + ], + "name": "getCoordinatorApprovalHash", + "outputs": [ { - "name": "approvalSignatures", - "type": "bytes[]" + "name": "approvalHash", + "type": "bytes32" } ], - "name": "executeTransaction", - "outputs": [], "payable": false, - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "constant": true, + "constant": false, "inputs": [ { "components": [ @@ -108,16 +134,16 @@ "type": "bytes[]" } ], - "name": "assertValidCoordinatorApprovals", + "name": "executeTransaction", "outputs": [], "payable": false, - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [], - "name": "EIP712_DOMAIN_HASH", + "name": "EIP712_EXCHANGE_DOMAIN_HASH", "outputs": [ { "name": "", @@ -149,6 +175,39 @@ "name": "transaction", "type": "tuple" }, + { + "name": "txOrigin", + "type": "address" + }, + { + "name": "transactionSignature", + "type": "bytes" + }, + { + "name": "approvalExpirationTimeSeconds", + "type": "uint256[]" + }, + { + "name": "approvalSignatures", + "type": "bytes[]" + } + ], + "name": "assertValidCoordinatorApprovals", + "outputs": [], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "data", + "type": "bytes" + } + ], + "name": "decodeOrdersFromFillData", + "outputs": [ { "components": [ { @@ -202,26 +261,22 @@ ], "name": "orders", "type": "tuple[]" - }, - { - "name": "txOrigin", - "type": "address" - }, - { - "name": "transactionSignature", - "type": "bytes" - }, - { - "name": "approvalExpirationTimeSeconds", - "type": "uint256[]" - }, + } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "EIP712_COORDINATOR_DOMAIN_HASH", + "outputs": [ { - "name": "approvalSignatures", - "type": "bytes[]" + "name": "", + "type": "bytes32" } ], - "name": "assertValidTransactionOrdersApproval", - "outputs": [], "payable": false, "stateMutability": "view", "type": "function" @@ -241,9 +296,16 @@ "evm": { "bytecode": { "linkReferences": {}, - "object": "0x60806040523480156200001157600080fd5b506040516020806200238083398101806040526200003391908101906200022b565b604080517f454950373132446f6d61696e28000000000000000000000000000000000000006020808301919091527f737472696e67206e616d652c0000000000000000000000000000000000000000602d8301527f737472696e672076657273696f6e2c000000000000000000000000000000000060398301527f6164647265737320766572696679696e67436f6e74726163740000000000000060488301527f29000000000000000000000000000000000000000000000000000000000000006061830152825180830360420181526062830180855281519183019190912060a28401855260179091527f30782050726f746f636f6c20436f6f7264696e61746f7200000000000000000060829093019290925282518084018452600581527f312e302e30000000000000000000000000000000000000000000000000000000908201528251808201929092527f626d101e477fd17dd52afb3f9ad9eb016bf60f6e377877f34e8f3ea84c930236828401527f06c015bd22b4c69690933c1058878ebdfef31f9aaae40bbe86d8a09fe1b2972c6060830152306080808401919091528351808403909101815260a0909201909252805191012060005560018054600160a060020a031916600160a060020a039290921691909117905562000273565b600062000224825162000260565b9392505050565b6000602082840312156200023e57600080fd5b60006200024c848462000216565b949350505050565b600160a060020a031690565b60006200026d8262000254565b92915050565b6120fd80620002836000396000f3fe608060405234801561001057600080fd5b5060043610610084576000357c010000000000000000000000000000000000000000000000000000000090048063d2df07331161006d578063d2df0733146100c7578063e306f779146100da578063e3b1aa86146100ef57610084565b80630f7d8e391461008957806390c3bc3f146100b2575b600080fd5b61009c610097366004611888565b610102565b6040516100a99190611e6f565b60405180910390f35b6100c56100c036600461196e565b6104f7565b005b6100c56100d536600461196e565b6105a3565b6100e26105d4565b6040516100a99190611e7d565b6100c56100fd366004611a42565b6105da565b6000808251111515610149576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090611f3b565b60405180910390fd5b600061015483610821565b7f010000000000000000000000000000000000000000000000000000000000000090049050600360ff8216106101b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090611efb565b60008160ff1660038111156101c757fe5b905060008160038111156101d757fe5b141561020f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090611f2b565b600181600381111561021d57fe5b141561035b57835160411461025e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090611e8b565b600084600081518110151561026f57fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090819004810204905060006102b186600163ffffffff6108e516565b905060006102c687602163ffffffff6108e516565b905060018884848460405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015610325573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015196506104f195505050505050565b600281600381111561036957fe5b14156104bf5783516041146103aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090611e8b565b60008460008151811015156103bb57fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090819004810204905060006103fd86600163ffffffff6108e516565b9050600061041287602163ffffffff6108e516565b905060018860405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012084848460405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015610325573d6000803e3d6000fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090611efb565b92915050565b61050485858585856105a3565b6001548551602087015160408089015190517fbfc8bfce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9094169363bfc8bfce9361056a93909290918990600401611f5b565b600060405180830381600087803b15801561058457600080fd5b505af1158015610598573d6000803e3d6000fd5b505050505050505050565b60606105b28660400151610930565b90506000815111156105cc576105cc8682878787876105da565b505050505050565b60005481565b3273ffffffffffffffffffffffffffffffffffffffff851614610629576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090611f0b565b600061063487610de8565b60408051600080825260208201909252845192935091905b80821461073c576000868281518110151561066357fe5b906020019060200201519050610677611220565b506040805160808101825273ffffffffffffffffffffffffffffffffffffffff8b16815260208101879052908101899052606081018290524282116106e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090611edb565b60006106f382610dfb565b90506000610718828a8781518110151561070957fe5b90602001906020020151610102565b905061072a878263ffffffff610e0916565b9650506001909301925061064c915050565b5061074d823263ffffffff610e0916565b885190925060005b8082146108145789516000908b908390811061076d57fe5b906020019060200201516060015173ffffffffffffffffffffffffffffffffffffffff16141561079c5761080c565b60008a828151811015156107ac57fe5b6020908102909101015160400151905060006107ce868363ffffffff610ed316565b9050801515610809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090611e9b565b50505b600101610755565b5050505050505050505050565b600080825111151561085f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090611f1b565b815182907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190811061088f57fe5b016020015182517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01909252507f0100000000000000000000000000000000000000000000000000000000000000908190040290565b600081602001835110151515610927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090611eeb565b50016020015190565b60606000610944838263ffffffff610f1016565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167fb4be83d50000000000000000000000000000000000000000000000000000000014806109d757507fffffffff0000000000000000000000000000000000000000000000000000000081167f3e228bae00000000000000000000000000000000000000000000000000000000145b80610a2357507fffffffff0000000000000000000000000000000000000000000000000000000081167f64a3bc1500000000000000000000000000000000000000000000000000000000145b15610aad57610a30611248565b8351610a4690859060049063ffffffff610f7d16565b806020019051610a5991908101906118da565b604080516001808252818301909252919250816020015b610a78611248565b815260200190600190039081610a7057905050925080836000815181101515610a9d57fe5b6020908102909101015250610de2565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f297bb70b000000000000000000000000000000000000000000000000000000001480610b3e57507fffffffff0000000000000000000000000000000000000000000000000000000081167f50dde19000000000000000000000000000000000000000000000000000000000145b80610b8a57507fffffffff0000000000000000000000000000000000000000000000000000000081167f4d0ae54600000000000000000000000000000000000000000000000000000000145b80610bd657507fffffffff0000000000000000000000000000000000000000000000000000000081167fe5fa431b00000000000000000000000000000000000000000000000000000000145b80610c2257507fffffffff0000000000000000000000000000000000000000000000000000000081167fa3e2038000000000000000000000000000000000000000000000000000000000145b80610c6e57507fffffffff0000000000000000000000000000000000000000000000000000000081167f7e1d980800000000000000000000000000000000000000000000000000000000145b80610cba57507fffffffff0000000000000000000000000000000000000000000000000000000081167fdd1c7d1800000000000000000000000000000000000000000000000000000000145b15610cef578251610cd590849060049063ffffffff610f7d16565b806020019051610ce8919081019061184b565b9150610de2565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f3c28d861000000000000000000000000000000000000000000000000000000001415610de257610d41611248565b610d49611248565b8451610d5f90869060049063ffffffff610f7d16565b806020019051610d72919081019061190f565b60408051600280825260608201909252929450909250816020015b610d95611248565b815260200190600190039081610d8d57905050935081846000815181101515610dba57fe5b602090810290910101528351819085906001908110610dd557fe5b6020908102909101015250505b50919050565b60006104f1610df683611049565b6110b7565b60006104f1610df6836110f7565b815160405160609184906020808202808401820192910182851015610e5a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090611ecb565b82851115610e7457610e6d858583611156565b8497508793505b600182019150602081019050808401925082945081885284604052868860018403815181101515610ea157fe5b73ffffffffffffffffffffffffffffffffffffffff909216602092830290910190910152508694505050505092915050565b6000602083510260208401818101815b81811015610f0657805180871415610efd57600195508291505b50602001610ee3565b5050505092915050565b600081600401835110151515610f52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090611f4b565b5001602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b606081831115610fb9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090611eab565b8351821115610ff4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090611ebb565b8282036040519080825280601f01601f191660200182016040528015611021576020820181803883390190505b5090506110426110308261121a565b8461103a8761121a565b018351611156565b9392505050565b604081810151825160209384015182519285019290922083517f213c6f636f3ea94e701c0adf9b2624aa45a6c694f9a292c094f9a81c24b5df4c81529485019190915273ffffffffffffffffffffffffffffffffffffffff9091169183019190915260608201526080902090565b6000546040517f19010000000000000000000000000000000000000000000000000000000000008152600281019190915260228101919091526042902090565b604080820151825160208085015160608681015185519584019590952086517f2fbcdbaa76bc7589916958ae919dfbef04d23f6bbf26de6ff317b32c6cc01e058152938401949094529482015292830152608082015260a09020919050565b6020811015611180576001816020036101000a038019835116818551168082178652505050611215565b8282141561118d57611215565b828211156111c75760208103905080820181840181515b828510156111bf5784518652602095860195909401936111a4565b905250611215565b60208103905080820181840183515b8186121561121057825182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe092830192909101906111d6565b855250505b505050565b60200190565b6040805160808101825260008082526020820181905260609282018390529181019190915290565b61018060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160608152602001606081525090565b60006110428235612038565b60006110428251612038565b6000601f8201831361132b57600080fd5b813561133e61133982611fcd565b611fa6565b81815260209384019390925082018360005b83811015610f06578135860161136688826114b2565b8452506020928301929190910190600101611350565b6000601f8201831361138d57600080fd5b815161139b61133982611fcd565b81815260209384019390925082018360005b83811015610f0657815186016113c38882611690565b84525060209283019291909101906001016113ad565b6000601f820183136113ea57600080fd5b81356113f861133982611fcd565b81815260209384019390925082018360005b83811015610f0657813586016114208882611547565b845250602092830192919091019060010161140a565b6000601f8201831361144757600080fd5b813561145561133982611fcd565b9150818183526020840193506020810190508385602084028201111561147a57600080fd5b60005b83811015610f06578161149088826114a6565b845250602092830192919091019060010161147d565b60006110428235612043565b6000601f820183136114c357600080fd5b81356114d161133982611fee565b915080825260208301602083018583830111156114ed57600080fd5b6114f883828461205f565b50505092915050565b6000601f8201831361151257600080fd5b815161152061133982611fee565b9150808252602083016020830185838301111561153c57600080fd5b6114f883828461206b565b6000610180828403121561155a57600080fd5b611565610180611fa6565b905060006115738484611302565b825250602061158484848301611302565b602083015250604061159884828501611302565b60408301525060606115ac84828501611302565b60608301525060806115c0848285016114a6565b60808301525060a06115d4848285016114a6565b60a08301525060c06115e8848285016114a6565b60c08301525060e06115fc848285016114a6565b60e083015250610100611611848285016114a6565b61010083015250610120611627848285016114a6565b6101208301525061014082013567ffffffffffffffff81111561164957600080fd5b611655848285016114b2565b6101408301525061016082013567ffffffffffffffff81111561167757600080fd5b611683848285016114b2565b6101608301525092915050565b600061018082840312156116a357600080fd5b6116ae610180611fa6565b905060006116bc848461130e565b82525060206116cd8484830161130e565b60208301525060406116e18482850161130e565b60408301525060606116f58482850161130e565b60608301525060806117098482850161183f565b60808301525060a061171d8482850161183f565b60a08301525060c06117318482850161183f565b60c08301525060e06117458482850161183f565b60e08301525061010061175a8482850161183f565b610100830152506101206117708482850161183f565b6101208301525061014082015167ffffffffffffffff81111561179257600080fd5b61179e84828501611501565b6101408301525061016082015167ffffffffffffffff8111156117c057600080fd5b61168384828501611501565b6000606082840312156117de57600080fd5b6117e86060611fa6565b905060006117f684846114a6565b825250602061180784848301611302565b602083015250604082013567ffffffffffffffff81111561182757600080fd5b611833848285016114b2565b60408301525092915050565b60006110428251612043565b60006020828403121561185d57600080fd5b815167ffffffffffffffff81111561187457600080fd5b6118808482850161137c565b949350505050565b6000806040838503121561189b57600080fd5b60006118a785856114a6565b925050602083013567ffffffffffffffff8111156118c457600080fd5b6118d0858286016114b2565b9150509250929050565b6000602082840312156118ec57600080fd5b815167ffffffffffffffff81111561190357600080fd5b61188084828501611690565b6000806040838503121561192257600080fd5b825167ffffffffffffffff81111561193957600080fd5b61194585828601611690565b925050602083015167ffffffffffffffff81111561196257600080fd5b6118d085828601611690565b600080600080600060a0868803121561198657600080fd5b853567ffffffffffffffff81111561199d57600080fd5b6119a9888289016117cc565b95505060206119ba88828901611302565b945050604086013567ffffffffffffffff8111156119d757600080fd5b6119e3888289016114b2565b935050606086013567ffffffffffffffff811115611a0057600080fd5b611a0c88828901611436565b925050608086013567ffffffffffffffff811115611a2957600080fd5b611a358882890161131a565b9150509295509295909350565b60008060008060008060c08789031215611a5b57600080fd5b863567ffffffffffffffff811115611a7257600080fd5b611a7e89828a016117cc565b965050602087013567ffffffffffffffff811115611a9b57600080fd5b611aa789828a016113d9565b9550506040611ab889828a01611302565b945050606087013567ffffffffffffffff811115611ad557600080fd5b611ae189828a016114b2565b935050608087013567ffffffffffffffff811115611afe57600080fd5b611b0a89828a01611436565b92505060a087013567ffffffffffffffff811115611b2757600080fd5b611b3389828a0161131a565b9150509295509295509295565b611b4981612038565b82525050565b611b4981612043565b6000611b6382612034565b808452611b7781602086016020860161206b565b611b808161209b565b9093016020019392505050565b601281527f4c454e4754485f36355f52455155495245440000000000000000000000000000602082015260400190565b601a81527f494e56414c49445f415050524f56414c5f5349474e4154555245000000000000602082015260400190565b601a81527f46524f4d5f4c4553535f5448414e5f544f5f5245515549524544000000000000602082015260400190565b601c81527f544f5f4c4553535f5448414e5f4c454e4754485f524551554952454400000000602082015260400190565b601781527f494e56414c49445f465245455f4d454d4f52595f505452000000000000000000602082015260400190565b601081527f415050524f56414c5f4558504952454400000000000000000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601581527f5349474e41545552455f554e535550504f525445440000000000000000000000602082015260400190565b600e81527f494e56414c49445f4f524947494e000000000000000000000000000000000000602082015260400190565b602181527f475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524560208201527f4400000000000000000000000000000000000000000000000000000000000000604082015260600190565b601181527f5349474e41545552455f494c4c4547414c000000000000000000000000000000602082015260400190565b601e81527f4c454e4754485f475245415445525f5448414e5f305f52455155495245440000602082015260400190565b602581527f475245415445525f4f525f455155414c5f544f5f345f4c454e4754485f52455160208201527f5549524544000000000000000000000000000000000000000000000000000000604082015260600190565b602081016104f18284611b40565b602081016104f18284611b4f565b602080825281016104f181611b8d565b602080825281016104f181611bbd565b602080825281016104f181611bed565b602080825281016104f181611c1d565b602080825281016104f181611c4d565b602080825281016104f181611c7d565b602080825281016104f181611cad565b602080825281016104f181611d03565b602080825281016104f181611d33565b602080825281016104f181611d63565b602080825281016104f181611db9565b602080825281016104f181611de9565b602080825281016104f181611e19565b60808101611f698287611b4f565b611f766020830186611b40565b8181036040830152611f888185611b58565b90508181036060830152611f9c8184611b58565b9695505050505050565b60405181810167ffffffffffffffff81118282101715611fc557600080fd5b604052919050565b600067ffffffffffffffff821115611fe457600080fd5b5060209081020190565b600067ffffffffffffffff82111561200557600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b5190565b60006104f182612046565b90565b73ffffffffffffffffffffffffffffffffffffffff1690565b82818337506000910152565b60005b8381101561208657818101518382015260200161206e565b83811115612095576000848401525b50505050565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169056fea265627a7a7230582013be4e9e281ff59b6be3d1c4c7af6075c7d255edc60be429d25841f98f287b3e6c6578706572696d656e74616cf50037" + "object": "0x60806040523480156200001157600080fd5b506040516020806200235b833981018060405262000033919081019062000252565b600080546001600160a01b0319166001600160a01b0383161790556040516200005f906020016200029f565b60408051601f1981840301815282825280516020918201208383018352601784527f30782050726f746f636f6c20436f6f7264696e61746f720000000000000000009382019390935281518083018352600581527f312e302e300000000000000000000000000000000000000000000000000000009082015290516200012d92917f626d101e477fd17dd52afb3f9ad9eb016bf60f6e377877f34e8f3ea84c930236917f06c015bd22b4c69690933c1058878ebdfef31f9aaae40bbe86d8a09fe1b2972c9130910162000284565b60408051601f198184030181529082905280516020918201206001556200015591016200029f565b60408051601f1981840301815282825280516020918201208383018352600b84527f30782050726f746f636f6c0000000000000000000000000000000000000000009382019390935281518083018352600181527f32000000000000000000000000000000000000000000000000000000000000009082015260005491516200023093927ff0f24618f4c4be1e62e026fb039a20ef96f4495294817d1027ffaa6d1f70e61e927fad7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a5926001600160a01b03909216910162000284565b60408051601f1981840301815291905280516020909101206002555062000360565b6000602082840312156200026557600080fd5b81516001600160a01b03811681146200027d57600080fd5b9392505050565b93845260208401929092526040830152606082015260800190565b7f454950373132446f6d61696e280000000000000000000000000000000000000081527f737472696e67206e616d652c0000000000000000000000000000000000000000600d8201527f737472696e672076657273696f6e2c000000000000000000000000000000000060198201527f6164647265737320766572696679696e67436f6e74726163740000000000000060288201527f2900000000000000000000000000000000000000000000000000000000000000604182015260420190565b611feb80620003706000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063c26cfecd1161005b578063c26cfecd146100fe578063d2df073314610106578063ee55b96814610119578063fb6961cc1461013957610088565b80630f7d8e391461008d57806323872f55146100b657806348a321d6146100d657806390c3bc3f146100e9575b600080fd5b6100a061009b3660046115d7565b610141565b6040516100ad9190611958565b60405180910390f35b6100c96100c436600461177c565b6104d4565b6040516100ad9190611aad565b6100c96100e436600461165b565b6104e7565b6100fc6100f73660046117b1565b6104fa565b005b6100c96105a6565b6100fc6101143660046117b1565b6105ac565b61012c61012736600461161e565b6105db565b6040516100ad9190611979565b6100c9610a8f565b600080825111610186576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611d7d565b60405180910390fd5b600061019183610a95565b60f81c9050600481106101d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611c7b565b60008160ff1660048111156101e157fe5b905060008160048111156101f157fe5b1415610229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611d46565b600181600481111561023757fe5b14156102a857835115610276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611e48565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611db4565b60028160048111156102b657fe5b14156103bb5783516041146102f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611ad4565b60008460008151811061030657fe5b016020015160f890811c811b901c9050600061032986600163ffffffff610b1816565b9050600061033e87602163ffffffff610b1816565b9050600188848484604051600081526020016040526040516103639493929190611ab6565b6020604051602081039080840390855afa158015610385573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015196506104ce95505050505050565b60038160048111156103c957fe5b141561049c57835160411461040a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611ad4565b60008460008151811061041957fe5b016020015160f890811c811b901c9050600061043c86600163ffffffff610b1816565b9050600061045187602163ffffffff610b1816565b90506001886040516020016104669190611927565b60405160208183030381529060405280519060200120848484604051600081526020016040526040516103639493929190611ab6565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611c7b565b92915050565b60006104ce6104e283610b61565b610bcf565b60006104ce6104f583610bdd565b610c3c565b61050785858585856105ac565b6000548551602087015160408089015190517fbfc8bfce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9094169363bfc8bfce9361056d93909290918990600401611e7f565b600060405180830381600087803b15801561058757600080fd5b505af115801561059b573d6000803e3d6000fd5b505050505050505050565b60025481565b60606105bb86604001516105db565b8051909150156105d3576105d3868287878787610c4a565b505050505050565b606060006105ef838263ffffffff610e9816565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167fb4be83d500000000000000000000000000000000000000000000000000000000148061068257507fffffffff0000000000000000000000000000000000000000000000000000000081167f3e228bae00000000000000000000000000000000000000000000000000000000145b806106ce57507fffffffff0000000000000000000000000000000000000000000000000000000081167f64a3bc1500000000000000000000000000000000000000000000000000000000145b15610757576106db6111db565b83516106f190859060049063ffffffff610f0316565b80602001905161070491908101906116ed565b604080516001808252818301909252919250816020015b6107236111db565b81526020019060019003908161071b579050509250808360008151811061074657fe5b602002602001018190525050610a89565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f297bb70b0000000000000000000000000000000000000000000000000000000014806107e857507fffffffff0000000000000000000000000000000000000000000000000000000081167f50dde19000000000000000000000000000000000000000000000000000000000145b8061083457507fffffffff0000000000000000000000000000000000000000000000000000000081167f4d0ae54600000000000000000000000000000000000000000000000000000000145b8061088057507fffffffff0000000000000000000000000000000000000000000000000000000081167fe5fa431b00000000000000000000000000000000000000000000000000000000145b806108cc57507fffffffff0000000000000000000000000000000000000000000000000000000081167fa3e2038000000000000000000000000000000000000000000000000000000000145b8061091857507fffffffff0000000000000000000000000000000000000000000000000000000081167f7e1d980800000000000000000000000000000000000000000000000000000000145b8061096457507fffffffff0000000000000000000000000000000000000000000000000000000081167fdd1c7d1800000000000000000000000000000000000000000000000000000000145b1561099957825161097f90849060049063ffffffff610f0316565b806020019051610992919081019061154b565b9150610a89565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f3c28d861000000000000000000000000000000000000000000000000000000001415610a89576109eb6111db565b6109f36111db565b8451610a0990869060049063ffffffff610f0316565b806020019051610a1c9190810190611722565b60408051600280825260608201909252929450909250816020015b610a3f6111db565b815260200190600190039081610a375790505093508184600081518110610a6257fe5b60200260200101819052508084600181518110610a7b57fe5b602002602001018190525050505b50919050565b60015481565b600080825111610ad1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611ce9565b81600183510381518110610ae157fe5b016020015182517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019092525060f890811c901b90565b60008160200183511015610b58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611c1e565b50016020015190565b604081810151825160209384015182519285019290922083517f213c6f636f3ea94e701c0adf9b2624aa45a6c694f9a292c094f9a81c24b5df4c81529485019190915273ffffffffffffffffffffffffffffffffffffffff9091169183019190915260608201526080902090565b60006104ce60025483610fcf565b604080820151825160208085015160608681015185519584019590952086517f2fbcdbaa76bc7589916958ae919dfbef04d23f6bbf26de6ff317b32c6cc01e058152938401949094529482015292830152608082015260a09020919050565b60006104ce60015483610fcf565b3273ffffffffffffffffffffffffffffffffffffffff851614610c99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611cb2565b6000610ca4876104d4565b60408051600080825260208201909252845192935091905b818114610da5576000868281518110610cd157fe5b60200260200101519050610ce3611294565b60405180608001604052808b73ffffffffffffffffffffffffffffffffffffffff1681526020018781526020018a8152602001838152509050428211610d55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611be7565b6000610d60826104e7565b90506000610d81828a8781518110610d7457fe5b6020026020010151610141565b9050610d93878263ffffffff61100916565b96505060019093019250610cbc915050565b50610db6823263ffffffff61100916565b885190925060005b818114610e8b57600073ffffffffffffffffffffffffffffffffffffffff168a8281518110610de957fe5b60200260200101516060015173ffffffffffffffffffffffffffffffffffffffff161415610e1657610e83565b60008a8281518110610e2457fe5b60200260200101516040015190506000610e4782876110d090919063ffffffff16565b905080610e80576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611b0b565b50505b600101610dbe565b5050505050505050505050565b60008160040183511015610ed8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611deb565b5001602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b606081831115610f3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611b42565b8351821115610f7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611b79565b8282036040519080825280601f01601f191660200182016040528015610fa7576020820181803883390190505b509050610fc8610fb682611111565b84610fc087611111565b018351611117565b9392505050565b6040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b81516040516060918490602080820280840182019291018285101561105a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611bb0565b828511156110745761106d858583611117565b8497508793505b6001820191506020810190508084019250829450818852846040528688600184038151811061109f57fe5b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015250959695505050505050565b60006020835102602084018181018192505b80831015611108578251808614156110fc57600194508193505b506020830192506110e2565b50505092915050565b60200190565b6020811015611141576001816020036101000a0380198351168185511680821786525050506111d6565b8282141561114e576111d6565b828211156111885760208103905080820181840181515b82851015611180578451865260209586019590940193611165565b9052506111d6565b60208103905080820181840183515b818612156111d157825182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09283019290910190611197565b855250505b505050565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160608152602001606081525090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000801916815260200160608152602001600081525090565b80516104ce81611f8c565b600082601f8301126112f0578081fd5b81356113036112fe82611ef8565b611ed1565b8181529150602080830190840160005b838110156113405761132b876020843589010161134a565b83526020928301929190910190600101611313565b5050505092915050565b600082601f83011261135a578081fd5b81356113686112fe82611f19565b915080825283602082850101111561137f57600080fd5b8060208401602084013760009082016020015292915050565b600082601f8301126113a957600080fd5b81516113b76112fe82611f19565b91508082528360208285010111156113ce57600080fd5b6113df816020840160208601611f5c565b5092915050565b60006101808083850312156113f9578182fd5b61140281611ed1565b91505061140f83836112d5565b815261141e83602084016112d5565b602082015261143083604084016112d5565b604082015261144283606084016112d5565b60608201526080820151608082015260a082015160a082015260c082015160c082015260e082015160e08201526101008083015181830152506101208083015181830152506101408083015167ffffffffffffffff808211156114a457600080fd5b6114b086838701611398565b838501526101609250828501519150808211156114cc57600080fd5b506114d985828601611398565b82840152505092915050565b6000606082840312156114f6578081fd5b6115006060611ed1565b905081358152602082013561151481611f8c565b6020820152604082013567ffffffffffffffff81111561153357600080fd5b61153f8482850161134a565b60408301525092915050565b6000602080838503121561155d578182fd5b825167ffffffffffffffff811115611573578283fd5b80840185601f820112611584578384fd5b805191506115946112fe83611ef8565b82815283810190828501865b858110156115c9576115b78a8884518801016113e6565b845292860192908601906001016115a0565b509098975050505050505050565b600080604083850312156115ea57600080fd5b82359150602083013567ffffffffffffffff81111561160857600080fd5b6116148582860161134a565b9150509250929050565b60006020828403121561163057600080fd5b813567ffffffffffffffff81111561164757600080fd5b6116538482850161134a565b949350505050565b60006020828403121561166c578081fd5b813567ffffffffffffffff80821115611683578283fd5b81840160808187031215611695578384fd5b61169f6080611ed1565b925080356116ac81611f8c565b8352602081810135908401526040810135828111156116c9578485fd5b6116d58782840161134a565b60408501525060609081013590830152509392505050565b6000602082840312156116ff57600080fd5b815167ffffffffffffffff81111561171657600080fd5b611653848285016113e6565b6000806040838503121561173557600080fd5b825167ffffffffffffffff8082111561174d57600080fd5b611759868387016113e6565b9350602085015191508082111561176f57600080fd5b50611614858286016113e6565b60006020828403121561178e57600080fd5b813567ffffffffffffffff8111156117a557600080fd5b611653848285016114e5565b600080600080600060a086880312156117c8578081fd5b853567ffffffffffffffff808211156117df578283fd5b6117eb89838a016114e5565b965060209150818801356117fe81611f8c565b9550604088013581811115611811578384fd5b61181d8a828b0161134a565b955050606088013581811115611831578384fd5b8089018a601f820112611842578485fd5b803591506118526112fe83611ef8565b82815284810190828601868502840187018e101561186e578788fd5b8793505b84841015611890578035835260019390930192918601918601611872565b50965050505060808801359150808211156118a9578283fd5b506118b6888289016112e0565b9150509295509295909350565b73ffffffffffffffffffffffffffffffffffffffff169052565b600081518084526118f5816020860160208601611f5c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600060208083018184528085518083526040860191506040848202870101925083870160005b82811015611aa0577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845281516101806119de8783516118c3565b878201516119ee898901826118c3565b506040820151611a0160408901826118c3565b506060820151611a1460608901826118c3565b506080820151608088015260a082015160a088015260c082015160c088015260e082015160e08801526101008083015181890152506101208083015181890152506101408083015182828a0152611a6d838a01826118dd565b915050610160915081830151888203838a0152611a8a82826118dd565b985050509487019450509085019060010161199f565b5092979650505050505050565b90815260200190565b93845260ff9290921660208401526040830152606082015260800190565b60208082526012908201527f4c454e4754485f36355f52455155495245440000000000000000000000000000604082015260600190565b6020808252601a908201527f494e56414c49445f415050524f56414c5f5349474e4154555245000000000000604082015260600190565b6020808252601a908201527f46524f4d5f4c4553535f5448414e5f544f5f5245515549524544000000000000604082015260600190565b6020808252601c908201527f544f5f4c4553535f5448414e5f4c454e4754485f524551554952454400000000604082015260600190565b60208082526017908201527f494e56414c49445f465245455f4d454d4f52595f505452000000000000000000604082015260600190565b60208082526010908201527f415050524f56414c5f4558504952454400000000000000000000000000000000604082015260600190565b60208082526026908201527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560408201527f5155495245440000000000000000000000000000000000000000000000000000606082015260800190565b60208082526015908201527f5349474e41545552455f554e535550504f525445440000000000000000000000604082015260600190565b6020808252600e908201527f494e56414c49445f4f524947494e000000000000000000000000000000000000604082015260600190565b60208082526021908201527f475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524560408201527f4400000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526011908201527f5349474e41545552455f494c4c4547414c000000000000000000000000000000604082015260600190565b6020808252601e908201527f4c454e4754485f475245415445525f5448414e5f305f52455155495245440000604082015260600190565b60208082526011908201527f5349474e41545552455f494e56414c4944000000000000000000000000000000604082015260600190565b60208082526025908201527f475245415445525f4f525f455155414c5f544f5f345f4c454e4754485f52455160408201527f5549524544000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526011908201527f4c454e4754485f305f5245515549524544000000000000000000000000000000604082015260600190565b600085825273ffffffffffffffffffffffffffffffffffffffff8516602083015260806040830152611eb460808301856118dd565b8281036060840152611ec681856118dd565b979650505050505050565b60405181810167ffffffffffffffff81118282101715611ef057600080fd5b604052919050565b600067ffffffffffffffff821115611f0f57600080fd5b5060209081020190565b600067ffffffffffffffff821115611f3057600080fd5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b83811015611f77578181015183820152602001611f5f565b83811115611f86576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611fae57600080fd5b5056fea265627a7a72305820bcdb4aab3e1a04ea5cd6c138911116ceac3fac88de1995c4d3f24fdd3f420fb66c6578706572696d656e74616cf50037" + }, + "deployedBytecode": { + "linkReferences": {}, + "object": "0x608060405234801561001057600080fd5b50600436106100885760003560e01c8063c26cfecd1161005b578063c26cfecd146100fe578063d2df073314610106578063ee55b96814610119578063fb6961cc1461013957610088565b80630f7d8e391461008d57806323872f55146100b657806348a321d6146100d657806390c3bc3f146100e9575b600080fd5b6100a061009b3660046115d7565b610141565b6040516100ad9190611958565b60405180910390f35b6100c96100c436600461177c565b6104d4565b6040516100ad9190611aad565b6100c96100e436600461165b565b6104e7565b6100fc6100f73660046117b1565b6104fa565b005b6100c96105a6565b6100fc6101143660046117b1565b6105ac565b61012c61012736600461161e565b6105db565b6040516100ad9190611979565b6100c9610a8f565b600080825111610186576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611d7d565b60405180910390fd5b600061019183610a95565b60f81c9050600481106101d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611c7b565b60008160ff1660048111156101e157fe5b905060008160048111156101f157fe5b1415610229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611d46565b600181600481111561023757fe5b14156102a857835115610276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611e48565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611db4565b60028160048111156102b657fe5b14156103bb5783516041146102f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611ad4565b60008460008151811061030657fe5b016020015160f890811c811b901c9050600061032986600163ffffffff610b1816565b9050600061033e87602163ffffffff610b1816565b9050600188848484604051600081526020016040526040516103639493929190611ab6565b6020604051602081039080840390855afa158015610385573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015196506104ce95505050505050565b60038160048111156103c957fe5b141561049c57835160411461040a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611ad4565b60008460008151811061041957fe5b016020015160f890811c811b901c9050600061043c86600163ffffffff610b1816565b9050600061045187602163ffffffff610b1816565b90506001886040516020016104669190611927565b60405160208183030381529060405280519060200120848484604051600081526020016040526040516103639493929190611ab6565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611c7b565b92915050565b60006104ce6104e283610b61565b610bcf565b60006104ce6104f583610bdd565b610c3c565b61050785858585856105ac565b6000548551602087015160408089015190517fbfc8bfce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9094169363bfc8bfce9361056d93909290918990600401611e7f565b600060405180830381600087803b15801561058757600080fd5b505af115801561059b573d6000803e3d6000fd5b505050505050505050565b60025481565b60606105bb86604001516105db565b8051909150156105d3576105d3868287878787610c4a565b505050505050565b606060006105ef838263ffffffff610e9816565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167fb4be83d500000000000000000000000000000000000000000000000000000000148061068257507fffffffff0000000000000000000000000000000000000000000000000000000081167f3e228bae00000000000000000000000000000000000000000000000000000000145b806106ce57507fffffffff0000000000000000000000000000000000000000000000000000000081167f64a3bc1500000000000000000000000000000000000000000000000000000000145b15610757576106db6111db565b83516106f190859060049063ffffffff610f0316565b80602001905161070491908101906116ed565b604080516001808252818301909252919250816020015b6107236111db565b81526020019060019003908161071b579050509250808360008151811061074657fe5b602002602001018190525050610a89565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f297bb70b0000000000000000000000000000000000000000000000000000000014806107e857507fffffffff0000000000000000000000000000000000000000000000000000000081167f50dde19000000000000000000000000000000000000000000000000000000000145b8061083457507fffffffff0000000000000000000000000000000000000000000000000000000081167f4d0ae54600000000000000000000000000000000000000000000000000000000145b8061088057507fffffffff0000000000000000000000000000000000000000000000000000000081167fe5fa431b00000000000000000000000000000000000000000000000000000000145b806108cc57507fffffffff0000000000000000000000000000000000000000000000000000000081167fa3e2038000000000000000000000000000000000000000000000000000000000145b8061091857507fffffffff0000000000000000000000000000000000000000000000000000000081167f7e1d980800000000000000000000000000000000000000000000000000000000145b8061096457507fffffffff0000000000000000000000000000000000000000000000000000000081167fdd1c7d1800000000000000000000000000000000000000000000000000000000145b1561099957825161097f90849060049063ffffffff610f0316565b806020019051610992919081019061154b565b9150610a89565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f3c28d861000000000000000000000000000000000000000000000000000000001415610a89576109eb6111db565b6109f36111db565b8451610a0990869060049063ffffffff610f0316565b806020019051610a1c9190810190611722565b60408051600280825260608201909252929450909250816020015b610a3f6111db565b815260200190600190039081610a375790505093508184600081518110610a6257fe5b60200260200101819052508084600181518110610a7b57fe5b602002602001018190525050505b50919050565b60015481565b600080825111610ad1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611ce9565b81600183510381518110610ae157fe5b016020015182517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019092525060f890811c901b90565b60008160200183511015610b58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611c1e565b50016020015190565b604081810151825160209384015182519285019290922083517f213c6f636f3ea94e701c0adf9b2624aa45a6c694f9a292c094f9a81c24b5df4c81529485019190915273ffffffffffffffffffffffffffffffffffffffff9091169183019190915260608201526080902090565b60006104ce60025483610fcf565b604080820151825160208085015160608681015185519584019590952086517f2fbcdbaa76bc7589916958ae919dfbef04d23f6bbf26de6ff317b32c6cc01e058152938401949094529482015292830152608082015260a09020919050565b60006104ce60015483610fcf565b3273ffffffffffffffffffffffffffffffffffffffff851614610c99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611cb2565b6000610ca4876104d4565b60408051600080825260208201909252845192935091905b818114610da5576000868281518110610cd157fe5b60200260200101519050610ce3611294565b60405180608001604052808b73ffffffffffffffffffffffffffffffffffffffff1681526020018781526020018a8152602001838152509050428211610d55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611be7565b6000610d60826104e7565b90506000610d81828a8781518110610d7457fe5b6020026020010151610141565b9050610d93878263ffffffff61100916565b96505060019093019250610cbc915050565b50610db6823263ffffffff61100916565b885190925060005b818114610e8b57600073ffffffffffffffffffffffffffffffffffffffff168a8281518110610de957fe5b60200260200101516060015173ffffffffffffffffffffffffffffffffffffffff161415610e1657610e83565b60008a8281518110610e2457fe5b60200260200101516040015190506000610e4782876110d090919063ffffffff16565b905080610e80576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611b0b565b50505b600101610dbe565b5050505050505050505050565b60008160040183511015610ed8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611deb565b5001602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b606081831115610f3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611b42565b8351821115610f7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611b79565b8282036040519080825280601f01601f191660200182016040528015610fa7576020820181803883390190505b509050610fc8610fb682611111565b84610fc087611111565b018351611117565b9392505050565b6040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b81516040516060918490602080820280840182019291018285101561105a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017d90611bb0565b828511156110745761106d858583611117565b8497508793505b6001820191506020810190508084019250829450818852846040528688600184038151811061109f57fe5b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015250959695505050505050565b60006020835102602084018181018192505b80831015611108578251808614156110fc57600194508193505b506020830192506110e2565b50505092915050565b60200190565b6020811015611141576001816020036101000a0380198351168185511680821786525050506111d6565b8282141561114e576111d6565b828211156111885760208103905080820181840181515b82851015611180578451865260209586019590940193611165565b9052506111d6565b60208103905080820181840183515b818612156111d157825182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09283019290910190611197565b855250505b505050565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160608152602001606081525090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000801916815260200160608152602001600081525090565b80516104ce81611f8c565b600082601f8301126112f0578081fd5b81356113036112fe82611ef8565b611ed1565b8181529150602080830190840160005b838110156113405761132b876020843589010161134a565b83526020928301929190910190600101611313565b5050505092915050565b600082601f83011261135a578081fd5b81356113686112fe82611f19565b915080825283602082850101111561137f57600080fd5b8060208401602084013760009082016020015292915050565b600082601f8301126113a957600080fd5b81516113b76112fe82611f19565b91508082528360208285010111156113ce57600080fd5b6113df816020840160208601611f5c565b5092915050565b60006101808083850312156113f9578182fd5b61140281611ed1565b91505061140f83836112d5565b815261141e83602084016112d5565b602082015261143083604084016112d5565b604082015261144283606084016112d5565b60608201526080820151608082015260a082015160a082015260c082015160c082015260e082015160e08201526101008083015181830152506101208083015181830152506101408083015167ffffffffffffffff808211156114a457600080fd5b6114b086838701611398565b838501526101609250828501519150808211156114cc57600080fd5b506114d985828601611398565b82840152505092915050565b6000606082840312156114f6578081fd5b6115006060611ed1565b905081358152602082013561151481611f8c565b6020820152604082013567ffffffffffffffff81111561153357600080fd5b61153f8482850161134a565b60408301525092915050565b6000602080838503121561155d578182fd5b825167ffffffffffffffff811115611573578283fd5b80840185601f820112611584578384fd5b805191506115946112fe83611ef8565b82815283810190828501865b858110156115c9576115b78a8884518801016113e6565b845292860192908601906001016115a0565b509098975050505050505050565b600080604083850312156115ea57600080fd5b82359150602083013567ffffffffffffffff81111561160857600080fd5b6116148582860161134a565b9150509250929050565b60006020828403121561163057600080fd5b813567ffffffffffffffff81111561164757600080fd5b6116538482850161134a565b949350505050565b60006020828403121561166c578081fd5b813567ffffffffffffffff80821115611683578283fd5b81840160808187031215611695578384fd5b61169f6080611ed1565b925080356116ac81611f8c565b8352602081810135908401526040810135828111156116c9578485fd5b6116d58782840161134a565b60408501525060609081013590830152509392505050565b6000602082840312156116ff57600080fd5b815167ffffffffffffffff81111561171657600080fd5b611653848285016113e6565b6000806040838503121561173557600080fd5b825167ffffffffffffffff8082111561174d57600080fd5b611759868387016113e6565b9350602085015191508082111561176f57600080fd5b50611614858286016113e6565b60006020828403121561178e57600080fd5b813567ffffffffffffffff8111156117a557600080fd5b611653848285016114e5565b600080600080600060a086880312156117c8578081fd5b853567ffffffffffffffff808211156117df578283fd5b6117eb89838a016114e5565b965060209150818801356117fe81611f8c565b9550604088013581811115611811578384fd5b61181d8a828b0161134a565b955050606088013581811115611831578384fd5b8089018a601f820112611842578485fd5b803591506118526112fe83611ef8565b82815284810190828601868502840187018e101561186e578788fd5b8793505b84841015611890578035835260019390930192918601918601611872565b50965050505060808801359150808211156118a9578283fd5b506118b6888289016112e0565b9150509295509295909350565b73ffffffffffffffffffffffffffffffffffffffff169052565b600081518084526118f5816020860160208601611f5c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600060208083018184528085518083526040860191506040848202870101925083870160005b82811015611aa0577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845281516101806119de8783516118c3565b878201516119ee898901826118c3565b506040820151611a0160408901826118c3565b506060820151611a1460608901826118c3565b506080820151608088015260a082015160a088015260c082015160c088015260e082015160e08801526101008083015181890152506101208083015181890152506101408083015182828a0152611a6d838a01826118dd565b915050610160915081830151888203838a0152611a8a82826118dd565b985050509487019450509085019060010161199f565b5092979650505050505050565b90815260200190565b93845260ff9290921660208401526040830152606082015260800190565b60208082526012908201527f4c454e4754485f36355f52455155495245440000000000000000000000000000604082015260600190565b6020808252601a908201527f494e56414c49445f415050524f56414c5f5349474e4154555245000000000000604082015260600190565b6020808252601a908201527f46524f4d5f4c4553535f5448414e5f544f5f5245515549524544000000000000604082015260600190565b6020808252601c908201527f544f5f4c4553535f5448414e5f4c454e4754485f524551554952454400000000604082015260600190565b60208082526017908201527f494e56414c49445f465245455f4d454d4f52595f505452000000000000000000604082015260600190565b60208082526010908201527f415050524f56414c5f4558504952454400000000000000000000000000000000604082015260600190565b60208082526026908201527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560408201527f5155495245440000000000000000000000000000000000000000000000000000606082015260800190565b60208082526015908201527f5349474e41545552455f554e535550504f525445440000000000000000000000604082015260600190565b6020808252600e908201527f494e56414c49445f4f524947494e000000000000000000000000000000000000604082015260600190565b60208082526021908201527f475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524560408201527f4400000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526011908201527f5349474e41545552455f494c4c4547414c000000000000000000000000000000604082015260600190565b6020808252601e908201527f4c454e4754485f475245415445525f5448414e5f305f52455155495245440000604082015260600190565b60208082526011908201527f5349474e41545552455f494e56414c4944000000000000000000000000000000604082015260600190565b60208082526025908201527f475245415445525f4f525f455155414c5f544f5f345f4c454e4754485f52455160408201527f5549524544000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526011908201527f4c454e4754485f305f5245515549524544000000000000000000000000000000604082015260600190565b600085825273ffffffffffffffffffffffffffffffffffffffff8516602083015260806040830152611eb460808301856118dd565b8281036060840152611ec681856118dd565b979650505050505050565b60405181810167ffffffffffffffff81118282101715611ef057600080fd5b604052919050565b600067ffffffffffffffff821115611f0f57600080fd5b5060209081020190565b600067ffffffffffffffff821115611f3057600080fd5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b83811015611f77578181015183820152602001611f5f565b83811115611f86576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611fae57600080fd5b5056fea265627a7a72305820bcdb4aab3e1a04ea5cd6c138911116ceac3fac88de1995c4d3f24fdd3f420fb66c6578706572696d656e74616cf50037", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x88 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xC26CFECD GT PUSH2 0x5B JUMPI DUP1 PUSH4 0xC26CFECD EQ PUSH2 0xFE JUMPI DUP1 PUSH4 0xD2DF0733 EQ PUSH2 0x106 JUMPI DUP1 PUSH4 0xEE55B968 EQ PUSH2 0x119 JUMPI DUP1 PUSH4 0xFB6961CC EQ PUSH2 0x139 JUMPI PUSH2 0x88 JUMP JUMPDEST DUP1 PUSH4 0xF7D8E39 EQ PUSH2 0x8D JUMPI DUP1 PUSH4 0x23872F55 EQ PUSH2 0xB6 JUMPI DUP1 PUSH4 0x48A321D6 EQ PUSH2 0xD6 JUMPI DUP1 PUSH4 0x90C3BC3F EQ PUSH2 0xE9 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xA0 PUSH2 0x9B CALLDATASIZE PUSH1 0x4 PUSH2 0x15D7 JUMP JUMPDEST PUSH2 0x141 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xAD SWAP2 SWAP1 PUSH2 0x1958 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xC9 PUSH2 0xC4 CALLDATASIZE PUSH1 0x4 PUSH2 0x177C JUMP JUMPDEST PUSH2 0x4D4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xAD SWAP2 SWAP1 PUSH2 0x1AAD JUMP JUMPDEST PUSH2 0xC9 PUSH2 0xE4 CALLDATASIZE PUSH1 0x4 PUSH2 0x165B JUMP JUMPDEST PUSH2 0x4E7 JUMP JUMPDEST PUSH2 0xFC PUSH2 0xF7 CALLDATASIZE PUSH1 0x4 PUSH2 0x17B1 JUMP JUMPDEST PUSH2 0x4FA JUMP JUMPDEST STOP JUMPDEST PUSH2 0xC9 PUSH2 0x5A6 JUMP JUMPDEST PUSH2 0xFC PUSH2 0x114 CALLDATASIZE PUSH1 0x4 PUSH2 0x17B1 JUMP JUMPDEST PUSH2 0x5AC JUMP JUMPDEST PUSH2 0x12C PUSH2 0x127 CALLDATASIZE PUSH1 0x4 PUSH2 0x161E JUMP JUMPDEST PUSH2 0x5DB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xAD SWAP2 SWAP1 PUSH2 0x1979 JUMP JUMPDEST PUSH2 0xC9 PUSH2 0xA8F JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD GT PUSH2 0x186 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x17D SWAP1 PUSH2 0x1D7D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x191 DUP4 PUSH2 0xA95 JUMP JUMPDEST PUSH1 0xF8 SHR SWAP1 POP PUSH1 0x4 DUP2 LT PUSH2 0x1D0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x17D SWAP1 PUSH2 0x1C7B JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0xFF AND PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1E1 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1F1 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x229 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x17D SWAP1 PUSH2 0x1D46 JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x237 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x2A8 JUMPI DUP4 MLOAD ISZERO PUSH2 0x276 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x17D SWAP1 PUSH2 0x1E48 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x17D SWAP1 PUSH2 0x1DB4 JUMP JUMPDEST PUSH1 0x2 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x2B6 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x3BB JUMPI DUP4 MLOAD PUSH1 0x41 EQ PUSH2 0x2F7 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x17D SWAP1 PUSH2 0x1AD4 JUMP JUMPDEST PUSH1 0x0 DUP5 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x306 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 SWAP1 DUP2 SHR DUP2 SHL SWAP1 SHR SWAP1 POP PUSH1 0x0 PUSH2 0x329 DUP7 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0xB18 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x33E DUP8 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0xB18 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x1 DUP9 DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x363 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1AB6 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x385 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD SWAP7 POP PUSH2 0x4CE SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x3 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x3C9 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x49C JUMPI DUP4 MLOAD PUSH1 0x41 EQ PUSH2 0x40A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x17D SWAP1 PUSH2 0x1AD4 JUMP JUMPDEST PUSH1 0x0 DUP5 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x419 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 SWAP1 DUP2 SHR DUP2 SHL SWAP1 SHR SWAP1 POP PUSH1 0x0 PUSH2 0x43C DUP7 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0xB18 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x451 DUP8 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0xB18 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x1 DUP9 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x466 SWAP2 SWAP1 PUSH2 0x1927 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x363 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1AB6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x17D SWAP1 PUSH2 0x1C7B JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4CE PUSH2 0x4E2 DUP4 PUSH2 0xB61 JUMP JUMPDEST PUSH2 0xBCF JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4CE PUSH2 0x4F5 DUP4 PUSH2 0xBDD JUMP JUMPDEST PUSH2 0xC3C JUMP JUMPDEST PUSH2 0x507 DUP6 DUP6 DUP6 DUP6 DUP6 PUSH2 0x5AC JUMP JUMPDEST PUSH1 0x0 SLOAD DUP6 MLOAD PUSH1 0x20 DUP8 ADD MLOAD PUSH1 0x40 DUP1 DUP10 ADD MLOAD SWAP1 MLOAD PUSH32 0xBFC8BFCE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP5 AND SWAP4 PUSH4 0xBFC8BFCE SWAP4 PUSH2 0x56D SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x1E7F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x587 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x59B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x5BB DUP7 PUSH1 0x40 ADD MLOAD PUSH2 0x5DB JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x5D3 JUMPI PUSH2 0x5D3 DUP7 DUP3 DUP8 DUP8 DUP8 DUP8 PUSH2 0xC4A JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x5EF DUP4 DUP3 PUSH4 0xFFFFFFFF PUSH2 0xE98 AND JUMP JUMPDEST SWAP1 POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0x682 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x3E228BAE00000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x6CE JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x64A3BC1500000000000000000000000000000000000000000000000000000000 EQ JUMPDEST ISZERO PUSH2 0x757 JUMPI PUSH2 0x6DB PUSH2 0x11DB JUMP JUMPDEST DUP4 MLOAD PUSH2 0x6F1 SWAP1 DUP6 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0xF03 AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x704 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x16ED JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE SWAP2 SWAP3 POP DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0x723 PUSH2 0x11DB JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x71B JUMPI SWAP1 POP POP SWAP3 POP DUP1 DUP4 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x746 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP POP PUSH2 0xA89 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x297BB70B00000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0x7E8 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x50DDE19000000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x834 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x4D0AE54600000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x880 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xE5FA431B00000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x8CC JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xA3E2038000000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x918 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x7E1D980800000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x964 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xDD1C7D1800000000000000000000000000000000000000000000000000000000 EQ JUMPDEST ISZERO PUSH2 0x999 JUMPI DUP3 MLOAD PUSH2 0x97F SWAP1 DUP5 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0xF03 AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x992 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x154B JUMP JUMPDEST SWAP2 POP PUSH2 0xA89 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x3C28D86100000000000000000000000000000000000000000000000000000000 EQ ISZERO PUSH2 0xA89 JUMPI PUSH2 0x9EB PUSH2 0x11DB JUMP JUMPDEST PUSH2 0x9F3 PUSH2 0x11DB JUMP JUMPDEST DUP5 MLOAD PUSH2 0xA09 SWAP1 DUP7 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0xF03 AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0xA1C SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1722 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x2 DUP1 DUP3 MSTORE PUSH1 0x60 DUP3 ADD SWAP1 SWAP3 MSTORE SWAP3 SWAP5 POP SWAP1 SWAP3 POP DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0xA3F PUSH2 0x11DB JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0xA37 JUMPI SWAP1 POP POP SWAP4 POP DUP2 DUP5 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0xA62 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP DUP1 DUP5 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0xA7B JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP POP POP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x1 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD GT PUSH2 0xAD1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x17D SWAP1 PUSH2 0x1CE9 JUMP JUMPDEST DUP2 PUSH1 0x1 DUP4 MLOAD SUB DUP2 MLOAD DUP2 LT PUSH2 0xAE1 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD DUP3 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP3 MSTORE POP PUSH1 0xF8 SWAP1 DUP2 SHR SWAP1 SHL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH2 0xB58 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x17D SWAP1 PUSH2 0x1C1E JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP2 DUP2 ADD MLOAD DUP3 MLOAD PUSH1 0x20 SWAP4 DUP5 ADD MLOAD DUP3 MLOAD SWAP3 DUP6 ADD SWAP3 SWAP1 SWAP3 KECCAK256 DUP4 MLOAD PUSH32 0x213C6F636F3EA94E701C0ADF9B2624AA45A6C694F9A292C094F9A81C24B5DF4C DUP2 MSTORE SWAP5 DUP6 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4CE PUSH1 0x2 SLOAD DUP4 PUSH2 0xFCF JUMP JUMPDEST PUSH1 0x40 DUP1 DUP3 ADD MLOAD DUP3 MLOAD PUSH1 0x20 DUP1 DUP6 ADD MLOAD PUSH1 0x60 DUP7 DUP2 ADD MLOAD DUP6 MLOAD SWAP6 DUP5 ADD SWAP6 SWAP1 SWAP6 KECCAK256 DUP7 MLOAD PUSH32 0x2FBCDBAA76BC7589916958AE919DFBEF04D23F6BBF26DE6FF317B32C6CC01E05 DUP2 MSTORE SWAP4 DUP5 ADD SWAP5 SWAP1 SWAP5 MSTORE SWAP5 DUP3 ADD MSTORE SWAP3 DUP4 ADD MSTORE PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 SWAP1 KECCAK256 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4CE PUSH1 0x1 SLOAD DUP4 PUSH2 0xFCF JUMP JUMPDEST ORIGIN PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND EQ PUSH2 0xC99 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x17D SWAP1 PUSH2 0x1CB2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xCA4 DUP8 PUSH2 0x4D4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 SWAP3 MSTORE DUP5 MLOAD SWAP3 SWAP4 POP SWAP2 SWAP1 JUMPDEST DUP2 DUP2 EQ PUSH2 0xDA5 JUMPI PUSH1 0x0 DUP7 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0xCD1 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP1 POP PUSH2 0xCE3 PUSH2 0x1294 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 DUP12 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP8 DUP2 MSTORE PUSH1 0x20 ADD DUP11 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE POP SWAP1 POP TIMESTAMP DUP3 GT PUSH2 0xD55 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x17D SWAP1 PUSH2 0x1BE7 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xD60 DUP3 PUSH2 0x4E7 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xD81 DUP3 DUP11 DUP8 DUP2 MLOAD DUP2 LT PUSH2 0xD74 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x141 JUMP JUMPDEST SWAP1 POP PUSH2 0xD93 DUP8 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x1009 AND JUMP JUMPDEST SWAP7 POP POP PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 POP PUSH2 0xCBC SWAP2 POP POP JUMP JUMPDEST POP PUSH2 0xDB6 DUP3 ORIGIN PUSH4 0xFFFFFFFF PUSH2 0x1009 AND JUMP JUMPDEST DUP9 MLOAD SWAP1 SWAP3 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0xE8B JUMPI PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP11 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0xDE9 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xE16 JUMPI PUSH2 0xE83 JUMP JUMPDEST PUSH1 0x0 DUP11 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0xE24 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 ADD MLOAD SWAP1 POP PUSH1 0x0 PUSH2 0xE47 DUP3 DUP8 PUSH2 0x10D0 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP DUP1 PUSH2 0xE80 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x17D SWAP1 PUSH2 0x1B0B JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x1 ADD PUSH2 0xDBE JUMP JUMPDEST POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 ADD DUP4 MLOAD LT ISZERO PUSH2 0xED8 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x17D SWAP1 PUSH2 0x1DEB JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 DUP4 GT ISZERO PUSH2 0xF3F JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x17D SWAP1 PUSH2 0x1B42 JUMP JUMPDEST DUP4 MLOAD DUP3 GT ISZERO PUSH2 0xF7A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x17D SWAP1 PUSH2 0x1B79 JUMP JUMPDEST DUP3 DUP3 SUB PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xFA7 JUMPI PUSH1 0x20 DUP3 ADD DUP2 DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH2 0xFC8 PUSH2 0xFB6 DUP3 PUSH2 0x1111 JUMP JUMPDEST DUP5 PUSH2 0xFC0 DUP8 PUSH2 0x1111 JUMP JUMPDEST ADD DUP4 MLOAD PUSH2 0x1117 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x2 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x22 DUP3 ADD MSTORE PUSH1 0x42 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x40 MLOAD PUSH1 0x60 SWAP2 DUP5 SWAP1 PUSH1 0x20 DUP1 DUP3 MUL DUP1 DUP5 ADD DUP3 ADD SWAP3 SWAP2 ADD DUP3 DUP6 LT ISZERO PUSH2 0x105A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x17D SWAP1 PUSH2 0x1BB0 JUMP JUMPDEST DUP3 DUP6 GT ISZERO PUSH2 0x1074 JUMPI PUSH2 0x106D DUP6 DUP6 DUP4 PUSH2 0x1117 JUMP JUMPDEST DUP5 SWAP8 POP DUP8 SWAP4 POP JUMPDEST PUSH1 0x1 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP1 DUP5 ADD SWAP3 POP DUP3 SWAP5 POP DUP2 DUP9 MSTORE DUP5 PUSH1 0x40 MSTORE DUP7 DUP9 PUSH1 0x1 DUP5 SUB DUP2 MLOAD DUP2 LT PUSH2 0x109F JUMPI INVALID JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x20 SWAP3 DUP4 MUL SWAP2 SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE POP SWAP6 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP4 MLOAD MUL PUSH1 0x20 DUP5 ADD DUP2 DUP2 ADD DUP2 SWAP3 POP JUMPDEST DUP1 DUP4 LT ISZERO PUSH2 0x1108 JUMPI DUP3 MLOAD DUP1 DUP7 EQ ISZERO PUSH2 0x10FC JUMPI PUSH1 0x1 SWAP5 POP DUP2 SWAP4 POP JUMPDEST POP PUSH1 0x20 DUP4 ADD SWAP3 POP PUSH2 0x10E2 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1141 JUMPI PUSH1 0x1 DUP2 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP4 MLOAD AND DUP2 DUP6 MLOAD AND DUP1 DUP3 OR DUP7 MSTORE POP POP POP PUSH2 0x11D6 JUMP JUMPDEST DUP3 DUP3 EQ ISZERO PUSH2 0x114E JUMPI PUSH2 0x11D6 JUMP JUMPDEST DUP3 DUP3 GT ISZERO PUSH2 0x1188 JUMPI PUSH1 0x20 DUP2 SUB SWAP1 POP DUP1 DUP3 ADD DUP2 DUP5 ADD DUP2 MLOAD JUMPDEST DUP3 DUP6 LT ISZERO PUSH2 0x1180 JUMPI DUP5 MLOAD DUP7 MSTORE PUSH1 0x20 SWAP6 DUP7 ADD SWAP6 SWAP1 SWAP5 ADD SWAP4 PUSH2 0x1165 JUMP JUMPDEST SWAP1 MSTORE POP PUSH2 0x11D6 JUMP JUMPDEST PUSH1 0x20 DUP2 SUB SWAP1 POP DUP1 DUP3 ADD DUP2 DUP5 ADD DUP4 MLOAD JUMPDEST DUP2 DUP7 SLT ISZERO PUSH2 0x11D1 JUMPI DUP3 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x1197 JUMP JUMPDEST DUP6 MSTORE POP POP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH2 0x180 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP1 NOT AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH2 0x4CE DUP2 PUSH2 0x1F8C JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x12F0 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1303 PUSH2 0x12FE DUP3 PUSH2 0x1EF8 JUMP JUMPDEST PUSH2 0x1ED1 JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 ADD PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1340 JUMPI PUSH2 0x132B DUP8 PUSH1 0x20 DUP5 CALLDATALOAD DUP10 ADD ADD PUSH2 0x134A JUMP JUMPDEST DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1313 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x135A JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1368 PUSH2 0x12FE DUP3 PUSH2 0x1F19 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x137F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP5 ADD CALLDATACOPY PUSH1 0x0 SWAP1 DUP3 ADD PUSH1 0x20 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x13A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x13B7 PUSH2 0x12FE DUP3 PUSH2 0x1F19 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x13CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x13DF DUP2 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x1F5C JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x13F9 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x1402 DUP2 PUSH2 0x1ED1 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x140F DUP4 DUP4 PUSH2 0x12D5 JUMP JUMPDEST DUP2 MSTORE PUSH2 0x141E DUP4 PUSH1 0x20 DUP5 ADD PUSH2 0x12D5 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x1430 DUP4 PUSH1 0x40 DUP5 ADD PUSH2 0x12D5 JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x1442 DUP4 PUSH1 0x60 DUP5 ADD PUSH2 0x12D5 JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 DUP3 ADD MLOAD PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 DUP3 ADD MLOAD PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 DUP3 ADD MLOAD PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xE0 DUP3 ADD MLOAD PUSH1 0xE0 DUP3 ADD MSTORE PUSH2 0x100 DUP1 DUP4 ADD MLOAD DUP2 DUP4 ADD MSTORE POP PUSH2 0x120 DUP1 DUP4 ADD MLOAD DUP2 DUP4 ADD MSTORE POP PUSH2 0x140 DUP1 DUP4 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x14A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x14B0 DUP7 DUP4 DUP8 ADD PUSH2 0x1398 JUMP JUMPDEST DUP4 DUP6 ADD MSTORE PUSH2 0x160 SWAP3 POP DUP3 DUP6 ADD MLOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x14CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x14D9 DUP6 DUP3 DUP7 ADD PUSH2 0x1398 JUMP JUMPDEST DUP3 DUP5 ADD MSTORE POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x14F6 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x1500 PUSH1 0x60 PUSH2 0x1ED1 JUMP JUMPDEST SWAP1 POP DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH2 0x1514 DUP2 PUSH2 0x1F8C JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1533 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x153F DUP5 DUP3 DUP6 ADD PUSH2 0x134A JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x155D JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1573 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP1 DUP5 ADD DUP6 PUSH1 0x1F DUP3 ADD SLT PUSH2 0x1584 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP1 MLOAD SWAP2 POP PUSH2 0x1594 PUSH2 0x12FE DUP4 PUSH2 0x1EF8 JUMP JUMPDEST DUP3 DUP2 MSTORE DUP4 DUP2 ADD SWAP1 DUP3 DUP6 ADD DUP7 JUMPDEST DUP6 DUP2 LT ISZERO PUSH2 0x15C9 JUMPI PUSH2 0x15B7 DUP11 DUP9 DUP5 MLOAD DUP9 ADD ADD PUSH2 0x13E6 JUMP JUMPDEST DUP5 MSTORE SWAP3 DUP7 ADD SWAP3 SWAP1 DUP7 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x15A0 JUMP JUMPDEST POP SWAP1 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x15EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1608 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1614 DUP6 DUP3 DUP7 ADD PUSH2 0x134A JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1630 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1647 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1653 DUP5 DUP3 DUP6 ADD PUSH2 0x134A JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x166C JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1683 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP5 ADD PUSH1 0x80 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x1695 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x169F PUSH1 0x80 PUSH2 0x1ED1 JUMP JUMPDEST SWAP3 POP DUP1 CALLDATALOAD PUSH2 0x16AC DUP2 PUSH2 0x1F8C JUMP JUMPDEST DUP4 MSTORE PUSH1 0x20 DUP2 DUP2 ADD CALLDATALOAD SWAP1 DUP5 ADD MSTORE PUSH1 0x40 DUP2 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0x16C9 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x16D5 DUP8 DUP3 DUP5 ADD PUSH2 0x134A JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MSTORE POP PUSH1 0x60 SWAP1 DUP2 ADD CALLDATALOAD SWAP1 DUP4 ADD MSTORE POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x16FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1716 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1653 DUP5 DUP3 DUP6 ADD PUSH2 0x13E6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1735 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x174D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1759 DUP7 DUP4 DUP8 ADD PUSH2 0x13E6 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD MLOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x176F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1614 DUP6 DUP3 DUP7 ADD PUSH2 0x13E6 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x178E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x17A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1653 DUP5 DUP3 DUP6 ADD PUSH2 0x14E5 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x17C8 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x17DF JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x17EB DUP10 DUP4 DUP11 ADD PUSH2 0x14E5 JUMP JUMPDEST SWAP7 POP PUSH1 0x20 SWAP2 POP DUP2 DUP9 ADD CALLDATALOAD PUSH2 0x17FE DUP2 PUSH2 0x1F8C JUMP JUMPDEST SWAP6 POP PUSH1 0x40 DUP9 ADD CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1811 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x181D DUP11 DUP3 DUP12 ADD PUSH2 0x134A JUMP JUMPDEST SWAP6 POP POP PUSH1 0x60 DUP9 ADD CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1831 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP1 DUP10 ADD DUP11 PUSH1 0x1F DUP3 ADD SLT PUSH2 0x1842 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP2 POP PUSH2 0x1852 PUSH2 0x12FE DUP4 PUSH2 0x1EF8 JUMP JUMPDEST DUP3 DUP2 MSTORE DUP5 DUP2 ADD SWAP1 DUP3 DUP7 ADD DUP7 DUP6 MUL DUP5 ADD DUP8 ADD DUP15 LT ISZERO PUSH2 0x186E JUMPI DUP8 DUP9 REVERT JUMPDEST DUP8 SWAP4 POP JUMPDEST DUP5 DUP5 LT ISZERO PUSH2 0x1890 JUMPI DUP1 CALLDATALOAD DUP4 MSTORE PUSH1 0x1 SWAP4 SWAP1 SWAP4 ADD SWAP3 SWAP2 DUP7 ADD SWAP2 DUP7 ADD PUSH2 0x1872 JUMP JUMPDEST POP SWAP7 POP POP POP POP PUSH1 0x80 DUP9 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x18A9 JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x18B6 DUP9 DUP3 DUP10 ADD PUSH2 0x12E0 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x18F5 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x1F5C JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE PUSH1 0x1C DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x3C ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 ADD DUP2 DUP5 MSTORE DUP1 DUP6 MLOAD DUP1 DUP4 MSTORE PUSH1 0x40 DUP7 ADD SWAP2 POP PUSH1 0x40 DUP5 DUP3 MUL DUP8 ADD ADD SWAP3 POP DUP4 DUP8 ADD PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x1AA0 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 DUP9 DUP7 SUB ADD DUP5 MSTORE DUP2 MLOAD PUSH2 0x180 PUSH2 0x19DE DUP8 DUP4 MLOAD PUSH2 0x18C3 JUMP JUMPDEST DUP8 DUP3 ADD MLOAD PUSH2 0x19EE DUP10 DUP10 ADD DUP3 PUSH2 0x18C3 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x1A01 PUSH1 0x40 DUP10 ADD DUP3 PUSH2 0x18C3 JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH2 0x1A14 PUSH1 0x60 DUP10 ADD DUP3 PUSH2 0x18C3 JUMP JUMPDEST POP PUSH1 0x80 DUP3 ADD MLOAD PUSH1 0x80 DUP9 ADD MSTORE PUSH1 0xA0 DUP3 ADD MLOAD PUSH1 0xA0 DUP9 ADD MSTORE PUSH1 0xC0 DUP3 ADD MLOAD PUSH1 0xC0 DUP9 ADD MSTORE PUSH1 0xE0 DUP3 ADD MLOAD PUSH1 0xE0 DUP9 ADD MSTORE PUSH2 0x100 DUP1 DUP4 ADD MLOAD DUP2 DUP10 ADD MSTORE POP PUSH2 0x120 DUP1 DUP4 ADD MLOAD DUP2 DUP10 ADD MSTORE POP PUSH2 0x140 DUP1 DUP4 ADD MLOAD DUP3 DUP3 DUP11 ADD MSTORE PUSH2 0x1A6D DUP4 DUP11 ADD DUP3 PUSH2 0x18DD JUMP JUMPDEST SWAP2 POP POP PUSH2 0x160 SWAP2 POP DUP2 DUP4 ADD MLOAD DUP9 DUP3 SUB DUP4 DUP11 ADD MSTORE PUSH2 0x1A8A DUP3 DUP3 PUSH2 0x18DD JUMP JUMPDEST SWAP9 POP POP POP SWAP5 DUP8 ADD SWAP5 POP POP SWAP1 DUP6 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x199F JUMP JUMPDEST POP SWAP3 SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x12 SWAP1 DUP3 ADD MSTORE PUSH32 0x4C454E4754485F36355F52455155495245440000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1A SWAP1 DUP3 ADD MSTORE PUSH32 0x494E56414C49445F415050524F56414C5F5349474E4154555245000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1A SWAP1 DUP3 ADD MSTORE PUSH32 0x46524F4D5F4C4553535F5448414E5F544F5F5245515549524544000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x544F5F4C4553535F5448414E5F4C454E4754485F524551554952454400000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x17 SWAP1 DUP3 ADD MSTORE PUSH32 0x494E56414C49445F465245455F4D454D4F52595F505452000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x10 SWAP1 DUP3 ADD MSTORE PUSH32 0x415050524F56414C5F4558504952454400000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x15 SWAP1 DUP3 ADD MSTORE PUSH32 0x5349474E41545552455F554E535550504F525445440000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xE SWAP1 DUP3 ADD MSTORE PUSH32 0x494E56414C49445F4F524947494E000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x21 SWAP1 DUP3 ADD MSTORE PUSH32 0x475245415445525F5448414E5F5A45524F5F4C454E4754485F52455155495245 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4400000000000000000000000000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x11 SWAP1 DUP3 ADD MSTORE PUSH32 0x5349474E41545552455F494C4C4547414C000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1E SWAP1 DUP3 ADD MSTORE PUSH32 0x4C454E4754485F475245415445525F5448414E5F305F52455155495245440000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x11 SWAP1 DUP3 ADD MSTORE PUSH32 0x5349474E41545552455F494E56414C4944000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x25 SWAP1 DUP3 ADD MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F345F4C454E4754485F524551 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x5549524544000000000000000000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x11 SWAP1 DUP3 ADD MSTORE PUSH32 0x4C454E4754485F305F5245515549524544000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP6 DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x1EB4 PUSH1 0x80 DUP4 ADD DUP6 PUSH2 0x18DD JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x60 DUP5 ADD MSTORE PUSH2 0x1EC6 DUP2 DUP6 PUSH2 0x18DD JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x1EF0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1F0F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1F30 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1F77 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1F5F JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x1F86 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x1FAE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG2 PUSH6 0x627A7A723058 KECCAK256 0xbc 0xdb 0x4a 0xab RETURNDATACOPY BYTE DIV 0xea 0x5c 0xd6 0xc1 CODESIZE SWAP2 GT AND 0xce 0xac EXTCODEHASH 0xac DUP9 0xde NOT SWAP6 0xc4 0xd3 CALLCODE 0x4f 0xdd EXTCODEHASH TIMESTAMP 0xf 0xb6 PUSH13 0x6578706572696D656E74616CF5 STOP CALLDATACOPY ", + "sourceMap": "838:227:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;838:227:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;988:3006:3;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;1646:352:11;;;;;;;;;:::i;:::-;;;;;;;;1996:268:9;;;;;;;;;:::i;1627:801:2:-;;;;;;;;;:::i;:::-;;1870:42:10;;;:::i;2108:917:1:-;;;;;;;;;:::i;3237:1762::-;;;;;;;;;:::i;:::-;;;;;;;;1701:45:10;;;:::i;988:3006:3:-;1097:21;1174:1;1155:9;:16;:20;1134:97;;;;;;;;;;;;;;;;;;;;;;1296:22;1327:23;:9;:21;:23::i;:::-;1321:30;;;-1:-1:-1;1449:29:3;1424:55;;1403:123;;;;;;;;;;;;;;1537:27;1581:16;1567:31;;;;;;;;;;1537:61;-1:-1:-1;1948:21:3;1931:13;:38;;;;;;;;;1927:1717;;;1985:27;;;;;;;;;;;1927:1717;2294:21;2277:13;:38;;;;;;;;;2273:1371;;;2356:16;;:21;2331:97;;;;;;;;;;;;;;2442:27;;;;;;;;;;;2273:1371;2542:20;2525:13;:37;;;;;;;;;2521:1123;;;2603:9;:16;2623:2;2603:22;2578:99;;;;;;;;;;;;;;2691:7;2707:9;2717:1;2707:12;;;;;;;;;;;;;;;;;;2701:19;;;-1:-1:-1;2734:9:3;2746:24;:9;2768:1;2746:24;:21;:24;:::i;:::-;2734:36;-1:-1:-1;2784:9:3;2796:25;:9;2818:2;2796:25;:21;:25;:::i;:::-;2784:37;;2851:102;2878:4;2900:1;2919;2938;2851:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;2851:102:3;;;;;;-1:-1:-1;2967:20:3;;-1:-1:-1;;;;;;2967:20:3;2521:1123;3064:21;3047:13;:38;;;;;;;;;3043:601;;;3126:9;:16;3146:2;3126:22;3101:99;;;;;;;;;;;;;;3214:7;3230:9;3240:1;3230:12;;;;;;;;;;;;;;;;;;3224:19;;;-1:-1:-1;3257:9:3;3269:24;:9;3291:1;3269:24;:21;:24;:::i;:::-;3257:36;-1:-1:-1;3307:9:3;3319:25;:9;3341:2;3319:25;:21;:25;:::i;:::-;3307:37;;3374:225;3505:4;3411:116;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;3411:116:3;;;3401:127;;;;;;3546:1;3565;3584;3374:225;;;;;;;;;;;;;;;;;;;3043:601;3956:31;;;;;;;;;;;988:3006;;;;;:::o;1646:352:11:-;1757:23;1898:61;1924:34;1946:11;1924:21;:34::i;:::-;1898:25;:61::i;1996:268:9:-;2114:20;2165:63;2194:33;2218:8;2194:23;:33::i;:::-;2165:28;:63::i;1627:801:2:-;2008:197;2053:11;2078:8;2100:20;2134:29;2177:18;2008:31;:197::i;:::-;2251:8;;2292:16;;2322:25;;;;2361:16;;;;;2251:170;;;;;:8;;;;;:27;;:170;;2292:16;;2322:25;;2391:20;;2251:170;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2251:170:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2251:170:2;;;;1627:801;;;;;:::o;1870:42:10:-;;;;:::o;2108:917:1:-;2511:30;2544:42;2569:11;:16;;;2544:24;:42::i;:::-;2657:13;;2511:75;;-1:-1:-1;2657:17:1;2653:366;;2758:250;2812:11;2841:6;2865:8;2891:20;2929:29;2976:18;2758:36;:250::i;:::-;2108:917;;;;;;:::o;3237:1762::-;3335:30;3381:15;3399:18;:4;3381:15;3399:18;:15;:18;:::i;:::-;3381:36;-1:-1:-1;3444:31:1;;;3456:19;3444:31;;:87;;-1:-1:-1;3491:40:1;;;3503:28;3491:40;3444:87;:142;;;-1:-1:-1;3547:39:1;;;3559:27;3547:39;3444:142;3427:1543;;;3647:27;;:::i;:::-;3720:11;;3706:26;;3720:4;;3717:1;;3706:26;:10;:26;:::i;:::-;3678:102;;;;;;;;;;;;;;3803:23;;;3824:1;3803:23;;;;;;;;;3646:134;;-1:-1:-1;3803:23:1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;3794:32;;3852:5;3840:6;3847:1;3840:9;;;;;;;;;;;;;:17;;;;3427:1543;;;;3891:38;;;3903:26;3891:38;;:101;;-1:-1:-1;3945:47:1;;;3957:35;3945:47;3891:101;:163;;;-1:-1:-1;4008:46:1;;;4020:34;4008:46;3891:163;:217;;;-1:-1:-1;4070:38:1;;;4082:26;4070:38;3891:217;:280;;;-1:-1:-1;4124:47:1;;;4136:35;4124:47;3891:280;:335;;;-1:-1:-1;4187:39:1;;;4199:27;4187:39;3891:335;:399;;;-1:-1:-1;4242:48:1;;;4254:36;4242:48;3891:399;3874:1096;;;4439:11;;4425:26;;4439:4;;4436:1;;4425:26;:10;:26;:::i;:::-;4397:104;;;;;;;;;;;;;;4386:115;;3874:1096;;;4522:33;;;4534:21;4522:33;4518:452;;;4616:31;;:::i;:::-;4649:32;;:::i;:::-;4727:11;;4713:26;;4727:4;;4724:1;;4713:26;:10;:26;:::i;:::-;4685:118;;;;;;;;;;;;;;4865:23;;;4886:1;4865:23;;;;;;;;;4615:188;;-1:-1:-1;4615:188:1;;-1:-1:-1;4865:23:1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;4856:32;;4914:9;4902:6;4909:1;4902:9;;;;;;;;;;;;;:21;;;;4949:10;4937:6;4944:1;4937:9;;;;;;;;;;;;;:22;;;;4518:452;;;-1:-1:-1;3237:1762:1;;;:::o;1701:45:10:-;;;;:::o;8315:448:21:-;8399:13;8460:1;8449;:8;:12;8428:92;;;;;;;;;;;;;;8568:1;8581;8570;:8;:12;8568:15;;;;;;;;;;;;8682:8;;8678:16;;8707:17;;;-1:-1:-1;8568:15:21;;;;;;;8315:448::o;13292:490::-;13413:14;13476:5;13484:2;13476:10;13464:1;:8;:22;;13443:107;;;;;;;;;;;;;;-1:-1:-1;13729:13:21;13631:2;13729:13;13723:20;;13292:490::o;2245:1415:11:-;2479:16;;;;;2520;;2570:25;;;;;2994:11;;2979:13;;;2969:37;;;;3074:9;;1028:66;3097:26;;3223:15;;;3216:29;;;;3368:42;3349:62;;;3332:15;;;3325:87;;;;2459:17;3450:15;;3443:33;3617:3;3599:22;;;2245:1415::o;3216:204:10:-;3318:14;3355:58;3373:27;;3402:10;3355:17;:58::i;2604:1658:9:-;2857:29;;;;;2915:17;;2968:24;;;;;2821:33;3042:38;;;;3589:27;;3558:29;;;3548:69;;;;3685:9;;1121:66;3708:26;;3802:15;;;3795:33;;;;3883:15;;;3876:40;3971:15;;;3964:49;4080:3;4068:16;;4061:55;4219:3;4201:22;;2604:1658;;;:::o;2765:210:10:-;2870:14;2907:61;2925:30;;2957:10;2907:17;:61::i;5691:2759:1:-;6162:9;:21;;;;6141:82;;;;;;;;;;;;;;6265:23;6291:31;6310:11;6291:18;:31::i;:::-;6425:16;;;6439:1;6425:16;;;;;;;;;6479:25;;6265:57;;-1:-1:-1;6425:16:1;6479:25;6514:1147;6539:16;6534:1;:21;6514:1147;;6615:44;6662:29;6692:1;6662:32;;;;;;;;;;;;;;6615:79;;6708:35;;:::i;:::-;6746:266;;;;;;;;6794:8;6746:266;;;;;;6837:15;6746:266;;;;6892:20;6746:266;;;;6961:36;6746:266;;;6708:304;;7200:15;7161:36;:54;7074:191;;;;;;;;;;;;;;7344:20;7367:36;7394:8;7367:26;:36::i;:::-;7344:59;;7417:29;7449:53;7466:12;7480:18;7499:1;7480:21;;;;;;;;;;;;;;7449:16;:53::i;:::-;7417:85;-1:-1:-1;7597:53:1;:23;7417:85;7597:53;:30;:53;:::i;:::-;7571:79;-1:-1:-1;;6557:3:1;;;;;-1:-1:-1;6514:1147:1;;-1:-1:-1;;6514:1147:1;;-1:-1:-1;7773:41:1;:23;7804:9;7773:41;:30;:41;:::i;:::-;7848:13;;7747:67;;-1:-1:-1;7825:20:1;7871:573;7896:12;7891:1;:17;7871:573;;8042:1;8007:37;;:6;8014:1;8007:9;;;;;;;;;;;;;;:23;;;:37;;;8003:84;;;8064:8;;8003:84;8178:23;8204:6;8211:1;8204:9;;;;;;;;;;;;;;:29;;;8178:55;;8247:20;8270:49;8303:15;8270:23;:32;;:49;;;;:::i;:::-;8247:72;;8358:15;8333:100;;;;;;;;;;;;;;7871:573;;;7910:3;;7871:573;;;;5691:2759;;;;;;;;;;:::o;15595:687:21:-;15715:13;15777:5;15785:1;15777:9;15765:1;:8;:21;;15744:105;;;;;;;;;;;;;;-1:-1:-1;16023:13:21;15926:2;16023:13;16017:20;16176:66;16164:79;;15595:687::o;6453:617::-;6587:19;6651:2;6643:4;:10;;6622:83;;;;;;;;;;;;;;6742:1;:8;6736:2;:14;;6715:89;;;;;;;;;;;;;;6905:4;6900:2;:9;6890:20;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;6890:20:21;87:34:-1;135:17;;-1:-1;6890:20:21;;6881:29;;6920:120;6941:23;:6;:21;:23::i;:::-;6999:4;6978:18;:1;:16;:18::i;:::-;:25;7017:6;:13;6920:7;:120::i;:::-;6453:617;;;;;:::o;3701:890:10:-;4130:2;4124:9;4162:66;4147:82;;4279:1;4267:14;;4260:40;;;;4397:2;4385:15;;4378:35;4549:2;4531:21;;;3701:890::o;1089:2102:20:-;1437:19;;1586:4;1580:11;1208:16;;1437:12;;1509:2;:23;;;1675:45;;;;;;1437:19;1503:30;2075:32;;;;2054:102;;;;;;;;;;;;;;2410:18;2397:10;:31;2393:273;;;2444:78;2461:10;2473:20;2495:26;2444:16;:78::i;:::-;2579:10;2563:26;;2630:12;2606:36;;2545:111;2734:1;2712:23;;;;2775:2;2745:32;;;;2831:26;2808:20;:49;2787:70;;2880:18;2867:31;;2990:18;2976:12;2969:40;3071:10;3065:4;3058:24;3140:15;3101:12;3135:1;3114:18;:22;3101:36;;;;;;;;:54;;;;:36;;;;;;;;;;;:54;-1:-1:-1;3172:12:20;;1089:2102;-1:-1:-1;;;;;;1089:2102:20:o;3430:1034::-;3542:12;3685:2;3670:12;3664:19;3660:28;3798:2;3784:12;3780:21;3910:12;3890:18;3886:37;3984:18;3976:26;;3971:453;4010:16;4007:1;4004:23;3971:453;;;4129:1;4123:8;4225:12;4217:6;4214:24;4211:2;;;4315:1;4304:12;;4376:16;4371:21;;4211:2;;4041;4038:1;4034:10;4029:15;;3971:453;;;-1:-1:-1;;;3430:1034:20;;;;:::o;1341:228:21:-;1520:2;1509:14;;1341:228::o;1808:4337::-;1958:2;1949:6;:11;1945:4194;;;2247:1;2237:6;2233:2;2229:15;2224:3;2220:25;2216:33;2298:4;2294:9;2285:6;2279:13;2275:29;2347:4;2340;2334:11;2330:22;2388:1;2385;2382:8;2376:4;2369:22;;;;2186:219;;;2509:4;2499:6;:14;2495:59;;;2533:7;;2495:59;3243:4;3234:6;:13;3230:2899;;;3569:2;3561:6;3557:15;3547:25;;3617:6;3609;3605:19;3667:6;3661:4;3657:17;3974:4;3968:11;4242:198;4260:4;4252:6;4249:16;4242:198;;;4308:13;;4295:27;;4369:2;4405:13;;;;4357:15;;;;4242:198;;;4529:18;;-1:-1:-1;3276:1289:21;;;4810:2;4802:6;4798:15;4788:25;;4858:6;4850;4846:19;4908:6;4902:4;4898:17;5218:6;5212:13;5797:191;5814:4;5808;5804:15;5797:191;;;5862:11;;5849:25;;5907:13;;;;;5953;;;;5797:191;;;6078:19;;-1:-1:-1;;4612:1503:21;1808:4337;;;:::o;838:227:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;142:134:-1:-;220:13;;238:33;220:13;238:33;;299:693;;421:3;414:4;406:6;402:17;398:27;388:2;;-1:-1;;429:12;388:2;476:6;463:20;498:85;513:69;575:6;513:69;;;498:85;;;611:21;;;489:94;-1:-1;655:4;668:14;;;;643:17;;763:1;748:238;773:6;770:1;767:13;748:238;;;880:42;918:3;655:4;856:3;843:17;647:6;831:30;;880:42;;;868:55;;655:4;937:14;;;;965;;;;;795:1;788:9;748:238;;;752:14;;;;381:611;;;;;2646:432;;2743:3;2736:4;2728:6;2724:17;2720:27;2710:2;;-1:-1;;2751:12;2710:2;2798:6;2785:20;2820:60;2835:44;2872:6;2835:44;;2820:60;2811:69;;2900:6;2893:5;2886:21;3004:3;2936:4;2995:6;2928;2986:16;;2983:25;2980:2;;;3021:1;;3011:12;2980:2;37105:6;2936:4;2928:6;2924:17;2936:4;2962:5;2958:16;37082:30;37161:1;37143:16;;;2936:4;37143:16;37136:27;2962:5;2703:375;-1:-1;;2703:375;3087:434;;3195:3;3188:4;3180:6;3176:17;3172:27;3162:2;;-1:-1;;3203:12;3162:2;3243:6;3237:13;3265:60;3280:44;3317:6;3280:44;;3265:60;3256:69;;3345:6;3338:5;3331:21;3449:3;3381:4;3440:6;3373;3431:16;;3428:25;3425:2;;;3466:1;;3456:12;3425:2;3476:39;3508:6;3381:4;3407:5;3403:16;3381:4;3373:6;3369:17;3476:39;;;;3155:366;;;;;4981:2334;;5100:5;;5088:9;5083:3;5079:19;5075:31;5072:2;;;-1:-1;;5109:12;5072:2;5137:21;5152:5;5137:21;;;5128:30;;;5247:60;5303:3;5279:22;5247:60;;;5230:15;5223:85;5410:60;5466:3;5377:2;5446:9;5442:22;5410:60;;;5377:2;5396:5;5392:16;5385:86;5580:60;5636:3;5547:2;5616:9;5612:22;5580:60;;;5547:2;5566:5;5562:16;5555:86;5744:60;5800:3;5711:2;5780:9;5776:22;5744:60;;;5711:2;5730:5;5726:16;5719:86;5878:3;5948:9;5944:22;8315:13;5878:3;5898:5;5894:16;5887:86;6046:3;6116:9;6112:22;8315:13;6046:3;6066:5;6062:16;6055:86;6206:3;6276:9;6272:22;8315:13;6206:3;6226:5;6222:16;6215:86;6366:3;6436:9;6432:22;8315:13;6366:3;6386:5;6382:16;6375:86;6539:3;6621:6;6610:9;6606:22;8315:13;6566:5;6559;6555:17;6548:87;;6696:3;6778:6;6767:9;6763:22;8315:13;6723:5;6716;6712:17;6705:87;;6884:3;;6873:9;6869:19;6863:26;6909:18;;6901:6;6898:30;6895:2;;;5216:1;;6931:12;6895:2;6977:65;7038:3;7029:6;7018:9;7014:22;6977:65;;;6969:5;6962;6958:17;6951:92;7135:3;;;;7124:9;7120:19;7114:26;7100:40;;7160:18;7152:6;7149:30;7146:2;;;5216:1;;7182:12;7146:2;;7228:65;7289:3;7280:6;7269:9;7265:22;7228:65;;;7220:5;7213;7209:17;7202:92;;;5066:2249;;;;;7374:719;;7497:4;7485:9;7480:3;7476:19;7472:30;7469:2;;;-1:-1;;7505:12;7469:2;7533:20;7497:4;7533:20;;;7524:29;;8180:6;8167:20;7617:15;7610:74;7754:2;7812:9;7808:22;72:20;97:33;124:5;97:33;;;7754:2;7769:16;;7762:75;7926:2;7911:18;;7898:32;7950:18;7939:30;;7936:2;;;7603:1;;7972:12;7936:2;8017:54;8067:3;8058:6;8047:9;8043:22;8017:54;;;7926:2;8003:5;7999:16;7992:80;;7463:630;;;;;8378:422;;8533:2;;8521:9;8512:7;8508:23;8504:32;8501:2;;;8549:1;8546;8539:12;8501:2;8590:17;8584:24;8628:18;8620:6;8617:30;8614:2;;;8660:1;8657;8650:12;8614:2;8767:6;8756:9;8752:22;1175:3;1168:4;1160:6;1156:17;1152:27;1142:2;;1193:1;1190;1183:12;1142:2;1223:6;1217:13;1203:27;;1245:95;1260:79;1332:6;1260:79;;1245:95;1368:21;;;1425:14;;;;1400:17;;;1511:10;1505:256;1530:6;1527:1;1524:13;1505:256;;;1630:67;1693:3;1412:4;1606:3;1600:10;1404:6;1588:23;;1630:67;;;1618:80;;1712:14;;;;1740;;;;1552:1;1545:9;1505:256;;;-1:-1;8670:114;;8495:305;-1:-1;;;;;;;;8495:305;8807:470;;;8937:2;8925:9;8916:7;8912:23;8908:32;8905:2;;;-1:-1;;8943:12;8905:2;2588:6;2575:20;8995:63;;9123:2;9112:9;9108:18;9095:32;9147:18;9139:6;9136:30;9133:2;;;-1:-1;;9169:12;9133:2;9199:62;9253:7;9244:6;9233:9;9229:22;9199:62;;;9189:72;;;8899:378;;;;;;9284:345;;9397:2;9385:9;9376:7;9372:23;9368:32;9365:2;;;-1:-1;;9403:12;9365:2;9461:17;9448:31;9499:18;9491:6;9488:30;9485:2;;;-1:-1;;9521:12;9485:2;9551:62;9605:7;9596:6;9585:9;9581:22;9551:62;;;9541:72;9359:270;-1:-1;;;;9359:270;9636:399;;9776:2;9764:9;9755:7;9751:23;9747:32;9744:2;;;9792:1;9789;9782:12;9744:2;9840:17;9827:31;9878:18;;9870:6;9867:30;9864:2;;;9910:1;9907;9900:12;9864:2;10002:6;9991:9;9987:22;4159:4;4147:9;4142:3;4138:19;4134:30;4131:2;;;4177:1;4174;4167:12;4131:2;4195:20;4159:4;4195:20;;;4186:29;;85:6;72:20;97:33;124:5;97:33;;;4276:74;;9776:2;4476:22;;;2575:20;4437:16;;;4430:75;4610:2;4595:18;;4582:32;4623:30;;;4620:2;;;4666:1;4663;4656:12;4620:2;4701:54;4751:3;4742:6;4731:9;4727:22;4701:54;;;4610:2;4683:16;;4676:80;-1:-1;4842:2;4896:22;;;8167:20;4857:16;;;4850:75;-1:-1;4687:5;9738:297;-1:-1;;;9738:297;10042:380;;10176:2;10164:9;10155:7;10151:23;10147:32;10144:2;;;-1:-1;;10182:12;10144:2;10233:17;10227:24;10271:18;10263:6;10260:30;10257:2;;;-1:-1;;10293:12;10257:2;10323:83;10398:7;10389:6;10378:9;10374:22;10323:83;;10429:633;;;10599:2;10587:9;10578:7;10574:23;10570:32;10567:2;;;-1:-1;;10605:12;10567:2;10656:17;10650:24;10694:18;;10686:6;10683:30;10680:2;;;-1:-1;;10716:12;10680:2;10746:83;10821:7;10812:6;10801:9;10797:22;10746:83;;;10736:93;;10887:2;10876:9;10872:18;10866:25;10852:39;;10911:18;10903:6;10900:30;10897:2;;;-1:-1;;10933:12;10897:2;;10963:83;11038:7;11029:6;11018:9;11014:22;10963:83;;11069:395;;11207:2;11195:9;11186:7;11182:23;11178:32;11175:2;;;-1:-1;;11213:12;11175:2;11271:17;11258:31;11309:18;11301:6;11298:30;11295:2;;;-1:-1;;11331:12;11295:2;11361:87;11440:7;11431:6;11420:9;11416:22;11361:87;;11471:1283;;;;;;11741:3;11729:9;11720:7;11716:23;11712:33;11709:2;;;11758:1;11755;11748:12;11709:2;11806:17;11793:31;11844:18;;11836:6;11833:30;11830:2;;;11876:1;11873;11866:12;11830:2;11896:87;11975:7;11966:6;11955:9;11951:22;11896:87;;;11886:97;;12020:2;;;;12063:9;12059:22;72:20;97:33;124:5;97:33;;;12028:63;-1:-1;12156:2;12141:18;;12128:32;12169:30;;;12166:2;;;12212:1;12209;12202:12;12166:2;12232:62;12286:7;12277:6;12266:9;12262:22;12232:62;;;12222:72;;;12359:2;12348:9;12344:18;12331:32;12383:18;12375:6;12372:30;12369:2;;;12415:1;12412;12405:12;12369:2;12496:6;12485:9;12481:22;1910:3;1903:4;1895:6;1891:17;1887:27;1877:2;;1928:1;1925;1918:12;1877:2;1965:6;1952:20;1938:34;;1987:80;2002:64;2059:6;2002:64;;1987:80;2095:21;;;2152:14;;;;2127:17;;;2241;;;2232:27;;;;2229:36;-1:-1;2226:2;;;2278:1;2275;2268:12;2226:2;2294:10;;;2288:206;2313:6;2310:1;2307:13;2288:206;;;8167:20;;2381:50;;2335:1;2328:9;;;;;2445:14;;;;2473;;2288:206;;;-1:-1;12425:88;-1:-1;;;;12578:3;12563:19;;12550:33;;-1:-1;12592:30;;;12589:2;;;12635:1;12632;12625:12;12589:2;;12655:83;12730:7;12721:6;12710:9;12706:22;12655:83;;;12645:93;;;11703:1051;;;;;;;;;13003:103;36801:42;36790:54;13064:37;;13058:48;14579:343;;14721:5;35317:12;35837:6;35832:3;35825:19;14814:52;14859:6;35874:4;35869:3;35865:14;35874:4;14840:5;14836:16;14814:52;;;37623:2;37603:14;37619:7;37599:28;14878:39;;;;35874:4;14878:39;;14669:253;-1:-1;;14669:253;24577:511;16636:66;16616:87;;16600:2;16722:12;;14371:37;;;;25051:12;;;24785:303;25095:213;36801:42;36790:54;;;;13064:37;;25213:2;25198:18;;25184:124;25315:437;;25521:2;;25510:9;25506:18;25561:20;25542:17;25535:47;25596:146;13542:5;35317:12;35837:6;35832:3;35825:19;35865:14;25510:9;35865:14;13554:112;;35865:14;13731:4;13723:6;13719:17;25510:9;13710:27;;13698:39;;35185:4;13827:5;35173:17;-1:-1;13866:387;13891:6;13888:1;13885:13;13866:387;;;13943:20;25510:9;13947:4;13943:20;;13938:3;13931:33;13998:6;13992:13;22086:5;22189:62;22237:13;22167:15;22161:22;22189:62;;;22338:4;22331:5;22327:16;22321:23;22350:63;22407:4;22402:3;22398:14;22384:12;22350:63;;;;35865:14;22500:5;22496:16;22490:23;22519:63;35865:14;22571:3;22567:14;22553:12;22519:63;;;;22670:4;22663:5;22659:16;22653:23;22682:63;22670:4;22734:3;22730:14;22716:12;22682:63;;;;22836:4;22829:5;22825:16;22819:23;22836:4;22900:3;22896:14;14371:37;23002:4;22995:5;22991:16;22985:23;23002:4;23066:3;23062:14;14371:37;23160:4;23153:5;23149:16;23143:23;23160:4;23224:3;23220:14;14371:37;23318:4;23311:5;23307:16;23301:23;23318:4;23382:3;23378:14;14371:37;23489:5;;23482;23478:17;23472:24;23559:5;23554:3;23550:15;14371:37;;23645:5;;23638;23634:17;23628:24;23715:5;23710:3;23706:15;14371:37;;23811:5;;23804;23800:17;23794:24;23855:14;23847:5;23842:3;23838:15;23831:39;23885:67;22086:5;22081:3;22077:15;23933:12;23885:67;;;23877:75;;;24047:5;;;;24040;24036:17;24030:24;24101:3;24095:4;24091:14;24083:5;24078:3;24074:15;24067:39;24121:67;24183:4;24169:12;24121:67;;;14012:110;-1:-1;;;14232:14;;;;-1:-1;;35173:17;;;;13913:1;13906:9;13866:387;;;-1:-1;25588:154;;25492:260;-1:-1;;;;;;;25492:260;25759:213;14371:37;;;25877:2;25862:18;;25848:124;25979:539;14371:37;;;37006:4;36995:16;;;;26338:2;26323:18;;24530:35;26421:2;26406:18;;14371:37;26504:2;26489:18;;14371:37;26177:3;26162:19;;26148:370;26525:407;26716:2;26730:47;;;15818:2;26701:18;;;35825:19;15854:66;35865:14;;;15834:87;15940:12;;;26687:245;26939:407;27130:2;27144:47;;;16191:2;27115:18;;;35825:19;16227:66;35865:14;;;16207:87;16313:12;;;27101:245;27353:407;27544:2;27558:47;;;16973:2;27529:18;;;35825:19;17009:66;35865:14;;;16989:87;17095:12;;;27515:245;27767:407;27958:2;27972:47;;;17346:2;27943:18;;;35825:19;17382:66;35865:14;;;17362:87;17468:12;;;27929:245;28181:407;28372:2;28386:47;;;17719:2;28357:18;;;35825:19;17755:66;35865:14;;;17735:87;17841:12;;;28343:245;28595:407;28786:2;28800:47;;;18092:2;28771:18;;;35825:19;18128:66;35865:14;;;18108:87;18214:12;;;28757:245;29009:407;29200:2;29214:47;;;18465:2;29185:18;;;35825:19;18501:66;35865:14;;;18481:87;18602:66;18588:12;;;18581:88;18688:12;;;29171:245;29423:407;29614:2;29628:47;;;18939:2;29599:18;;;35825:19;18975:66;35865:14;;;18955:87;19061:12;;;29585:245;29837:407;30028:2;30042:47;;;19312:2;30013:18;;;35825:19;19348:66;35865:14;;;19328:87;19434:12;;;29999:245;30251:407;30442:2;30456:47;;;19685:2;30427:18;;;35825:19;19721:66;35865:14;;;19701:87;19822:66;19808:12;;;19801:88;19908:12;;;30413:245;30665:407;30856:2;30870:47;;;20159:2;30841:18;;;35825:19;20195:66;35865:14;;;20175:87;20281:12;;;30827:245;31079:407;31270:2;31284:47;;;20532:2;31255:18;;;35825:19;20568:66;35865:14;;;20548:87;20654:12;;;31241:245;31493:407;31684:2;31698:47;;;20905:2;31669:18;;;35825:19;20941:66;35865:14;;;20921:87;21027:12;;;31655:245;31907:407;32098:2;32112:47;;;21278:2;32083:18;;;35825:19;21314:66;35865:14;;;21294:87;21415:66;21401:12;;;21394:88;21501:12;;;32069:245;32321:407;32512:2;32526:47;;;21752:2;32497:18;;;35825:19;21788:66;35865:14;;;21768:87;21874:12;;;32483:245;32735:707;;14401:5;14378:3;14371:37;36801:42;13094:5;36790:54;33134:2;33123:9;33119:18;13064:37;32969:3;33171:2;33160:9;33156:18;33149:48;33211:72;32969:3;32958:9;32954:19;33269:6;33211:72;;;33331:9;33325:4;33321:20;33316:2;33305:9;33301:18;33294:48;33356:76;33427:4;33418:6;33356:76;;;33348:84;32940:502;-1:-1;;;;;;;32940:502;33449:256;33511:2;33505:9;33537:17;;;33612:18;33597:34;;33633:22;;;33594:62;33591:2;;;33669:1;;33659:12;33591:2;33511;33678:22;33489:216;;-1:-1;33489:216;33712:263;;33876:18;33868:6;33865:30;33862:2;;;-1:-1;;33898:12;33862:2;-1:-1;33937:4;33925:17;;;33955:15;;33799:176;34527:254;;34666:18;34658:6;34655:30;34652:2;;;-1:-1;;34688:12;34652:2;-1:-1;34742:4;34719:17;34738:9;34715:33;34771:4;34761:15;;34589:192;37178:268;37243:1;37250:101;37264:6;37261:1;37258:13;37250:101;;;37331:11;;;37325:18;37312:11;;;37305:39;37286:2;37279:10;37250:101;;;37366:6;37363:1;37360:13;37357:2;;;37243:1;37422:6;37417:3;37413:16;37406:27;37357:2;;37227:219;;;;37640:117;36801:42;37727:5;36790:54;37702:5;37699:35;37689:2;;37748:1;;37738:12;37689:2;37683:74;" } } }, + "sourceTreeHashHex": "0xcd3a1dbf858b46a5820dab320baad978613f07ec73d35b6cbbde13c2937bbc04", "networks": {} } diff --git a/yarn.lock b/yarn.lock index c448a562dd..b0f7196d12 100644 --- a/yarn.lock +++ b/yarn.lock @@ -489,6 +489,30 @@ ethers "~4.0.4" lodash "^4.17.11" +"@0x/contract-wrappers@^8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@0x/contract-wrappers/-/contract-wrappers-8.0.5.tgz#2bad814956625b740403a903d459a6e58fc77b92" + integrity sha512-lz67pqZIN6nY0mAsIAeaii3k4JPtHRlfPl5hZAOyw3VzsrYPQ5u09rLWB04hRjSx4Ibmj6c1NLTpFLat/7bXlA== + dependencies: + "@0x/abi-gen-wrappers" "^4.1.0" + "@0x/assert" "^2.0.8" + "@0x/contract-addresses" "^2.3.0" + "@0x/contract-artifacts" "^1.4.0" + "@0x/json-schemas" "^3.0.8" + "@0x/order-utils" "^7.1.1" + "@0x/types" "^2.2.1" + "@0x/typescript-typings" "^4.2.1" + "@0x/utils" "^4.3.0" + "@0x/web3-wrapper" "^6.0.4" + ethereum-types "^2.1.1" + ethereumjs-abi "0.6.5" + ethereumjs-blockstream "6.0.0" + ethereumjs-util "^5.1.1" + ethers "~4.0.4" + js-sha3 "^0.7.0" + lodash "^4.17.11" + uuid "^3.3.2" + "@0x/contracts-asset-proxy@^1.0.2": version "1.0.9" resolved "https://registry.npmjs.org/@0x/contracts-asset-proxy/-/contracts-asset-proxy-1.0.9.tgz#3a48e64b93ddc642834bde1bd09cdd84ca688a2b" @@ -505,20 +529,6 @@ ethereum-types "^2.1.0" lodash "^4.17.11" -"@0x/contracts-erc20@1.0.8": - version "1.0.8" - resolved "https://registry.npmjs.org/@0x/contracts-erc20/-/contracts-erc20-1.0.8.tgz#882f3acf1a44148800d9bef692aa377627df9ace" - dependencies: - "@0x/base-contract" "^5.0.1" - "@0x/contracts-exchange-libs" "1.0.2" - "@0x/contracts-utils" "2.0.1" - "@0x/types" "^2.1.1" - "@0x/typescript-typings" "^4.1.0" - "@0x/utils" "^4.2.1" - "@0x/web3-wrapper" "^6.0.1" - ethereum-types "^2.1.0" - lodash "^4.17.11" - "@0x/contracts-erc20@^1.0.2", "@0x/contracts-erc20@^1.0.9": version "1.0.9" resolved "https://registry.npmjs.org/@0x/contracts-erc20/-/contracts-erc20-1.0.9.tgz#366ce8222dcae5ade0ea7ca95332416a080f6abf" @@ -533,19 +543,6 @@ ethereum-types "^2.1.0" lodash "^4.17.11" -"@0x/contracts-erc721@1.0.8": - version "1.0.8" - resolved "https://registry.npmjs.org/@0x/contracts-erc721/-/contracts-erc721-1.0.8.tgz#d3746c26eec57662654557121601b5bb81085637" - dependencies: - "@0x/base-contract" "^5.0.1" - "@0x/contracts-utils" "2.0.1" - "@0x/types" "^2.1.1" - "@0x/typescript-typings" "^4.1.0" - "@0x/utils" "^4.2.1" - "@0x/web3-wrapper" "^6.0.1" - ethereum-types "^2.1.0" - lodash "^4.17.11" - "@0x/contracts-erc721@^1.0.2", "@0x/contracts-erc721@^1.0.9": version "1.0.9" resolved "https://registry.npmjs.org/@0x/contracts-erc721/-/contracts-erc721-1.0.9.tgz#3991858a3bf5a80dcd6e5fd65e938f8adc3b347c" @@ -637,6 +634,36 @@ ethereumjs-util "^5.1.1" lodash "^4.17.11" +"@0x/coordinator-server@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@0x/coordinator-server/-/coordinator-server-0.1.1.tgz#7eeb74959dc72b76756b95ccd14fd9fa8d072ede" + integrity sha512-KxdZO93TigDyVRC90DMrQDIxjNTq3zMgmW9j8AVzx78nWXiRrUknYnkPP2a1Fp53H6Ngilc33zFjysR+QgrZPA== + dependencies: + "@0x/assert" "^2.0.8" + "@0x/contract-addresses" "^2.3.0" + "@0x/contract-wrappers" "^8.0.5" + "@0x/contracts-erc20" "^2.1.0" + "@0x/json-schemas" "^3.0.8" + "@0x/order-utils" "^7.2.0" + "@0x/subproviders" "^4.0.4" + "@0x/types" "^2.2.1" + "@0x/typescript-typings" "^4.2.1" + "@0x/utils" "^4.3.0" + "@0x/web3-wrapper" "^6.0.4" + "@babel/polyfill" "^7.0.0" + body-parser "^1.18.3" + cors "^2.8.5" + express "^4.16.3" + express-async-handler "^1.1.4" + forever "^0.15.3" + http-status-codes "^1.3.0" + jsonschema "^1.2.4" + lodash "^4.17.11" + reflect-metadata "^0.1.10" + sqlite3 "^4.0.2" + typeorm "0.2.7" + websocket "^1.0.25" + "@0x/order-utils@^5.0.0": version "5.0.0" resolved "https://registry.yarnpkg.com/@0x/order-utils/-/order-utils-5.0.0.tgz#7f43e0310ace31738895881501c8dda9c3a3aefa" @@ -719,6 +746,14 @@ esutils "^2.0.2" js-tokens "^4.0.0" +"@babel/polyfill@^7.0.0": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.4.3.tgz#332dc6f57b718017c3a8b37b4eea8aa6eeac1187" + integrity sha512-rkv8WIvJshA5Ev8iNMGgz5WZkRtgtiPexiT7w5qevGTuT7ZBfM3de9ox1y9JR5/OXb/sWGBbWlHNa7vQKqku3Q== + dependencies: + core-js "^2.6.5" + regenerator-runtime "^0.13.2" + "@babel/runtime@7.0.0", "@babel/runtime@^7.0.0": version "7.0.0" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0.tgz#adeb78fedfc855aa05bc041640f3f6f98e85424c" @@ -1682,6 +1717,13 @@ version "2.2.48" resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-2.2.48.tgz#3523b126a0b049482e1c3c11877460f76622ffab" +"@types/nock@^10.0.1": + version "10.0.1" + resolved "https://registry.yarnpkg.com/@types/nock/-/nock-10.0.1.tgz#ca545bdd0c2559fe76e3cda1ba011a74fb940d45" + integrity sha512-3Dbkj/f0HxuvyYfInbQCHLASFyjnNUcidabwrbhJDMZOXXznNyQpzsBgZnY2K+c43OekqWvZ+tDjGsGTKm1d5g== + dependencies: + "@types/node" "*" + "@types/node@*", "@types/node@^10.3.2": version "10.9.4" resolved "https://registry.yarnpkg.com/@types/node/-/node-10.9.4.tgz#0f4cb2dc7c1de6096055357f70179043c33e9897" @@ -1718,9 +1760,10 @@ version "5.1.0" resolved "https://registry.yarnpkg.com/@types/query-string/-/query-string-5.1.0.tgz#7f40cdea49ddafa0ea4f3db35fb6c24d3bfd4dcc" -"@types/ramda@^0.25.38": - version "0.25.46" - resolved "https://registry.yarnpkg.com/@types/ramda/-/ramda-0.25.46.tgz#8399a35eb117f4a821deb9c4cfecc9b276fb7daf" +"@types/ramda@^0.26.8": + version "0.26.8" + resolved "https://registry.yarnpkg.com/@types/ramda/-/ramda-0.26.8.tgz#e002612cca52e52f9176d577f4d6229c8c72a10a" + integrity sha512-PSMkNNhB900U2xcyndlkVjJeCXpVtf1yod0Kdq/ArsLDIE0tW8pLBChmQeJs4o4dfp3AEP+AGm6zIseZPU4ndA== "@types/rc-slider@^8.6.0": version "8.6.0" @@ -2566,7 +2609,7 @@ assert@^1.1.1: dependencies: util "0.10.3" -assertion-error@^1.0.1: +assertion-error@^1.0.1, assertion-error@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" @@ -2608,6 +2651,16 @@ async-parallel@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/async-parallel/-/async-parallel-1.2.3.tgz#0b90550aeffb7a365d8cee881eb0618f656a3450" +async@0.2.9: + version "0.2.9" + resolved "https://registry.yarnpkg.com/async/-/async-0.2.9.tgz#df63060fbf3d33286a76aaf6d55a2986d9ff8619" + integrity sha1-32MGD789Myhqdqr21Vophtn/hhk= + +async@0.2.x, async@~0.2.9: + version "0.2.10" + resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" + integrity sha1-trvgsGdLnXGXCMo43owjfLUmw9E= + async@1.x, async@^1.4.0, async@^1.4.2, async@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" @@ -3663,7 +3716,7 @@ body-parser@1.18.2, body-parser@^1.16.0, body-parser@^1.17.1: raw-body "2.3.2" type-is "~1.6.15" -body-parser@1.18.3: +body-parser@1.18.3, body-parser@^1.18.3: version "1.18.3" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" dependencies: @@ -3769,6 +3822,17 @@ brcast@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/brcast/-/brcast-3.0.1.tgz#6256a8349b20de9eed44257a9b24d71493cd48dd" +broadway@~0.3.2, broadway@~0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/broadway/-/broadway-0.3.6.tgz#7dbef068b954b7907925fd544963b578a902ba7a" + integrity sha1-fb7waLlUt5B5Jf1USWO1eKkCuno= + dependencies: + cliff "0.1.9" + eventemitter2 "0.4.14" + nconf "0.6.9" + utile "0.2.1" + winston "0.8.0" + brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" @@ -4083,6 +4147,13 @@ call-me-maybe@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" +caller@~0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/caller/-/caller-0.0.1.tgz#f37a1d6ea10e829d94721ae29a90bb4fb52ab767" + integrity sha1-83odbqEOgp2UchrimpC7T7Uqt2c= + dependencies: + tape "~2.3.2" + callsites@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" @@ -4129,10 +4200,6 @@ camelcase@^4.0.0, camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" -camelcase@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" - caniuse-api@^1.5.2: version "1.6.1" resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" @@ -4196,6 +4263,18 @@ chai@^4.0.1: pathval "^1.0.0" type-detect "^4.0.0" +chai@^4.1.2: + version "4.2.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" + integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^3.0.1" + get-func-name "^2.0.0" + pathval "^1.1.0" + type-detect "^4.0.5" + chain-function@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/chain-function/-/chain-function-1.0.0.tgz#0d4ab37e7e18ead0bdc47b920764118ce58733dc" @@ -4466,6 +4545,24 @@ cli-width@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" +cliff@0.1.9: + version "0.1.9" + resolved "https://registry.yarnpkg.com/cliff/-/cliff-0.1.9.tgz#a211e09c6a3de3ba1af27d049d301250d18812bc" + integrity sha1-ohHgnGo947oa8n0EnTASUNGIErw= + dependencies: + colors "0.x.x" + eyes "0.1.x" + winston "0.8.x" + +cliff@~0.1.9: + version "0.1.10" + resolved "https://registry.yarnpkg.com/cliff/-/cliff-0.1.10.tgz#53be33ea9f59bec85609ee300ac4207603e52013" + integrity sha1-U74z6p9ZvshWCe4wCsQgdgPlIBM= + dependencies: + colors "~1.0.3" + eyes "~0.1.8" + winston "0.8.x" + clipboard@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/clipboard/-/clipboard-2.0.1.tgz#a12481e1c13d8a50f5f036b0560fe5d16d74e46a" @@ -4609,7 +4706,12 @@ colors@0.5.x: version "0.5.1" resolved "https://registry.npmjs.org/colors/-/colors-0.5.1.tgz#7d0023eaeb154e8ee9fce75dcb923d0ed1667774" -colors@1.0.x: +colors@0.6.x, colors@0.x.x, colors@~0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-0.6.2.tgz#2423fe6678ac0c5dae8852e5d0e5be08c997abcc" + integrity sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w= + +colors@1.0.x, colors@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" @@ -5024,6 +5126,11 @@ core-js@^2.4.0, core-js@^2.5.0: version "2.5.5" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.5.tgz#b14dde936c640c0579a6b50cabcc132dd6127e3b" +core-js@^2.6.5: + version "2.6.5" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.5.tgz#44bc8d249e7fb2ff5d00e0341a7ffb94fbf67895" + integrity sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A== + core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -5035,6 +5142,14 @@ cors@^2.8.1: object-assign "^4" vary "^1" +cors@^2.8.5: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + cosmiconfig@^5.0.2: version "5.0.5" resolved "http://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.0.5.tgz#a809e3c2306891ce17ab70359dc8bdf661fe2cd0" @@ -5415,7 +5530,7 @@ debug@^3.2.6: dependencies: ms "^2.1.1" -debug@^4.0.1: +debug@^4.0.1, debug@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" dependencies: @@ -5438,7 +5553,7 @@ decamelize-keys@^1.0.0: decamelize "^1.1.0" map-obj "^1.0.0" -decamelize@^1.0.0, decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0: +decamelize@^1.0.0, decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -5514,16 +5629,21 @@ dedent@^0.7.0: version "0.7.0" resolved "http://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" -deep-eql@^3.0.0: +deep-eql@^3.0.0, deep-eql@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" dependencies: type-detect "^4.0.0" -deep-equal@^1.0.1, deep-equal@~1.0.1: +deep-equal@*, deep-equal@^1.0.0, deep-equal@^1.0.1, deep-equal@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" +deep-equal@~0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-0.1.2.tgz#b246c2b80a570a47c11be1d9bd1070ec878b87ce" + integrity sha1-skbCuApXCkfBG+HZvRBw7IeLh84= + deep-equal@~0.2.1: version "0.2.2" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-0.2.2.tgz#84b745896f34c684e98f2ce0e42abaf43bba017d" @@ -5606,6 +5726,11 @@ defined@^1.0.0, defined@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" +defined@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-0.0.0.tgz#f35eea7d705e933baf13b2f03b3f83d921403b3e" + integrity sha1-817qfXBekzuvE7LwOz+D2SFAOz4= + del@^2.0.2: version "2.2.2" resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" @@ -5748,6 +5873,11 @@ dir-glob@^2.0.0: arrify "^1.0.1" path-type "^3.0.0" +director@1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/director/-/director-1.2.7.tgz#bfd3741075fd7fb1a5b2e13658c5f4bec77736f3" + integrity sha1-v9N0EHX9f7GlsuE2WMX0vsd3NvM= + dirty-chai@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/dirty-chai/-/dirty-chai-2.0.1.tgz#6b2162ef17f7943589da840abc96e75bda01aff3" @@ -6754,6 +6884,13 @@ ev-emitter@^1.0.0, ev-emitter@^1.0.1, ev-emitter@^1.0.2: version "1.1.1" resolved "https://registry.yarnpkg.com/ev-emitter/-/ev-emitter-1.1.1.tgz#8f18b0ce5c76a5d18017f71c0a795c65b9138f2a" +event-stream@~0.5: + version "0.5.3" + resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-0.5.3.tgz#b77b9309f7107addfeab63f0c0eafd8db0bd8c1c" + integrity sha1-t3uTCfcQet3+q2PwwOr9jbC9jBw= + dependencies: + optimist "0.2" + event-stream@~3.3.0: version "3.3.4" resolved "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" @@ -6766,6 +6903,11 @@ event-stream@~3.3.0: stream-combiner "~0.0.4" through "~2.3.1" +eventemitter2@0.4.14, eventemitter2@~0.4.14: + version "0.4.14" + resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-0.4.14.tgz#8f61b75cde012b2e9eb284d4545583b5643b61ab" + integrity sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas= + eventemitter3@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.1.1.tgz#47786bdaa087caf7b1b75e73abc5c7d540158cd0" @@ -6914,6 +7056,11 @@ expect@^23.6.0: jest-message-util "^23.4.0" jest-regex-util "^23.3.0" +express-async-handler@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/express-async-handler/-/express-async-handler-1.1.4.tgz#225a84908df63b35ae9df94b6f0f1af061266426" + integrity sha512-HdmbVF4V4w1q/iz++RV7bUxIeepTukWewiJGkoCKQMtvPF11MLTa7It9PRc/reysXXZSEyD4Pthchju+IUbMiQ== + express@^4.14.0, express@^4.15.2, express@^4.16.2: version "4.16.3" resolved "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53" @@ -7055,7 +7202,7 @@ extsprintf@^1.2.0: version "1.4.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" -eyes@0.1.x: +eyes@0.1.x, eyes@~0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" @@ -7363,6 +7510,16 @@ flat-cache@^1.2.1: graceful-fs "^4.1.2" write "^0.2.1" +flatiron@~0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/flatiron/-/flatiron-0.4.3.tgz#248cf79a3da7d7dc379e2a11c92a2719cbb540f6" + integrity sha1-JIz3mj2n19w3nioRySonGcu1QPY= + dependencies: + broadway "~0.3.2" + director "1.2.7" + optimist "0.6.0" + prompt "0.2.14" + flatten@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" @@ -7435,6 +7592,38 @@ forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" +forever-monitor@~1.7.0: + version "1.7.1" + resolved "https://registry.yarnpkg.com/forever-monitor/-/forever-monitor-1.7.1.tgz#5d820f4a3a78db2d81ae2671f158b9e86a091bb8" + integrity sha1-XYIPSjp42y2BriZx8Vi56GoJG7g= + dependencies: + broadway "~0.3.6" + chokidar "^1.0.1" + minimatch "~3.0.2" + ps-tree "0.0.x" + utile "~0.2.1" + +forever@^0.15.3: + version "0.15.3" + resolved "https://registry.yarnpkg.com/forever/-/forever-0.15.3.tgz#77d9d7e15fd2f511ad9d84a110c7dd8fc8ecebc2" + integrity sha1-d9nX4V/S9RGtnYShEMfdj8js68I= + dependencies: + cliff "~0.1.9" + clone "^1.0.2" + colors "~0.6.2" + flatiron "~0.4.2" + forever-monitor "~1.7.0" + nconf "~0.6.9" + nssocket "~0.5.1" + object-assign "^3.0.0" + optimist "~0.6.0" + path-is-absolute "~1.0.0" + prettyjson "^1.1.2" + shush "^1.0.0" + timespan "~2.3.0" + utile "~0.2.1" + winston "~0.8.1" + form-data@~2.1.1: version "2.1.4" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" @@ -8058,6 +8247,7 @@ got@^6.7.1: graceful-fs@4.1.15, graceful-fs@^3.0.0, graceful-fs@^4.0.0, graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@~1.2.0: version "4.1.15" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" + integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== "graceful-readlink@>= 1.0.0": version "1.0.1" @@ -8573,6 +8763,11 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" +http-status-codes@^1.3.0, http-status-codes@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/http-status-codes/-/http-status-codes-1.3.2.tgz#181dfa4455ef454e5e4d827718fca3936680d10d" + integrity sha512-nDUtj0ltIt08tGi2VWSpSzNNFye0v3YSe9lX3lIqLTuVvvRiYCvs4QQBSHo0eomFYw1wlUuofurUAlTm+vHnXg== + https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" @@ -8751,7 +8946,7 @@ inherits@2.0.1, inherits@=2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" -ini@^1.3.2, ini@^1.3.4, ini@~1.3.0: +ini@1.x.x, ini@^1.3.2, ini@^1.3.4, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" @@ -9990,7 +10185,7 @@ jsonschema-draft4@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/jsonschema-draft4/-/jsonschema-draft4-1.0.0.tgz#f0af2005054f0f0ade7ea2118614b69dc512d865" -jsonschema@*, jsonschema@1.2.4, jsonschema@^1.2.0: +jsonschema@*, jsonschema@1.2.4, jsonschema@^1.2.0, jsonschema@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.2.4.tgz#a46bac5d3506a254465bc548876e267c6d0d6464" @@ -10150,6 +10345,11 @@ lazy-cache@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" +lazy@~1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/lazy/-/lazy-1.0.11.tgz#daa068206282542c088288e975c297c1ae77b690" + integrity sha1-2qBoIGKCVCwIgojpdcKXwa53tpA= + lazystream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" @@ -10730,7 +10930,8 @@ lodash.words@^3.0.0: lodash@4.17.11, lodash@^4.0.0, lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.3: version "4.17.11" - resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== lodash@=4.17.4: version "4.17.4" @@ -11261,7 +11462,7 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" -"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: +"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" dependencies: @@ -11513,6 +11714,20 @@ natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" +nconf@0.6.9, nconf@~0.6.9: + version "0.6.9" + resolved "https://registry.yarnpkg.com/nconf/-/nconf-0.6.9.tgz#9570ef15ed6f9ae6b2b3c8d5e71b66d3193cd661" + integrity sha1-lXDvFe1vmuays8jV5xtm0xk81mE= + dependencies: + async "0.2.9" + ini "1.x.x" + optimist "0.6.0" + +ncp@0.4.x: + version "0.4.2" + resolved "https://registry.yarnpkg.com/ncp/-/ncp-0.4.2.tgz#abcc6cbd3ec2ed2a729ff6e7c1fa8f01784a8574" + integrity sha1-q8xsvT7C7Spyn/bnwfqPAXhKhXQ= + ncp@1.0.x: version "1.0.1" resolved "https://registry.yarnpkg.com/ncp/-/ncp-1.0.1.tgz#d15367e5cb87432ba117d2bf80fdf45aecfb4246" @@ -11567,6 +11782,21 @@ no-case@^2.2.0, no-case@^2.3.2: dependencies: lower-case "^1.1.1" +nock@^10.0.6: + version "10.0.6" + resolved "https://registry.yarnpkg.com/nock/-/nock-10.0.6.tgz#e6d90ee7a68b8cfc2ab7f6127e7d99aa7d13d111" + integrity sha512-b47OWj1qf/LqSQYnmokNWM8D88KvUl2y7jT0567NB3ZBAZFz2bWp2PC81Xn7u8F2/vJxzkzNZybnemeFa7AZ2w== + dependencies: + chai "^4.1.2" + debug "^4.1.0" + deep-equal "^1.0.0" + json-stringify-safe "^5.0.1" + lodash "^4.17.5" + mkdirp "^0.5.0" + propagate "^1.0.0" + qs "^6.5.1" + semver "^5.5.0" + node-abi@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.3.0.tgz#f3d554d6ac72a9ee16f0f4dc9548db7c08de4986" @@ -11904,6 +12134,14 @@ npmlog@~2.0.0: are-we-there-yet "~1.1.2" gauge "~1.2.5" +nssocket@~0.5.1: + version "0.5.3" + resolved "https://registry.yarnpkg.com/nssocket/-/nssocket-0.5.3.tgz#883ca2ec605f5ed64a4d5190b2625401928f8f8d" + integrity sha1-iDyi7GBfXtZKTVGQsmJUAZKPj40= + dependencies: + eventemitter2 "~0.4.14" + lazy "~1.0.11" + nth-check@~1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4" @@ -12171,7 +12409,22 @@ opn@^5.1.0, opn@^5.3.0: dependencies: is-wsl "^1.1.0" -optimist@^0.6.1: +optimist@0.2: + version "0.2.8" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.2.8.tgz#e981ab7e268b457948593b55674c099a815cac31" + integrity sha1-6YGrfiaLRXlIWTtVZ0wJmoFcrDE= + dependencies: + wordwrap ">=0.0.1 <0.1.0" + +optimist@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.0.tgz#69424826f3405f79f142e6fc3d9ae58d4dbb9200" + integrity sha1-aUJIJvNAX3nxQub8PZrljU27kgA= + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +optimist@^0.6.1, optimist@~0.6.0: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" dependencies: @@ -12550,7 +12803,7 @@ path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1, path-is-absolute@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -12606,7 +12859,7 @@ path-type@^3.0.0: dependencies: pify "^3.0.0" -pathval@^1.0.0: +pathval@^1.0.0, pathval@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" @@ -13107,6 +13360,14 @@ pretty-hrtime@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" +prettyjson@^1.1.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prettyjson/-/prettyjson-1.2.1.tgz#fcffab41d19cab4dfae5e575e64246619b12d289" + integrity sha1-/P+rQdGcq0365eV15kJGYZsS0ok= + dependencies: + colors "^1.1.2" + minimist "^1.2.0" + prismjs@^1.15.0, prismjs@^1.8.4, prismjs@~1.15.0: version "1.15.0" resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.15.0.tgz#8801d332e472091ba8def94976c8877ad60398d9" @@ -13168,6 +13429,17 @@ promisify-child-process@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/promisify-child-process/-/promisify-child-process-1.0.5.tgz#817ad1aec92c013d83bb37e1f143e9b4033d9669" +prompt@0.2.14: + version "0.2.14" + resolved "https://registry.yarnpkg.com/prompt/-/prompt-0.2.14.tgz#57754f64f543fd7b0845707c818ece618f05ffdc" + integrity sha1-V3VPZPVD/XsIRXB8gY7OYY8F/9w= + dependencies: + pkginfo "0.x.x" + read "1.0.x" + revalidator "0.1.x" + utile "0.2.x" + winston "0.8.x" + prompt@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/prompt/-/prompt-1.0.0.tgz#8e57123c396ab988897fb327fd3aedc3e735e4fe" @@ -13207,6 +13479,11 @@ prop-types@^15.5.4, prop-types@^15.5.6, prop-types@^15.5.7, prop-types@^15.5.8, loose-envify "^1.3.1" object-assign "^4.1.1" +propagate@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/propagate/-/propagate-1.0.0.tgz#00c2daeedda20e87e3782b344adba1cddd6ad709" + integrity sha1-AMLa7t2iDofjeCs0Stuhzd1q1wk= + property-information@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.0.1.tgz#c3b09f4f5750b1634c0b24205adbf78f18bdf94f" @@ -13241,6 +13518,13 @@ prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" +ps-tree@0.0.x: + version "0.0.3" + resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-0.0.3.tgz#dbf8d752a7fe22fa7d58635689499610e9276ddc" + integrity sha1-2/jXUqf+Ivp9WGNWiUmWEOknbdw= + dependencies: + event-stream "~0.5" + ps-tree@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.1.0.tgz#b421b24140d6203f1ed3c76996b4427b08e8c014" @@ -13395,6 +13679,11 @@ qs@6.5.2, qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" +qs@^6.5.1: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + qs@~6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" @@ -13461,13 +13750,10 @@ ramda@0.21.0: version "0.21.0" resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.21.0.tgz#a001abedb3ff61077d4ff1d577d44de77e8d0a35" -ramda@^0.25.0: - version "0.25.0" - resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.25.0.tgz#8fdf68231cffa90bc2f9460390a0cb74a29b29a9" - -ramda@^0.26: +ramda@^0.26, ramda@^0.26.1: version "0.26.1" - resolved "https://registry.npmjs.org/ramda/-/ramda-0.26.1.tgz#8d41351eb8111c55353617fc3bbffad8e4d35d06" + resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.26.1.tgz#8d41351eb8111c55353617fc3bbffad8e4d35d06" + integrity sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ== randexp@0.4.6: version "0.4.6" @@ -13677,8 +13963,6 @@ react-highlight@0xproject/react-highlight#react-peer-deps: dependencies: highlight.js "^9.11.0" highlightjs-solidity "^1.0.5" - react "^16.5.2" - react-dom "^16.5.2" react-hot-loader@^4.3.3: version "4.3.4" @@ -14199,6 +14483,11 @@ redux@^3.6.0: loose-envify "^1.1.0" symbol-observable "^1.0.3" +reflect-metadata@^0.1.10: + version "0.1.13" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" + integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== + reflect-metadata@^0.1.12: version "0.1.12" resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.12.tgz#311bf0c6b63cd782f228a81abe146a2bfa9c56f2" @@ -14223,6 +14512,11 @@ regenerator-runtime@^0.12.0: version "0.12.1" resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" +regenerator-runtime@^0.13.2: + version "0.13.2" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz#32e59c9a6fb9b1a4aff09b4930ca2d4477343447" + integrity sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA== + regenerator-transform@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" @@ -15105,6 +15399,14 @@ shellwords@^0.1.1: version "0.1.1" resolved "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" +shush@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shush/-/shush-1.0.0.tgz#c27415a9e458f2fed39b27cf8eb37c003782b431" + integrity sha1-wnQVqeRY8v7TmyfPjrN8ADeCtDE= + dependencies: + caller "~0.0.1" + strip-json-comments "~0.1.1" + shx@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/shx/-/shx-0.2.2.tgz#0a304d020b0edf1306ad81570e80f0346df58a39" @@ -15787,6 +16089,11 @@ strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" +strip-json-comments@~0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-0.1.3.tgz#164c64e370a8a3cc00c9e01b539e569823f0ee54" + integrity sha1-Fkxk43Coo8wAyeAbU55WmCPw7lQ= + strong-log-transformer@^1.0.6: version "1.0.6" resolved "http://registry.yarnpkg.com/strong-log-transformer/-/strong-log-transformer-1.0.6.tgz#f7fb93758a69a571140181277eea0c2eb1301fa3" @@ -16022,6 +16329,18 @@ tape@^4.4.0, tape@^4.6.3, tape@^4.8.0: string.prototype.trim "~1.1.2" through "~2.3.8" +tape@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/tape/-/tape-2.3.3.tgz#2e7ce0a31df09f8d6851664a71842e0ca5057af7" + integrity sha1-Lnzgox3wn41oUWZKcYQuDKUFevc= + dependencies: + deep-equal "~0.1.0" + defined "~0.0.0" + inherits "~2.0.1" + jsonify "~0.0.0" + resumer "~0.0.0" + through "~2.3.4" + tar-fs@^1.13.0: version "1.16.0" resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.0.tgz#e877a25acbcc51d8c790da1c57c9cf439817b896" @@ -16262,6 +16581,11 @@ timers-browserify@^2.0.4: dependencies: setimmediate "^1.0.4" +timespan@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/timespan/-/timespan-2.3.0.tgz#4902ce040bd13d845c8f59b27e9d59bad6f39929" + integrity sha1-SQLOBAvRPYRcj1myfp1ZutbzmSk= + tiny-emitter@^2.0.0: version "2.0.2" resolved "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.0.2.tgz#82d27468aca5ade8e5fd1e6d22b57dd43ebdfb7c" @@ -16614,9 +16938,10 @@ typemoq@^2.1.0: lodash "^4.17.4" postinstall-build "^5.0.1" -typeorm@^0.2.7: - version "0.2.11" - resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.2.11.tgz#d81a295ed822e05043f2920cd539f52a963896b0" +typeorm@0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.2.7.tgz#4bbbace80dc91b1303be13f42d44ebf01d1b2558" + integrity sha512-D7JxOBSqBiLAPu/M/4v15J++3klAWcv5WvYgrfl0iaaGObZJ/8UXm3oTpOtQUHfwJO9Cja8JMiwT9G7dyvwrxg== dependencies: app-root-path "^2.0.1" buffer "^5.1.0" @@ -16630,7 +16955,7 @@ typeorm@^0.2.7: reflect-metadata "^0.1.12" xml2js "^0.4.17" yargonaut "^1.1.2" - yargs "^12.0.5" + yargs "^11.1.0" types-bn@^0.0.1: version "0.0.1" @@ -17026,6 +17351,18 @@ utila@^0.4.0, utila@~0.4: version "0.4.0" resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" +utile@0.2.1, utile@0.2.x, utile@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/utile/-/utile-0.2.1.tgz#930c88e99098d6220834c356cbd9a770522d90d7" + integrity sha1-kwyI6ZCY1iIINMNWy9mncFItkNc= + dependencies: + async "~0.2.9" + deep-equal "*" + i "0.3.x" + mkdirp "0.x.x" + ncp "0.4.x" + rimraf "2.x.x" + utile@0.3.x: version "0.3.0" resolved "https://registry.yarnpkg.com/utile/-/utile-0.3.0.tgz#1352c340eb820e4d8ddba039a4fbfaa32ed4ef3a" @@ -17766,7 +18103,7 @@ websocket@1.0.26: typedarray-to-buffer "^3.1.2" yaeti "^0.0.6" -websocket@^1.0.26: +websocket@^1.0.25, websocket@^1.0.26: version "1.0.28" resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.28.tgz#9e5f6fdc8a3fe01d4422647ef93abdd8d45a78d3" dependencies: @@ -17866,6 +18203,31 @@ window-size@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" +winston@0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/winston/-/winston-0.8.0.tgz#61d0830fa699706212206b0a2b5ca69a93043668" + integrity sha1-YdCDD6aZcGISIGsKK1ymmpMENmg= + dependencies: + async "0.2.x" + colors "0.6.x" + cycle "1.0.x" + eyes "0.1.x" + pkginfo "0.3.x" + stack-trace "0.0.x" + +winston@0.8.x, winston@~0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/winston/-/winston-0.8.3.tgz#64b6abf4cd01adcaefd5009393b1d8e8bec19db0" + integrity sha1-ZLar9M0Brcrv1QCTk7HY6L7BnbA= + dependencies: + async "0.2.x" + colors "0.6.x" + cycle "1.0.x" + eyes "0.1.x" + isstream "0.1.x" + pkginfo "0.3.x" + stack-trace "0.0.x" + winston@2.1.x: version "2.1.1" resolved "https://registry.yarnpkg.com/winston/-/winston-2.1.1.tgz#3c9349d196207fd1bdff9d4bc43ef72510e3a12e" @@ -17882,14 +18244,14 @@ wordwrap@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" +"wordwrap@>=0.0.1 <0.1.0", wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + wordwrap@^1.0.0, wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - worker-farm@^1.5.2: version "1.6.0" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" @@ -18120,13 +18482,6 @@ yargs-parser@10.x, yargs-parser@^10.0.0, yargs-parser@^10.1.0: dependencies: camelcase "^4.1.0" -yargs-parser@^11.1.1: - version "11.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - yargs-parser@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4" @@ -18152,7 +18507,7 @@ yargs-parser@^9.0.2: dependencies: camelcase "^4.1.0" -yargs@11.1.0: +yargs@11.1.0, yargs@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" dependencies: @@ -18237,23 +18592,6 @@ yargs@^12.0.1: y18n "^3.2.1 || ^4.0.0" yargs-parser "^10.1.0" -yargs@^12.0.5: - version "12.0.5" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" - dependencies: - cliui "^4.0.0" - decamelize "^1.2.0" - find-up "^3.0.0" - get-caller-file "^1.0.1" - os-locale "^3.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1 || ^4.0.0" - yargs-parser "^11.1.1" - yargs@^3.7.2: version "3.32.0" resolved "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995"