ERC-721
Overview
Max Total Supply
5,000 TRATZ
Holders
2,754
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 TRATZLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ThugRatz
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-08-09 */ // File: @openzeppelin/contracts/utils/Strings.sol // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (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() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // 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/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * 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. */ 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 proved to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * _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} * * _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 the sibling nodes in `proof`, * consuming from one or the other at each step according to the instructions given by * `proofFlags`. * * _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} * * _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/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: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.2.0 // 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(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * 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; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @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; /** * @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; /** * @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.0 // 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 { // Reference type for token approval. 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 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 { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _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]`. 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 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 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 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. 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`. ) 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 ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } } // File: erc721a/contracts/extensions/IERC721AQueryable.sol // ERC721A Contracts v4.2.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721AQueryable. */ interface IERC721AQueryable is IERC721A { /** * Invalid query range (`start` >= `stop`). */ error InvalidQueryRange(); /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * * - `addr = address(0)` * - `startTimestamp = 0` * - `burned = false` * - `extraData = 0` * * If the `tokenId` is burned: * * - `addr = <Address of owner before token was burned>` * - `startTimestamp = <Timestamp when token was burned>` * - `burned = true` * - `extraData = <Extra data when token was burned>` * * Otherwise: * * - `addr = <Address of owner>` * - `startTimestamp = <Timestamp of start of ownership>` * - `burned = false` * - `extraData = <Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory); /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory); /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start < stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view returns (uint256[] memory); /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(`totalSupply`) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view returns (uint256[] memory); } // File: erc721a/contracts/extensions/ERC721AQueryable.sol // ERC721A Contracts v4.2.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @title ERC721AQueryable. * * @dev ERC721A subclass with convenience query functions. */ abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable { /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * * - `addr = address(0)` * - `startTimestamp = 0` * - `burned = false` * - `extraData = 0` * * If the `tokenId` is burned: * * - `addr = <Address of owner before token was burned>` * - `startTimestamp = <Timestamp when token was burned>` * - `burned = true` * - `extraData = <Extra data when token was burned>` * * Otherwise: * * - `addr = <Address of owner>` * - `startTimestamp = <Timestamp of start of ownership>` * - `burned = false` * - `extraData = <Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) public view virtual override returns (TokenOwnership memory) { TokenOwnership memory ownership; if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) { return ownership; } ownership = _ownershipAt(tokenId); if (ownership.burned) { return ownership; } return _ownershipOf(tokenId); } /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] calldata tokenIds) external view virtual override returns (TokenOwnership[] memory) { unchecked { uint256 tokenIdsLength = tokenIds.length; TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength); for (uint256 i; i != tokenIdsLength; ++i) { ownerships[i] = explicitOwnershipOf(tokenIds[i]); } return ownerships; } } /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start < stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view virtual override returns (uint256[] memory) { unchecked { if (start >= stop) revert InvalidQueryRange(); uint256 tokenIdsIdx; uint256 stopLimit = _nextTokenId(); // Set `start = max(start, _startTokenId())`. if (start < _startTokenId()) { start = _startTokenId(); } // Set `stop = min(stop, stopLimit)`. if (stop > stopLimit) { stop = stopLimit; } uint256 tokenIdsMaxLength = balanceOf(owner); // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`, // to cater for cases where `balanceOf(owner)` is too big. if (start < stop) { uint256 rangeLength = stop - start; if (rangeLength < tokenIdsMaxLength) { tokenIdsMaxLength = rangeLength; } } else { tokenIdsMaxLength = 0; } uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength); if (tokenIdsMaxLength == 0) { return tokenIds; } // We need to call `explicitOwnershipOf(start)`, // because the slot at `start` may not be initialized. TokenOwnership memory ownership = explicitOwnershipOf(start); address currOwnershipAddr; // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`. // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range. if (!ownership.burned) { currOwnershipAddr = ownership.addr; } for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } // Downsize the array to fit. assembly { mstore(tokenIds, tokenIdsIdx) } return tokenIds; } } /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(`totalSupply`) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view virtual override returns (uint256[] memory) { unchecked { uint256 tokenIdsIdx; address currOwnershipAddr; uint256 tokenIdsLength = balanceOf(owner); uint256[] memory tokenIds = new uint256[](tokenIdsLength); TokenOwnership memory ownership; for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } return tokenIds; } } } // File: Thugratz.sol contract ThugRatz is ERC721AQueryable, Ownable, ReentrancyGuard { using Strings for uint256; bytes32 public merkleRoot; mapping(address => bool) public whitelistClaimed; string public uriPrefix = 'ipfs://QmXm2wuTjcX2rm5PXQ4ttRXoYqvw4ndqjVM3ZBa4s7T2rT/'; string public uriSuffix = '.json'; uint256 public cost; uint256 public maxSupply; uint256 public maxMintAmountPerTx; uint256 public maxMintAmountPublicSale = 1; uint public status = 0; //0-pause 1-whitelist 2-public mapping(address => uint256) public publicThugratz; constructor( string memory _tokenName, string memory _tokenSymbol, uint256 _cost, uint256 _maxSupply, uint256 _maxMintAmountPerTx ) ERC721A(_tokenName, _tokenSymbol) { setCost(_cost); maxSupply = _maxSupply; setMaxMintAmountPerTx(_maxMintAmountPerTx); } modifier mintCompliance(uint256 _mintAmount) { require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, 'Invalid mint amount!'); require(totalSupply() + _mintAmount <= maxSupply, 'Max supply exceeded!'); _; } modifier mintPriceCompliance(uint256 _mintAmount) { require(msg.value >= cost * _mintAmount, 'Insufficient funds!'); _; } function whitelistMint(uint256 _mintAmount, bytes32[] calldata _merkleProof) public payable mintCompliance(_mintAmount) mintPriceCompliance(_mintAmount) { // Verify whitelist requirements require(status == 1, "Whitelist Sale is not Active"); require(!whitelistClaimed[_msgSender()], 'Address already claimed!'); bytes32 leaf = keccak256(abi.encodePacked(_msgSender())); require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), 'Invalid proof!'); whitelistClaimed[_msgSender()] = true; _safeMint(_msgSender(), _mintAmount); } //modified using Goblintown contract function makegoblinnnfly function internalMint(address teamMember, uint256 _teamAmount) public onlyOwner { require(totalSupply() + _teamAmount <= maxSupply, 'Max supply exceeded!'); _safeMint(teamMember, _teamAmount); } function mint() external nonReentrant { uint256 mintedThugratz = totalSupply(); require(status == 2 , "Public Sale is not Active"); require(mintedThugratz + maxMintAmountPublicSale <= maxSupply); require(msg.sender == tx.origin); require(publicThugratz[msg.sender] < maxMintAmountPublicSale); _safeMint(msg.sender, 1); publicThugratz[msg.sender] += 1; } function _startTokenId() internal view virtual override returns (uint256) { return 1; } 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, _tokenId.toString(), uriSuffix)) : ''; } function setCost(uint256 _cost) public onlyOwner { cost = _cost; } function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner { maxMintAmountPerTx = _maxMintAmountPerTx; } function setmaxMintAmountPublicSale(uint256 _maxMintPub) public onlyOwner { maxMintAmountPublicSale = _maxMintPub; } function setUriPrefix(string memory _uriPrefix) public onlyOwner { uriPrefix = _uriPrefix; } function setUriSuffix(string memory _uriSuffix) public onlyOwner { uriSuffix = _uriSuffix; } function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner { merkleRoot = _merkleRoot; } function setStatus(uint256 status_)external onlyOwner{ status = status_; } function getStatus()public view returns(uint){ return status; } function withdraw() public onlyOwner nonReentrant { (bool os, ) = payable(owner()).call{value: address(this).balance}(''); require(os); } function _baseURI() internal view virtual override returns (string memory) { return uriPrefix; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"},{"internalType":"uint256","name":"_cost","type":"uint256"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStatus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"teamMember","type":"address"},{"internalType":"uint256","name":"_teamAmount","type":"uint256"}],"name":"internalMint","outputs":[],"stateMutability":"nonpayable","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":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPublicSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"publicThugratz","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"status_","type":"uint256"}],"name":"setStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintPub","type":"uint256"}],"name":"setmaxMintAmountPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"status","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260405180606001604052806036815260200162004b9060369139600c9080519060200190620000359291906200032f565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d9080519060200190620000839291906200032f565b50600160115560006012553480156200009b57600080fd5b5060405162004bc638038062004bc68339818101604052810190620000c19190620005b7565b84848160029080519060200190620000db9291906200032f565b508060039080519060200190620000f49291906200032f565b50620001056200016960201b60201c565b60008190555050506200012d620001216200017260201b60201c565b6200017a60201b60201c565b600160098190555062000146836200024060201b60201c565b81600f819055506200015e816200025a60201b60201c565b505050505062000765565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002506200027460201b60201c565b80600e8190555050565b6200026a6200027460201b60201c565b8060108190555050565b620002846200017260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002aa6200030560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000303576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002fa90620006de565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200033d906200072f565b90600052602060002090601f016020900481019282620003615760008555620003ad565b82601f106200037c57805160ff1916838001178555620003ad565b82800160010185558215620003ad579182015b82811115620003ac5782518255916020019190600101906200038f565b5b509050620003bc9190620003c0565b5090565b5b80821115620003db576000816000905550600101620003c1565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200044882620003fd565b810181811067ffffffffffffffff821117156200046a57620004696200040e565b5b80604052505050565b60006200047f620003df565b90506200048d82826200043d565b919050565b600067ffffffffffffffff821115620004b057620004af6200040e565b5b620004bb82620003fd565b9050602081019050919050565b60005b83811015620004e8578082015181840152602081019050620004cb565b83811115620004f8576000848401525b50505050565b6000620005156200050f8462000492565b62000473565b905082815260208101848484011115620005345762000533620003f8565b5b62000541848285620004c8565b509392505050565b600082601f830112620005615762000560620003f3565b5b815162000573848260208601620004fe565b91505092915050565b6000819050919050565b62000591816200057c565b81146200059d57600080fd5b50565b600081519050620005b18162000586565b92915050565b600080600080600060a08688031215620005d657620005d5620003e9565b5b600086015167ffffffffffffffff811115620005f757620005f6620003ee565b5b620006058882890162000549565b955050602086015167ffffffffffffffff811115620006295762000628620003ee565b5b620006378882890162000549565b94505060406200064a88828901620005a0565b93505060606200065d88828901620005a0565b92505060806200067088828901620005a0565b9150509295509295909350565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620006c66020836200067d565b9150620006d3826200068e565b602082019050919050565b60006020820190508181036000830152620006f981620006b7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200074857607f821691505b602082108114156200075f576200075e62000700565b5b50919050565b61441b80620007756000396000f3fe60806040526004361061025c5760003560e01c80636352211e11610144578063a22cb465116100b6578063c87b56dd1161007a578063c87b56dd146108e4578063d2cab05614610921578063d5abeb011461093d578063db4bec4414610968578063e985e9c5146109a5578063f2fde38b146109e25761025c565b8063a22cb465146107ef578063b071401b14610818578063b59fddbe14610841578063b88d4fde1461087e578063c23dc68f146108a75761025c565b80637ec4a659116101085780637ec4a659146106cb5780638462151c146106f45780638da5cb5b1461073157806394354fd01461075c57806395d89b411461078757806399a2557a146107b25761025c565b80636352211e146105e857806369ba1a751461062557806370a082311461064e578063715018a61461068b5780637cb64759146106a25761025c565b8063200d2ed2116101dd57806342842e0e116101a157806342842e0e146104d857806344a0d68a146105015780634e69d5601461052a5780635503a0e8146105555780635bbb21771461058057806362b99ad4146105bd5761025c565b8063200d2ed21461041957806323b872dd146104445780632eb4a7ab1461046d57806335001a1a146104985780633ccfd60b146104c15761025c565b8063095ea7b311610224578063095ea7b31461035a5780631249c58b1461038357806313faede61461039a57806316ba10e0146103c557806318160ddd146103ee5761025c565b806301ffc9a7146102615780630311bbd31461029e578063035903e6146102c957806306fdde03146102f2578063081812fc1461031d575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190612e92565b610a0b565b6040516102959190612eda565b60405180910390f35b3480156102aa57600080fd5b506102b3610a9d565b6040516102c09190612f0e565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190612f55565b610aa3565b005b3480156102fe57600080fd5b50610307610ab5565b604051610314919061301b565b60405180910390f35b34801561032957600080fd5b50610344600480360381019061033f9190612f55565b610b47565b604051610351919061307e565b60405180910390f35b34801561036657600080fd5b50610381600480360381019061037c91906130c5565b610bc6565b005b34801561038f57600080fd5b50610398610d0a565b005b3480156103a657600080fd5b506103af610eb7565b6040516103bc9190612f0e565b60405180910390f35b3480156103d157600080fd5b506103ec60048036038101906103e7919061323a565b610ebd565b005b3480156103fa57600080fd5b50610403610edf565b6040516104109190612f0e565b60405180910390f35b34801561042557600080fd5b5061042e610ef6565b60405161043b9190612f0e565b60405180910390f35b34801561045057600080fd5b5061046b60048036038101906104669190613283565b610efc565b005b34801561047957600080fd5b50610482611221565b60405161048f91906132ef565b60405180910390f35b3480156104a457600080fd5b506104bf60048036038101906104ba91906130c5565b611227565b005b3480156104cd57600080fd5b506104d6611294565b005b3480156104e457600080fd5b506104ff60048036038101906104fa9190613283565b611372565b005b34801561050d57600080fd5b5061052860048036038101906105239190612f55565b611392565b005b34801561053657600080fd5b5061053f6113a4565b60405161054c9190612f0e565b60405180910390f35b34801561056157600080fd5b5061056a6113ae565b604051610577919061301b565b60405180910390f35b34801561058c57600080fd5b506105a760048036038101906105a2919061336a565b61143c565b6040516105b4919061351a565b60405180910390f35b3480156105c957600080fd5b506105d26114ff565b6040516105df919061301b565b60405180910390f35b3480156105f457600080fd5b5061060f600480360381019061060a9190612f55565b61158d565b60405161061c919061307e565b60405180910390f35b34801561063157600080fd5b5061064c60048036038101906106479190612f55565b61159f565b005b34801561065a57600080fd5b506106756004803603810190610670919061353c565b6115b1565b6040516106829190612f0e565b60405180910390f35b34801561069757600080fd5b506106a061166a565b005b3480156106ae57600080fd5b506106c960048036038101906106c49190613595565b61167e565b005b3480156106d757600080fd5b506106f260048036038101906106ed919061323a565b611690565b005b34801561070057600080fd5b5061071b6004803603810190610716919061353c565b6116b2565b6040516107289190613680565b60405180910390f35b34801561073d57600080fd5b506107466117fc565b604051610753919061307e565b60405180910390f35b34801561076857600080fd5b50610771611826565b60405161077e9190612f0e565b60405180910390f35b34801561079357600080fd5b5061079c61182c565b6040516107a9919061301b565b60405180910390f35b3480156107be57600080fd5b506107d960048036038101906107d491906136a2565b6118be565b6040516107e69190613680565b60405180910390f35b3480156107fb57600080fd5b5061081660048036038101906108119190613721565b611ad2565b005b34801561082457600080fd5b5061083f600480360381019061083a9190612f55565b611c4a565b005b34801561084d57600080fd5b506108686004803603810190610863919061353c565b611c5c565b6040516108759190612f0e565b60405180910390f35b34801561088a57600080fd5b506108a560048036038101906108a09190613802565b611c74565b005b3480156108b357600080fd5b506108ce60048036038101906108c99190612f55565b611ce7565b6040516108db91906138da565b60405180910390f35b3480156108f057600080fd5b5061090b60048036038101906109069190612f55565b611d51565b604051610918919061301b565b60405180910390f35b61093b6004803603810190610936919061394b565b611dfb565b005b34801561094957600080fd5b50610952612105565b60405161095f9190612f0e565b60405180910390f35b34801561097457600080fd5b5061098f600480360381019061098a919061353c565b61210b565b60405161099c9190612eda565b60405180910390f35b3480156109b157600080fd5b506109cc60048036038101906109c791906139ab565b61212b565b6040516109d99190612eda565b60405180910390f35b3480156109ee57600080fd5b50610a096004803603810190610a04919061353c565b6121bf565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a6657506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a965750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60115481565b610aab612243565b8060118190555050565b606060028054610ac490613a1a565b80601f0160208091040260200160405190810160405280929190818152602001828054610af090613a1a565b8015610b3d5780601f10610b1257610100808354040283529160200191610b3d565b820191906000526020600020905b815481529060010190602001808311610b2057829003601f168201915b5050505050905090565b6000610b52826122c1565b610b88576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bd18261158d565b90508073ffffffffffffffffffffffffffffffffffffffff16610bf2612320565b73ffffffffffffffffffffffffffffffffffffffff1614610c5557610c1e81610c19612320565b61212b565b610c54576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60026009541415610d50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4790613a98565b60405180910390fd5b60026009819055506000610d62610edf565b9050600260125414610da9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da090613b04565b60405180910390fd5b600f5460115482610dba9190613b53565b1115610dc557600080fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610dfd57600080fd5b601154601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610e4a57600080fd5b610e55336001612328565b6001601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610ea59190613b53565b92505081905550506001600981905550565b600e5481565b610ec5612243565b80600d9080519060200190610edb929190612d34565b5050565b6000610ee9612346565b6001546000540303905090565b60125481565b6000610f078261234f565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f6e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610f7a8461241d565b91509150610f908187610f8b612320565b612444565b610fdc57610fa586610fa0612320565b61212b565b610fdb576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611043576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110508686866001612488565b801561105b57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506111298561110588888761248e565b7c0200000000000000000000000000000000000000000000000000000000176124b6565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841614156111b15760006001850190506000600460008381526020019081526020016000205414156111af5760005481146111ae578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461121986868660016124e1565b505050505050565b600a5481565b61122f612243565b600f548161123b610edf565b6112459190613b53565b1115611286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127d90613bf5565b60405180910390fd5b6112908282612328565b5050565b61129c612243565b600260095414156112e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d990613a98565b60405180910390fd5b600260098190555060006112f46117fc565b73ffffffffffffffffffffffffffffffffffffffff164760405161131790613c46565b60006040518083038185875af1925050503d8060008114611354576040519150601f19603f3d011682016040523d82523d6000602084013e611359565b606091505b505090508061136757600080fd5b506001600981905550565b61138d83838360405180602001604052806000815250611c74565b505050565b61139a612243565b80600e8190555050565b6000601254905090565b600d80546113bb90613a1a565b80601f01602080910402602001604051908101604052809291908181526020018280546113e790613a1a565b80156114345780601f1061140957610100808354040283529160200191611434565b820191906000526020600020905b81548152906001019060200180831161141757829003601f168201915b505050505081565b6060600083839050905060008167ffffffffffffffff8111156114625761146161310f565b5b60405190808252806020026020018201604052801561149b57816020015b611488612dba565b8152602001906001900390816114805790505b50905060005b8281146114f3576114ca8686838181106114be576114bd613c5b565b5b90506020020135611ce7565b8282815181106114dd576114dc613c5b565b5b60200260200101819052508060010190506114a1565b50809250505092915050565b600c805461150c90613a1a565b80601f016020809104026020016040519081016040528092919081815260200182805461153890613a1a565b80156115855780601f1061155a57610100808354040283529160200191611585565b820191906000526020600020905b81548152906001019060200180831161156857829003601f168201915b505050505081565b60006115988261234f565b9050919050565b6115a7612243565b8060128190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611619576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611672612243565b61167c60006124e7565b565b611686612243565b80600a8190555050565b611698612243565b80600c90805190602001906116ae929190612d34565b5050565b606060008060006116c2856115b1565b905060008167ffffffffffffffff8111156116e0576116df61310f565b5b60405190808252806020026020018201604052801561170e5781602001602082028036833780820191505090505b509050611719612dba565b6000611723612346565b90505b8386146117ee57611736816125ad565b9150816040015115611747576117e3565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461178757816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156117e257808387806001019850815181106117d5576117d4613c5b565b5b6020026020010181815250505b5b806001019050611726565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60105481565b60606003805461183b90613a1a565b80601f016020809104026020016040519081016040528092919081815260200182805461186790613a1a565b80156118b45780601f10611889576101008083540402835291602001916118b4565b820191906000526020600020905b81548152906001019060200180831161189757829003601f168201915b5050505050905090565b60608183106118f9576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806119046125d8565b905061190e612346565b8510156119205761191d612346565b94505b8084111561192c578093505b6000611937876115b1565b90508486101561195a576000868603905081811015611954578091505b5061195f565b600090505b60008167ffffffffffffffff81111561197b5761197a61310f565b5b6040519080825280602002602001820160405280156119a95781602001602082028036833780820191505090505b50905060008214156119c15780945050505050611acb565b60006119cc88611ce7565b9050600081604001516119e157816000015190505b60008990505b8881141580156119f75750848714155b15611abd57611a05816125ad565b9250826040015115611a1657611ab2565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611a5657826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ab15780848880600101995081518110611aa457611aa3613c5b565b5b6020026020010181815250505b5b8060010190506119e7565b508583528296505050505050505b9392505050565b611ada612320565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b3f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611b4c612320565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611bf9612320565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c3e9190612eda565b60405180910390a35050565b611c52612243565b8060108190555050565b60136020528060005260406000206000915090505481565b611c7f848484610efc565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611ce157611caa848484846125e1565b611ce0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611cef612dba565b611cf7612dba565b611cff612346565b831080611d135750611d0f6125d8565b8310155b15611d215780915050611d4c565b611d2a836125ad565b9050806040015115611d3f5780915050611d4c565b611d4883612741565b9150505b919050565b6060611d5c826122c1565b611d9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9290613cfc565b60405180910390fd5b6000611da5612761565b90506000815111611dc55760405180602001604052806000815250611df3565b80611dcf846127f3565b600d604051602001611de393929190613dec565b6040516020818303038152906040525b915050919050565b82600081118015611e0e57506010548111155b611e4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4490613e69565b60405180910390fd5b600f5481611e59610edf565b611e639190613b53565b1115611ea4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9b90613bf5565b60405180910390fd5b8380600e54611eb39190613e89565b341015611ef5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eec90613f2f565b60405180910390fd5b600160125414611f3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3190613f9b565b60405180910390fd5b600b6000611f46612954565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611fce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc590614007565b60405180910390fd5b6000611fd8612954565b604051602001611fe8919061406f565b60405160208183030381529060405280519060200120905061204e858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a548361295c565b61208d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612084906140d6565b60405180910390fd5b6001600b600061209b612954565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506120fd6120f7612954565b87612328565b505050505050565b600f5481565b600b6020528060005260406000206000915054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121c7612243565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612237576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222e90614168565b60405180910390fd5b612240816124e7565b50565b61224b612954565b73ffffffffffffffffffffffffffffffffffffffff166122696117fc565b73ffffffffffffffffffffffffffffffffffffffff16146122bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b6906141d4565b60405180910390fd5b565b6000816122cc612346565b111580156122db575060005482105b8015612319575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b612342828260405180602001604052806000815250612973565b5050565b60006001905090565b6000808290508061235e612346565b116123e6576000548110156123e55760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156123e3575b60008114156123d95760046000836001900393508381526020019081526020016000205490506123ae565b8092505050612418565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86124a5868684612a10565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6125b5612dba565b6125d16004600084815260200190815260200160002054612a19565b9050919050565b60008054905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612607612320565b8786866040518563ffffffff1660e01b81526004016126299493929190614249565b602060405180830381600087803b15801561264357600080fd5b505af192505050801561267457506040513d601f19601f8201168201806040525081019061267191906142aa565b60015b6126ee573d80600081146126a4576040519150601f19603f3d011682016040523d82523d6000602084013e6126a9565b606091505b506000815114156126e6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b612749612dba565b61275a6127558361234f565b612a19565b9050919050565b6060600c805461277090613a1a565b80601f016020809104026020016040519081016040528092919081815260200182805461279c90613a1a565b80156127e95780601f106127be576101008083540402835291602001916127e9565b820191906000526020600020905b8154815290600101906020018083116127cc57829003601f168201915b5050505050905090565b6060600082141561283b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061294f565b600082905060005b6000821461286d578080612856906142d7565b915050600a82612866919061434f565b9150612843565b60008167ffffffffffffffff8111156128895761288861310f565b5b6040519080825280601f01601f1916602001820160405280156128bb5781602001600182028036833780820191505090505b5090505b60008514612948576001826128d49190614380565b9150600a856128e391906143b4565b60306128ef9190613b53565b60f81b81838151811061290557612904613c5b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612941919061434f565b94506128bf565b8093505050505b919050565b600033905090565b6000826129698584612acf565b1490509392505050565b61297d8383612b25565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612a0b57600080549050600083820390505b6129bd60008683806001019450866125e1565b6129f3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106129aa578160005414612a0857600080fd5b50505b505050565b60009392505050565b612a21612dba565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60008082905060005b8451811015612b1a57612b0582868381518110612af857612af7613c5b565b5b6020026020010151612ce2565b91508080612b12906142d7565b915050612ad8565b508091505092915050565b6000805490506000821415612b66576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b736000848385612488565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612bea83612bdb600086600061248e565b612be485612d0d565b176124b6565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612c8b57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612c50565b506000821415612cc7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050612cdd60008483856124e1565b505050565b6000818310612cfa57612cf58284612d1d565b612d05565b612d048383612d1d565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b828054612d4090613a1a565b90600052602060002090601f016020900481019282612d625760008555612da9565b82601f10612d7b57805160ff1916838001178555612da9565b82800160010185558215612da9579182015b82811115612da8578251825591602001919060010190612d8d565b5b509050612db69190612e09565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b80821115612e22576000816000905550600101612e0a565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612e6f81612e3a565b8114612e7a57600080fd5b50565b600081359050612e8c81612e66565b92915050565b600060208284031215612ea857612ea7612e30565b5b6000612eb684828501612e7d565b91505092915050565b60008115159050919050565b612ed481612ebf565b82525050565b6000602082019050612eef6000830184612ecb565b92915050565b6000819050919050565b612f0881612ef5565b82525050565b6000602082019050612f236000830184612eff565b92915050565b612f3281612ef5565b8114612f3d57600080fd5b50565b600081359050612f4f81612f29565b92915050565b600060208284031215612f6b57612f6a612e30565b5b6000612f7984828501612f40565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612fbc578082015181840152602081019050612fa1565b83811115612fcb576000848401525b50505050565b6000601f19601f8301169050919050565b6000612fed82612f82565b612ff78185612f8d565b9350613007818560208601612f9e565b61301081612fd1565b840191505092915050565b600060208201905081810360008301526130358184612fe2565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006130688261303d565b9050919050565b6130788161305d565b82525050565b6000602082019050613093600083018461306f565b92915050565b6130a28161305d565b81146130ad57600080fd5b50565b6000813590506130bf81613099565b92915050565b600080604083850312156130dc576130db612e30565b5b60006130ea858286016130b0565b92505060206130fb85828601612f40565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61314782612fd1565b810181811067ffffffffffffffff821117156131665761316561310f565b5b80604052505050565b6000613179612e26565b9050613185828261313e565b919050565b600067ffffffffffffffff8211156131a5576131a461310f565b5b6131ae82612fd1565b9050602081019050919050565b82818337600083830152505050565b60006131dd6131d88461318a565b61316f565b9050828152602081018484840111156131f9576131f861310a565b5b6132048482856131bb565b509392505050565b600082601f83011261322157613220613105565b5b81356132318482602086016131ca565b91505092915050565b6000602082840312156132505761324f612e30565b5b600082013567ffffffffffffffff81111561326e5761326d612e35565b5b61327a8482850161320c565b91505092915050565b60008060006060848603121561329c5761329b612e30565b5b60006132aa868287016130b0565b93505060206132bb868287016130b0565b92505060406132cc86828701612f40565b9150509250925092565b6000819050919050565b6132e9816132d6565b82525050565b600060208201905061330460008301846132e0565b92915050565b600080fd5b600080fd5b60008083601f84011261332a57613329613105565b5b8235905067ffffffffffffffff8111156133475761334661330a565b5b6020830191508360208202830111156133635761336261330f565b5b9250929050565b6000806020838503121561338157613380612e30565b5b600083013567ffffffffffffffff81111561339f5761339e612e35565b5b6133ab85828601613314565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6133ec8161305d565b82525050565b600067ffffffffffffffff82169050919050565b61340f816133f2565b82525050565b61341e81612ebf565b82525050565b600062ffffff82169050919050565b61343c81613424565b82525050565b60808201600082015161345860008501826133e3565b50602082015161346b6020850182613406565b50604082015161347e6040850182613415565b5060608201516134916060850182613433565b50505050565b60006134a38383613442565b60808301905092915050565b6000602082019050919050565b60006134c7826133b7565b6134d181856133c2565b93506134dc836133d3565b8060005b8381101561350d5781516134f48882613497565b97506134ff836134af565b9250506001810190506134e0565b5085935050505092915050565b6000602082019050818103600083015261353481846134bc565b905092915050565b60006020828403121561355257613551612e30565b5b6000613560848285016130b0565b91505092915050565b613572816132d6565b811461357d57600080fd5b50565b60008135905061358f81613569565b92915050565b6000602082840312156135ab576135aa612e30565b5b60006135b984828501613580565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6135f781612ef5565b82525050565b600061360983836135ee565b60208301905092915050565b6000602082019050919050565b600061362d826135c2565b61363781856135cd565b9350613642836135de565b8060005b8381101561367357815161365a88826135fd565b975061366583613615565b925050600181019050613646565b5085935050505092915050565b6000602082019050818103600083015261369a8184613622565b905092915050565b6000806000606084860312156136bb576136ba612e30565b5b60006136c9868287016130b0565b93505060206136da86828701612f40565b92505060406136eb86828701612f40565b9150509250925092565b6136fe81612ebf565b811461370957600080fd5b50565b60008135905061371b816136f5565b92915050565b6000806040838503121561373857613737612e30565b5b6000613746858286016130b0565b92505060206137578582860161370c565b9150509250929050565b600067ffffffffffffffff82111561377c5761377b61310f565b5b61378582612fd1565b9050602081019050919050565b60006137a56137a084613761565b61316f565b9050828152602081018484840111156137c1576137c061310a565b5b6137cc8482856131bb565b509392505050565b600082601f8301126137e9576137e8613105565b5b81356137f9848260208601613792565b91505092915050565b6000806000806080858703121561381c5761381b612e30565b5b600061382a878288016130b0565b945050602061383b878288016130b0565b935050604061384c87828801612f40565b925050606085013567ffffffffffffffff81111561386d5761386c612e35565b5b613879878288016137d4565b91505092959194509250565b60808201600082015161389b60008501826133e3565b5060208201516138ae6020850182613406565b5060408201516138c16040850182613415565b5060608201516138d46060850182613433565b50505050565b60006080820190506138ef6000830184613885565b92915050565b60008083601f84011261390b5761390a613105565b5b8235905067ffffffffffffffff8111156139285761392761330a565b5b6020830191508360208202830111156139445761394361330f565b5b9250929050565b60008060006040848603121561396457613963612e30565b5b600061397286828701612f40565b935050602084013567ffffffffffffffff81111561399357613992612e35565b5b61399f868287016138f5565b92509250509250925092565b600080604083850312156139c2576139c1612e30565b5b60006139d0858286016130b0565b92505060206139e1858286016130b0565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613a3257607f821691505b60208210811415613a4657613a456139eb565b5b50919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613a82601f83612f8d565b9150613a8d82613a4c565b602082019050919050565b60006020820190508181036000830152613ab181613a75565b9050919050565b7f5075626c69632053616c65206973206e6f742041637469766500000000000000600082015250565b6000613aee601983612f8d565b9150613af982613ab8565b602082019050919050565b60006020820190508181036000830152613b1d81613ae1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b5e82612ef5565b9150613b6983612ef5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613b9e57613b9d613b24565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b6000613bdf601483612f8d565b9150613bea82613ba9565b602082019050919050565b60006020820190508181036000830152613c0e81613bd2565b9050919050565b600081905092915050565b50565b6000613c30600083613c15565b9150613c3b82613c20565b600082019050919050565b6000613c5182613c23565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613ce6602f83612f8d565b9150613cf182613c8a565b604082019050919050565b60006020820190508181036000830152613d1581613cd9565b9050919050565b600081905092915050565b6000613d3282612f82565b613d3c8185613d1c565b9350613d4c818560208601612f9e565b80840191505092915050565b60008190508160005260206000209050919050565b60008154613d7a81613a1a565b613d848186613d1c565b94506001821660008114613d9f5760018114613db057613de3565b60ff19831686528186019350613de3565b613db985613d58565b60005b83811015613ddb57815481890152600182019150602081019050613dbc565b838801955050505b50505092915050565b6000613df88286613d27565b9150613e048285613d27565b9150613e108284613d6d565b9150819050949350505050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b6000613e53601483612f8d565b9150613e5e82613e1d565b602082019050919050565b60006020820190508181036000830152613e8281613e46565b9050919050565b6000613e9482612ef5565b9150613e9f83612ef5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613ed857613ed7613b24565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6000613f19601383612f8d565b9150613f2482613ee3565b602082019050919050565b60006020820190508181036000830152613f4881613f0c565b9050919050565b7f57686974656c6973742053616c65206973206e6f742041637469766500000000600082015250565b6000613f85601c83612f8d565b9150613f9082613f4f565b602082019050919050565b60006020820190508181036000830152613fb481613f78565b9050919050565b7f4164647265737320616c726561647920636c61696d6564210000000000000000600082015250565b6000613ff1601883612f8d565b9150613ffc82613fbb565b602082019050919050565b6000602082019050818103600083015261402081613fe4565b9050919050565b60008160601b9050919050565b600061403f82614027565b9050919050565b600061405182614034565b9050919050565b6140696140648261305d565b614046565b82525050565b600061407b8284614058565b60148201915081905092915050565b7f496e76616c69642070726f6f6621000000000000000000000000000000000000600082015250565b60006140c0600e83612f8d565b91506140cb8261408a565b602082019050919050565b600060208201905081810360008301526140ef816140b3565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614152602683612f8d565b915061415d826140f6565b604082019050919050565b6000602082019050818103600083015261418181614145565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006141be602083612f8d565b91506141c982614188565b602082019050919050565b600060208201905081810360008301526141ed816141b1565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061421b826141f4565b61422581856141ff565b9350614235818560208601612f9e565b61423e81612fd1565b840191505092915050565b600060808201905061425e600083018761306f565b61426b602083018661306f565b6142786040830185612eff565b818103606083015261428a8184614210565b905095945050505050565b6000815190506142a481612e66565b92915050565b6000602082840312156142c0576142bf612e30565b5b60006142ce84828501614295565b91505092915050565b60006142e282612ef5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561431557614314613b24565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061435a82612ef5565b915061436583612ef5565b92508261437557614374614320565b5b828204905092915050565b600061438b82612ef5565b915061439683612ef5565b9250828210156143a9576143a8613b24565b5b828203905092915050565b60006143bf82612ef5565b91506143ca83612ef5565b9250826143da576143d9614320565b5b82820690509291505056fea2646970667358221220f2a1fb4d55c1b16c965927f9ba156c728d822f64e6a9fd3fe02f93a00f3f51f764736f6c63430008090033697066733a2f2f516d586d327775546a635832726d3550585134747452586f59717677346e64716a564d335a4261347337543272542f00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000138800000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000008546875675261747a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005545241545a000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061025c5760003560e01c80636352211e11610144578063a22cb465116100b6578063c87b56dd1161007a578063c87b56dd146108e4578063d2cab05614610921578063d5abeb011461093d578063db4bec4414610968578063e985e9c5146109a5578063f2fde38b146109e25761025c565b8063a22cb465146107ef578063b071401b14610818578063b59fddbe14610841578063b88d4fde1461087e578063c23dc68f146108a75761025c565b80637ec4a659116101085780637ec4a659146106cb5780638462151c146106f45780638da5cb5b1461073157806394354fd01461075c57806395d89b411461078757806399a2557a146107b25761025c565b80636352211e146105e857806369ba1a751461062557806370a082311461064e578063715018a61461068b5780637cb64759146106a25761025c565b8063200d2ed2116101dd57806342842e0e116101a157806342842e0e146104d857806344a0d68a146105015780634e69d5601461052a5780635503a0e8146105555780635bbb21771461058057806362b99ad4146105bd5761025c565b8063200d2ed21461041957806323b872dd146104445780632eb4a7ab1461046d57806335001a1a146104985780633ccfd60b146104c15761025c565b8063095ea7b311610224578063095ea7b31461035a5780631249c58b1461038357806313faede61461039a57806316ba10e0146103c557806318160ddd146103ee5761025c565b806301ffc9a7146102615780630311bbd31461029e578063035903e6146102c957806306fdde03146102f2578063081812fc1461031d575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190612e92565b610a0b565b6040516102959190612eda565b60405180910390f35b3480156102aa57600080fd5b506102b3610a9d565b6040516102c09190612f0e565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190612f55565b610aa3565b005b3480156102fe57600080fd5b50610307610ab5565b604051610314919061301b565b60405180910390f35b34801561032957600080fd5b50610344600480360381019061033f9190612f55565b610b47565b604051610351919061307e565b60405180910390f35b34801561036657600080fd5b50610381600480360381019061037c91906130c5565b610bc6565b005b34801561038f57600080fd5b50610398610d0a565b005b3480156103a657600080fd5b506103af610eb7565b6040516103bc9190612f0e565b60405180910390f35b3480156103d157600080fd5b506103ec60048036038101906103e7919061323a565b610ebd565b005b3480156103fa57600080fd5b50610403610edf565b6040516104109190612f0e565b60405180910390f35b34801561042557600080fd5b5061042e610ef6565b60405161043b9190612f0e565b60405180910390f35b34801561045057600080fd5b5061046b60048036038101906104669190613283565b610efc565b005b34801561047957600080fd5b50610482611221565b60405161048f91906132ef565b60405180910390f35b3480156104a457600080fd5b506104bf60048036038101906104ba91906130c5565b611227565b005b3480156104cd57600080fd5b506104d6611294565b005b3480156104e457600080fd5b506104ff60048036038101906104fa9190613283565b611372565b005b34801561050d57600080fd5b5061052860048036038101906105239190612f55565b611392565b005b34801561053657600080fd5b5061053f6113a4565b60405161054c9190612f0e565b60405180910390f35b34801561056157600080fd5b5061056a6113ae565b604051610577919061301b565b60405180910390f35b34801561058c57600080fd5b506105a760048036038101906105a2919061336a565b61143c565b6040516105b4919061351a565b60405180910390f35b3480156105c957600080fd5b506105d26114ff565b6040516105df919061301b565b60405180910390f35b3480156105f457600080fd5b5061060f600480360381019061060a9190612f55565b61158d565b60405161061c919061307e565b60405180910390f35b34801561063157600080fd5b5061064c60048036038101906106479190612f55565b61159f565b005b34801561065a57600080fd5b506106756004803603810190610670919061353c565b6115b1565b6040516106829190612f0e565b60405180910390f35b34801561069757600080fd5b506106a061166a565b005b3480156106ae57600080fd5b506106c960048036038101906106c49190613595565b61167e565b005b3480156106d757600080fd5b506106f260048036038101906106ed919061323a565b611690565b005b34801561070057600080fd5b5061071b6004803603810190610716919061353c565b6116b2565b6040516107289190613680565b60405180910390f35b34801561073d57600080fd5b506107466117fc565b604051610753919061307e565b60405180910390f35b34801561076857600080fd5b50610771611826565b60405161077e9190612f0e565b60405180910390f35b34801561079357600080fd5b5061079c61182c565b6040516107a9919061301b565b60405180910390f35b3480156107be57600080fd5b506107d960048036038101906107d491906136a2565b6118be565b6040516107e69190613680565b60405180910390f35b3480156107fb57600080fd5b5061081660048036038101906108119190613721565b611ad2565b005b34801561082457600080fd5b5061083f600480360381019061083a9190612f55565b611c4a565b005b34801561084d57600080fd5b506108686004803603810190610863919061353c565b611c5c565b6040516108759190612f0e565b60405180910390f35b34801561088a57600080fd5b506108a560048036038101906108a09190613802565b611c74565b005b3480156108b357600080fd5b506108ce60048036038101906108c99190612f55565b611ce7565b6040516108db91906138da565b60405180910390f35b3480156108f057600080fd5b5061090b60048036038101906109069190612f55565b611d51565b604051610918919061301b565b60405180910390f35b61093b6004803603810190610936919061394b565b611dfb565b005b34801561094957600080fd5b50610952612105565b60405161095f9190612f0e565b60405180910390f35b34801561097457600080fd5b5061098f600480360381019061098a919061353c565b61210b565b60405161099c9190612eda565b60405180910390f35b3480156109b157600080fd5b506109cc60048036038101906109c791906139ab565b61212b565b6040516109d99190612eda565b60405180910390f35b3480156109ee57600080fd5b50610a096004803603810190610a04919061353c565b6121bf565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a6657506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a965750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60115481565b610aab612243565b8060118190555050565b606060028054610ac490613a1a565b80601f0160208091040260200160405190810160405280929190818152602001828054610af090613a1a565b8015610b3d5780601f10610b1257610100808354040283529160200191610b3d565b820191906000526020600020905b815481529060010190602001808311610b2057829003601f168201915b5050505050905090565b6000610b52826122c1565b610b88576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bd18261158d565b90508073ffffffffffffffffffffffffffffffffffffffff16610bf2612320565b73ffffffffffffffffffffffffffffffffffffffff1614610c5557610c1e81610c19612320565b61212b565b610c54576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60026009541415610d50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4790613a98565b60405180910390fd5b60026009819055506000610d62610edf565b9050600260125414610da9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da090613b04565b60405180910390fd5b600f5460115482610dba9190613b53565b1115610dc557600080fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610dfd57600080fd5b601154601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610e4a57600080fd5b610e55336001612328565b6001601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610ea59190613b53565b92505081905550506001600981905550565b600e5481565b610ec5612243565b80600d9080519060200190610edb929190612d34565b5050565b6000610ee9612346565b6001546000540303905090565b60125481565b6000610f078261234f565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f6e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610f7a8461241d565b91509150610f908187610f8b612320565b612444565b610fdc57610fa586610fa0612320565b61212b565b610fdb576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611043576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110508686866001612488565b801561105b57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506111298561110588888761248e565b7c0200000000000000000000000000000000000000000000000000000000176124b6565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841614156111b15760006001850190506000600460008381526020019081526020016000205414156111af5760005481146111ae578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461121986868660016124e1565b505050505050565b600a5481565b61122f612243565b600f548161123b610edf565b6112459190613b53565b1115611286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127d90613bf5565b60405180910390fd5b6112908282612328565b5050565b61129c612243565b600260095414156112e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d990613a98565b60405180910390fd5b600260098190555060006112f46117fc565b73ffffffffffffffffffffffffffffffffffffffff164760405161131790613c46565b60006040518083038185875af1925050503d8060008114611354576040519150601f19603f3d011682016040523d82523d6000602084013e611359565b606091505b505090508061136757600080fd5b506001600981905550565b61138d83838360405180602001604052806000815250611c74565b505050565b61139a612243565b80600e8190555050565b6000601254905090565b600d80546113bb90613a1a565b80601f01602080910402602001604051908101604052809291908181526020018280546113e790613a1a565b80156114345780601f1061140957610100808354040283529160200191611434565b820191906000526020600020905b81548152906001019060200180831161141757829003601f168201915b505050505081565b6060600083839050905060008167ffffffffffffffff8111156114625761146161310f565b5b60405190808252806020026020018201604052801561149b57816020015b611488612dba565b8152602001906001900390816114805790505b50905060005b8281146114f3576114ca8686838181106114be576114bd613c5b565b5b90506020020135611ce7565b8282815181106114dd576114dc613c5b565b5b60200260200101819052508060010190506114a1565b50809250505092915050565b600c805461150c90613a1a565b80601f016020809104026020016040519081016040528092919081815260200182805461153890613a1a565b80156115855780601f1061155a57610100808354040283529160200191611585565b820191906000526020600020905b81548152906001019060200180831161156857829003601f168201915b505050505081565b60006115988261234f565b9050919050565b6115a7612243565b8060128190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611619576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611672612243565b61167c60006124e7565b565b611686612243565b80600a8190555050565b611698612243565b80600c90805190602001906116ae929190612d34565b5050565b606060008060006116c2856115b1565b905060008167ffffffffffffffff8111156116e0576116df61310f565b5b60405190808252806020026020018201604052801561170e5781602001602082028036833780820191505090505b509050611719612dba565b6000611723612346565b90505b8386146117ee57611736816125ad565b9150816040015115611747576117e3565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461178757816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156117e257808387806001019850815181106117d5576117d4613c5b565b5b6020026020010181815250505b5b806001019050611726565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60105481565b60606003805461183b90613a1a565b80601f016020809104026020016040519081016040528092919081815260200182805461186790613a1a565b80156118b45780601f10611889576101008083540402835291602001916118b4565b820191906000526020600020905b81548152906001019060200180831161189757829003601f168201915b5050505050905090565b60608183106118f9576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806119046125d8565b905061190e612346565b8510156119205761191d612346565b94505b8084111561192c578093505b6000611937876115b1565b90508486101561195a576000868603905081811015611954578091505b5061195f565b600090505b60008167ffffffffffffffff81111561197b5761197a61310f565b5b6040519080825280602002602001820160405280156119a95781602001602082028036833780820191505090505b50905060008214156119c15780945050505050611acb565b60006119cc88611ce7565b9050600081604001516119e157816000015190505b60008990505b8881141580156119f75750848714155b15611abd57611a05816125ad565b9250826040015115611a1657611ab2565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611a5657826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ab15780848880600101995081518110611aa457611aa3613c5b565b5b6020026020010181815250505b5b8060010190506119e7565b508583528296505050505050505b9392505050565b611ada612320565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b3f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611b4c612320565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611bf9612320565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c3e9190612eda565b60405180910390a35050565b611c52612243565b8060108190555050565b60136020528060005260406000206000915090505481565b611c7f848484610efc565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611ce157611caa848484846125e1565b611ce0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611cef612dba565b611cf7612dba565b611cff612346565b831080611d135750611d0f6125d8565b8310155b15611d215780915050611d4c565b611d2a836125ad565b9050806040015115611d3f5780915050611d4c565b611d4883612741565b9150505b919050565b6060611d5c826122c1565b611d9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9290613cfc565b60405180910390fd5b6000611da5612761565b90506000815111611dc55760405180602001604052806000815250611df3565b80611dcf846127f3565b600d604051602001611de393929190613dec565b6040516020818303038152906040525b915050919050565b82600081118015611e0e57506010548111155b611e4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4490613e69565b60405180910390fd5b600f5481611e59610edf565b611e639190613b53565b1115611ea4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9b90613bf5565b60405180910390fd5b8380600e54611eb39190613e89565b341015611ef5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eec90613f2f565b60405180910390fd5b600160125414611f3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3190613f9b565b60405180910390fd5b600b6000611f46612954565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611fce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc590614007565b60405180910390fd5b6000611fd8612954565b604051602001611fe8919061406f565b60405160208183030381529060405280519060200120905061204e858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a548361295c565b61208d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612084906140d6565b60405180910390fd5b6001600b600061209b612954565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506120fd6120f7612954565b87612328565b505050505050565b600f5481565b600b6020528060005260406000206000915054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121c7612243565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612237576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222e90614168565b60405180910390fd5b612240816124e7565b50565b61224b612954565b73ffffffffffffffffffffffffffffffffffffffff166122696117fc565b73ffffffffffffffffffffffffffffffffffffffff16146122bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b6906141d4565b60405180910390fd5b565b6000816122cc612346565b111580156122db575060005482105b8015612319575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b612342828260405180602001604052806000815250612973565b5050565b60006001905090565b6000808290508061235e612346565b116123e6576000548110156123e55760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156123e3575b60008114156123d95760046000836001900393508381526020019081526020016000205490506123ae565b8092505050612418565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86124a5868684612a10565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6125b5612dba565b6125d16004600084815260200190815260200160002054612a19565b9050919050565b60008054905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612607612320565b8786866040518563ffffffff1660e01b81526004016126299493929190614249565b602060405180830381600087803b15801561264357600080fd5b505af192505050801561267457506040513d601f19601f8201168201806040525081019061267191906142aa565b60015b6126ee573d80600081146126a4576040519150601f19603f3d011682016040523d82523d6000602084013e6126a9565b606091505b506000815114156126e6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b612749612dba565b61275a6127558361234f565b612a19565b9050919050565b6060600c805461277090613a1a565b80601f016020809104026020016040519081016040528092919081815260200182805461279c90613a1a565b80156127e95780601f106127be576101008083540402835291602001916127e9565b820191906000526020600020905b8154815290600101906020018083116127cc57829003601f168201915b5050505050905090565b6060600082141561283b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061294f565b600082905060005b6000821461286d578080612856906142d7565b915050600a82612866919061434f565b9150612843565b60008167ffffffffffffffff8111156128895761288861310f565b5b6040519080825280601f01601f1916602001820160405280156128bb5781602001600182028036833780820191505090505b5090505b60008514612948576001826128d49190614380565b9150600a856128e391906143b4565b60306128ef9190613b53565b60f81b81838151811061290557612904613c5b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612941919061434f565b94506128bf565b8093505050505b919050565b600033905090565b6000826129698584612acf565b1490509392505050565b61297d8383612b25565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612a0b57600080549050600083820390505b6129bd60008683806001019450866125e1565b6129f3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106129aa578160005414612a0857600080fd5b50505b505050565b60009392505050565b612a21612dba565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60008082905060005b8451811015612b1a57612b0582868381518110612af857612af7613c5b565b5b6020026020010151612ce2565b91508080612b12906142d7565b915050612ad8565b508091505092915050565b6000805490506000821415612b66576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b736000848385612488565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612bea83612bdb600086600061248e565b612be485612d0d565b176124b6565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612c8b57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612c50565b506000821415612cc7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050612cdd60008483856124e1565b505050565b6000818310612cfa57612cf58284612d1d565b612d05565b612d048383612d1d565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b828054612d4090613a1a565b90600052602060002090601f016020900481019282612d625760008555612da9565b82601f10612d7b57805160ff1916838001178555612da9565b82800160010185558215612da9579182015b82811115612da8578251825591602001919060010190612d8d565b5b509050612db69190612e09565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b80821115612e22576000816000905550600101612e0a565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612e6f81612e3a565b8114612e7a57600080fd5b50565b600081359050612e8c81612e66565b92915050565b600060208284031215612ea857612ea7612e30565b5b6000612eb684828501612e7d565b91505092915050565b60008115159050919050565b612ed481612ebf565b82525050565b6000602082019050612eef6000830184612ecb565b92915050565b6000819050919050565b612f0881612ef5565b82525050565b6000602082019050612f236000830184612eff565b92915050565b612f3281612ef5565b8114612f3d57600080fd5b50565b600081359050612f4f81612f29565b92915050565b600060208284031215612f6b57612f6a612e30565b5b6000612f7984828501612f40565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612fbc578082015181840152602081019050612fa1565b83811115612fcb576000848401525b50505050565b6000601f19601f8301169050919050565b6000612fed82612f82565b612ff78185612f8d565b9350613007818560208601612f9e565b61301081612fd1565b840191505092915050565b600060208201905081810360008301526130358184612fe2565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006130688261303d565b9050919050565b6130788161305d565b82525050565b6000602082019050613093600083018461306f565b92915050565b6130a28161305d565b81146130ad57600080fd5b50565b6000813590506130bf81613099565b92915050565b600080604083850312156130dc576130db612e30565b5b60006130ea858286016130b0565b92505060206130fb85828601612f40565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61314782612fd1565b810181811067ffffffffffffffff821117156131665761316561310f565b5b80604052505050565b6000613179612e26565b9050613185828261313e565b919050565b600067ffffffffffffffff8211156131a5576131a461310f565b5b6131ae82612fd1565b9050602081019050919050565b82818337600083830152505050565b60006131dd6131d88461318a565b61316f565b9050828152602081018484840111156131f9576131f861310a565b5b6132048482856131bb565b509392505050565b600082601f83011261322157613220613105565b5b81356132318482602086016131ca565b91505092915050565b6000602082840312156132505761324f612e30565b5b600082013567ffffffffffffffff81111561326e5761326d612e35565b5b61327a8482850161320c565b91505092915050565b60008060006060848603121561329c5761329b612e30565b5b60006132aa868287016130b0565b93505060206132bb868287016130b0565b92505060406132cc86828701612f40565b9150509250925092565b6000819050919050565b6132e9816132d6565b82525050565b600060208201905061330460008301846132e0565b92915050565b600080fd5b600080fd5b60008083601f84011261332a57613329613105565b5b8235905067ffffffffffffffff8111156133475761334661330a565b5b6020830191508360208202830111156133635761336261330f565b5b9250929050565b6000806020838503121561338157613380612e30565b5b600083013567ffffffffffffffff81111561339f5761339e612e35565b5b6133ab85828601613314565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6133ec8161305d565b82525050565b600067ffffffffffffffff82169050919050565b61340f816133f2565b82525050565b61341e81612ebf565b82525050565b600062ffffff82169050919050565b61343c81613424565b82525050565b60808201600082015161345860008501826133e3565b50602082015161346b6020850182613406565b50604082015161347e6040850182613415565b5060608201516134916060850182613433565b50505050565b60006134a38383613442565b60808301905092915050565b6000602082019050919050565b60006134c7826133b7565b6134d181856133c2565b93506134dc836133d3565b8060005b8381101561350d5781516134f48882613497565b97506134ff836134af565b9250506001810190506134e0565b5085935050505092915050565b6000602082019050818103600083015261353481846134bc565b905092915050565b60006020828403121561355257613551612e30565b5b6000613560848285016130b0565b91505092915050565b613572816132d6565b811461357d57600080fd5b50565b60008135905061358f81613569565b92915050565b6000602082840312156135ab576135aa612e30565b5b60006135b984828501613580565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6135f781612ef5565b82525050565b600061360983836135ee565b60208301905092915050565b6000602082019050919050565b600061362d826135c2565b61363781856135cd565b9350613642836135de565b8060005b8381101561367357815161365a88826135fd565b975061366583613615565b925050600181019050613646565b5085935050505092915050565b6000602082019050818103600083015261369a8184613622565b905092915050565b6000806000606084860312156136bb576136ba612e30565b5b60006136c9868287016130b0565b93505060206136da86828701612f40565b92505060406136eb86828701612f40565b9150509250925092565b6136fe81612ebf565b811461370957600080fd5b50565b60008135905061371b816136f5565b92915050565b6000806040838503121561373857613737612e30565b5b6000613746858286016130b0565b92505060206137578582860161370c565b9150509250929050565b600067ffffffffffffffff82111561377c5761377b61310f565b5b61378582612fd1565b9050602081019050919050565b60006137a56137a084613761565b61316f565b9050828152602081018484840111156137c1576137c061310a565b5b6137cc8482856131bb565b509392505050565b600082601f8301126137e9576137e8613105565b5b81356137f9848260208601613792565b91505092915050565b6000806000806080858703121561381c5761381b612e30565b5b600061382a878288016130b0565b945050602061383b878288016130b0565b935050604061384c87828801612f40565b925050606085013567ffffffffffffffff81111561386d5761386c612e35565b5b613879878288016137d4565b91505092959194509250565b60808201600082015161389b60008501826133e3565b5060208201516138ae6020850182613406565b5060408201516138c16040850182613415565b5060608201516138d46060850182613433565b50505050565b60006080820190506138ef6000830184613885565b92915050565b60008083601f84011261390b5761390a613105565b5b8235905067ffffffffffffffff8111156139285761392761330a565b5b6020830191508360208202830111156139445761394361330f565b5b9250929050565b60008060006040848603121561396457613963612e30565b5b600061397286828701612f40565b935050602084013567ffffffffffffffff81111561399357613992612e35565b5b61399f868287016138f5565b92509250509250925092565b600080604083850312156139c2576139c1612e30565b5b60006139d0858286016130b0565b92505060206139e1858286016130b0565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613a3257607f821691505b60208210811415613a4657613a456139eb565b5b50919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613a82601f83612f8d565b9150613a8d82613a4c565b602082019050919050565b60006020820190508181036000830152613ab181613a75565b9050919050565b7f5075626c69632053616c65206973206e6f742041637469766500000000000000600082015250565b6000613aee601983612f8d565b9150613af982613ab8565b602082019050919050565b60006020820190508181036000830152613b1d81613ae1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b5e82612ef5565b9150613b6983612ef5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613b9e57613b9d613b24565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b6000613bdf601483612f8d565b9150613bea82613ba9565b602082019050919050565b60006020820190508181036000830152613c0e81613bd2565b9050919050565b600081905092915050565b50565b6000613c30600083613c15565b9150613c3b82613c20565b600082019050919050565b6000613c5182613c23565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613ce6602f83612f8d565b9150613cf182613c8a565b604082019050919050565b60006020820190508181036000830152613d1581613cd9565b9050919050565b600081905092915050565b6000613d3282612f82565b613d3c8185613d1c565b9350613d4c818560208601612f9e565b80840191505092915050565b60008190508160005260206000209050919050565b60008154613d7a81613a1a565b613d848186613d1c565b94506001821660008114613d9f5760018114613db057613de3565b60ff19831686528186019350613de3565b613db985613d58565b60005b83811015613ddb57815481890152600182019150602081019050613dbc565b838801955050505b50505092915050565b6000613df88286613d27565b9150613e048285613d27565b9150613e108284613d6d565b9150819050949350505050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b6000613e53601483612f8d565b9150613e5e82613e1d565b602082019050919050565b60006020820190508181036000830152613e8281613e46565b9050919050565b6000613e9482612ef5565b9150613e9f83612ef5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613ed857613ed7613b24565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6000613f19601383612f8d565b9150613f2482613ee3565b602082019050919050565b60006020820190508181036000830152613f4881613f0c565b9050919050565b7f57686974656c6973742053616c65206973206e6f742041637469766500000000600082015250565b6000613f85601c83612f8d565b9150613f9082613f4f565b602082019050919050565b60006020820190508181036000830152613fb481613f78565b9050919050565b7f4164647265737320616c726561647920636c61696d6564210000000000000000600082015250565b6000613ff1601883612f8d565b9150613ffc82613fbb565b602082019050919050565b6000602082019050818103600083015261402081613fe4565b9050919050565b60008160601b9050919050565b600061403f82614027565b9050919050565b600061405182614034565b9050919050565b6140696140648261305d565b614046565b82525050565b600061407b8284614058565b60148201915081905092915050565b7f496e76616c69642070726f6f6621000000000000000000000000000000000000600082015250565b60006140c0600e83612f8d565b91506140cb8261408a565b602082019050919050565b600060208201905081810360008301526140ef816140b3565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614152602683612f8d565b915061415d826140f6565b604082019050919050565b6000602082019050818103600083015261418181614145565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006141be602083612f8d565b91506141c982614188565b602082019050919050565b600060208201905081810360008301526141ed816141b1565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061421b826141f4565b61422581856141ff565b9350614235818560208601612f9e565b61423e81612fd1565b840191505092915050565b600060808201905061425e600083018761306f565b61426b602083018661306f565b6142786040830185612eff565b818103606083015261428a8184614210565b905095945050505050565b6000815190506142a481612e66565b92915050565b6000602082840312156142c0576142bf612e30565b5b60006142ce84828501614295565b91505092915050565b60006142e282612ef5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561431557614314613b24565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061435a82612ef5565b915061436583612ef5565b92508261437557614374614320565b5b828204905092915050565b600061438b82612ef5565b915061439683612ef5565b9250828210156143a9576143a8613b24565b5b828203905092915050565b60006143bf82612ef5565b91506143ca83612ef5565b9250826143da576143d9614320565b5b82820690509291505056fea2646970667358221220f2a1fb4d55c1b16c965927f9ba156c728d822f64e6a9fd3fe02f93a00f3f51f764736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000138800000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000008546875675261747a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005545241545a000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _tokenName (string): ThugRatz
Arg [1] : _tokenSymbol (string): TRATZ
Arg [2] : _cost (uint256): 0
Arg [3] : _maxSupply (uint256): 5000
Arg [4] : _maxMintAmountPerTx (uint256): 1
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000001388
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [6] : 546875675261747a000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [8] : 545241545a000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
77858:4074:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36040:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78266:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81051:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36942:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43425:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42866:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79959:390;;;;;;;;;;;;;:::i;:::-;;78175:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81287:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32693:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78313:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47132:2817;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77961:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79746:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81666:153;;;;;;;;;;;;;:::i;:::-;;50045:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80835:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81587:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78133:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73044:528;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78046:82;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38335:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81497:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33877:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16788:103;;;;;;;;;;;;;:::i;:::-;;81393:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81181:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76920:900;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16140:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78228:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37118:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73960:2513;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43983:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80915:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78371:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50828:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72457:428;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80456:373;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79111:567;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78199:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77991:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44448:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17046:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36040:639;36125:4;36464:10;36449:25;;:11;:25;;;;:102;;;;36541:10;36526:25;;:11;:25;;;;36449:102;:179;;;;36618:10;36603:25;;:11;:25;;;;36449:179;36429:199;;36040:639;;;:::o;78266:42::-;;;;:::o;81051:124::-;16026:13;:11;:13::i;:::-;81158:11:::1;81132:23;:37;;;;81051:124:::0;:::o;36942:100::-;36996:13;37029:5;37022:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36942:100;:::o;43425:218::-;43501:7;43526:16;43534:7;43526;:16::i;:::-;43521:64;;43551:34;;;;;;;;;;;;;;43521:64;43605:15;:24;43621:7;43605:24;;;;;;;;;;;:30;;;;;;;;;;;;43598:37;;43425:218;;;:::o;42866:400::-;42947:13;42963:16;42971:7;42963;:16::i;:::-;42947:32;;43019:5;42996:28;;:19;:17;:19::i;:::-;:28;;;42992:175;;43044:44;43061:5;43068:19;:17;:19::i;:::-;43044:16;:44::i;:::-;43039:128;;43116:35;;;;;;;;;;;;;;43039:128;42992:175;43212:2;43179:15;:24;43195:7;43179:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;43250:7;43246:2;43230:28;;43239:5;43230:28;;;;;;;;;;;;42936:330;42866:400;;:::o;79959:390::-;4340:1;4938:7;;:19;;4930:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;4340:1;5071:7;:18;;;;80004:22:::1;80029:13;:11;:13::i;:::-;80004:38;;80067:1;80057:6;;:11;80049:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;80158:9;;80131:23;;80114:14;:40;;;;:::i;:::-;:53;;80106:62;;;::::0;::::1;;80197:9;80183:23;;:10;:23;;;80175:32;;;::::0;::::1;;80251:23;;80222:14;:26;80237:10;80222:26;;;;;;;;;;;;;;;;:52;80214:61;;;::::0;::::1;;80282:24;80292:10;80304:1;80282:9;:24::i;:::-;80343:1;80313:14;:26;80328:10;80313:26;;;;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;79997:352;4296:1:::0;5250:7;:22;;;;79959:390::o;78175:19::-;;;;:::o;81287:100::-;16026:13;:11;:13::i;:::-;81371:10:::1;81359:9;:22;;;;;;;;;;;;:::i;:::-;;81287:100:::0;:::o;32693:323::-;32754:7;32982:15;:13;:15::i;:::-;32967:12;;32951:13;;:28;:46;32944:53;;32693:323;:::o;78313:22::-;;;;:::o;47132:2817::-;47266:27;47296;47315:7;47296:18;:27::i;:::-;47266:57;;47381:4;47340:45;;47356:19;47340:45;;;47336:86;;47394:28;;;;;;;;;;;;;;47336:86;47436:27;47465:23;47492:35;47519:7;47492:26;:35::i;:::-;47435:92;;;;47627:68;47652:15;47669:4;47675:19;:17;:19::i;:::-;47627:24;:68::i;:::-;47622:180;;47715:43;47732:4;47738:19;:17;:19::i;:::-;47715:16;:43::i;:::-;47710:92;;47767:35;;;;;;;;;;;;;;47710:92;47622:180;47833:1;47819:16;;:2;:16;;;47815:52;;;47844:23;;;;;;;;;;;;;;47815:52;47880:43;47902:4;47908:2;47912:7;47921:1;47880:21;:43::i;:::-;48016:15;48013:160;;;48156:1;48135:19;48128:30;48013:160;48553:18;:24;48572:4;48553:24;;;;;;;;;;;;;;;;48551:26;;;;;;;;;;;;48622:18;:22;48641:2;48622:22;;;;;;;;;;;;;;;;48620:24;;;;;;;;;;;48944:146;48981:2;49030:45;49045:4;49051:2;49055:19;49030:14;:45::i;:::-;29092:8;49002:73;48944:18;:146::i;:::-;48915:17;:26;48933:7;48915:26;;;;;;;;;;;:175;;;;49261:1;29092:8;49210:19;:47;:52;49206:627;;;49283:19;49315:1;49305:7;:11;49283:33;;49472:1;49438:17;:30;49456:11;49438:30;;;;;;;;;;;;:35;49434:384;;;49576:13;;49561:11;:28;49557:242;;49756:19;49723:17;:30;49741:11;49723:30;;;;;;;;;;;:52;;;;49557:242;49434:384;49264:569;49206:627;49880:7;49876:2;49861:27;;49870:4;49861:27;;;;;;;;;;;;49899:42;49920:4;49926:2;49930:7;49939:1;49899:20;:42::i;:::-;47255:2694;;;47132:2817;;;:::o;77961:25::-;;;;:::o;79746:208::-;16026:13;:11;:13::i;:::-;79873:9:::1;;79858:11;79842:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;79834:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;79914:34;79924:10;79936:11;79914:9;:34::i;:::-;79746:208:::0;;:::o;81666:153::-;16026:13;:11;:13::i;:::-;4340:1:::1;4938:7;;:19;;4930:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;4340:1;5071:7;:18;;;;81727:7:::2;81748;:5;:7::i;:::-;81740:21;;81769;81740:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81726:69;;;81810:2;81802:11;;;::::0;::::2;;81716:103;4296:1:::1;5250:7;:22;;;;81666:153::o:0;50045:185::-;50183:39;50200:4;50206:2;50210:7;50183:39;;;;;;;;;;;;:16;:39::i;:::-;50045:185;;;:::o;80835:74::-;16026:13;:11;:13::i;:::-;80898:5:::1;80891:4;:12;;;;80835:74:::0;:::o;81587:73::-;81627:4;81648:6;;81641:13;;81587:73;:::o;78133:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;73044:528::-;73188:23;73254:22;73279:8;;:15;;73254:40;;73309:34;73367:14;73346:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;73309:73;;73402:9;73397:125;73418:14;73413:1;:19;73397:125;;73474:32;73494:8;;73503:1;73494:11;;;;;;;:::i;:::-;;;;;;;;73474:19;:32::i;:::-;73458:10;73469:1;73458:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;73434:3;;;;;73397:125;;;;73543:10;73536:17;;;;73044:528;;;;:::o;78046:82::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38335:152::-;38407:7;38450:27;38469:7;38450:18;:27::i;:::-;38427:52;;38335:152;;;:::o;81497:84::-;16026:13;:11;:13::i;:::-;81568:7:::1;81559:6;:16;;;;81497:84:::0;:::o;33877:233::-;33949:7;33990:1;33973:19;;:5;:19;;;33969:60;;;34001:28;;;;;;;;;;;;;;33969:60;28036:13;34047:18;:25;34066:5;34047:25;;;;;;;;;;;;;;;;:55;34040:62;;33877:233;;;:::o;16788:103::-;16026:13;:11;:13::i;:::-;16853:30:::1;16880:1;16853:18;:30::i;:::-;16788:103::o:0;81393:98::-;16026:13;:11;:13::i;:::-;81474:11:::1;81461:10;:24;;;;81393:98:::0;:::o;81181:100::-;16026:13;:11;:13::i;:::-;81265:10:::1;81253:9;:22;;;;;;;;;;;;:::i;:::-;;81181:100:::0;:::o;76920:900::-;76998:16;77052:19;77086:25;77126:22;77151:16;77161:5;77151:9;:16::i;:::-;77126:41;;77182:25;77224:14;77210:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77182:57;;77254:31;;:::i;:::-;77305:9;77317:15;:13;:15::i;:::-;77305:27;;77300:472;77349:14;77334:11;:29;77300:472;;77401:15;77414:1;77401:12;:15::i;:::-;77389:27;;77439:9;:16;;;77435:73;;;77480:8;;77435:73;77556:1;77530:28;;:9;:14;;;:28;;;77526:111;;77603:9;:14;;;77583:34;;77526:111;77680:5;77659:26;;:17;:26;;;77655:102;;;77736:1;77710:8;77719:13;;;;;;77710:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;77655:102;77300:472;77365:3;;;;;77300:472;;;;77793:8;77786:15;;;;;;;76920:900;;;:::o;16140:87::-;16186:7;16213:6;;;;;;;;;;;16206:13;;16140:87;:::o;78228:33::-;;;;:::o;37118:104::-;37174:13;37207:7;37200:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37118:104;:::o;73960:2513::-;74103:16;74170:4;74161:5;:13;74157:45;;74183:19;;;;;;;;;;;;;;74157:45;74217:19;74251:17;74271:14;:12;:14::i;:::-;74251:34;;74371:15;:13;:15::i;:::-;74363:5;:23;74359:87;;;74415:15;:13;:15::i;:::-;74407:23;;74359:87;74522:9;74515:4;:16;74511:73;;;74559:9;74552:16;;74511:73;74598:25;74626:16;74636:5;74626:9;:16::i;:::-;74598:44;;74820:4;74812:5;:12;74808:278;;;74845:19;74874:5;74867:4;:12;74845:34;;74916:17;74902:11;:31;74898:111;;;74978:11;74958:31;;74898:111;74826:198;74808:278;;;75069:1;75049:21;;74808:278;75100:25;75142:17;75128:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75100:60;;75200:1;75179:17;:22;75175:78;;;75229:8;75222:15;;;;;;;;75175:78;75397:31;75431:26;75451:5;75431:19;:26::i;:::-;75397:60;;75472:25;75717:9;:16;;;75712:92;;75774:9;:14;;;75754:34;;75712:92;75823:9;75835:5;75823:17;;75818:478;75847:4;75842:1;:9;;:45;;;;;75870:17;75855:11;:32;;75842:45;75818:478;;;75925:15;75938:1;75925:12;:15::i;:::-;75913:27;;75963:9;:16;;;75959:73;;;76004:8;;75959:73;76080:1;76054:28;;:9;:14;;;:28;;;76050:111;;76127:9;:14;;;76107:34;;76050:111;76204:5;76183:26;;:17;:26;;;76179:102;;;76260:1;76234:8;76243:13;;;;;;76234:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;76179:102;75818:478;75889:3;;;;;75818:478;;;;76398:11;76388:8;76381:29;76446:8;76439:15;;;;;;;;73960:2513;;;;;;:::o;43983:308::-;44094:19;:17;:19::i;:::-;44082:31;;:8;:31;;;44078:61;;;44122:17;;;;;;;;;;;;;;44078:61;44204:8;44152:18;:39;44171:19;:17;:19::i;:::-;44152:39;;;;;;;;;;;;;;;:49;44192:8;44152:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;44264:8;44228:55;;44243:19;:17;:19::i;:::-;44228:55;;;44274:8;44228:55;;;;;;:::i;:::-;;;;;;;;43983:308;;:::o;80915:130::-;16026:13;:11;:13::i;:::-;81020:19:::1;80999:18;:40;;;;80915:130:::0;:::o;78371:49::-;;;;;;;;;;;;;;;;;:::o;50828:399::-;50995:31;51008:4;51014:2;51018:7;50995:12;:31::i;:::-;51059:1;51041:2;:14;;;:19;51037:183;;51080:56;51111:4;51117:2;51121:7;51130:5;51080:30;:56::i;:::-;51075:145;;51164:40;;;;;;;;;;;;;;51075:145;51037:183;50828:399;;;;:::o;72457:428::-;72541:21;;:::i;:::-;72575:31;;:::i;:::-;72631:15;:13;:15::i;:::-;72621:7;:25;:54;;;;72661:14;:12;:14::i;:::-;72650:7;:25;;72621:54;72617:103;;;72699:9;72692:16;;;;;72617:103;72742:21;72755:7;72742:12;:21::i;:::-;72730:33;;72778:9;:16;;;72774:65;;;72818:9;72811:16;;;;;72774:65;72856:21;72869:7;72856:12;:21::i;:::-;72849:28;;;72457:428;;;;:::o;80456:373::-;80530:13;80560:17;80568:8;80560:7;:17::i;:::-;80552:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;80638:28;80669:10;:8;:10::i;:::-;80638:41;;80724:1;80699:14;80693:28;:32;:130;;;;;;;;;;;;;;;;;80761:14;80777:19;:8;:17;:19::i;:::-;80798:9;80744:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;80693:130;80686:137;;;80456:373;;;:::o;79111:567::-;79218:11;78808:1;78794:11;:15;:52;;;;;78828:18;;78813:11;:33;;78794:52;78786:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;78917:9;;78902:11;78886:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;78878:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;79251:11:::1;79056;79049:4;;:18;;;;:::i;:::-;79036:9;:31;;79028:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;79327:1:::2;79317:6;;:11;79309:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;79377:16;:30;79394:12;:10;:12::i;:::-;79377:30;;;;;;;;;;;;;;;;;;;;;;;;;79376:31;79368:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;79443:12;79485;:10;:12::i;:::-;79468:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;79458:41;;;;;;79443:56;;79514:50;79533:12;;79514:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79547:10;;79559:4;79514:18;:50::i;:::-;79506:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;79625:4;79592:16;:30;79609:12;:10;:12::i;:::-;79592:30;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;79636:36;79646:12;:10;:12::i;:::-;79660:11;79636:9;:36::i;:::-;79264:414;78958:1:::1;79111:567:::0;;;;:::o;78199:24::-;;;;:::o;77991:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;44448:164::-;44545:4;44569:18;:25;44588:5;44569:25;;;;;;;;;;;;;;;:35;44595:8;44569:35;;;;;;;;;;;;;;;;;;;;;;;;;44562:42;;44448:164;;;;:::o;17046:201::-;16026:13;:11;:13::i;:::-;17155:1:::1;17135:22;;:8;:22;;;;17127:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;17211:28;17230:8;17211:18;:28::i;:::-;17046:201:::0;:::o;16305:132::-;16380:12;:10;:12::i;:::-;16369:23;;:7;:5;:7::i;:::-;:23;;;16361:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16305:132::o;44870:282::-;44935:4;44991:7;44972:15;:13;:15::i;:::-;:26;;:66;;;;;45025:13;;45015:7;:23;44972:66;:153;;;;;45124:1;28812:8;45076:17;:26;45094:7;45076:26;;;;;;;;;;;;:44;:49;44972:153;44952:173;;44870:282;;;:::o;66636:105::-;66696:7;66723:10;66716:17;;66636:105;:::o;60468:112::-;60545:27;60555:2;60559:8;60545:27;;;;;;;;;;;;:9;:27::i;:::-;60468:112;;:::o;80355:95::-;80420:7;80443:1;80436:8;;80355:95;:::o;39490:1275::-;39557:7;39577:12;39592:7;39577:22;;39660:4;39641:15;:13;:15::i;:::-;:23;39637:1061;;39694:13;;39687:4;:20;39683:1015;;;39732:14;39749:17;:23;39767:4;39749:23;;;;;;;;;;;;39732:40;;39866:1;28812:8;39838:6;:24;:29;39834:845;;;40503:113;40520:1;40510:6;:11;40503:113;;;40563:17;:25;40581:6;;;;;;;40563:25;;;;;;;;;;;;40554:34;;40503:113;;;40649:6;40642:13;;;;;;39834:845;39709:989;39683:1015;39637:1061;40726:31;;;;;;;;;;;;;;39490:1275;;;;:::o;46033:479::-;46135:27;46164:23;46205:38;46246:15;:24;46262:7;46246:24;;;;;;;;;;;46205:65;;46417:18;46394:41;;46474:19;46468:26;46449:45;;46379:126;46033:479;;;:::o;45261:659::-;45410:11;45575:16;45568:5;45564:28;45555:37;;45735:16;45724:9;45720:32;45707:45;;45885:15;45874:9;45871:30;45863:5;45852:9;45849:20;45846:56;45836:66;;45261:659;;;;;:::o;51889:159::-;;;;;:::o;65945:311::-;66080:7;66100:16;29216:3;66126:19;:41;;66100:68;;29216:3;66194:31;66205:4;66211:2;66215:9;66194:10;:31::i;:::-;66186:40;;:62;;66179:69;;;65945:311;;;;;:::o;41313:450::-;41393:14;41561:16;41554:5;41550:28;41541:37;;41738:5;41724:11;41699:23;41695:41;41692:52;41685:5;41682:63;41672:73;;41313:450;;;;:::o;52713:158::-;;;;;:::o;17407:191::-;17481:16;17500:6;;;;;;;;;;;17481:25;;17526:8;17517:6;;:17;;;;;;;;;;;;;;;;;;17581:8;17550:40;;17571:8;17550:40;;;;;;;;;;;;17470:128;17407:191;:::o;38938:161::-;39006:21;;:::i;:::-;39047:44;39066:17;:24;39084:5;39066:24;;;;;;;;;;;;39047:18;:44::i;:::-;39040:51;;38938:161;;;:::o;32380:103::-;32435:7;32462:13;;32455:20;;32380:103;:::o;53311:716::-;53474:4;53520:2;53495:45;;;53541:19;:17;:19::i;:::-;53562:4;53568:7;53577:5;53495:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53491:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53795:1;53778:6;:13;:18;53774:235;;;53824:40;;;;;;;;;;;;;;53774:235;53967:6;53961:13;53952:6;53948:2;53944:15;53937:38;53491:529;53664:54;;;53654:64;;;:6;:64;;;;53647:71;;;53311:716;;;;;;:::o;38676:166::-;38746:21;;:::i;:::-;38787:47;38806:27;38825:7;38806:18;:27::i;:::-;38787:18;:47::i;:::-;38780:54;;38676:166;;;:::o;81825:104::-;81885:13;81914:9;81907:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81825:104;:::o;461:723::-;517:13;747:1;738:5;:10;734:53;;;765:10;;;;;;;;;;;;;;;;;;;;;734:53;797:12;812:5;797:20;;828:14;853:78;868:1;860:4;:9;853:78;;886:8;;;;;:::i;:::-;;;;917:2;909:10;;;;;:::i;:::-;;;853:78;;;941:19;973:6;963:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;941:39;;991:154;1007:1;998:5;:10;991:154;;1035:1;1025:11;;;;;:::i;:::-;;;1102:2;1094:5;:10;;;;:::i;:::-;1081:2;:24;;;;:::i;:::-;1068:39;;1051:6;1058;1051:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1131:2;1122:11;;;;;:::i;:::-;;;991:154;;;1169:6;1155:21;;;;;461:723;;;;:::o;14691:98::-;14744:7;14771:10;14764:17;;14691:98;:::o;6506:190::-;6631:4;6684;6655:25;6668:5;6675:4;6655:12;:25::i;:::-;:33;6648:40;;6506:190;;;;;:::o;59695:689::-;59826:19;59832:2;59836:8;59826:5;:19::i;:::-;59905:1;59887:2;:14;;;:19;59883:483;;59927:11;59941:13;;59927:27;;59973:13;59995:8;59989:3;:14;59973:30;;60022:233;60053:62;60092:1;60096:2;60100:7;;;;;;60109:5;60053:30;:62::i;:::-;60048:167;;60151:40;;;;;;;;;;;;;;60048:167;60250:3;60242:5;:11;60022:233;;60337:3;60320:13;;:20;60316:34;;60342:8;;;60316:34;59908:458;;59883:483;59695:689;;;:::o;65646:147::-;65783:6;65646:147;;;;;:::o;40864:366::-;40930:31;;:::i;:::-;41007:6;40974:9;:14;;:41;;;;;;;;;;;28695:3;41060:6;:33;;41026:9;:24;;:68;;;;;;;;;;;41152:1;28812:8;41124:6;:24;:29;;41105:9;:16;;:48;;;;;;;;;;;29216:3;41193:6;:28;;41164:9;:19;;:58;;;;;;;;;;;40864:366;;;:::o;7373:296::-;7456:7;7476:20;7499:4;7476:27;;7519:9;7514:118;7538:5;:12;7534:1;:16;7514:118;;;7587:33;7597:12;7611:5;7617:1;7611:8;;;;;;;;:::i;:::-;;;;;;;;7587:9;:33::i;:::-;7572:48;;7552:3;;;;;:::i;:::-;;;;7514:118;;;;7649:12;7642:19;;;7373:296;;;;:::o;54489:2454::-;54562:20;54585:13;;54562:36;;54625:1;54613:8;:13;54609:44;;;54635:18;;;;;;;;;;;;;;54609:44;54666:61;54696:1;54700:2;54704:12;54718:8;54666:21;:61::i;:::-;55210:1;28174:2;55180:1;:26;;55179:32;55167:8;:45;55141:18;:22;55160:2;55141:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;55489:139;55526:2;55580:33;55603:1;55607:2;55611:1;55580:14;:33::i;:::-;55547:30;55568:8;55547:20;:30::i;:::-;:66;55489:18;:139::i;:::-;55455:17;:31;55473:12;55455:31;;;;;;;;;;;:173;;;;55645:16;55676:11;55705:8;55690:12;:23;55676:37;;55960:16;55956:2;55952:25;55940:37;;56332:12;56292:8;56251:1;56189:25;56130:1;56069;56042:335;56457:1;56443:12;56439:20;56397:346;56498:3;56489:7;56486:16;56397:346;;56716:7;56706:8;56703:1;56676:25;56673:1;56670;56665:59;56551:1;56542:7;56538:15;56527:26;;56397:346;;;56401:77;56788:1;56776:8;:13;56772:45;;;56798:19;;;;;;;;;;;;;;56772:45;56850:3;56834:13;:19;;;;54915:1950;;56875:60;56904:1;56908:2;56912:12;56926:8;56875:20;:60::i;:::-;54551:2392;54489:2454;;:::o;13580:149::-;13643:7;13674:1;13670;:5;:51;;13701:20;13716:1;13719;13701:14;:20::i;:::-;13670:51;;;13678:20;13693:1;13696;13678:14;:20::i;:::-;13670:51;13663:58;;13580:149;;;;:::o;41865:324::-;41935:14;42168:1;42158:8;42155:15;42129:24;42125:46;42115:56;;41865:324;;;:::o;13737:268::-;13805:13;13912:1;13906:4;13899:15;13941:1;13935:4;13928:15;13982:4;13976;13966:21;13957:30;;13737:268;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:118::-;1688:24;1706:5;1688:24;:::i;:::-;1683:3;1676:37;1601:118;;:::o;1725:222::-;1818:4;1856:2;1845:9;1841:18;1833:26;;1869:71;1937:1;1926:9;1922:17;1913:6;1869:71;:::i;:::-;1725:222;;;;:::o;1953:122::-;2026:24;2044:5;2026:24;:::i;:::-;2019:5;2016:35;2006:63;;2065:1;2062;2055:12;2006:63;1953:122;:::o;2081:139::-;2127:5;2165:6;2152:20;2143:29;;2181:33;2208:5;2181:33;:::i;:::-;2081:139;;;;:::o;2226:329::-;2285:6;2334:2;2322:9;2313:7;2309:23;2305:32;2302:119;;;2340:79;;:::i;:::-;2302:119;2460:1;2485:53;2530:7;2521:6;2510:9;2506:22;2485:53;:::i;:::-;2475:63;;2431:117;2226:329;;;;:::o;2561:99::-;2613:6;2647:5;2641:12;2631:22;;2561:99;;;:::o;2666:169::-;2750:11;2784:6;2779:3;2772:19;2824:4;2819:3;2815:14;2800:29;;2666:169;;;;:::o;2841:307::-;2909:1;2919:113;2933:6;2930:1;2927:13;2919:113;;;3018:1;3013:3;3009:11;3003:18;2999:1;2994:3;2990:11;2983:39;2955:2;2952:1;2948:10;2943:15;;2919:113;;;3050:6;3047:1;3044:13;3041:101;;;3130:1;3121:6;3116:3;3112:16;3105:27;3041:101;2890:258;2841:307;;;:::o;3154:102::-;3195:6;3246:2;3242:7;3237:2;3230:5;3226:14;3222:28;3212:38;;3154:102;;;:::o;3262:364::-;3350:3;3378:39;3411:5;3378:39;:::i;:::-;3433:71;3497:6;3492:3;3433:71;:::i;:::-;3426:78;;3513:52;3558:6;3553:3;3546:4;3539:5;3535:16;3513:52;:::i;:::-;3590:29;3612:6;3590:29;:::i;:::-;3585:3;3581:39;3574:46;;3354:272;3262:364;;;;:::o;3632:313::-;3745:4;3783:2;3772:9;3768:18;3760:26;;3832:9;3826:4;3822:20;3818:1;3807:9;3803:17;3796:47;3860:78;3933:4;3924:6;3860:78;:::i;:::-;3852:86;;3632:313;;;;:::o;3951:126::-;3988:7;4028:42;4021:5;4017:54;4006:65;;3951:126;;;:::o;4083:96::-;4120:7;4149:24;4167:5;4149:24;:::i;:::-;4138:35;;4083:96;;;:::o;4185:118::-;4272:24;4290:5;4272:24;:::i;:::-;4267:3;4260:37;4185:118;;:::o;4309:222::-;4402:4;4440:2;4429:9;4425:18;4417:26;;4453:71;4521:1;4510:9;4506:17;4497:6;4453:71;:::i;:::-;4309:222;;;;:::o;4537:122::-;4610:24;4628:5;4610:24;:::i;:::-;4603:5;4600:35;4590:63;;4649:1;4646;4639:12;4590:63;4537:122;:::o;4665:139::-;4711:5;4749:6;4736:20;4727:29;;4765:33;4792:5;4765:33;:::i;:::-;4665:139;;;;:::o;4810:474::-;4878:6;4886;4935:2;4923:9;4914:7;4910:23;4906:32;4903:119;;;4941:79;;:::i;:::-;4903:119;5061:1;5086:53;5131:7;5122:6;5111:9;5107:22;5086:53;:::i;:::-;5076:63;;5032:117;5188:2;5214:53;5259:7;5250:6;5239:9;5235:22;5214:53;:::i;:::-;5204:63;;5159:118;4810:474;;;;;:::o;5290:117::-;5399:1;5396;5389:12;5413:117;5522:1;5519;5512:12;5536:180;5584:77;5581:1;5574:88;5681:4;5678:1;5671:15;5705:4;5702:1;5695:15;5722:281;5805:27;5827:4;5805:27;:::i;:::-;5797:6;5793:40;5935:6;5923:10;5920:22;5899:18;5887:10;5884:34;5881:62;5878:88;;;5946:18;;:::i;:::-;5878:88;5986:10;5982:2;5975:22;5765:238;5722:281;;:::o;6009:129::-;6043:6;6070:20;;:::i;:::-;6060:30;;6099:33;6127:4;6119:6;6099:33;:::i;:::-;6009:129;;;:::o;6144:308::-;6206:4;6296:18;6288:6;6285:30;6282:56;;;6318:18;;:::i;:::-;6282:56;6356:29;6378:6;6356:29;:::i;:::-;6348:37;;6440:4;6434;6430:15;6422:23;;6144:308;;;:::o;6458:154::-;6542:6;6537:3;6532;6519:30;6604:1;6595:6;6590:3;6586:16;6579:27;6458:154;;;:::o;6618:412::-;6696:5;6721:66;6737:49;6779:6;6737:49;:::i;:::-;6721:66;:::i;:::-;6712:75;;6810:6;6803:5;6796:21;6848:4;6841:5;6837:16;6886:3;6877:6;6872:3;6868:16;6865:25;6862:112;;;6893:79;;:::i;:::-;6862:112;6983:41;7017:6;7012:3;7007;6983:41;:::i;:::-;6702:328;6618:412;;;;;:::o;7050:340::-;7106:5;7155:3;7148:4;7140:6;7136:17;7132:27;7122:122;;7163:79;;:::i;:::-;7122:122;7280:6;7267:20;7305:79;7380:3;7372:6;7365:4;7357:6;7353:17;7305:79;:::i;:::-;7296:88;;7112:278;7050:340;;;;:::o;7396:509::-;7465:6;7514:2;7502:9;7493:7;7489:23;7485:32;7482:119;;;7520:79;;:::i;:::-;7482:119;7668:1;7657:9;7653:17;7640:31;7698:18;7690:6;7687:30;7684:117;;;7720:79;;:::i;:::-;7684:117;7825:63;7880:7;7871:6;7860:9;7856:22;7825:63;:::i;:::-;7815:73;;7611:287;7396:509;;;;:::o;7911:619::-;7988:6;7996;8004;8053:2;8041:9;8032:7;8028:23;8024:32;8021:119;;;8059:79;;:::i;:::-;8021:119;8179:1;8204:53;8249:7;8240:6;8229:9;8225:22;8204:53;:::i;:::-;8194:63;;8150:117;8306:2;8332:53;8377:7;8368:6;8357:9;8353:22;8332:53;:::i;:::-;8322:63;;8277:118;8434:2;8460:53;8505:7;8496:6;8485:9;8481:22;8460:53;:::i;:::-;8450:63;;8405:118;7911:619;;;;;:::o;8536:77::-;8573:7;8602:5;8591:16;;8536:77;;;:::o;8619:118::-;8706:24;8724:5;8706:24;:::i;:::-;8701:3;8694:37;8619:118;;:::o;8743:222::-;8836:4;8874:2;8863:9;8859:18;8851:26;;8887:71;8955:1;8944:9;8940:17;8931:6;8887:71;:::i;:::-;8743:222;;;;:::o;8971:117::-;9080:1;9077;9070:12;9094:117;9203:1;9200;9193:12;9234:568;9307:8;9317:6;9367:3;9360:4;9352:6;9348:17;9344:27;9334:122;;9375:79;;:::i;:::-;9334:122;9488:6;9475:20;9465:30;;9518:18;9510:6;9507:30;9504:117;;;9540:79;;:::i;:::-;9504:117;9654:4;9646:6;9642:17;9630:29;;9708:3;9700:4;9692:6;9688:17;9678:8;9674:32;9671:41;9668:128;;;9715:79;;:::i;:::-;9668:128;9234:568;;;;;:::o;9808:559::-;9894:6;9902;9951:2;9939:9;9930:7;9926:23;9922:32;9919:119;;;9957:79;;:::i;:::-;9919:119;10105:1;10094:9;10090:17;10077:31;10135:18;10127:6;10124:30;10121:117;;;10157:79;;:::i;:::-;10121:117;10270:80;10342:7;10333:6;10322:9;10318:22;10270:80;:::i;:::-;10252:98;;;;10048:312;9808:559;;;;;:::o;10373:145::-;10471:6;10505:5;10499:12;10489:22;;10373:145;;;:::o;10524:215::-;10654:11;10688:6;10683:3;10676:19;10728:4;10723:3;10719:14;10704:29;;10524:215;;;;:::o;10745:163::-;10843:4;10866:3;10858:11;;10896:4;10891:3;10887:14;10879:22;;10745:163;;;:::o;10914:108::-;10991:24;11009:5;10991:24;:::i;:::-;10986:3;10979:37;10914:108;;:::o;11028:101::-;11064:7;11104:18;11097:5;11093:30;11082:41;;11028:101;;;:::o;11135:105::-;11210:23;11227:5;11210:23;:::i;:::-;11205:3;11198:36;11135:105;;:::o;11246:99::-;11317:21;11332:5;11317:21;:::i;:::-;11312:3;11305:34;11246:99;;:::o;11351:91::-;11387:7;11427:8;11420:5;11416:20;11405:31;;11351:91;;;:::o;11448:105::-;11523:23;11540:5;11523:23;:::i;:::-;11518:3;11511:36;11448:105;;:::o;11631:864::-;11780:4;11775:3;11771:14;11867:4;11860:5;11856:16;11850:23;11886:63;11943:4;11938:3;11934:14;11920:12;11886:63;:::i;:::-;11795:164;12051:4;12044:5;12040:16;12034:23;12070:61;12125:4;12120:3;12116:14;12102:12;12070:61;:::i;:::-;11969:172;12225:4;12218:5;12214:16;12208:23;12244:57;12295:4;12290:3;12286:14;12272:12;12244:57;:::i;:::-;12151:160;12398:4;12391:5;12387:16;12381:23;12417:61;12472:4;12467:3;12463:14;12449:12;12417:61;:::i;:::-;12321:167;11749:746;11631:864;;:::o;12501:303::-;12632:10;12653:108;12757:3;12749:6;12653:108;:::i;:::-;12793:4;12788:3;12784:14;12770:28;;12501:303;;;;:::o;12810:144::-;12911:4;12943;12938:3;12934:14;12926:22;;12810:144;;;:::o;13036:980::-;13217:3;13246:85;13325:5;13246:85;:::i;:::-;13347:117;13457:6;13452:3;13347:117;:::i;:::-;13340:124;;13488:87;13569:5;13488:87;:::i;:::-;13598:7;13629:1;13614:377;13639:6;13636:1;13633:13;13614:377;;;13715:6;13709:13;13742:125;13863:3;13848:13;13742:125;:::i;:::-;13735:132;;13890:91;13974:6;13890:91;:::i;:::-;13880:101;;13674:317;13661:1;13658;13654:9;13649:14;;13614:377;;;13618:14;14007:3;14000:10;;13222:794;;;13036:980;;;;:::o;14022:497::-;14227:4;14265:2;14254:9;14250:18;14242:26;;14314:9;14308:4;14304:20;14300:1;14289:9;14285:17;14278:47;14342:170;14507:4;14498:6;14342:170;:::i;:::-;14334:178;;14022:497;;;;:::o;14525:329::-;14584:6;14633:2;14621:9;14612:7;14608:23;14604:32;14601:119;;;14639:79;;:::i;:::-;14601:119;14759:1;14784:53;14829:7;14820:6;14809:9;14805:22;14784:53;:::i;:::-;14774:63;;14730:117;14525:329;;;;:::o;14860:122::-;14933:24;14951:5;14933:24;:::i;:::-;14926:5;14923:35;14913:63;;14972:1;14969;14962:12;14913:63;14860:122;:::o;14988:139::-;15034:5;15072:6;15059:20;15050:29;;15088:33;15115:5;15088:33;:::i;:::-;14988:139;;;;:::o;15133:329::-;15192:6;15241:2;15229:9;15220:7;15216:23;15212:32;15209:119;;;15247:79;;:::i;:::-;15209:119;15367:1;15392:53;15437:7;15428:6;15417:9;15413:22;15392:53;:::i;:::-;15382:63;;15338:117;15133:329;;;;:::o;15468:114::-;15535:6;15569:5;15563:12;15553:22;;15468:114;;;:::o;15588:184::-;15687:11;15721:6;15716:3;15709:19;15761:4;15756:3;15752:14;15737:29;;15588:184;;;;:::o;15778:132::-;15845:4;15868:3;15860:11;;15898:4;15893:3;15889:14;15881:22;;15778:132;;;:::o;15916:108::-;15993:24;16011:5;15993:24;:::i;:::-;15988:3;15981:37;15916:108;;:::o;16030:179::-;16099:10;16120:46;16162:3;16154:6;16120:46;:::i;:::-;16198:4;16193:3;16189:14;16175:28;;16030:179;;;;:::o;16215:113::-;16285:4;16317;16312:3;16308:14;16300:22;;16215:113;;;:::o;16364:732::-;16483:3;16512:54;16560:5;16512:54;:::i;:::-;16582:86;16661:6;16656:3;16582:86;:::i;:::-;16575:93;;16692:56;16742:5;16692:56;:::i;:::-;16771:7;16802:1;16787:284;16812:6;16809:1;16806:13;16787:284;;;16888:6;16882:13;16915:63;16974:3;16959:13;16915:63;:::i;:::-;16908:70;;17001:60;17054:6;17001:60;:::i;:::-;16991:70;;16847:224;16834:1;16831;16827:9;16822:14;;16787:284;;;16791:14;17087:3;17080:10;;16488:608;;;16364:732;;;;:::o;17102:373::-;17245:4;17283:2;17272:9;17268:18;17260:26;;17332:9;17326:4;17322:20;17318:1;17307:9;17303:17;17296:47;17360:108;17463:4;17454:6;17360:108;:::i;:::-;17352:116;;17102:373;;;;:::o;17481:619::-;17558:6;17566;17574;17623:2;17611:9;17602:7;17598:23;17594:32;17591:119;;;17629:79;;:::i;:::-;17591:119;17749:1;17774:53;17819:7;17810:6;17799:9;17795:22;17774:53;:::i;:::-;17764:63;;17720:117;17876:2;17902:53;17947:7;17938:6;17927:9;17923:22;17902:53;:::i;:::-;17892:63;;17847:118;18004:2;18030:53;18075:7;18066:6;18055:9;18051:22;18030:53;:::i;:::-;18020:63;;17975:118;17481:619;;;;;:::o;18106:116::-;18176:21;18191:5;18176:21;:::i;:::-;18169:5;18166:32;18156:60;;18212:1;18209;18202:12;18156:60;18106:116;:::o;18228:133::-;18271:5;18309:6;18296:20;18287:29;;18325:30;18349:5;18325:30;:::i;:::-;18228:133;;;;:::o;18367:468::-;18432:6;18440;18489:2;18477:9;18468:7;18464:23;18460:32;18457:119;;;18495:79;;:::i;:::-;18457:119;18615:1;18640:53;18685:7;18676:6;18665:9;18661:22;18640:53;:::i;:::-;18630:63;;18586:117;18742:2;18768:50;18810:7;18801:6;18790:9;18786:22;18768:50;:::i;:::-;18758:60;;18713:115;18367:468;;;;;:::o;18841:307::-;18902:4;18992:18;18984:6;18981:30;18978:56;;;19014:18;;:::i;:::-;18978:56;19052:29;19074:6;19052:29;:::i;:::-;19044:37;;19136:4;19130;19126:15;19118:23;;18841:307;;;:::o;19154:410::-;19231:5;19256:65;19272:48;19313:6;19272:48;:::i;:::-;19256:65;:::i;:::-;19247:74;;19344:6;19337:5;19330:21;19382:4;19375:5;19371:16;19420:3;19411:6;19406:3;19402:16;19399:25;19396:112;;;19427:79;;:::i;:::-;19396:112;19517:41;19551:6;19546:3;19541;19517:41;:::i;:::-;19237:327;19154:410;;;;;:::o;19583:338::-;19638:5;19687:3;19680:4;19672:6;19668:17;19664:27;19654:122;;19695:79;;:::i;:::-;19654:122;19812:6;19799:20;19837:78;19911:3;19903:6;19896:4;19888:6;19884:17;19837:78;:::i;:::-;19828:87;;19644:277;19583:338;;;;:::o;19927:943::-;20022:6;20030;20038;20046;20095:3;20083:9;20074:7;20070:23;20066:33;20063:120;;;20102:79;;:::i;:::-;20063:120;20222:1;20247:53;20292:7;20283:6;20272:9;20268:22;20247:53;:::i;:::-;20237:63;;20193:117;20349:2;20375:53;20420:7;20411:6;20400:9;20396:22;20375:53;:::i;:::-;20365:63;;20320:118;20477:2;20503:53;20548:7;20539:6;20528:9;20524:22;20503:53;:::i;:::-;20493:63;;20448:118;20633:2;20622:9;20618:18;20605:32;20664:18;20656:6;20653:30;20650:117;;;20686:79;;:::i;:::-;20650:117;20791:62;20845:7;20836:6;20825:9;20821:22;20791:62;:::i;:::-;20781:72;;20576:287;19927:943;;;;;;;:::o;20948:874::-;21107:4;21102:3;21098:14;21194:4;21187:5;21183:16;21177:23;21213:63;21270:4;21265:3;21261:14;21247:12;21213:63;:::i;:::-;21122:164;21378:4;21371:5;21367:16;21361:23;21397:61;21452:4;21447:3;21443:14;21429:12;21397:61;:::i;:::-;21296:172;21552:4;21545:5;21541:16;21535:23;21571:57;21622:4;21617:3;21613:14;21599:12;21571:57;:::i;:::-;21478:160;21725:4;21718:5;21714:16;21708:23;21744:61;21799:4;21794:3;21790:14;21776:12;21744:61;:::i;:::-;21648:167;21076:746;20948:874;;:::o;21828:347::-;21983:4;22021:3;22010:9;22006:19;21998:27;;22035:133;22165:1;22154:9;22150:17;22141:6;22035:133;:::i;:::-;21828:347;;;;:::o;22198:568::-;22271:8;22281:6;22331:3;22324:4;22316:6;22312:17;22308:27;22298:122;;22339:79;;:::i;:::-;22298:122;22452:6;22439:20;22429:30;;22482:18;22474:6;22471:30;22468:117;;;22504:79;;:::i;:::-;22468:117;22618:4;22610:6;22606:17;22594:29;;22672:3;22664:4;22656:6;22652:17;22642:8;22638:32;22635:41;22632:128;;;22679:79;;:::i;:::-;22632:128;22198:568;;;;;:::o;22772:704::-;22867:6;22875;22883;22932:2;22920:9;22911:7;22907:23;22903:32;22900:119;;;22938:79;;:::i;:::-;22900:119;23058:1;23083:53;23128:7;23119:6;23108:9;23104:22;23083:53;:::i;:::-;23073:63;;23029:117;23213:2;23202:9;23198:18;23185:32;23244:18;23236:6;23233:30;23230:117;;;23266:79;;:::i;:::-;23230:117;23379:80;23451:7;23442:6;23431:9;23427:22;23379:80;:::i;:::-;23361:98;;;;23156:313;22772:704;;;;;:::o;23482:474::-;23550:6;23558;23607:2;23595:9;23586:7;23582:23;23578:32;23575:119;;;23613:79;;:::i;:::-;23575:119;23733:1;23758:53;23803:7;23794:6;23783:9;23779:22;23758:53;:::i;:::-;23748:63;;23704:117;23860:2;23886:53;23931:7;23922:6;23911:9;23907:22;23886:53;:::i;:::-;23876:63;;23831:118;23482:474;;;;;:::o;23962:180::-;24010:77;24007:1;24000:88;24107:4;24104:1;24097:15;24131:4;24128:1;24121:15;24148:320;24192:6;24229:1;24223:4;24219:12;24209:22;;24276:1;24270:4;24266:12;24297:18;24287:81;;24353:4;24345:6;24341:17;24331:27;;24287:81;24415:2;24407:6;24404:14;24384:18;24381:38;24378:84;;;24434:18;;:::i;:::-;24378:84;24199:269;24148:320;;;:::o;24474:181::-;24614:33;24610:1;24602:6;24598:14;24591:57;24474:181;:::o;24661:366::-;24803:3;24824:67;24888:2;24883:3;24824:67;:::i;:::-;24817:74;;24900:93;24989:3;24900:93;:::i;:::-;25018:2;25013:3;25009:12;25002:19;;24661:366;;;:::o;25033:419::-;25199:4;25237:2;25226:9;25222:18;25214:26;;25286:9;25280:4;25276:20;25272:1;25261:9;25257:17;25250:47;25314:131;25440:4;25314:131;:::i;:::-;25306:139;;25033:419;;;:::o;25458:175::-;25598:27;25594:1;25586:6;25582:14;25575:51;25458:175;:::o;25639:366::-;25781:3;25802:67;25866:2;25861:3;25802:67;:::i;:::-;25795:74;;25878:93;25967:3;25878:93;:::i;:::-;25996:2;25991:3;25987:12;25980:19;;25639:366;;;:::o;26011:419::-;26177:4;26215:2;26204:9;26200:18;26192:26;;26264:9;26258:4;26254:20;26250:1;26239:9;26235:17;26228:47;26292:131;26418:4;26292:131;:::i;:::-;26284:139;;26011:419;;;:::o;26436:180::-;26484:77;26481:1;26474:88;26581:4;26578:1;26571:15;26605:4;26602:1;26595:15;26622:305;26662:3;26681:20;26699:1;26681:20;:::i;:::-;26676:25;;26715:20;26733:1;26715:20;:::i;:::-;26710:25;;26869:1;26801:66;26797:74;26794:1;26791:81;26788:107;;;26875:18;;:::i;:::-;26788:107;26919:1;26916;26912:9;26905:16;;26622:305;;;;:::o;26933:170::-;27073:22;27069:1;27061:6;27057:14;27050:46;26933:170;:::o;27109:366::-;27251:3;27272:67;27336:2;27331:3;27272:67;:::i;:::-;27265:74;;27348:93;27437:3;27348:93;:::i;:::-;27466:2;27461:3;27457:12;27450:19;;27109:366;;;:::o;27481:419::-;27647:4;27685:2;27674:9;27670:18;27662:26;;27734:9;27728:4;27724:20;27720:1;27709:9;27705:17;27698:47;27762:131;27888:4;27762:131;:::i;:::-;27754:139;;27481:419;;;:::o;27906:147::-;28007:11;28044:3;28029:18;;27906:147;;;;:::o;28059:114::-;;:::o;28179:398::-;28338:3;28359:83;28440:1;28435:3;28359:83;:::i;:::-;28352:90;;28451:93;28540:3;28451:93;:::i;:::-;28569:1;28564:3;28560:11;28553:18;;28179:398;;;:::o;28583:379::-;28767:3;28789:147;28932:3;28789:147;:::i;:::-;28782:154;;28953:3;28946:10;;28583:379;;;:::o;28968:180::-;29016:77;29013:1;29006:88;29113:4;29110:1;29103:15;29137:4;29134:1;29127:15;29154:234;29294:34;29290:1;29282:6;29278:14;29271:58;29363:17;29358:2;29350:6;29346:15;29339:42;29154:234;:::o;29394:366::-;29536:3;29557:67;29621:2;29616:3;29557:67;:::i;:::-;29550:74;;29633:93;29722:3;29633:93;:::i;:::-;29751:2;29746:3;29742:12;29735:19;;29394:366;;;:::o;29766:419::-;29932:4;29970:2;29959:9;29955:18;29947:26;;30019:9;30013:4;30009:20;30005:1;29994:9;29990:17;29983:47;30047:131;30173:4;30047:131;:::i;:::-;30039:139;;29766:419;;;:::o;30191:148::-;30293:11;30330:3;30315:18;;30191:148;;;;:::o;30345:377::-;30451:3;30479:39;30512:5;30479:39;:::i;:::-;30534:89;30616:6;30611:3;30534:89;:::i;:::-;30527:96;;30632:52;30677:6;30672:3;30665:4;30658:5;30654:16;30632:52;:::i;:::-;30709:6;30704:3;30700:16;30693:23;;30455:267;30345:377;;;;:::o;30728:141::-;30777:4;30800:3;30792:11;;30823:3;30820:1;30813:14;30857:4;30854:1;30844:18;30836:26;;30728:141;;;:::o;30899:845::-;31002:3;31039:5;31033:12;31068:36;31094:9;31068:36;:::i;:::-;31120:89;31202:6;31197:3;31120:89;:::i;:::-;31113:96;;31240:1;31229:9;31225:17;31256:1;31251:137;;;;31402:1;31397:341;;;;31218:520;;31251:137;31335:4;31331:9;31320;31316:25;31311:3;31304:38;31371:6;31366:3;31362:16;31355:23;;31251:137;;31397:341;31464:38;31496:5;31464:38;:::i;:::-;31524:1;31538:154;31552:6;31549:1;31546:13;31538:154;;;31626:7;31620:14;31616:1;31611:3;31607:11;31600:35;31676:1;31667:7;31663:15;31652:26;;31574:4;31571:1;31567:12;31562:17;;31538:154;;;31721:6;31716:3;31712:16;31705:23;;31404:334;;31218:520;;31006:738;;30899:845;;;;:::o;31750:589::-;31975:3;31997:95;32088:3;32079:6;31997:95;:::i;:::-;31990:102;;32109:95;32200:3;32191:6;32109:95;:::i;:::-;32102:102;;32221:92;32309:3;32300:6;32221:92;:::i;:::-;32214:99;;32330:3;32323:10;;31750:589;;;;;;:::o;32345:170::-;32485:22;32481:1;32473:6;32469:14;32462:46;32345:170;:::o;32521:366::-;32663:3;32684:67;32748:2;32743:3;32684:67;:::i;:::-;32677:74;;32760:93;32849:3;32760:93;:::i;:::-;32878:2;32873:3;32869:12;32862:19;;32521:366;;;:::o;32893:419::-;33059:4;33097:2;33086:9;33082:18;33074:26;;33146:9;33140:4;33136:20;33132:1;33121:9;33117:17;33110:47;33174:131;33300:4;33174:131;:::i;:::-;33166:139;;32893:419;;;:::o;33318:348::-;33358:7;33381:20;33399:1;33381:20;:::i;:::-;33376:25;;33415:20;33433:1;33415:20;:::i;:::-;33410:25;;33603:1;33535:66;33531:74;33528:1;33525:81;33520:1;33513:9;33506:17;33502:105;33499:131;;;33610:18;;:::i;:::-;33499:131;33658:1;33655;33651:9;33640:20;;33318:348;;;;:::o;33672:169::-;33812:21;33808:1;33800:6;33796:14;33789:45;33672:169;:::o;33847:366::-;33989:3;34010:67;34074:2;34069:3;34010:67;:::i;:::-;34003:74;;34086:93;34175:3;34086:93;:::i;:::-;34204:2;34199:3;34195:12;34188:19;;33847:366;;;:::o;34219:419::-;34385:4;34423:2;34412:9;34408:18;34400:26;;34472:9;34466:4;34462:20;34458:1;34447:9;34443:17;34436:47;34500:131;34626:4;34500:131;:::i;:::-;34492:139;;34219:419;;;:::o;34644:178::-;34784:30;34780:1;34772:6;34768:14;34761:54;34644:178;:::o;34828:366::-;34970:3;34991:67;35055:2;35050:3;34991:67;:::i;:::-;34984:74;;35067:93;35156:3;35067:93;:::i;:::-;35185:2;35180:3;35176:12;35169:19;;34828:366;;;:::o;35200:419::-;35366:4;35404:2;35393:9;35389:18;35381:26;;35453:9;35447:4;35443:20;35439:1;35428:9;35424:17;35417:47;35481:131;35607:4;35481:131;:::i;:::-;35473:139;;35200:419;;;:::o;35625:174::-;35765:26;35761:1;35753:6;35749:14;35742:50;35625:174;:::o;35805:366::-;35947:3;35968:67;36032:2;36027:3;35968:67;:::i;:::-;35961:74;;36044:93;36133:3;36044:93;:::i;:::-;36162:2;36157:3;36153:12;36146:19;;35805:366;;;:::o;36177:419::-;36343:4;36381:2;36370:9;36366:18;36358:26;;36430:9;36424:4;36420:20;36416:1;36405:9;36401:17;36394:47;36458:131;36584:4;36458:131;:::i;:::-;36450:139;;36177:419;;;:::o;36602:94::-;36635:8;36683:5;36679:2;36675:14;36654:35;;36602:94;;;:::o;36702:::-;36741:7;36770:20;36784:5;36770:20;:::i;:::-;36759:31;;36702:94;;;:::o;36802:100::-;36841:7;36870:26;36890:5;36870:26;:::i;:::-;36859:37;;36802:100;;;:::o;36908:157::-;37013:45;37033:24;37051:5;37033:24;:::i;:::-;37013:45;:::i;:::-;37008:3;37001:58;36908:157;;:::o;37071:256::-;37183:3;37198:75;37269:3;37260:6;37198:75;:::i;:::-;37298:2;37293:3;37289:12;37282:19;;37318:3;37311:10;;37071:256;;;;:::o;37333:164::-;37473:16;37469:1;37461:6;37457:14;37450:40;37333:164;:::o;37503:366::-;37645:3;37666:67;37730:2;37725:3;37666:67;:::i;:::-;37659:74;;37742:93;37831:3;37742:93;:::i;:::-;37860:2;37855:3;37851:12;37844:19;;37503:366;;;:::o;37875:419::-;38041:4;38079:2;38068:9;38064:18;38056:26;;38128:9;38122:4;38118:20;38114:1;38103:9;38099:17;38092:47;38156:131;38282:4;38156:131;:::i;:::-;38148:139;;37875:419;;;:::o;38300:225::-;38440:34;38436:1;38428:6;38424:14;38417:58;38509:8;38504:2;38496:6;38492:15;38485:33;38300:225;:::o;38531:366::-;38673:3;38694:67;38758:2;38753:3;38694:67;:::i;:::-;38687:74;;38770:93;38859:3;38770:93;:::i;:::-;38888:2;38883:3;38879:12;38872:19;;38531:366;;;:::o;38903:419::-;39069:4;39107:2;39096:9;39092:18;39084:26;;39156:9;39150:4;39146:20;39142:1;39131:9;39127:17;39120:47;39184:131;39310:4;39184:131;:::i;:::-;39176:139;;38903:419;;;:::o;39328:182::-;39468:34;39464:1;39456:6;39452:14;39445:58;39328:182;:::o;39516:366::-;39658:3;39679:67;39743:2;39738:3;39679:67;:::i;:::-;39672:74;;39755:93;39844:3;39755:93;:::i;:::-;39873:2;39868:3;39864:12;39857:19;;39516:366;;;:::o;39888:419::-;40054:4;40092:2;40081:9;40077:18;40069:26;;40141:9;40135:4;40131:20;40127:1;40116:9;40112:17;40105:47;40169:131;40295:4;40169:131;:::i;:::-;40161:139;;39888:419;;;:::o;40313:98::-;40364:6;40398:5;40392:12;40382:22;;40313:98;;;:::o;40417:168::-;40500:11;40534:6;40529:3;40522:19;40574:4;40569:3;40565:14;40550:29;;40417:168;;;;:::o;40591:360::-;40677:3;40705:38;40737:5;40705:38;:::i;:::-;40759:70;40822:6;40817:3;40759:70;:::i;:::-;40752:77;;40838:52;40883:6;40878:3;40871:4;40864:5;40860:16;40838:52;:::i;:::-;40915:29;40937:6;40915:29;:::i;:::-;40910:3;40906:39;40899:46;;40681:270;40591:360;;;;:::o;40957:640::-;41152:4;41190:3;41179:9;41175:19;41167:27;;41204:71;41272:1;41261:9;41257:17;41248:6;41204:71;:::i;:::-;41285:72;41353:2;41342:9;41338:18;41329:6;41285:72;:::i;:::-;41367;41435:2;41424:9;41420:18;41411:6;41367:72;:::i;:::-;41486:9;41480:4;41476:20;41471:2;41460:9;41456:18;41449:48;41514:76;41585:4;41576:6;41514:76;:::i;:::-;41506:84;;40957:640;;;;;;;:::o;41603:141::-;41659:5;41690:6;41684:13;41675:22;;41706:32;41732:5;41706:32;:::i;:::-;41603:141;;;;:::o;41750:349::-;41819:6;41868:2;41856:9;41847:7;41843:23;41839:32;41836:119;;;41874:79;;:::i;:::-;41836:119;41994:1;42019:63;42074:7;42065:6;42054:9;42050:22;42019:63;:::i;:::-;42009:73;;41965:127;41750:349;;;;:::o;42105:233::-;42144:3;42167:24;42185:5;42167:24;:::i;:::-;42158:33;;42213:66;42206:5;42203:77;42200:103;;;42283:18;;:::i;:::-;42200:103;42330:1;42323:5;42319:13;42312:20;;42105:233;;;:::o;42344:180::-;42392:77;42389:1;42382:88;42489:4;42486:1;42479:15;42513:4;42510:1;42503:15;42530:185;42570:1;42587:20;42605:1;42587:20;:::i;:::-;42582:25;;42621:20;42639:1;42621:20;:::i;:::-;42616:25;;42660:1;42650:35;;42665:18;;:::i;:::-;42650:35;42707:1;42704;42700:9;42695:14;;42530:185;;;;:::o;42721:191::-;42761:4;42781:20;42799:1;42781:20;:::i;:::-;42776:25;;42815:20;42833:1;42815:20;:::i;:::-;42810:25;;42854:1;42851;42848:8;42845:34;;;42859:18;;:::i;:::-;42845:34;42904:1;42901;42897:9;42889:17;;42721:191;;;;:::o;42918:176::-;42950:1;42967:20;42985:1;42967:20;:::i;:::-;42962:25;;43001:20;43019:1;43001:20;:::i;:::-;42996:25;;43040:1;43030:35;;43045:18;;:::i;:::-;43030:35;43086:1;43083;43079:9;43074:14;;42918:176;;;;:::o
Swarm Source
ipfs://f2a1fb4d55c1b16c965927f9ba156c728d822f64e6a9fd3fe02f93a00f3f51f7
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.