23 txs
3.9k calls
constructor
constructor(address defaultOwner)
functions
addPermittedContractReceiverToAllowlist
purefunction addPermittedContractReceiverToAllowlist(uint120, address) pure
applyCollectionTransferPolicy
viewfunction applyCollectionTransferPolicy(address caller, address from, address to) view
createPermittedContractReceiverAllowlist
purefunction createPermittedContractReceiverAllowlist(string) pure returns (uint120)
getBlacklistedAccounts
viewfunction getBlacklistedAccounts(uint120 id) view returns (address[])
getBlacklistedAccountsByCollection
viewfunction getBlacklistedAccountsByCollection(address collection) view returns (address[])
getBlacklistedCodeHashes
viewfunction getBlacklistedCodeHashes(uint120 id) view returns (bytes32[])
getBlacklistedCodeHashesByCollection
viewfunction getBlacklistedCodeHashesByCollection(address collection) view returns (bytes32[])
getCollectionSecurityPolicy
viewfunction getCollectionSecurityPolicy(address collection) view returns (tuple)
getCollectionSecurityPolicyV2
viewfunction getCollectionSecurityPolicyV2(address collection) view returns (tuple)
getPermittedContractReceivers
viewfunction getPermittedContractReceivers(uint120 id) view returns (address[])
getWhitelistedAccounts
viewfunction getWhitelistedAccounts(uint120 id) view returns (address[])
getWhitelistedAccountsByCollection
viewfunction getWhitelistedAccountsByCollection(address collection) view returns (address[])
getWhitelistedCodeHashes
viewfunction getWhitelistedCodeHashes(uint120 id) view returns (bytes32[])
getWhitelistedCodeHashesByCollection
viewfunction getWhitelistedCodeHashesByCollection(address collection) view returns (bytes32[])
getWhitelistedOperators
viewfunction getWhitelistedOperators(uint120 id) view returns (address[])
isAccountBlacklisted
viewfunction isAccountBlacklisted(uint120 id, address account) view returns (bool)
isAccountBlacklistedByCollection
viewfunction isAccountBlacklistedByCollection(address collection, address account) view returns (bool)
isAccountWhitelisted
viewfunction isAccountWhitelisted(uint120 id, address account) view returns (bool)
isAccountWhitelistedByCollection
viewfunction isAccountWhitelistedByCollection(address collection, address account) view returns (bool)
isCodeHashBlacklisted
viewfunction isCodeHashBlacklisted(uint120 id, bytes32 codehash) view returns (bool)
isCodeHashBlacklistedByCollection
viewfunction isCodeHashBlacklistedByCollection(address collection, bytes32 codehash) view returns (bool)
isCodeHashWhitelisted
viewfunction isCodeHashWhitelisted(uint120 id, bytes32 codehash) view returns (bool)
isCodeHashWhitelistedByCollection
viewfunction isCodeHashWhitelistedByCollection(address collection, bytes32 codehash) view returns (bool)
isContractReceiverPermitted
viewfunction isContractReceiverPermitted(uint120 id, address receiver) view returns (bool)
isOperatorWhitelisted
viewfunction isOperatorWhitelisted(uint120 id, address operator) view returns (bool)
isVerifiedEOA
viewfunction isVerifiedEOA(address account) view returns (bool)
lastListId
viewfunction lastListId() view returns (uint120)
listOwners
viewfunction listOwners(uint120) view returns (address)
MESSAGE_TO_SIGN
viewfunction MESSAGE_TO_SIGN() view returns (string)
reassignOwnershipOfPermittedContractReceiverAllowlist
purefunction reassignOwnershipOfPermittedContractReceiverAllowlist(uint120, address) pure
removePermittedContractReceiverFromAllowlist
purefunction removePermittedContractReceiverFromAllowlist(uint120, address) pure
renounceOwnershipOfPermittedContractReceiverAllowlist
purefunction renounceOwnershipOfPermittedContractReceiverAllowlist(uint120) pure
setPermittedContractReceiverAllowlistOfCollection
purefunction setPermittedContractReceiverAllowlistOfCollection(address, uint120) pure
supportsInterface
viewfunction supportsInterface(bytes4 interfaceId) view returns (bool)
transferSecurityPolicies
purefunction transferSecurityPolicies(uint8 level) pure returns (uint8 callerConstraints, uint8 receiverConstraints)
addAccountsToBlacklist
nonpayablefunction addAccountsToBlacklist(uint120 id, address[] accounts)
addAccountsToWhitelist
nonpayablefunction addAccountsToWhitelist(uint120 id, address[] accounts)
addCodeHashesToBlacklist
nonpayablefunction addCodeHashesToBlacklist(uint120 id, bytes32[] codehashes)
addCodeHashesToWhitelist
nonpayablefunction addCodeHashesToWhitelist(uint120 id, bytes32[] codehashes)
addOperatorToWhitelist
nonpayablefunction addOperatorToWhitelist(uint120 id, address operator)
applyListToCollection
nonpayablefunction applyListToCollection(address collection, uint120 id)
createList
nonpayablefunction createList(string name) returns (uint120)
createListCopy
nonpayablefunction createListCopy(string name, uint120 sourceListId) returns (uint120)
createOperatorWhitelist
nonpayablefunction createOperatorWhitelist(string name) returns (uint120)
reassignOwnershipOfList
nonpayablefunction reassignOwnershipOfList(uint120 id, address newOwner)
reassignOwnershipOfOperatorWhitelist
nonpayablefunction reassignOwnershipOfOperatorWhitelist(uint120 id, address newOwner)
removeAccountsFromBlacklist
nonpayablefunction removeAccountsFromBlacklist(uint120 id, address[] accounts)
removeAccountsFromWhitelist
nonpayablefunction removeAccountsFromWhitelist(uint120 id, address[] accounts)
removeCodeHashesFromBlacklist
nonpayablefunction removeCodeHashesFromBlacklist(uint120 id, bytes32[] codehashes)
removeCodeHashesFromWhitelist
nonpayablefunction removeCodeHashesFromWhitelist(uint120 id, bytes32[] codehashes)
removeOperatorFromWhitelist
nonpayablefunction removeOperatorFromWhitelist(uint120 id, address operator)
renounceOwnershipOfList
nonpayablefunction renounceOwnershipOfList(uint120 id)
renounceOwnershipOfOperatorWhitelist
nonpayablefunction renounceOwnershipOfOperatorWhitelist(uint120 id)
setOperatorWhitelistOfCollection
nonpayablefunction setOperatorWhitelistOfCollection(address collection, uint120 id)
setTransferSecurityLevelOfCollection
nonpayablefunction setTransferSecurityLevelOfCollection(address collection, uint8 level)
verifySignature
nonpayablefunction verifySignature(bytes signature)
verifySignatureVRS
nonpayablefunction verifySignatureVRS(uint8 v, bytes32 r, bytes32 s)
events
AddedAccountToList
event AddedAccountToList(uint8 indexed kind, uint256 indexed id, address indexed account)
AddedCodeHashToList
event AddedCodeHashToList(uint8 indexed kind, uint256 indexed id, bytes32 indexed codehash)
AddedToAllowlist
event AddedToAllowlist(uint8 indexed kind, uint256 indexed id, address indexed account)
AppliedListToCollection
event AppliedListToCollection(address indexed collection, uint120 indexed id)
CreatedAllowlist
event CreatedAllowlist(uint8 indexed kind, uint256 indexed id, string indexed name)
CreatedList
event CreatedList(uint256 indexed id, string name)
ReassignedAllowlistOwnership
event ReassignedAllowlistOwnership(uint8 indexed kind, uint256 indexed id, address indexed newOwner)
ReassignedListOwnership
event ReassignedListOwnership(uint256 indexed id, address indexed newOwner)
RemovedAccountFromList
event RemovedAccountFromList(uint8 indexed kind, uint256 indexed id, address indexed account)
RemovedCodeHashFromList
event RemovedCodeHashFromList(uint8 indexed kind, uint256 indexed id, bytes32 indexed codehash)
RemovedFromAllowlist
event RemovedFromAllowlist(uint8 indexed kind, uint256 indexed id, address indexed account)
SetAllowlist
event SetAllowlist(uint8 indexed kind, address indexed collection, uint120 indexed id)
SetTransferSecurityLevel
event SetTransferSecurityLevel(address indexed collection, uint8 level)
VerifiedEOASignature
event VerifiedEOASignature(address indexed account)
errors
CallerDidNotSignTheMessage
error CallerDidNotSignTheMessage()
CreatorTokenTransferValidator__ArrayLengthCannotBeZero
error CreatorTokenTransferValidator__ArrayLengthCannotBeZero()
CreatorTokenTransferValidator__CallerDoesNotOwnList
error CreatorTokenTransferValidator__CallerDoesNotOwnList()
CreatorTokenTransferValidator__CallerMustBeWhitelisted
error CreatorTokenTransferValidator__CallerMustBeWhitelisted()
CreatorTokenTransferValidator__CallerMustHaveElevatedPermissionsForSpecifiedNFT
error CreatorTokenTransferValidator__CallerMustHaveElevatedPermissionsForSpecifiedNFT()
CreatorTokenTransferValidator__ListDoesNotExist
error CreatorTokenTransferValidator__ListDoesNotExist()
CreatorTokenTransferValidator__ListOwnershipCannotBeTransferredToZeroAddress
error CreatorTokenTransferValidator__ListOwnershipCannotBeTransferredToZeroAddress()
CreatorTokenTransferValidator__OperatorIsBlacklisted
error CreatorTokenTransferValidator__OperatorIsBlacklisted()
CreatorTokenTransferValidator__ReceiverMustNotHaveDeployedCode
error CreatorTokenTransferValidator__ReceiverMustNotHaveDeployedCode()
CreatorTokenTransferValidator__ReceiverProofOfEOASignatureUnverified
error CreatorTokenTransferValidator__ReceiverProofOfEOASignatureUnverified()
CreatorTokenTransferValidator__ZeroAddressNotAllowed
error CreatorTokenTransferValidator__ZeroAddressNotAllowed()
CreatorTokenTransferValidator__ZeroCodeHashNotAllowed
error CreatorTokenTransferValidator__ZeroCodeHashNotAllowed()
SignatureAlreadyVerified
error SignatureAlreadyVerified()
creation bytecode
0x60a06040523480156200001157600080fd5b50604051620040d6380380620040d683398101604081905262000034916200030b565b604080518082019091526003815262454f4160e81b6020820152620000599062000143565b608052600080805260026020527fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b80546001600160a01b0384166001600160a01b031990911617905560405181907f5cc365f89543268cb9f25c255f7f610e9147e733c589bc2732279575f125be1490620000f4906020808252600c908201526b1111519055531508131254d560a21b604082015260600190565b60405180910390a26040516001600160a01b038316906001600160781b038316907f9b0894203394c3cbb23140db7a23b224d3e18e0366e9f65bd9c8402650e2736790600090a35050620003d8565b60006200015782516200018860201b60201c565b826040516020016200016b92919062000363565b604051602081830303815290604052805190602001209050919050565b60606000620001978362000221565b60010190506000816001600160401b03811115620001b957620001b9620003c2565b6040519080825280601f01601f191660200182016040528015620001e4576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084620001ee57509392505050565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106200026b577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef8100000000831062000298576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310620002b757662386f26fc10000830492506010015b6305f5e1008310620002d0576305f5e100830492506008015b6127108310620002e557612710830492506004015b60648310620002f8576064830492506002015b600a831062000305576001015b92915050565b6000602082840312156200031e57600080fd5b81516001600160a01b03811681146200033657600080fd5b9392505050565b60005b838110156200035a57818101518382015260200162000340565b50506000910152565b7f19457468657265756d205369676e6564204d6573736167653a0a0000000000008152600083516200039d81601a8501602088016200033d565b835190830190620003b681601a8401602088016200033d565b01601a01949350505050565b634e487b7160e01b600052604160045260246000fd5b608051613cdb620003fb60003960008181611b5301526128960152613cdb6000f3fe608060405234801561001057600080fd5b50600436106103835760003560e01c80637f39e7e4116101de578063ae602f441161010f578063d72dde5e116100ad578063e30cd5e11161007c578063e30cd5e1146104e2578063e991dc30146108ef578063f80af98414610902578063fec1d6431461091557600080fd5b8063d72dde5e14610748578063da0194c0146108b6578063de02cbb1146108c9578063def0125b146108dc57600080fd5b8063b8dcc68f116100e9578063b8dcc68f1461085d578063b955455214610870578063bf7bfd7e14610890578063d415f62f146108a357600080fd5b8063ae602f44146107d9578063b6567f2214610834578063b67d8f991461084a57600080fd5b80639445f5301161017c5780639e814cae116101565780639e814cae14610781578063a1cc5cc1146107a2578063a5d56b46146107b5578063a9f138eb146107c857600080fd5b80639445f53014610748578063982d03c01461075b57806399f9a6781461076e57600080fd5b80638b6ee865116101b85780638b6ee865146107015780638d744314146107145780638e28800f146107225780639340a7cc1461073557600080fd5b80637f39e7e41461069557806389631626146106b557806389a9c855146106c857600080fd5b806333f0901b116102b8578063515f7b28116102565780636bfab91d116102305780636bfab91d146106495780637161ac8d1461065c578063731fb9d81461066f5780637bac97de1461068257600080fd5b8063515f7b28146106105780635e17263d14610623578063697108281461063657600080fd5b80633fe5df99116102925780633fe5df99146104cf578063409dc573146105d75780634c9d0b45146105ea578063501b7d2e146105fd57600080fd5b806333f0901b1461057b57806334778f6a146105c4578063372fb54d146104e257600080fd5b806317e94a6c1161032557806323c99262116102ff57806323c9926214610507578063285fb8c8146105425780632c7fe70a146105555780632eb0b98a1461056857600080fd5b806317e94a6c146104cf57806318fbf6fe146104e25780632304aa02146104f457600080fd5b806310b5c6a01161036157806310b5c6a0146104215780631390a2c21461044157806316a17ce01461045457806316f18d74146104af57600080fd5b8063015499301461038857806301ffc9a71461039d578063057497cb146103c5575b600080fd5b61039b6103963660046135dd565b610928565b005b6103b06103ab366004613630565b610ad5565b60405190151581526020015b60405180910390f35b6103b06103d3366004613694565b6effffffffffffffffffffffffffffff8216600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845260040190915290205460ff1692915050565b61043461042f3660046136cb565b610c1f565b6040516103bc91906136e6565b61039b61044f366004613694565b610c4b565b6103b0610462366004613694565b6effffffffffffffffffffffffffffff8216600090815260046020818152604080842073ffffffffffffffffffffffffffffffffffffffff86168552909201905290205460ff1692915050565b6104c26104bd366004613740565b610d2c565b6040516103bc919061375d565b6104346104dd3660046136cb565b610d74565b61039b6104f0366004613694565b5050565b61039b610502366004613795565b610d7f565b600154610522906effffffffffffffffffffffffffffff1681565b6040516effffffffffffffffffffffffffffff90911681526020016103bc565b61039b6105503660046137ca565b610d89565b6103b0610563366004613815565b611212565b61039b6105763660046135dd565b61125f565b6105b76040518060400160405280600381526020017f454f41000000000000000000000000000000000000000000000000000000000081525081565b6040516103bc9190613841565b61039b6105d23660046136cb565b6113b2565b61039b6105e53660046135dd565b6113bb565b6104c26105f83660046136cb565b611513565b61052261060b3660046138ef565b611542565b61039b61061e3660046135dd565b61154e565b6103b0610631366004613931565b611672565b61039b6106443660046135dd565b6116b9565b61039b610657366004613694565b61180c565b6104c261066a3660046136cb565b611863565b61039b61067d366004613694565b611892565b6103b061069036600461394d565b61189c565b6106a86106a3366004613740565b6118fd565b6040516103bc91906139ae565b6104346106c33660046136cb565b61198f565b6103b06106d6366004613740565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b61039b61070f3660046136cb565b6119bb565b61039b6104f0366004613795565b6103b061073036600461394d565b6119c6565b6104c2610743366004613740565b611a27565b6103b0610756366004613694565b611a6f565b610434610769366004613740565b611abc565b61039b61077c3660046139e0565b611b04565b61079461078f366004613a2a565b611c41565b6040516103bc929190613a45565b61039b6107b03660046135dd565b611d75565b61039b6107c33660046135dd565b611f18565b61039b6107d63660046136cb565b50565b61080f6107e73660046136cb565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103bc565b6105226108423660046138ef565b600092915050565b6103b0610858366004613815565b612070565b61052261086b3660046138ef565b6120b6565b61088361087e366004613740565b6121fb565b6040516103bc9190613a79565b61039b61089e366004613795565b6122f4565b6103b06108b1366004613931565b6123e3565b61039b6108c4366004613abd565b612422565b6105226108d7366004613ae9565b6124e2565b61039b6108ea3660046135dd565b6126db565b6104346108fd366004613740565b6127ff565b61039b6109103660046138ef565b612847565b61039b610923366004613694565b6129b7565b8261093281612a9a565b81600081900361096e576040517fd13675da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6effffffffffffffffffffffffffffff8516600090815260046020526040812090805b85811015610acb578686828181106109ab576109ab613b3d565b90506020020160208101906109c09190613740565b915073ffffffffffffffffffffffffffffffffffffffff8216610a0f576040517f64019f1100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a198383612b1f565b15610ac35773ffffffffffffffffffffffffffffffffffffffff82166effffffffffffffffffffffffffffff891660006040517fda8f3bd170446760f0f965a9b52bf271cb9679b5e0a70059eff2d49425229d1790600090a473ffffffffffffffffffffffffffffffffffffffff82166000908152600484016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555b600101610991565b5050505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f285fb8c8000000000000000000000000000000000000000000000000000000001480610b6857507fffffffff0000000000000000000000000000000000000000000000000000000082167f8f1d689900000000000000000000000000000000000000000000000000000000145b80610bb457507fffffffff0000000000000000000000000000000000000000000000000000000082167ff3417f1a00000000000000000000000000000000000000000000000000000000145b80610bdf57507fffffffff000000000000000000000000000000000000000000000000000000008216155b80610c0a57507fffffffff000000000000000000000000000000000000000000000000000000008216155b80610c195750610c1982612b41565b92915050565b6effffffffffffffffffffffffffffff81166000908152600460205260409020606090610c1990612bd8565b81610c5581612a9a565b6effffffffffffffffffffffffffffff83166000908152600560205260409020610c7f8184612be5565b15610d265773ffffffffffffffffffffffffffffffffffffffff83166effffffffffffffffffffffffffffff851660016040517f503012490a650739416858609e898957b874d17415a062945179c5735797884090600090a473ffffffffffffffffffffffffffffffffffffffff83166000908152600482016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040902054606090610c199061010090046effffffffffffffffffffffffffffff16611863565b6060610c198261198f565b6104f082826122f4565b3360009081526003602052604081208054909161010082046effffffffffffffffffffffffffffff16918190610dc19060ff16611c41565b6effffffffffffffffffffffffffffff8516600090815260056020526040902091935091506001826002811115610dfa57610dfa61396b565b03610e8657853b15610e815773ffffffffffffffffffffffffffffffffffffffff8616600090815260048201602052604090205460ff16610e8157853f600090815260058201602052604090205460ff16610e81576040517faca58aa000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f47565b6002826002811115610e9a57610e9a61396b565b03610f475773ffffffffffffffffffffffffffffffffffffffff861660009081526020819052604090205460ff16610f475773ffffffffffffffffffffffffffffffffffffffff8616600090815260048201602052604090205460ff16610f4757853f600090815260058201602052604090205460ff16610f47576040517fce32f2aa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1603610f9d576003836003811115610f8e57610f8e61396b565b14610f9d575050505050505050565b6001836003811115610fb157610fb161396b565b03611089576effffffffffffffffffffffffffffff8416600090815260046020818152604080842073ffffffffffffffffffffffffffffffffffffffff8d1685529283019091529091205460ff1615611036576040517f409e6e1e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b883f600090815260058201602052604090205460ff1615611083576040517f409e6e1e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50610acb565b600283600381111561109d5761109d61396b565b036111335773ffffffffffffffffffffffffffffffffffffffff8816600090815260048201602052604090205460ff16156110dc575050505050505050565b873f600090815260058201602052604090205460ff1615611101575050505050505050565b6040517fef28f90100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60038360038111156111475761114761396b565b03610acb5773ffffffffffffffffffffffffffffffffffffffff8816600090815260048201602081905260409091205460ff161561118a57505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020829052604090205460ff16156111c357505050505050505050565b883f600090815260058301602081905260409091205460ff16156111ed5750505050505050505050565b883f60009081526020829052604090205460ff16156111015750505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260408120546112589061010090046effffffffffffffffffffffffffffff16836123e3565b9392505050565b8261126981612a9a565b8160008190036112a5576040517fd13675da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6effffffffffffffffffffffffffffff8516600090815260056020526040812090805b85811015610acb578686828181106112e2576112e2613b3d565b90506020020160208101906112f79190613740565b91506113038383612be5565b156113aa5773ffffffffffffffffffffffffffffffffffffffff82166effffffffffffffffffffffffffffff891660016040517f503012490a650739416858609e898957b874d17415a062945179c5735797884090600090a473ffffffffffffffffffffffffffffffffffffffff82166000908152600484016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b6001016112c8565b6107d6816119bb565b826113c581612a9a565b816000819003611401576040517fd13675da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6effffffffffffffffffffffffffffff8516600090815260056020526040812090805b85811015610acb5786868281811061143e5761143e613b3d565b60200291909101359250829050611481576040517f2bb30b6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61148e6002840183612c07565b1561150b57816effffffffffffffffffffffffffffff891660016040517fc8615322788d404dfe307db9eef031bc148d1cec5e270a1fd6528a02b445d44590600090a46000828152600584016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555b600101611424565b6effffffffffffffffffffffffffffff81166000908152600560205260409020606090610c1990600201612bd8565b600061125883836120b6565b8261155881612a9a565b816000819003611594576040517fd13675da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6effffffffffffffffffffffffffffff8516600090815260056020526040812090805b85811015610acb578686828181106115d1576115d1613b3d565b9050602002013591506115f08284600201612c1390919063ffffffff16565b1561166a57816effffffffffffffffffffffffffffff891660016040517f061d78094976b1d9ae7bb858f141c915b46152756409caadb07482983c2ca30190600090a46000828152600584016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b6001016115b7565b600081156116b0576effffffffffffffffffffffffffffff83166000908152600560208181526040808420868552909201905290205460ff16611258565b50600092915050565b826116c381612a9a565b8160008190036116ff576040517fd13675da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6effffffffffffffffffffffffffffff8516600090815260046020526040812090805b85811015610acb5786868281811061173c5761173c613b3d565b90506020020160208101906117519190613740565b915061175d8383612be5565b156118045773ffffffffffffffffffffffffffffffffffffffff82166effffffffffffffffffffffffffffff891660006040517f503012490a650739416858609e898957b874d17415a062945179c5735797884090600090a473ffffffffffffffffffffffffffffffffffffffff82166000908152600484016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b600101611722565b73ffffffffffffffffffffffffffffffffffffffff8116611859576040517f1f4ee59800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6104f08282612c1f565b6effffffffffffffffffffffffffffff81166000908152600460205260409020606090610c1990600201612bd8565b6104f0828261180c565b73ffffffffffffffffffffffffffffffffffffffff82811660009081526003602090815260408083205461010090046effffffffffffffffffffffffffffff168352600480835281842094861684529390930190529081205460ff16611258565b604080518082019091526000808252602082015273ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260409081902081518083019092528054829060ff1660088111156119585761195861396b565b60088111156119695761196961396b565b8152905461010090046effffffffffffffffffffffffffffff1660209091015292915050565b6effffffffffffffffffffffffffffff81166000908152600560205260409020606090610c1990612bd8565b6107d6816000612c1f565b73ffffffffffffffffffffffffffffffffffffffff82811660009081526003602090815260408083205461010090046effffffffffffffffffffffffffffff168352600582528083209385168352600490930190529081205460ff16611258565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040902054606090610c199061010090046effffffffffffffffffffffffffffff16611513565b6effffffffffffffffffffffffffffff8216600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845260040190915281205460ff16611258565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040902054606090610c199061010090046effffffffffffffffffffffffffffff16610c1f565b3360009081526020819052604090205460ff1615611b4e576040517fce8c510800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b7a7f0000000000000000000000000000000000000000000000000000000000000000848484612cb6565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bde576040517f7640718d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526020819052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517fe7f8d62df5af850daa5d677e9e5c8065b7b549ec99ae61ba0ffaa9f5bf3e2d039190a2505050565b60008080836008811115611c5757611c5761396b565b03611c685750600290506000915091565b6001836008811115611c7c57611c7c61396b565b03611c8c57506000905080915091565b6002836008811115611ca057611ca061396b565b03611cb15750600190506000915091565b6003836008811115611cc557611cc561396b565b03611cd65750600290506000915091565b6004836008811115611cea57611cea61396b565b03611cfb5750600390506000915091565b6005836008811115611d0f57611d0f61396b565b03611d205750600290506001915091565b6006836008811115611d3457611d3461396b565b03611d4457506002905080915091565b6007836008811115611d5857611d5861396b565b03611d695750600390506001915091565b50600390506002915091565b82611d7f81612a9a565b816000819003611dbb576040517fd13675da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6effffffffffffffffffffffffffffff8516600090815260056020526040812090805b85811015610acb57868682818110611df857611df8613b3d565b9050602002016020810190611e0d9190613740565b915073ffffffffffffffffffffffffffffffffffffffff8216611e5c576040517f64019f1100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e668383612b1f565b15611f105773ffffffffffffffffffffffffffffffffffffffff82166effffffffffffffffffffffffffffff891660016040517fda8f3bd170446760f0f965a9b52bf271cb9679b5e0a70059eff2d49425229d1790600090a473ffffffffffffffffffffffffffffffffffffffff82166000908152600484016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555b600101611dde565b82611f2281612a9a565b816000819003611f5e576040517fd13675da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6effffffffffffffffffffffffffffff8516600090815260046020526040812090805b85811015610acb57868682818110611f9b57611f9b613b3d565b60200291909101359250829050611fde576040517f2bb30b6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611feb6002840183612c07565b1561206857816effffffffffffffffffffffffffffff891660006040517fc8615322788d404dfe307db9eef031bc148d1cec5e270a1fd6528a02b445d44590600090a46000828152600584016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555b600101611f81565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260408120546112589061010090046effffffffffffffffffffffffffffff1683611672565b60018054600091829182906120db906effffffffffffffffffffffffffffff16613b9b565b91906101000a8154816effffffffffffffffffffffffffffff02191690836effffffffffffffffffffffffffffff160217905590506121173390565b6effffffffffffffffffffffffffffff82166000818152600260205260409081902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff949094169390931790925590517f5cc365f89543268cb9f25c255f7f610e9147e733c589bc2732279575f125be14906121ae9087908790613bc9565b60405180910390a260405133906effffffffffffffffffffffffffffff8316907f9b0894203394c3cbb23140db7a23b224d3e18e0366e9f65bd9c8402650e2736790600090a39392505050565b604080516060810182526000808252602082018190529181019190915273ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604080822081518083019092528054829060ff16600881111561225e5761225e61396b565b600881111561226f5761226f61396b565b8152905461010090046effffffffffffffffffffffffffffff166020909101526040805160608101909152815191925090819060088111156122b3576122b361396b565b815260200182602001516effffffffffffffffffffffffffffff16815260200182602001516effffffffffffffffffffffffffffff16815250915050919050565b6122fd82612cde565b6001546effffffffffffffffffffffffffffff908116908216111561234e576040517ff716872600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660008181526003602052604080822080547fffffffffffffffffffffffffffffffff000000000000000000000000000000ff166101006effffffffffffffffffffffffffffff87169081029190911790915590519092917fa66ff5557b7dc1562bb5e83306e15b513a25aa7537369bce38fc29c20847a79191a35050565b600081156116b0576effffffffffffffffffffffffffffff8316600090815260046020908152604080832085845260050190915290205460ff16611258565b61242b82612cde565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260036020526040902080548291907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600183600881111561248b5761248b61396b565b02179055508173ffffffffffffffffffffffffffffffffffffffff167fb39d8f1e6f05413a407e46fc950eb92e9f5b3d65a47c3f0bdc7a2741a6ec0f7d826040516124d69190613c16565b60405180910390a25050565b6001805460009182918290612507906effffffffffffffffffffffffffffff16613b9b565b91906101000a8154816effffffffffffffffffffffffffffff02191690836effffffffffffffffffffffffffffff16021790559050600181036effffffffffffffffffffffffffffff16836effffffffffffffffffffffffffffff16111561259b576040517ff716872600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6effffffffffffffffffffffffffffff81166000818152600260205260409081902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055517f5cc365f89543268cb9f25c255f7f610e9147e733c589bc2732279575f125be14906126159088908890613bc9565b60405180910390a260405133906effffffffffffffffffffffffffffff8316907f9b0894203394c3cbb23140db7a23b224d3e18e0366e9f65bd9c8402650e2736790600090a36effffffffffffffffffffffffffffff8084166000908152600460208181526040808420600580845282862096881686529383528185209390925283209093926126a790868685612eb7565b6126b46000868685612fb8565b6126c16001868584612eb7565b6126ce6001868584612fb8565b5092979650505050505050565b826126e581612a9a565b816000819003612721576040517fd13675da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6effffffffffffffffffffffffffffff8516600090815260046020526040812090805b85811015610acb5786868281811061275e5761275e613b3d565b90506020020135915061277d8284600201612c1390919063ffffffff16565b156127f757816effffffffffffffffffffffffffffff891660006040517f061d78094976b1d9ae7bb858f141c915b46152756409caadb07482983c2ca30190600090a46000828152600584016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b600101612744565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040902054606090610c199061010090046effffffffffffffffffffffffffffff1661198f565b3360009081526020819052604090205460ff1615612891576040517fce8c510800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128f17f000000000000000000000000000000000000000000000000000000000000000083838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061308692505050565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612955576040517f7640718d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526020819052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517fe7f8d62df5af850daa5d677e9e5c8065b7b549ec99ae61ba0ffaa9f5bf3e2d039190a25050565b816129c181612a9a565b6effffffffffffffffffffffffffffff831660009081526005602052604090206129eb8184612b1f565b15610d265773ffffffffffffffffffffffffffffffffffffffff83166effffffffffffffffffffffffffffff851660016040517fda8f3bd170446760f0f965a9b52bf271cb9679b5e0a70059eff2d49425229d1790600090a473ffffffffffffffffffffffffffffffffffffffff83166000908152600482016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905550505050565b6effffffffffffffffffffffffffffff811660009081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146107d6576040517f4e680cb000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006112588373ffffffffffffffffffffffffffffffffffffffff84166130aa565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f89a9c855000000000000000000000000000000000000000000000000000000001480610c1957507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610c19565b60606000611258836130f9565b60006112588373ffffffffffffffffffffffffffffffffffffffff8416613155565b600061125883836130aa565b60006112588383613155565b612c2882612a9a565b6effffffffffffffffffffffffffffff821660008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590519092917f9b0894203394c3cbb23140db7a23b224d3e18e0366e9f65bd9c8402650e2736791a35050565b6000806000612cc787878787613248565b91509150612cd481613337565b5095945050505050565b6000813b15612e8057503373ffffffffffffffffffffffffffffffffffffffff82161480612e80578173ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612d8b575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612d8891810190613c24565b60015b15612dab5773ffffffffffffffffffffffffffffffffffffffff16331490505b80612e805773ffffffffffffffffffffffffffffffffffffffff82166391d148546000336040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b168152600481019290925273ffffffffffffffffffffffffffffffffffffffff166024820152604401602060405180830381865afa925050508015612e78575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612e7591810190613c41565b60015b15612e805790505b806104f0576040517f7f954ba100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181600481016000612ec8846134ef565b90506000805b82811015612fac57612ee086826134f9565b9150612eec8583612b1f565b15612fa4578173ffffffffffffffffffffffffffffffffffffffff16896effffffffffffffffffffffffffffff168b6001811115612f2c57612f2c61396b565b6040517fda8f3bd170446760f0f965a9b52bf271cb9679b5e0a70059eff2d49425229d1790600090a473ffffffffffffffffffffffffffffffffffffffff8216600090815260208590526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555b600101612ece565b50505050505050505050565b6002808301908201600583016000612fcf846134ef565b90506000805b82811015612fac57612fe786826134f9565b9150612ff38583612c07565b1561307e5781896effffffffffffffffffffffffffffff168b600181111561301d5761301d61396b565b6040517fc8615322788d404dfe307db9eef031bc148d1cec5e270a1fd6528a02b445d44590600090a4600082815260208590526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555b600101612fd5565b60008060006130958585613505565b915091506130a281613337565b509392505050565b60008181526001830160205260408120546130f157508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610c19565b506000610c19565b60608160000180548060200260200160405190810160405280929190818152602001828054801561314957602002820191906000526020600020905b815481526020019060010190808311613135575b50505050509050919050565b6000818152600183016020526040812054801561323e576000613179600183613c63565b855490915060009061318d90600190613c63565b90508181146131f25760008660000182815481106131ad576131ad613b3d565b90600052602060002001549050808760000184815481106131d0576131d0613b3d565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061320357613203613c76565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610c19565b6000915050610c19565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561327f575060009050600361332e565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156132d3573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166133275760006001925092505061332e565b9150600090505b94509492505050565b600081600481111561334b5761334b61396b565b036133535750565b60018160048111156133675761336761396b565b036133d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b60028160048111156133e7576133e761396b565b0361344e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016133ca565b60038160048111156134625761346261396b565b036107d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016133ca565b6000610c19825490565b6000611258838361354a565b600080825160410361353b5760208301516040840151606085015160001a61352f87828585613248565b94509450505050613543565b506000905060025b9250929050565b600082600001828154811061356157613561613b3d565b9060005260206000200154905092915050565b80356effffffffffffffffffffffffffffff8116811461359357600080fd5b919050565b60008083601f8401126135aa57600080fd5b50813567ffffffffffffffff8111156135c257600080fd5b6020830191508360208260051b850101111561354357600080fd5b6000806000604084860312156135f257600080fd5b6135fb84613574565b9250602084013567ffffffffffffffff81111561361757600080fd5b61362386828701613598565b9497909650939450505050565b60006020828403121561364257600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461125857600080fd5b73ffffffffffffffffffffffffffffffffffffffff811681146107d657600080fd5b600080604083850312156136a757600080fd5b6136b083613574565b915060208301356136c081613672565b809150509250929050565b6000602082840312156136dd57600080fd5b61125882613574565b6020808252825182820181905260009190848201906040850190845b8181101561373457835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101613702565b50909695505050505050565b60006020828403121561375257600080fd5b813561125881613672565b6020808252825182820181905260009190848201906040850190845b8181101561373457835183529284019291840191600101613779565b600080604083850312156137a857600080fd5b82356137b381613672565b91506137c160208401613574565b90509250929050565b6000806000606084860312156137df57600080fd5b83356137ea81613672565b925060208401356137fa81613672565b9150604084013561380a81613672565b809150509250925092565b6000806040838503121561382857600080fd5b823561383381613672565b946020939093013593505050565b600060208083528351808285015260005b8181101561386e57858101830151858201604001528201613852565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b60008083601f8401126138bf57600080fd5b50813567ffffffffffffffff8111156138d757600080fd5b60208301915083602082850101111561354357600080fd5b6000806020838503121561390257600080fd5b823567ffffffffffffffff81111561391957600080fd5b613925858286016138ad565b90969095509350505050565b6000806040838503121561394457600080fd5b61383383613574565b6000806040838503121561396057600080fd5b82356136b081613672565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600981106139aa576139aa61396b565b9052565b60006040820190506139c182845161399a565b6020928301516effffffffffffffffffffffffffffff16919092015290565b6000806000606084860312156139f557600080fd5b833560ff81168114613a0657600080fd5b95602085013595506040909401359392505050565b80356009811061359357600080fd5b600060208284031215613a3c57600080fd5b61125882613a1b565b6040810160048410613a5957613a5961396b565b83825260038310613a6c57613a6c61396b565b8260208301529392505050565b6000606082019050613a8c82845161399a565b60208301516effffffffffffffffffffffffffffff8082166020850152806040860151166040850152505092915050565b60008060408385031215613ad057600080fd5b8235613adb81613672565b91506137c160208401613a1b565b600080600060408486031215613afe57600080fd5b833567ffffffffffffffff811115613b1557600080fd5b613b21868287016138ad565b9094509250613b34905060208501613574565b90509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006effffffffffffffffffffffffffffff808316818103613bbf57613bbf613b6c565b6001019392505050565b60208152816020820152818360408301376000818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b60208101610c19828461399a565b600060208284031215613c3657600080fd5b815161125881613672565b600060208284031215613c5357600080fd5b8151801515811461125857600080fd5b81810381811115610c1957610c19613b6c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220b2e22ffac36fef1d4cc736309089b3d0e9c332fda01fd4faf1593371ad9d647a64736f6c6343000813003300000000000000000000000067985b1f8b613b57077bbdb24a5defcdda458317