[ { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { "indexed": true, "internalType": "address", "name": "sender", "type": "address" } ], "name": "AdminApproved", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { "indexed": true, "internalType": "address", "name": "sender", "type": "address" } ], "name": "AdminRevoked", "type": "event" }, { "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": false, "internalType": "address", "name": "extension", "type": "address" } ], "name": "ApproveTransferUpdated", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address payable[]", "name": "receivers", "type": "address[]" }, { "indexed": false, "internalType": "uint256[]", "name": "basisPoints", "type": "uint256[]" } ], "name": "DefaultRoyaltiesUpdated", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "extension", "type": "address" }, { "indexed": false, "internalType": "bool", "name": "enabled", "type": "bool" } ], "name": "ExtensionApproveTransferUpdated", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "extension", "type": "address" }, { "indexed": true, "internalType": "address", "name": "sender", "type": "address" } ], "name": "ExtensionBlacklisted", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "extension", "type": "address" }, { "indexed": true, "internalType": "address", "name": "sender", "type": "address" } ], "name": "ExtensionRegistered", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "extension", "type": "address" }, { "indexed": false, "internalType": "address payable[]", "name": "receivers", "type": "address[]" }, { "indexed": false, "internalType": "uint256[]", "name": "basisPoints", "type": "uint256[]" } ], "name": "ExtensionRoyaltiesUpdated", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "extension", "type": "address" }, { "indexed": true, "internalType": "address", "name": "sender", "type": "address" } ], "name": "ExtensionUnregistered", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint8", "name": "version", "type": "uint8" } ], "name": "Initialized", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "extension", "type": "address" }, { "indexed": true, "internalType": "address", "name": "permissions", "type": "address" }, { "indexed": true, "internalType": "address", "name": "sender", "type": "address" } ], "name": "MintPermissionsUpdated", "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": "uint256", "name": "tokenId", "type": "uint256" }, { "indexed": false, "internalType": "address payable[]", "name": "receivers", "type": "address[]" }, { "indexed": false, "internalType": "uint256[]", "name": "basisPoints", "type": "uint256[]" } ], "name": "RoyaltiesUpdated", "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" }, { "inputs": [], "name": "VERSION", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "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": "admin", "type": "address" } ], "name": "approveAdmin", "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": [ { "internalType": "address", "name": "extension", "type": "address" } ], "name": "blacklistExtension", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "burn", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "getAdmins", "outputs": [ { "internalType": "address[]", "name": "admins", "type": "address[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getApproveTransfer", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "getApproved", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getExtensions", "outputs": [ { "internalType": "address[]", "name": "extensions", "type": "address[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "getFeeBps", "outputs": [ { "internalType": "uint256[]", "name": "", "type": "uint256[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "getFeeRecipients", "outputs": [ { "internalType": "address payable[]", "name": "", "type": "address[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "getFees", "outputs": [ { "internalType": "address payable[]", "name": "", "type": "address[]" }, { "internalType": "uint256[]", "name": "", "type": "uint256[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "getRoyalties", "outputs": [ { "internalType": "address payable[]", "name": "", "type": "address[]" }, { "internalType": "uint256[]", "name": "", "type": "uint256[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "string", "name": "_name", "type": "string" }, { "internalType": "string", "name": "_symbol", "type": "string" } ], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "admin", "type": "address" } ], "name": "isAdmin", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "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": "address", "name": "to", "type": "address" } ], "name": "mintBase", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "string", "name": "uri", "type": "string" } ], "name": "mintBase", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "string[]", "name": "uris", "type": "string[]" } ], "name": "mintBaseBatch", "outputs": [ { "internalType": "uint256[]", "name": "tokenIds", "type": "uint256[]" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint16", "name": "count", "type": "uint16" } ], "name": "mintBaseBatch", "outputs": [ { "internalType": "uint256[]", "name": "tokenIds", "type": "uint256[]" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" } ], "name": "mintExtension", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint80", "name": "data", "type": "uint80" } ], "name": "mintExtension", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "string", "name": "uri", "type": "string" } ], "name": "mintExtension", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "string[]", "name": "uris", "type": "string[]" } ], "name": "mintExtensionBatch", "outputs": [ { "internalType": "uint256[]", "name": "tokenIds", "type": "uint256[]" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint80[]", "name": "data", "type": "uint80[]" } ], "name": "mintExtensionBatch", "outputs": [ { "internalType": "uint256[]", "name": "tokenIds", "type": "uint256[]" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint16", "name": "count", "type": "uint16" } ], "name": "mintExtensionBatch", "outputs": [ { "internalType": "uint256[]", "name": "tokenIds", "type": "uint256[]" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "name", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "owner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "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": "address", "name": "extension", "type": "address" }, { "internalType": "string", "name": "baseURI", "type": "string" } ], "name": "registerExtension", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "extension", "type": "address" }, { "internalType": "string", "name": "baseURI", "type": "string" }, { "internalType": "bool", "name": "baseURIIdentical", "type": "bool" } ], "name": "registerExtension", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "admin", "type": "address" } ], "name": "revokeAdmin", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "royaltyInfo", "outputs": [ { "internalType": "address", "name": "", "type": "address" }, { "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": "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": "extension", "type": "address" } ], "name": "setApproveTransfer", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bool", "name": "enabled", "type": "bool" } ], "name": "setApproveTransferExtension", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "string", "name": "uri", "type": "string" } ], "name": "setBaseTokenURI", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "string", "name": "uri", "type": "string" } ], "name": "setBaseTokenURIExtension", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "string", "name": "uri", "type": "string" }, { "internalType": "bool", "name": "identical", "type": "bool" } ], "name": "setBaseTokenURIExtension", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "extension", "type": "address" }, { "internalType": "address", "name": "permissions", "type": "address" } ], "name": "setMintPermissions", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "internalType": "address payable[]", "name": "receivers", "type": "address[]" }, { "internalType": "uint256[]", "name": "basisPoints", "type": "uint256[]" } ], "name": "setRoyalties", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address payable[]", "name": "receivers", "type": "address[]" }, { "internalType": "uint256[]", "name": "basisPoints", "type": "uint256[]" } ], "name": "setRoyalties", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "extension", "type": "address" }, { "internalType": "address payable[]", "name": "receivers", "type": "address[]" }, { "internalType": "uint256[]", "name": "basisPoints", "type": "uint256[]" } ], "name": "setRoyaltiesExtension", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "internalType": "string", "name": "uri", "type": "string" } ], "name": "setTokenURI", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256[]", "name": "tokenIds", "type": "uint256[]" }, { "internalType": "string[]", "name": "uris", "type": "string[]" } ], "name": "setTokenURI", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256[]", "name": "tokenIds", "type": "uint256[]" }, { "internalType": "string[]", "name": "uris", "type": "string[]" } ], "name": "setTokenURIExtension", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "internalType": "string", "name": "uri", "type": "string" } ], "name": "setTokenURIExtension", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "string", "name": "prefix", "type": "string" } ], "name": "setTokenURIPrefix", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "string", "name": "prefix", "type": "string" } ], "name": "setTokenURIPrefixExtension", "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": "symbol", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "tokenData", "outputs": [ { "internalType": "uint80", "name": "", "type": "uint80" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "tokenExtension", "outputs": [ { "internalType": "address", "name": "extension", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "tokenURI", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "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" }, { "inputs": [ { "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "extension", "type": "address" } ], "name": "unregisterExtension", "outputs": [], "stateMutability": "nonpayable", "type": "function" } ]
60806040526000606e553480156200001657600080fd5b506001606555620000266200002c565b620000ed565b600054610100900460ff1615620000995760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811614620000eb576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6155ba80620000fd6000396000f3fe608060405234801561001057600080fd5b50600436106103af5760003560e01c80636d73e669116101f4578063b0fe87c91161011a578063d5a06d4c116100ad578063f0cdc4991161007c578063f0cdc4991461087d578063f2fde38b14610890578063fe2e1f58146108a3578063ffa1ad74146108b657600080fd5b8063d5a06d4c146107ea578063e00aab4b14610844578063e92a89f614610857578063e985e9c51461086a57600080fd5b8063bb3bafd6116100e9578063bb3bafd6146107ea578063c87b56dd1461080b578063ce8aee9d1461081e578063d39737191461083157600080fd5b8063b0fe87c914610753578063b4b5b48f14610766578063b88d4fde146107b7578063b9c4d9fb146107ca57600080fd5b806383b7db6311610192578063a22cb46511610161578063a22cb46514610707578063aafb2d441461071a578063ac0c8cfa1461072d578063ad2d0ddd1461074057600080fd5b806383b7db63146106d35780638da5cb5b146106db57806395d89b41146106ec57806399e0dd7c146106f457600080fd5b806372ff03d3116101ce57806372ff03d3146106875780637884af441461069a5780637aa15f16146106ad57806382dcc0c8146106c057600080fd5b80636d73e6691461065957806370a082311461066c578063715018a61461067f57600080fd5b806330176e13116102d95780634278330e11610277578063596798ad11610246578063596798ad1461060d57806361e5bc6b146106205780636352211e1461063357806366d1e9d01461064657600080fd5b80634278330e146105c157806342842e0e146105d457806342966c68146105e75780634cd88b76146105fa57600080fd5b8063332dd1ae116102b3578063332dd1ae1461057557806338e52e78146105885780633e6134b81461059b5780633f0f37f6146105ae57600080fd5b806330176e131461053a5780633071a0f91461054d57806331ae450b1461056057600080fd5b806320e4afe21161035157806324d7806c1161032057806324d7806c146104c15780632928ca58146104d45780632a55205a146104f55780632d3456701461052757600080fd5b806320e4afe21461047757806322f374d01461048a578063239be3171461049b57806323b872dd146104ae57600080fd5b8063081812fc1161038d578063081812fc14610406578063095ea7b3146104315780630ebd4c7f14610444578063162094c41461046457600080fd5b806301ffc9a7146103b457806302e7afb7146103dc57806306fdde03146103f1575b600080fd5b6103c76103c2366004614624565b6108be565b60405190151581526020015b60405180910390f35b6103ef6103ea366004614656565b6108ed565b005b6103f961094c565b6040516103d391906146cb565b6104196104143660046146de565b6109de565b6040516001600160a01b0390911681526020016103d3565b6103ef61043f3660046146f7565b610a05565b6104576104523660046146de565b610b1b565b6040516103d3919061475e565b6103ef6104723660046147b2565b610b4b565b6103ef610485366004614841565b610ba0565b606f546001600160a01b0316610419565b6104196104a93660046146de565b610c23565b6103ef6104bc3660046148ba565b610cd1565b6103c76104cf366004614656565b610d02565b6104e76104e2366004614656565b610d3b565b6040519081526020016103d3565b6105086105033660046148fb565b610d75565b604080516001600160a01b0390931683526020830191909152016103d3565b6103ef610535366004614656565b610db3565b6103ef61054836600461491d565b610e10565b6103ef61055b36600461495e565b610e64565b610568610ec4565b6040516103d39190614999565b6103ef6105833660046149e6565b610f72565b610457610596366004614a51565b610fd0565b6103ef6105a936600461491d565b611104565b6103ef6105bc366004614aa6565b611118565b6104576105cf366004614a51565b611177565b6103ef6105e23660046148ba565b611270565b6103ef6105f53660046146de565b61128b565b6103ef610608366004614bd8565b611323565b6103ef61061b366004614656565b61143f565b6103ef61062e3660046149e6565b611492565b6104196106413660046146de565b611511565b6103ef61065436600461491d565b611571565b6103ef610667366004614656565b611583565b6104e761067a366004614656565b6115db565b6103ef611661565b6104e7610695366004614656565b611675565b6104e76106a836600461495e565b6116e4565b6104576106bb366004614a51565b611784565b6103ef6106ce366004614c3b565b6118e8565b6105686118fb565b6033546001600160a01b0316610419565b6103f961199b565b6103ef61070236600461491d565b6119aa565b6103ef610715366004614c91565b6119fe565b6103ef6107283660046149e6565b611a09565b6103ef61073b366004614cca565b611aca565b61045761074e366004614ce7565b611adc565b6103ef610761366004614d1c565b611c07565b61079c6107743660046146de565b6000908152606a6020526040902054600160a01b900460101c69ffffffffffffffffffff1690565b60405169ffffffffffffffffffff90911681526020016103d3565b6103ef6107c5366004614d5b565b611c5e565b6107dd6107d83660046146de565b611c90565b6040516103d39190614e13565b6107fd6107f83660046146de565b611cc0565b6040516103d3929190614e26565b6103f96108193660046146de565b611cfa565b6103ef61082c366004614656565b611d2a565b6104e761083f366004614e6e565b611d7d565b610457610852366004614ce7565b611db7565b6103ef6108653660046147b2565b611e96565b6103c7610878366004614ea3565b611ea9565b6103ef61088b366004614ea3565b611ed7565b6103ef61089e366004614656565b611f2b565b6104e76108b136600461495e565b611fa1565b6104e7600381565b60006108c982611ff5565b806108d857506108d882612035565b806108e757506108e782612070565b92915050565b336109006033546001600160a01b031690565b6001600160a01b0316148061091b575061091b6066336120a5565b6109405760405162461bcd60e51b815260040161093790614ed1565b60405180910390fd5b610949816120c7565b50565b60606068805461095b90614f15565b80601f016020809104026020016040519081016040528092919081815260200182805461098790614f15565b80156109d45780601f106109a9576101008083540402835291602001916109d4565b820191906000526020600020905b8154815290600101906020018083116109b757829003601f168201915b5050505050905090565b60006109e9826121d7565b506000908152606c60205260409020546001600160a01b031690565b6000610a1082611511565b9050806001600160a01b0316836001600160a01b03161415610a7e5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610937565b336001600160a01b0382161480610a9a5750610a9a8133611ea9565b610b0c5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610937565b610b168383612227565b505050565b6060610b2682612295565b610b425760405162461bcd60e51b815260040161093790614f4a565b6108e7826122b2565b33610b5e6033546001600160a01b031690565b6001600160a01b03161480610b795750610b796066336120a5565b610b955760405162461bcd60e51b815260040161093790614ed1565b610b168383836122bd565b33610bb36033546001600160a01b031690565b6001600160a01b03161480610bce5750610bce6066336120a5565b610bea5760405162461bcd60e51b815260040161093790614ed1565b610bf385612295565b610c0f5760405162461bcd60e51b815260040161093790614f4a565b610c1c8585858585612341565b5050505050565b6000610c2e82612295565b610c4a5760405162461bcd60e51b815260040161093790614f4a565b610c53826123c8565b90506001600160a01b038116610ca45760405162461bcd60e51b815260206004820152601660248201527527379032bc3a32b739b4b7b7103337b9103a37b5b2b760511b6044820152606401610937565b610caf6072826120a5565b15610ccc5760405162461bcd60e51b815260040161093790614f75565b919050565b610cdb338261241c565b610cf75760405162461bcd60e51b815260040161093790614fa4565b610b1683838361247b565b6000816001600160a01b0316610d206033546001600160a01b031690565b6001600160a01b031614806108e757506108e76066836120a5565b6000610d4561261a565b610d4d612674565b610d6982604051806020016040528060008152506000806126cb565b9050610ccc6001606555565b600080610d8184612295565b610d9d5760405162461bcd60e51b815260040161093790614f4a565b610da78484612758565b915091505b9250929050565b610dbb61282c565b610dc66066826120a5565b156109495760405133906001600160a01b038316907f7c0c3c84c67c85fcac635147348bfe374c24a1a93d0366d1cfe9d8853cbf89d590600090a3610e0c606682612886565b5050565b33610e236033546001600160a01b031690565b6001600160a01b03161480610e3e5750610e3e6066336120a5565b610e5a5760405162461bcd60e51b815260040161093790614ed1565b610e0c828261289b565b33610e776033546001600160a01b031690565b6001600160a01b03161480610e925750610e926066336120a5565b610eae5760405162461bcd60e51b815260040161093790614ed1565b610eb7836128cf565b610b1683838360006128f7565b6060610ed060666129f2565b6001600160401b03811115610ee757610ee7614b0d565b604051908082528060200260200182016040528015610f10578160200160208202803683370190505b50905060005b610f2060666129f2565b811015610f6e57610f326066826129fc565b828281518110610f4457610f44614ff1565b6001600160a01b039092166020928302919091019091015280610f668161501d565b915050610f16565b5090565b33610f856033546001600160a01b031690565b6001600160a01b03161480610fa05750610fa06066336120a5565b610fbc5760405162461bcd60e51b815260040161093790614ed1565b610fca600085858585612a08565b50505050565b6060610fda61261a565b610fe2612674565b816001600160401b03811115610ffa57610ffa614b0d565b604051908082528060200260200182016040528015611023578160200160208202803683370190505b5090506000606e5460016110379190615038565b905083839050606e600082825461104e9190615038565b90915550600090505b838110156110f1576110cc8686868481811061107557611075614ff1565b90506020028101906110879190615050565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525092506110c7915086905087615038565b6126cb565b8382815181106110de576110de614ff1565b6020908102919091010152600101611057565b50506110fd6001606555565b9392505050565b61110c612674565b610e0c82826000612af5565b3361112b6033546001600160a01b031690565b6001600160a01b0316148061114657506111466066336120a5565b6111625760405162461bcd60e51b815260040161093790614ed1565b61116b846128cf565b610fca848484846128f7565b606061118161261a565b611189612674565b816001600160401b038111156111a1576111a1614b0d565b6040519080825280602002602001820160405280156111ca578160200160208202803683370190505b5090506000606e5460016111de9190615038565b905083839050606e60008282546111f59190615038565b90915550600090505b838110156110f15761124b866040518060200160405280600081525087878581811061122c5761122c614ff1565b90506020020160208101906112419190615096565b6110c78587615038565b83828151811061125d5761125d614ff1565b60209081029190910101526001016111fe565b610b1683838360405180602001604052806000815250611c5e565b61129361261a565b61129d338261241c565b6112e95760405162461bcd60e51b815260206004820152601f60248201527f43616c6c6572206973206e6f74206f776e6572206f7220617070726f766564006044820152606401610937565b60006112f482611511565b90506000611301836123c8565b905061130c83612b32565b611317828483612bec565b50506109496001606555565b600054610100900460ff16158080156113435750600054600160ff909116105b8061135d5750303b15801561135d575060005460ff166001145b6113c05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610937565b6000805460ff1916600117905580156113e3576000805461ff0019166101001790555b6113ed8383612cab565b6113f5612cdc565b8015610b16576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b336114526033546001600160a01b031690565b6001600160a01b0316148061146d575061146d6066336120a5565b6114895760405162461bcd60e51b815260040161093790614ed1565b61094981612d0b565b61149a612674565b8281146114b95760405162461bcd60e51b8152600401610937906150b1565b60005b83811015610c1c576115098585838181106114d9576114d9614ff1565b905060200201358484848181106114f2576114f2614ff1565b90506020028101906115049190615050565b612d5f565b6001016114bc565b6000818152606a60205260408120546001600160a01b0316806108e75760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610937565b611579612674565b610e0c8282612d69565b61158b61282c565b6115966066826120a5565b6109495760405133906001600160a01b038316907f7e1a1a08d52e4ba0e21554733d66165fd5151f99460116223d9e3a608eec5cb190600090a3610e0c606682612d83565b60006001600160a01b0382166116455760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610937565b506001600160a01b03166000908152606b602052604090205490565b61166961282c565b6116736000612d98565b565b600061167f61261a565b336116926033546001600160a01b031690565b6001600160a01b031614806116ad57506116ad6066336120a5565b6116c95760405162461bcd60e51b815260040161093790614ed1565b610d6982604051806020016040528060008152506000612dea565b60006116ee61261a565b336117016033546001600160a01b031690565b6001600160a01b0316148061171c575061171c6066336120a5565b6117385760405162461bcd60e51b815260040161093790614ed1565b6117788484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509250612dea915050565b90506110fd6001606555565b606061178e61261a565b336117a16033546001600160a01b031690565b6001600160a01b031614806117bc57506117bc6066336120a5565b6117d85760405162461bcd60e51b815260040161093790614ed1565b816001600160401b038111156117f0576117f0614b0d565b604051908082528060200260200182016040528015611819578160200160208202803683370190505b5090506000606e54600161182d9190615038565b905083839050606e60008282546118449190615038565b90915550600090505b838110156110f1576118c38686868481811061186b5761186b614ff1565b905060200281019061187d9190615050565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118be9250869150879050615038565b612dea565b8382815181106118d5576118d5614ff1565b602090810291909101015260010161184d565b6118f0612674565b610b16838383612af5565b606061190760706129f2565b6001600160401b0381111561191e5761191e614b0d565b604051908082528060200260200182016040528015611947578160200160208202803683370190505b50905060005b61195760706129f2565b811015610f6e576119696070826129fc565b82828151811061197b5761197b614ff1565b6001600160a01b039092166020928302919091019091015260010161194d565b60606069805461095b90614f15565b336119bd6033546001600160a01b031690565b6001600160a01b031614806119d857506119d86066336120a5565b6119f45760405162461bcd60e51b815260040161093790614ed1565b610e0c8282612e45565b610e0c338383612e79565b33611a1c6033546001600160a01b031690565b6001600160a01b03161480611a375750611a376066336120a5565b611a535760405162461bcd60e51b815260040161093790614ed1565b828114611a725760405162461bcd60e51b8152600401610937906150b1565b60005b83811015610c1c57611ac2858583818110611a9257611a92614ff1565b90506020020135848484818110611aab57611aab614ff1565b9050602002810190611abd9190615050565b6122bd565b600101611a75565b611ad2612674565b6109493382612f48565b6060611ae661261a565b33611af96033546001600160a01b031690565b6001600160a01b03161480611b145750611b146066336120a5565b611b305760405162461bcd60e51b815260040161093790614ed1565b8161ffff166001600160401b03811115611b4c57611b4c614b0d565b604051908082528060200260200182016040528015611b75578160200160208202803683370190505b5090506000606e546001611b899190615038565b90508261ffff16606e6000828254611ba19190615038565b90915550600090505b8361ffff16811015611bfb57611bd6856040518060200160405280600081525083856118be9190615038565b838281518110611be857611be8614ff1565b6020908102919091010152600101611baa565b50506108e76001606555565b33611c1a6033546001600160a01b031690565b6001600160a01b03161480611c355750611c356066336120a5565b611c515760405162461bcd60e51b815260040161093790614ed1565b610c1c8585858585612a08565b611c68338361241c565b611c845760405162461bcd60e51b815260040161093790614fa4565b610fca84848484612fbd565b6060611c9b82612295565b611cb75760405162461bcd60e51b815260040161093790614f4a565b6108e782612ff0565b606080611ccc83612295565b611ce85760405162461bcd60e51b815260040161093790614f4a565b611cf183612ff7565b91509150915091565b6060611d0582612295565b611d215760405162461bcd60e51b815260040161093790614f4a565b6108e7826133b2565b33611d3d6033546001600160a01b031690565b6001600160a01b03161480611d585750611d586066336120a5565b611d745760405162461bcd60e51b815260040161093790614ed1565b6109498161367d565b6000611d8761261a565b611d8f612674565b611dab83604051806020016040528060008152508460006126cb565b90506108e76001606555565b6060611dc161261a565b611dc9612674565b8161ffff166001600160401b03811115611de557611de5614b0d565b604051908082528060200260200182016040528015611e0e578160200160208202803683370190505b5090506000606e546001611e229190615038565b90508261ffff16606e6000828254611e3a9190615038565b90915550600090505b8361ffff16811015611bfb57611e718560405180602001604052806000815250600084866110c79190615038565b838281518110611e8357611e83614ff1565b6020908102919091010152600101611e43565b611e9e612674565b610b16838383612d5f565b6001600160a01b039182166000908152606d6020908152604080832093909416825291909152205460ff1690565b33611eea6033546001600160a01b031690565b6001600160a01b03161480611f055750611f056066336120a5565b611f215760405162461bcd60e51b815260040161093790614ed1565b610e0c82826136be565b611f3361282c565b6001600160a01b038116611f985760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610937565b61094981612d98565b6000611fab61261a565b611fb3612674565b6117788484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525092508291506126cb9050565b60006001600160e01b0319821663b5d2729f60e01b148061202657506001600160e01b03198216639088c20760e01b145b806108e757506108e7826137f3565b60006001600160e01b031982166380ac58cd60e01b14806108d857506001600160e01b03198216635b5e139f60e01b14806108e757506108e7825b60006001600160e01b03198216632a9f3abf60e11b14806108e757506301ffc9a760e01b6001600160e01b03198316146108e7565b6001600160a01b038116600090815260018301602052604081205415156110fd565b6001600160a01b038116158015906120e857506001600160a01b0381163014155b6121345760405162461bcd60e51b815260206004820152601960248201527f43616e6e6f7420626c61636b6c69737420796f757273656c66000000000000006044820152606401610937565b61213f6070826120a5565b156121875760405133906001600160a01b038316907fd19cf84cf0fec6bec9ddfa29c63adf83a55707c712f32c8285d6180a7890147990600090a3612185607082612886565b505b6121926072826120a5565b6109495760405133906001600160a01b038316907f05ac7bc5a606cd92a63365f9fda244499b9add0526b22d99937b6bd88181059c90600090a3610e0c607282612d83565b6121e081612295565b6109495760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610937565b6000818152606c6020526040902080546001600160a01b0319166001600160a01b038416908117909155819061225c82611511565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000908152606a60205260409020546001600160a01b0316151590565b60606110fd82612ff7565b6000831180156122cf5750606e548311155b80156122ec575060006122e1846123c8565b6001600160a01b0316145b6123285760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b6044820152606401610937565b6000838152607760205260409020610fca908383614492565b61234d848484846138a4565b600085815260796020526040812061236491614512565b61238384848484607960008b815260200190815260200160002061394f565b847fabb46fe0761d77584bde75697647804ffd8113abd4d8d06bc664150395eccdee858585856040516123b994939291906150d8565b60405180910390a25050505050565b6000818152606a6020526040812054600160a01b90046001600160601b0381169061ffff166123fa5750600092915050565b61ffff166000908152607e60205260409020546001600160a01b031692915050565b60008061242883611511565b9050806001600160a01b0316846001600160a01b0316148061244f575061244f8185611ea9565b806124735750836001600160a01b0316612468846109de565b6001600160a01b0316145b949350505050565b6000818152606a60209081526040918290208251808401909352546001600160a01b03808216808552600160a01b9092046001600160601b031692840192909252908516811461251b5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610937565b6001600160a01b03841661257d5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610937565b602082015161258e86868684613a0a565b612599600085612227565b6001600160a01b038087166000818152606b60209081526040808320805460001901905593891680835284832080546001019055888352606a90915283822080546001600160a01b031916821790559251879392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a45b505050505050565b6002606554141561266d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610937565b6002606555565b61267f6070336120a5565b6116735760405162461bcd60e51b815260206004820152601c60248201527f4d757374206265207265676973746572656420657874656e73696f6e000000006044820152606401610937565b6000816126eb57606e600081546126e19061501d565b90915550606e5491505b6126f58583613a16565b336000908152607d6020526040902054612728908690849061ffff16601087901b69ffffffffffffffff00001617613aaa565b835115612750576000828152607760209081526040909120855161274e92870190614530565b505b509392505050565b60008060008061276786612ff7565b915091506001825111156127bd5760405162461bcd60e51b815260206004820152601c60248201527f4d6f7265207468616e203120726f79616c7479207265636569766572000000006044820152606401610937565b81516127d157306000935093505050610dac565b816000815181106127e4576127e4614ff1565b6020026020010151612710868360008151811061280357612803614ff1565b6020026020010151612815919061515c565b61281f919061517b565b9350935050509250929050565b6033546001600160a01b031633146116735760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610937565b60006110fd836001600160a01b038416613ac5565b600080526074602052610b167fccdf39d850e26d5964b24c5391eecfa7a13a375488d6de2101d279419f39a5378383614492565b6128da6072826120a5565b156109495760405162461bcd60e51b815260040161093790614f75565b607c5461ffff908116106129435760405162461bcd60e51b8152602060048201526013602482015272546f6f206d616e7920657874656e73696f6e7360681b6044820152606401610937565b6001600160a01b0384166000908152607d602052604090205461ffff166129e657607c80546000906129789061ffff1661519d565b82546101009290920a61ffff818102199093169183160217909155607c80546001600160a01b0387166000818152607d60209081526040808320805495881661ffff199096169590951790945593549094168452607e90925290912080546001600160a01b03191690911790555b610fca84848484613bb8565b60006108e7825490565b60006110fd8383613ca5565b612a14848484846138a4565b6001600160a01b0385166000908152607860205260408120612a3591614512565b612a6684848484607860008b6001600160a01b03166001600160a01b0316815260200190815260200160002061394f565b6001600160a01b038516612ab6577f2b6849d5976d799a5b0ca4dfd6b40a3d7afe9ea72c091fa01a958594f9a2659b84848484604051612aa994939291906150d8565b60405180910390a1610c1c565b846001600160a01b03167f535a93d2cb000582c0ebeaa9be4890ec6a287f98eb2df00c54c300612fd78d8f858585856040516123b994939291906150d8565b336000908152607460205260409020612b0f908484614492565b50336000908152607560205260409020805460ff19169115159190911790555050565b6000818152606a602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b03169282018390529092909190612b829083908684613a0a565b612b8d600085612227565b6001600160a01b0382166000818152606b602090815260408083208054600019019055878352606a909152808220829055518692907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a4610fca565b6001600160a01b03811615612c7457612c0c816311686e4b60e21b613ccf565b15612c74576040516311686e4b60e21b81526001600160a01b038481166004830152602482018490528216906345a1b92c90604401600060405180830381600087803b158015612c5b57600080fd5b505af1158015612c6f573d6000803e3d6000fd5b505050505b60008281526077602052604090208054612c8d90614f15565b159050610b16576000828152607760205260408120610b16916145a4565b600054610100900460ff16612cd25760405162461bcd60e51b8152600401610937906151bf565b610e0c8282613ceb565b600054610100900460ff16612d035760405162461bcd60e51b8152600401610937906151bf565b611673613d39565b606f80546001600160a01b0319166001600160a01b0383169081179091556040519081527f959c0e47a2fe3cf01e237ba4892e2cc3194d77cbfb33e434e40873225d6b595f9060200160405180910390a150565b336122e1846123c8565b336000908152607660205260409020610b16908383614492565b60006110fd836001600160a01b038416613d69565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081612e0a57606e60008154612e009061501d565b90915550606e5491505b612e1684836000613aaa565b825115612e3e5760008281526077602090815260409091208451612e3c92860190614530565b505b5092915050565b600080526076602052610b167fafbc767fed27552cbeceb3d11150dacedabc53b0cc52ac5aa6285a747a1819588383614492565b816001600160a01b0316836001600160a01b03161415612edb5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610937565b6001600160a01b038381166000818152606d6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612f59826345ffcdad60e01b613ccf565b15610e0c576001600160a01b0382166000818152607a6020908152604091829020805460ff191685151590811790915591519182527f072a7592283e2c2d1d56d21517ff6013325e0f55483f4828373ff4d98b0a1a36910160405180910390a25050565b612fc884848461247b565b612fd484848484613db8565b610fca5760405162461bcd60e51b81526004016109379061520a565b6060612e3e825b606080600060796000858152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561307957600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b900461ffff168183015282526001909201910161302f565b5050505090508051600014156131d6576000613094856123c8565b90506001600160a01b038116156131d4576130b681634e53ee3d60e11b613ccf565b1561315057604051634e53ee3d60e11b8152306004820152602481018690526001600160a01b03821690639ca7dc7a9060440160006040518083038186803b15801561310157600080fd5b505afa158015613115573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261313d91908101906152e5565b8151919550935015613150575050915091565b6001600160a01b038116600090815260786020908152604080832080548251818502810185019093528083529193909284015b828210156131cd57600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b900461ffff1681830152825260019092019101613183565b5050505091505b505b8051613276576000808052607860209081527f081a134e404bb5bca49ef6b8477e647c1205f6d43d6a20bb692a968ac5aa71448054604080518285028101850190915281815293919290919084015b8282101561326f57600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b900461ffff1681830152825260019092019101613225565b5050505090505b8051156133ac5780516001600160401b0381111561329657613296614b0d565b6040519080825280602002602001820160405280156132bf578160200160208202803683370190505b50925080516001600160401b038111156132db576132db614b0d565b604051908082528060200260200182016040528015613304578160200160208202803683370190505b50915060005b81518110156133aa5781818151811061332557613325614ff1565b60200260200101516000015184828151811061334357613343614ff1565b60200260200101906001600160a01b031690816001600160a01b03168152505081818151811061337557613375614ff1565b60200260200101516020015161ffff1683828151811061339757613397614ff1565b602090810291909101015260010161330a565b505b50915091565b60606000821180156133c65750606e548211155b6134025760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b6044820152606401610937565b600061340d836123c8565b905061341a6072826120a5565b156134375760405162461bcd60e51b815260040161093790614f75565b6000838152607760205260409020805461345090614f15565b15905061356a576001600160a01b0381166000908152607660205260409020805461347a90614f15565b1590506134cb576001600160a01b0381166000908152607660209081526040808320868452607783529281902090516134b4939201615439565b604051602081830303815290604052915050919050565b600083815260776020526040902080546134e490614f15565b80601f016020809104026020016040519081016040528092919081815260200182805461351090614f15565b801561355d5780601f106135325761010080835404028352916020019161355d565b820191906000526020600020905b81548152906001019060200180831161354057829003601f168201915b5050505050915050919050565b61357b8163e9dc637560e01b613ccf565b156136025760405163e9dc637560e01b8152306004820152602481018490526001600160a01b0382169063e9dc63759060440160006040518083038186803b1580156135c657600080fd5b505afa1580156135da573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110fd919081019061544e565b6001600160a01b03811660009081526075602052604090205460ff16613654576001600160a01b038116600090815260746020526040902061364384613ec2565b6040516020016134b49291906154bb565b6001600160a01b038116600090815260746020526040902080546134e490614f15565b50919050565b60405133906001600160a01b038316907fd19cf84cf0fec6bec9ddfa29c63adf83a55707c712f32c8285d6180a7890147990600090a3610e0c607082612886565b6136c96070836120a5565b6137155760405162461bcd60e51b815260206004820152601e60248201527f43726561746f72436f72653a20496e76616c696420657874656e73696f6e00006044820152606401610937565b6001600160a01b0381161580613737575061373781631e05385b60e31b613ccf565b6137755760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610937565b6001600160a01b038281166000908152607b6020526040902054811690821614610e0c576001600160a01b038281166000818152607b602052604080822080546001600160a01b031916948616948517905551339392917f6a835c4fcf7e0d398db3762332fdaa1471814ad39f1e2d6d0b3fdabf8efee3e091a45050565b60006001600160e01b031982166314d9799760e21b148061382457506001600160e01b031982166328f10a2160e01b145b80613833575061383382612035565b8061384e57506001600160e01b03198216635d9dd7eb60e11b145b8061386957506001600160e01b03198216632dde656160e21b145b8061388457506001600160e01b031982166335681b5360e21b145b806108e757506001600160e01b0319821663152a902d60e11b1492915050565b8281146138c35760405162461bcd60e51b8152600401610937906150b1565b6000805b828110156138fd578383828181106138e1576138e1614ff1565b90506020020135826138f39190615038565b91506001016138c7565b506127108110610c1c5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420746f74616c20726f79616c746965730000000000000000006044820152606401610937565b60005b828110156126125781604051806040016040528088888581811061397857613978614ff1565b905060200201602081019061398d9190614656565b6001600160a01b031681526020018686858181106139ad576139ad614ff1565b61ffff602091820293909301358316909352508354600181810186556000958652948390208451910180549490930151909116600160a01b026001600160b01b03199093166001600160a01b039091161791909117905501613952565b610fca84848484613f56565b336000908152607b60205260409020546001600160a01b031615610e0c57336000818152607b602052604090819020549051631e05385b60e31b815260048101929092526001600160a01b03848116602484015260448301849052169063f029c2d890606401600060405180830381600087803b158015613a9657600080fd5b505af1158015612612573d6000803e3d6000fd5b610b1683838360405180602001604052806000815250613f95565b60008181526001830160205260408120548015613bae576000613ae96001836154e0565b8554909150600090613afd906001906154e0565b9050818114613b62576000866000018281548110613b1d57613b1d614ff1565b9060005260206000200154905080876000018481548110613b4057613b40614ff1565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080613b7357613b736154f7565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506108e7565b60009150506108e7565b6001600160a01b0384163014801590613bda57506001600160a01b0384163b15155b613c105760405162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b6044820152606401610937565b60405133906001600160a01b038616907fd8cb8ba4086944eabf43c5535b7712015e4d4c714b24bf812c040ea5b7a3e42a90600090a36001600160a01b0384166000908152607460205260409020613c69908484614492565b506001600160a01b0384166000908152607560205260409020805460ff1916821515179055613c99607085612d83565b50610fca846001612f48565b6000826000018281548110613cbc57613cbc614ff1565b9060005260206000200154905092915050565b6000613cda836140e4565b80156110fd57506110fd8383614117565b600054610100900460ff16613d125760405162461bcd60e51b8152600401610937906151bf565b8151613d25906068906020850190614530565b508051610b16906069906020840190614530565b600054610100900460ff16613d605760405162461bcd60e51b8152600401610937906151bf565b61167333612d98565b6000818152600183016020526040812054613db0575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556108e7565b5060006108e7565b60006001600160a01b0384163b15613eba57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613dfc90339089908890889060040161550d565b602060405180830381600087803b158015613e1657600080fd5b505af1925050508015613e46575060408051601f3d908101601f19168201909252613e439181019061554a565b60015b613ea0573d808015613e74576040519150601f19603f3d011682016040523d82523d6000602084013e613e79565b606091505b508051613e985760405162461bcd60e51b81526004016109379061520a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612473565b506001612473565b60606000613ecf836141a0565b60010190506000816001600160401b03811115613eee57613eee614b0d565b6040519080825280601f01601f191660200182016040528015613f18576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084613f5157612750565b613f22565b6001600160a01b038416613f6957610fca565b61ffff81166000908152607e6020526040902054610fca908590859085906001600160a01b0316614278565b6001600160a01b038416613feb5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610937565b613ff483612295565b156140415760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610937565b61404e6000858585613a0a565b6001600160a01b038085166000818152606b6020908152604080832080546001019055805180820182528481526001600160601b038089168285019081528a8652606a9094528285209151935116600160a01b02929095169190911790935591518592907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612fd46000858584613db8565b60006140f7826301ffc9a760e01b614117565b80156108e75750614110826001600160e01b0319614117565b1592915050565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180516001600160e01b03166301ffc9a760e01b178152825160009392849283928392918391908a617530fa92503d91506000519050828015614189575060208210155b80156141955750600081115b979650505050505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106141df5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef8100000000831061420b576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061422957662386f26fc10000830492506010015b6305f5e1008310614241576305f5e100830492506008015b612710831061425557612710830492506004015b60648310614267576064830492506002015b600a83106108e75760010192915050565b6001600160a01b03841661428b57610fca565b6001600160a01b038116158015906142bb57506001600160a01b0381166000908152607a602052604090205460ff165b156143a157604051632f3537c560e11b81523360048201526001600160a01b038581166024830152848116604483015260648201849052821690635e6a6f8a90608401602060405180830381600087803b15801561431857600080fd5b505af115801561432c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143509190615567565b61439c5760405162461bcd60e51b815260206004820152601a60248201527f457874656e73696f6e20617070726f76616c206661696c7572650000000000006044820152606401610937565b610fca565b606f546001600160a01b031615610fca57606f54604051632f3537c560e11b81523360048201526001600160a01b03868116602483015285811660448301526064820185905290911690635e6a6f8a90608401602060405180830381600087803b15801561440e57600080fd5b505af1158015614422573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144469190615567565b610fca5760405162461bcd60e51b815260206004820152601a60248201527f457874656e73696f6e20617070726f76616c206661696c7572650000000000006044820152606401610937565b82805461449e90614f15565b90600052602060002090601f0160209004810192826144c05760008555614506565b82601f106144d95782800160ff19823516178555614506565b82800160010185558215614506579182015b828111156145065782358255916020019190600101906144eb565b50610f6e9291506145da565b508054600082559060005260206000209081019061094991906145ef565b82805461453c90614f15565b90600052602060002090601f01602090048101928261455e5760008555614506565b82601f1061457757805160ff1916838001178555614506565b82800160010185558215614506579182015b82811115614506578251825591602001919060010190614589565b5080546145b090614f15565b6000825580601f106145c0575050565b601f01602090049060005260206000209081019061094991905b5b80821115610f6e57600081556001016145db565b5b80821115610f6e5780546001600160b01b03191681556001016145f0565b6001600160e01b03198116811461094957600080fd5b60006020828403121561463657600080fd5b81356110fd8161460e565b6001600160a01b038116811461094957600080fd5b60006020828403121561466857600080fd5b81356110fd81614641565b60005b8381101561468e578181015183820152602001614676565b83811115610fca5750506000910152565b600081518084526146b7816020860160208601614673565b601f01601f19169290920160200192915050565b6020815260006110fd602083018461469f565b6000602082840312156146f057600080fd5b5035919050565b6000806040838503121561470a57600080fd5b823561471581614641565b946020939093013593505050565b600081518084526020808501945080840160005b8381101561475357815187529582019590820190600101614737565b509495945050505050565b6020815260006110fd6020830184614723565b60008083601f84011261478357600080fd5b5081356001600160401b0381111561479a57600080fd5b602083019150836020828501011115610dac57600080fd5b6000806000604084860312156147c757600080fd5b8335925060208401356001600160401b038111156147e457600080fd5b6147f086828701614771565b9497909650939450505050565b60008083601f84011261480f57600080fd5b5081356001600160401b0381111561482657600080fd5b6020830191508360208260051b8501011115610dac57600080fd5b60008060008060006060868803121561485957600080fd5b8535945060208601356001600160401b038082111561487757600080fd5b61488389838a016147fd565b9096509450604088013591508082111561489c57600080fd5b506148a9888289016147fd565b969995985093965092949392505050565b6000806000606084860312156148cf57600080fd5b83356148da81614641565b925060208401356148ea81614641565b929592945050506040919091013590565b6000806040838503121561490e57600080fd5b50508035926020909101359150565b6000806020838503121561493057600080fd5b82356001600160401b0381111561494657600080fd5b61495285828601614771565b90969095509350505050565b60008060006040848603121561497357600080fd5b833561497e81614641565b925060208401356001600160401b038111156147e457600080fd5b6020808252825182820181905260009190848201906040850190845b818110156149da5783516001600160a01b0316835292840192918401916001016149b5565b50909695505050505050565b600080600080604085870312156149fc57600080fd5b84356001600160401b0380821115614a1357600080fd5b614a1f888389016147fd565b90965094506020870135915080821115614a3857600080fd5b50614a45878288016147fd565b95989497509550505050565b600080600060408486031215614a6657600080fd5b8335614a7181614641565b925060208401356001600160401b03811115614a8c57600080fd5b6147f0868287016147fd565b801515811461094957600080fd5b60008060008060608587031215614abc57600080fd5b8435614ac781614641565b935060208501356001600160401b03811115614ae257600080fd5b614aee87828801614771565b9094509250506040850135614b0281614a98565b939692955090935050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715614b4b57614b4b614b0d565b604052919050565b60006001600160401b03821115614b6c57614b6c614b0d565b50601f01601f191660200190565b6000614b8d614b8884614b53565b614b23565b9050828152838383011115614ba157600080fd5b828260208301376000602084830101529392505050565b600082601f830112614bc957600080fd5b6110fd83833560208501614b7a565b60008060408385031215614beb57600080fd5b82356001600160401b0380821115614c0257600080fd5b614c0e86838701614bb8565b93506020850135915080821115614c2457600080fd5b50614c3185828601614bb8565b9150509250929050565b600080600060408486031215614c5057600080fd5b83356001600160401b03811115614c6657600080fd5b614c7286828701614771565b9094509250506020840135614c8681614a98565b809150509250925092565b60008060408385031215614ca457600080fd5b8235614caf81614641565b91506020830135614cbf81614a98565b809150509250929050565b600060208284031215614cdc57600080fd5b81356110fd81614a98565b60008060408385031215614cfa57600080fd5b8235614d0581614641565b9150602083013561ffff81168114614cbf57600080fd5b600080600080600060608688031215614d3457600080fd5b8535614d3f81614641565b945060208601356001600160401b038082111561487757600080fd5b60008060008060808587031215614d7157600080fd5b8435614d7c81614641565b93506020850135614d8c81614641565b92506040850135915060608501356001600160401b03811115614dae57600080fd5b8501601f81018713614dbf57600080fd5b614dce87823560208401614b7a565b91505092959194509250565b600081518084526020808501945080840160005b838110156147535781516001600160a01b031687529582019590820190600101614dee565b6020815260006110fd6020830184614dda565b604081526000614e396040830185614dda565b8281036020840152614e4b8185614723565b95945050505050565b803569ffffffffffffffffffff81168114610ccc57600080fd5b60008060408385031215614e8157600080fd5b8235614e8c81614641565b9150614e9a60208401614e54565b90509250929050565b60008060408385031215614eb657600080fd5b8235614ec181614641565b91506020830135614cbf81614641565b60208082526024908201527f41646d696e436f6e74726f6c3a204d757374206265206f776e6572206f7220616040820152633236b4b760e11b606082015260800190565b600181811c90821680614f2957607f821691505b6020821081141561367757634e487b7160e01b600052602260045260246000fd5b6020808252601190820152702737b732bc34b9ba32b73a103a37b5b2b760791b604082015260600190565b602080825260159082015274115e1d195b9cda5bdb88189b1858dadb1a5cdd1959605a1b604082015260600190565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561503157615031615007565b5060010190565b6000821982111561504b5761504b615007565b500190565b6000808335601e1984360301811261506757600080fd5b8301803591506001600160401b0382111561508157600080fd5b602001915036819003821315610dac57600080fd5b6000602082840312156150a857600080fd5b6110fd82614e54565b6020808252600d908201526c125b9d985b1a59081a5b9c1d5d609a1b604082015260600190565b6040808252810184905260008560608301825b8781101561511b5782356150fe81614641565b6001600160a01b03168252602092830192909101906001016150eb565b5083810360208501528481526001600160fb1b0385111561513b57600080fd5b8460051b915081866020830137600091016020019081529695505050505050565b600081600019048311821515161561517657615176615007565b500290565b60008261519857634e487b7160e01b600052601260045260246000fd5b500490565b600061ffff808316818114156151b5576151b5615007565b6001019392505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60006001600160401b0382111561527557615275614b0d565b5060051b60200190565b600082601f83011261529057600080fd5b815160206152a0614b888361525c565b82815260059290921b840181019181810190868411156152bf57600080fd5b8286015b848110156152da57805183529183019183016152c3565b509695505050505050565b600080604083850312156152f857600080fd5b82516001600160401b038082111561530f57600080fd5b818501915085601f83011261532357600080fd5b81516020615333614b888361525c565b82815260059290921b8401810191818101908984111561535257600080fd5b948201945b8386101561537957855161536a81614641565b82529482019490820190615357565b9188015191965090935050508082111561539257600080fd5b50614c318582860161527f565b8054600090600181811c90808316806153b957607f831692505b60208084108214156153db57634e487b7160e01b600052602260045260246000fd5b8180156153ef57600181146154005761542d565b60ff1986168952848901965061542d565b60008881526020902060005b868110156154255781548b82015290850190830161540c565b505084890196505b50505050505092915050565b6000612473615448838661539f565b8461539f565b60006020828403121561546057600080fd5b81516001600160401b0381111561547657600080fd5b8201601f8101841361548757600080fd5b8051615495614b8882614b53565b8181528560208385010111156154aa57600080fd5b614e4b826020830160208601614673565b60006154c7828561539f565b83516154d7818360208801614673565b01949350505050565b6000828210156154f2576154f2615007565b500390565b634e487b7160e01b600052603160045260246000fd5b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906155409083018461469f565b9695505050505050565b60006020828403121561555c57600080fd5b81516110fd8161460e565b60006020828403121561557957600080fd5b81516110fd81614a9856fea2646970667358221220c8f67b82c245bf1ffb76bd664ffee9e1e00a8a4ee0d50eec88faf976dda46d9764736f6c63430008090033