UNPKG

@lukso/lsp7-contracts

Version:
1,574 lines 119 kB
{ "_format": "hh3-artifact-1", "contractName": "LSP7CustomizableToken", "sourceName": "contracts/presets/LSP7CustomizableToken.sol", "abi": [ { "inputs": [ { "internalType": "string", "name": "name_", "type": "string" }, { "internalType": "string", "name": "symbol_", "type": "string" }, { "internalType": "address", "name": "newOwner_", "type": "address" }, { "internalType": "uint256", "name": "lsp4TokenType_", "type": "uint256" }, { "internalType": "bool", "name": "isNonDivisible_", "type": "bool" }, { "components": [ { "internalType": "bool", "name": "isMintable", "type": "bool" }, { "internalType": "uint256", "name": "initialMintAmount", "type": "uint256" } ], "internalType": "struct LSP7MintableParams", "name": "mintableParams", "type": "tuple" }, { "components": [ { "internalType": "uint256", "name": "tokenBalanceCap", "type": "uint256" }, { "internalType": "uint256", "name": "tokenSupplyCap", "type": "uint256" } ], "internalType": "struct LSP7CappedParams", "name": "cappedParams", "type": "tuple" }, { "components": [ { "internalType": "uint256", "name": "transferLockStart", "type": "uint256" }, { "internalType": "uint256", "name": "transferLockEnd", "type": "uint256" } ], "internalType": "struct LSP7NonTransferableParams", "name": "nonTransferableParams", "type": "tuple" }, { "components": [ { "internalType": "bool", "name": "isRevokable", "type": "bool" } ], "internalType": "struct LSP7RevokableParams", "name": "revokableParams", "type": "tuple" } ], "stateMutability": "nonpayable", "type": "constructor" }, { "inputs": [], "name": "AccessControlBadConfirmation", "type": "error" }, { "inputs": [], "name": "AccessControlCannotSetAdminForDefaultAdminRole", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" }, { "internalType": "bytes32", "name": "neededRole", "type": "bytes32" } ], "name": "AccessControlUnauthorizedAccount", "type": "error" }, { "inputs": [], "name": "ERC725Y_DataKeysValuesEmptyArray", "type": "error" }, { "inputs": [], "name": "ERC725Y_DataKeysValuesLengthMismatch", "type": "error" }, { "inputs": [], "name": "ERC725Y_MsgValueDisallowed", "type": "error" }, { "inputs": [ { "internalType": "bytes", "name": "storedData", "type": "bytes" } ], "name": "InvalidExtensionAddress", "type": "error" }, { "inputs": [ { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "InvalidFunctionSelector", "type": "error" }, { "inputs": [], "name": "LSP4TokenNameNotEditable", "type": "error" }, { "inputs": [], "name": "LSP4TokenSymbolNotEditable", "type": "error" }, { "inputs": [], "name": "LSP4TokenTypeNotEditable", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "tokenOwner", "type": "address" }, { "internalType": "uint256", "name": "authorizedAmount", "type": "uint256" }, { "internalType": "address", "name": "operator", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "LSP7AmountExceedsAuthorizedAmount", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "balance", "type": "uint256" }, { "internalType": "address", "name": "tokenOwner", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "LSP7AmountExceedsBalance", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "callIndex", "type": "uint256" } ], "name": "LSP7BatchCallFailed", "type": "error" }, { "inputs": [], "name": "LSP7CannotSendWithAddressZero", "type": "error" }, { "inputs": [], "name": "LSP7CannotUpdateTransferLockPeriod", "type": "error" }, { "inputs": [], "name": "LSP7CannotUseAddressZeroAsOperator", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "tranferAmount", "type": "uint256" }, { "internalType": "uint256", "name": "balanceOf", "type": "uint256" }, { "internalType": "uint256", "name": "tokenBalanceCap", "type": "uint256" } ], "name": "LSP7CappedBalanceExceeded", "type": "error" }, { "inputs": [], "name": "LSP7CappedSupplyCannotMintOverCap", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "caller", "type": "address" }, { "internalType": "address", "name": "tokenOwner", "type": "address" }, { "internalType": "address", "name": "operator", "type": "address" } ], "name": "LSP7DecreaseAllowanceNotAuthorized", "type": "error" }, { "inputs": [], "name": "LSP7DecreasedAllowanceBelowZero", "type": "error" }, { "inputs": [], "name": "LSP7InvalidTransferBatch", "type": "error" }, { "inputs": [], "name": "LSP7InvalidTransferLockPeriod", "type": "error" }, { "inputs": [], "name": "LSP7MintDisabled", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "tokenReceiver", "type": "address" } ], "name": "LSP7NotifyTokenReceiverContractMissingLSP1Interface", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "tokenReceiver", "type": "address" } ], "name": "LSP7NotifyTokenReceiverIsEOA", "type": "error" }, { "inputs": [], "name": "LSP7RevokableFeatureDisabled", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "caller", "type": "address" }, { "internalType": "address", "name": "tokenOwner", "type": "address" }, { "internalType": "address", "name": "operator", "type": "address" } ], "name": "LSP7RevokeOperatorNotAuthorized", "type": "error" }, { "inputs": [], "name": "LSP7TokenAlreadyTransferable", "type": "error" }, { "inputs": [], "name": "LSP7TokenContractCannotHoldValue", "type": "error" }, { "inputs": [], "name": "LSP7TokenOwnerCannotBeOperator", "type": "error" }, { "inputs": [], "name": "LSP7TransferDisabled", "type": "error" }, { "inputs": [ { "internalType": "bytes4", "name": "functionSelector", "type": "bytes4" } ], "name": "NoExtensionFoundForFunctionSelector", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" } ], "name": "OperatorAllowanceCannotBeIncreasedFromZero", "type": "error" }, { "inputs": [], "name": "OwnableCannotSetZeroAddressAsOwner", "type": "error" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "dataKey", "type": "bytes32" }, { "indexed": false, "internalType": "bytes", "name": "dataValue", "type": "bytes" } ], "name": "DataChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bool", "name": "enabled", "type": "bool" } ], "name": "MintingStatusChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "operator", "type": "address" }, { "indexed": true, "internalType": "address", "name": "tokenOwner", "type": "address" }, { "indexed": true, "internalType": "uint256", "name": "amount", "type": "uint256" }, { "indexed": false, "internalType": "bytes", "name": "operatorNotificationData", "type": "bytes" } ], "name": "OperatorAuthorizationChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "operator", "type": "address" }, { "indexed": true, "internalType": "address", "name": "tokenOwner", "type": "address" }, { "indexed": true, "internalType": "bool", "name": "notified", "type": "bool" }, { "indexed": false, "internalType": "bytes", "name": "operatorNotificationData", "type": "bytes" } ], "name": "OperatorRevoked", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "OwnershipTransferred", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bool", "name": "enabled", "type": "bool" } ], "name": "RevokableStatusChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "indexed": true, "internalType": "bytes32", "name": "previousAdminRole", "type": "bytes32" }, { "indexed": true, "internalType": "bytes32", "name": "newAdminRole", "type": "bytes32" } ], "name": "RoleAdminChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { "indexed": true, "internalType": "address", "name": "sender", "type": "address" } ], "name": "RoleGranted", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { "indexed": true, "internalType": "address", "name": "sender", "type": "address" } ], "name": "RoleRevoked", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "operator", "type": "address" }, { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" }, { "indexed": false, "internalType": "bool", "name": "force", "type": "bool" }, { "indexed": false, "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "Transfer", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "start", "type": "uint256" }, { "indexed": true, "internalType": "uint256", "name": "end", "type": "uint256" } ], "name": "TransferLockPeriodChanged", "type": "event" }, { "stateMutability": "payable", "type": "fallback" }, { "inputs": [], "name": "DEFAULT_ADMIN_ROLE", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "MINTER_ROLE", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "NON_TRANSFERABLE_BYPASS_ROLE", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "REVOKER_ROLE", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "UNCAPPED_BALANCE_ROLE", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "bytes", "name": "operatorNotificationData", "type": "bytes" } ], "name": "authorizeOperator", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" }, { "internalType": "address", "name": "tokenOwner", "type": "address" } ], "name": "authorizedAmountFor", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "tokenOwner", "type": "address" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes[]", "name": "data", "type": "bytes[]" } ], "name": "batchCalls", "outputs": [ { "internalType": "bytes[]", "name": "results", "type": "bytes[]" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "burn", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "decimals", "outputs": [ { "internalType": "uint8", "name": "", "type": "uint8" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" }, { "internalType": "address", "name": "tokenOwner", "type": "address" }, { "internalType": "uint256", "name": "subtractedAmount", "type": "uint256" }, { "internalType": "bytes", "name": "operatorNotificationData", "type": "bytes" } ], "name": "decreaseAllowance", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "disableMinting", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "disableRevokable", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "dataKey", "type": "bytes32" } ], "name": "getData", "outputs": [ { "internalType": "bytes", "name": "dataValue", "type": "bytes" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32[]", "name": "dataKeys", "type": "bytes32[]" } ], "name": "getDataBatch", "outputs": [ { "internalType": "bytes[]", "name": "dataValues", "type": "bytes[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "tokenOwner", "type": "address" } ], "name": "getOperatorsOf", "outputs": [ { "internalType": "address[]", "name": "", "type": "address[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" } ], "name": "getRoleAdmin", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "internalType": "uint256", "name": "index", "type": "uint256" } ], "name": "getRoleMember", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" } ], "name": "getRoleMemberCount", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" } ], "name": "getRoleMembers", "outputs": [ { "internalType": "address[]", "name": "", "type": "address[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "internalType": "address", "name": "account", "type": "address" } ], "name": "grantRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "internalType": "address", "name": "account", "type": "address" } ], "name": "hasRole", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" }, { "internalType": "uint256", "name": "addedAmount", "type": "uint256" }, { "internalType": "bytes", "name": "operatorNotificationData", "type": "bytes" } ], "name": "increaseAllowance", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "isMintable", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "isRevokable", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "isTransferable", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "makeTransferable", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "bool", "name": "force", "type": "bool" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "mint", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "owner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "internalType": "address", "name": "callerConfirmation", "type": "address" } ], "name": "renounceRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "revoke", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" }, { "internalType": "address", "name": "tokenOwner", "type": "address" }, { "internalType": "bool", "name": "notify", "type": "bool" }, { "internalType": "bytes", "name": "operatorNotificationData", "type": "bytes" } ], "name": "revokeOperator", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "internalType": "address", "name": "account", "type": "address" } ], "name": "revokeRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "rolesOf", "outputs": [ { "internalType": "bytes32[]", "name": "", "type": "bytes32[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "dataKey", "type": "bytes32" }, { "internalType": "bytes", "name": "dataValue", "type": "bytes" } ], "name": "setData", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "bytes32[]", "name": "dataKeys", "type": "bytes32[]" }, { "internalType": "bytes[]", "name": "dataValues", "type": "bytes[]" } ], "name": "setDataBatch", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "internalType": "bytes32", "name": "adminRole", "type": "bytes32" } ], "name": "setRoleAdmin", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes4", "name": "interfaceId", "type": "bytes4" } ], "name": "supportsInterface", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "tokenBalanceCap", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "tokenSupplyCap", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "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": "amount", "type": "uint256" }, { "internalType": "bool", "name": "force", "type": "bool" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "transfer", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address[]", "name": "from", "type": "address[]" }, { "internalType": "address[]", "name": "to", "type": "address[]" }, { "internalType": "uint256[]", "name": "amount", "type": "uint256[]" }, { "internalType": "bool[]", "name": "force", "type": "bool[]" }, { "internalType": "bytes[]", "name": "data", "type": "bytes[]" } ], "name": "transferBatch", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "transferLockEnabled", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "transferLockEnd", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "transferLockStart", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "newTransferLockStart", "type": "uint256" }, { "internalType": "uint256", "name": "newTransferLockEnd", "type": "uint256" } ], "name": "updateTransferLockPeriod", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "stateMutability": "payable", "type": "receive" } ], "bytecode": "0x60e060405234801561000f575f5ffd5b50604051615ddc380380615ddc83398101604081905261002e91611123565b8051825160208085015186519187015188519192918e8e8e8e8e848484848161005633610322565b6001600160a01b03811661007d576040516306b620db60e21b815260040160405180910390fd5b6100868161032e565b506040805180820190915260048152632936598960e21b60208201526100cd907feafec4d89fa9619884b60000a4d96624a38f7ac2d8d9a604ecf07c12c77e480c9061037d565b6100f77fdeba1e292f8ba88238e10ab3c7f88bd4be4fac56cad5194b6ecceaf653468af18561037d565b6101217f2f0a68ab07768e01943a599e73362a0e17a63a72e94dd2e384d2c1d4db9327568461037d565b6040805160208101839052610168917fe0261fa95db2eb3b5439bd033cda66d56b96f92f243a8228fd87550ed7bdfdb3910160408051601f1981840301815291905261037d565b50505050151560805250505f805461019193509091506001600160a01b03166103d1565b6103d1565b6009805460ff19168215159081179091556040517f41f386d449eec03c1c3b75bbba9c18df70aa19779ff47f68eab4b6a66fb399d4905f90a280156101f2576101f25f516020615dbc5f395f51905f5261018c5f546001600160a01b031690565b5060a05260c08190528015610223576102235f516020615d9c5f395f51905f5261018c5f546001600160a01b031690565b508015806102315750818110155b61024e57604051631a83985560e31b815260040160405180910390fd5b600a829055600b819055600c805460ff19166001179055604051819083907f938e6c55d25d181f86d200da26970f962ec97adb02dfa0452811fb9073573ebe905f90a36102b35f516020615d7c5f395f51905f5261018c5f546001600160a01b031690565b5050600c8054821580156101000261ff0019909216919091179091556102f5576102f55f516020615d5c5f395f51905f5261018c5f546001600160a01b031690565b506020840151156103145761031487856020015161044f60201b60201c565b5050505050505050506114a6565b61032b816104ad565b50565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f8281526001602052604090206103948282611283565b50817fece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b2826040516103c5919061136b565b60405180910390a25050565b5f8281526007602052604081206103e8908361054e565b9050801561044a576001600160a01b0382165f908152600860205260409020610411908461056b565b5060405133906001600160a01b0384169085907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d905f90a45b505050565b5f61045960a05190565b9050808211811580610469575080155b6104865760405163eacbf0d160e01b815260040160405180910390fd5b6104a78484600160405180602001604052805f81525061057660201b60201c565b50505050565b6104c45f516020615d5c5f395f51905f525f6105f5565b6104cd8161065a565b5f6104e45f516020615d5c5f395f51905f5261067a565b90505f5b815181101561044a575f8282815181106105045761050461137d565b60200260200101519050836001600160a01b0316816001600160a01b03160361052d5750610546565b6105445f516020615d5c5f395f51905f5282610693565b505b6001016104e8565b5f610562836001600160a01b038416610710565b90505b92915050565b5f6105628383610710565b6001600160a01b03841661059d57604051630d2d5ec360e41b815260040160405180910390fd5b6105aa5f8585858561075c565b6105b75f85858585610769565b5f335f8686856040516020016105d1959493929190611391565b60408051601f1981840301815291905290506105ee8584836108a8565b5050505050565b816106135760405163d0dc904b60e01b815260040160405180910390fd5b5f82815260066020526040808220805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6106715f516020615d7c5f395f51905f525f6105f5565b61032b816109ab565b5f818152600760205260409020606090610565906109cb565b5f8281526007602052604081206106aa90836109de565b9050801561044a576001600160a01b0382165f9081526008602052604090206106d390846109f2565b5060405133906001600160a01b0384169085907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b905f90a4505050565b5f81815260018301602052604081205461075557508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610565565b505f610565565b6105ee85858585856109fd565b6001600160a01b038516610793578260025f82825461078891906113df565b9091555061080e9050565b6001600160a01b0385165f90815260036020526040902054808685808310156107ed576040516308d4794960e01b815260048101939093526001600160a01b03909116602483015260448201526064015b60405180910390fd5b5050506001600160a01b0386165f9081526003602052604090209084900390555b6001600160a01b03841661082a57600280548490039055610848565b6001600160a01b0384165f9081526003602052604090208054840190555b836001600160a01b0316856001600160a01b0316336001600160a01b03167f3997e418d2cef0b3b0e907b1e39605c3f7d32dbd061e82ea5b4a770d46a160a6868686604051610899939291906113f2565b60405180910390a45050505050565b6108b983631aed5a8560e21b610a17565b1561094e57604051631aed5a8560e21b81526001600160a01b03841690636bb56a149061090c907f20804611b3e2ea21c480dc465142210acf4a2485947541770ec1fb87dee4a55c90859060040161141b565b5f604051808303815f875af1158015610927573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526104a7919081019061143b565b8161044a576001600160a01b0383163b15610987576040516353047ddb60e11b81526001600160a01b03841660048201526024016107e4565b6040516309b091fd60e21b81526001600160a01b03841660048201526024016107e4565b6109c25f516020615d9c5f395f51905f525f6105f5565b61032b81610a9d565b60605f6109d783610abd565b9392505050565b5f610562836001600160a01b038416610b16565b5f6105628383610b16565b610a0a8585858585610bf9565b6105ee8585858585610c13565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180516001600160e01b03166301ffc9a760e01b17815282515f9392849283928392918391908a617530fa92503d91505f519050828015610a87575060208210155b8015610a9257505f81115b979650505050505050565b610ab45f516020615dbc5f395f51905f525f6105f5565b61032b81610c34565b6060815f01805480602002602001604051908101604052809291908181526020018280548015610b0a57602002820191905f5260205f20905b815481526020019060010190808311610af6575b50505050509050919050565b5f8181526001830160205260408120548015610bf0575f610b3860018361147f565b85549091505f90610b4b9060019061147f565b9050818114610baa575f865f018281548110610b6957610b6961137d565b905f5260205f200154905080875f018481548110610b8957610b8961137d565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080610bbb57610bbb611492565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610565565b5f915050610565565b610c0284610cc4565b6105ee576105ee8585858585610d44565b610c208585858585610da5565b6105ee85858585856001600160e01b038616565b5f546001600160a01b0316610c488261032e565b6001600160a01b0381165f908152600860205260408120610c68906109cb565b90505f5b81518110156104a7575f828281518110610c8857610c8861137d565b60200260200101519050610ca2818561069360201b60201c565b6001600160a01b03851615610cbb57610cbb81866103d1565b50600101610c6c565b5f80356001600160e01b031916633d7ec2c360e21b148015610cf25750610cf2600c54610100900460ff1690565b8015610d105750610d105f516020615d5c5f395f51905f5233610dbf565b801561056557505f546001600160a01b038381169116148061056557506105655f516020615d5c5f395f51905f5283610dbf565b6001600160a01b0385161580610d6157506001600160a01b038416155b6105ee57610d7c5f516020615d7c5f395f51905f5286610dbf565b6105ee57610d88610dca565b6105ee5760405163103bf34360e11b815260040160405180910390fd5b610dae84610cc4565b6105ee576105ee8585858585610e51565b5f6105628383610f5e565b600c545f9060ff16610ddc5750600190565b600a54600b54901580159115159082610df3575080155b15610e015760019250505090565b81158015610e0c5750805b15610e1d5742600b54109250505090565b818015610e28575080155b15610e395742600a54119250505090565b42600a541180610e4a575042600b54105b9250505090565b836001600160a01b0316856001600160a01b031603156105ee576001600160a01b0384161580610e8b57506001600160a01b03841661dead145b6105ee57610ea65f516020615d9c5f395f51905f5285610dbf565b6105ee575f610eb460c05190565b905080151580610ec55750506105ee565b8185610ee5886001600160a01b03165f9081526003602052604090205490565b610eef91906113df565b11158686610f11826001600160a01b03165f9081526003602052604090205490565b8590919293610f515760405163475ceea960e11b81526001600160a01b0390941660048501526024840192909252604483015260648201526084016107e4565b5050505050505050505050565b5f82815260076020526040812061056290836001600160a01b0381165f9081526001830160205260408120541515610562565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b0381118282101715610fc757610fc7610f91565b60405290565b5f806001600160401b03841115610fe657610fe6610f91565b50604051601f19601f85018116603f011681018181106001600160401b038211171561101457611014610f91565b60405283815290508082840185101561102b575f5ffd5b8383602083015e5f60208583010152509392505050565b5f82601f830112611051575f5ffd5b61056283835160208501610fcd565b8051801515811461106f575f5ffd5b919050565b5f60408284031215611084575f5ffd5b61108c610fa5565b905061109782611060565b815260209182015191810191909152919050565b5f604082840312156110bb575f5ffd5b6110c3610fa5565b825181526020928301519281019290925250919050565b5f602082840312156110ea575f5ffd5b604051602081016001600160401b038111828210171561110c5761110c610f91565b60405290508061111b83611060565b905292915050565b5f5f5f5f5f5f5f5f5f6101808a8c03121561113c575f5ffd5b89516001600160401b03811115611151575f5ffd5b61115d8c828d01611042565b60208c0151909a5090506001600160401b0381111561117a575f5ffd5b6111868c828d01611042565b60408c015190995090506001600160a01b03811681146111a4575f5ffd5b60608b015190975095506111ba60808b01611060565b94506111c98b60a08c01611074565b93506111d88b60e08c016110ab565b92506111e88b6101208c016110ab565b91506111f88b6101608c016110da565b90509295985092959850929598565b600181811c9082168061121b57607f821691505b60208210810361123957634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561044a57805f5260205f20601f840160051c810160208510156112645750805b601f840160051c820191505b818110156105ee575f8155600101611270565b81516001600160401b0381111561129c5761129c610f91565b6112b0816112aa8454611207565b8461123f565b6020601f8211600181146112e2575f83156112cb5750848201515b5f19600385901b1c1916600184901b1784556105ee565b5f84815260208120601f198516915b8281101561131157878501518255602094850194600190920191016112f1565b508482101561132e57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610562602083018461133d565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b0386811682528581166020830152841660408201526060810183905260a0608082018190525f90610a929083018461133d565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610565576105656113cb565b8381528215156020820152606060408201525f611412606083018461133d565b95945050505050565b828152604060208201525f611433604083018461133d565b949350505050565b5f6020828403121561144b575f5ffd5b81516001600160401b03811115611460575f5ffd5b8201601f81018413611470575f5ffd5b61143384825160208401610fcd565b81810381811115610565576105656113cb565b634e487b7160e01b5f52603160045260245ffd5b60805160a05160c0516148856114d75f395f8181610988015261374e01525f6111f401525f610fe001526148855ff3fe60806040526004361061032c575f3560e01c806378381670116101a4578063a3246ad3116100eb578063d547741f11610094578063e6fc60981161006e578063e6fc609814610a3c578063ecff3a0c14610a51578063f2fde38b14610a6a578063f5fb0b0c14610a89576103b7565b8063d547741f146109df578063d72fc29a146109fe578063dedff9c614610a1d576103b7565b8063ca15c873116100c5578063ca15c8731461095b578063d1ca01881461097a578063d5391393146109ac576103b7565b8063a3246ad3146108fc578063b49506fd14610928578063c282ca7814610947576103b7565b80639010d07c1161014d578063979024211161012757806397902421146108ba5780639e045773146108cd578063a217fddf146108e9576103b7565b80639010d07c1461084957806391d14854146108685780639418775314610887576103b7565b80637f23690c1161017e5780637f23690c146107d75780638da5cb5b146107ea5780638fb0573014610834576103b7565b806378381670146107715780637c4acabf146107905780637e5cd5c1146107c3576103b7565b806336568abe1161027357806365aeaa951161021c57806370a08231116101f657806370a08231146106de578063715018a61461071f5780637580d92014610733578063760d9bba14610752576103b7565b806365aeaa951461067f5780636963d4381461069e578063696fd68c146106ca576103b7565b806346b45af71161024d57806346b45af71461062657806352058d8a1461063f57806354f6127f14610653576103b7565b806336568abe146105c957806344d17187146105e857806345e14c4614610607576103b7565b80632bc1da82116102d55780632f2ff15d116102af5780632f2ff15d1461056557806330d0dc3714610584578063313ce567146105a3576103b7565b80632bc1da82146104fb5780632d7667c91461051a5780632de9480714610539576103b7565b80631e4e0091116103065780631e4e00911461049b5780632121dc75146104bc578063248a9ca3146104d0576103b7565b806301ffc9a71461041257806312318ac41461044657806318160ddd14610487576103b7565b366103b757345f03610385576040517fe5099ee300000000000000000000000000000000000000000000000000000000815260040161037c9060208082526004908201525f604082015260600190565b60405180910390fd5b6040517f388f5adc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f366060828260048110156103fa576040517fe5099ee300000000000000000000000000000000000000000000000000000000815260040161037c92919061397a565b50506104068383610aa8565b80519350602001915050f35b34801561041d575f5ffd5b5061043161042c3660046139c6565b610c3d565b60405190151581526020015b60405180910390f35b348015610451575f5ffd5b506104797fb4b3a36d7c2b72add3151898671aaed843238e580f7d6d4bc5077ce2023b065981565b60405190815260200161043d565b348015610492575f5ffd5b50600254610479565b3480156104a6575f5ffd5b506104ba6104b5366004613a05565b610c47565b005b3480156104c7575f5ffd5b50610431610c60565b3480156104db575f5ffd5b506104796104ea366004613a25565b5f9081526006602052604090205490565b348015610506575f5ffd5b506104ba610515366004613b77565b610ce7565b348015610525575f5ffd5b506104ba610534366004613da4565b610d9a565b348015610544575f5ffd5b50610558610553366004613e87565b610e9f565b60405161043d9190613ea0565b348015610570575f5ffd5b506104ba61057f366004613ee2565b610ecf565b34801561058f575f5ffd5b506104ba61059e366004613f0c565b610ef0565b3480156105ae575f5ffd5b506105b7610fdd565b60405160ff909116815260200161043d565b3480156105d4575f5ffd5b506104ba6105e3366004613ee2565b61100e565b3480156105f3575f5ffd5b506104ba610602366004613b77565b6110ea565b348015610612575f5ffd5b506104ba610621366004613a05565b61111d565b348015610631575f5ffd5b506009546104319060ff1681565b34801561064a575f5ffd5b506104796111de565b34801561065e575f5ffd5b5061067261066d366004613a25565b611216565b60405161043d9190613fc3565b34801561068a575f5ffd5b50610479610699366004613fd5565b611221565b3480156106a9575f5ffd5b506106bd6106b8366004613ffd565b6112b8565b60405161043d919061406e565b3480156106d5575f5ffd5b506104ba611403565b3480156106e9575f5ffd5b506104796106f8366004613e87565b73ffffffffffffffffffffffffffffffffffffffff165f9081526003602052604090205490565b34801561072a575f5ffd5b506104ba6114a6565b34801561073e575f5ffd5b506104ba61074d3660046140ef565b6114b9565b34801561075d575f5ffd5b506104ba61076c366004614120565b6114ef565b34801561077c575f5ffd5b506104ba61078b366004614187565b611524565b34801561079b575f5ffd5b506104797fce3f34913921da558f105cefb578d87278debbbd073a8d552b5de0d168deee3081565b3480156107ce575f5ffd5b506104ba61164e565b6104ba6107e53660046141d3565b6116e6565b3480156107f5575f5ffd5b505f5473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161043d565b34801561083f575f5ffd5b50610479600b5481565b348015610854575f5ffd5b5061080f610863366004613a05565b611730565b348015610873575f5ffd5b50610431610882366004613ee2565b61174e565b348015610892575f5ffd5b506104797f975773d1e0a917a74b57f36a377f439ffff6271648aebdbff75a52ab58eb7bad81565b6104ba6108c8366004614217565b611759565b3480156108d8575f5ffd5b50600c54610100900460ff16610431565b3480156108f4575f5ffd5b506104795f81565b348015610907575f5ffd5b5061091b610916366004613a25565b6117a3565b60405161043d9190614272565b348015610933575f5ffd5b506104ba610942366004613b77565b6117bc565b348015610952575f5ffd5b506104ba6117fb565b348015610966575f5ffd5b50610479610975366004613a25565b611898565b348015610985575f5ffd5b507f0000000000000000000000000000000000000000000000000000000000000000610479565b3480156109b7575f5ffd5b506104797f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b3480156109ea575f5ffd5b506104ba6109f9366004613ee2565b6118ae565b348015610a09575f5ffd5b5061091b610a18366004613e87565b611951565b348015610a28575f5ffd5b506106bd610a373660046142bf565b611981565b348015610a47575f5ffd5b50610479600a5481565b348015610a5c575f5ffd5b50600c546104319060ff1681565b348015610a75575f5ffd5b506104ba610a84366004613e87565b611a2b565b348015610a94575f5ffd5b506104ba610aa3366004614187565b611ae2565b60605f610ad75f357fffffffff0000000000000000000000000000000000000000000000000000000016611c22565b5090507fffffffff000000000000000000000000000000000000000000000000000000005f351673ffffffffffffffffffffffffffffffffffffffff8216610b70576040517fbb370b2b0000000000000000000000000000000000000000000000000000000081527fffffffff00000000000000000000000000