ERC-721
Overview
Max Total Supply
175 SHR
Holders
96
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 SHRLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Shroonies
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-04-28 */ // SPDX-License-Identifier: MIT // File: lib/Constants.sol pragma solidity ^0.8.13; address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E; address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6; // File: IOperatorFilterRegistry.sol 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); } // File: OperatorFilterer.sol 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); } } } } // File: DefaultOperatorFilterer.sol 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.8.0) (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 rebuild 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 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 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 for 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) { 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 rebuild 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 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 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 for 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) { 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/security/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // 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.7.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 anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing 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/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external payable; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } // File: contracts/Shroonies.sol pragma solidity ^0.8.13; contract Shroonies is ERC721A, Ownable, ReentrancyGuard, Pausable, DefaultOperatorFilterer{ // ====================================== // VARIABLES // ====================================== uint256 public maxSupply = 2000; uint256 public publicMaxMint = 2; uint256 public mintPrice = 0.02 ether; uint256 public wlMaxMint = 1; uint256 public wlMintPrice = 0.01 ether; //Base uri, base extension string public baseExtension = ".json"; string public baseURI; // Booleans for if mint is enabled bool public publicMintEnabled = false; bool public wlMintEnabled = false; // Mappings to keep track of # of minted tokens per user mapping(address => uint256) public totalWlMint; mapping(address => uint256) public totalPublicMint; // Merkle root bytes32 public root; constructor ( string memory _initBaseURI, bytes32 _root ) ERC721A("SHROONIES", "SHR") { setBaseURI(_initBaseURI); setRoot(_root); } function airdrop(address[] calldata _address, uint256 _amount) external onlyOwner nonReentrant { require(totalSupply() + _amount <= maxSupply, "Error: max supply reached"); for (uint i = 0; i < _address.length; i++) { _safeMint(_address[i], _amount); } } // ============================================================= // WL MINT 1 MAX PER WALLET // ============================================================= function whitelistMint(uint256 _quantity, bytes32[] memory proof) external payable whenNotPaused nonReentrant { require(isValid(proof, keccak256(abi.encodePacked(msg.sender))), "Not on the whitelist"); require(wlMintEnabled, "Whitelist mint is currently paused"); require(totalSupply() + _quantity <= maxSupply, "Error: Max supply reached"); require((totalWlMint[msg.sender] + _quantity) <= wlMaxMint, "Error: Max WL allocation reached"); require(msg.value >= (_quantity * wlMintPrice), "Not enough ether sent"); totalWlMint[msg.sender] += _quantity; _safeMint(msg.sender, _quantity); } // ============================================================= // VERIFY MERKLE PROOF // ============================================================= function isValid(bytes32[] memory proof, bytes32 leaf) public view returns(bool) { return MerkleProof.verify(proof, root, leaf); } // ============================================================= // PUBLIC MINT 2 MAX PER WALLET // ============================================================= function publicMint(uint256 _quantity) external payable whenNotPaused nonReentrant { require(publicMintEnabled, "Public mint is currently paused"); require(totalSupply() + _quantity <= maxSupply, "Error: max supply reached"); require((totalPublicMint[msg.sender] + _quantity) <= publicMaxMint, "Error: Max allocation reached"); require(msg.value >= (_quantity * mintPrice), "Not enough ether sent"); totalPublicMint[msg.sender] += _quantity; _safeMint(msg.sender, _quantity); } // Returns the baseuri of collection, private function _baseURI() internal view virtual override returns (string memory) { return baseURI; } // Override _statTokenId() from erc721a to start tokenId at 1 function _startTokenId() internal view virtual override returns (uint256) { return 1; } function supportsInterface(bytes4 interfaceId) public view override(ERC721A) returns (bool) { return super.supportsInterface(interfaceId); } // Set Token Metadata Uri function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId),"ERC721Metadata: URI query for nonexistent token"); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _toString(tokenId), baseExtension)) : ""; } // ============================================================= // Opensea Operator Filter Registry // ============================================================= function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function approve(address operator, uint256 tokenId) public payable override onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); } function transferFrom( address from, address to, uint256 tokenId ) public payable override onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom( address from, address to, uint256 tokenId ) public payable override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public payable override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } // ============================================================= // OWNER FUNCTIONS // ============================================================= function togglePublicMint() external onlyOwner nonReentrant{ publicMintEnabled = !publicMintEnabled; } function toggleWlMint() external onlyOwner nonReentrant{ wlMintEnabled = !wlMintEnabled; } function setPrice(uint256 _mintPrice) external onlyOwner nonReentrant{ mintPrice = _mintPrice; } function setWlPrice(uint256 _wlMintPrice) external onlyOwner nonReentrant{ wlMintPrice = _wlMintPrice; } function setmaxWl(uint256 _wlMaxMint) external onlyOwner { wlMaxMint = _wlMaxMint; } function setmaxPublic(uint256 _publicMaxMint) external onlyOwner { publicMaxMint = _publicMaxMint; } function pause() public onlyOwner nonReentrant{ _pause(); } function unpause() public onlyOwner nonReentrant{ _unpause(); } function setBaseURI(string memory _newURI) public onlyOwner nonReentrant{ baseURI = _newURI; } function setRoot(bytes32 _root) public onlyOwner nonReentrant { root = _root; } function setMaxSupply(uint256 _maxSupply) external onlyOwner nonReentrant { maxSupply = _maxSupply; } // ============================================================= // WITHDRAWL TO OWNER // ============================================================= function withdraw() external onlyOwner nonReentrant { payable(owner()).transfer(address(this).balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"bytes32","name":"_root","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_address","type":"address[]"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"bytes32","name":"leaf","type":"bytes32"}],"name":"isValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMaxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_wlMintPrice","type":"uint256"}],"name":"setWlPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicMaxMint","type":"uint256"}],"name":"setmaxPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_wlMaxMint","type":"uint256"}],"name":"setmaxWl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWlMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalPublicMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalWlMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wlMaxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wlMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wlMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526107d0600b556002600c5566470de4df820000600d556001600e55662386f26fc10000600f556040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250601090805190602001906200007792919062000686565b506000601260006101000a81548160ff0219169083151502179055506000601260016101000a81548160ff021916908315150217905550348015620000bb57600080fd5b5060405162004c0038038062004c008339818101604052810190620000e191906200090e565b733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600981526020017f5348524f4f4e49455300000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f534852000000000000000000000000000000000000000000000000000000000081525081600290805190602001906200017c92919062000686565b5080600390805190602001906200019592919062000686565b50620001a66200041260201b60201c565b6000819055505050620001ce620001c26200041b60201b60201c565b6200042360201b60201c565b60016009819055506000600a60006101000a81548160ff02191690831515021790555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620003e6578015620002ac576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b815260040162000272929190620009b9565b600060405180830381600087803b1580156200028d57600080fd5b505af1158015620002a2573d6000803e3d6000fd5b50505050620003e5565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000366576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200032c929190620009b9565b600060405180830381600087803b1580156200034757600080fd5b505af11580156200035c573d6000803e3d6000fd5b50505050620003e4565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620003af9190620009e6565b600060405180830381600087803b158015620003ca57600080fd5b505af1158015620003df573d6000803e3d6000fd5b505050505b5b5b5050620003f982620004e960201b60201c565b6200040a816200053560201b60201c565b505062000b5c565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620004f96200056f60201b60201c565b620005096200060060201b60201c565b80601190805190602001906200052192919062000686565b50620005326200065260201b60201c565b50565b620005456200056f60201b60201c565b620005556200060060201b60201c565b806015819055506200056c6200065260201b60201c565b50565b6200057f6200041b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620005a56200065c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620005fe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005f59062000a64565b60405180910390fd5b565b60026009540362000648576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200063f9062000ad6565b60405180910390fd5b6002600981905550565b6001600981905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620006949062000b27565b90600052602060002090601f016020900481019282620006b8576000855562000704565b82601f10620006d357805160ff191683800117855562000704565b8280016001018555821562000704579182015b8281111562000703578251825591602001919060010190620006e6565b5b50905062000713919062000717565b5090565b5b808211156200073257600081600090555060010162000718565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200079f8262000754565b810181811067ffffffffffffffff82111715620007c157620007c062000765565b5b80604052505050565b6000620007d662000736565b9050620007e4828262000794565b919050565b600067ffffffffffffffff82111562000807576200080662000765565b5b620008128262000754565b9050602081019050919050565b60005b838110156200083f57808201518184015260208101905062000822565b838111156200084f576000848401525b50505050565b60006200086c6200086684620007e9565b620007ca565b9050828152602081018484840111156200088b576200088a6200074f565b5b620008988482856200081f565b509392505050565b600082601f830112620008b857620008b76200074a565b5b8151620008ca84826020860162000855565b91505092915050565b6000819050919050565b620008e881620008d3565b8114620008f457600080fd5b50565b6000815190506200090881620008dd565b92915050565b6000806040838503121562000928576200092762000740565b5b600083015167ffffffffffffffff81111562000949576200094862000745565b5b6200095785828601620008a0565b92505060206200096a85828601620008f7565b9150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620009a18262000974565b9050919050565b620009b38162000994565b82525050565b6000604082019050620009d06000830185620009a8565b620009df6020830184620009a8565b9392505050565b6000602082019050620009fd6000830184620009a8565b92915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000a4c60208362000a03565b915062000a598262000a14565b602082019050919050565b6000602082019050818103600083015262000a7f8162000a3d565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600062000abe601f8362000a03565b915062000acb8262000a86565b602082019050919050565b6000602082019050818103600083015262000af18162000aaf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000b4057607f821691505b60208210810362000b565762000b5562000af8565b5b50919050565b6140948062000b6c6000396000f3fe6080604052600436106102885760003560e01c80636f8b44b01161015a578063b8a20ed0116100c1578063dab5f3401161007a578063dab5f3401461090c578063e4b3568314610935578063e985e9c514610960578063ebf0c7171461099d578063f2e83403146109c8578063f2fde38b14610a0557610288565b8063b8a20ed0146107f7578063c204642c14610834578063c66828621461085d578063c87b56dd14610888578063d2cab056146108c5578063d5abeb01146108e157610288565b80638dd07d0f116101135780638dd07d0f1461071e57806391b7f5ed1461074757806395d89b41146107705780639c08feb21461079b578063a22cb465146107b2578063b88d4fde146107db57610288565b80636f8b44b01461063657806370a082311461065f578063715018a61461069c5780637aebd396146106b35780638456cb59146106dc5780638da5cb5b146106f357610288565b80632db11544116101fe57806342842e0e116101b757806342842e0e1461053357806355f804b31461054f5780635c975abb146105785780636352211e146105a35780636817c76c146105e05780636c0360eb1461060b57610288565b80632db115441461047c578063305c7d4a146104985780633ccfd60b146104c35780633f4ba83a146104da5780634047638d146104f157806341f434341461050857610288565b806311f95ac31161025057806311f95ac31461037957806318160ddd146103a45780631c16521c146103cf57806323b872dd1461040c578063258e835b146104285780632c4e9fc61461045157610288565b806301ffc9a71461028d57806306fdde03146102ca578063081812fc146102f5578063095ea7b3146103325780630f4161aa1461034e575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af9190612c19565b610a2e565b6040516102c19190612c61565b60405180910390f35b3480156102d657600080fd5b506102df610a40565b6040516102ec9190612d15565b60405180910390f35b34801561030157600080fd5b5061031c60048036038101906103179190612d6d565b610ad2565b6040516103299190612ddb565b60405180910390f35b61034c60048036038101906103479190612e22565b610b51565b005b34801561035a57600080fd5b50610363610b6a565b6040516103709190612c61565b60405180910390f35b34801561038557600080fd5b5061038e610b7d565b60405161039b9190612c61565b60405180910390f35b3480156103b057600080fd5b506103b9610b90565b6040516103c69190612e71565b60405180910390f35b3480156103db57600080fd5b506103f660048036038101906103f19190612e8c565b610ba7565b6040516104039190612e71565b60405180910390f35b61042660048036038101906104219190612eb9565b610bbf565b005b34801561043457600080fd5b5061044f600480360381019061044a9190612d6d565b610c0e565b005b34801561045d57600080fd5b50610466610c20565b6040516104739190612e71565b60405180910390f35b61049660048036038101906104919190612d6d565b610c26565b005b3480156104a457600080fd5b506104ad610e26565b6040516104ba9190612e71565b60405180910390f35b3480156104cf57600080fd5b506104d8610e2c565b005b3480156104e657600080fd5b506104ef610e94565b005b3480156104fd57600080fd5b50610506610eb6565b005b34801561051457600080fd5b5061051d610efa565b60405161052a9190612f6b565b60405180910390f35b61054d60048036038101906105489190612eb9565b610f0c565b005b34801561055b57600080fd5b50610576600480360381019061057191906130bb565b610f5b565b005b34801561058457600080fd5b5061058d610f8d565b60405161059a9190612c61565b60405180910390f35b3480156105af57600080fd5b506105ca60048036038101906105c59190612d6d565b610fa4565b6040516105d79190612ddb565b60405180910390f35b3480156105ec57600080fd5b506105f5610fb6565b6040516106029190612e71565b60405180910390f35b34801561061757600080fd5b50610620610fbc565b60405161062d9190612d15565b60405180910390f35b34801561064257600080fd5b5061065d60048036038101906106589190612d6d565b61104a565b005b34801561066b57600080fd5b5061068660048036038101906106819190612e8c565b61106c565b6040516106939190612e71565b60405180910390f35b3480156106a857600080fd5b506106b1611124565b005b3480156106bf57600080fd5b506106da60048036038101906106d59190612d6d565b611138565b005b3480156106e857600080fd5b506106f161114a565b005b3480156106ff57600080fd5b5061070861116c565b6040516107159190612ddb565b60405180910390f35b34801561072a57600080fd5b5061074560048036038101906107409190612d6d565b611196565b005b34801561075357600080fd5b5061076e60048036038101906107699190612d6d565b6111b8565b005b34801561077c57600080fd5b506107856111da565b6040516107929190612d15565b60405180910390f35b3480156107a757600080fd5b506107b061126c565b005b3480156107be57600080fd5b506107d960048036038101906107d49190613130565b6112b0565b005b6107f560048036038101906107f09190613211565b6112c9565b005b34801561080357600080fd5b5061081e60048036038101906108199190613392565b61131a565b60405161082b9190612c61565b60405180910390f35b34801561084057600080fd5b5061085b60048036038101906108569190613449565b611331565b005b34801561086957600080fd5b506108726113f8565b60405161087f9190612d15565b60405180910390f35b34801561089457600080fd5b506108af60048036038101906108aa9190612d6d565b611486565b6040516108bc9190612d15565b60405180910390f35b6108df60048036038101906108da91906134a9565b611530565b005b3480156108ed57600080fd5b506108f66117a0565b6040516109039190612e71565b60405180910390f35b34801561091857600080fd5b50610933600480360381019061092e9190613505565b6117a6565b005b34801561094157600080fd5b5061094a6117c8565b6040516109579190612e71565b60405180910390f35b34801561096c57600080fd5b5061098760048036038101906109829190613532565b6117ce565b6040516109949190612c61565b60405180910390f35b3480156109a957600080fd5b506109b2611862565b6040516109bf9190613581565b60405180910390f35b3480156109d457600080fd5b506109ef60048036038101906109ea9190612e8c565b611868565b6040516109fc9190612e71565b60405180910390f35b348015610a1157600080fd5b50610a2c6004803603810190610a279190612e8c565b611880565b005b6000610a3982611903565b9050919050565b606060028054610a4f906135cb565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7b906135cb565b8015610ac85780601f10610a9d57610100808354040283529160200191610ac8565b820191906000526020600020905b815481529060010190602001808311610aab57829003601f168201915b5050505050905090565b6000610add82611995565b610b13576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610b5b816119f4565b610b658383611af1565b505050565b601260009054906101000a900460ff1681565b601260019054906101000a900460ff1681565b6000610b9a611c35565b6001546000540303905090565b60146020528060005260406000206000915090505481565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610bfd57610bfc336119f4565b5b610c08848484611c3e565b50505050565b610c16611f60565b80600e8190555050565b600f5481565b610c2e611fde565b610c36612028565b601260009054906101000a900460ff16610c85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7c90613648565b60405180910390fd5b600b5481610c91610b90565b610c9b9190613697565b1115610cdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd390613739565b60405180910390fd5b600c5481601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610d2a9190613697565b1115610d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d62906137a5565b60405180910390fd5b600d5481610d7991906137c5565b341015610dbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db29061386b565b60405180910390fd5b80601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e0a9190613697565b92505081905550610e1b3382612077565b610e23612095565b50565b600c5481565b610e34611f60565b610e3c612028565b610e4461116c565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610e89573d6000803e3d6000fd5b50610e92612095565b565b610e9c611f60565b610ea4612028565b610eac61209f565b610eb4612095565b565b610ebe611f60565b610ec6612028565b601260009054906101000a900460ff1615601260006101000a81548160ff021916908315150217905550610ef8612095565b565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f4a57610f49336119f4565b5b610f55848484612102565b50505050565b610f63611f60565b610f6b612028565b8060119080519060200190610f81929190612b0a565b50610f8a612095565b50565b6000600a60009054906101000a900460ff16905090565b6000610faf82612122565b9050919050565b600d5481565b60118054610fc9906135cb565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff5906135cb565b80156110425780601f1061101757610100808354040283529160200191611042565b820191906000526020600020905b81548152906001019060200180831161102557829003601f168201915b505050505081565b611052611f60565b61105a612028565b80600b81905550611069612095565b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110d3576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61112c611f60565b61113660006121ee565b565b611140611f60565b80600c8190555050565b611152611f60565b61115a612028565b6111626122b4565b61116a612095565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61119e611f60565b6111a6612028565b80600f819055506111b5612095565b50565b6111c0611f60565b6111c8612028565b80600d819055506111d7612095565b50565b6060600380546111e9906135cb565b80601f0160208091040260200160405190810160405280929190818152602001828054611215906135cb565b80156112625780601f1061123757610100808354040283529160200191611262565b820191906000526020600020905b81548152906001019060200180831161124557829003601f168201915b5050505050905090565b611274611f60565b61127c612028565b601260019054906101000a900460ff1615601260016101000a81548160ff0219169083151502179055506112ae612095565b565b816112ba816119f4565b6112c48383612317565b505050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461130757611306336119f4565b5b61131385858585612422565b5050505050565b60006113298360155484612495565b905092915050565b611339611f60565b611341612028565b600b548161134d610b90565b6113579190613697565b1115611398576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138f90613739565b60405180910390fd5b60005b838390508110156113ea576113d78484838181106113bc576113bb61388b565b5b90506020020160208101906113d19190612e8c565b83612077565b80806113e2906138ba565b91505061139b565b506113f3612095565b505050565b60108054611405906135cb565b80601f0160208091040260200160405190810160405280929190818152602001828054611431906135cb565b801561147e5780601f106114535761010080835404028352916020019161147e565b820191906000526020600020905b81548152906001019060200180831161146157829003601f168201915b505050505081565b606061149182611995565b6114d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c790613974565b60405180910390fd5b60006114da6124ac565b905060008151116114fa5760405180602001604052806000815250611528565b806115048461253e565b601060405160200161151893929190613a64565b6040516020818303038152906040525b915050919050565b611538611fde565b611540612028565b61157081336040516020016115559190613add565b6040516020818303038152906040528051906020012061131a565b6115af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a690613b44565b60405180910390fd5b601260019054906101000a900460ff166115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590613bd6565b60405180910390fd5b600b548261160a610b90565b6116149190613697565b1115611655576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164c90613c42565b60405180910390fd5b600e5482601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116a39190613697565b11156116e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116db90613cae565b60405180910390fd5b600f54826116f291906137c5565b341015611734576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172b9061386b565b60405180910390fd5b81601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117839190613697565b925050819055506117943383612077565b61179c612095565b5050565b600b5481565b6117ae611f60565b6117b6612028565b806015819055506117c5612095565b50565b600e5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60155481565b60136020528060005260406000206000915090505481565b611888611f60565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ee90613d40565b60405180910390fd5b611900816121ee565b50565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061195e57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061198e5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6000816119a0611c35565b111580156119af575060005482105b80156119ed575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611aee576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611a6b929190613d60565b602060405180830381865afa158015611a88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aac9190613d9e565b611aed57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611ae49190612ddb565b60405180910390fd5b5b50565b6000611afc82610fa4565b90508073ffffffffffffffffffffffffffffffffffffffff16611b1d61258e565b73ffffffffffffffffffffffffffffffffffffffff1614611b8057611b4981611b4461258e565b6117ce565b611b7f576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000611c4982612122565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611cb0576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611cbc84612596565b91509150611cd28187611ccd61258e565b6125bd565b611d1e57611ce786611ce261258e565b6117ce565b611d1d576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611d84576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d918686866001612601565b8015611d9c57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611e6a85611e46888887612607565b7c02000000000000000000000000000000000000000000000000000000001761262f565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603611ef05760006001850190506000600460008381526020019081526020016000205403611eee576000548114611eed578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f58868686600161265a565b505050505050565b611f68612660565b73ffffffffffffffffffffffffffffffffffffffff16611f8661116c565b73ffffffffffffffffffffffffffffffffffffffff1614611fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd390613e17565b60405180910390fd5b565b611fe6610f8d565b15612026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201d90613e83565b60405180910390fd5b565b60026009540361206d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206490613eef565b60405180910390fd5b6002600981905550565b612091828260405180602001604052806000815250612668565b5050565b6001600981905550565b6120a7612705565b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6120eb612660565b6040516120f89190612ddb565b60405180910390a1565b61211d838383604051806020016040528060008152506112c9565b505050565b60008082905080612131611c35565b116121b7576000548110156121b65760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036121b4575b600081036121aa576004600083600190039350838152602001908152602001600020549050612180565b80925050506121e9565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6122bc611fde565b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612300612660565b60405161230d9190612ddb565b60405180910390a1565b806007600061232461258e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166123d161258e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124169190612c61565b60405180910390a35050565b61242d848484610bbf565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461248f576124588484848461274e565b61248e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6000826124a2858461289e565b1490509392505050565b6060601180546124bb906135cb565b80601f01602080910402602001604051908101604052809291908181526020018280546124e7906135cb565b80156125345780601f1061250957610100808354040283529160200191612534565b820191906000526020600020905b81548152906001019060200180831161251757829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b60011561257957600184039350600a81066030018453600a8104905080612557575b50828103602084039350808452505050919050565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861261e8686846128f4565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b61267283836128fd565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461270057600080549050600083820390505b6126b2600086838060010194508661274e565b6126e8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061269f5781600054146126fd57600080fd5b50505b505050565b61270d610f8d565b61274c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274390613f5b565b60405180910390fd5b565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261277461258e565b8786866040518563ffffffff1660e01b81526004016127969493929190613fd0565b6020604051808303816000875af19250505080156127d257506040513d601f19601f820116820180604052508101906127cf9190614031565b60015b61284b573d8060008114612802576040519150601f19603f3d011682016040523d82523d6000602084013e612807565b606091505b506000815103612843576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60008082905060005b84518110156128e9576128d4828683815181106128c7576128c661388b565b5b6020026020010151612ab8565b915080806128e1906138ba565b9150506128a7565b508091505092915050565b60009392505050565b6000805490506000820361293d576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61294a6000848385612601565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506129c1836129b26000866000612607565b6129bb85612ae3565b1761262f565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612a6257808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612a27565b5060008203612a9d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050612ab3600084838561265a565b505050565b6000818310612ad057612acb8284612af3565b612adb565b612ada8383612af3565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b828054612b16906135cb565b90600052602060002090601f016020900481019282612b385760008555612b7f565b82601f10612b5157805160ff1916838001178555612b7f565b82800160010185558215612b7f579182015b82811115612b7e578251825591602001919060010190612b63565b5b509050612b8c9190612b90565b5090565b5b80821115612ba9576000816000905550600101612b91565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612bf681612bc1565b8114612c0157600080fd5b50565b600081359050612c1381612bed565b92915050565b600060208284031215612c2f57612c2e612bb7565b5b6000612c3d84828501612c04565b91505092915050565b60008115159050919050565b612c5b81612c46565b82525050565b6000602082019050612c766000830184612c52565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612cb6578082015181840152602081019050612c9b565b83811115612cc5576000848401525b50505050565b6000601f19601f8301169050919050565b6000612ce782612c7c565b612cf18185612c87565b9350612d01818560208601612c98565b612d0a81612ccb565b840191505092915050565b60006020820190508181036000830152612d2f8184612cdc565b905092915050565b6000819050919050565b612d4a81612d37565b8114612d5557600080fd5b50565b600081359050612d6781612d41565b92915050565b600060208284031215612d8357612d82612bb7565b5b6000612d9184828501612d58565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612dc582612d9a565b9050919050565b612dd581612dba565b82525050565b6000602082019050612df06000830184612dcc565b92915050565b612dff81612dba565b8114612e0a57600080fd5b50565b600081359050612e1c81612df6565b92915050565b60008060408385031215612e3957612e38612bb7565b5b6000612e4785828601612e0d565b9250506020612e5885828601612d58565b9150509250929050565b612e6b81612d37565b82525050565b6000602082019050612e866000830184612e62565b92915050565b600060208284031215612ea257612ea1612bb7565b5b6000612eb084828501612e0d565b91505092915050565b600080600060608486031215612ed257612ed1612bb7565b5b6000612ee086828701612e0d565b9350506020612ef186828701612e0d565b9250506040612f0286828701612d58565b9150509250925092565b6000819050919050565b6000612f31612f2c612f2784612d9a565b612f0c565b612d9a565b9050919050565b6000612f4382612f16565b9050919050565b6000612f5582612f38565b9050919050565b612f6581612f4a565b82525050565b6000602082019050612f806000830184612f5c565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612fc882612ccb565b810181811067ffffffffffffffff82111715612fe757612fe6612f90565b5b80604052505050565b6000612ffa612bad565b90506130068282612fbf565b919050565b600067ffffffffffffffff82111561302657613025612f90565b5b61302f82612ccb565b9050602081019050919050565b82818337600083830152505050565b600061305e6130598461300b565b612ff0565b90508281526020810184848401111561307a57613079612f8b565b5b61308584828561303c565b509392505050565b600082601f8301126130a2576130a1612f86565b5b81356130b284826020860161304b565b91505092915050565b6000602082840312156130d1576130d0612bb7565b5b600082013567ffffffffffffffff8111156130ef576130ee612bbc565b5b6130fb8482850161308d565b91505092915050565b61310d81612c46565b811461311857600080fd5b50565b60008135905061312a81613104565b92915050565b6000806040838503121561314757613146612bb7565b5b600061315585828601612e0d565b92505060206131668582860161311b565b9150509250929050565b600067ffffffffffffffff82111561318b5761318a612f90565b5b61319482612ccb565b9050602081019050919050565b60006131b46131af84613170565b612ff0565b9050828152602081018484840111156131d0576131cf612f8b565b5b6131db84828561303c565b509392505050565b600082601f8301126131f8576131f7612f86565b5b81356132088482602086016131a1565b91505092915050565b6000806000806080858703121561322b5761322a612bb7565b5b600061323987828801612e0d565b945050602061324a87828801612e0d565b935050604061325b87828801612d58565b925050606085013567ffffffffffffffff81111561327c5761327b612bbc565b5b613288878288016131e3565b91505092959194509250565b600067ffffffffffffffff8211156132af576132ae612f90565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b6132d8816132c5565b81146132e357600080fd5b50565b6000813590506132f5816132cf565b92915050565b600061330e61330984613294565b612ff0565b90508083825260208201905060208402830185811115613331576133306132c0565b5b835b8181101561335a578061334688826132e6565b845260208401935050602081019050613333565b5050509392505050565b600082601f83011261337957613378612f86565b5b81356133898482602086016132fb565b91505092915050565b600080604083850312156133a9576133a8612bb7565b5b600083013567ffffffffffffffff8111156133c7576133c6612bbc565b5b6133d385828601613364565b92505060206133e4858286016132e6565b9150509250929050565b600080fd5b60008083601f84011261340957613408612f86565b5b8235905067ffffffffffffffff811115613426576134256133ee565b5b602083019150836020820283011115613442576134416132c0565b5b9250929050565b60008060006040848603121561346257613461612bb7565b5b600084013567ffffffffffffffff8111156134805761347f612bbc565b5b61348c868287016133f3565b9350935050602061349f86828701612d58565b9150509250925092565b600080604083850312156134c0576134bf612bb7565b5b60006134ce85828601612d58565b925050602083013567ffffffffffffffff8111156134ef576134ee612bbc565b5b6134fb85828601613364565b9150509250929050565b60006020828403121561351b5761351a612bb7565b5b6000613529848285016132e6565b91505092915050565b6000806040838503121561354957613548612bb7565b5b600061355785828601612e0d565b925050602061356885828601612e0d565b9150509250929050565b61357b816132c5565b82525050565b60006020820190506135966000830184613572565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806135e357607f821691505b6020821081036135f6576135f561359c565b5b50919050565b7f5075626c6963206d696e742069732063757272656e746c792070617573656400600082015250565b6000613632601f83612c87565b915061363d826135fc565b602082019050919050565b6000602082019050818103600083015261366181613625565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006136a282612d37565b91506136ad83612d37565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156136e2576136e1613668565b5b828201905092915050565b7f4572726f723a206d617820737570706c79207265616368656400000000000000600082015250565b6000613723601983612c87565b915061372e826136ed565b602082019050919050565b6000602082019050818103600083015261375281613716565b9050919050565b7f4572726f723a204d617820616c6c6f636174696f6e2072656163686564000000600082015250565b600061378f601d83612c87565b915061379a82613759565b602082019050919050565b600060208201905081810360008301526137be81613782565b9050919050565b60006137d082612d37565b91506137db83612d37565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561381457613813613668565b5b828202905092915050565b7f4e6f7420656e6f7567682065746865722073656e740000000000000000000000600082015250565b6000613855601583612c87565b91506138608261381f565b602082019050919050565b6000602082019050818103600083015261388481613848565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006138c582612d37565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036138f7576138f6613668565b5b600182019050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061395e602f83612c87565b915061396982613902565b604082019050919050565b6000602082019050818103600083015261398d81613951565b9050919050565b600081905092915050565b60006139aa82612c7c565b6139b48185613994565b93506139c4818560208601612c98565b80840191505092915050565b60008190508160005260206000209050919050565b600081546139f2816135cb565b6139fc8186613994565b94506001821660008114613a175760018114613a2857613a5b565b60ff19831686528186019350613a5b565b613a31856139d0565b60005b83811015613a5357815481890152600182019150602081019050613a34565b838801955050505b50505092915050565b6000613a70828661399f565b9150613a7c828561399f565b9150613a8882846139e5565b9150819050949350505050565b60008160601b9050919050565b6000613aad82613a95565b9050919050565b6000613abf82613aa2565b9050919050565b613ad7613ad282612dba565b613ab4565b82525050565b6000613ae98284613ac6565b60148201915081905092915050565b7f4e6f74206f6e207468652077686974656c697374000000000000000000000000600082015250565b6000613b2e601483612c87565b9150613b3982613af8565b602082019050919050565b60006020820190508181036000830152613b5d81613b21565b9050919050565b7f57686974656c697374206d696e742069732063757272656e746c79207061757360008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b6000613bc0602283612c87565b9150613bcb82613b64565b604082019050919050565b60006020820190508181036000830152613bef81613bb3565b9050919050565b7f4572726f723a204d617820737570706c79207265616368656400000000000000600082015250565b6000613c2c601983612c87565b9150613c3782613bf6565b602082019050919050565b60006020820190508181036000830152613c5b81613c1f565b9050919050565b7f4572726f723a204d617820574c20616c6c6f636174696f6e2072656163686564600082015250565b6000613c98602083612c87565b9150613ca382613c62565b602082019050919050565b60006020820190508181036000830152613cc781613c8b565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613d2a602683612c87565b9150613d3582613cce565b604082019050919050565b60006020820190508181036000830152613d5981613d1d565b9050919050565b6000604082019050613d756000830185612dcc565b613d826020830184612dcc565b9392505050565b600081519050613d9881613104565b92915050565b600060208284031215613db457613db3612bb7565b5b6000613dc284828501613d89565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613e01602083612c87565b9150613e0c82613dcb565b602082019050919050565b60006020820190508181036000830152613e3081613df4565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000613e6d601083612c87565b9150613e7882613e37565b602082019050919050565b60006020820190508181036000830152613e9c81613e60565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613ed9601f83612c87565b9150613ee482613ea3565b602082019050919050565b60006020820190508181036000830152613f0881613ecc565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000613f45601483612c87565b9150613f5082613f0f565b602082019050919050565b60006020820190508181036000830152613f7481613f38565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613fa282613f7b565b613fac8185613f86565b9350613fbc818560208601612c98565b613fc581612ccb565b840191505092915050565b6000608082019050613fe56000830187612dcc565b613ff26020830186612dcc565b613fff6040830185612e62565b81810360608301526140118184613f97565b905095945050505050565b60008151905061402b81612bed565b92915050565b60006020828403121561404757614046612bb7565b5b60006140558482850161401c565b9150509291505056fea2646970667358221220007e25fad3bfe5899d709b88ae45753d6a5643a9fe71e2c85aa0afd5bbac962164736f6c634300080d003300000000000000000000000000000000000000000000000000000000000000401b287adc001c33dd3e6e5c22f7d33783de05190d2628532af3cbd317857437d10000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5634656e62484d4d7250754d353548397546365662464e7257734850646746386557614c5464436e47706b742f00000000000000000000
Deployed Bytecode
0x6080604052600436106102885760003560e01c80636f8b44b01161015a578063b8a20ed0116100c1578063dab5f3401161007a578063dab5f3401461090c578063e4b3568314610935578063e985e9c514610960578063ebf0c7171461099d578063f2e83403146109c8578063f2fde38b14610a0557610288565b8063b8a20ed0146107f7578063c204642c14610834578063c66828621461085d578063c87b56dd14610888578063d2cab056146108c5578063d5abeb01146108e157610288565b80638dd07d0f116101135780638dd07d0f1461071e57806391b7f5ed1461074757806395d89b41146107705780639c08feb21461079b578063a22cb465146107b2578063b88d4fde146107db57610288565b80636f8b44b01461063657806370a082311461065f578063715018a61461069c5780637aebd396146106b35780638456cb59146106dc5780638da5cb5b146106f357610288565b80632db11544116101fe57806342842e0e116101b757806342842e0e1461053357806355f804b31461054f5780635c975abb146105785780636352211e146105a35780636817c76c146105e05780636c0360eb1461060b57610288565b80632db115441461047c578063305c7d4a146104985780633ccfd60b146104c35780633f4ba83a146104da5780634047638d146104f157806341f434341461050857610288565b806311f95ac31161025057806311f95ac31461037957806318160ddd146103a45780631c16521c146103cf57806323b872dd1461040c578063258e835b146104285780632c4e9fc61461045157610288565b806301ffc9a71461028d57806306fdde03146102ca578063081812fc146102f5578063095ea7b3146103325780630f4161aa1461034e575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af9190612c19565b610a2e565b6040516102c19190612c61565b60405180910390f35b3480156102d657600080fd5b506102df610a40565b6040516102ec9190612d15565b60405180910390f35b34801561030157600080fd5b5061031c60048036038101906103179190612d6d565b610ad2565b6040516103299190612ddb565b60405180910390f35b61034c60048036038101906103479190612e22565b610b51565b005b34801561035a57600080fd5b50610363610b6a565b6040516103709190612c61565b60405180910390f35b34801561038557600080fd5b5061038e610b7d565b60405161039b9190612c61565b60405180910390f35b3480156103b057600080fd5b506103b9610b90565b6040516103c69190612e71565b60405180910390f35b3480156103db57600080fd5b506103f660048036038101906103f19190612e8c565b610ba7565b6040516104039190612e71565b60405180910390f35b61042660048036038101906104219190612eb9565b610bbf565b005b34801561043457600080fd5b5061044f600480360381019061044a9190612d6d565b610c0e565b005b34801561045d57600080fd5b50610466610c20565b6040516104739190612e71565b60405180910390f35b61049660048036038101906104919190612d6d565b610c26565b005b3480156104a457600080fd5b506104ad610e26565b6040516104ba9190612e71565b60405180910390f35b3480156104cf57600080fd5b506104d8610e2c565b005b3480156104e657600080fd5b506104ef610e94565b005b3480156104fd57600080fd5b50610506610eb6565b005b34801561051457600080fd5b5061051d610efa565b60405161052a9190612f6b565b60405180910390f35b61054d60048036038101906105489190612eb9565b610f0c565b005b34801561055b57600080fd5b50610576600480360381019061057191906130bb565b610f5b565b005b34801561058457600080fd5b5061058d610f8d565b60405161059a9190612c61565b60405180910390f35b3480156105af57600080fd5b506105ca60048036038101906105c59190612d6d565b610fa4565b6040516105d79190612ddb565b60405180910390f35b3480156105ec57600080fd5b506105f5610fb6565b6040516106029190612e71565b60405180910390f35b34801561061757600080fd5b50610620610fbc565b60405161062d9190612d15565b60405180910390f35b34801561064257600080fd5b5061065d60048036038101906106589190612d6d565b61104a565b005b34801561066b57600080fd5b5061068660048036038101906106819190612e8c565b61106c565b6040516106939190612e71565b60405180910390f35b3480156106a857600080fd5b506106b1611124565b005b3480156106bf57600080fd5b506106da60048036038101906106d59190612d6d565b611138565b005b3480156106e857600080fd5b506106f161114a565b005b3480156106ff57600080fd5b5061070861116c565b6040516107159190612ddb565b60405180910390f35b34801561072a57600080fd5b5061074560048036038101906107409190612d6d565b611196565b005b34801561075357600080fd5b5061076e60048036038101906107699190612d6d565b6111b8565b005b34801561077c57600080fd5b506107856111da565b6040516107929190612d15565b60405180910390f35b3480156107a757600080fd5b506107b061126c565b005b3480156107be57600080fd5b506107d960048036038101906107d49190613130565b6112b0565b005b6107f560048036038101906107f09190613211565b6112c9565b005b34801561080357600080fd5b5061081e60048036038101906108199190613392565b61131a565b60405161082b9190612c61565b60405180910390f35b34801561084057600080fd5b5061085b60048036038101906108569190613449565b611331565b005b34801561086957600080fd5b506108726113f8565b60405161087f9190612d15565b60405180910390f35b34801561089457600080fd5b506108af60048036038101906108aa9190612d6d565b611486565b6040516108bc9190612d15565b60405180910390f35b6108df60048036038101906108da91906134a9565b611530565b005b3480156108ed57600080fd5b506108f66117a0565b6040516109039190612e71565b60405180910390f35b34801561091857600080fd5b50610933600480360381019061092e9190613505565b6117a6565b005b34801561094157600080fd5b5061094a6117c8565b6040516109579190612e71565b60405180910390f35b34801561096c57600080fd5b5061098760048036038101906109829190613532565b6117ce565b6040516109949190612c61565b60405180910390f35b3480156109a957600080fd5b506109b2611862565b6040516109bf9190613581565b60405180910390f35b3480156109d457600080fd5b506109ef60048036038101906109ea9190612e8c565b611868565b6040516109fc9190612e71565b60405180910390f35b348015610a1157600080fd5b50610a2c6004803603810190610a279190612e8c565b611880565b005b6000610a3982611903565b9050919050565b606060028054610a4f906135cb565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7b906135cb565b8015610ac85780601f10610a9d57610100808354040283529160200191610ac8565b820191906000526020600020905b815481529060010190602001808311610aab57829003601f168201915b5050505050905090565b6000610add82611995565b610b13576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610b5b816119f4565b610b658383611af1565b505050565b601260009054906101000a900460ff1681565b601260019054906101000a900460ff1681565b6000610b9a611c35565b6001546000540303905090565b60146020528060005260406000206000915090505481565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610bfd57610bfc336119f4565b5b610c08848484611c3e565b50505050565b610c16611f60565b80600e8190555050565b600f5481565b610c2e611fde565b610c36612028565b601260009054906101000a900460ff16610c85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7c90613648565b60405180910390fd5b600b5481610c91610b90565b610c9b9190613697565b1115610cdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd390613739565b60405180910390fd5b600c5481601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610d2a9190613697565b1115610d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d62906137a5565b60405180910390fd5b600d5481610d7991906137c5565b341015610dbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db29061386b565b60405180910390fd5b80601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e0a9190613697565b92505081905550610e1b3382612077565b610e23612095565b50565b600c5481565b610e34611f60565b610e3c612028565b610e4461116c565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610e89573d6000803e3d6000fd5b50610e92612095565b565b610e9c611f60565b610ea4612028565b610eac61209f565b610eb4612095565b565b610ebe611f60565b610ec6612028565b601260009054906101000a900460ff1615601260006101000a81548160ff021916908315150217905550610ef8612095565b565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f4a57610f49336119f4565b5b610f55848484612102565b50505050565b610f63611f60565b610f6b612028565b8060119080519060200190610f81929190612b0a565b50610f8a612095565b50565b6000600a60009054906101000a900460ff16905090565b6000610faf82612122565b9050919050565b600d5481565b60118054610fc9906135cb565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff5906135cb565b80156110425780601f1061101757610100808354040283529160200191611042565b820191906000526020600020905b81548152906001019060200180831161102557829003601f168201915b505050505081565b611052611f60565b61105a612028565b80600b81905550611069612095565b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110d3576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61112c611f60565b61113660006121ee565b565b611140611f60565b80600c8190555050565b611152611f60565b61115a612028565b6111626122b4565b61116a612095565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61119e611f60565b6111a6612028565b80600f819055506111b5612095565b50565b6111c0611f60565b6111c8612028565b80600d819055506111d7612095565b50565b6060600380546111e9906135cb565b80601f0160208091040260200160405190810160405280929190818152602001828054611215906135cb565b80156112625780601f1061123757610100808354040283529160200191611262565b820191906000526020600020905b81548152906001019060200180831161124557829003601f168201915b5050505050905090565b611274611f60565b61127c612028565b601260019054906101000a900460ff1615601260016101000a81548160ff0219169083151502179055506112ae612095565b565b816112ba816119f4565b6112c48383612317565b505050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461130757611306336119f4565b5b61131385858585612422565b5050505050565b60006113298360155484612495565b905092915050565b611339611f60565b611341612028565b600b548161134d610b90565b6113579190613697565b1115611398576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138f90613739565b60405180910390fd5b60005b838390508110156113ea576113d78484838181106113bc576113bb61388b565b5b90506020020160208101906113d19190612e8c565b83612077565b80806113e2906138ba565b91505061139b565b506113f3612095565b505050565b60108054611405906135cb565b80601f0160208091040260200160405190810160405280929190818152602001828054611431906135cb565b801561147e5780601f106114535761010080835404028352916020019161147e565b820191906000526020600020905b81548152906001019060200180831161146157829003601f168201915b505050505081565b606061149182611995565b6114d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c790613974565b60405180910390fd5b60006114da6124ac565b905060008151116114fa5760405180602001604052806000815250611528565b806115048461253e565b601060405160200161151893929190613a64565b6040516020818303038152906040525b915050919050565b611538611fde565b611540612028565b61157081336040516020016115559190613add565b6040516020818303038152906040528051906020012061131a565b6115af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a690613b44565b60405180910390fd5b601260019054906101000a900460ff166115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590613bd6565b60405180910390fd5b600b548261160a610b90565b6116149190613697565b1115611655576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164c90613c42565b60405180910390fd5b600e5482601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116a39190613697565b11156116e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116db90613cae565b60405180910390fd5b600f54826116f291906137c5565b341015611734576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172b9061386b565b60405180910390fd5b81601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117839190613697565b925050819055506117943383612077565b61179c612095565b5050565b600b5481565b6117ae611f60565b6117b6612028565b806015819055506117c5612095565b50565b600e5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60155481565b60136020528060005260406000206000915090505481565b611888611f60565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ee90613d40565b60405180910390fd5b611900816121ee565b50565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061195e57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061198e5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6000816119a0611c35565b111580156119af575060005482105b80156119ed575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611aee576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611a6b929190613d60565b602060405180830381865afa158015611a88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aac9190613d9e565b611aed57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611ae49190612ddb565b60405180910390fd5b5b50565b6000611afc82610fa4565b90508073ffffffffffffffffffffffffffffffffffffffff16611b1d61258e565b73ffffffffffffffffffffffffffffffffffffffff1614611b8057611b4981611b4461258e565b6117ce565b611b7f576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000611c4982612122565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611cb0576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611cbc84612596565b91509150611cd28187611ccd61258e565b6125bd565b611d1e57611ce786611ce261258e565b6117ce565b611d1d576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611d84576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d918686866001612601565b8015611d9c57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611e6a85611e46888887612607565b7c02000000000000000000000000000000000000000000000000000000001761262f565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603611ef05760006001850190506000600460008381526020019081526020016000205403611eee576000548114611eed578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f58868686600161265a565b505050505050565b611f68612660565b73ffffffffffffffffffffffffffffffffffffffff16611f8661116c565b73ffffffffffffffffffffffffffffffffffffffff1614611fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd390613e17565b60405180910390fd5b565b611fe6610f8d565b15612026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201d90613e83565b60405180910390fd5b565b60026009540361206d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206490613eef565b60405180910390fd5b6002600981905550565b612091828260405180602001604052806000815250612668565b5050565b6001600981905550565b6120a7612705565b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6120eb612660565b6040516120f89190612ddb565b60405180910390a1565b61211d838383604051806020016040528060008152506112c9565b505050565b60008082905080612131611c35565b116121b7576000548110156121b65760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036121b4575b600081036121aa576004600083600190039350838152602001908152602001600020549050612180565b80925050506121e9565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6122bc611fde565b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612300612660565b60405161230d9190612ddb565b60405180910390a1565b806007600061232461258e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166123d161258e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124169190612c61565b60405180910390a35050565b61242d848484610bbf565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461248f576124588484848461274e565b61248e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6000826124a2858461289e565b1490509392505050565b6060601180546124bb906135cb565b80601f01602080910402602001604051908101604052809291908181526020018280546124e7906135cb565b80156125345780601f1061250957610100808354040283529160200191612534565b820191906000526020600020905b81548152906001019060200180831161251757829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b60011561257957600184039350600a81066030018453600a8104905080612557575b50828103602084039350808452505050919050565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861261e8686846128f4565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b61267283836128fd565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461270057600080549050600083820390505b6126b2600086838060010194508661274e565b6126e8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061269f5781600054146126fd57600080fd5b50505b505050565b61270d610f8d565b61274c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274390613f5b565b60405180910390fd5b565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261277461258e565b8786866040518563ffffffff1660e01b81526004016127969493929190613fd0565b6020604051808303816000875af19250505080156127d257506040513d601f19601f820116820180604052508101906127cf9190614031565b60015b61284b573d8060008114612802576040519150601f19603f3d011682016040523d82523d6000602084013e612807565b606091505b506000815103612843576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60008082905060005b84518110156128e9576128d4828683815181106128c7576128c661388b565b5b6020026020010151612ab8565b915080806128e1906138ba565b9150506128a7565b508091505092915050565b60009392505050565b6000805490506000820361293d576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61294a6000848385612601565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506129c1836129b26000866000612607565b6129bb85612ae3565b1761262f565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612a6257808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612a27565b5060008203612a9d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050612ab3600084838561265a565b505050565b6000818310612ad057612acb8284612af3565b612adb565b612ada8383612af3565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b828054612b16906135cb565b90600052602060002090601f016020900481019282612b385760008555612b7f565b82601f10612b5157805160ff1916838001178555612b7f565b82800160010185558215612b7f579182015b82811115612b7e578251825591602001919060010190612b63565b5b509050612b8c9190612b90565b5090565b5b80821115612ba9576000816000905550600101612b91565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612bf681612bc1565b8114612c0157600080fd5b50565b600081359050612c1381612bed565b92915050565b600060208284031215612c2f57612c2e612bb7565b5b6000612c3d84828501612c04565b91505092915050565b60008115159050919050565b612c5b81612c46565b82525050565b6000602082019050612c766000830184612c52565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612cb6578082015181840152602081019050612c9b565b83811115612cc5576000848401525b50505050565b6000601f19601f8301169050919050565b6000612ce782612c7c565b612cf18185612c87565b9350612d01818560208601612c98565b612d0a81612ccb565b840191505092915050565b60006020820190508181036000830152612d2f8184612cdc565b905092915050565b6000819050919050565b612d4a81612d37565b8114612d5557600080fd5b50565b600081359050612d6781612d41565b92915050565b600060208284031215612d8357612d82612bb7565b5b6000612d9184828501612d58565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612dc582612d9a565b9050919050565b612dd581612dba565b82525050565b6000602082019050612df06000830184612dcc565b92915050565b612dff81612dba565b8114612e0a57600080fd5b50565b600081359050612e1c81612df6565b92915050565b60008060408385031215612e3957612e38612bb7565b5b6000612e4785828601612e0d565b9250506020612e5885828601612d58565b9150509250929050565b612e6b81612d37565b82525050565b6000602082019050612e866000830184612e62565b92915050565b600060208284031215612ea257612ea1612bb7565b5b6000612eb084828501612e0d565b91505092915050565b600080600060608486031215612ed257612ed1612bb7565b5b6000612ee086828701612e0d565b9350506020612ef186828701612e0d565b9250506040612f0286828701612d58565b9150509250925092565b6000819050919050565b6000612f31612f2c612f2784612d9a565b612f0c565b612d9a565b9050919050565b6000612f4382612f16565b9050919050565b6000612f5582612f38565b9050919050565b612f6581612f4a565b82525050565b6000602082019050612f806000830184612f5c565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612fc882612ccb565b810181811067ffffffffffffffff82111715612fe757612fe6612f90565b5b80604052505050565b6000612ffa612bad565b90506130068282612fbf565b919050565b600067ffffffffffffffff82111561302657613025612f90565b5b61302f82612ccb565b9050602081019050919050565b82818337600083830152505050565b600061305e6130598461300b565b612ff0565b90508281526020810184848401111561307a57613079612f8b565b5b61308584828561303c565b509392505050565b600082601f8301126130a2576130a1612f86565b5b81356130b284826020860161304b565b91505092915050565b6000602082840312156130d1576130d0612bb7565b5b600082013567ffffffffffffffff8111156130ef576130ee612bbc565b5b6130fb8482850161308d565b91505092915050565b61310d81612c46565b811461311857600080fd5b50565b60008135905061312a81613104565b92915050565b6000806040838503121561314757613146612bb7565b5b600061315585828601612e0d565b92505060206131668582860161311b565b9150509250929050565b600067ffffffffffffffff82111561318b5761318a612f90565b5b61319482612ccb565b9050602081019050919050565b60006131b46131af84613170565b612ff0565b9050828152602081018484840111156131d0576131cf612f8b565b5b6131db84828561303c565b509392505050565b600082601f8301126131f8576131f7612f86565b5b81356132088482602086016131a1565b91505092915050565b6000806000806080858703121561322b5761322a612bb7565b5b600061323987828801612e0d565b945050602061324a87828801612e0d565b935050604061325b87828801612d58565b925050606085013567ffffffffffffffff81111561327c5761327b612bbc565b5b613288878288016131e3565b91505092959194509250565b600067ffffffffffffffff8211156132af576132ae612f90565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b6132d8816132c5565b81146132e357600080fd5b50565b6000813590506132f5816132cf565b92915050565b600061330e61330984613294565b612ff0565b90508083825260208201905060208402830185811115613331576133306132c0565b5b835b8181101561335a578061334688826132e6565b845260208401935050602081019050613333565b5050509392505050565b600082601f83011261337957613378612f86565b5b81356133898482602086016132fb565b91505092915050565b600080604083850312156133a9576133a8612bb7565b5b600083013567ffffffffffffffff8111156133c7576133c6612bbc565b5b6133d385828601613364565b92505060206133e4858286016132e6565b9150509250929050565b600080fd5b60008083601f84011261340957613408612f86565b5b8235905067ffffffffffffffff811115613426576134256133ee565b5b602083019150836020820283011115613442576134416132c0565b5b9250929050565b60008060006040848603121561346257613461612bb7565b5b600084013567ffffffffffffffff8111156134805761347f612bbc565b5b61348c868287016133f3565b9350935050602061349f86828701612d58565b9150509250925092565b600080604083850312156134c0576134bf612bb7565b5b60006134ce85828601612d58565b925050602083013567ffffffffffffffff8111156134ef576134ee612bbc565b5b6134fb85828601613364565b9150509250929050565b60006020828403121561351b5761351a612bb7565b5b6000613529848285016132e6565b91505092915050565b6000806040838503121561354957613548612bb7565b5b600061355785828601612e0d565b925050602061356885828601612e0d565b9150509250929050565b61357b816132c5565b82525050565b60006020820190506135966000830184613572565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806135e357607f821691505b6020821081036135f6576135f561359c565b5b50919050565b7f5075626c6963206d696e742069732063757272656e746c792070617573656400600082015250565b6000613632601f83612c87565b915061363d826135fc565b602082019050919050565b6000602082019050818103600083015261366181613625565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006136a282612d37565b91506136ad83612d37565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156136e2576136e1613668565b5b828201905092915050565b7f4572726f723a206d617820737570706c79207265616368656400000000000000600082015250565b6000613723601983612c87565b915061372e826136ed565b602082019050919050565b6000602082019050818103600083015261375281613716565b9050919050565b7f4572726f723a204d617820616c6c6f636174696f6e2072656163686564000000600082015250565b600061378f601d83612c87565b915061379a82613759565b602082019050919050565b600060208201905081810360008301526137be81613782565b9050919050565b60006137d082612d37565b91506137db83612d37565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561381457613813613668565b5b828202905092915050565b7f4e6f7420656e6f7567682065746865722073656e740000000000000000000000600082015250565b6000613855601583612c87565b91506138608261381f565b602082019050919050565b6000602082019050818103600083015261388481613848565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006138c582612d37565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036138f7576138f6613668565b5b600182019050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061395e602f83612c87565b915061396982613902565b604082019050919050565b6000602082019050818103600083015261398d81613951565b9050919050565b600081905092915050565b60006139aa82612c7c565b6139b48185613994565b93506139c4818560208601612c98565b80840191505092915050565b60008190508160005260206000209050919050565b600081546139f2816135cb565b6139fc8186613994565b94506001821660008114613a175760018114613a2857613a5b565b60ff19831686528186019350613a5b565b613a31856139d0565b60005b83811015613a5357815481890152600182019150602081019050613a34565b838801955050505b50505092915050565b6000613a70828661399f565b9150613a7c828561399f565b9150613a8882846139e5565b9150819050949350505050565b60008160601b9050919050565b6000613aad82613a95565b9050919050565b6000613abf82613aa2565b9050919050565b613ad7613ad282612dba565b613ab4565b82525050565b6000613ae98284613ac6565b60148201915081905092915050565b7f4e6f74206f6e207468652077686974656c697374000000000000000000000000600082015250565b6000613b2e601483612c87565b9150613b3982613af8565b602082019050919050565b60006020820190508181036000830152613b5d81613b21565b9050919050565b7f57686974656c697374206d696e742069732063757272656e746c79207061757360008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b6000613bc0602283612c87565b9150613bcb82613b64565b604082019050919050565b60006020820190508181036000830152613bef81613bb3565b9050919050565b7f4572726f723a204d617820737570706c79207265616368656400000000000000600082015250565b6000613c2c601983612c87565b9150613c3782613bf6565b602082019050919050565b60006020820190508181036000830152613c5b81613c1f565b9050919050565b7f4572726f723a204d617820574c20616c6c6f636174696f6e2072656163686564600082015250565b6000613c98602083612c87565b9150613ca382613c62565b602082019050919050565b60006020820190508181036000830152613cc781613c8b565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613d2a602683612c87565b9150613d3582613cce565b604082019050919050565b60006020820190508181036000830152613d5981613d1d565b9050919050565b6000604082019050613d756000830185612dcc565b613d826020830184612dcc565b9392505050565b600081519050613d9881613104565b92915050565b600060208284031215613db457613db3612bb7565b5b6000613dc284828501613d89565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613e01602083612c87565b9150613e0c82613dcb565b602082019050919050565b60006020820190508181036000830152613e3081613df4565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000613e6d601083612c87565b9150613e7882613e37565b602082019050919050565b60006020820190508181036000830152613e9c81613e60565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613ed9601f83612c87565b9150613ee482613ea3565b602082019050919050565b60006020820190508181036000830152613f0881613ecc565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000613f45601483612c87565b9150613f5082613f0f565b602082019050919050565b60006020820190508181036000830152613f7481613f38565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613fa282613f7b565b613fac8185613f86565b9350613fbc818560208601612c98565b613fc581612ccb565b840191505092915050565b6000608082019050613fe56000830187612dcc565b613ff26020830186612dcc565b613fff6040830185612e62565b81810360608301526140118184613f97565b905095945050505050565b60008151905061402b81612bed565b92915050565b60006020828403121561404757614046612bb7565b5b60006140558482850161401c565b9150509291505056fea2646970667358221220007e25fad3bfe5899d709b88ae45753d6a5643a9fe71e2c85aa0afd5bbac962164736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000401b287adc001c33dd3e6e5c22f7d33783de05190d2628532af3cbd317857437d10000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5634656e62484d4d7250754d353548397546365662464e7257734850646746386557614c5464436e47706b742f00000000000000000000
-----Decoded View---------------
Arg [0] : _initBaseURI (string): ipfs://QmV4enbHMMrPuM55H9uF6VbFNrWsHPdgF8eWaLTdCnGpkt/
Arg [1] : _root (bytes32): 0x1b287adc001c33dd3e6e5c22f7d33783de05190d2628532af3cbd317857437d1
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 1b287adc001c33dd3e6e5c22f7d33783de05190d2628532af3cbd317857437d1
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [3] : 697066733a2f2f516d5634656e62484d4d7250754d353548397546365662464e
Arg [4] : 7257734850646746386557614c5464436e47706b742f00000000000000000000
Deployed Bytecode Sourcemap
81277:7185:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84840:195;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49066:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55557:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85879:159;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81812:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81853:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44817:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82001:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86046:205;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;87386:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81631:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83953:528;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81522:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88330:125;;;;;;;;;;;;;:::i;:::-;;87708:77;;;;;;;;;;;;;:::i;:::-;;86914:116;;;;;;;;;;;;;:::i;:::-;;7681:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86259:213;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;87797:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28778:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50459:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81558:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81748:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88028:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46001:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26288:103;;;;;;;;;;;;;:::i;:::-;;87492:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;87622:74;;;;;;;;;;;;;:::i;:::-;;25640:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87264:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;87150:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49242:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87038;;;;;;;;;;;;;:::i;:::-;;85695:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;86480:247;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83623:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82281:289;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81707:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85074:427;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82757:682;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81487:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87923:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81599:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56506:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82076:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81951:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26546:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84840:195;84962:4;84991:36;85015:11;84991:23;:36::i;:::-;84984:43;;84840:195;;;:::o;49066:100::-;49120:13;49153:5;49146:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49066:100;:::o;55557:218::-;55633:7;55658:16;55666:7;55658;:16::i;:::-;55653:64;;55683:34;;;;;;;;;;;;;;55653:64;55737:15;:24;55753:7;55737:24;;;;;;;;;;;:30;;;;;;;;;;;;55730:37;;55557:218;;;:::o;85879:159::-;85983:8;9463:30;9484:8;9463:20;:30::i;:::-;86000:32:::1;86014:8;86024:7;86000:13;:32::i;:::-;85879:159:::0;;;:::o;81812:37::-;;;;;;;;;;;;;:::o;81853:33::-;;;;;;;;;;;;;:::o;44817:323::-;44878:7;45106:15;:13;:15::i;:::-;45091:12;;45075:13;;:28;:46;45068:53;;44817:323;:::o;82001:50::-;;;;;;;;;;;;;;;;;:::o;86046:205::-;86189:4;9197:10;9189:18;;:4;:18;;;9185:83;;9224:32;9245:10;9224:20;:32::i;:::-;9185:83;86206:37:::1;86225:4;86231:2;86235:7;86206:18;:37::i;:::-;86046:205:::0;;;;:::o;87386:94::-;25526:13;:11;:13::i;:::-;87462:10:::1;87450:9;:22;;;;87386:94:::0;:::o;81631:39::-;;;;:::o;83953:528::-;28383:19;:17;:19::i;:::-;22911:21:::1;:19;:21::i;:::-;84054:17:::2;;;;;;;;;;;84046:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;84152:9;;84139;84123:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:38;;84115:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;84252:13;;84238:9;84208:15;:27;84224:10;84208:27;;;;;;;;;;;;;;;;:39;;;;:::i;:::-;84207:58;;84199:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;84341:9;;84329;:21;;;;:::i;:::-;84315:9;:36;;84307:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;84421:9;84390:15;:27;84406:10;84390:27;;;;;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;;;;;;;84441:32;84451:10;84463:9;84441;:32::i;:::-;22955:20:::1;:18;:20::i;:::-;83953:528:::0;:::o;81522:32::-;;;;:::o;88330:125::-;25526:13;:11;:13::i;:::-;22911:21:::1;:19;:21::i;:::-;88407:7:::2;:5;:7::i;:::-;88399:25;;:48;88425:21;88399:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;22955:20:::1;:18;:20::i;:::-;88330:125::o:0;87708:77::-;25526:13;:11;:13::i;:::-;22911:21:::1;:19;:21::i;:::-;87767:10:::2;:8;:10::i;:::-;22955:20:::1;:18;:20::i;:::-;87708:77::o:0;86914:116::-;25526:13;:11;:13::i;:::-;22911:21:::1;:19;:21::i;:::-;87005:17:::2;;;;;;;;;;;87004:18;86984:17;;:38;;;;;;;;;;;;;;;;;;22955:20:::1;:18;:20::i;:::-;86914:116::o:0;7681:143::-;155:42;7681:143;:::o;86259:213::-;86406:4;9197:10;9189:18;;:4;:18;;;9185:83;;9224:32;9245:10;9224:20;:32::i;:::-;9185:83;86423:41:::1;86446:4;86452:2;86456:7;86423:22;:41::i;:::-;86259:213:::0;;;;:::o;87797:108::-;25526:13;:11;:13::i;:::-;22911:21:::1;:19;:21::i;:::-;87890:7:::2;87880;:17;;;;;;;;;;;;:::i;:::-;;22955:20:::1;:18;:20::i;:::-;87797:108:::0;:::o;28778:86::-;28825:4;28849:7;;;;;;;;;;;28842:14;;28778:86;:::o;50459:152::-;50531:7;50574:27;50593:7;50574:18;:27::i;:::-;50551:52;;50459:152;;;:::o;81558:37::-;;;;:::o;81748:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;88028:115::-;25526:13;:11;:13::i;:::-;22911:21:::1;:19;:21::i;:::-;88125:10:::2;88113:9;:22;;;;22955:20:::1;:18;:20::i;:::-;88028:115:::0;:::o;46001:233::-;46073:7;46114:1;46097:19;;:5;:19;;;46093:60;;46125:28;;;;;;;;;;;;;;46093:60;40160:13;46171:18;:25;46190:5;46171:25;;;;;;;;;;;;;;;;:55;46164:62;;46001:233;;;:::o;26288:103::-;25526:13;:11;:13::i;:::-;26353:30:::1;26380:1;26353:18;:30::i;:::-;26288:103::o:0;87492:110::-;25526:13;:11;:13::i;:::-;87580:14:::1;87564:13;:30;;;;87492:110:::0;:::o;87622:74::-;25526:13;:11;:13::i;:::-;22911:21:::1;:19;:21::i;:::-;87680:8:::2;:6;:8::i;:::-;22955:20:::1;:18;:20::i;:::-;87622:74::o:0;25640:87::-;25686:7;25713:6;;;;;;;;;;;25706:13;;25640:87;:::o;87264:114::-;25526:13;:11;:13::i;:::-;22911:21:::1;:19;:21::i;:::-;87358:12:::2;87344:11;:26;;;;22955:20:::1;:18;:20::i;:::-;87264:114:::0;:::o;87150:106::-;25526:13;:11;:13::i;:::-;22911:21:::1;:19;:21::i;:::-;87238:10:::2;87226:9;:22;;;;22955:20:::1;:18;:20::i;:::-;87150:106:::0;:::o;49242:104::-;49298:13;49331:7;49324:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49242:104;:::o;87038:::-;25526:13;:11;:13::i;:::-;22911:21:::1;:19;:21::i;:::-;87121:13:::2;;;;;;;;;;;87120:14;87104:13;;:30;;;;;;;;;;;;;;;;;;22955:20:::1;:18;:20::i;:::-;87038:104::o:0;85695:176::-;85799:8;9463:30;9484:8;9463:20;:30::i;:::-;85820:43:::1;85844:8;85854;85820:23;:43::i;:::-;85695:176:::0;;;:::o;86480:247::-;86655:4;9197:10;9189:18;;:4;:18;;;9185:83;;9224:32;9245:10;9224:20;:32::i;:::-;9185:83;86672:47:::1;86695:4;86701:2;86705:7;86714:4;86672:22;:47::i;:::-;86480:247:::0;;;;;:::o;83623:138::-;83698:4;83719:37;83738:5;83745:4;;83751;83719:18;:37::i;:::-;83712:44;;83623:138;;;;:::o;82281:289::-;25526:13;:11;:13::i;:::-;22911:21:::1;:19;:21::i;:::-;82421:9:::2;;82410:7;82394:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:36;;82386:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;82475:6;82470:95;82491:8;;:15;;82487:1;:19;82470:95;;;82525:31;82535:8;;82544:1;82535:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;82548:7;82525:9;:31::i;:::-;82508:3;;;;;:::i;:::-;;;;82470:95;;;;22955:20:::1;:18;:20::i;:::-;82281:289:::0;;;:::o;81707:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;85074:427::-;85172:13;85207:16;85215:7;85207;:16::i;:::-;85199:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;85291:28;85322:10;:8;:10::i;:::-;85291:41;;85381:1;85356:14;85350:28;:32;:133;;;;;;;;;;;;;;;;;85418:14;85434:18;85444:7;85434:9;:18::i;:::-;85454:13;85401:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;85350:133;85343:140;;;85074:427;;;:::o;82757:682::-;28383:19;:17;:19::i;:::-;22911:21:::1;:19;:21::i;:::-;82900:55:::2;82908:5;82942:10;82925:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;82915:39;;;;;;82900:7;:55::i;:::-;82892:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;83000:13;;;;;;;;;;;82992:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;83101:9;;83088;83072:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:38;;83064:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;83201:9;;83187;83161:11;:23;83173:10;83161:23;;;;;;;;;;;;;;;;:35;;;;:::i;:::-;83160:50;;83152:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;83293:11;;83281:9;:23;;;;:::i;:::-;83267:9;:38;;83259:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;83372:9;83345:11;:23;83357:10;83345:23;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;83393:32;83403:10;83415:9;83393;:32::i;:::-;22955:20:::1;:18;:20::i;:::-;82757:682:::0;;:::o;81487:31::-;;;;:::o;87923:93::-;25526:13;:11;:13::i;:::-;22911:21:::1;:19;:21::i;:::-;88003:5:::2;87996:4;:12;;;;22955:20:::1;:18;:20::i;:::-;87923:93:::0;:::o;81599:28::-;;;;:::o;56506:164::-;56603:4;56627:18;:25;56646:5;56627:25;;;;;;;;;;;;;;;:35;56653:8;56627:35;;;;;;;;;;;;;;;;;;;;;;;;;56620:42;;56506:164;;;;:::o;82076:19::-;;;;:::o;81951:46::-;;;;;;;;;;;;;;;;;:::o;26546:201::-;25526:13;:11;:13::i;:::-;26655:1:::1;26635:22;;:8;:22;;::::0;26627:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;26711:28;26730:8;26711:18;:28::i;:::-;26546:201:::0;:::o;48164:639::-;48249:4;48588:10;48573:25;;:11;:25;;;;:102;;;;48665:10;48650:25;;:11;:25;;;;48573:102;:179;;;;48742:10;48727:25;;:11;:25;;;;48573:179;48553:199;;48164:639;;;:::o;56928:282::-;56993:4;57049:7;57030:15;:13;:15::i;:::-;:26;;:66;;;;;57083:13;;57073:7;:23;57030:66;:153;;;;;57182:1;40936:8;57134:17;:26;57152:7;57134:26;;;;;;;;;;;;:44;:49;57030:153;57010:173;;56928:282;;;:::o;9606:647::-;9845:1;155:42;9797:45;;;:49;9793:453;;;155:42;10096;;;10147:4;10154:8;10096:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10091:144;;10210:8;10191:28;;;;;;;;;;;:::i;:::-;;;;;;;;10091:144;9793:453;9606:647;:::o;54990:408::-;55079:13;55095:16;55103:7;55095;:16::i;:::-;55079:32;;55151:5;55128:28;;:19;:17;:19::i;:::-;:28;;;55124:175;;55176:44;55193:5;55200:19;:17;:19::i;:::-;55176:16;:44::i;:::-;55171:128;;55248:35;;;;;;;;;;;;;;55171:128;55124:175;55344:2;55311:15;:24;55327:7;55311:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;55382:7;55378:2;55362:28;;55371:5;55362:28;;;;;;;;;;;;55068:330;54990:408;;:::o;84731:101::-;84796:7;84823:1;84816:8;;84731:101;:::o;59196:2825::-;59338:27;59368;59387:7;59368:18;:27::i;:::-;59338:57;;59453:4;59412:45;;59428:19;59412:45;;;59408:86;;59466:28;;;;;;;;;;;;;;59408:86;59508:27;59537:23;59564:35;59591:7;59564:26;:35::i;:::-;59507:92;;;;59699:68;59724:15;59741:4;59747:19;:17;:19::i;:::-;59699:24;:68::i;:::-;59694:180;;59787:43;59804:4;59810:19;:17;:19::i;:::-;59787:16;:43::i;:::-;59782:92;;59839:35;;;;;;;;;;;;;;59782:92;59694:180;59905:1;59891:16;;:2;:16;;;59887:52;;59916:23;;;;;;;;;;;;;;59887:52;59952:43;59974:4;59980:2;59984:7;59993:1;59952:21;:43::i;:::-;60088:15;60085:160;;;60228:1;60207:19;60200:30;60085:160;60625:18;:24;60644:4;60625:24;;;;;;;;;;;;;;;;60623:26;;;;;;;;;;;;60694:18;:22;60713:2;60694:22;;;;;;;;;;;;;;;;60692:24;;;;;;;;;;;61016:146;61053:2;61102:45;61117:4;61123:2;61127:19;61102:14;:45::i;:::-;41216:8;61074:73;61016:18;:146::i;:::-;60987:17;:26;61005:7;60987:26;;;;;;;;;;;:175;;;;61333:1;41216:8;61282:19;:47;:52;61278:627;;61355:19;61387:1;61377:7;:11;61355:33;;61544:1;61510:17;:30;61528:11;61510:30;;;;;;;;;;;;:35;61506:384;;61648:13;;61633:11;:28;61629:242;;61828:19;61795:17;:30;61813:11;61795:30;;;;;;;;;;;:52;;;;61629:242;61506:384;61336:569;61278:627;61952:7;61948:2;61933:27;;61942:4;61933:27;;;;;;;;;;;;61971:42;61992:4;61998:2;62002:7;62011:1;61971:20;:42::i;:::-;59327:2694;;;59196:2825;;;:::o;25805:132::-;25880:12;:10;:12::i;:::-;25869:23;;:7;:5;:7::i;:::-;:23;;;25861:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25805:132::o;28937:108::-;29008:8;:6;:8::i;:::-;29007:9;28999:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;28937:108::o;22991:293::-;22393:1;23125:7;;:19;23117:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;22393:1;23258:7;:18;;;;22991:293::o;73068:112::-;73145:27;73155:2;73159:8;73145:27;;;;;;;;;;;;:9;:27::i;:::-;73068:112;;:::o;23292:213::-;22349:1;23475:7;:22;;;;23292:213::o;29633:120::-;28642:16;:14;:16::i;:::-;29702:5:::1;29692:7;;:15;;;;;;;;;;;;;;;;;;29723:22;29732:12;:10;:12::i;:::-;29723:22;;;;;;:::i;:::-;;;;;;;;29633:120::o:0;62117:193::-;62263:39;62280:4;62286:2;62290:7;62263:39;;;;;;;;;;;;:16;:39::i;:::-;62117:193;;;:::o;51614:1275::-;51681:7;51701:12;51716:7;51701:22;;51784:4;51765:15;:13;:15::i;:::-;:23;51761:1061;;51818:13;;51811:4;:20;51807:1015;;;51856:14;51873:17;:23;51891:4;51873:23;;;;;;;;;;;;51856:40;;51990:1;40936:8;51962:6;:24;:29;51958:845;;52627:113;52644:1;52634:6;:11;52627:113;;52687:17;:25;52705:6;;;;;;;52687:25;;;;;;;;;;;;52678:34;;52627:113;;;52773:6;52766:13;;;;;;51958:845;51833:989;51807:1015;51761:1061;52850:31;;;;;;;;;;;;;;51614:1275;;;;:::o;26907:191::-;26981:16;27000:6;;;;;;;;;;;26981:25;;27026:8;27017:6;;:17;;;;;;;;;;;;;;;;;;27081:8;27050:40;;27071:8;27050:40;;;;;;;;;;;;26970:128;26907:191;:::o;29374:118::-;28383:19;:17;:19::i;:::-;29444:4:::1;29434:7;;:14;;;;;;;;;;;;;;;;;;29464:20;29471:12;:10;:12::i;:::-;29464:20;;;;;;:::i;:::-;;;;;;;;29374:118::o:0;56115:234::-;56262:8;56210:18;:39;56229:19;:17;:19::i;:::-;56210:39;;;;;;;;;;;;;;;:49;56250:8;56210:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;56322:8;56286:55;;56301:19;:17;:19::i;:::-;56286:55;;;56332:8;56286:55;;;;;;:::i;:::-;;;;;;;;56115:234;;:::o;62908:407::-;63083:31;63096:4;63102:2;63106:7;63083:12;:31::i;:::-;63147:1;63129:2;:14;;;:19;63125:183;;63168:56;63199:4;63205:2;63209:7;63218:5;63168:30;:56::i;:::-;63163:145;;63252:40;;;;;;;;;;;;;;63163:145;63125:183;62908:407;;;;:::o;12227:190::-;12352:4;12405;12376:25;12389:5;12396:4;12376:12;:25::i;:::-;:33;12369:40;;12227:190;;;;;:::o;84548:108::-;84608:13;84641:7;84634:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84548:108;:::o;79443:1745::-;79508:17;79942:4;79935;79929:11;79925:22;80034:1;80028:4;80021:15;80109:4;80106:1;80102:12;80095:19;;80191:1;80186:3;80179:14;80295:3;80534:5;80516:428;80542:1;80516:428;;;80582:1;80577:3;80573:11;80566:18;;80753:2;80747:4;80743:13;80739:2;80735:22;80730:3;80722:36;80847:2;80841:4;80837:13;80829:21;;80914:4;80516:428;80904:25;80516:428;80520:21;80983:3;80978;80974:13;81098:4;81093:3;81089:14;81082:21;;81163:6;81158:3;81151:19;79547:1634;;;79443:1745;;;:::o;79236:105::-;79296:7;79323:10;79316:17;;79236:105;:::o;58091:485::-;58193:27;58222:23;58263:38;58304:15;:24;58320:7;58304:24;;;;;;;;;;;58263:65;;58481:18;58458:41;;58538:19;58532:26;58513:45;;58443:126;58091:485;;;:::o;57319:659::-;57468:11;57633:16;57626:5;57622:28;57613:37;;57793:16;57782:9;57778:32;57765:45;;57943:15;57932:9;57929:30;57921:5;57910:9;57907:20;57904:56;57894:66;;57319:659;;;;;:::o;63977:159::-;;;;;:::o;78545:311::-;78680:7;78700:16;41340:3;78726:19;:41;;78700:68;;41340:3;78794:31;78805:4;78811:2;78815:9;78794:10;:31::i;:::-;78786:40;;:62;;78779:69;;;78545:311;;;;;:::o;53437:450::-;53517:14;53685:16;53678:5;53674:28;53665:37;;53862:5;53848:11;53823:23;53819:41;53816:52;53809:5;53806:63;53796:73;;53437:450;;;;:::o;64801:158::-;;;;;:::o;24191:98::-;24244:7;24271:10;24264:17;;24191:98;:::o;72295:689::-;72426:19;72432:2;72436:8;72426:5;:19::i;:::-;72505:1;72487:2;:14;;;:19;72483:483;;72527:11;72541:13;;72527:27;;72573:13;72595:8;72589:3;:14;72573:30;;72622:233;72653:62;72692:1;72696:2;72700:7;;;;;;72709:5;72653:30;:62::i;:::-;72648:167;;72751:40;;;;;;;;;;;;;;72648:167;72850:3;72842:5;:11;72622:233;;72937:3;72920:13;;:20;72916:34;;72942:8;;;72916:34;72508:458;;72483:483;72295:689;;;:::o;29122:108::-;29189:8;:6;:8::i;:::-;29181:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;29122:108::o;65399:716::-;65562:4;65608:2;65583:45;;;65629:19;:17;:19::i;:::-;65650:4;65656:7;65665:5;65583:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;65579:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65883:1;65866:6;:13;:18;65862:235;;65912:40;;;;;;;;;;;;;;65862:235;66055:6;66049:13;66040:6;66036:2;66032:15;66025:38;65579:529;65752:54;;;65742:64;;;:6;:64;;;;65735:71;;;65399:716;;;;;;:::o;13094:296::-;13177:7;13197:20;13220:4;13197:27;;13240:9;13235:118;13259:5;:12;13255:1;:16;13235:118;;;13308:33;13318:12;13332:5;13338:1;13332:8;;;;;;;;:::i;:::-;;;;;;;;13308:9;:33::i;:::-;13293:48;;13273:3;;;;;:::i;:::-;;;;13235:118;;;;13370:12;13363:19;;;13094:296;;;;:::o;78246:147::-;78383:6;78246:147;;;;;:::o;66577:2966::-;66650:20;66673:13;;66650:36;;66713:1;66701:8;:13;66697:44;;66723:18;;;;;;;;;;;;;;66697:44;66754:61;66784:1;66788:2;66792:12;66806:8;66754:21;:61::i;:::-;67298:1;40298:2;67268:1;:26;;67267:32;67255:8;:45;67229:18;:22;67248:2;67229:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;67577:139;67614:2;67668:33;67691:1;67695:2;67699:1;67668:14;:33::i;:::-;67635:30;67656:8;67635:20;:30::i;:::-;:66;67577:18;:139::i;:::-;67543:17;:31;67561:12;67543:31;;;;;;;;;;;:173;;;;67733:16;67764:11;67793:8;67778:12;:23;67764:37;;68314:16;68310:2;68306:25;68294:37;;68686:12;68646:8;68605:1;68543:25;68484:1;68423;68396:335;69057:1;69043:12;69039:20;68997:346;69098:3;69089:7;69086:16;68997:346;;69316:7;69306:8;69303:1;69276:25;69273:1;69270;69265:59;69151:1;69142:7;69138:15;69127:26;;68997:346;;;69001:77;69388:1;69376:8;:13;69372:45;;69398:19;;;;;;;;;;;;;;69372:45;69450:3;69434:13;:19;;;;67003:2462;;69475:60;69504:1;69508:2;69512:12;69526:8;69475:20;:60::i;:::-;66639:2904;66577:2966;;:::o;20134:149::-;20197:7;20228:1;20224;:5;:51;;20255:20;20270:1;20273;20255:14;:20::i;:::-;20224:51;;;20232:20;20247:1;20250;20232:14;:20::i;:::-;20224:51;20217:58;;20134:149;;;;:::o;53989:324::-;54059:14;54292:1;54282:8;54279:15;54253:24;54249:46;54239:56;;53989:324;;;:::o;20291:268::-;20359:13;20466:1;20460:4;20453:15;20495:1;20489:4;20482:15;20536:4;20530;20520:21;20511:30;;20291:268;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:329::-;5349:6;5398:2;5386:9;5377:7;5373:23;5369:32;5366:119;;;5404:79;;:::i;:::-;5366:119;5524:1;5549:53;5594:7;5585:6;5574:9;5570:22;5549:53;:::i;:::-;5539:63;;5495:117;5290:329;;;;:::o;5625:619::-;5702:6;5710;5718;5767:2;5755:9;5746:7;5742:23;5738:32;5735:119;;;5773:79;;:::i;:::-;5735:119;5893:1;5918:53;5963:7;5954:6;5943:9;5939:22;5918:53;:::i;:::-;5908:63;;5864:117;6020:2;6046:53;6091:7;6082:6;6071:9;6067:22;6046:53;:::i;:::-;6036:63;;5991:118;6148:2;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6119:118;5625:619;;;;;:::o;6250:60::-;6278:3;6299:5;6292:12;;6250:60;;;:::o;6316:142::-;6366:9;6399:53;6417:34;6426:24;6444:5;6426:24;:::i;:::-;6417:34;:::i;:::-;6399:53;:::i;:::-;6386:66;;6316:142;;;:::o;6464:126::-;6514:9;6547:37;6578:5;6547:37;:::i;:::-;6534:50;;6464:126;;;:::o;6596:157::-;6677:9;6710:37;6741:5;6710:37;:::i;:::-;6697:50;;6596:157;;;:::o;6759:193::-;6877:68;6939:5;6877:68;:::i;:::-;6872:3;6865:81;6759:193;;:::o;6958:284::-;7082:4;7120:2;7109:9;7105:18;7097:26;;7133:102;7232:1;7221:9;7217:17;7208:6;7133:102;:::i;:::-;6958:284;;;;:::o;7248:117::-;7357:1;7354;7347:12;7371:117;7480:1;7477;7470:12;7494:180;7542:77;7539:1;7532:88;7639:4;7636:1;7629:15;7663:4;7660:1;7653:15;7680:281;7763:27;7785:4;7763:27;:::i;:::-;7755:6;7751:40;7893:6;7881:10;7878:22;7857:18;7845:10;7842:34;7839:62;7836:88;;;7904:18;;:::i;:::-;7836:88;7944:10;7940:2;7933:22;7723:238;7680:281;;:::o;7967:129::-;8001:6;8028:20;;:::i;:::-;8018:30;;8057:33;8085:4;8077:6;8057:33;:::i;:::-;7967:129;;;:::o;8102:308::-;8164:4;8254:18;8246:6;8243:30;8240:56;;;8276:18;;:::i;:::-;8240:56;8314:29;8336:6;8314:29;:::i;:::-;8306:37;;8398:4;8392;8388:15;8380:23;;8102:308;;;:::o;8416:154::-;8500:6;8495:3;8490;8477:30;8562:1;8553:6;8548:3;8544:16;8537:27;8416:154;;;:::o;8576:412::-;8654:5;8679:66;8695:49;8737:6;8695:49;:::i;:::-;8679:66;:::i;:::-;8670:75;;8768:6;8761:5;8754:21;8806:4;8799:5;8795:16;8844:3;8835:6;8830:3;8826:16;8823:25;8820:112;;;8851:79;;:::i;:::-;8820:112;8941:41;8975:6;8970:3;8965;8941:41;:::i;:::-;8660:328;8576:412;;;;;:::o;9008:340::-;9064:5;9113:3;9106:4;9098:6;9094:17;9090:27;9080:122;;9121:79;;:::i;:::-;9080:122;9238:6;9225:20;9263:79;9338:3;9330:6;9323:4;9315:6;9311:17;9263:79;:::i;:::-;9254:88;;9070:278;9008:340;;;;:::o;9354:509::-;9423:6;9472:2;9460:9;9451:7;9447:23;9443:32;9440:119;;;9478:79;;:::i;:::-;9440:119;9626:1;9615:9;9611:17;9598:31;9656:18;9648:6;9645:30;9642:117;;;9678:79;;:::i;:::-;9642:117;9783:63;9838:7;9829:6;9818:9;9814:22;9783:63;:::i;:::-;9773:73;;9569:287;9354:509;;;;:::o;9869:116::-;9939:21;9954:5;9939:21;:::i;:::-;9932:5;9929:32;9919:60;;9975:1;9972;9965:12;9919:60;9869:116;:::o;9991:133::-;10034:5;10072:6;10059:20;10050:29;;10088:30;10112:5;10088:30;:::i;:::-;9991:133;;;;:::o;10130:468::-;10195:6;10203;10252:2;10240:9;10231:7;10227:23;10223:32;10220:119;;;10258:79;;:::i;:::-;10220:119;10378:1;10403:53;10448:7;10439:6;10428:9;10424:22;10403:53;:::i;:::-;10393:63;;10349:117;10505:2;10531:50;10573:7;10564:6;10553:9;10549:22;10531:50;:::i;:::-;10521:60;;10476:115;10130:468;;;;;:::o;10604:307::-;10665:4;10755:18;10747:6;10744:30;10741:56;;;10777:18;;:::i;:::-;10741:56;10815:29;10837:6;10815:29;:::i;:::-;10807:37;;10899:4;10893;10889:15;10881:23;;10604:307;;;:::o;10917:410::-;10994:5;11019:65;11035:48;11076:6;11035:48;:::i;:::-;11019:65;:::i;:::-;11010:74;;11107:6;11100:5;11093:21;11145:4;11138:5;11134:16;11183:3;11174:6;11169:3;11165:16;11162:25;11159:112;;;11190:79;;:::i;:::-;11159:112;11280:41;11314:6;11309:3;11304;11280:41;:::i;:::-;11000:327;10917:410;;;;;:::o;11346:338::-;11401:5;11450:3;11443:4;11435:6;11431:17;11427:27;11417:122;;11458:79;;:::i;:::-;11417:122;11575:6;11562:20;11600:78;11674:3;11666:6;11659:4;11651:6;11647:17;11600:78;:::i;:::-;11591:87;;11407:277;11346:338;;;;:::o;11690:943::-;11785:6;11793;11801;11809;11858:3;11846:9;11837:7;11833:23;11829:33;11826:120;;;11865:79;;:::i;:::-;11826:120;11985:1;12010:53;12055:7;12046:6;12035:9;12031:22;12010:53;:::i;:::-;12000:63;;11956:117;12112:2;12138:53;12183:7;12174:6;12163:9;12159:22;12138:53;:::i;:::-;12128:63;;12083:118;12240:2;12266:53;12311:7;12302:6;12291:9;12287:22;12266:53;:::i;:::-;12256:63;;12211:118;12396:2;12385:9;12381:18;12368:32;12427:18;12419:6;12416:30;12413:117;;;12449:79;;:::i;:::-;12413:117;12554:62;12608:7;12599:6;12588:9;12584:22;12554:62;:::i;:::-;12544:72;;12339:287;11690:943;;;;;;;:::o;12639:311::-;12716:4;12806:18;12798:6;12795:30;12792:56;;;12828:18;;:::i;:::-;12792:56;12878:4;12870:6;12866:17;12858:25;;12938:4;12932;12928:15;12920:23;;12639:311;;;:::o;12956:117::-;13065:1;13062;13055:12;13079:77;13116:7;13145:5;13134:16;;13079:77;;;:::o;13162:122::-;13235:24;13253:5;13235:24;:::i;:::-;13228:5;13225:35;13215:63;;13274:1;13271;13264:12;13215:63;13162:122;:::o;13290:139::-;13336:5;13374:6;13361:20;13352:29;;13390:33;13417:5;13390:33;:::i;:::-;13290:139;;;;:::o;13452:710::-;13548:5;13573:81;13589:64;13646:6;13589:64;:::i;:::-;13573:81;:::i;:::-;13564:90;;13674:5;13703:6;13696:5;13689:21;13737:4;13730:5;13726:16;13719:23;;13790:4;13782:6;13778:17;13770:6;13766:30;13819:3;13811:6;13808:15;13805:122;;;13838:79;;:::i;:::-;13805:122;13953:6;13936:220;13970:6;13965:3;13962:15;13936:220;;;14045:3;14074:37;14107:3;14095:10;14074:37;:::i;:::-;14069:3;14062:50;14141:4;14136:3;14132:14;14125:21;;14012:144;13996:4;13991:3;13987:14;13980:21;;13936:220;;;13940:21;13554:608;;13452:710;;;;;:::o;14185:370::-;14256:5;14305:3;14298:4;14290:6;14286:17;14282:27;14272:122;;14313:79;;:::i;:::-;14272:122;14430:6;14417:20;14455:94;14545:3;14537:6;14530:4;14522:6;14518:17;14455:94;:::i;:::-;14446:103;;14262:293;14185:370;;;;:::o;14561:684::-;14654:6;14662;14711:2;14699:9;14690:7;14686:23;14682:32;14679:119;;;14717:79;;:::i;:::-;14679:119;14865:1;14854:9;14850:17;14837:31;14895:18;14887:6;14884:30;14881:117;;;14917:79;;:::i;:::-;14881:117;15022:78;15092:7;15083:6;15072:9;15068:22;15022:78;:::i;:::-;15012:88;;14808:302;15149:2;15175:53;15220:7;15211:6;15200:9;15196:22;15175:53;:::i;:::-;15165:63;;15120:118;14561:684;;;;;:::o;15251:117::-;15360:1;15357;15350:12;15391:568;15464:8;15474:6;15524:3;15517:4;15509:6;15505:17;15501:27;15491:122;;15532:79;;:::i;:::-;15491:122;15645:6;15632:20;15622:30;;15675:18;15667:6;15664:30;15661:117;;;15697:79;;:::i;:::-;15661:117;15811:4;15803:6;15799:17;15787:29;;15865:3;15857:4;15849:6;15845:17;15835:8;15831:32;15828:41;15825:128;;;15872:79;;:::i;:::-;15825:128;15391:568;;;;;:::o;15965:704::-;16060:6;16068;16076;16125:2;16113:9;16104:7;16100:23;16096:32;16093:119;;;16131:79;;:::i;:::-;16093:119;16279:1;16268:9;16264:17;16251:31;16309:18;16301:6;16298:30;16295:117;;;16331:79;;:::i;:::-;16295:117;16444:80;16516:7;16507:6;16496:9;16492:22;16444:80;:::i;:::-;16426:98;;;;16222:312;16573:2;16599:53;16644:7;16635:6;16624:9;16620:22;16599:53;:::i;:::-;16589:63;;16544:118;15965:704;;;;;:::o;16675:684::-;16768:6;16776;16825:2;16813:9;16804:7;16800:23;16796:32;16793:119;;;16831:79;;:::i;:::-;16793:119;16951:1;16976:53;17021:7;17012:6;17001:9;16997:22;16976:53;:::i;:::-;16966:63;;16922:117;17106:2;17095:9;17091:18;17078:32;17137:18;17129:6;17126:30;17123:117;;;17159:79;;:::i;:::-;17123:117;17264:78;17334:7;17325:6;17314:9;17310:22;17264:78;:::i;:::-;17254:88;;17049:303;16675:684;;;;;:::o;17365:329::-;17424:6;17473:2;17461:9;17452:7;17448:23;17444:32;17441:119;;;17479:79;;:::i;:::-;17441:119;17599:1;17624:53;17669:7;17660:6;17649:9;17645:22;17624:53;:::i;:::-;17614:63;;17570:117;17365:329;;;;:::o;17700:474::-;17768:6;17776;17825:2;17813:9;17804:7;17800:23;17796:32;17793:119;;;17831:79;;:::i;:::-;17793:119;17951:1;17976:53;18021:7;18012:6;18001:9;17997:22;17976:53;:::i;:::-;17966:63;;17922:117;18078:2;18104:53;18149:7;18140:6;18129:9;18125:22;18104:53;:::i;:::-;18094:63;;18049:118;17700:474;;;;;:::o;18180:118::-;18267:24;18285:5;18267:24;:::i;:::-;18262:3;18255:37;18180:118;;:::o;18304:222::-;18397:4;18435:2;18424:9;18420:18;18412:26;;18448:71;18516:1;18505:9;18501:17;18492:6;18448:71;:::i;:::-;18304:222;;;;:::o;18532:180::-;18580:77;18577:1;18570:88;18677:4;18674:1;18667:15;18701:4;18698:1;18691:15;18718:320;18762:6;18799:1;18793:4;18789:12;18779:22;;18846:1;18840:4;18836:12;18867:18;18857:81;;18923:4;18915:6;18911:17;18901:27;;18857:81;18985:2;18977:6;18974:14;18954:18;18951:38;18948:84;;19004:18;;:::i;:::-;18948:84;18769:269;18718:320;;;:::o;19044:181::-;19184:33;19180:1;19172:6;19168:14;19161:57;19044:181;:::o;19231:366::-;19373:3;19394:67;19458:2;19453:3;19394:67;:::i;:::-;19387:74;;19470:93;19559:3;19470:93;:::i;:::-;19588:2;19583:3;19579:12;19572:19;;19231:366;;;:::o;19603:419::-;19769:4;19807:2;19796:9;19792:18;19784:26;;19856:9;19850:4;19846:20;19842:1;19831:9;19827:17;19820:47;19884:131;20010:4;19884:131;:::i;:::-;19876:139;;19603:419;;;:::o;20028:180::-;20076:77;20073:1;20066:88;20173:4;20170:1;20163:15;20197:4;20194:1;20187:15;20214:305;20254:3;20273:20;20291:1;20273:20;:::i;:::-;20268:25;;20307:20;20325:1;20307:20;:::i;:::-;20302:25;;20461:1;20393:66;20389:74;20386:1;20383:81;20380:107;;;20467:18;;:::i;:::-;20380:107;20511:1;20508;20504:9;20497:16;;20214:305;;;;:::o;20525:175::-;20665:27;20661:1;20653:6;20649:14;20642:51;20525:175;:::o;20706:366::-;20848:3;20869:67;20933:2;20928:3;20869:67;:::i;:::-;20862:74;;20945:93;21034:3;20945:93;:::i;:::-;21063:2;21058:3;21054:12;21047:19;;20706:366;;;:::o;21078:419::-;21244:4;21282:2;21271:9;21267:18;21259:26;;21331:9;21325:4;21321:20;21317:1;21306:9;21302:17;21295:47;21359:131;21485:4;21359:131;:::i;:::-;21351:139;;21078:419;;;:::o;21503:179::-;21643:31;21639:1;21631:6;21627:14;21620:55;21503:179;:::o;21688:366::-;21830:3;21851:67;21915:2;21910:3;21851:67;:::i;:::-;21844:74;;21927:93;22016:3;21927:93;:::i;:::-;22045:2;22040:3;22036:12;22029:19;;21688:366;;;:::o;22060:419::-;22226:4;22264:2;22253:9;22249:18;22241:26;;22313:9;22307:4;22303:20;22299:1;22288:9;22284:17;22277:47;22341:131;22467:4;22341:131;:::i;:::-;22333:139;;22060:419;;;:::o;22485:348::-;22525:7;22548:20;22566:1;22548:20;:::i;:::-;22543:25;;22582:20;22600:1;22582:20;:::i;:::-;22577:25;;22770:1;22702:66;22698:74;22695:1;22692:81;22687:1;22680:9;22673:17;22669:105;22666:131;;;22777:18;;:::i;:::-;22666:131;22825:1;22822;22818:9;22807:20;;22485:348;;;;:::o;22839:171::-;22979:23;22975:1;22967:6;22963:14;22956:47;22839:171;:::o;23016:366::-;23158:3;23179:67;23243:2;23238:3;23179:67;:::i;:::-;23172:74;;23255:93;23344:3;23255:93;:::i;:::-;23373:2;23368:3;23364:12;23357:19;;23016:366;;;:::o;23388:419::-;23554:4;23592:2;23581:9;23577:18;23569:26;;23641:9;23635:4;23631:20;23627:1;23616:9;23612:17;23605:47;23669:131;23795:4;23669:131;:::i;:::-;23661:139;;23388:419;;;:::o;23813:180::-;23861:77;23858:1;23851:88;23958:4;23955:1;23948:15;23982:4;23979:1;23972:15;23999:233;24038:3;24061:24;24079:5;24061:24;:::i;:::-;24052:33;;24107:66;24100:5;24097:77;24094:103;;24177:18;;:::i;:::-;24094:103;24224:1;24217:5;24213:13;24206:20;;23999:233;;;:::o;24238:234::-;24378:34;24374:1;24366:6;24362:14;24355:58;24447:17;24442:2;24434:6;24430:15;24423:42;24238:234;:::o;24478:366::-;24620:3;24641:67;24705:2;24700:3;24641:67;:::i;:::-;24634:74;;24717:93;24806:3;24717:93;:::i;:::-;24835:2;24830:3;24826:12;24819:19;;24478:366;;;:::o;24850:419::-;25016:4;25054:2;25043:9;25039:18;25031:26;;25103:9;25097:4;25093:20;25089:1;25078:9;25074:17;25067:47;25131:131;25257:4;25131:131;:::i;:::-;25123:139;;24850:419;;;:::o;25275:148::-;25377:11;25414:3;25399:18;;25275:148;;;;:::o;25429:377::-;25535:3;25563:39;25596:5;25563:39;:::i;:::-;25618:89;25700:6;25695:3;25618:89;:::i;:::-;25611:96;;25716:52;25761:6;25756:3;25749:4;25742:5;25738:16;25716:52;:::i;:::-;25793:6;25788:3;25784:16;25777:23;;25539:267;25429:377;;;;:::o;25812:141::-;25861:4;25884:3;25876:11;;25907:3;25904:1;25897:14;25941:4;25938:1;25928:18;25920:26;;25812:141;;;:::o;25983:845::-;26086:3;26123:5;26117:12;26152:36;26178:9;26152:36;:::i;:::-;26204:89;26286:6;26281:3;26204:89;:::i;:::-;26197:96;;26324:1;26313:9;26309:17;26340:1;26335:137;;;;26486:1;26481:341;;;;26302:520;;26335:137;26419:4;26415:9;26404;26400:25;26395:3;26388:38;26455:6;26450:3;26446:16;26439:23;;26335:137;;26481:341;26548:38;26580:5;26548:38;:::i;:::-;26608:1;26622:154;26636:6;26633:1;26630:13;26622:154;;;26710:7;26704:14;26700:1;26695:3;26691:11;26684:35;26760:1;26751:7;26747:15;26736:26;;26658:4;26655:1;26651:12;26646:17;;26622:154;;;26805:6;26800:3;26796:16;26789:23;;26488:334;;26302:520;;26090:738;;25983:845;;;;:::o;26834:589::-;27059:3;27081:95;27172:3;27163:6;27081:95;:::i;:::-;27074:102;;27193:95;27284:3;27275:6;27193:95;:::i;:::-;27186:102;;27305:92;27393:3;27384:6;27305:92;:::i;:::-;27298:99;;27414:3;27407:10;;26834:589;;;;;;:::o;27429:94::-;27462:8;27510:5;27506:2;27502:14;27481:35;;27429:94;;;:::o;27529:::-;27568:7;27597:20;27611:5;27597:20;:::i;:::-;27586:31;;27529:94;;;:::o;27629:100::-;27668:7;27697:26;27717:5;27697:26;:::i;:::-;27686:37;;27629:100;;;:::o;27735:157::-;27840:45;27860:24;27878:5;27860:24;:::i;:::-;27840:45;:::i;:::-;27835:3;27828:58;27735:157;;:::o;27898:256::-;28010:3;28025:75;28096:3;28087:6;28025:75;:::i;:::-;28125:2;28120:3;28116:12;28109:19;;28145:3;28138:10;;27898:256;;;;:::o;28160:170::-;28300:22;28296:1;28288:6;28284:14;28277:46;28160:170;:::o;28336:366::-;28478:3;28499:67;28563:2;28558:3;28499:67;:::i;:::-;28492:74;;28575:93;28664:3;28575:93;:::i;:::-;28693:2;28688:3;28684:12;28677:19;;28336:366;;;:::o;28708:419::-;28874:4;28912:2;28901:9;28897:18;28889:26;;28961:9;28955:4;28951:20;28947:1;28936:9;28932:17;28925:47;28989:131;29115:4;28989:131;:::i;:::-;28981:139;;28708:419;;;:::o;29133:221::-;29273:34;29269:1;29261:6;29257:14;29250:58;29342:4;29337:2;29329:6;29325:15;29318:29;29133:221;:::o;29360:366::-;29502:3;29523:67;29587:2;29582:3;29523:67;:::i;:::-;29516:74;;29599:93;29688:3;29599:93;:::i;:::-;29717:2;29712:3;29708:12;29701:19;;29360:366;;;:::o;29732:419::-;29898:4;29936:2;29925:9;29921:18;29913:26;;29985:9;29979:4;29975:20;29971:1;29960:9;29956:17;29949:47;30013:131;30139:4;30013:131;:::i;:::-;30005:139;;29732:419;;;:::o;30157:175::-;30297:27;30293:1;30285:6;30281:14;30274:51;30157:175;:::o;30338:366::-;30480:3;30501:67;30565:2;30560:3;30501:67;:::i;:::-;30494:74;;30577:93;30666:3;30577:93;:::i;:::-;30695:2;30690:3;30686:12;30679:19;;30338:366;;;:::o;30710:419::-;30876:4;30914:2;30903:9;30899:18;30891:26;;30963:9;30957:4;30953:20;30949:1;30938:9;30934:17;30927:47;30991:131;31117:4;30991:131;:::i;:::-;30983:139;;30710:419;;;:::o;31135:182::-;31275:34;31271:1;31263:6;31259:14;31252:58;31135:182;:::o;31323:366::-;31465:3;31486:67;31550:2;31545:3;31486:67;:::i;:::-;31479:74;;31562:93;31651:3;31562:93;:::i;:::-;31680:2;31675:3;31671:12;31664:19;;31323:366;;;:::o;31695:419::-;31861:4;31899:2;31888:9;31884:18;31876:26;;31948:9;31942:4;31938:20;31934:1;31923:9;31919:17;31912:47;31976:131;32102:4;31976:131;:::i;:::-;31968:139;;31695:419;;;:::o;32120:225::-;32260:34;32256:1;32248:6;32244:14;32237:58;32329:8;32324:2;32316:6;32312:15;32305:33;32120:225;:::o;32351:366::-;32493:3;32514:67;32578:2;32573:3;32514:67;:::i;:::-;32507:74;;32590:93;32679:3;32590:93;:::i;:::-;32708:2;32703:3;32699:12;32692:19;;32351:366;;;:::o;32723:419::-;32889:4;32927:2;32916:9;32912:18;32904:26;;32976:9;32970:4;32966:20;32962:1;32951:9;32947:17;32940:47;33004:131;33130:4;33004:131;:::i;:::-;32996:139;;32723:419;;;:::o;33148:332::-;33269:4;33307:2;33296:9;33292:18;33284:26;;33320:71;33388:1;33377:9;33373:17;33364:6;33320:71;:::i;:::-;33401:72;33469:2;33458:9;33454:18;33445:6;33401:72;:::i;:::-;33148:332;;;;;:::o;33486:137::-;33540:5;33571:6;33565:13;33556:22;;33587:30;33611:5;33587:30;:::i;:::-;33486:137;;;;:::o;33629:345::-;33696:6;33745:2;33733:9;33724:7;33720:23;33716:32;33713:119;;;33751:79;;:::i;:::-;33713:119;33871:1;33896:61;33949:7;33940:6;33929:9;33925:22;33896:61;:::i;:::-;33886:71;;33842:125;33629:345;;;;:::o;33980:182::-;34120:34;34116:1;34108:6;34104:14;34097:58;33980:182;:::o;34168:366::-;34310:3;34331:67;34395:2;34390:3;34331:67;:::i;:::-;34324:74;;34407:93;34496:3;34407:93;:::i;:::-;34525:2;34520:3;34516:12;34509:19;;34168:366;;;:::o;34540:419::-;34706:4;34744:2;34733:9;34729:18;34721:26;;34793:9;34787:4;34783:20;34779:1;34768:9;34764:17;34757:47;34821:131;34947:4;34821:131;:::i;:::-;34813:139;;34540:419;;;:::o;34965:166::-;35105:18;35101:1;35093:6;35089:14;35082:42;34965:166;:::o;35137:366::-;35279:3;35300:67;35364:2;35359:3;35300:67;:::i;:::-;35293:74;;35376:93;35465:3;35376:93;:::i;:::-;35494:2;35489:3;35485:12;35478:19;;35137:366;;;:::o;35509:419::-;35675:4;35713:2;35702:9;35698:18;35690:26;;35762:9;35756:4;35752:20;35748:1;35737:9;35733:17;35726:47;35790:131;35916:4;35790:131;:::i;:::-;35782:139;;35509:419;;;:::o;35934:181::-;36074:33;36070:1;36062:6;36058:14;36051:57;35934:181;:::o;36121:366::-;36263:3;36284:67;36348:2;36343:3;36284:67;:::i;:::-;36277:74;;36360:93;36449:3;36360:93;:::i;:::-;36478:2;36473:3;36469:12;36462:19;;36121:366;;;:::o;36493:419::-;36659:4;36697:2;36686:9;36682:18;36674:26;;36746:9;36740:4;36736:20;36732:1;36721:9;36717:17;36710:47;36774:131;36900:4;36774:131;:::i;:::-;36766:139;;36493:419;;;:::o;36918:170::-;37058:22;37054:1;37046:6;37042:14;37035:46;36918:170;:::o;37094:366::-;37236:3;37257:67;37321:2;37316:3;37257:67;:::i;:::-;37250:74;;37333:93;37422:3;37333:93;:::i;:::-;37451:2;37446:3;37442:12;37435:19;;37094:366;;;:::o;37466:419::-;37632:4;37670:2;37659:9;37655:18;37647:26;;37719:9;37713:4;37709:20;37705:1;37694:9;37690:17;37683:47;37747:131;37873:4;37747:131;:::i;:::-;37739:139;;37466:419;;;:::o;37891:98::-;37942:6;37976:5;37970:12;37960:22;;37891:98;;;:::o;37995:168::-;38078:11;38112:6;38107:3;38100:19;38152:4;38147:3;38143:14;38128:29;;37995:168;;;;:::o;38169:360::-;38255:3;38283:38;38315:5;38283:38;:::i;:::-;38337:70;38400:6;38395:3;38337:70;:::i;:::-;38330:77;;38416:52;38461:6;38456:3;38449:4;38442:5;38438:16;38416:52;:::i;:::-;38493:29;38515:6;38493:29;:::i;:::-;38488:3;38484:39;38477:46;;38259:270;38169:360;;;;:::o;38535:640::-;38730:4;38768:3;38757:9;38753:19;38745:27;;38782:71;38850:1;38839:9;38835:17;38826:6;38782:71;:::i;:::-;38863:72;38931:2;38920:9;38916:18;38907:6;38863:72;:::i;:::-;38945;39013:2;39002:9;38998:18;38989:6;38945:72;:::i;:::-;39064:9;39058:4;39054:20;39049:2;39038:9;39034:18;39027:48;39092:76;39163:4;39154:6;39092:76;:::i;:::-;39084:84;;38535:640;;;;;;;:::o;39181:141::-;39237:5;39268:6;39262:13;39253:22;;39284:32;39310:5;39284:32;:::i;:::-;39181:141;;;;:::o;39328:349::-;39397:6;39446:2;39434:9;39425:7;39421:23;39417:32;39414:119;;;39452:79;;:::i;:::-;39414:119;39572:1;39597:63;39652:7;39643:6;39632:9;39628:22;39597:63;:::i;:::-;39587:73;;39543:127;39328:349;;;;:::o
Swarm Source
ipfs://007e25fad3bfe5899d709b88ae45753d6a5643a9fe71e2c85aa0afd5bbac9621
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.