ERC-1155
Pass
Overview
Max Total Supply
333
Holders
111
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
FlyingCopper
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-08-07 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.13; interface IOperatorFilterRegistry { /** * @notice Returns true if operator is not filtered for a given token, either by address or codeHash. Also returns * true if supplied registrant address is not registered. */ function isOperatorAllowed( address registrant, address operator ) external view returns (bool); /** * @notice Registers an address with the registry. May be called by address itself or by EIP-173 owner. */ function register(address registrant) external; /** * @notice Registers an address with the registry and "subscribes" to another address's filtered operators and codeHashes. */ function registerAndSubscribe( address registrant, address subscription ) external; /** * @notice Registers an address with the registry and copies the filtered operators and codeHashes from another * address without subscribing. */ function registerAndCopyEntries( address registrant, address registrantToCopy ) external; /** * @notice Unregisters an address with the registry and removes its subscription. May be called by address itself or by EIP-173 owner. * Note that this does not remove any filtered addresses or codeHashes. * Also note that any subscriptions to this registrant will still be active and follow the existing filtered addresses and codehashes. */ function unregister(address addr) external; /** * @notice Update an operator address for a registered address - when filtered is true, the operator is filtered. */ function updateOperator( address registrant, address operator, bool filtered ) external; /** * @notice Update multiple operators for a registered address - when filtered is true, the operators will be filtered. Reverts on duplicates. */ function updateOperators( address registrant, address[] calldata operators, bool filtered ) external; /** * @notice Update a codeHash for a registered address - when filtered is true, the codeHash is filtered. */ function updateCodeHash( address registrant, bytes32 codehash, bool filtered ) external; /** * @notice Update multiple codeHashes for a registered address - when filtered is true, the codeHashes will be filtered. Reverts on duplicates. */ function updateCodeHashes( address registrant, bytes32[] calldata codeHashes, bool filtered ) external; /** * @notice Subscribe an address to another registrant's filtered operators and codeHashes. Will remove previous * subscription if present. * Note that accounts with subscriptions may go on to subscribe to other accounts - in this case, * subscriptions will not be forwarded. Instead the former subscription's existing entries will still be * used. */ function subscribe( address registrant, address registrantToSubscribe ) external; /** * @notice Unsubscribe an address from its current subscribed registrant, and optionally copy its filtered operators and codeHashes. */ function unsubscribe(address registrant, bool copyExistingEntries) external; /** * @notice Get the subscription address of a given registrant, if any. */ function subscriptionOf(address addr) external returns (address registrant); /** * @notice Get the set of addresses subscribed to a given registrant. * Note that order is not guaranteed as updates are made. */ function subscribers( address registrant ) external returns (address[] memory); /** * @notice Get the subscriber at a given index in the set of addresses subscribed to a given registrant. * Note that order is not guaranteed as updates are made. */ function subscriberAt( address registrant, uint256 index ) external returns (address); /** * @notice Copy filtered operators and codeHashes from a different registrantToCopy to addr. */ function copyEntriesOf( address registrant, address registrantToCopy ) external; /** * @notice Returns true if operator is filtered by a given address or its subscription. */ function isOperatorFiltered( address registrant, address operator ) external returns (bool); /** * @notice Returns true if the hash of an address's code is filtered by a given address or its subscription. */ function isCodeHashOfFiltered( address registrant, address operatorWithCode ) external returns (bool); /** * @notice Returns true if a codeHash is filtered by a given address or its subscription. */ function isCodeHashFiltered( address registrant, bytes32 codeHash ) external returns (bool); /** * @notice Returns a list of filtered operators for a given address or its subscription. */ function filteredOperators( address addr ) external returns (address[] memory); /** * @notice Returns the set of filtered codeHashes for a given address or its subscription. * Note that order is not guaranteed as updates are made. */ function filteredCodeHashes( address addr ) external returns (bytes32[] memory); /** * @notice Returns the filtered operator at the given index of the set of filtered operators for a given address or * its subscription. * Note that order is not guaranteed as updates are made. */ function filteredOperatorAt( address registrant, uint256 index ) external returns (address); /** * @notice Returns the filtered codeHash at the given index of the list of filtered codeHashes for a given address or * its subscription. * Note that order is not guaranteed as updates are made. */ function filteredCodeHashAt( address registrant, uint256 index ) external returns (bytes32); /** * @notice Returns true if an address has registered */ function isRegistered(address addr) external returns (bool); /** * @dev Convenience method to compute the code hash of an arbitrary contract */ function codeHashOf(address addr) external returns (bytes32); } pragma solidity ^0.8.13; address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E; address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6; pragma solidity ^0.8.13; /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. * Please note that if your token contract does not provide an owner with EIP-173, it must provide * administration methods on the contract itself to interact with the registry otherwise the subscription * will be locked to the options set during construction. */ abstract contract OperatorFilterer { /// @dev Emitted when an operator is not allowed. error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS); /// @dev The constructor that is called when the contract is being deployed. constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe( address(this), subscriptionOrRegistrantToCopy ); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries( address(this), subscriptionOrRegistrantToCopy ); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } /** * @dev A helper function to check if an operator is allowed. */ modifier onlyAllowedOperator(address from) virtual { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from != msg.sender) { _checkFilterOperator(msg.sender); } _; } /** * @dev A helper function to check if an operator approval is allowed. */ modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } /** * @dev A helper function to check if an operator is allowed. */ function _checkFilterOperator(address operator) internal view virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { // under normal circumstances, this function will revert rather than return false, but inheriting contracts // may specify their own OperatorFilterRegistry implementations, which may behave differently if ( !OPERATOR_FILTER_REGISTRY.isOperatorAllowed( address(this), operator ) ) { revert OperatorNotAllowed(operator); } } } } pragma solidity ^0.8.13; /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. * @dev Please note that if your token contract does not provide an owner with EIP-173, it must provide * administration methods on the contract itself to interact with the registry otherwise the subscription * will be locked to the options set during construction. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { /// @dev The constructor that is called when the contract is being deployed. constructor() OperatorFilterer(CANONICAL_CORI_SUBSCRIPTION, true) {} } // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.9.2) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. * OpenZeppelin's JavaScript library generates merkle trees that are safe * against this attack out of the box. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof( bytes32[] memory proof, bytes32 leaf ) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata( bytes32[] calldata proof, bytes32 leaf ) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 proofLen = proof.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require( leavesLen + proofLen - 1 == totalHashes, "MerkleProof: invalid multiproof" ); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]) : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { require(proofPos == proofLen, "MerkleProof: invalid multiproof"); unchecked { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 proofLen = proof.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require( leavesLen + proofLen - 1 == totalHashes, "MerkleProof: invalid multiproof" ); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]) : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { require(proofPos == proofLen, "MerkleProof: invalid multiproof"); unchecked { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash( bytes32 a, bytes32 b ) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data ) internal returns (bytes memory) { return functionCallWithValue( target, data, 0, "Address: low-level call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); (bool success, bytes memory returndata) = target.call{value: value}( data ); return verifyCallResultFromTarget( target, success, returndata, errorMessage ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data ) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget( target, success, returndata, errorMessage ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data ) internal returns (bytes memory) { return functionDelegateCall( target, data, "Address: low-level delegate call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget( target, success, returndata, errorMessage ); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert( bytes memory returndata, string memory errorMessage ) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface( bytes4 interfaceId ) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle( address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value ); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll( address indexed account, address indexed operator, bool approved ); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf( address account, uint256 id ) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch( address[] calldata accounts, uint256[] calldata ids ) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll( address account, address operator ) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC1155/ERC1155.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface( bytes4 interfaceId ) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf( address account, uint256 id ) public view virtual override returns (uint256) { require( account != address(0), "ERC1155: address zero is not a valid owner" ); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch( address[] memory accounts, uint256[] memory ids ) public view virtual override returns (uint256[] memory) { require( accounts.length == ids.length, "ERC1155: accounts and ids length mismatch" ); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll( address operator, bool approved ) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll( address account, address operator ) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, to, ids, amounts, data); uint256 fromBalance = _balances[id][from]; require( fromBalance >= amount, "ERC1155: insufficient balance for transfer" ); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require( ids.length == amounts.length, "ERC1155: ids and amounts length mismatch" ); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require( fromBalance >= amount, "ERC1155: insufficient balance for transfer" ); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck( operator, from, to, ids, amounts, data ); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeTransferAcceptanceCheck( operator, address(0), to, id, amount, data ); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require( ids.length == amounts.length, "ERC1155: ids and amounts length mismatch" ); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck( operator, address(0), to, ids, amounts, data ); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Emits a {TransferSingle} event. * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn(address from, uint256 id, uint256 amount) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require( ids.length == amounts.length, "ERC1155: ids and amounts length mismatch" ); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require( fromBalance >= amount, "ERC1155: burn amount exceeds balance" ); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `ids` and `amounts` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received( operator, from, id, amount, data ) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived( operator, from, ids, amounts, data ) returns (bytes4 response) { if ( response != IERC1155Receiver.onERC1155BatchReceived.selector ) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155Receiver implementer"); } } } function _asSingletonArray( uint256 element ) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } } // OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo( uint256 tokenId, uint256 salePrice ) external view returns (address receiver, uint256 royaltyAmount); } // OpenZeppelin Contracts (last updated v4.9.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface( bytes4 interfaceId ) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo( uint256 tokenId, uint256 salePrice ) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty( address receiver, uint96 feeNumerator ) internal virtual { require( feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice" ); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require( feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice" ); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } pragma solidity 0.8.20; /// @title "Flying Copper" Token (ERC-1155) /// @author @0xhammadghazi /// @notice This contract allows for minting the "Flying Copper" with a maximum of 333 copies. contract FlyingCopper is DefaultOperatorFilterer, Ownable, ERC2981, ERC1155 { using MerkleProof for bytes32[]; /*////////////////////////////////////////////////////////////// STATE VARIABLES //////////////////////////////////////////////////////////////*/ // Maximum supply (copies) of "Flying Copper" token uint256 public constant MAX_SUPPLY = 333; // Token ID of "Flying Copper" token uint256 public constant TOKEN_ID = 1; // Price of each copy of "Flying Copper" token for both the whitelist and public phases uint256 public constant PRICE = 0.1 ether; // Mint phases enum MintPhase { NOT_LIVE, // Minting is not live yet WHITELIST_PHASE, // Mint is in the Whitelist phase PUBLIC_PHASE, // Mint is in the Public phase MINT_OVER // Minting is over } // Tracks the current mint phase MintPhase public mintPhase; // Tracks whether trading of the token is currently allowed or not bool public isTradingAllowed; // Stores merkle root to be used for whitelisting bytes32 public merkleRoot; // Tracks total minted supply (copies) of "Flying Copper" token uint256 public totalSupply; /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event EtherWithdrawn(address recipient, uint256 withdrawAmount); event MintPhaseChanged(MintPhase newMintPhase); event MerkleRootChanged(bytes32 newMerkleRoot); event URIChanged(string newURI); /*////////////////////////////////////////////////////////////// ERRORS //////////////////////////////////////////////////////////////*/ error AlreadyMinted(); error IncorrectEth(); error MerkleRootNotSet(); error NotPublicPhase(); error NotWhitelistPhase(); error NotEligibleForWhitelistMint(); error SameValueAsOld(); error Sold(); error TradingIsNotAllowed(); error TransferFailed(); error ZeroAddress(); error ZeroBalance(); /*////////////////////////////////////////////////////////////// MODIFIER //////////////////////////////////////////////////////////////*/ /// @notice Reverts if trading of the flying copper token is currently prohibited. modifier onlyIfTradingAllowed() { if (!isTradingAllowed) { revert TradingIsNotAllowed(); } _; } /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ /// @notice Constructor function to initialize the "Flying Copper" token with specified parameters. /// @param _royaltyReceiverAddress The address that will receive royalty payments from secondary sales. /// @param _royaltyPercentage The percentage of royalty to be paid on secondary sales (0-10000, where 10000 is 100%). /// @param _tokenURI URI of "Flying Copper" token. constructor( address _royaltyReceiverAddress, uint96 _royaltyPercentage, string memory _tokenURI ) ERC1155(_tokenURI) { // Reverts if '_royaltyReceiverAddress' is a zero address. if (_royaltyReceiverAddress == address(0)) { revert ZeroAddress(); } // Set initial default royalty. _setDefaultRoyalty(_royaltyReceiverAddress, _royaltyPercentage); } /*////////////////////////////////////////////////////////////// MINT FUNCTIONS //////////////////////////////////////////////////////////////*/ /// @notice Allows a whitelisted address to mint one copy of the "Flying Copper" token. /// @dev This function can only be called during the whitelist phase. /// @param _merkleProof The Merkle proof to verify the caller's whitelisted status. function whitelistMint(bytes32[] calldata _merkleProof) external payable { // Ensure mint is in the whitelist phase. if (mintPhase != MintPhase.WHITELIST_PHASE) { revert NotWhitelistPhase(); } // Verify that the caller is whitelisted. if ( !MerkleProof.verify( _merkleProof, merkleRoot, keccak256(abi.encodePacked(msg.sender)) ) ) { revert NotEligibleForWhitelistMint(); } // Perform sanity checks and mint the token for the caller. _sanityCheckAndMint(); } /// @notice Allows anyone to mint one copy of the "Flying Copper" token during the public minting phase. /// @dev This function can only be called during the public minting phase. function publicMint() external payable { // Ensure mint is in the public phase. if (mintPhase != MintPhase.PUBLIC_PHASE) { revert NotPublicPhase(); } // Perform sanity checks and mint the token for the caller. _sanityCheckAndMint(); } /// @dev Performs sanity checks and mints a token for the given caller. function _sanityCheckAndMint() private { // Ensure that the maximum supply has not been reached. if (totalSupply + 1 > MAX_SUPPLY) { revert Sold(); } // Ensure that the correct amount of Ether is sent for the minting. if (msg.value != PRICE) { revert IncorrectEth(); } // Ensure that the caller hasn't already minted the token. if (balanceOf(msg.sender, TOKEN_ID) == 1) { revert AlreadyMinted(); } // Increment total minted copies. ++totalSupply; // Mint one copy of the "Flying Copper" token for the caller. _mint(msg.sender, TOKEN_ID, 1, ""); } /*////////////////////////////////////////////////////////////// OWNER RESTRICTED FUNCTIONS //////////////////////////////////////////////////////////////*/ /// @notice Switches the minting phase of the contract to a new phase. /// @dev This function can only be called by the contract owner. /// @param _newMintPhase The new minting phase to switch to. function switchMintPhase(MintPhase _newMintPhase) external onlyOwner { // Ensure the new minting phase is different from the current one. if (mintPhase == _newMintPhase) { revert SameValueAsOld(); } // If the new mint phase is the whitelist phase, ensure that the Merkle root is already set. if (_newMintPhase == MintPhase.WHITELIST_PHASE) { if (merkleRoot == bytes32(0)) { revert MerkleRootNotSet(); } } // Update the minting phase to the new phase. mintPhase = _newMintPhase; // Emit an event to signal the change in minting phase. emit MintPhaseChanged(_newMintPhase); } /// @notice Sets a new Merkle root for verifying whitelist status. /// @dev This function can only be called by the contract owner. /// @param _newMerkleRoot The new Merkle root to set. function setMerkleRoot(bytes32 _newMerkleRoot) external onlyOwner { // Ensure the new Merkle root is different from the current one. if (merkleRoot == _newMerkleRoot) { revert SameValueAsOld(); } // Update the Merkle root to the new value. merkleRoot = _newMerkleRoot; // Emit an event to signal the change in the Merkle root. emit MerkleRootChanged(_newMerkleRoot); } /// @notice Sets a new URI for "Flying Copper" token. /// @dev This function can only be called by the contract owner. /// @param _newuri URL of the new URI. function setURI(string calldata _newuri) external onlyOwner { // Overwrites the old URI. _setURI(_newuri); emit URIChanged(_newuri); } /// @notice Flips the current trading status of the token. /// @dev This function can only be called by the owner of the contract. function flipTradingStatus() external onlyOwner { isTradingAllowed = !isTradingAllowed; } /// @notice Function to withdraw the contract's ether balance. Only the contract owner can call this function. /// @dev The contract must have a positive ether balance to execute the withdrawal. function withdrawEther() external onlyOwner { // Get the current contract's ether balance. uint256 contractBalance = address(this).balance; // Ensure there's ether balance to withdraw. if (contractBalance == 0) { revert ZeroBalance(); } // Attempt to transfer the contract's ether balance to the contract owner. (bool success, ) = msg.sender.call{value: contractBalance}(""); if (!success) { revert TransferFailed(); } // Emit an event to log the ether withdrawal. emit EtherWithdrawn(msg.sender, contractBalance); } /*////////////////////////////////////////////////////////////// ERC1155 FUNCTIONS //////////////////////////////////////////////////////////////*/ function setApprovalForAll( address operator, bool approved ) public override onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public override onlyIfTradingAllowed onlyAllowedOperator(from) { super.safeTransferFrom(from, to, id, amount, data); } function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public override onlyIfTradingAllowed onlyAllowedOperator(from) { super.safeBatchTransferFrom(from, to, ids, amounts, data); } /*////////////////////////////////////////////////////////////// ERC2891 FUNCTIONS //////////////////////////////////////////////////////////////*/ /// @notice Set the default royalty. /// @param receiver The address of the receiver for the royalty payments. /// @param feeNumerator The percentage of royalty to be paid to the receiver. /// @dev This function can only be called by the owner of the contract. function setDefaultRoyalty( address receiver, uint96 feeNumerator ) external onlyOwner { _setDefaultRoyalty(receiver, feeNumerator); } /// @notice Delete the default royalty for all tokens in the contract. /// @dev This function can only be called by the owner of the contract. function deleteDefaultRoyalty() external onlyOwner { _deleteDefaultRoyalty(); } /*////////////////////////////////////////////////////////////// ERC165 FUNCTION //////////////////////////////////////////////////////////////*/ function supportsInterface( bytes4 interfaceId ) public view virtual override(ERC2981, ERC1155) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_royaltyReceiverAddress","type":"address"},{"internalType":"uint96","name":"_royaltyPercentage","type":"uint96"},{"internalType":"string","name":"_tokenURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyMinted","type":"error"},{"inputs":[],"name":"IncorrectEth","type":"error"},{"inputs":[],"name":"MerkleRootNotSet","type":"error"},{"inputs":[],"name":"NotEligibleForWhitelistMint","type":"error"},{"inputs":[],"name":"NotPublicPhase","type":"error"},{"inputs":[],"name":"NotWhitelistPhase","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"SameValueAsOld","type":"error"},{"inputs":[],"name":"Sold","type":"error"},{"inputs":[],"name":"TradingIsNotAllowed","type":"error"},{"inputs":[],"name":"TransferFailed","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroBalance","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"withdrawAmount","type":"uint256"}],"name":"EtherWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"newMerkleRoot","type":"bytes32"}],"name":"MerkleRootChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum FlyingCopper.MintPhase","name":"newMintPhase","type":"uint8"}],"name":"MintPhaseChanged","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":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"newURI","type":"string"}],"name":"URIChanged","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deleteDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipTradingStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTradingAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPhase","outputs":[{"internalType":"enum FlyingCopper.MintPhase","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","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":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","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":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_newMerkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newuri","type":"string"}],"name":"setURI","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":[{"internalType":"enum FlyingCopper.MintPhase","name":"_newMintPhase","type":"uint8"}],"name":"switchMintPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdrawEther","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801562000010575f80fd5b5060405162002a8738038062002a87833981016040819052620000339162000357565b80733cc6cdda760b79bafa08df41ecfa224f810dceb660016daaeb6d7670e522a718067333cd4e3b1562000186578015620000d957604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b5f604051808303815f87803b158015620000bc575f80fd5b505af1158015620000cf573d5f803e3d5ffd5b5050505062000186565b6001600160a01b038216156200012a5760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af290390604401620000a4565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e486906024015f604051808303815f87803b1580156200016e575f80fd5b505af115801562000181573d5f803e3d5ffd5b505050505b5062000194905033620001dd565b6200019f816200022c565b506001600160a01b038316620001c85760405163d92e233d60e01b815260040160405180910390fd5b620001d483836200023e565b505050620005b7565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60056200023a8282620004ef565b5050565b6127106001600160601b0382161115620002b25760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084015b60405180910390fd5b6001600160a01b0382166200030a5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401620002a9565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600155565b634e487b7160e01b5f52604160045260245ffd5b5f805f606084860312156200036a575f80fd5b83516001600160a01b038116811462000381575f80fd5b602085810151919450906001600160601b0381168114620003a0575f80fd5b60408601519093506001600160401b0380821115620003bd575f80fd5b818701915087601f830112620003d1575f80fd5b815181811115620003e657620003e662000343565b604051601f8201601f19908116603f0116810190838211818310171562000411576200041162000343565b816040528281528a8684870101111562000429575f80fd5b5f93505b828410156200044c57848401860151818501870152928501926200042d565b5f8684830101528096505050505050509250925092565b600181811c908216806200047857607f821691505b6020821081036200049757634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620004ea575f81815260208120601f850160051c81016020861015620004c55750805b601f850160051c820191505b81811015620004e657828155600101620004d1565b5050505b505050565b81516001600160401b038111156200050b576200050b62000343565b62000523816200051c845462000463565b846200049d565b602080601f83116001811462000559575f8415620005415750858301515b5f19600386901b1c1916600185901b178555620004e6565b5f85815260208120601f198616915b82811015620005895788860151825594840194600190910190840162000568565b5085821015620005a757878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b6124c280620005c55f395ff3fe6080604052600436106101b9575f3560e01c806341f43434116100f25780638da5cb5b11610092578063c20828a611610062578063c20828a6146104c3578063e985e9c5146104e2578063f242432a14610529578063f2fde38b14610548575f80fd5b80638da5cb5b14610456578063a22cb46514610472578063a48179ff14610491578063aa1b103f146104af575f80fd5b80637362377b116100cd5780637362377b146103f45780637cb647591461040857806389a89002146104275780638d859f3e1461043b575f80fd5b806341f434341461037b5780634e1273f4146103b4578063715018a6146103e0575f80fd5b806320b6a50f1161015d5780632eb2c2d6116101385780632eb2c2d61461031f5780632eb4a7ab1461033e57806332cb6b0c14610353578063372f657c14610368575f80fd5b806320b6a50f146102c557806326092b83146102d95780632a55205a146102e1575f80fd5b806304634d8d1161019857806304634d8d1461023f5780630e89341c1461025e57806317881cbf1461028a57806318160ddd146102b0575f80fd5b8062fdd58e146101bd57806301ffc9a7146101ef57806302fe53051461021e575b5f80fd5b3480156101c8575f80fd5b506101dc6101d73660046119b6565b610567565b6040519081526020015b60405180910390f35b3480156101fa575f80fd5b5061020e6102093660046119f3565b610600565b60405190151581526020016101e6565b348015610229575f80fd5b5061023d610238366004611a0e565b61060a565b005b34801561024a575f80fd5b5061023d610259366004611a7a565b61068d565b348015610269575f80fd5b5061027d610278366004611aba565b6106a3565b6040516101e69190611b14565b348015610295575f80fd5b506006546102a39060ff1681565b6040516101e69190611b3a565b3480156102bb575f80fd5b506101dc60085481565b3480156102d0575f80fd5b5061023d610735565b61023d61075a565b3480156102ec575f80fd5b506103006102fb366004611b60565b61079b565b604080516001600160a01b0390931683526020830191909152016101e6565b34801561032a575f80fd5b5061023d610339366004611cc2565b610845565b348015610349575f80fd5b506101dc60075481565b34801561035e575f80fd5b506101dc61014d81565b61023d610376366004611d65565b61089c565b348015610386575f80fd5b5061039c6daaeb6d7670e522a718067333cd4e81565b6040516001600160a01b0390911681526020016101e6565b3480156103bf575f80fd5b506103d36103ce366004611dc2565b61096c565b6040516101e69190611ec0565b3480156103eb575f80fd5b5061023d610a94565b3480156103ff575f80fd5b5061023d610aa5565b348015610413575f80fd5b5061023d610422366004611aba565b610b6b565b348015610432575f80fd5b506101dc600181565b348015610446575f80fd5b506101dc67016345785d8a000081565b348015610461575f80fd5b505f546001600160a01b031661039c565b34801561047d575f80fd5b5061023d61048c366004611edf565b610bd1565b34801561049c575f80fd5b5060065461020e90610100900460ff1681565b3480156104ba575f80fd5b5061023d610bea565b3480156104ce575f80fd5b5061023d6104dd366004611f09565b610bfb565b3480156104ed575f80fd5b5061020e6104fc366004611f27565b6001600160a01b039182165f90815260046020908152604080832093909416825291909152205460ff1690565b348015610534575f80fd5b5061023d610543366004611f58565b610cd6565b348015610553575f80fd5b5061023d610562366004611fb8565b610d25565b5f6001600160a01b0383166105d65760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b505f8181526003602090815260408083206001600160a01b03861684529091529020545b92915050565b5f6105fa82610d9e565b610612610ddd565b61065082828080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610e3692505050565b7fbd06d92759c326896ec0f7c3a981e801ae4644e020f89b2a198909b692df0ddd8282604051610681929190611fd1565b60405180910390a15050565b610695610ddd565b61069f8282610e42565b5050565b6060600580546106b290611fff565b80601f01602080910402602001604051908101604052809291908181526020018280546106de90611fff565b80156107295780601f1061070057610100808354040283529160200191610729565b820191905f5260205f20905b81548152906001019060200180831161070c57829003601f168201915b50505050509050919050565b61073d610ddd565b6006805461ff001981166101009182900460ff1615909102179055565b600260065460ff16600381111561077357610773611b26565b146107915760405163275b660b60e01b815260040160405180910390fd5b610799610f3f565b565b5f8281526002602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b031692820192909252829161080f5750604080518082019091526001546001600160a01b0381168252600160a01b90046001600160601b031660208201525b60208101515f906127109061082d906001600160601b03168761204b565b6108379190612062565b915196919550909350505050565b600654610100900460ff1661086d57604051636081e02960e11b815260040160405180910390fd5b846001600160a01b03811633146108875761088733610ff3565b61089486868686866110aa565b505050505050565b600160065460ff1660038111156108b5576108b5611b26565b146108d357604051630df8186760e11b815260040160405180910390fd5b6109478282808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250506007546040516bffffffffffffffffffffffff193360601b1660208201529092506034019050604051602081830303815290604052805190602001206110f6565b6109645760405163669f48ef60e11b815260040160405180910390fd5b61069f610f3f565b606081518351146109d15760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016105cd565b5f835167ffffffffffffffff8111156109ec576109ec611b80565b604051908082528060200260200182016040528015610a15578160200160208202803683370190505b5090505f5b8451811015610a8c57610a5f858281518110610a3857610a38612081565b6020026020010151858381518110610a5257610a52612081565b6020026020010151610567565b828281518110610a7157610a71612081565b6020908102919091010152610a8581612095565b9050610a1a565b509392505050565b610a9c610ddd565b6107995f61110b565b610aad610ddd565b475f819003610acf5760405163334ab3f560e11b815260040160405180910390fd5b6040515f90339083908381818185875af1925050503d805f8114610b0e576040519150601f19603f3d011682016040523d82523d5f602084013e610b13565b606091505b5050905080610b35576040516312171d8360e31b815260040160405180910390fd5b60408051338152602081018490527f06097061aeda806b5e9cb4133d9899f332ff0913956567fc0f7ea15e3d19947c9101610681565b610b73610ddd565b8060075403610b9557604051631c71591d60e11b815260040160405180910390fd5b60078190556040518181527f1b930366dfeaa7eb3b325021e4ae81e36527063452ee55b86c95f85b36f4c31c906020015b60405180910390a150565b81610bdb81610ff3565b610be5838361115a565b505050565b610bf2610ddd565b6107995f600155565b610c03610ddd565b806003811115610c1557610c15611b26565b60065460ff166003811115610c2c57610c2c611b26565b03610c4a57604051631c71591d60e11b815260040160405180910390fd5b6001816003811115610c5e57610c5e611b26565b03610c8357600754610c8357604051634fc5147960e11b815260040160405180910390fd5b6006805482919060ff19166001836003811115610ca257610ca2611b26565b02179055507f2757d185fc153b2591e9d55b19b9e625d6c548ff923105c32ac05fd515ffaa1381604051610bc69190611b3a565b600654610100900460ff16610cfe57604051636081e02960e11b815260040160405180910390fd5b846001600160a01b0381163314610d1857610d1833610ff3565b6108948686868686611165565b610d2d610ddd565b6001600160a01b038116610d925760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105cd565b610d9b8161110b565b50565b5f6001600160e01b03198216636cdb3d1360e11b1480610dce57506001600160e01b031982166303a24d0760e21b145b806105fa57506105fa826111aa565b5f546001600160a01b031633146107995760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105cd565b600561069f82826120f2565b6127106001600160601b0382161115610eb05760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084016105cd565b6001600160a01b038216610f065760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c69642072656365697665720000000000000060448201526064016105cd565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600155565b61014d6008546001610f5191906121ae565b1115610f7057604051631c09518160e31b815260040160405180910390fd5b67016345785d8a00003414610f98576040516354dc82ef60e01b815260040160405180910390fd5b610fa3336001610567565b600103610fc357604051631bbdf5c560e31b815260040160405180910390fd5b60085f8154610fd190612095565b919050819055506107993360018060405180602001604052805f8152506111de565b6daaeb6d7670e522a718067333cd4e3b15610d9b57604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa15801561105e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061108291906121c1565b610d9b57604051633b79c77360e21b81526001600160a01b03821660048201526024016105cd565b6001600160a01b0385163314806110c657506110c685336104fc565b6110e25760405162461bcd60e51b81526004016105cd906121dc565b6110ef85858585856112ef565b5050505050565b5f8261110285846114c2565b14949350505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61069f338383611506565b6001600160a01b038516331480611181575061118185336104fc565b61119d5760405162461bcd60e51b81526004016105cd906121dc565b6110ef85858585856115e5565b5f6001600160e01b0319821663152a902d60e11b14806105fa57506301ffc9a760e01b6001600160e01b03198316146105fa565b6001600160a01b03841661123e5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016105cd565b335f6112498561170f565b90505f6112558561170f565b90505f8681526003602090815260408083206001600160a01b038b168452909152812080548792906112889084906121ae565b909155505060408051878152602081018790526001600160a01b03808a16925f92918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46112e6835f89898989611758565b50505050505050565b81518351146113515760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b60648201526084016105cd565b6001600160a01b0384166113775760405162461bcd60e51b81526004016105cd9061222a565b335f5b845181101561145c575f85828151811061139657611396612081565b602002602001015190505f8583815181106113b3576113b3612081565b6020908102919091018101515f8481526003835260408082206001600160a01b038e1683529093529190912054909150818110156114035760405162461bcd60e51b81526004016105cd9061226f565b5f8381526003602090815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906114419084906121ae565b925050819055505050508061145590612095565b905061137a565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516114ac9291906122b9565b60405180910390a46108948187878787876118b2565b5f81815b8451811015610a8c576114f2828683815181106114e5576114e5612081565b602002602001015161196c565b9150806114fe81612095565b9150506114c6565b816001600160a01b0316836001600160a01b0316036115795760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016105cd565b6001600160a01b038381165f81815260046020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b03841661160b5760405162461bcd60e51b81526004016105cd9061222a565b335f6116168561170f565b90505f6116228561170f565b90505f8681526003602090815260408083206001600160a01b038c168452909152902054858110156116665760405162461bcd60e51b81526004016105cd9061226f565b5f8781526003602090815260408083206001600160a01b038d8116855292528083208985039055908a168252812080548892906116a49084906121ae565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611704848a8a8a8a8a611758565b505050505050505050565b6040805160018082528183019092526060915f91906020808301908036833701905050905082815f8151811061174757611747612081565b602090810291909101015292915050565b6001600160a01b0384163b156108945760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061179c90899089908890889088906004016122e6565b6020604051808303815f875af19250505080156117d6575060408051601f3d908101601f191682019092526117d39181019061232a565b60015b611882576117e2612345565b806308c379a00361181b57506117f661235e565b80611801575061181d565b8060405162461bcd60e51b81526004016105cd9190611b14565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016105cd565b6001600160e01b0319811663f23a6e6160e01b146112e65760405162461bcd60e51b81526004016105cd906123e7565b6001600160a01b0384163b156108945760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906118f6908990899088908890889060040161242f565b6020604051808303815f875af1925050508015611930575060408051601f3d908101601f1916820190925261192d9181019061232a565b60015b61193c576117e2612345565b6001600160e01b0319811663bc197c8160e01b146112e65760405162461bcd60e51b81526004016105cd906123e7565b5f818310611986575f828152602084905260409020611994565b5f8381526020839052604090205b9392505050565b80356001600160a01b03811681146119b1575f80fd5b919050565b5f80604083850312156119c7575f80fd5b6119d08361199b565b946020939093013593505050565b6001600160e01b031981168114610d9b575f80fd5b5f60208284031215611a03575f80fd5b8135611994816119de565b5f8060208385031215611a1f575f80fd5b823567ffffffffffffffff80821115611a36575f80fd5b818501915085601f830112611a49575f80fd5b813581811115611a57575f80fd5b866020828501011115611a68575f80fd5b60209290920196919550909350505050565b5f8060408385031215611a8b575f80fd5b611a948361199b565b915060208301356001600160601b0381168114611aaf575f80fd5b809150509250929050565b5f60208284031215611aca575f80fd5b5035919050565b5f81518084525f5b81811015611af557602081850181015186830182015201611ad9565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f6119946020830184611ad1565b634e487b7160e01b5f52602160045260245ffd5b6020810160048310611b5a57634e487b7160e01b5f52602160045260245ffd5b91905290565b5f8060408385031215611b71575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52604160045260245ffd5b601f8201601f1916810167ffffffffffffffff81118282101715611bba57611bba611b80565b6040525050565b5f67ffffffffffffffff821115611bda57611bda611b80565b5060051b60200190565b5f82601f830112611bf3575f80fd5b81356020611c0082611bc1565b604051611c0d8282611b94565b83815260059390931b8501820192828101915086841115611c2c575f80fd5b8286015b84811015611c475780358352918301918301611c30565b509695505050505050565b5f82601f830112611c61575f80fd5b813567ffffffffffffffff811115611c7b57611c7b611b80565b604051611c92601f8301601f191660200182611b94565b818152846020838601011115611ca6575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f60a08688031215611cd6575f80fd5b611cdf8661199b565b9450611ced6020870161199b565b9350604086013567ffffffffffffffff80821115611d09575f80fd5b611d1589838a01611be4565b94506060880135915080821115611d2a575f80fd5b611d3689838a01611be4565b93506080880135915080821115611d4b575f80fd5b50611d5888828901611c52565b9150509295509295909350565b5f8060208385031215611d76575f80fd5b823567ffffffffffffffff80821115611d8d575f80fd5b818501915085601f830112611da0575f80fd5b813581811115611dae575f80fd5b8660208260051b8501011115611a68575f80fd5b5f8060408385031215611dd3575f80fd5b823567ffffffffffffffff80821115611dea575f80fd5b818501915085601f830112611dfd575f80fd5b81356020611e0a82611bc1565b604051611e178282611b94565b83815260059390931b8501820192828101915089841115611e36575f80fd5b948201945b83861015611e5b57611e4c8661199b565b82529482019490820190611e3b565b96505086013592505080821115611e70575f80fd5b50611e7d85828601611be4565b9150509250929050565b5f8151808452602080850194508084015f5b83811015611eb557815187529582019590820190600101611e99565b509495945050505050565b602081525f6119946020830184611e87565b8015158114610d9b575f80fd5b5f8060408385031215611ef0575f80fd5b611ef98361199b565b91506020830135611aaf81611ed2565b5f60208284031215611f19575f80fd5b813560048110611994575f80fd5b5f8060408385031215611f38575f80fd5b611f418361199b565b9150611f4f6020840161199b565b90509250929050565b5f805f805f60a08688031215611f6c575f80fd5b611f758661199b565b9450611f836020870161199b565b93506040860135925060608601359150608086013567ffffffffffffffff811115611fac575f80fd5b611d5888828901611c52565b5f60208284031215611fc8575f80fd5b6119948261199b565b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b600181811c9082168061201357607f821691505b60208210810361203157634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176105fa576105fa612037565b5f8261207c57634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52603260045260245ffd5b5f600182016120a6576120a6612037565b5060010190565b601f821115610be5575f81815260208120601f850160051c810160208610156120d35750805b601f850160051c820191505b81811015610894578281556001016120df565b815167ffffffffffffffff81111561210c5761210c611b80565b6121208161211a8454611fff565b846120ad565b602080601f831160018114612153575f841561213c5750858301515b5f19600386901b1c1916600185901b178555610894565b5f85815260208120601f198616915b8281101561218157888601518255948401946001909101908401612162565b508582101561219e57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156105fa576105fa612037565b5f602082840312156121d1575f80fd5b815161199481611ed2565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b604081525f6122cb6040830185611e87565b82810360208401526122dd8185611e87565b95945050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190525f9061231f90830184611ad1565b979650505050505050565b5f6020828403121561233a575f80fd5b8151611994816119de565b5f60033d111561235b5760045f803e505f5160e01c5b90565b5f60443d101561236b5790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561239b57505050505090565b82850191508151818111156123b35750505050505090565b843d87010160208285010111156123cd5750505050505090565b6123dc60208286010187611b94565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a0604082018190525f9061245a90830186611e87565b828103606084015261246c8186611e87565b905082810360808401526124808185611ad1565b9897505050505050505056fea264697066735822122095dce71ab206fa617187748c879b9c1a22eabb87fd8b33ebe907766815f4e14c64736f6c63430008140033000000000000000000000000fbab009a69608c5dcd1c3dee386175ed1900f05400000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d58517674685876446456454c41514a6659746f3165415150375a6537475735326e4b74564a7747634144584a2f00000000000000000000
Deployed Bytecode
0x6080604052600436106101b9575f3560e01c806341f43434116100f25780638da5cb5b11610092578063c20828a611610062578063c20828a6146104c3578063e985e9c5146104e2578063f242432a14610529578063f2fde38b14610548575f80fd5b80638da5cb5b14610456578063a22cb46514610472578063a48179ff14610491578063aa1b103f146104af575f80fd5b80637362377b116100cd5780637362377b146103f45780637cb647591461040857806389a89002146104275780638d859f3e1461043b575f80fd5b806341f434341461037b5780634e1273f4146103b4578063715018a6146103e0575f80fd5b806320b6a50f1161015d5780632eb2c2d6116101385780632eb2c2d61461031f5780632eb4a7ab1461033e57806332cb6b0c14610353578063372f657c14610368575f80fd5b806320b6a50f146102c557806326092b83146102d95780632a55205a146102e1575f80fd5b806304634d8d1161019857806304634d8d1461023f5780630e89341c1461025e57806317881cbf1461028a57806318160ddd146102b0575f80fd5b8062fdd58e146101bd57806301ffc9a7146101ef57806302fe53051461021e575b5f80fd5b3480156101c8575f80fd5b506101dc6101d73660046119b6565b610567565b6040519081526020015b60405180910390f35b3480156101fa575f80fd5b5061020e6102093660046119f3565b610600565b60405190151581526020016101e6565b348015610229575f80fd5b5061023d610238366004611a0e565b61060a565b005b34801561024a575f80fd5b5061023d610259366004611a7a565b61068d565b348015610269575f80fd5b5061027d610278366004611aba565b6106a3565b6040516101e69190611b14565b348015610295575f80fd5b506006546102a39060ff1681565b6040516101e69190611b3a565b3480156102bb575f80fd5b506101dc60085481565b3480156102d0575f80fd5b5061023d610735565b61023d61075a565b3480156102ec575f80fd5b506103006102fb366004611b60565b61079b565b604080516001600160a01b0390931683526020830191909152016101e6565b34801561032a575f80fd5b5061023d610339366004611cc2565b610845565b348015610349575f80fd5b506101dc60075481565b34801561035e575f80fd5b506101dc61014d81565b61023d610376366004611d65565b61089c565b348015610386575f80fd5b5061039c6daaeb6d7670e522a718067333cd4e81565b6040516001600160a01b0390911681526020016101e6565b3480156103bf575f80fd5b506103d36103ce366004611dc2565b61096c565b6040516101e69190611ec0565b3480156103eb575f80fd5b5061023d610a94565b3480156103ff575f80fd5b5061023d610aa5565b348015610413575f80fd5b5061023d610422366004611aba565b610b6b565b348015610432575f80fd5b506101dc600181565b348015610446575f80fd5b506101dc67016345785d8a000081565b348015610461575f80fd5b505f546001600160a01b031661039c565b34801561047d575f80fd5b5061023d61048c366004611edf565b610bd1565b34801561049c575f80fd5b5060065461020e90610100900460ff1681565b3480156104ba575f80fd5b5061023d610bea565b3480156104ce575f80fd5b5061023d6104dd366004611f09565b610bfb565b3480156104ed575f80fd5b5061020e6104fc366004611f27565b6001600160a01b039182165f90815260046020908152604080832093909416825291909152205460ff1690565b348015610534575f80fd5b5061023d610543366004611f58565b610cd6565b348015610553575f80fd5b5061023d610562366004611fb8565b610d25565b5f6001600160a01b0383166105d65760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b505f8181526003602090815260408083206001600160a01b03861684529091529020545b92915050565b5f6105fa82610d9e565b610612610ddd565b61065082828080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610e3692505050565b7fbd06d92759c326896ec0f7c3a981e801ae4644e020f89b2a198909b692df0ddd8282604051610681929190611fd1565b60405180910390a15050565b610695610ddd565b61069f8282610e42565b5050565b6060600580546106b290611fff565b80601f01602080910402602001604051908101604052809291908181526020018280546106de90611fff565b80156107295780601f1061070057610100808354040283529160200191610729565b820191905f5260205f20905b81548152906001019060200180831161070c57829003601f168201915b50505050509050919050565b61073d610ddd565b6006805461ff001981166101009182900460ff1615909102179055565b600260065460ff16600381111561077357610773611b26565b146107915760405163275b660b60e01b815260040160405180910390fd5b610799610f3f565b565b5f8281526002602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b031692820192909252829161080f5750604080518082019091526001546001600160a01b0381168252600160a01b90046001600160601b031660208201525b60208101515f906127109061082d906001600160601b03168761204b565b6108379190612062565b915196919550909350505050565b600654610100900460ff1661086d57604051636081e02960e11b815260040160405180910390fd5b846001600160a01b03811633146108875761088733610ff3565b61089486868686866110aa565b505050505050565b600160065460ff1660038111156108b5576108b5611b26565b146108d357604051630df8186760e11b815260040160405180910390fd5b6109478282808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250506007546040516bffffffffffffffffffffffff193360601b1660208201529092506034019050604051602081830303815290604052805190602001206110f6565b6109645760405163669f48ef60e11b815260040160405180910390fd5b61069f610f3f565b606081518351146109d15760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016105cd565b5f835167ffffffffffffffff8111156109ec576109ec611b80565b604051908082528060200260200182016040528015610a15578160200160208202803683370190505b5090505f5b8451811015610a8c57610a5f858281518110610a3857610a38612081565b6020026020010151858381518110610a5257610a52612081565b6020026020010151610567565b828281518110610a7157610a71612081565b6020908102919091010152610a8581612095565b9050610a1a565b509392505050565b610a9c610ddd565b6107995f61110b565b610aad610ddd565b475f819003610acf5760405163334ab3f560e11b815260040160405180910390fd5b6040515f90339083908381818185875af1925050503d805f8114610b0e576040519150601f19603f3d011682016040523d82523d5f602084013e610b13565b606091505b5050905080610b35576040516312171d8360e31b815260040160405180910390fd5b60408051338152602081018490527f06097061aeda806b5e9cb4133d9899f332ff0913956567fc0f7ea15e3d19947c9101610681565b610b73610ddd565b8060075403610b9557604051631c71591d60e11b815260040160405180910390fd5b60078190556040518181527f1b930366dfeaa7eb3b325021e4ae81e36527063452ee55b86c95f85b36f4c31c906020015b60405180910390a150565b81610bdb81610ff3565b610be5838361115a565b505050565b610bf2610ddd565b6107995f600155565b610c03610ddd565b806003811115610c1557610c15611b26565b60065460ff166003811115610c2c57610c2c611b26565b03610c4a57604051631c71591d60e11b815260040160405180910390fd5b6001816003811115610c5e57610c5e611b26565b03610c8357600754610c8357604051634fc5147960e11b815260040160405180910390fd5b6006805482919060ff19166001836003811115610ca257610ca2611b26565b02179055507f2757d185fc153b2591e9d55b19b9e625d6c548ff923105c32ac05fd515ffaa1381604051610bc69190611b3a565b600654610100900460ff16610cfe57604051636081e02960e11b815260040160405180910390fd5b846001600160a01b0381163314610d1857610d1833610ff3565b6108948686868686611165565b610d2d610ddd565b6001600160a01b038116610d925760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105cd565b610d9b8161110b565b50565b5f6001600160e01b03198216636cdb3d1360e11b1480610dce57506001600160e01b031982166303a24d0760e21b145b806105fa57506105fa826111aa565b5f546001600160a01b031633146107995760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105cd565b600561069f82826120f2565b6127106001600160601b0382161115610eb05760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084016105cd565b6001600160a01b038216610f065760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c69642072656365697665720000000000000060448201526064016105cd565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600155565b61014d6008546001610f5191906121ae565b1115610f7057604051631c09518160e31b815260040160405180910390fd5b67016345785d8a00003414610f98576040516354dc82ef60e01b815260040160405180910390fd5b610fa3336001610567565b600103610fc357604051631bbdf5c560e31b815260040160405180910390fd5b60085f8154610fd190612095565b919050819055506107993360018060405180602001604052805f8152506111de565b6daaeb6d7670e522a718067333cd4e3b15610d9b57604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa15801561105e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061108291906121c1565b610d9b57604051633b79c77360e21b81526001600160a01b03821660048201526024016105cd565b6001600160a01b0385163314806110c657506110c685336104fc565b6110e25760405162461bcd60e51b81526004016105cd906121dc565b6110ef85858585856112ef565b5050505050565b5f8261110285846114c2565b14949350505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61069f338383611506565b6001600160a01b038516331480611181575061118185336104fc565b61119d5760405162461bcd60e51b81526004016105cd906121dc565b6110ef85858585856115e5565b5f6001600160e01b0319821663152a902d60e11b14806105fa57506301ffc9a760e01b6001600160e01b03198316146105fa565b6001600160a01b03841661123e5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016105cd565b335f6112498561170f565b90505f6112558561170f565b90505f8681526003602090815260408083206001600160a01b038b168452909152812080548792906112889084906121ae565b909155505060408051878152602081018790526001600160a01b03808a16925f92918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46112e6835f89898989611758565b50505050505050565b81518351146113515760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b60648201526084016105cd565b6001600160a01b0384166113775760405162461bcd60e51b81526004016105cd9061222a565b335f5b845181101561145c575f85828151811061139657611396612081565b602002602001015190505f8583815181106113b3576113b3612081565b6020908102919091018101515f8481526003835260408082206001600160a01b038e1683529093529190912054909150818110156114035760405162461bcd60e51b81526004016105cd9061226f565b5f8381526003602090815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906114419084906121ae565b925050819055505050508061145590612095565b905061137a565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516114ac9291906122b9565b60405180910390a46108948187878787876118b2565b5f81815b8451811015610a8c576114f2828683815181106114e5576114e5612081565b602002602001015161196c565b9150806114fe81612095565b9150506114c6565b816001600160a01b0316836001600160a01b0316036115795760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016105cd565b6001600160a01b038381165f81815260046020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b03841661160b5760405162461bcd60e51b81526004016105cd9061222a565b335f6116168561170f565b90505f6116228561170f565b90505f8681526003602090815260408083206001600160a01b038c168452909152902054858110156116665760405162461bcd60e51b81526004016105cd9061226f565b5f8781526003602090815260408083206001600160a01b038d8116855292528083208985039055908a168252812080548892906116a49084906121ae565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611704848a8a8a8a8a611758565b505050505050505050565b6040805160018082528183019092526060915f91906020808301908036833701905050905082815f8151811061174757611747612081565b602090810291909101015292915050565b6001600160a01b0384163b156108945760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061179c90899089908890889088906004016122e6565b6020604051808303815f875af19250505080156117d6575060408051601f3d908101601f191682019092526117d39181019061232a565b60015b611882576117e2612345565b806308c379a00361181b57506117f661235e565b80611801575061181d565b8060405162461bcd60e51b81526004016105cd9190611b14565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016105cd565b6001600160e01b0319811663f23a6e6160e01b146112e65760405162461bcd60e51b81526004016105cd906123e7565b6001600160a01b0384163b156108945760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906118f6908990899088908890889060040161242f565b6020604051808303815f875af1925050508015611930575060408051601f3d908101601f1916820190925261192d9181019061232a565b60015b61193c576117e2612345565b6001600160e01b0319811663bc197c8160e01b146112e65760405162461bcd60e51b81526004016105cd906123e7565b5f818310611986575f828152602084905260409020611994565b5f8381526020839052604090205b9392505050565b80356001600160a01b03811681146119b1575f80fd5b919050565b5f80604083850312156119c7575f80fd5b6119d08361199b565b946020939093013593505050565b6001600160e01b031981168114610d9b575f80fd5b5f60208284031215611a03575f80fd5b8135611994816119de565b5f8060208385031215611a1f575f80fd5b823567ffffffffffffffff80821115611a36575f80fd5b818501915085601f830112611a49575f80fd5b813581811115611a57575f80fd5b866020828501011115611a68575f80fd5b60209290920196919550909350505050565b5f8060408385031215611a8b575f80fd5b611a948361199b565b915060208301356001600160601b0381168114611aaf575f80fd5b809150509250929050565b5f60208284031215611aca575f80fd5b5035919050565b5f81518084525f5b81811015611af557602081850181015186830182015201611ad9565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f6119946020830184611ad1565b634e487b7160e01b5f52602160045260245ffd5b6020810160048310611b5a57634e487b7160e01b5f52602160045260245ffd5b91905290565b5f8060408385031215611b71575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52604160045260245ffd5b601f8201601f1916810167ffffffffffffffff81118282101715611bba57611bba611b80565b6040525050565b5f67ffffffffffffffff821115611bda57611bda611b80565b5060051b60200190565b5f82601f830112611bf3575f80fd5b81356020611c0082611bc1565b604051611c0d8282611b94565b83815260059390931b8501820192828101915086841115611c2c575f80fd5b8286015b84811015611c475780358352918301918301611c30565b509695505050505050565b5f82601f830112611c61575f80fd5b813567ffffffffffffffff811115611c7b57611c7b611b80565b604051611c92601f8301601f191660200182611b94565b818152846020838601011115611ca6575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f60a08688031215611cd6575f80fd5b611cdf8661199b565b9450611ced6020870161199b565b9350604086013567ffffffffffffffff80821115611d09575f80fd5b611d1589838a01611be4565b94506060880135915080821115611d2a575f80fd5b611d3689838a01611be4565b93506080880135915080821115611d4b575f80fd5b50611d5888828901611c52565b9150509295509295909350565b5f8060208385031215611d76575f80fd5b823567ffffffffffffffff80821115611d8d575f80fd5b818501915085601f830112611da0575f80fd5b813581811115611dae575f80fd5b8660208260051b8501011115611a68575f80fd5b5f8060408385031215611dd3575f80fd5b823567ffffffffffffffff80821115611dea575f80fd5b818501915085601f830112611dfd575f80fd5b81356020611e0a82611bc1565b604051611e178282611b94565b83815260059390931b8501820192828101915089841115611e36575f80fd5b948201945b83861015611e5b57611e4c8661199b565b82529482019490820190611e3b565b96505086013592505080821115611e70575f80fd5b50611e7d85828601611be4565b9150509250929050565b5f8151808452602080850194508084015f5b83811015611eb557815187529582019590820190600101611e99565b509495945050505050565b602081525f6119946020830184611e87565b8015158114610d9b575f80fd5b5f8060408385031215611ef0575f80fd5b611ef98361199b565b91506020830135611aaf81611ed2565b5f60208284031215611f19575f80fd5b813560048110611994575f80fd5b5f8060408385031215611f38575f80fd5b611f418361199b565b9150611f4f6020840161199b565b90509250929050565b5f805f805f60a08688031215611f6c575f80fd5b611f758661199b565b9450611f836020870161199b565b93506040860135925060608601359150608086013567ffffffffffffffff811115611fac575f80fd5b611d5888828901611c52565b5f60208284031215611fc8575f80fd5b6119948261199b565b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b600181811c9082168061201357607f821691505b60208210810361203157634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176105fa576105fa612037565b5f8261207c57634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52603260045260245ffd5b5f600182016120a6576120a6612037565b5060010190565b601f821115610be5575f81815260208120601f850160051c810160208610156120d35750805b601f850160051c820191505b81811015610894578281556001016120df565b815167ffffffffffffffff81111561210c5761210c611b80565b6121208161211a8454611fff565b846120ad565b602080601f831160018114612153575f841561213c5750858301515b5f19600386901b1c1916600185901b178555610894565b5f85815260208120601f198616915b8281101561218157888601518255948401946001909101908401612162565b508582101561219e57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156105fa576105fa612037565b5f602082840312156121d1575f80fd5b815161199481611ed2565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b604081525f6122cb6040830185611e87565b82810360208401526122dd8185611e87565b95945050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190525f9061231f90830184611ad1565b979650505050505050565b5f6020828403121561233a575f80fd5b8151611994816119de565b5f60033d111561235b5760045f803e505f5160e01c5b90565b5f60443d101561236b5790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561239b57505050505090565b82850191508151818111156123b35750505050505090565b843d87010160208285010111156123cd5750505050505090565b6123dc60208286010187611b94565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a0604082018190525f9061245a90830186611e87565b828103606084015261246c8186611e87565b905082810360808401526124808185611ad1565b9897505050505050505056fea264697066735822122095dce71ab206fa617187748c879b9c1a22eabb87fd8b33ebe907766815f4e14c64736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000fbab009a69608c5dcd1c3dee386175ed1900f05400000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d58517674685876446456454c41514a6659746f3165415150375a6537475735326e4b74564a7747634144584a2f00000000000000000000
-----Decoded View---------------
Arg [0] : _royaltyReceiverAddress (address): 0xfbAB009a69608c5dCd1C3DEe386175eD1900F054
Arg [1] : _royaltyPercentage (uint96): 1000
Arg [2] : _tokenURI (string): ipfs://QmXQvthXvDdVELAQJfYto1eAQP7Ze7GW52nKtVJwGcADXJ/
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000fbab009a69608c5dcd1c3dee386175ed1900f054
Arg [1] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [4] : 697066733a2f2f516d58517674685876446456454c41514a6659746f31654151
Arg [5] : 50375a6537475735326e4b74564a7747634144584a2f00000000000000000000
Deployed Bytecode Sourcemap
69253:11608:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47504:292;;;;;;;;;;-1:-1:-1;47504:292:0;;;;;:::i;:::-;;:::i;:::-;;;597:25:1;;;585:2;570:18;47504:292:0;;;;;;;;80671:187;;;;;;;;;;-1:-1:-1;80671:187:0;;;;;:::i;:::-;;:::i;:::-;;;1184:14:1;;1177:22;1159:41;;1147:2;1132:18;80671:187:0;1019::1;77276:168:0;;;;;;;;;;-1:-1:-1;77276:168:0;;;;;:::i;:::-;;:::i;:::-;;80051:171;;;;;;;;;;-1:-1:-1;80051:171:0;;;;;:::i;:::-;;:::i;47248:105::-;;;;;;;;;;-1:-1:-1;47248:105:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;70185:26::-;;;;;;;;;;-1:-1:-1;70185:26:0;;;;;;;;;;;;;;;:::i;70487:::-;;;;;;;;;;;;;;;;77593:103;;;;;;;;;;;;;:::i;74194:299::-;;;:::i;66427:476::-;;;;;;;;;;-1:-1:-1;66427:476:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3941:32:1;;;3923:51;;4005:2;3990:18;;3983:34;;;;3896:18;66427:476:0;3749:274:1;79258:315:0;;;;;;;;;;-1:-1:-1;79258:315:0;;;;;:::i;:::-;;:::i;70384:25::-;;;;;;;;;;;;;;;;69619:40;;;;;;;;;;;;69656:3;69619:40;;73346:650;;;;;;:::i;:::-;;:::i;8031:143::-;;;;;;;;;;;;6899:42;8031:143;;;;;-1:-1:-1;;;;;7836:32:1;;;7818:51;;7806:2;7791:18;8031:143:0;7641:234:1;47962:536:0;;;;;;;;;;-1:-1:-1;47962:536:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;24500:103::-;;;;;;;;;;;;;:::i;77909:652::-;;;;;;;;;;;;;:::i;76642:453::-;;;;;;;;;;-1:-1:-1;76642:453:0;;;;;:::i;:::-;;:::i;69710:36::-;;;;;;;;;;;;69745:1;69710:36;;69848:41;;;;;;;;;;;;69880:9;69848:41;;23859:87;;;;;;;;;;-1:-1:-1;23905:7:0;23932:6;-1:-1:-1;;;;;23932:6:0;23859:87;;78758:201;;;;;;;;;;-1:-1:-1;78758:201:0;;;;;:::i;:::-;;:::i;70292:28::-;;;;;;;;;;-1:-1:-1;70292:28:0;;;;;;;;;;;80383:93;;;;;;;;;;;;;:::i;75703:730::-;;;;;;;;;;-1:-1:-1;75703:730:0;;;;;:::i;:::-;;:::i;48823:193::-;;;;;;;;;;-1:-1:-1;48823:193:0;;;;;:::i;:::-;-1:-1:-1;;;;;48971:27:0;;;48947:4;48971:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;48823:193;78967:283;;;;;;;;;;-1:-1:-1;78967:283:0;;;;;:::i;:::-;;:::i;24758:238::-;;;;;;;;;;-1:-1:-1;24758:238:0;;;;;:::i;:::-;;:::i;47504:292::-;47615:7;-1:-1:-1;;;;;47657:21:0;;47635:113;;;;-1:-1:-1;;;47635:113:0;;12179:2:1;47635:113:0;;;12161:21:1;12218:2;12198:18;;;12191:30;12257:34;12237:18;;;12230:62;-1:-1:-1;;;12308:18:1;;;12301:40;12358:19;;47635:113:0;;;;;;;;;-1:-1:-1;47766:13:0;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;47766:22:0;;;;;;;;;;47504:292;;;;;:::o;80671:187::-;80790:4;80814:36;80838:11;80814:23;:36::i;77276:168::-;23745:13;:11;:13::i;:::-;77383:16:::1;77391:7;;77383:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;77383:7:0::1;::::0;-1:-1:-1;;;77383:16:0:i:1;:::-;77417:19;77428:7;;77417:19;;;;;;;:::i;:::-;;;;;;;;77276:168:::0;;:::o;80051:171::-;23745:13;:11;:13::i;:::-;80172:42:::1;80191:8;80201:12;80172:18;:42::i;:::-;80051:171:::0;;:::o;47248:105::-;47308:13;47341:4;47334:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47248:105;;;:::o;77593:103::-;23745:13;:11;:13::i;:::-;77672:16:::1;::::0;;-1:-1:-1;;77652:36:0;::::1;77672:16;::::0;;;::::1;;;77671:17;77652:36:::0;;::::1;;::::0;;77593:103::o;74194:299::-;74309:22;74296:9;;;;:35;;;;;;;;:::i;:::-;;74292:91;;74355:16;;-1:-1:-1;;;74355:16:0;;;;;;;;;;;74292:91;74464:21;:19;:21::i;:::-;74194:299::o;66427:476::-;66547:7;66605:26;;;:17;:26;;;;;;;;66576:55;;;;;;;;;-1:-1:-1;;;;;66576:55:0;;;;;-1:-1:-1;;;66576:55:0;;;-1:-1:-1;;;;;66576:55:0;;;;;;;;66547:7;;66644:92;;-1:-1:-1;66695:29:0;;;;;;;;;66705:19;66695:29;-1:-1:-1;;;;;66695:29:0;;;;-1:-1:-1;;;66695:29:0;;-1:-1:-1;;;;;66695:29:0;;;;;66644:92;66785:23;;;;66748:21;;67269:5;;66773:35;;-1:-1:-1;;;;;66773:35:0;:9;:35;:::i;:::-;66772:70;;;;:::i;:::-;66863:16;;;;;-1:-1:-1;66427:476:0;;-1:-1:-1;;;;66427:476:0:o;79258:315::-;71776:16;;;;;;;71771:78;;71816:21;;-1:-1:-1;;;71816:21:0;;;;;;;;;;;71771:78;79491:4;-1:-1:-1;;;;;9673:18:0;::::1;9681:10;9673:18;9669:83;;9708:32;9729:10;9708:20;:32::i;:::-;79508:57:::2;79536:4;79542:2;79546:3;79551:7;79560:4;79508:27;:57::i;:::-;71859:1:::1;79258:315:::0;;;;;:::o;73346:650::-;73498:25;73485:9;;;;:38;;;;;;;;:::i;:::-;;73481:97;;73547:19;;-1:-1:-1;;;73547:19:0;;;;;;;;;;;73481:97;73660:151;73697:12;;73660:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;73728:10:0;;73767:28;;-1:-1:-1;;73784:10:0;13844:2:1;13840:15;13836:53;73767:28:0;;;13824:66:1;73728:10:0;;-1:-1:-1;13906:12:1;;;-1:-1:-1;73767:28:0;;;;;;;;;;;;73757:39;;;;;;73660:18;:151::i;:::-;73641:245;;73845:29;;-1:-1:-1;;;73845:29:0;;;;;;;;;;;73641:245;73967:21;:19;:21::i;47962:536::-;48098:16;48168:3;:10;48149:8;:15;:29;48127:120;;;;-1:-1:-1;;;48127:120:0;;14131:2:1;48127:120:0;;;14113:21:1;14170:2;14150:18;;;14143:30;14209:34;14189:18;;;14182:62;-1:-1:-1;;;14260:18:1;;;14253:39;14309:19;;48127:120:0;13929:405:1;48127:120:0;48260:30;48307:8;:15;48293:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48293:30:0;;48260:63;;48341:9;48336:122;48360:8;:15;48356:1;:19;48336:122;;;48416:30;48426:8;48435:1;48426:11;;;;;;;;:::i;:::-;;;;;;;48439:3;48443:1;48439:6;;;;;;;;:::i;:::-;;;;;;;48416:9;:30::i;:::-;48397:13;48411:1;48397:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;48377:3;;;:::i;:::-;;;48336:122;;;-1:-1:-1;48477:13:0;47962:536;-1:-1:-1;;;47962:536:0:o;24500:103::-;23745:13;:11;:13::i;:::-;24565:30:::1;24592:1;24565:18;:30::i;77909:652::-:0;23745:13;:11;:13::i;:::-;78044:21:::1;78018:23;78136:20:::0;;;78132:73:::1;;78180:13;;-1:-1:-1::0;;;78180:13:0::1;;;;;;;;;;;78132:73;78320:43;::::0;78302:12:::1;::::0;78320:10:::1;::::0;78343:15;;78302:12;78320:43;78302:12;78320:43;78343:15;78320:10;:43:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78301:62;;;78379:7;78374:64;;78410:16;;-1:-1:-1::0;;;78410:16:0::1;;;;;;;;;;;78374:64;78510:43;::::0;;78525:10:::1;3923:51:1::0;;4005:2;3990:18;;3983:34;;;78510:43:0::1;::::0;3896:18:1;78510:43:0::1;3749:274:1::0;76642:453:0;23745:13;:11;:13::i;:::-;76811:14:::1;76797:10;;:28:::0;76793:84:::1;;76849:16;;-1:-1:-1::0;;;76849:16:0::1;;;;;;;;;;;76793:84;76942:10;:27:::0;;;77054:33:::1;::::0;597:25:1;;;77054:33:0::1;::::0;585:2:1;570:18;77054:33:0::1;;;;;;;;76642:453:::0;:::o;78758:201::-;78887:8;9947:30;9968:8;9947:20;:30::i;:::-;78908:43:::1;78932:8;78942;78908:23;:43::i;:::-;78758:201:::0;;;:::o;80383:93::-;23745:13;:11;:13::i;:::-;80445:23:::1;68091:19:::0;;68084:26;68023:95;75703:730;23745:13;:11;:13::i;:::-;75876::::1;75863:26;;;;;;;;:::i;:::-;:9;::::0;::::1;;:26;::::0;::::1;;;;;;:::i;:::-;::::0;75859:82:::1;;75913:16;;-1:-1:-1::0;;;75913:16:0::1;;;;;;;;;;;75859:82;76076:25;76059:13;:42;;;;;;;;:::i;:::-;::::0;76055:164:::1;;76122:10;::::0;76118:90:::1;;76174:18;;-1:-1:-1::0;;;76174:18:0::1;;;;;;;;;;;76118:90;76286:9;:25:::0;;76298:13;;76286:9;-1:-1:-1;;76286:25:0::1;::::0;76298:13;76286:25:::1;::::0;::::1;;;;;;:::i;:::-;;;;;;76394:31;76411:13;76394:31;;;;;;:::i;78967:283::-:0;71776:16;;;;;;;71771:78;;71816:21;;-1:-1:-1;;;71816:21:0;;;;;;;;;;;71771:78;79175:4;-1:-1:-1;;;;;9673:18:0;::::1;9681:10;9673:18;9669:83;;9708:32;9729:10;9708:20;:32::i;:::-;79192:50:::2;79215:4;79221:2;79225;79229:6;79237:4;79192:22;:50::i;24758:238::-:0;23745:13;:11;:13::i;:::-;-1:-1:-1;;;;;24861:22:0;::::1;24839:110;;;::::0;-1:-1:-1;;;24839:110:0;;15023:2:1;24839:110:0::1;::::0;::::1;15005:21:1::0;15062:2;15042:18;;;15035:30;15101:34;15081:18;;;15074:62;-1:-1:-1;;;15152:18:1;;;15145:36;15198:19;;24839:110:0::1;14821:402:1::0;24839:110:0::1;24960:28;24979:8;24960:18;:28::i;:::-;24758:238:::0;:::o;46511:326::-;46629:4;-1:-1:-1;;;;;;46666:41:0;;-1:-1:-1;;;46666:41:0;;:110;;-1:-1:-1;;;;;;;46724:52:0;;-1:-1:-1;;;46724:52:0;46666:110;:163;;;;46793:36;46817:11;46793:23;:36::i;24024:132::-;23905:7;23932:6;-1:-1:-1;;;;;23932:6:0;22469:10;24088:23;24080:68;;;;-1:-1:-1;;;24080:68:0;;15430:2:1;24080:68:0;;;15412:21:1;;;15449:18;;;15442:30;15508:34;15488:18;;;15481:62;15560:18;;24080:68:0;15228:356:1;54007:88:0;54074:4;:13;54081:6;54074:4;:13;:::i;67553:394::-;67269:5;-1:-1:-1;;;;;67695:33:0;;;;67673:125;;;;-1:-1:-1;;;67673:125:0;;17995:2:1;67673:125:0;;;17977:21:1;18034:2;18014:18;;;18007:30;18073:34;18053:18;;;18046:62;-1:-1:-1;;;18124:18:1;;;18117:40;18174:19;;67673:125:0;17793:406:1;67673:125:0;-1:-1:-1;;;;;67817:22:0;;67809:60;;;;-1:-1:-1;;;67809:60:0;;18406:2:1;67809:60:0;;;18388:21:1;18445:2;18425:18;;;18418:30;18484:27;18464:18;;;18457:55;18529:18;;67809:60:0;18204:349:1;67809:60:0;67904:35;;;;;;;;;-1:-1:-1;;;;;67904:35:0;;;;;;-1:-1:-1;;;;;67904:35:0;;;;;;;;;;-1:-1:-1;;;67882:57:0;;;;:19;:57;67553:394::o;74578:713::-;69656:3;74697:11;;74711:1;74697:15;;;;:::i;:::-;:28;74693:74;;;74749:6;;-1:-1:-1;;;74749:6:0;;;;;;;;;;;74693:74;69880:9;74858;:18;74854:72;;74900:14;;-1:-1:-1;;;74900:14:0;;;;;;;;;;;74854:72;75010:31;75020:10;69745:1;75010:9;:31::i;:::-;75045:1;75010:36;75006:91;;75070:15;;-1:-1:-1;;;75070:15:0;;;;;;;;;;;75006:91;75154:11;;75152:13;;;;;:::i;:::-;;;;;;;;75249:34;75255:10;69745:1;75277;75249:34;;;;;;;;;;;;:5;:34::i;10090:740::-;6899:42;10281:45;:49;10277:546;;10598:128;;-1:-1:-1;;;10598:128:0;;10671:4;10598:128;;;18900:34:1;-1:-1:-1;;;;;18970:15:1;;18950:18;;;18943:43;6899:42:0;;10598;;18835:18:1;;10598:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10575:237;;10768:28;;-1:-1:-1;;;10768:28:0;;-1:-1:-1;;;;;7836:32:1;;10768:28:0;;;7818:51:1;7791:18;;10768:28:0;7641:234:1;49571:438:0;-1:-1:-1;;;;;49804:20:0;;22469:10;49804:20;;:60;;-1:-1:-1;49828:36:0;49845:4;22469:10;48823:193;:::i;49828:36::-;49782:156;;;;-1:-1:-1;;;49782:156:0;;;;;;;:::i;:::-;49949:52;49972:4;49978:2;49982:3;49987:7;49996:4;49949:22;:52::i;:::-;49571:438;;;;;:::o;12758:190::-;12883:4;12936;12907:25;12920:5;12927:4;12907:12;:25::i;:::-;:33;;12758:190;-1:-1:-1;;;;12758:190:0:o;25156:191::-;25230:16;25249:6;;-1:-1:-1;;;;;25266:17:0;;;-1:-1:-1;;;;;;25266:17:0;;;;;;25299:40;;25249:6;;;;;;;25299:40;;25230:16;25299:40;25219:128;25156:191;:::o;48571:180::-;48691:52;22469:10;48724:8;48734;48691:18;:52::i;49088:406::-;-1:-1:-1;;;;;49296:20:0;;22469:10;49296:20;;:60;;-1:-1:-1;49320:36:0;49337:4;22469:10;48823:193;:::i;49320:36::-;49274:156;;;;-1:-1:-1;;;49274:156:0;;;;;;;:::i;:::-;49441:45;49459:4;49465:2;49469;49473:6;49481:4;49441:17;:45::i;66115:257::-;66233:4;-1:-1:-1;;;;;;66270:41:0;;-1:-1:-1;;;66270:41:0;;:94;;-1:-1:-1;;;;;;;;;;37793:40:0;;;66328:36;37668:173;54481:818;-1:-1:-1;;;;;54634:16:0;;54626:62;;;;-1:-1:-1;;;54626:62:0;;19864:2:1;54626:62:0;;;19846:21:1;19903:2;19883:18;;;19876:30;19942:34;19922:18;;;19915:62;-1:-1:-1;;;19993:18:1;;;19986:31;20034:19;;54626:62:0;19662:397:1;54626:62:0;22469:10;54701:16;54766:21;54784:2;54766:17;:21::i;:::-;54743:44;;54798:24;54825:25;54843:6;54825:17;:25::i;:::-;54798:52;;54942:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;54942:17:0;;;;;;;;;:27;;54963:6;;54942:13;:27;;54963:6;;54942:27;:::i;:::-;;;;-1:-1:-1;;54985:52:0;;;20238:25:1;;;20294:2;20279:18;;20272:34;;;-1:-1:-1;;;;;54985:52:0;;;;55018:1;;54985:52;;;;;;20211:18:1;54985:52:0;;;;;;;55128:163;55173:8;55204:1;55221:2;55238;55255:6;55276:4;55128:30;:163::i;:::-;54615:684;;;54481:818;;;;:::o;51842:1321::-;52083:7;:14;52069:3;:10;:28;52047:118;;;;-1:-1:-1;;;52047:118:0;;20519:2:1;52047:118:0;;;20501:21:1;20558:2;20538:18;;;20531:30;20597:34;20577:18;;;20570:62;-1:-1:-1;;;20648:18:1;;;20641:38;20696:19;;52047:118:0;20317:404:1;52047:118:0;-1:-1:-1;;;;;52184:16:0;;52176:66;;;;-1:-1:-1;;;52176:66:0;;;;;;;:::i;:::-;22469:10;52255:16;52372:470;52396:3;:10;52392:1;:14;52372:470;;;52428:10;52441:3;52445:1;52441:6;;;;;;;;:::i;:::-;;;;;;;52428:19;;52462:14;52479:7;52487:1;52479:10;;;;;;;;:::i;:::-;;;;;;;;;;;;52506:19;52528:13;;;:9;:13;;;;;;-1:-1:-1;;;;;52528:19:0;;;;;;;;;;;;52479:10;;-1:-1:-1;52588:21:0;;;;52562:125;;;;-1:-1:-1;;;52562:125:0;;;;;;;:::i;:::-;52731:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;52731:19:0;;;;;;;;;;52753:20;;;52731:42;;52803:17;;;;;;;:27;;52753:20;;52731:13;52803:27;;52753:20;;52803:27;:::i;:::-;;;;;;;;52413:429;;;52408:3;;;;:::i;:::-;;;52372:470;;;;52889:2;-1:-1:-1;;;;;52859:47:0;52883:4;-1:-1:-1;;;;;52859:47:0;52873:8;-1:-1:-1;;;;;52859:47:0;;52893:3;52898:7;52859:47;;;;;;;:::i;:::-;;;;;;;;52991:164;53041:8;53064:4;53083:2;53100:3;53118:7;53140:4;52991:35;:164::i;13625:321::-;13733:7;13776:4;13733:7;13791:118;13815:5;:12;13811:1;:16;13791:118;;;13864:33;13874:12;13888:5;13894:1;13888:8;;;;;;;;:::i;:::-;;;;;;;13864:9;:33::i;:::-;13849:48;-1:-1:-1;13829:3:0;;;;:::i;:::-;;;;13791:118;;59161:331;59316:8;-1:-1:-1;;;;;59307:17:0;:5;-1:-1:-1;;;;;59307:17:0;;59299:71;;;;-1:-1:-1;;;59299:71:0;;22215:2:1;59299:71:0;;;22197:21:1;22254:2;22234:18;;;22227:30;22293:34;22273:18;;;22266:62;-1:-1:-1;;;22344:18:1;;;22337:39;22393:19;;59299:71:0;22013:405:1;59299:71:0;-1:-1:-1;;;;;59381:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;59381:46:0;;;;;;;;;;59443:41;;1159::1;;;59443::0;;1132:18:1;59443:41:0;;;;;;;59161:331;;;:::o;50473:1011::-;-1:-1:-1;;;;;50661:16:0;;50653:66;;;;-1:-1:-1;;;50653:66:0;;;;;;;:::i;:::-;22469:10;50732:16;50797:21;50815:2;50797:17;:21::i;:::-;50774:44;;50829:24;50856:25;50874:6;50856:17;:25::i;:::-;50829:52;;50967:19;50989:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;50989:19:0;;;;;;;;;;51041:21;;;;51019:113;;;;-1:-1:-1;;;51019:113:0;;;;;;;:::i;:::-;51168:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;51168:19:0;;;;;;;;;;51190:20;;;51168:42;;51232:17;;;;;;;:27;;51190:20;;51168:13;51232:27;;51190:20;;51232:27;:::i;:::-;;;;-1:-1:-1;;51277:46:0;;;20238:25:1;;;20294:2;20279:18;;20272:34;;;-1:-1:-1;;;;;51277:46:0;;;;;;;;;;;;;;20211:18:1;51277:46:0;;;;;;;51408:68;51439:8;51449:4;51455:2;51459;51463:6;51471:4;51408:30;:68::i;:::-;50642:842;;;;50473:1011;;;;;:::o;63743:214::-;63879:16;;;63893:1;63879:16;;;;;;;;;63825;;63854:22;;63879:16;;;;;;;;;;;;-1:-1:-1;63879:16:0;63854:41;;63917:7;63906:5;63912:1;63906:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;63944:5;63743:214;-1:-1:-1;;63743:214:0:o;61854:898::-;-1:-1:-1;;;;;62069:13:0;;27121:19;:23;62065:680;;62122:196;;-1:-1:-1;;;62122:196:0;;-1:-1:-1;;;;;62122:38:0;;;;;:196;;62183:8;;62214:4;;62241:2;;62266:6;;62295:4;;62122:196;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62122:196:0;;;;;;;;-1:-1:-1;;62122:196:0;;;;;;;;;;;;:::i;:::-;;;62101:633;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;62607:6;62600:14;;-1:-1:-1;;;62600:14:0;;;;;;;;:::i;62101:633::-;;;62656:62;;-1:-1:-1;;;62656:62:0;;24305:2:1;62656:62:0;;;24287:21:1;24344:2;24324:18;;;24317:30;24383:34;24363:18;;;24356:62;-1:-1:-1;;;24434:18:1;;;24427:50;24494:19;;62656:62:0;24103:416:1;62101:633:0;-1:-1:-1;;;;;;62381:55:0;;-1:-1:-1;;;62381:55:0;62377:154;;62461:50;;-1:-1:-1;;;62461:50:0;;;;;;;:::i;62760:975::-;-1:-1:-1;;;;;63000:13:0;;27121:19;:23;62996:732;;63053:203;;-1:-1:-1;;;63053:203:0;;-1:-1:-1;;;;;63053:43:0;;;;;:203;;63119:8;;63150:4;;63177:3;;63203:7;;63233:4;;63053:203;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63053:203:0;;;;;;;;-1:-1:-1;;63053:203:0;;;;;;;;;;;;:::i;:::-;;;63032:685;;;;:::i;:::-;-1:-1:-1;;;;;;63341:60:0;;-1:-1:-1;;;63341:60:0;63315:199;;63444:50;;-1:-1:-1;;;63444:50:0;;;;;;;:::i;21255:149::-;21318:7;21349:1;21345;:5;:51;;21505:13;21599:15;;;21635:4;21628:15;;;21682:4;21666:21;;21345:51;;;21505:13;21599:15;;;21635:4;21628:15;;;21682:4;21666:21;;21353:20;21338:58;21255:149;-1:-1:-1;;;21255:149:0:o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:254::-;260:6;268;321:2;309:9;300:7;296:23;292:32;289:52;;;337:1;334;327:12;289:52;360:29;379:9;360:29;:::i;:::-;350:39;436:2;421:18;;;;408:32;;-1:-1:-1;;;192:254:1:o;633:131::-;-1:-1:-1;;;;;;707:32:1;;697:43;;687:71;;754:1;751;744:12;769:245;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;935:9;922:23;954:30;978:5;954:30;:::i;1211:592::-;1282:6;1290;1343:2;1331:9;1322:7;1318:23;1314:32;1311:52;;;1359:1;1356;1349:12;1311:52;1399:9;1386:23;1428:18;1469:2;1461:6;1458:14;1455:34;;;1485:1;1482;1475:12;1455:34;1523:6;1512:9;1508:22;1498:32;;1568:7;1561:4;1557:2;1553:13;1549:27;1539:55;;1590:1;1587;1580:12;1539:55;1630:2;1617:16;1656:2;1648:6;1645:14;1642:34;;;1672:1;1669;1662:12;1642:34;1717:7;1712:2;1703:6;1699:2;1695:15;1691:24;1688:37;1685:57;;;1738:1;1735;1728:12;1685:57;1769:2;1761:11;;;;;1791:6;;-1:-1:-1;1211:592:1;;-1:-1:-1;;;;1211:592:1:o;1808:366::-;1875:6;1883;1936:2;1924:9;1915:7;1911:23;1907:32;1904:52;;;1952:1;1949;1942:12;1904:52;1975:29;1994:9;1975:29;:::i;:::-;1965:39;;2054:2;2043:9;2039:18;2026:32;-1:-1:-1;;;;;2091:5:1;2087:38;2080:5;2077:49;2067:77;;2140:1;2137;2130:12;2067:77;2163:5;2153:15;;;1808:366;;;;;:::o;2179:180::-;2238:6;2291:2;2279:9;2270:7;2266:23;2262:32;2259:52;;;2307:1;2304;2297:12;2259:52;-1:-1:-1;2330:23:1;;2179:180;-1:-1:-1;2179:180:1:o;2364:423::-;2406:3;2444:5;2438:12;2471:6;2466:3;2459:19;2496:1;2506:162;2520:6;2517:1;2514:13;2506:162;;;2582:4;2638:13;;;2634:22;;2628:29;2610:11;;;2606:20;;2599:59;2535:12;2506:162;;;2510:3;2713:1;2706:4;2697:6;2692:3;2688:16;2684:27;2677:38;2776:4;2769:2;2765:7;2760:2;2752:6;2748:15;2744:29;2739:3;2735:39;2731:50;2724:57;;;2364:423;;;;:::o;2792:220::-;2941:2;2930:9;2923:21;2904:4;2961:45;3002:2;2991:9;2987:18;2979:6;2961:45;:::i;3017:127::-;3078:10;3073:3;3069:20;3066:1;3059:31;3109:4;3106:1;3099:15;3133:4;3130:1;3123:15;3149:342;3295:2;3280:18;;3328:1;3317:13;;3307:144;;3373:10;3368:3;3364:20;3361:1;3354:31;3408:4;3405:1;3398:15;3436:4;3433:1;3426:15;3307:144;3460:25;;;3149:342;:::o;3496:248::-;3564:6;3572;3625:2;3613:9;3604:7;3600:23;3596:32;3593:52;;;3641:1;3638;3631:12;3593:52;-1:-1:-1;;3664:23:1;;;3734:2;3719:18;;;3706:32;;-1:-1:-1;3496:248:1:o;4028:127::-;4089:10;4084:3;4080:20;4077:1;4070:31;4120:4;4117:1;4110:15;4144:4;4141:1;4134:15;4160:249;4270:2;4251:13;;-1:-1:-1;;4247:27:1;4235:40;;4305:18;4290:34;;4326:22;;;4287:62;4284:88;;;4352:18;;:::i;:::-;4388:2;4381:22;-1:-1:-1;;4160:249:1:o;4414:183::-;4474:4;4507:18;4499:6;4496:30;4493:56;;;4529:18;;:::i;:::-;-1:-1:-1;4574:1:1;4570:14;4586:4;4566:25;;4414:183::o;4602:724::-;4656:5;4709:3;4702:4;4694:6;4690:17;4686:27;4676:55;;4727:1;4724;4717:12;4676:55;4763:6;4750:20;4789:4;4812:43;4852:2;4812:43;:::i;:::-;4884:2;4878:9;4896:31;4924:2;4916:6;4896:31;:::i;:::-;4962:18;;;5054:1;5050:10;;;;5038:23;;5034:32;;;4996:15;;;;-1:-1:-1;5078:15:1;;;5075:35;;;5106:1;5103;5096:12;5075:35;5142:2;5134:6;5130:15;5154:142;5170:6;5165:3;5162:15;5154:142;;;5236:17;;5224:30;;5274:12;;;;5187;;5154:142;;;-1:-1:-1;5314:6:1;4602:724;-1:-1:-1;;;;;;4602:724:1:o;5331:555::-;5373:5;5426:3;5419:4;5411:6;5407:17;5403:27;5393:55;;5444:1;5441;5434:12;5393:55;5480:6;5467:20;5506:18;5502:2;5499:26;5496:52;;;5528:18;;:::i;:::-;5577:2;5571:9;5589:67;5644:2;5625:13;;-1:-1:-1;;5621:27:1;5650:4;5617:38;5571:9;5589:67;:::i;:::-;5680:2;5672:6;5665:18;5726:3;5719:4;5714:2;5706:6;5702:15;5698:26;5695:35;5692:55;;;5743:1;5740;5733:12;5692:55;5807:2;5800:4;5792:6;5788:17;5781:4;5773:6;5769:17;5756:54;5854:1;5830:15;;;5847:4;5826:26;5819:37;;;;5834:6;5331:555;-1:-1:-1;;;5331:555:1:o;5891:943::-;6045:6;6053;6061;6069;6077;6130:3;6118:9;6109:7;6105:23;6101:33;6098:53;;;6147:1;6144;6137:12;6098:53;6170:29;6189:9;6170:29;:::i;:::-;6160:39;;6218:38;6252:2;6241:9;6237:18;6218:38;:::i;:::-;6208:48;;6307:2;6296:9;6292:18;6279:32;6330:18;6371:2;6363:6;6360:14;6357:34;;;6387:1;6384;6377:12;6357:34;6410:61;6463:7;6454:6;6443:9;6439:22;6410:61;:::i;:::-;6400:71;;6524:2;6513:9;6509:18;6496:32;6480:48;;6553:2;6543:8;6540:16;6537:36;;;6569:1;6566;6559:12;6537:36;6592:63;6647:7;6636:8;6625:9;6621:24;6592:63;:::i;:::-;6582:73;;6708:3;6697:9;6693:19;6680:33;6664:49;;6738:2;6728:8;6725:16;6722:36;;;6754:1;6751;6744:12;6722:36;;6777:51;6820:7;6809:8;6798:9;6794:24;6777:51;:::i;:::-;6767:61;;;5891:943;;;;;;;;:::o;7021:615::-;7107:6;7115;7168:2;7156:9;7147:7;7143:23;7139:32;7136:52;;;7184:1;7181;7174:12;7136:52;7224:9;7211:23;7253:18;7294:2;7286:6;7283:14;7280:34;;;7310:1;7307;7300:12;7280:34;7348:6;7337:9;7333:22;7323:32;;7393:7;7386:4;7382:2;7378:13;7374:27;7364:55;;7415:1;7412;7405:12;7364:55;7455:2;7442:16;7481:2;7473:6;7470:14;7467:34;;;7497:1;7494;7487:12;7467:34;7550:7;7545:2;7535:6;7532:1;7528:14;7524:2;7520:23;7516:32;7513:45;7510:65;;;7571:1;7568;7561:12;7880:1208;7998:6;8006;8059:2;8047:9;8038:7;8034:23;8030:32;8027:52;;;8075:1;8072;8065:12;8027:52;8115:9;8102:23;8144:18;8185:2;8177:6;8174:14;8171:34;;;8201:1;8198;8191:12;8171:34;8239:6;8228:9;8224:22;8214:32;;8284:7;8277:4;8273:2;8269:13;8265:27;8255:55;;8306:1;8303;8296:12;8255:55;8342:2;8329:16;8364:4;8387:43;8427:2;8387:43;:::i;:::-;8459:2;8453:9;8471:31;8499:2;8491:6;8471:31;:::i;:::-;8537:18;;;8625:1;8621:10;;;;8613:19;;8609:28;;;8571:15;;;;-1:-1:-1;8649:19:1;;;8646:39;;;8681:1;8678;8671:12;8646:39;8705:11;;;;8725:148;8741:6;8736:3;8733:15;8725:148;;;8807:23;8826:3;8807:23;:::i;:::-;8795:36;;8758:12;;;;8851;;;;8725:148;;;8892:6;-1:-1:-1;;8936:18:1;;8923:32;;-1:-1:-1;;8967:16:1;;;8964:36;;;8996:1;8993;8986:12;8964:36;;9019:63;9074:7;9063:8;9052:9;9048:24;9019:63;:::i;:::-;9009:73;;;7880:1208;;;;;:::o;9093:435::-;9146:3;9184:5;9178:12;9211:6;9206:3;9199:19;9237:4;9266:2;9261:3;9257:12;9250:19;;9303:2;9296:5;9292:14;9324:1;9334:169;9348:6;9345:1;9342:13;9334:169;;;9409:13;;9397:26;;9443:12;;;;9478:15;;;;9370:1;9363:9;9334:169;;;-1:-1:-1;9519:3:1;;9093:435;-1:-1:-1;;;;;9093:435:1:o;9533:261::-;9712:2;9701:9;9694:21;9675:4;9732:56;9784:2;9773:9;9769:18;9761:6;9732:56;:::i;10192:118::-;10278:5;10271:13;10264:21;10257:5;10254:32;10244:60;;10300:1;10297;10290:12;10315:315;10380:6;10388;10441:2;10429:9;10420:7;10416:23;10412:32;10409:52;;;10457:1;10454;10447:12;10409:52;10480:29;10499:9;10480:29;:::i;:::-;10470:39;;10559:2;10548:9;10544:18;10531:32;10572:28;10594:5;10572:28;:::i;10635:270::-;10708:6;10761:2;10749:9;10740:7;10736:23;10732:32;10729:52;;;10777:1;10774;10767:12;10729:52;10816:9;10803:23;10855:1;10848:5;10845:12;10835:40;;10871:1;10868;10861:12;10910:260;10978:6;10986;11039:2;11027:9;11018:7;11014:23;11010:32;11007:52;;;11055:1;11052;11045:12;11007:52;11078:29;11097:9;11078:29;:::i;:::-;11068:39;;11126:38;11160:2;11149:9;11145:18;11126:38;:::i;:::-;11116:48;;10910:260;;;;;:::o;11175:606::-;11279:6;11287;11295;11303;11311;11364:3;11352:9;11343:7;11339:23;11335:33;11332:53;;;11381:1;11378;11371:12;11332:53;11404:29;11423:9;11404:29;:::i;:::-;11394:39;;11452:38;11486:2;11475:9;11471:18;11452:38;:::i;:::-;11442:48;;11537:2;11526:9;11522:18;11509:32;11499:42;;11588:2;11577:9;11573:18;11560:32;11550:42;;11643:3;11632:9;11628:19;11615:33;11671:18;11663:6;11660:30;11657:50;;;11703:1;11700;11693:12;11657:50;11726:49;11767:7;11758:6;11747:9;11743:22;11726:49;:::i;11786:186::-;11845:6;11898:2;11886:9;11877:7;11873:23;11869:32;11866:52;;;11914:1;11911;11904:12;11866:52;11937:29;11956:9;11937:29;:::i;12388:390::-;12547:2;12536:9;12529:21;12586:6;12581:2;12570:9;12566:18;12559:34;12643:6;12635;12630:2;12619:9;12615:18;12602:48;12699:1;12670:22;;;12694:2;12666:31;;;12659:42;;;;12762:2;12741:15;;;-1:-1:-1;;12737:29:1;12722:45;12718:54;;12388:390;-1:-1:-1;12388:390:1:o;12783:380::-;12862:1;12858:12;;;;12905;;;12926:61;;12980:4;12972:6;12968:17;12958:27;;12926:61;13033:2;13025:6;13022:14;13002:18;12999:38;12996:161;;13079:10;13074:3;13070:20;13067:1;13060:31;13114:4;13111:1;13104:15;13142:4;13139:1;13132:15;12996:161;;12783:380;;;:::o;13168:127::-;13229:10;13224:3;13220:20;13217:1;13210:31;13260:4;13257:1;13250:15;13284:4;13281:1;13274:15;13300:168;13373:9;;;13404;;13421:15;;;13415:22;;13401:37;13391:71;;13442:18;;:::i;13473:217::-;13513:1;13539;13529:132;;13583:10;13578:3;13574:20;13571:1;13564:31;13618:4;13615:1;13608:15;13646:4;13643:1;13636:15;13529:132;-1:-1:-1;13675:9:1;;13473:217::o;14339:127::-;14400:10;14395:3;14391:20;14388:1;14381:31;14431:4;14428:1;14421:15;14455:4;14452:1;14445:15;14471:135;14510:3;14531:17;;;14528:43;;14551:18;;:::i;:::-;-1:-1:-1;14598:1:1;14587:13;;14471:135::o;15715:545::-;15817:2;15812:3;15809:11;15806:448;;;15853:1;15878:5;15874:2;15867:17;15923:4;15919:2;15909:19;15993:2;15981:10;15977:19;15974:1;15970:27;15964:4;15960:38;16029:4;16017:10;16014:20;16011:47;;;-1:-1:-1;16052:4:1;16011:47;16107:2;16102:3;16098:12;16095:1;16091:20;16085:4;16081:31;16071:41;;16162:82;16180:2;16173:5;16170:13;16162:82;;;16225:17;;;16206:1;16195:13;16162:82;;16436:1352;16562:3;16556:10;16589:18;16581:6;16578:30;16575:56;;;16611:18;;:::i;:::-;16640:97;16730:6;16690:38;16722:4;16716:11;16690:38;:::i;:::-;16684:4;16640:97;:::i;:::-;16792:4;;16856:2;16845:14;;16873:1;16868:663;;;;17575:1;17592:6;17589:89;;;-1:-1:-1;17644:19:1;;;17638:26;17589:89;-1:-1:-1;;16393:1:1;16389:11;;;16385:24;16381:29;16371:40;16417:1;16413:11;;;16368:57;17691:81;;16838:944;;16868:663;15662:1;15655:14;;;15699:4;15686:18;;-1:-1:-1;;16904:20:1;;;17022:236;17036:7;17033:1;17030:14;17022:236;;;17125:19;;;17119:26;17104:42;;17217:27;;;;17185:1;17173:14;;;;17052:19;;17022:236;;;17026:3;17286:6;17277:7;17274:19;17271:201;;;17347:19;;;17341:26;-1:-1:-1;;17430:1:1;17426:14;;;17442:3;17422:24;17418:37;17414:42;17399:58;17384:74;;17271:201;-1:-1:-1;;;;;17518:1:1;17502:14;;;17498:22;17485:36;;-1:-1:-1;16436:1352:1:o;18558:125::-;18623:9;;;18644:10;;;18641:36;;;18657:18;;:::i;18997:245::-;19064:6;19117:2;19105:9;19096:7;19092:23;19088:32;19085:52;;;19133:1;19130;19123:12;19085:52;19165:9;19159:16;19184:28;19206:5;19184:28;:::i;19247:410::-;19449:2;19431:21;;;19488:2;19468:18;;;19461:30;19527:34;19522:2;19507:18;;19500:62;-1:-1:-1;;;19593:2:1;19578:18;;19571:44;19647:3;19632:19;;19247:410::o;20726:401::-;20928:2;20910:21;;;20967:2;20947:18;;;20940:30;21006:34;21001:2;20986:18;;20979:62;-1:-1:-1;;;21072:2:1;21057:18;;21050:35;21117:3;21102:19;;20726:401::o;21132:406::-;21334:2;21316:21;;;21373:2;21353:18;;;21346:30;21412:34;21407:2;21392:18;;21385:62;-1:-1:-1;;;21478:2:1;21463:18;;21456:40;21528:3;21513:19;;21132:406::o;21543:465::-;21800:2;21789:9;21782:21;21763:4;21826:56;21878:2;21867:9;21863:18;21855:6;21826:56;:::i;:::-;21930:9;21922:6;21918:22;21913:2;21902:9;21898:18;21891:50;21958:44;21995:6;21987;21958:44;:::i;:::-;21950:52;21543:465;-1:-1:-1;;;;;21543:465:1:o;22423:561::-;-1:-1:-1;;;;;22720:15:1;;;22702:34;;22772:15;;22767:2;22752:18;;22745:43;22819:2;22804:18;;22797:34;;;22862:2;22847:18;;22840:34;;;22682:3;22905;22890:19;;22883:32;;;22645:4;;22932:46;;22958:19;;22950:6;22932:46;:::i;:::-;22924:54;22423:561;-1:-1:-1;;;;;;;22423:561:1:o;22989:249::-;23058:6;23111:2;23099:9;23090:7;23086:23;23082:32;23079:52;;;23127:1;23124;23117:12;23079:52;23159:9;23153:16;23178:30;23202:5;23178:30;:::i;23243:179::-;23278:3;23320:1;23302:16;23299:23;23296:120;;;23366:1;23363;23360;23345:23;-1:-1:-1;23403:1:1;23397:8;23392:3;23388:18;23296:120;23243:179;:::o;23427:671::-;23466:3;23508:4;23490:16;23487:26;23484:39;;;23427:671;:::o;23484:39::-;23550:2;23544:9;-1:-1:-1;;23615:16:1;23611:25;;23608:1;23544:9;23587:50;23666:4;23660:11;23690:16;23725:18;23796:2;23789:4;23781:6;23777:17;23774:25;23769:2;23761:6;23758:14;23755:45;23752:58;;;23803:5;;;;;23427:671;:::o;23752:58::-;23840:6;23834:4;23830:17;23819:28;;23876:3;23870:10;23903:2;23895:6;23892:14;23889:27;;;23909:5;;;;;;23427:671;:::o;23889:27::-;23993:2;23974:16;23968:4;23964:27;23960:36;23953:4;23944:6;23939:3;23935:16;23931:27;23928:69;23925:82;;;24000:5;;;;;;23427:671;:::o;23925:82::-;24016:57;24067:4;24058:6;24050;24046:19;24042:30;24036:4;24016:57;:::i;:::-;-1:-1:-1;24089:3:1;;23427:671;-1:-1:-1;;;;;23427:671:1:o;24524:404::-;24726:2;24708:21;;;24765:2;24745:18;;;24738:30;24804:34;24799:2;24784:18;;24777:62;-1:-1:-1;;;24870:2:1;24855:18;;24848:38;24918:3;24903:19;;24524:404::o;24933:827::-;-1:-1:-1;;;;;25330:15:1;;;25312:34;;25382:15;;25377:2;25362:18;;25355:43;25292:3;25429:2;25414:18;;25407:31;;;25255:4;;25461:57;;25498:19;;25490:6;25461:57;:::i;:::-;25566:9;25558:6;25554:22;25549:2;25538:9;25534:18;25527:50;25600:44;25637:6;25629;25600:44;:::i;:::-;25586:58;;25693:9;25685:6;25681:22;25675:3;25664:9;25660:19;25653:51;25721:33;25747:6;25739;25721:33;:::i;:::-;25713:41;24933:827;-1:-1:-1;;;;;;;;24933:827:1:o
Swarm Source
ipfs://95dce71ab206fa617187748c879b9c1a22eabb87fd8b33ebe907766815f4e14c
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.