[ { "inputs": [], "stateMutability": "nonpayable", "type": "constructor" }, { "inputs": [], "name": "ARRAY_LENGTH_MISMATCH", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "CONSUMER_ALREADY_SUBSCRIBED", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "subscription", "type": "uint256" }, { "internalType": "address", "name": "consumer", "type": "address" } ], "name": "CONSUMER_NOT_FOUND", "type": "error" }, { "inputs": [], "name": "CONSUMER_ZERO", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "total", "type": "uint256" }, { "internalType": "uint256", "name": "current", "type": "uint256" } ], "name": "MAX_CONSUMERS_ADDITION_REACHED", "type": "error" }, { "inputs": [], "name": "NOTHING_TO_PAY", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "token", "type": "address" } ], "name": "NOT_APPROVED_TOKEN", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "NOT_DATASET_OWNER", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "NOT_SUBSCRIPTION_OWNER", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "minimum", "type": "uint256" }, { "internalType": "uint256", "name": "maximum", "type": "uint256" }, { "internalType": "uint256", "name": "current", "type": "uint256" } ], "name": "SUBSCRIPTION_DURATION_INVALID", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "validTill", "type": "uint256" }, { "internalType": "uint256", "name": "currentTimestamp", "type": "uint256" } ], "name": "SUBSCRIPTION_ENDED", "type": "error" }, { "inputs": [], "name": "SUBSCRIPTION_FEE_EXCEEDS_LIMIT", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "maximum", "type": "uint256" }, { "internalType": "uint256", "name": "current", "type": "uint256" } ], "name": "SUBSCRIPTION_REMAINING_DURATION", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "id", "type": "uint256" } ], "name": "UNSUPPORTED_DATASET", "type": "error" }, { "inputs": [], "name": "UNSUPPORTED_MSG_VALUE", "type": "error" }, { "inputs": [], "name": "UNSUPPORTED_NATIVE_CURRENCY", "type": "error" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "approved", "type": "address" }, { "indexed": true, "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "Approval", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "operator", "type": "address" }, { "indexed": false, "internalType": "bool", "name": "approved", "type": "bool" } ], "name": "ApprovalForAll", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "id", "type": "uint256" }, { "indexed": true, "internalType": "address", "name": "consumer", "type": "address" } ], "name": "ConsumerAdded", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "id", "type": "uint256" }, { "indexed": true, "internalType": "address", "name": "consumer", "type": "address" } ], "name": "ConsumerRemoved", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint8", "name": "version", "type": "uint8" } ], "name": "Initialized", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "id", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "validSince", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "validTill", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "paidConsumers", "type": "uint256" } ], "name": "SubscriptionPaid", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": true, "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "Transfer", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "newTrustedForwarder", "type": "address" } ], "name": "TrustedForwarderSourceChanged", "type": "event" }, { "inputs": [], "name": "MAX_SUBSCRIPTION_DURATION_IN_DAYS", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "MAX_SUBSCRIPTION_EXTENSION_IN_DAYS", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "subscription", "type": "uint256" }, { "internalType": "address[]", "name": "consumers", "type": "address[]" } ], "name": "addConsumers", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "approve", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "dataset", "outputs": [ { "internalType": "contract IDatasetNFT", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "datasetId", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "subscription", "type": "uint256" }, { "internalType": "uint256", "name": "extraDurationInDays", "type": "uint256" }, { "internalType": "uint256", "name": "extraConsumers", "type": "uint256" }, { "internalType": "uint256", "name": "maxExtraFee", "type": "uint256" } ], "name": "extendSubscription", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "subscription", "type": "uint256" }, { "internalType": "uint256", "name": "extraConsumers", "type": "uint256" } ], "name": "extraConsumerFee", "outputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "feePerConsumerPerDay", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "getApproved", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "dataset_", "type": "address" }, { "internalType": "uint256", "name": "datasetId_", "type": "uint256" } ], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "operator", "type": "address" } ], "name": "isApprovedForAll", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "ds", "type": "uint256" }, { "internalType": "address", "name": "consumer", "type": "address" } ], "name": "isSubscriptionPaidFor", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "forwarder", "type": "address" } ], "name": "isTrustedForwarder", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "name", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "ownerOf", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "subscription", "type": "uint256" }, { "internalType": "address[]", "name": "consumers", "type": "address[]" } ], "name": "removeConsumers", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "subscription", "type": "uint256" }, { "internalType": "address[]", "name": "oldConsumers", "type": "address[]" }, { "internalType": "address[]", "name": "newConsumers", "type": "address[]" } ], "name": "replaceConsumers", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "safeTransferFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "safeTransferFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" }, { "internalType": "bool", "name": "approved", "type": "bool" } ], "name": "setApprovalForAll", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "token_", "type": "address" }, { "internalType": "uint256", "name": "feePerConsumerPerDay_", "type": "uint256" } ], "name": "setFee", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "ds", "type": "uint256" }, { "internalType": "uint256", "name": "durationInDays", "type": "uint256" }, { "internalType": "uint256", "name": "consumers", "type": "uint256" }, { "internalType": "uint256", "name": "maxFee", "type": "uint256" } ], "name": "subscribe", "outputs": [ { "internalType": "uint256", "name": "sid", "type": "uint256" } ], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "ds", "type": "uint256" }, { "internalType": "uint256", "name": "durationInDays", "type": "uint256" }, { "internalType": "address[]", "name": "consumers", "type": "address[]" }, { "internalType": "uint256", "name": "maxFee", "type": "uint256" } ], "name": "subscribeAndAddConsumers", "outputs": [ { "internalType": "uint256", "name": "sid", "type": "uint256" } ], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "ds", "type": "uint256" }, { "internalType": "uint256", "name": "durationInDays", "type": "uint256" }, { "internalType": "uint256", "name": "consumers", "type": "uint256" } ], "name": "subscriptionFee", "outputs": [ { "internalType": "address", "name": "token", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes4", "name": "interfaceId", "type": "bytes4" } ], "name": "supportsInterface", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "symbol", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "token", "outputs": [ { "internalType": "contract IERC20", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "index", "type": "uint256" } ], "name": "tokenByIndex", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "uint256", "name": "index", "type": "uint256" } ], "name": "tokenOfOwnerByIndex", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "tokenURI", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalSupply", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "transferFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" } ]
60806040523480156200001157600080fd5b506200001c62000022565b620000e3565b600054610100900460ff16156200008f5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811614620000e1576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6135bc80620000f36000396000f3fe6080604052600436106101f95760003560e01c8063572b6c051161010d578063baa80a31116100a0578063d02d70191161006f578063d02d701914610582578063e55156b514610598578063e6bebb32146105b8578063e985e9c5146105f7578063fc0c546a1461064057600080fd5b8063baa80a3114610518578063bd1c4e711461052b578063c87b56dd14610542578063cd6dc6871461056257600080fd5b806395d89b41116100dc57806395d89b41146104a35780639e02247e146104b8578063a22cb465146104d8578063b88d4fde146104f857600080fd5b8063572b6c05146104235780636352211e1461044357806370a08231146104635780637963041d1461048357600080fd5b80632101bf93116101905780633cf32b141161015f5780633cf32b141461038e57806342842e0e146103ae5780634f6ccce7146103ce578063544754ea146103ee5780635620bb691461040357600080fd5b80632101bf931461031857806323b872dd14610338578063253be384146103585780632f745c591461036e57600080fd5b8063095ea7b3116101cc578063095ea7b3146102ad57806314eef9dd146102cf57806318160ddd146102f05780631f5efb011461030557600080fd5b806301ffc9a7146101fe57806302b728ab1461023357806306fdde031461026b578063081812fc1461028d575b600080fd5b34801561020a57600080fd5b5061021e610219366004612cc8565b610661565b60405190151581526020015b60405180910390f35b34801561023f57600080fd5b5060fc54610253906001600160a01b031681565b6040516001600160a01b03909116815260200161022a565b34801561027757600080fd5b5061028061068c565b60405161022a9190612d35565b34801561029957600080fd5b506102536102a8366004612d48565b61071e565b3480156102b957600080fd5b506102cd6102c8366004612d76565b610745565b005b6102e26102dd366004612de7565b610871565b60405190815260200161022a565b3480156102fc57600080fd5b506099546102e2565b6102e2610313366004612e42565b610895565b34801561032457600080fd5b506102e2610333366004612e74565b6108ae565b34801561034457600080fd5b506102cd610353366004612e96565b610986565b34801561036457600080fd5b506102e261016d81565b34801561037a57600080fd5b506102e2610389366004612d76565b6109be565b34801561039a57600080fd5b506102cd6103a9366004612ed7565b610a54565b3480156103ba57600080fd5b506102cd6103c9366004612e96565b610ab8565b3480156103da57600080fd5b506102e26103e9366004612d48565b610ad3565b3480156103fa57600080fd5b506102e2601e81565b34801561040f57600080fd5b5061021e61041e366004612f23565b610b66565b34801561042f57600080fd5b5061021e61043e366004612f53565b610beb565b34801561044f57600080fd5b5061025361045e366004612d48565b610c5a565b34801561046f57600080fd5b506102e261047e366004612f53565b610cba565b34801561048f57600080fd5b506102cd61049e366004612f70565b610d40565b3480156104af57600080fd5b50610280610da8565b3480156104c457600080fd5b506102cd6104d3366004612ed7565b610db7565b3480156104e457600080fd5b506102cd6104f3366004612ff8565b610e14565b34801561050457600080fd5b506102cd61051336600461303c565b610e2a565b6102cd610526366004612e42565b610e69565b34801561053757600080fd5b506102e26101025481565b34801561054e57600080fd5b5061028061055d366004612d48565b610e75565b34801561056e57600080fd5b506102cd61057d366004612d76565b610ee9565b34801561058e57600080fd5b506102e260fd5481565b3480156105a457600080fd5b506102cd6105b3366004612d76565b611050565b3480156105c457600080fd5b506105d86105d336600461311c565b6111ed565b604080516001600160a01b03909316835260208301919091520161022a565b34801561060357600080fd5b5061021e610612366004613148565b6001600160a01b039182166000908152606a6020908152604080832093909416825291909152205460ff1690565b34801561064c57600080fd5b5061010154610253906001600160a01b031681565b60006001600160e01b03198216631e44eae760e01b148061068657506106868261126e565b92915050565b60606065805461069b90613176565b80601f01602080910402602001604051908101604052809291908181526020018280546106c790613176565b80156107145780601f106106e957610100808354040283529160200191610714565b820191906000526020600020905b8154815290600101906020018083116106f757829003601f168201915b5050505050905090565b600061072982611293565b506000908152606960205260409020546001600160a01b031690565b600061075082610c5a565b9050806001600160a01b0316836001600160a01b0316036107c25760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b806001600160a01b03166107d46112f5565b6001600160a01b031614806107f057506107f0816106126112f5565b6108625760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c00000060648201526084016107b9565b61086c8383611304565b505050565b600061087f86868585611372565b905061088c81858561150e565b95945050505050565b60006108a385858585611372565b90505b949350505050565b6000816000036108d15760405163358b0b7760e01b815260040160405180910390fd5b600083815260ff6020526040902060018101544210610912576001810154604051637ba532d760e11b815260048101919091524260248201526044016107b9565b6000620151808260000154836001015461092c91906131c6565b61093691906131d9565b90506000610948828460020154611637565b91505060006109668387866002015461096191906131fb565b611637565b91505081811161097757600061097b565b8181035b979650505050505050565b6109976109916112f5565b82611673565b6109b35760405162461bcd60e51b81526004016107b99061320e565b61086c8383836116f1565b60006109c983610cba565b8210610a2b5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016107b9565b506001600160a01b03919091166000908152609760209081526040808320938352929052205490565b826000610a5f6112f5565b9050806001600160a01b0316610a7483610c5a565b6001600160a01b031614610aa65760405163acc21a5960e01b81526001600160a01b03821660048201526024016107b9565b610ab1858585611862565b5050505050565b61086c83838360405180602001604052806000815250610e2a565b6000610ade60995490565b8210610b415760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016107b9565b60998281548110610b5457610b5461325b565b90600052602060002001549050919050565b6000610b718361192a565b6001600160a01b03821660009081526101006020526040812090610b948261194f565b905060005b81811015610bdf576000610bad8483611959565b600081815260ff6020526040902060010154909150421015610bd6576001945050505050610686565b50600101610b99565b50600095945050505050565b60c95460405163572b6c0560e01b81526001600160a01b038381166004830152600092169063572b6c0590602401602060405180830381865afa158015610c36573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106869190613271565b6000818152606760205260408120546001600160a01b0316806106865760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016107b9565b60006001600160a01b038216610d245760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016107b9565b506001600160a01b031660009081526068602052604090205490565b846000610d4b6112f5565b9050806001600160a01b0316610d6083610c5a565b6001600160a01b031614610d925760405163acc21a5960e01b81526001600160a01b03821660048201526024016107b9565b610d9f8787878787611965565b50505050505050565b60606066805461069b90613176565b826000610dc26112f5565b9050806001600160a01b0316610dd783610c5a565b6001600160a01b031614610e095760405163acc21a5960e01b81526001600160a01b03821660048201526024016107b9565b610ab185858561150e565b610e26610e1f6112f5565b8383611b19565b5050565b610e3b610e356112f5565b83611673565b610e575760405162461bcd60e51b81526004016107b99061320e565b610e6384848484611be7565b50505050565b610e6384848484611c1a565b6060610e8082611293565b6000610e9760408051602081019091526000815290565b90506000815111610eb75760405180602001604052806000815250610ee2565b80610ec184611dfb565b604051602001610ed292919061328e565b6040516020818303038152906040525b9392505050565b600054610100900460ff1615808015610f095750600054600160ff909116105b80610f235750303b158015610f23575060005460ff166001145b610f865760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016107b9565b6000805460ff191660011790558015610fa9576000805461ff0019166101001790555b610ffc60405180604001604052806013815260200172273ab5b630b49029bab139b1b934b83a34b7b760691b815250604051806040016040528060068152602001652720a4a9aaa160d11b815250611e8e565b6110068383611ebf565b801561086c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b600061105a6112f5565b60fc5460fd546040516331a9108f60e11b81529293506001600160a01b0380851693921691636352211e916110959160040190815260200190565b602060405180830381865afa1580156110b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d691906132bd565b6001600160a01b031614611107576040516250b83f60e81b81526001600160a01b03821660048201526024016107b9565b6001600160a01b03831661112e5760405163332f9a7560e01b815260040160405180910390fd5b60fc54604051632d5ad3d560e01b81526001600160a01b03858116600483015290911690632d5ad3d590602401602060405180830381865afa158015611178573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119c9190613271565b6111c4576040516307f5aa0960e21b81526001600160a01b03841660048201526024016107b9565b5061010180546001600160a01b0319166001600160a01b03939093169290921790915561010255565b6000806111f98561192a565b831580611207575061016d84115b156112375760405163f016b95760e01b81526001600482015261016d6024820152604481018590526064016107b9565b826000036112585760405163358b0b7760e01b815260040160405180910390fd5b6112628484611637565b91509150935093915050565b60006001600160e01b0319821663780e9d6360e01b1480610686575061068682611f01565b6000818152606760205260409020546001600160a01b03166112f25760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016107b9565b50565b60006112ff611f51565b905090565b600081815260696020526040902080546001600160a01b0319166001600160a01b038416908117909155819061133982610c5a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061137d8561192a565b61138861047e6112f5565b156113ba576113956112f5565b60405163fdb7add360e01b81526001600160a01b0390911660048201526024016107b9565b8315806113c8575061016d84115b156113f85760405163f016b95760e01b81526001600482015261016d6024820152604481018590526064016107b9565b826000036114195760405163358b0b7760e01b815260040160405180910390fd5b60006114258585611637565b9150508281111561144957604051639e45baef60e01b815260040160405180910390fd5b61145a6114546112f5565b82611f80565b60fe60008154611469906132da565b9182905550600081815260ff6020526040902042815590925061148f86620151806132f3565b61149990426131fb565b6001820155600281018590556114b66114b06112f5565b84612108565b8054600182015460028301546040805193845260208401929092529082015283907fc0c5f780288600bd422b1277ec0e23da2694f7b048ca78e7c40a05f9848382389060600160405180910390a25050949350505050565b61151783611293565b600083815260ff602052604090206002810154826115376003840161194f565b61154191906131fb565b1115611585576002810154826115596003840161194f565b61156391906131fb565b604051630fa1ec2160e41b8152600481019290925260248201526044016107b9565b60005b82811015610ab15760008484838181106115a4576115a461325b565b90506020020160208101906115b99190612f53565b905060006115ca6003850183612122565b9050801561162d576001600160a01b0382166000908152610100602052604090206115f59088612137565b506040516001600160a01b0383169088907f4e5aab67fb6878a7c5437d638d002992f2b503107c053f38483f6b294948749390600090a35b5050600101611588565b610101546101025460009182916001600160a01b0390911690849061165d9087906132f3565b61166791906132f3565b915091505b9250929050565b60008061167f83610c5a565b9050806001600160a01b0316846001600160a01b031614806116c657506001600160a01b038082166000908152606a602090815260408083209388168352929052205460ff165b806108a65750836001600160a01b03166116df8461071e565b6001600160a01b031614949350505050565b826001600160a01b031661170482610c5a565b6001600160a01b03161461172a5760405162461bcd60e51b81526004016107b99061330a565b6001600160a01b03821661178c5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107b9565b6117998383836001612143565b826001600160a01b03166117ac82610c5a565b6001600160a01b0316146117d25760405162461bcd60e51b81526004016107b99061330a565b600081815260696020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260688552838620805460001901905590871680865283862080546001019055868652606790945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61186b83611293565b600083815260ff60205260408120905b82811015610ab15760008484838181106118975761189761325b565b90506020020160208101906118ac9190612f53565b905060006118bd6003850183612270565b90508015611920576001600160a01b0382166000908152610100602052604090206118e89088612285565b506040516001600160a01b0383169088907f5274c432b5877b38569ae9babd361f86e4b34d0f36aef7f6c61cbba5f185cee190600090a35b505060010161187b565b8060fd54146112f257604051632383105b60e11b8152600481018290526024016107b9565b6000610686825490565b6000610ee28383612291565b61196e85611293565b600085815260ff6020526040902083821461199c57604051634456f5e960e11b815260040160405180910390fd5b60005b84811015610d9f5760008686838181106119bb576119bb61325b565b90506020020160208101906119d09190612f53565b905060006119e16003850183612270565b90508015611a48576001600160a01b038216600090815261010060205260409020611a0c908a612285565b506040516001600160a01b038316908a907f5274c432b5877b38569ae9babd361f86e4b34d0f36aef7f6c61cbba5f185cee190600090a3611a73565b604051632d7c4b6560e01b8152600481018a90526001600160a01b03831660248201526044016107b9565b858584818110611a8557611a8561325b565b9050602002016020810190611a9a9190612f53565b91506000611aab6003860184612122565b90508015611b0e576001600160a01b038316600090815261010060205260409020611ad6908b612137565b506040516001600160a01b038416908b907f4e5aab67fb6878a7c5437d638d002992f2b503107c053f38483f6b294948749390600090a35b50505060010161199f565b816001600160a01b0316836001600160a01b031603611b7a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107b9565b6001600160a01b038381166000818152606a6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611bf28484846116f1565b611bfe848484846122bb565b610e635760405162461bcd60e51b81526004016107b99061334f565b611c2384611293565b600084815260ff60205260408120600181015490919081908190421015611cd2578615611c8457600184015442900362278d00811115611c8257604051637186771960e11b815262278d006004820152602481018290526044016107b9565b505b60006201518085600001548660010154611c9e91906131c6565b611ca891906131d9565b9050611cb8818660020154611637565b865494509250611cca905088826131fb565b935050611cd9565b4291508692505b61016d831115611d0e5760405163f016b95760e01b81526001600482015261016d6024820152604481018490526064016107b9565b6000868560020154611d2091906131fb565b90506000611d2e8583611637565b915050828111611d5157604051633002614d60e01b815260040160405180910390fd5b82810387811115611d7557604051639e45baef60e01b815260040160405180910390fd5b611d806114546112f5565b50838655611d9185620151806132f3565b611d9b90856131fb565b600187018190556002870183905586546040805191825260208201929092529081018390528a907fc0c5f780288600bd422b1277ec0e23da2694f7b048ca78e7c40a05f9848382389060600160405180910390a250505050505050505050565b60606000611e08836123c0565b600101905060008167ffffffffffffffff811115611e2857611e28613026565b6040519080825280601f01601f191660200182016040528015611e52576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611e5c57509392505050565b600054610100900460ff16611eb55760405162461bcd60e51b81526004016107b9906133a1565b610e268282612498565b600054610100900460ff16611ee65760405162461bcd60e51b81526004016107b9906133a1565b611eef826124d8565b611ef98282612508565b610e26612555565b60006001600160e01b031982166380ac58cd60e01b1480611f3257506001600160e01b03198216635b5e139f60e01b145b8061068657506301ffc9a760e01b6001600160e01b0319831614610686565b6000611f5c33610beb565b8015611f69575060143610155b15611f7b575060131936013560601c90565b503390565b3415611f9f57604051631fbeaa8f60e01b815260040160405180910390fd5b61010154611fb8906001600160a01b031683308461257e565b60fc5460fd5460405163f9c3648960e01b815260048101919091526000916001600160a01b03169063f9c3648990602401602060405180830381865afa158015612006573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061202a91906132bd565b6101015460405163095ea7b360e01b81526001600160a01b0380841660048301526024820186905292935091169063095ea7b3906044016020604051808303816000875af1158015612080573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a49190613271565b5061010154604051635259b9ab60e01b81526001600160a01b0391821660048201526024810184905290821690635259b9ab90604401600060405180830381600087803b1580156120f457600080fd5b505af1158015610d9f573d6000803e3d6000fd5b610e268282604051806020016040528060008152506125d8565b6000610ee2836001600160a01b03841661260b565b6000610ee2838361260b565b60018111156121b25760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b60648201526084016107b9565b816001600160a01b03851661220e5761220981609980546000838152609a60205260408120829055600182018355919091527f72a152ddfb8e864297c917af52ea6c1c68aead0fee1a62673fcc7e0c94979d000155565b612231565b836001600160a01b0316856001600160a01b03161461223157612231858261265a565b6001600160a01b03841661224d57612248816126f7565b610ab1565b846001600160a01b0316846001600160a01b031614610ab157610ab184826127a6565b6000610ee2836001600160a01b0384166127ea565b6000610ee283836127ea565b60008260000182815481106122a8576122a861325b565b9060005260206000200154905092915050565b60006001600160a01b0384163b156123b857836001600160a01b031663150b7a026122e46112f5565b8786866040518563ffffffff1660e01b815260040161230694939291906133ec565b6020604051808303816000875af1925050508015612341575060408051601f3d908101601f1916820190925261233e91810190613429565b60015b61239e573d80801561236f576040519150601f19603f3d011682016040523d82523d6000602084013e612374565b606091505b5080516000036123965760405162461bcd60e51b81526004016107b99061334f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506108a6565b5060016108a6565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106123ff5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef8100000000831061242b576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061244957662386f26fc10000830492506010015b6305f5e1008310612461576305f5e100830492506008015b612710831061247557612710830492506004015b60648310612487576064830492506002015b600a83106106865760010192915050565b600054610100900460ff166124bf5760405162461bcd60e51b81526004016107b9906133a1565b60656124cb8382613494565b50606661086c8282613494565b600054610100900460ff166124ff5760405162461bcd60e51b81526004016107b9906133a1565b6112f2816128dd565b600054610100900460ff1661252f5760405162461bcd60e51b81526004016107b9906133a1565b60fc80546001600160a01b0319166001600160a01b03939093169290921790915560fd55565b600054610100900460ff1661257c5760405162461bcd60e51b81526004016107b9906133a1565b565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610e63908590612931565b6125e28383612a06565b6125ef60008484846122bb565b61086c5760405162461bcd60e51b81526004016107b99061334f565b600081815260018301602052604081205461265257508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610686565b506000610686565b6000600161266784610cba565b61267191906131c6565b6000838152609860205260409020549091508082146126c4576001600160a01b03841660009081526097602090815260408083208584528252808320548484528184208190558352609890915290208190555b5060009182526098602090815260408084208490556001600160a01b039094168352609781528383209183525290812055565b609954600090612709906001906131c6565b6000838152609a6020526040812054609980549394509092849081106127315761273161325b565b9060005260206000200154905080609983815481106127525761275261325b565b6000918252602080832090910192909255828152609a9091526040808220849055858252812055609980548061278a5761278a613554565b6001900381819060005260206000200160009055905550505050565b60006127b183610cba565b6001600160a01b039093166000908152609760209081526040808320868452825280832085905593825260989052919091209190915550565b600081815260018301602052604081205480156128d357600061280e6001836131c6565b8554909150600090612822906001906131c6565b90508181146128875760008660000182815481106128425761284261325b565b90600052602060002001549050808760000184815481106128655761286561325b565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061289857612898613554565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610686565b6000915050610686565b60c980546001600160a01b0319166001600160a01b0383169081179091556040519081527f38dd1fb2d26f08c618b847328db3c9278e3c4c8922fec738f7d8b0a3abc8a5a79060200160405180910390a150565b6000612986826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612b9f9092919063ffffffff16565b90508051600014806129a75750808060200190518101906129a79190613271565b61086c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016107b9565b6001600160a01b038216612a5c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107b9565b6000818152606760205260409020546001600160a01b031615612ac15760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107b9565b612acf600083836001612143565b6000818152606760205260409020546001600160a01b031615612b345760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107b9565b6001600160a01b038216600081815260686020908152604080832080546001019055848352606790915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60606108a6848460008585600080866001600160a01b03168587604051612bc6919061356a565b60006040518083038185875af1925050503d8060008114612c03576040519150601f19603f3d011682016040523d82523d6000602084013e612c08565b606091505b509150915061097b8783838760608315612c83578251600003612c7c576001600160a01b0385163b612c7c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107b9565b50816108a6565b6108a68383815115612c985781518083602001fd5b8060405162461bcd60e51b81526004016107b99190612d35565b6001600160e01b0319811681146112f257600080fd5b600060208284031215612cda57600080fd5b8135610ee281612cb2565b60005b83811015612d00578181015183820152602001612ce8565b50506000910152565b60008151808452612d21816020860160208601612ce5565b601f01601f19169290920160200192915050565b602081526000610ee26020830184612d09565b600060208284031215612d5a57600080fd5b5035919050565b6001600160a01b03811681146112f257600080fd5b60008060408385031215612d8957600080fd5b8235612d9481612d61565b946020939093013593505050565b60008083601f840112612db457600080fd5b50813567ffffffffffffffff811115612dcc57600080fd5b6020830191508360208260051b850101111561166c57600080fd5b600080600080600060808688031215612dff57600080fd5b8535945060208601359350604086013567ffffffffffffffff811115612e2457600080fd5b612e3088828901612da2565b96999598509660600135949350505050565b60008060008060808587031215612e5857600080fd5b5050823594602084013594506040840135936060013592509050565b60008060408385031215612e8757600080fd5b50508035926020909101359150565b600080600060608486031215612eab57600080fd5b8335612eb681612d61565b92506020840135612ec681612d61565b929592945050506040919091013590565b600080600060408486031215612eec57600080fd5b83359250602084013567ffffffffffffffff811115612f0a57600080fd5b612f1686828701612da2565b9497909650939450505050565b60008060408385031215612f3657600080fd5b823591506020830135612f4881612d61565b809150509250929050565b600060208284031215612f6557600080fd5b8135610ee281612d61565b600080600080600060608688031215612f8857600080fd5b85359450602086013567ffffffffffffffff80821115612fa757600080fd5b612fb389838a01612da2565b90965094506040880135915080821115612fcc57600080fd5b50612fd988828901612da2565b969995985093965092949392505050565b80151581146112f257600080fd5b6000806040838503121561300b57600080fd5b823561301681612d61565b91506020830135612f4881612fea565b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561305257600080fd5b843561305d81612d61565b9350602085013561306d81612d61565b925060408501359150606085013567ffffffffffffffff8082111561309157600080fd5b818701915087601f8301126130a557600080fd5b8135818111156130b7576130b7613026565b604051601f8201601f19908116603f011681019083821181831017156130df576130df613026565b816040528281528a60208487010111156130f857600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060006060848603121561313157600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561315b57600080fd5b823561316681612d61565b91506020830135612f4881612d61565b600181811c9082168061318a57607f821691505b6020821081036131aa57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610686576106866131b0565b6000826131f657634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610686576106866131b0565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561328357600080fd5b8151610ee281612fea565b600083516132a0818460208801612ce5565b8351908301906132b4818360208801612ce5565b01949350505050565b6000602082840312156132cf57600080fd5b8151610ee281612d61565b6000600182016132ec576132ec6131b0565b5060010190565b8082028115828204841417610686576106866131b0565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061341f90830184612d09565b9695505050505050565b60006020828403121561343b57600080fd5b8151610ee281612cb2565b601f82111561086c57600081815260208120601f850160051c8101602086101561346d5750805b601f850160051c820191505b8181101561348c57828155600101613479565b505050505050565b815167ffffffffffffffff8111156134ae576134ae613026565b6134c2816134bc8454613176565b84613446565b602080601f8311600181146134f757600084156134df5750858301515b600019600386901b1c1916600185901b17855561348c565b600085815260208120601f198616915b8281101561352657888601518255948401946001909101908401613507565b50858210156135445787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603160045260246000fd5b6000825161357c818460208701612ce5565b919091019291505056fea26469706673582212208eebc1a5ef776fb6dd080a88befd6b613ff675713eb004515e2774e9d4222f9764736f6c63430008120033