ETH Price: $3,159.31 (+1.97%)

Token

Crypto Midgetz (CMZ)
 

Overview

Max Total Supply

5,000 CMZ

Holders

1,498

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
nicewoo.eth
Balance
1 CMZ
0xe19BC2084dd44071BAA9a630F01dCb56cE1F6b7B
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CryptoMidgetz

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-05
*/

// File: @openzeppelin/contracts/utils/Counters.sol


// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @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);
    }
}

// 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 v4.4.1 (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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @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`.
     *
     * 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 calldata data
    ) external;

    /**
     * @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
    ) external;

    /**
     * @dev Transfers `tokenId` token 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);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @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);
}

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @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, can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @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 (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: contracts/CMZ.sol



//Compiled By Annoymous


pragma solidity >=0.7.0 <0.9.0;







  contract CryptoMidgetz is ERC721, Ownable {
  using Strings for uint256;
  using Counters for Counters.Counter;

  Counters.Counter private supply;

  string public baseURI;
  string public baseExtension = ".json";
  string public notRevealedUri;
  uint256 public preSaleCost = 0 ether;
  uint256 public cost = 0 ether;
  uint256 public maxSupply = 5000;
  uint256 public preSaleMaxSupply = 4500;
  uint256 public maxMintAmountPresale = 3;
  uint256 public maxMintAmount = 3;
  uint256 public nftPerAddressLimitPresale = 3;
  uint256 public nftPerAddressLimit = 3;
  uint256 public preSaleDate = 1654337160;
  uint256 public preSaleEndDate = 1654340760;
  uint256 public publicSaleDate = 1654344360;
  bool public paused = false;
  bool public revealed = false;
  bool public onlyWhitelisted = false;
  mapping(address => bool) whitelistedAddresses;
  mapping(address => uint256) public addressMintedBalance;

 address p1 = 0xA1EDe06c992796c9E6B53974785D90411a4B4580; // 
  
  constructor(
    string memory _initBaseURI,
    string memory _initNotRevealedUri
  ) ERC721("Crypto Midgetz", "CMZ") {
    setBaseURI(_initBaseURI);
    setNotRevealedURI(_initNotRevealedUri);
  }

  //MODIFIERS
  modifier notPaused {
    require(!paused, "the contract is paused");
    _;
  }

  modifier saleStarted {
    require(block.timestamp >= preSaleDate, "Sale has not started yet");
    _;
  }

  modifier minimumMintAmount(uint256 _mintAmount) {
    require(_mintAmount > 0, "need to mint at least 1 NFT");
    _;
  }

  // INTERNAL
  function _baseURI() internal view virtual override returns (string memory) {
    return baseURI;
  }

  function presaleValidations(
    uint256 ownerTokenCount,
    uint256 _mintAmount,
    uint256 _supply
  ) internal {
    uint256 actualCost;
    block.timestamp < preSaleEndDate
      ? actualCost = preSaleCost
      : actualCost = cost;
      if (onlyWhitelisted == true) {
    require(isWhitelisted(msg.sender), "user is not whitelisted");
    require(
      ownerTokenCount + _mintAmount <= nftPerAddressLimitPresale,
      "max NFT per address exceeded for presale"
    );
    require(msg.value >= actualCost * _mintAmount, "insufficient funds");
    require(
      _mintAmount <= maxMintAmountPresale,
      "max mint amount per transaction exceeded"
    );
    require(
      supply.current() + _mintAmount <= preSaleMaxSupply,
      "max NFT presale limit exceeded"
    );}
    else {
    require(
      ownerTokenCount + _mintAmount <= nftPerAddressLimitPresale,
      "max NFT per address exceeded for presale"
    );
    require(msg.value >= actualCost * _mintAmount, "insufficient funds");
    require(
      _mintAmount <= maxMintAmountPresale,
      "max mint amount per transaction exceeded"
    );
    require(
      supply.current() + _mintAmount <= preSaleMaxSupply,
      "max NFT presale limit exceeded"
    );
    }
  }

  function publicsaleValidations(uint256 ownerTokenCount, uint256 _mintAmount)
    internal
  {
    require(
      ownerTokenCount + _mintAmount <= nftPerAddressLimit,
      "max NFT per address exceeded"
    );
    require(msg.value >= cost * _mintAmount, "insufficient funds");
    require(
      _mintAmount <= maxMintAmount,
      "max mint amount per transaction exceeded"
    );
  }

  //MINT
  function mint(uint256 _mintAmount)
    public
    payable
    notPaused
    saleStarted
    minimumMintAmount(_mintAmount)
  {
    uint256 ownerTokenCount = addressMintedBalance[msg.sender];

    //Do some validations depending on which step of the sale we are in
    block.timestamp < publicSaleDate
      ? presaleValidations(ownerTokenCount, _mintAmount, supply.current())
      : publicsaleValidations(ownerTokenCount, _mintAmount);

    require(supply.current() + _mintAmount <= maxSupply, "max NFT limit exceeded");

     _mintLoop(msg.sender, _mintAmount);
  }

   function mintForOwner(uint256 _mintAmount) public onlyOwner {
    require(!paused);
    require(_mintAmount > 0);
    require(_mintAmount <= maxMintAmount);
    require(supply.current() + _mintAmount <= maxSupply);

    _mintLoop(msg.sender, _mintAmount);
  }
  
  	function _mintLoop(address _receiver, uint256 _mintAmount) internal {
    for (uint256 i = 0; i < _mintAmount; i++) {
      supply.increment();
      _safeMint(_receiver, supply.current());
    }
  }
 
  
  function gift(uint256 _mintAmount, address destination) public onlyOwner {
    require(_mintAmount > 0, "need to mint at least 1 NFT");
    require(supply.current() + _mintAmount <= maxSupply, "max NFT limit exceeded");

   _mintLoop(msg.sender, _mintAmount);
  }

  //PUBLIC VIEWS
  function isWhitelisted(address _user) public view returns (bool) {
    return whitelistedAddresses[_user];
  }

   function walletOfOwner(address _owner)
    public
    view
    returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
    uint256 currentTokenId = 1;
    uint256 ownedTokenIndex = 0;

    while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
      address currentTokenOwner = ownerOf(currentTokenId);

      if (currentTokenOwner == _owner) {
        ownedTokenIds[ownedTokenIndex] = currentTokenId;

        ownedTokenIndex++;
      }

      currentTokenId++;
    }

    return ownedTokenIds;
  }

  function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );

    if (!revealed) {
      return notRevealedUri;
    } else {
      string memory currentBaseURI = _baseURI();
      return
        bytes(currentBaseURI).length > 0
          ? string(
            abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension)
          )
          : "";
    }
  }
  
    function totalSupply() public view returns (uint256) {
    return supply.current();
  }

  function getCurrentCost() public view returns (uint256) {
    if (block.timestamp < preSaleEndDate) {
      return preSaleCost;
    } else {
      return cost;
    }
  }

  //ONLY OWNER VIEWS
  function getBaseURI() public view onlyOwner returns (string memory) {
    return baseURI;
  }

  function getContractBalance() public view onlyOwner returns (uint256) {
    return address(this).balance;
  }

  //ONLY OWNER SETTERS
  function reveal(bool _state) public onlyOwner {
    revealed = _state;
  }

  function pause(bool _state) public onlyOwner {
    paused = _state;
  }

  function setNftPerAddressLimitPreSale(uint256 _limit) public onlyOwner {
    nftPerAddressLimitPresale = _limit;
  }

  function setNftPerAddressLimit(uint256 _limit) public onlyOwner {
    nftPerAddressLimit = _limit;
  }

  function setPresaleCost(uint256 _newCost) public onlyOwner {
    preSaleCost = _newCost;
  }

  function setCost(uint256 _newCost) public onlyOwner {
    cost = _newCost;
  }

  function setmaxMintAmountPreSale(uint256 _newmaxMintAmount) public onlyOwner {
    maxMintAmountPresale = _newmaxMintAmount;
  }

  function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner {
    maxMintAmount = _newmaxMintAmount;
  }

  function setBaseURI(string memory _newBaseURI) public onlyOwner {
    baseURI = _newBaseURI;
  }

  function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
    baseExtension = _newBaseExtension;
  }

  function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
    notRevealedUri = _notRevealedURI;
  }

  function setPresaleMaxSupply(uint256 _newPresaleMaxSupply) public onlyOwner {
    preSaleMaxSupply = _newPresaleMaxSupply;
  }

  function setMaxSupply(uint256 _maxSupply) public onlyOwner {
    maxSupply = _maxSupply;
  }

  function setPreSaleDate(uint256 _preSaleDate) public onlyOwner {
    preSaleDate = _preSaleDate;
  }

  function setPreSaleEndDate(uint256 _preSaleEndDate) public onlyOwner {
    preSaleEndDate = _preSaleEndDate;
  }

  function setPublicSaleDate(uint256 _publicSaleDate) public onlyOwner {
    publicSaleDate = _publicSaleDate;
  }

    function setOnlyWhitelisted(bool _state) public onlyOwner {
    onlyWhitelisted = _state;
  }

  function whitelistUsers(address[] memory addresses) public onlyOwner {
    for (uint256 i = 0; i < addresses.length; i++) {
      whitelistedAddresses[addresses[i]] = true;
    }
  }

  function withdrawAll() public payable onlyOwner {

  uint256 _p1share = address(this).balance * 50 /100;

  uint256 _ownershare = address(this).balance * 50 /100;


        require(payable(p1).send(_p1share));

        require(payable(msg.sender).send(_ownershare));
  }
    
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"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":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"destination","type":"address"}],"name":"gift","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":[{"internalType":"address","name":"_user","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPresale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintForOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimitPresale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleEndDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setNftPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setNftPerAddressLimitPreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_preSaleDate","type":"uint256"}],"name":"setPreSaleDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_preSaleEndDate","type":"uint256"}],"name":"setPreSaleEndDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setPresaleCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPresaleMaxSupply","type":"uint256"}],"name":"setPresaleMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicSaleDate","type":"uint256"}],"name":"setPublicSaleDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmountPreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"whitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

60c06040526005608081905264173539b7b760d91b60a090815262000028916009919062000288565b506000600b819055600c55611388600d55611194600e556003600f8190556010819055601181905560125563629b2e8860135563629b3c9860145563629b4aa86015556016805462ffffff19169055601980546001600160a01b03191673a1ede06c992796c9e6b53974785d90411a4b4580179055348015620000aa57600080fd5b506040516200346338038062003463833981016040819052620000cd91620003e5565b604080518082018252600e81526d21b93cb83a379026b4b233b2ba3d60911b60208083019182528351808501909452600384526221a6ad60e91b9084015281519192916200011e9160009162000288565b5080516200013490600190602084019062000288565b505050620001516200014b6200016f60201b60201c565b62000173565b6200015c82620001c5565b62000167816200022d565b5050620004a2565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6006546001600160a01b03163314620002145760405162461bcd60e51b815260206004820181905260248201526000805160206200344383398151915260448201526064015b60405180910390fd5b80516200022990600890602084019062000288565b5050565b6006546001600160a01b03163314620002785760405162461bcd60e51b815260206004820181905260248201526000805160206200344383398151915260448201526064016200020b565b80516200022990600a9060208401905b82805462000296906200044f565b90600052602060002090601f016020900481019282620002ba576000855562000305565b82601f10620002d557805160ff191683800117855562000305565b8280016001018555821562000305579182015b8281111562000305578251825591602001919060010190620002e8565b506200031392915062000317565b5090565b5b8082111562000313576000815560010162000318565b600082601f8301126200034057600080fd5b81516001600160401b03808211156200035d576200035d6200048c565b604051601f8301601f19908116603f011681019082821181831017156200038857620003886200048c565b81604052838152602092508683858801011115620003a557600080fd5b600091505b83821015620003c95785820183015181830184015290820190620003aa565b83821115620003db5760008385830101525b9695505050505050565b60008060408385031215620003f957600080fd5b82516001600160401b03808211156200041157600080fd5b6200041f868387016200032e565b935060208501519150808211156200043657600080fd5b5062000445858286016200032e565b9150509250929050565b600181811c908216806200046457607f821691505b602082108114156200048657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b612f9180620004b26000396000f3fe6080604052600436106103ad5760003560e01c806370a08231116101e7578063a0712d681161010d578063d0eb26b0116100a0578063eced38731161006f578063eced387314610a98578063edec5f2714610aae578063f2c4ce1e14610ace578063f2fde38b14610aee57600080fd5b8063d0eb26b0146109f9578063d5abeb0114610a19578063da3ef23f14610a2f578063e985e9c514610a4f57600080fd5b8063ba7d2c76116100dc578063ba7d2c7614610998578063c6682862146109ae578063c87b56dd146109c3578063cc9ff9c6146109e357600080fd5b8063a0712d681461092f578063a18116f114610942578063a22cb46514610958578063b88d4fde1461097857600080fd5b8063831e60de116101855780638fdcf942116101545780638fdcf942146108ba578063940cd05b146108da57806395d89b41146108fa5780639c70b5121461090f57600080fd5b8063831e60de1461085f57806383a076be14610874578063853828b6146108945780638da5cb5b1461089c57600080fd5b8063743c7f6b116101c1578063743c7f6b146107f35780637967a50a146108135780637effc032146108295780637f00c7a61461083f57600080fd5b806370a08231146107a9578063714c5398146107c9578063715018a6146107de57600080fd5b80632e09282e116102d757806355f804b31161026a578063669736c011610239578063669736c01461073f5780636c0360eb1461075f5780636f8b44b0146107745780636f9fb98a1461079457600080fd5b806355f804b3146106c55780635c975abb146106e55780636352211e146106ff57806363bc312a1461071f57600080fd5b806342f0ca0d116102a657806342f0ca0d14610639578063438b63001461065957806344a0d68a1461068657806351830227146106a657600080fd5b80632e09282e146105aa5780633af32abf146105c05780633c952764146105f957806342842e0e1461061957600080fd5b80630a50716b1161034f57806318cae2691161031e57806318cae269146105315780631985cc651461055e578063239c70ae1461057457806323b872dd1461058a57600080fd5b80630a50716b146104b85780630e54a883146104d857806313faede6146104f857806318160ddd1461051c57600080fd5b8063081812fc1161038b578063081812fc1461042b578063081c8c4414610463578063095ea7b3146104785780630a403f041461049857600080fd5b806301ffc9a7146103b257806302329a29146103e757806306fdde0314610409575b600080fd5b3480156103be57600080fd5b506103d26103cd3660046129ed565b610b0e565b60405190151581526020015b60405180910390f35b3480156103f357600080fd5b506104076104023660046129d2565b610b60565b005b34801561041557600080fd5b5061041e610ba6565b6040516103de9190612c1d565b34801561043757600080fd5b5061044b610446366004612a70565b610c38565b6040516001600160a01b0390911681526020016103de565b34801561046f57600080fd5b5061041e610ccd565b34801561048457600080fd5b506104076104933660046128f4565b610d5b565b3480156104a457600080fd5b506104076104b3366004612a70565b610e71565b3480156104c457600080fd5b506104076104d3366004612a70565b610ea0565b3480156104e457600080fd5b506104076104f3366004612a70565b610ecf565b34801561050457600080fd5b5061050e600c5481565b6040519081526020016103de565b34801561052857600080fd5b5061050e610efe565b34801561053d57600080fd5b5061050e61054c3660046127c4565b60186020526000908152604090205481565b34801561056a57600080fd5b5061050e60135481565b34801561058057600080fd5b5061050e60105481565b34801561059657600080fd5b506104076105a5366004612812565b610f0e565b3480156105b657600080fd5b5061050e60115481565b3480156105cc57600080fd5b506103d26105db3660046127c4565b6001600160a01b031660009081526017602052604090205460ff1690565b34801561060557600080fd5b506104076106143660046129d2565b610f3f565b34801561062557600080fd5b50610407610634366004612812565b610f85565b34801561064557600080fd5b50610407610654366004612a70565b610fa0565b34801561066557600080fd5b506106796106743660046127c4565b610fcf565b6040516103de9190612bd9565b34801561069257600080fd5b506104076106a1366004612a70565b6110b0565b3480156106b257600080fd5b506016546103d290610100900460ff1681565b3480156106d157600080fd5b506104076106e0366004612a27565b6110df565b3480156106f157600080fd5b506016546103d29060ff1681565b34801561070b57600080fd5b5061044b61071a366004612a70565b611120565b34801561072b57600080fd5b5061040761073a366004612a70565b611197565b34801561074b57600080fd5b5061040761075a366004612a70565b61121c565b34801561076b57600080fd5b5061041e61124b565b34801561078057600080fd5b5061040761078f366004612a70565b611258565b3480156107a057600080fd5b5061050e611287565b3480156107b557600080fd5b5061050e6107c43660046127c4565b6112b9565b3480156107d557600080fd5b5061041e611340565b3480156107ea57600080fd5b5061040761137a565b3480156107ff57600080fd5b5061040761080e366004612a70565b6113b0565b34801561081f57600080fd5b5061050e60145481565b34801561083557600080fd5b5061050e600f5481565b34801561084b57600080fd5b5061040761085a366004612a70565b6113df565b34801561086b57600080fd5b5061050e61140e565b34801561088057600080fd5b5061040761088f366004612a89565b611428565b61040761150a565b3480156108a857600080fd5b506006546001600160a01b031661044b565b3480156108c657600080fd5b506104076108d5366004612a70565b6115c0565b3480156108e657600080fd5b506104076108f53660046129d2565b6115ef565b34801561090657600080fd5b5061041e611633565b34801561091b57600080fd5b506016546103d29062010000900460ff1681565b61040761093d366004612a70565b611642565b34801561094e57600080fd5b5061050e600e5481565b34801561096457600080fd5b506104076109733660046128ca565b6117d4565b34801561098457600080fd5b5061040761099336600461284e565b6117df565b3480156109a457600080fd5b5061050e60125481565b3480156109ba57600080fd5b5061041e611817565b3480156109cf57600080fd5b5061041e6109de366004612a70565b611824565b3480156109ef57600080fd5b5061050e600b5481565b348015610a0557600080fd5b50610407610a14366004612a70565b6119a8565b348015610a2557600080fd5b5061050e600d5481565b348015610a3b57600080fd5b50610407610a4a366004612a27565b6119d7565b348015610a5b57600080fd5b506103d2610a6a3660046127df565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610aa457600080fd5b5061050e60155481565b348015610aba57600080fd5b50610407610ac936600461291e565b611a14565b348015610ada57600080fd5b50610407610ae9366004612a27565b611aa6565b348015610afa57600080fd5b50610407610b093660046127c4565b611ae3565b60006001600160e01b031982166380ac58cd60e01b1480610b3f57506001600160e01b03198216635b5e139f60e01b145b80610b5a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6006546001600160a01b03163314610b935760405162461bcd60e51b8152600401610b8a90612cca565b60405180910390fd5b6016805460ff1916911515919091179055565b606060008054610bb590612e83565b80601f0160208091040260200160405190810160405280929190818152602001828054610be190612e83565b8015610c2e5780601f10610c0357610100808354040283529160200191610c2e565b820191906000526020600020905b815481529060010190602001808311610c1157829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610cb15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b8a565b506000908152600460205260409020546001600160a01b031690565b600a8054610cda90612e83565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0690612e83565b8015610d535780601f10610d2857610100808354040283529160200191610d53565b820191906000526020600020905b815481529060010190602001808311610d3657829003601f168201915b505050505081565b6000610d6682611120565b9050806001600160a01b0316836001600160a01b03161415610dd45760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b8a565b336001600160a01b0382161480610df05750610df08133610a6a565b610e625760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b8a565b610e6c8383611b7b565b505050565b6006546001600160a01b03163314610e9b5760405162461bcd60e51b8152600401610b8a90612cca565b600e55565b6006546001600160a01b03163314610eca5760405162461bcd60e51b8152600401610b8a90612cca565b601155565b6006546001600160a01b03163314610ef95760405162461bcd60e51b8152600401610b8a90612cca565b601555565b6000610f0960075490565b905090565b610f183382611be9565b610f345760405162461bcd60e51b8152600401610b8a90612d73565b610e6c838383611ce0565b6006546001600160a01b03163314610f695760405162461bcd60e51b8152600401610b8a90612cca565b60168054911515620100000262ff000019909216919091179055565b610e6c838383604051806020016040528060008152506117df565b6006546001600160a01b03163314610fca5760405162461bcd60e51b8152600401610b8a90612cca565b601455565b60606000610fdc836112b9565b905060008167ffffffffffffffff811115610ff957610ff9612f2f565b604051908082528060200260200182016040528015611022578160200160208202803683370190505b509050600160005b838110801561103b5750600d548211155b156110a657600061104b83611120565b9050866001600160a01b0316816001600160a01b03161415611093578284838151811061107a5761107a612f19565b60209081029190910101528161108f81612ebe565b9250505b8261109d81612ebe565b9350505061102a565b5090949350505050565b6006546001600160a01b031633146110da5760405162461bcd60e51b8152600401610b8a90612cca565b600c55565b6006546001600160a01b031633146111095760405162461bcd60e51b8152600401610b8a90612cca565b805161111c9060089060208401906126ac565b5050565b6000818152600260205260408120546001600160a01b031680610b5a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b8a565b6006546001600160a01b031633146111c15760405162461bcd60e51b8152600401610b8a90612cca565b60165460ff16156111d157600080fd5b600081116111de57600080fd5b6010548111156111ed57600080fd5b600d54816111fa60075490565b6112049190612df5565b111561120f57600080fd5b6112193382611e7c565b50565b6006546001600160a01b031633146112465760405162461bcd60e51b8152600401610b8a90612cca565b600f55565b60088054610cda90612e83565b6006546001600160a01b031633146112825760405162461bcd60e51b8152600401610b8a90612cca565b600d55565b6006546000906001600160a01b031633146112b45760405162461bcd60e51b8152600401610b8a90612cca565b504790565b60006001600160a01b0382166113245760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b8a565b506001600160a01b031660009081526003602052604090205490565b6006546060906001600160a01b0316331461136d5760405162461bcd60e51b8152600401610b8a90612cca565b60088054610bb590612e83565b6006546001600160a01b031633146113a45760405162461bcd60e51b8152600401610b8a90612cca565b6113ae6000611eb9565b565b6006546001600160a01b031633146113da5760405162461bcd60e51b8152600401610b8a90612cca565b601355565b6006546001600160a01b031633146114095760405162461bcd60e51b8152600401610b8a90612cca565b601055565b60006014544210156114215750600b5490565b50600c5490565b6006546001600160a01b031633146114525760405162461bcd60e51b8152600401610b8a90612cca565b600082116114a25760405162461bcd60e51b815260206004820152601b60248201527f6e65656420746f206d696e74206174206c656173742031204e465400000000006044820152606401610b8a565b600d54826114af60075490565b6114b99190612df5565b11156115005760405162461bcd60e51b81526020600482015260166024820152751b585e08139195081b1a5b5a5d08195e18d95959195960521b6044820152606401610b8a565b61111c3383611e7c565b6006546001600160a01b031633146115345760405162461bcd60e51b8152600401610b8a90612cca565b60006064611543476032612e21565b61154d9190612e0d565b90506000606461155e476032612e21565b6115689190612e0d565b6019546040519192506001600160a01b03169083156108fc029084906000818181858888f1935050505061159b57600080fd5b604051339082156108fc029083906000818181858888f1935050505061111c57600080fd5b6006546001600160a01b031633146115ea5760405162461bcd60e51b8152600401610b8a90612cca565b600b55565b6006546001600160a01b031633146116195760405162461bcd60e51b8152600401610b8a90612cca565b601680549115156101000261ff0019909216919091179055565b606060018054610bb590612e83565b60165460ff161561168e5760405162461bcd60e51b81526020600482015260166024820152751d1a194818dbdb9d1c9858dd081a5cc81c185d5cd95960521b6044820152606401610b8a565b6013544210156116e05760405162461bcd60e51b815260206004820152601860248201527f53616c6520686173206e6f7420737461727465642079657400000000000000006044820152606401610b8a565b80600081116117315760405162461bcd60e51b815260206004820152601b60248201527f6e65656420746f206d696e74206174206c656173742031204e465400000000006044820152606401610b8a565b336000908152601860205260409020546015544210611759576117548184611f0b565b61176c565b61176c818461176760075490565b611fb5565b600d548361177960075490565b6117839190612df5565b11156117ca5760405162461bcd60e51b81526020600482015260166024820152751b585e08139195081b1a5b5a5d08195e18d95959195960521b6044820152606401610b8a565b610e6c3384611e7c565b61111c338383612201565b6117e93383611be9565b6118055760405162461bcd60e51b8152600401610b8a90612d73565b611811848484846122d0565b50505050565b60098054610cda90612e83565b6000818152600260205260409020546060906001600160a01b03166118a35760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b8a565b601654610100900460ff1661194457600a80546118bf90612e83565b80601f01602080910402602001604051908101604052809291908181526020018280546118eb90612e83565b80156119385780601f1061190d57610100808354040283529160200191611938565b820191906000526020600020905b81548152906001019060200180831161191b57829003601f168201915b50505050509050919050565b600061194e612303565b9050600081511161196e576040518060200160405280600081525061199c565b8061197884612312565b600960405160200161198c93929190612ad8565b6040516020818303038152906040525b9392505050565b919050565b6006546001600160a01b031633146119d25760405162461bcd60e51b8152600401610b8a90612cca565b601255565b6006546001600160a01b03163314611a015760405162461bcd60e51b8152600401610b8a90612cca565b805161111c9060099060208401906126ac565b6006546001600160a01b03163314611a3e5760405162461bcd60e51b8152600401610b8a90612cca565b60005b815181101561111c57600160176000848481518110611a6257611a62612f19565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611a9e81612ebe565b915050611a41565b6006546001600160a01b03163314611ad05760405162461bcd60e51b8152600401610b8a90612cca565b805161111c90600a9060208401906126ac565b6006546001600160a01b03163314611b0d5760405162461bcd60e51b8152600401610b8a90612cca565b6001600160a01b038116611b725760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b8a565b61121981611eb9565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611bb082611120565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611c625760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b8a565b6000611c6d83611120565b9050806001600160a01b0316846001600160a01b03161480611cb457506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80611cd85750836001600160a01b0316611ccd84610c38565b6001600160a01b0316145b949350505050565b826001600160a01b0316611cf382611120565b6001600160a01b031614611d575760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610b8a565b6001600160a01b038216611db95760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b8a565b611dc4600082611b7b565b6001600160a01b0383166000908152600360205260408120805460019290611ded908490612e40565b90915550506001600160a01b0382166000908152600360205260408120805460019290611e1b908490612df5565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60005b81811015610e6c57611e95600780546001019055565b611ea783611ea260075490565b612410565b80611eb181612ebe565b915050611e7f565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b601254611f188284612df5565b1115611f665760405162461bcd60e51b815260206004820152601c60248201527f6d6178204e4654207065722061646472657373206578636565646564000000006044820152606401610b8a565b80600c54611f749190612e21565b341015611f935760405162461bcd60e51b8152600401610b8a90612cff565b60105481111561111c5760405162461bcd60e51b8152600401610b8a90612c82565b60006014544210611fca5750600c5480611fd0565b50600b54805b5060165462010000900460ff16151560011415612126573360009081526017602052604090205460ff166120465760405162461bcd60e51b815260206004820152601760248201527f75736572206973206e6f742077686974656c69737465640000000000000000006044820152606401610b8a565b6011546120538486612df5565b11156120715760405162461bcd60e51b8152600401610b8a90612d2b565b61207b8382612e21565b34101561209a5760405162461bcd60e51b8152600401610b8a90612cff565b600f548311156120bc5760405162461bcd60e51b8152600401610b8a90612c82565b600e54836120c960075490565b6120d39190612df5565b11156121215760405162461bcd60e51b815260206004820152601e60248201527f6d6178204e46542070726573616c65206c696d697420657863656564656400006044820152606401610b8a565b611811565b6011546121338486612df5565b11156121515760405162461bcd60e51b8152600401610b8a90612d2b565b61215b8382612e21565b34101561217a5760405162461bcd60e51b8152600401610b8a90612cff565b600f5483111561219c5760405162461bcd60e51b8152600401610b8a90612c82565b600e54836121a960075490565b6121b39190612df5565b11156118115760405162461bcd60e51b815260206004820152601e60248201527f6d6178204e46542070726573616c65206c696d697420657863656564656400006044820152606401610b8a565b816001600160a01b0316836001600160a01b031614156122635760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b8a565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6122db848484611ce0565b6122e78484848461242a565b6118115760405162461bcd60e51b8152600401610b8a90612c30565b606060088054610bb590612e83565b6060816123365750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612360578061234a81612ebe565b91506123599050600a83612e0d565b915061233a565b60008167ffffffffffffffff81111561237b5761237b612f2f565b6040519080825280601f01601f1916602001820160405280156123a5576020820181803683370190505b5090505b8415611cd8576123ba600183612e40565b91506123c7600a86612ed9565b6123d2906030612df5565b60f81b8183815181106123e7576123e7612f19565b60200101906001600160f81b031916908160001a905350612409600a86612e0d565b94506123a9565b61111c828260405180602001604052806000815250612537565b60006001600160a01b0384163b1561252c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061246e903390899088908890600401612b9c565b602060405180830381600087803b15801561248857600080fd5b505af19250505080156124b8575060408051601f3d908101601f191682019092526124b591810190612a0a565b60015b612512573d8080156124e6576040519150601f19603f3d011682016040523d82523d6000602084013e6124eb565b606091505b50805161250a5760405162461bcd60e51b8152600401610b8a90612c30565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611cd8565b506001949350505050565b612541838361256a565b61254e600084848461242a565b610e6c5760405162461bcd60e51b8152600401610b8a90612c30565b6001600160a01b0382166125c05760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b8a565b6000818152600260205260409020546001600160a01b0316156126255760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b8a565b6001600160a01b038216600090815260036020526040812080546001929061264e908490612df5565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546126b890612e83565b90600052602060002090601f0160209004810192826126da5760008555612720565b82601f106126f357805160ff1916838001178555612720565b82800160010185558215612720579182015b82811115612720578251825591602001919060010190612705565b5061272c929150612730565b5090565b5b8082111561272c5760008155600101612731565b600067ffffffffffffffff83111561275f5761275f612f2f565b612772601f8401601f1916602001612dc4565b905082815283838301111561278657600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146119a357600080fd5b803580151581146119a357600080fd5b6000602082840312156127d657600080fd5b61199c8261279d565b600080604083850312156127f257600080fd5b6127fb8361279d565b91506128096020840161279d565b90509250929050565b60008060006060848603121561282757600080fd5b6128308461279d565b925061283e6020850161279d565b9150604084013590509250925092565b6000806000806080858703121561286457600080fd5b61286d8561279d565b935061287b6020860161279d565b925060408501359150606085013567ffffffffffffffff81111561289e57600080fd5b8501601f810187136128af57600080fd5b6128be87823560208401612745565b91505092959194509250565b600080604083850312156128dd57600080fd5b6128e68361279d565b9150612809602084016127b4565b6000806040838503121561290757600080fd5b6129108361279d565b946020939093013593505050565b6000602080838503121561293157600080fd5b823567ffffffffffffffff8082111561294957600080fd5b818501915085601f83011261295d57600080fd5b81358181111561296f5761296f612f2f565b8060051b9150612980848301612dc4565b8181528481019084860184860187018a101561299b57600080fd5b600095505b838610156129c5576129b18161279d565b8352600195909501949186019186016129a0565b5098975050505050505050565b6000602082840312156129e457600080fd5b61199c826127b4565b6000602082840312156129ff57600080fd5b813561199c81612f45565b600060208284031215612a1c57600080fd5b815161199c81612f45565b600060208284031215612a3957600080fd5b813567ffffffffffffffff811115612a5057600080fd5b8201601f81018413612a6157600080fd5b611cd884823560208401612745565b600060208284031215612a8257600080fd5b5035919050565b60008060408385031215612a9c57600080fd5b823591506128096020840161279d565b60008151808452612ac4816020860160208601612e57565b601f01601f19169290920160200192915050565b600084516020612aeb8285838a01612e57565b855191840191612afe8184848a01612e57565b8554920191600090600181811c9080831680612b1b57607f831692505b858310811415612b3957634e487b7160e01b85526022600452602485fd5b808015612b4d5760018114612b5e57612b8b565b60ff19851688528388019550612b8b565b60008b81526020902060005b85811015612b835781548a820152908401908801612b6a565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612bcf90830184612aac565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612c1157835183529284019291840191600101612bf5565b50909695505050505050565b60208152600061199c6020830184612aac565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526028908201527f6d6178206d696e7420616d6f756e7420706572207472616e73616374696f6e20604082015267195e18d95959195960c21b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b602080825260129082015271696e73756666696369656e742066756e647360701b604082015260600190565b60208082526028908201527f6d6178204e465420706572206164647265737320657863656564656420666f726040820152672070726573616c6560c01b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715612ded57612ded612f2f565b604052919050565b60008219821115612e0857612e08612eed565b500190565b600082612e1c57612e1c612f03565b500490565b6000816000190483118215151615612e3b57612e3b612eed565b500290565b600082821015612e5257612e52612eed565b500390565b60005b83811015612e72578181015183820152602001612e5a565b838111156118115750506000910152565b600181811c90821680612e9757607f821691505b60208210811415612eb857634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612ed257612ed2612eed565b5060010190565b600082612ee857612ee8612f03565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461121957600080fdfea264697066735822122087b88e112ced9d08670a33cb4376a442259c1eb3a467e184ad7f720646d4cee064736f6c634300080700334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d62354c666356335555503252354b4a3634616d52565052566977487a71504b586f647352374734683974677a2f000000000000000000000000000000000000000000000000000000000000000000000000000000000041697066733a2f2f516d4e525153536461526e4741525362376f485a73456537396a5174385354446846536e52744a373732614775362f68696464656e2e6a736f6e00000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106103ad5760003560e01c806370a08231116101e7578063a0712d681161010d578063d0eb26b0116100a0578063eced38731161006f578063eced387314610a98578063edec5f2714610aae578063f2c4ce1e14610ace578063f2fde38b14610aee57600080fd5b8063d0eb26b0146109f9578063d5abeb0114610a19578063da3ef23f14610a2f578063e985e9c514610a4f57600080fd5b8063ba7d2c76116100dc578063ba7d2c7614610998578063c6682862146109ae578063c87b56dd146109c3578063cc9ff9c6146109e357600080fd5b8063a0712d681461092f578063a18116f114610942578063a22cb46514610958578063b88d4fde1461097857600080fd5b8063831e60de116101855780638fdcf942116101545780638fdcf942146108ba578063940cd05b146108da57806395d89b41146108fa5780639c70b5121461090f57600080fd5b8063831e60de1461085f57806383a076be14610874578063853828b6146108945780638da5cb5b1461089c57600080fd5b8063743c7f6b116101c1578063743c7f6b146107f35780637967a50a146108135780637effc032146108295780637f00c7a61461083f57600080fd5b806370a08231146107a9578063714c5398146107c9578063715018a6146107de57600080fd5b80632e09282e116102d757806355f804b31161026a578063669736c011610239578063669736c01461073f5780636c0360eb1461075f5780636f8b44b0146107745780636f9fb98a1461079457600080fd5b806355f804b3146106c55780635c975abb146106e55780636352211e146106ff57806363bc312a1461071f57600080fd5b806342f0ca0d116102a657806342f0ca0d14610639578063438b63001461065957806344a0d68a1461068657806351830227146106a657600080fd5b80632e09282e146105aa5780633af32abf146105c05780633c952764146105f957806342842e0e1461061957600080fd5b80630a50716b1161034f57806318cae2691161031e57806318cae269146105315780631985cc651461055e578063239c70ae1461057457806323b872dd1461058a57600080fd5b80630a50716b146104b85780630e54a883146104d857806313faede6146104f857806318160ddd1461051c57600080fd5b8063081812fc1161038b578063081812fc1461042b578063081c8c4414610463578063095ea7b3146104785780630a403f041461049857600080fd5b806301ffc9a7146103b257806302329a29146103e757806306fdde0314610409575b600080fd5b3480156103be57600080fd5b506103d26103cd3660046129ed565b610b0e565b60405190151581526020015b60405180910390f35b3480156103f357600080fd5b506104076104023660046129d2565b610b60565b005b34801561041557600080fd5b5061041e610ba6565b6040516103de9190612c1d565b34801561043757600080fd5b5061044b610446366004612a70565b610c38565b6040516001600160a01b0390911681526020016103de565b34801561046f57600080fd5b5061041e610ccd565b34801561048457600080fd5b506104076104933660046128f4565b610d5b565b3480156104a457600080fd5b506104076104b3366004612a70565b610e71565b3480156104c457600080fd5b506104076104d3366004612a70565b610ea0565b3480156104e457600080fd5b506104076104f3366004612a70565b610ecf565b34801561050457600080fd5b5061050e600c5481565b6040519081526020016103de565b34801561052857600080fd5b5061050e610efe565b34801561053d57600080fd5b5061050e61054c3660046127c4565b60186020526000908152604090205481565b34801561056a57600080fd5b5061050e60135481565b34801561058057600080fd5b5061050e60105481565b34801561059657600080fd5b506104076105a5366004612812565b610f0e565b3480156105b657600080fd5b5061050e60115481565b3480156105cc57600080fd5b506103d26105db3660046127c4565b6001600160a01b031660009081526017602052604090205460ff1690565b34801561060557600080fd5b506104076106143660046129d2565b610f3f565b34801561062557600080fd5b50610407610634366004612812565b610f85565b34801561064557600080fd5b50610407610654366004612a70565b610fa0565b34801561066557600080fd5b506106796106743660046127c4565b610fcf565b6040516103de9190612bd9565b34801561069257600080fd5b506104076106a1366004612a70565b6110b0565b3480156106b257600080fd5b506016546103d290610100900460ff1681565b3480156106d157600080fd5b506104076106e0366004612a27565b6110df565b3480156106f157600080fd5b506016546103d29060ff1681565b34801561070b57600080fd5b5061044b61071a366004612a70565b611120565b34801561072b57600080fd5b5061040761073a366004612a70565b611197565b34801561074b57600080fd5b5061040761075a366004612a70565b61121c565b34801561076b57600080fd5b5061041e61124b565b34801561078057600080fd5b5061040761078f366004612a70565b611258565b3480156107a057600080fd5b5061050e611287565b3480156107b557600080fd5b5061050e6107c43660046127c4565b6112b9565b3480156107d557600080fd5b5061041e611340565b3480156107ea57600080fd5b5061040761137a565b3480156107ff57600080fd5b5061040761080e366004612a70565b6113b0565b34801561081f57600080fd5b5061050e60145481565b34801561083557600080fd5b5061050e600f5481565b34801561084b57600080fd5b5061040761085a366004612a70565b6113df565b34801561086b57600080fd5b5061050e61140e565b34801561088057600080fd5b5061040761088f366004612a89565b611428565b61040761150a565b3480156108a857600080fd5b506006546001600160a01b031661044b565b3480156108c657600080fd5b506104076108d5366004612a70565b6115c0565b3480156108e657600080fd5b506104076108f53660046129d2565b6115ef565b34801561090657600080fd5b5061041e611633565b34801561091b57600080fd5b506016546103d29062010000900460ff1681565b61040761093d366004612a70565b611642565b34801561094e57600080fd5b5061050e600e5481565b34801561096457600080fd5b506104076109733660046128ca565b6117d4565b34801561098457600080fd5b5061040761099336600461284e565b6117df565b3480156109a457600080fd5b5061050e60125481565b3480156109ba57600080fd5b5061041e611817565b3480156109cf57600080fd5b5061041e6109de366004612a70565b611824565b3480156109ef57600080fd5b5061050e600b5481565b348015610a0557600080fd5b50610407610a14366004612a70565b6119a8565b348015610a2557600080fd5b5061050e600d5481565b348015610a3b57600080fd5b50610407610a4a366004612a27565b6119d7565b348015610a5b57600080fd5b506103d2610a6a3660046127df565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610aa457600080fd5b5061050e60155481565b348015610aba57600080fd5b50610407610ac936600461291e565b611a14565b348015610ada57600080fd5b50610407610ae9366004612a27565b611aa6565b348015610afa57600080fd5b50610407610b093660046127c4565b611ae3565b60006001600160e01b031982166380ac58cd60e01b1480610b3f57506001600160e01b03198216635b5e139f60e01b145b80610b5a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6006546001600160a01b03163314610b935760405162461bcd60e51b8152600401610b8a90612cca565b60405180910390fd5b6016805460ff1916911515919091179055565b606060008054610bb590612e83565b80601f0160208091040260200160405190810160405280929190818152602001828054610be190612e83565b8015610c2e5780601f10610c0357610100808354040283529160200191610c2e565b820191906000526020600020905b815481529060010190602001808311610c1157829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610cb15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b8a565b506000908152600460205260409020546001600160a01b031690565b600a8054610cda90612e83565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0690612e83565b8015610d535780601f10610d2857610100808354040283529160200191610d53565b820191906000526020600020905b815481529060010190602001808311610d3657829003601f168201915b505050505081565b6000610d6682611120565b9050806001600160a01b0316836001600160a01b03161415610dd45760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b8a565b336001600160a01b0382161480610df05750610df08133610a6a565b610e625760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b8a565b610e6c8383611b7b565b505050565b6006546001600160a01b03163314610e9b5760405162461bcd60e51b8152600401610b8a90612cca565b600e55565b6006546001600160a01b03163314610eca5760405162461bcd60e51b8152600401610b8a90612cca565b601155565b6006546001600160a01b03163314610ef95760405162461bcd60e51b8152600401610b8a90612cca565b601555565b6000610f0960075490565b905090565b610f183382611be9565b610f345760405162461bcd60e51b8152600401610b8a90612d73565b610e6c838383611ce0565b6006546001600160a01b03163314610f695760405162461bcd60e51b8152600401610b8a90612cca565b60168054911515620100000262ff000019909216919091179055565b610e6c838383604051806020016040528060008152506117df565b6006546001600160a01b03163314610fca5760405162461bcd60e51b8152600401610b8a90612cca565b601455565b60606000610fdc836112b9565b905060008167ffffffffffffffff811115610ff957610ff9612f2f565b604051908082528060200260200182016040528015611022578160200160208202803683370190505b509050600160005b838110801561103b5750600d548211155b156110a657600061104b83611120565b9050866001600160a01b0316816001600160a01b03161415611093578284838151811061107a5761107a612f19565b60209081029190910101528161108f81612ebe565b9250505b8261109d81612ebe565b9350505061102a565b5090949350505050565b6006546001600160a01b031633146110da5760405162461bcd60e51b8152600401610b8a90612cca565b600c55565b6006546001600160a01b031633146111095760405162461bcd60e51b8152600401610b8a90612cca565b805161111c9060089060208401906126ac565b5050565b6000818152600260205260408120546001600160a01b031680610b5a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b8a565b6006546001600160a01b031633146111c15760405162461bcd60e51b8152600401610b8a90612cca565b60165460ff16156111d157600080fd5b600081116111de57600080fd5b6010548111156111ed57600080fd5b600d54816111fa60075490565b6112049190612df5565b111561120f57600080fd5b6112193382611e7c565b50565b6006546001600160a01b031633146112465760405162461bcd60e51b8152600401610b8a90612cca565b600f55565b60088054610cda90612e83565b6006546001600160a01b031633146112825760405162461bcd60e51b8152600401610b8a90612cca565b600d55565b6006546000906001600160a01b031633146112b45760405162461bcd60e51b8152600401610b8a90612cca565b504790565b60006001600160a01b0382166113245760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b8a565b506001600160a01b031660009081526003602052604090205490565b6006546060906001600160a01b0316331461136d5760405162461bcd60e51b8152600401610b8a90612cca565b60088054610bb590612e83565b6006546001600160a01b031633146113a45760405162461bcd60e51b8152600401610b8a90612cca565b6113ae6000611eb9565b565b6006546001600160a01b031633146113da5760405162461bcd60e51b8152600401610b8a90612cca565b601355565b6006546001600160a01b031633146114095760405162461bcd60e51b8152600401610b8a90612cca565b601055565b60006014544210156114215750600b5490565b50600c5490565b6006546001600160a01b031633146114525760405162461bcd60e51b8152600401610b8a90612cca565b600082116114a25760405162461bcd60e51b815260206004820152601b60248201527f6e65656420746f206d696e74206174206c656173742031204e465400000000006044820152606401610b8a565b600d54826114af60075490565b6114b99190612df5565b11156115005760405162461bcd60e51b81526020600482015260166024820152751b585e08139195081b1a5b5a5d08195e18d95959195960521b6044820152606401610b8a565b61111c3383611e7c565b6006546001600160a01b031633146115345760405162461bcd60e51b8152600401610b8a90612cca565b60006064611543476032612e21565b61154d9190612e0d565b90506000606461155e476032612e21565b6115689190612e0d565b6019546040519192506001600160a01b03169083156108fc029084906000818181858888f1935050505061159b57600080fd5b604051339082156108fc029083906000818181858888f1935050505061111c57600080fd5b6006546001600160a01b031633146115ea5760405162461bcd60e51b8152600401610b8a90612cca565b600b55565b6006546001600160a01b031633146116195760405162461bcd60e51b8152600401610b8a90612cca565b601680549115156101000261ff0019909216919091179055565b606060018054610bb590612e83565b60165460ff161561168e5760405162461bcd60e51b81526020600482015260166024820152751d1a194818dbdb9d1c9858dd081a5cc81c185d5cd95960521b6044820152606401610b8a565b6013544210156116e05760405162461bcd60e51b815260206004820152601860248201527f53616c6520686173206e6f7420737461727465642079657400000000000000006044820152606401610b8a565b80600081116117315760405162461bcd60e51b815260206004820152601b60248201527f6e65656420746f206d696e74206174206c656173742031204e465400000000006044820152606401610b8a565b336000908152601860205260409020546015544210611759576117548184611f0b565b61176c565b61176c818461176760075490565b611fb5565b600d548361177960075490565b6117839190612df5565b11156117ca5760405162461bcd60e51b81526020600482015260166024820152751b585e08139195081b1a5b5a5d08195e18d95959195960521b6044820152606401610b8a565b610e6c3384611e7c565b61111c338383612201565b6117e93383611be9565b6118055760405162461bcd60e51b8152600401610b8a90612d73565b611811848484846122d0565b50505050565b60098054610cda90612e83565b6000818152600260205260409020546060906001600160a01b03166118a35760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b8a565b601654610100900460ff1661194457600a80546118bf90612e83565b80601f01602080910402602001604051908101604052809291908181526020018280546118eb90612e83565b80156119385780601f1061190d57610100808354040283529160200191611938565b820191906000526020600020905b81548152906001019060200180831161191b57829003601f168201915b50505050509050919050565b600061194e612303565b9050600081511161196e576040518060200160405280600081525061199c565b8061197884612312565b600960405160200161198c93929190612ad8565b6040516020818303038152906040525b9392505050565b919050565b6006546001600160a01b031633146119d25760405162461bcd60e51b8152600401610b8a90612cca565b601255565b6006546001600160a01b03163314611a015760405162461bcd60e51b8152600401610b8a90612cca565b805161111c9060099060208401906126ac565b6006546001600160a01b03163314611a3e5760405162461bcd60e51b8152600401610b8a90612cca565b60005b815181101561111c57600160176000848481518110611a6257611a62612f19565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611a9e81612ebe565b915050611a41565b6006546001600160a01b03163314611ad05760405162461bcd60e51b8152600401610b8a90612cca565b805161111c90600a9060208401906126ac565b6006546001600160a01b03163314611b0d5760405162461bcd60e51b8152600401610b8a90612cca565b6001600160a01b038116611b725760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b8a565b61121981611eb9565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611bb082611120565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611c625760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b8a565b6000611c6d83611120565b9050806001600160a01b0316846001600160a01b03161480611cb457506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80611cd85750836001600160a01b0316611ccd84610c38565b6001600160a01b0316145b949350505050565b826001600160a01b0316611cf382611120565b6001600160a01b031614611d575760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610b8a565b6001600160a01b038216611db95760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b8a565b611dc4600082611b7b565b6001600160a01b0383166000908152600360205260408120805460019290611ded908490612e40565b90915550506001600160a01b0382166000908152600360205260408120805460019290611e1b908490612df5565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60005b81811015610e6c57611e95600780546001019055565b611ea783611ea260075490565b612410565b80611eb181612ebe565b915050611e7f565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b601254611f188284612df5565b1115611f665760405162461bcd60e51b815260206004820152601c60248201527f6d6178204e4654207065722061646472657373206578636565646564000000006044820152606401610b8a565b80600c54611f749190612e21565b341015611f935760405162461bcd60e51b8152600401610b8a90612cff565b60105481111561111c5760405162461bcd60e51b8152600401610b8a90612c82565b60006014544210611fca5750600c5480611fd0565b50600b54805b5060165462010000900460ff16151560011415612126573360009081526017602052604090205460ff166120465760405162461bcd60e51b815260206004820152601760248201527f75736572206973206e6f742077686974656c69737465640000000000000000006044820152606401610b8a565b6011546120538486612df5565b11156120715760405162461bcd60e51b8152600401610b8a90612d2b565b61207b8382612e21565b34101561209a5760405162461bcd60e51b8152600401610b8a90612cff565b600f548311156120bc5760405162461bcd60e51b8152600401610b8a90612c82565b600e54836120c960075490565b6120d39190612df5565b11156121215760405162461bcd60e51b815260206004820152601e60248201527f6d6178204e46542070726573616c65206c696d697420657863656564656400006044820152606401610b8a565b611811565b6011546121338486612df5565b11156121515760405162461bcd60e51b8152600401610b8a90612d2b565b61215b8382612e21565b34101561217a5760405162461bcd60e51b8152600401610b8a90612cff565b600f5483111561219c5760405162461bcd60e51b8152600401610b8a90612c82565b600e54836121a960075490565b6121b39190612df5565b11156118115760405162461bcd60e51b815260206004820152601e60248201527f6d6178204e46542070726573616c65206c696d697420657863656564656400006044820152606401610b8a565b816001600160a01b0316836001600160a01b031614156122635760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b8a565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6122db848484611ce0565b6122e78484848461242a565b6118115760405162461bcd60e51b8152600401610b8a90612c30565b606060088054610bb590612e83565b6060816123365750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612360578061234a81612ebe565b91506123599050600a83612e0d565b915061233a565b60008167ffffffffffffffff81111561237b5761237b612f2f565b6040519080825280601f01601f1916602001820160405280156123a5576020820181803683370190505b5090505b8415611cd8576123ba600183612e40565b91506123c7600a86612ed9565b6123d2906030612df5565b60f81b8183815181106123e7576123e7612f19565b60200101906001600160f81b031916908160001a905350612409600a86612e0d565b94506123a9565b61111c828260405180602001604052806000815250612537565b60006001600160a01b0384163b1561252c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061246e903390899088908890600401612b9c565b602060405180830381600087803b15801561248857600080fd5b505af19250505080156124b8575060408051601f3d908101601f191682019092526124b591810190612a0a565b60015b612512573d8080156124e6576040519150601f19603f3d011682016040523d82523d6000602084013e6124eb565b606091505b50805161250a5760405162461bcd60e51b8152600401610b8a90612c30565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611cd8565b506001949350505050565b612541838361256a565b61254e600084848461242a565b610e6c5760405162461bcd60e51b8152600401610b8a90612c30565b6001600160a01b0382166125c05760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b8a565b6000818152600260205260409020546001600160a01b0316156126255760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b8a565b6001600160a01b038216600090815260036020526040812080546001929061264e908490612df5565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546126b890612e83565b90600052602060002090601f0160209004810192826126da5760008555612720565b82601f106126f357805160ff1916838001178555612720565b82800160010185558215612720579182015b82811115612720578251825591602001919060010190612705565b5061272c929150612730565b5090565b5b8082111561272c5760008155600101612731565b600067ffffffffffffffff83111561275f5761275f612f2f565b612772601f8401601f1916602001612dc4565b905082815283838301111561278657600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146119a357600080fd5b803580151581146119a357600080fd5b6000602082840312156127d657600080fd5b61199c8261279d565b600080604083850312156127f257600080fd5b6127fb8361279d565b91506128096020840161279d565b90509250929050565b60008060006060848603121561282757600080fd5b6128308461279d565b925061283e6020850161279d565b9150604084013590509250925092565b6000806000806080858703121561286457600080fd5b61286d8561279d565b935061287b6020860161279d565b925060408501359150606085013567ffffffffffffffff81111561289e57600080fd5b8501601f810187136128af57600080fd5b6128be87823560208401612745565b91505092959194509250565b600080604083850312156128dd57600080fd5b6128e68361279d565b9150612809602084016127b4565b6000806040838503121561290757600080fd5b6129108361279d565b946020939093013593505050565b6000602080838503121561293157600080fd5b823567ffffffffffffffff8082111561294957600080fd5b818501915085601f83011261295d57600080fd5b81358181111561296f5761296f612f2f565b8060051b9150612980848301612dc4565b8181528481019084860184860187018a101561299b57600080fd5b600095505b838610156129c5576129b18161279d565b8352600195909501949186019186016129a0565b5098975050505050505050565b6000602082840312156129e457600080fd5b61199c826127b4565b6000602082840312156129ff57600080fd5b813561199c81612f45565b600060208284031215612a1c57600080fd5b815161199c81612f45565b600060208284031215612a3957600080fd5b813567ffffffffffffffff811115612a5057600080fd5b8201601f81018413612a6157600080fd5b611cd884823560208401612745565b600060208284031215612a8257600080fd5b5035919050565b60008060408385031215612a9c57600080fd5b823591506128096020840161279d565b60008151808452612ac4816020860160208601612e57565b601f01601f19169290920160200192915050565b600084516020612aeb8285838a01612e57565b855191840191612afe8184848a01612e57565b8554920191600090600181811c9080831680612b1b57607f831692505b858310811415612b3957634e487b7160e01b85526022600452602485fd5b808015612b4d5760018114612b5e57612b8b565b60ff19851688528388019550612b8b565b60008b81526020902060005b85811015612b835781548a820152908401908801612b6a565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612bcf90830184612aac565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612c1157835183529284019291840191600101612bf5565b50909695505050505050565b60208152600061199c6020830184612aac565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526028908201527f6d6178206d696e7420616d6f756e7420706572207472616e73616374696f6e20604082015267195e18d95959195960c21b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b602080825260129082015271696e73756666696369656e742066756e647360701b604082015260600190565b60208082526028908201527f6d6178204e465420706572206164647265737320657863656564656420666f726040820152672070726573616c6560c01b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715612ded57612ded612f2f565b604052919050565b60008219821115612e0857612e08612eed565b500190565b600082612e1c57612e1c612f03565b500490565b6000816000190483118215151615612e3b57612e3b612eed565b500290565b600082821015612e5257612e52612eed565b500390565b60005b83811015612e72578181015183820152602001612e5a565b838111156118115750506000910152565b600181811c90821680612e9757607f821691505b60208210811415612eb857634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612ed257612ed2612eed565b5060010190565b600082612ee857612ee8612f03565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461121957600080fdfea264697066735822122087b88e112ced9d08670a33cb4376a442259c1eb3a467e184ad7f720646d4cee064736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d62354c666356335555503252354b4a3634616d52565052566977487a71504b586f647352374734683974677a2f000000000000000000000000000000000000000000000000000000000000000000000000000000000041697066733a2f2f516d4e525153536461526e4741525362376f485a73456537396a5174385354446846536e52744a373732614775362f68696464656e2e6a736f6e00000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _initBaseURI (string): ipfs://Qmb5LfcV3UUP2R5KJ64amRVPRViwHzqPKXodsR7G4h9tgz/
Arg [1] : _initNotRevealedUri (string): ipfs://QmNRQSSdaRnGARSb7oHZsEe79jQt8STDhFSnRtJ772aGu6/hidden.json

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [3] : 697066733a2f2f516d62354c666356335555503252354b4a3634616d52565052
Arg [4] : 566977487a71504b586f647352374734683974677a2f00000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000041
Arg [6] : 697066733a2f2f516d4e525153536461526e4741525362376f485a7345653739
Arg [7] : 6a5174385354446846536e52744a373732614775362f68696464656e2e6a736f
Arg [8] : 6e00000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

47078:8970:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26692:305;;;;;;;;;;-1:-1:-1;26692:305:0;;;;;:::i;:::-;;:::i;:::-;;;8599:14:1;;8592:22;8574:41;;8562:2;8547:18;26692:305:0;;;;;;;;53767:73;;;;;;;;;;-1:-1:-1;53767:73:0;;;;;:::i;:::-;;:::i;:::-;;27637:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29197:221::-;;;;;;;;;;-1:-1:-1;29197:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7260:32:1;;;7242:51;;7230:2;7215:18;29197:221:0;7096:203:1;47303:28:0;;;;;;;;;;;;;:::i;28720:411::-;;;;;;;;;;-1:-1:-1;28720:411:0;;;;;:::i;:::-;;:::i;54882:128::-;;;;;;;;;;-1:-1:-1;54882:128:0;;;;;:::i;:::-;;:::i;53846:118::-;;;;;;;;;;-1:-1:-1;53846:118:0;;;;;:::i;:::-;;:::i;55344:114::-;;;;;;;;;;-1:-1:-1;55344:114:0;;;;;:::i;:::-;;:::i;47377:29::-;;;;;;;;;;;;;;;;;;;19018:25:1;;;19006:2;18991:18;47377:29:0;18872:177:1;53145:89:0;;;;;;;;;;;;;:::i;47954:55::-;;;;;;;;;;-1:-1:-1;47954:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;47662:39;;;;;;;;;;;;;;;;47534:32;;;;;;;;;;;;;;;;29947:339;;;;;;;;;;-1:-1:-1;29947:339:0;;;;;:::i;:::-;;:::i;47571:44::-;;;;;;;;;;;;;;;;51836:112;;;;;;;;;;-1:-1:-1;51836:112:0;;;;;:::i;:::-;-1:-1:-1;;;;;51915:27:0;51895:4;51915:27;;;:20;:27;;;;;;;;;51836:112;55466:95;;;;;;;;;;-1:-1:-1;55466:95:0;;;;;:::i;:::-;;:::i;30357:185::-;;;;;;;;;;-1:-1:-1;30357:185:0;;;;;:::i;:::-;;:::i;55224:114::-;;;;;;;;;;-1:-1:-1;55224:114:0;;;;;:::i;:::-;;:::i;51955:635::-;;;;;;;;;;-1:-1:-1;51955:635:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;54180:80::-;;;;;;;;;;-1:-1:-1;54180:80:0;;;;;:::i;:::-;;:::i;47831:28::-;;;;;;;;;;-1:-1:-1;47831:28:0;;;;;;;;;;;54524:98;;;;;;;;;;-1:-1:-1;54524:98:0;;;;;:::i;:::-;;:::i;47800:26::-;;;;;;;;;;-1:-1:-1;47800:26:0;;;;;;;;27331:239;;;;;;;;;;-1:-1:-1;27331:239:0;;;;;:::i;:::-;;:::i;51054:266::-;;;;;;;;;;-1:-1:-1;51054:266:0;;;;;:::i;:::-;;:::i;54266:130::-;;;;;;;;;;-1:-1:-1;54266:130:0;;;;;:::i;:::-;;:::i;47235:21::-;;;;;;;;;;;;;:::i;55016:94::-;;;;;;;;;;-1:-1:-1;55016:94:0;;;;;:::i;:::-;;:::i;53544:111::-;;;;;;;;;;;;;:::i;27061:208::-;;;;;;;;;;-1:-1:-1;27061:208:0;;;;;:::i;:::-;;:::i;53443:95::-;;;;;;;;;;;;;:::i;6195:103::-;;;;;;;;;;;;;:::i;55116:102::-;;;;;;;;;;-1:-1:-1;55116:102:0;;;;;:::i;:::-;;:::i;47706:42::-;;;;;;;;;;;;;;;;47490:39;;;;;;;;;;;;;;;;54402:116;;;;;;;;;;-1:-1:-1;54402:116:0;;;;;:::i;:::-;;:::i;53240:175::-;;;;;;;;;;;;;:::i;51544:268::-;;;;;;;;;;-1:-1:-1;51544:268:0;;;;;:::i;:::-;;:::i;55759:280::-;;;:::i;5544:87::-;;;;;;;;;;-1:-1:-1;5617:6:0;;-1:-1:-1;;;;;5617:6:0;5544:87;;54080:94;;;;;;;;;;-1:-1:-1;54080:94:0;;;;;:::i;:::-;;:::i;53685:76::-;;;;;;;;;;-1:-1:-1;53685:76:0;;;;;:::i;:::-;;:::i;27806:104::-;;;;;;;;;;;;;:::i;47864:35::-;;;;;;;;;;-1:-1:-1;47864:35:0;;;;;;;;;;;50463:584;;;;;;:::i;:::-;;:::i;47447:38::-;;;;;;;;;;;;;;;;29490:155;;;;;;;;;;-1:-1:-1;29490:155:0;;;;;:::i;:::-;;:::i;30613:328::-;;;;;;;;;;-1:-1:-1;30613:328:0;;;;;:::i;:::-;;:::i;47620:37::-;;;;;;;;;;;;;;;;47261;;;;;;;;;;;;;:::i;52596:539::-;;;;;;;;;;-1:-1:-1;52596:539:0;;;;;:::i;:::-;;:::i;47336:36::-;;;;;;;;;;;;;;;;53970:104;;;;;;;;;;-1:-1:-1;53970:104:0;;;;;:::i;:::-;;:::i;47411:31::-;;;;;;;;;;;;;;;;54628:122;;;;;;;;;;-1:-1:-1;54628:122:0;;;;;:::i;:::-;;:::i;29716:164::-;;;;;;;;;;-1:-1:-1;29716:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;29837:25:0;;;29813:4;29837:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;29716:164;47753:42;;;;;;;;;;;;;;;;55567:186;;;;;;;;;;-1:-1:-1;55567:186:0;;;;;:::i;:::-;;:::i;54756:120::-;;;;;;;;;;-1:-1:-1;54756:120:0;;;;;:::i;:::-;;:::i;6453:201::-;;;;;;;;;;-1:-1:-1;6453:201:0;;;;;:::i;:::-;;:::i;26692:305::-;26794:4;-1:-1:-1;;;;;;26831:40:0;;-1:-1:-1;;;26831:40:0;;:105;;-1:-1:-1;;;;;;;26888:48:0;;-1:-1:-1;;;26888:48:0;26831:105;:158;;;-1:-1:-1;;;;;;;;;;18460:40:0;;;26953:36;26811:178;26692:305;-1:-1:-1;;26692:305:0:o;53767:73::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;;;;;;;;;53819:6:::1;:15:::0;;-1:-1:-1;;53819:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;53767:73::o;27637:100::-;27691:13;27724:5;27717:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27637:100;:::o;29197:221::-;29273:7;32540:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32540:16:0;29293:73;;;;-1:-1:-1;;;29293:73:0;;14890:2:1;29293:73:0;;;14872:21:1;14929:2;14909:18;;;14902:30;14968:34;14948:18;;;14941:62;-1:-1:-1;;;15019:18:1;;;15012:42;15071:19;;29293:73:0;14688:408:1;29293:73:0;-1:-1:-1;29386:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;29386:24:0;;29197:221::o;47303:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28720:411::-;28801:13;28817:23;28832:7;28817:14;:23::i;:::-;28801:39;;28865:5;-1:-1:-1;;;;;28859:11:0;:2;-1:-1:-1;;;;;28859:11:0;;;28851:57;;;;-1:-1:-1;;;28851:57:0;;16790:2:1;28851:57:0;;;16772:21:1;16829:2;16809:18;;;16802:30;16868:34;16848:18;;;16841:62;-1:-1:-1;;;16919:18:1;;;16912:31;16960:19;;28851:57:0;16588:397:1;28851:57:0;4348:10;-1:-1:-1;;;;;28943:21:0;;;;:62;;-1:-1:-1;28968:37:0;28985:5;4348:10;29716:164;:::i;28968:37::-;28921:168;;;;-1:-1:-1;;;28921:168:0;;12932:2:1;28921:168:0;;;12914:21:1;12971:2;12951:18;;;12944:30;13010:34;12990:18;;;12983:62;13081:26;13061:18;;;13054:54;13125:19;;28921:168:0;12730:420:1;28921:168:0;29102:21;29111:2;29115:7;29102:8;:21::i;:::-;28790:341;28720:411;;:::o;54882:128::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;54965:16:::1;:39:::0;54882:128::o;53846:118::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;53924:25:::1;:34:::0;53846:118::o;55344:114::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;55420:14:::1;:32:::0;55344:114::o;53145:89::-;53189:7;53212:16;:6;964:14;;872:114;53212:16;53205:23;;53145:89;:::o;29947:339::-;30142:41;4348:10;30175:7;30142:18;:41::i;:::-;30134:103;;;;-1:-1:-1;;;30134:103:0;;;;;;;:::i;:::-;30250:28;30260:4;30266:2;30270:7;30250:9;:28::i;55466:95::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;55531:15:::1;:24:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;55531:24:0;;::::1;::::0;;;::::1;::::0;;55466:95::o;30357:185::-;30495:39;30512:4;30518:2;30522:7;30495:39;;;;;;;;;;;;:16;:39::i;55224:114::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;55300:14:::1;:32:::0;55224:114::o;51955:635::-;52030:16;52058:23;52084:17;52094:6;52084:9;:17::i;:::-;52058:43;;52108:30;52155:15;52141:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52141:30:0;-1:-1:-1;52108:63:0;-1:-1:-1;52203:1:0;52178:22;52247:309;52272:15;52254;:33;:64;;;;;52309:9;;52291:14;:27;;52254:64;52247:309;;;52329:25;52357:23;52365:14;52357:7;:23::i;:::-;52329:51;;52416:6;-1:-1:-1;;;;;52395:27:0;:17;-1:-1:-1;;;;;52395:27:0;;52391:131;;;52468:14;52435:13;52449:15;52435:30;;;;;;;;:::i;:::-;;;;;;;;;;:47;52495:17;;;;:::i;:::-;;;;52391:131;52532:16;;;;:::i;:::-;;;;52320:236;52247:309;;;-1:-1:-1;52571:13:0;;51955:635;-1:-1:-1;;;;51955:635:0:o;54180:80::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;54239:4:::1;:15:::0;54180:80::o;54524:98::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;54595:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;54524:98:::0;:::o;27331:239::-;27403:7;27439:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27439:16:0;27474:19;27466:73;;;;-1:-1:-1;;;27466:73:0;;13768:2:1;27466:73:0;;;13750:21:1;13807:2;13787:18;;;13780:30;13846:34;13826:18;;;13819:62;-1:-1:-1;;;13897:18:1;;;13890:39;13946:19;;27466:73:0;13566:405:1;51054:266:0;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;51130:6:::1;::::0;::::1;;51129:7;51121:16;;;::::0;::::1;;51166:1;51152:11;:15;51144:24;;;::::0;::::1;;51198:13;;51183:11;:28;;51175:37;;;::::0;::::1;;51261:9;;51246:11;51227:16;:6;964:14:::0;;872:114;51227:16:::1;:30;;;;:::i;:::-;:43;;51219:52;;;::::0;::::1;;51280:34;51290:10;51302:11;51280:9;:34::i;:::-;51054:266:::0;:::o;54266:130::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;54350:20:::1;:40:::0;54266:130::o;47235:21::-;;;;;;;:::i;55016:94::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;55082:9:::1;:22:::0;55016:94::o;53544:111::-;5617:6;;53605:7;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;-1:-1:-1;53628:21:0::1;53544:111:::0;:::o;27061:208::-;27133:7;-1:-1:-1;;;;;27161:19:0;;27153:74;;;;-1:-1:-1;;;27153:74:0;;13357:2:1;27153:74:0;;;13339:21:1;13396:2;13376:18;;;13369:30;13435:34;13415:18;;;13408:62;-1:-1:-1;;;13486:18:1;;;13479:40;13536:19;;27153:74:0;13155:406:1;27153:74:0;-1:-1:-1;;;;;;27245:16:0;;;;;:9;:16;;;;;;;27061:208::o;53443:95::-;5617:6;;53496:13;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;53525:7:::1;53518:14;;;;;:::i;6195:103::-:0;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;6260:30:::1;6287:1;6260:18;:30::i;:::-;6195:103::o:0;55116:102::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;55186:11:::1;:26:::0;55116:102::o;54402:116::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;54479:13:::1;:33:::0;54402:116::o;53240:175::-;53287:7;53325:14;;53307:15;:32;53303:107;;;-1:-1:-1;53357:11:0;;;53240:175::o;53303:107::-;-1:-1:-1;53398:4:0;;;53240:175::o;51544:268::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;51646:1:::1;51632:11;:15;51624:55;;;::::0;-1:-1:-1;;;51624:55:0;;18718:2:1;51624:55:0::1;::::0;::::1;18700:21:1::0;18757:2;18737:18;;;18730:30;18796:29;18776:18;;;18769:57;18843:18;;51624:55:0::1;18516:351:1::0;51624:55:0::1;51728:9;;51713:11;51694:16;:6;964:14:::0;;872:114;51694:16:::1;:30;;;;:::i;:::-;:43;;51686:78;;;::::0;-1:-1:-1;;;51686:78:0;;14178:2:1;51686:78:0::1;::::0;::::1;14160:21:1::0;14217:2;14197:18;;;14190:30;-1:-1:-1;;;14236:18:1;;;14229:52;14298:18;;51686:78:0::1;13976:346:1::0;51686:78:0::1;51772:34;51782:10;51794:11;51772:9;:34::i;55759:280::-:0;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;55814:16:::1;55861:3;55833:26;:21;55857:2;55833:26;:::i;:::-;:31;;;;:::i;:::-;55814:50:::0;-1:-1:-1;55871:19:0::1;55921:3;55893:26;:21;55917:2;55893:26;:::i;:::-;:31;;;;:::i;:::-;55955:2;::::0;55947:26:::1;::::0;55871:53;;-1:-1:-1;;;;;;55955:2:0::1;::::0;55947:26;::::1;;;::::0;55964:8;;55955:2:::1;55947:26:::0;55955:2;55947:26;55964:8;55955:2;55947:26;::::1;;;;;;55939:35;;;::::0;::::1;;55995:37;::::0;56003:10:::1;::::0;55995:37;::::1;;;::::0;56020:11;;55995:37:::1;::::0;;;56020:11;56003:10;55995:37;::::1;;;;;;55987:46;;;::::0;::::1;54080:94:::0;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;54146:11:::1;:22:::0;54080:94::o;53685:76::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;53738:8:::1;:17:::0;;;::::1;;;;-1:-1:-1::0;;53738:17:0;;::::1;::::0;;;::::1;::::0;;53685:76::o;27806:104::-;27862:13;27895:7;27888:14;;;;;:::i;50463:584::-;48343:6;;;;48342:7;48334:42;;;;-1:-1:-1;;;48334:42:0;;15664:2:1;48334:42:0;;;15646:21:1;15703:2;15683:18;;;15676:30;-1:-1:-1;;;15722:18:1;;;15715:52;15784:18;;48334:42:0;15462:346:1;48334:42:0;48451:11:::1;;48432:15;:30;;48424:67;;;::::0;-1:-1:-1;;;48424:67:0;;9052:2:1;48424:67:0::1;::::0;::::1;9034:21:1::0;9091:2;9071:18;;;9064:30;9130:26;9110:18;;;9103:54;9174:18;;48424:67:0::1;8850:348:1::0;48424:67:0::1;50578:11:::2;48588:1;48574:11;:15;48566:55;;;::::0;-1:-1:-1;;;48566:55:0;;18718:2:1;48566:55:0::2;::::0;::::2;18700:21:1::0;18757:2;18737:18;;;18730:30;18796:29;18776:18;;;18769:57;18843:18;;48566:55:0::2;18516:351:1::0;48566:55:0::2;50648:10:::3;50601:23;50627:32:::0;;;:20:::3;:32;::::0;;;;;50759:14:::3;::::0;50741:15:::3;:32;:169;;50859:51;50881:15;50898:11;50859:21;:51::i;:::-;50741:169;;;50783:66;50802:15;50819:11;50832:16;:6;964:14:::0;;872:114;50832:16:::3;50783:18;:66::i;:::-;50961:9;;50946:11;50927:16;:6;964:14:::0;;872:114;50927:16:::3;:30;;;;:::i;:::-;:43;;50919:78;;;::::0;-1:-1:-1;;;50919:78:0;;14178:2:1;50919:78:0::3;::::0;::::3;14160:21:1::0;14217:2;14197:18;;;14190:30;-1:-1:-1;;;14236:18:1;;;14229:52;14298:18;;50919:78:0::3;13976:346:1::0;50919:78:0::3;51007:34;51017:10;51029:11;51007:9;:34::i;29490:155::-:0;29585:52;4348:10;29618:8;29628;29585:18;:52::i;30613:328::-;30788:41;4348:10;30821:7;30788:18;:41::i;:::-;30780:103;;;;-1:-1:-1;;;30780:103:0;;;;;;;:::i;:::-;30894:39;30908:4;30914:2;30918:7;30927:5;30894:13;:39::i;:::-;30613:328;;;;:::o;47261:37::-;;;;;;;:::i;52596:539::-;32516:4;32540:16;;;:7;:16;;;;;;52694:13;;-1:-1:-1;;;;;32540:16:0;52719:97;;;;-1:-1:-1;;;52719:97:0;;16374:2:1;52719:97:0;;;16356:21:1;16413:2;16393:18;;;16386:30;16452:34;16432:18;;;16425:62;-1:-1:-1;;;16503:18:1;;;16496:45;16558:19;;52719:97:0;16172:411:1;52719:97:0;52830:8;;;;;;;52825:305;;52856:14;52849:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52596:539;;;:::o;52825:305::-;52893:28;52924:10;:8;:10::i;:::-;52893:41;;52990:1;52965:14;52959:28;:32;:163;;;;;;;;;;;;;;;;;53043:14;53059:18;:7;:16;:18::i;:::-;53079:13;53026:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52959:163;52943:179;52596:539;-1:-1:-1;;;52596:539:0:o;52825:305::-;52596:539;;;:::o;53970:104::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;54041:18:::1;:27:::0;53970:104::o;54628:122::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;54711:33;;::::1;::::0;:13:::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;55567:186::-:0;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;55648:9:::1;55643:105;55667:9;:16;55663:1;:20;55643:105;;;55736:4;55699:20;:34;55720:9;55730:1;55720:12;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;55699:34:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;55699:34:0;:41;;-1:-1:-1;;55699:41:0::1;::::0;::::1;;::::0;;;::::1;::::0;;55685:3;::::1;::::0;::::1;:::i;:::-;;;;55643:105;;54756:120:::0;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;54838:32;;::::1;::::0;:14:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;6453:201::-:0;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6542:22:0;::::1;6534:73;;;::::0;-1:-1:-1;;;6534:73:0;;9824:2:1;6534:73:0::1;::::0;::::1;9806:21:1::0;9863:2;9843:18;;;9836:30;9902:34;9882:18;;;9875:62;-1:-1:-1;;;9953:18:1;;;9946:36;9999:19;;6534:73:0::1;9622:402:1::0;6534:73:0::1;6618:28;6637:8;6618:18;:28::i;36597:174::-:0;36672:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;36672:29:0;-1:-1:-1;;;;;36672:29:0;;;;;;;;:24;;36726:23;36672:24;36726:14;:23::i;:::-;-1:-1:-1;;;;;36717:46:0;;;;;;;;;;;36597:174;;:::o;32745:348::-;32838:4;32540:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32540:16:0;32855:73;;;;-1:-1:-1;;;32855:73:0;;12519:2:1;32855:73:0;;;12501:21:1;12558:2;12538:18;;;12531:30;12597:34;12577:18;;;12570:62;-1:-1:-1;;;12648:18:1;;;12641:42;12700:19;;32855:73:0;12317:408:1;32855:73:0;32939:13;32955:23;32970:7;32955:14;:23::i;:::-;32939:39;;33008:5;-1:-1:-1;;;;;32997:16:0;:7;-1:-1:-1;;;;;32997:16:0;;:52;;;-1:-1:-1;;;;;;29837:25:0;;;29813:4;29837:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;33017:32;32997:87;;;;33077:7;-1:-1:-1;;;;;33053:31:0;:20;33065:7;33053:11;:20::i;:::-;-1:-1:-1;;;;;33053:31:0;;32997:87;32989:96;32745:348;-1:-1:-1;;;;32745:348:0:o;35854:625::-;36013:4;-1:-1:-1;;;;;35986:31:0;:23;36001:7;35986:14;:23::i;:::-;-1:-1:-1;;;;;35986:31:0;;35978:81;;;;-1:-1:-1;;;35978:81:0;;10231:2:1;35978:81:0;;;10213:21:1;10270:2;10250:18;;;10243:30;10309:34;10289:18;;;10282:62;-1:-1:-1;;;10360:18:1;;;10353:35;10405:19;;35978:81:0;10029:401:1;35978:81:0;-1:-1:-1;;;;;36078:16:0;;36070:65;;;;-1:-1:-1;;;36070:65:0;;11351:2:1;36070:65:0;;;11333:21:1;11390:2;11370:18;;;11363:30;11429:34;11409:18;;;11402:62;-1:-1:-1;;;11480:18:1;;;11473:34;11524:19;;36070:65:0;11149:400:1;36070:65:0;36252:29;36269:1;36273:7;36252:8;:29::i;:::-;-1:-1:-1;;;;;36294:15:0;;;;;;:9;:15;;;;;:20;;36313:1;;36294:15;:20;;36313:1;;36294:20;:::i;:::-;;;;-1:-1:-1;;;;;;;36325:13:0;;;;;;:9;:13;;;;;:18;;36342:1;;36325:13;:18;;36342:1;;36325:18;:::i;:::-;;;;-1:-1:-1;;36354:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;36354:21:0;-1:-1:-1;;;;;36354:21:0;;;;;;;;;36393:27;;36354:16;;36393:27;;;;;;;28790:341;28720:411;;:::o;51329:204::-;51409:9;51404:124;51428:11;51424:1;:15;51404:124;;;51455:18;:6;1083:19;;1101:1;1083:19;;;994:127;51455:18;51482:38;51492:9;51503:16;:6;964:14;;872:114;51503:16;51482:9;:38::i;:::-;51441:3;;;;:::i;:::-;;;;51404:124;;6814:191;6907:6;;;-1:-1:-1;;;;;6924:17:0;;;-1:-1:-1;;;;;;6924:17:0;;;;;;;6957:40;;6907:6;;;6924:17;6907:6;;6957:40;;6888:16;;6957:40;6877:128;6814:191;:::o;50049:398::-;50199:18;;50166:29;50184:11;50166:15;:29;:::i;:::-;:51;;50150:113;;;;-1:-1:-1;;;50150:113:0;;10994:2:1;50150:113:0;;;10976:21:1;11033:2;11013:18;;;11006:30;11072;11052:18;;;11045:58;11120:18;;50150:113:0;10792:352:1;50150:113:0;50298:11;50291:4;;:18;;;;:::i;:::-;50278:9;:31;;50270:62;;;;-1:-1:-1;;;50270:62:0;;;;;;;:::i;:::-;50370:13;;50355:11;:28;;50339:102;;;;-1:-1:-1;;;50339:102:0;;;;;;;:::i;48764:1279::-;48891:18;48934:14;;48916:15;:32;:93;;-1:-1:-1;49005:4:0;;;48916:93;;;-1:-1:-1;48971:11:0;;;48916:93;-1:-1:-1;49022:15:0;;;;;;;:23;;49041:4;49022:23;49018:1020;;;49076:10;51895:4;51915:27;;;:20;:27;;;;;;;;49054:61;;;;-1:-1:-1;;;49054:61:0;;18366:2:1;49054:61:0;;;18348:21:1;18405:2;18385:18;;;18378:30;18444:25;18424:18;;;18417:53;18487:18;;49054:61:0;18164:347:1;49054:61:0;49171:25;;49138:29;49156:11;49138:15;:29;:::i;:::-;:58;;49122:132;;;;-1:-1:-1;;;49122:132:0;;;;;;;:::i;:::-;49282:24;49295:11;49282:10;:24;:::i;:::-;49269:9;:37;;49261:68;;;;-1:-1:-1;;;49261:68:0;;;;;;;:::i;:::-;49367:20;;49352:11;:35;;49336:109;;;;-1:-1:-1;;;49336:109:0;;;;;;;:::i;:::-;49502:16;;49487:11;49468:16;:6;964:14;;872:114;49468:16;:30;;;;:::i;:::-;:50;;49452:114;;;;-1:-1:-1;;;49452:114:0;;16015:2:1;49452:114:0;;;15997:21:1;16054:2;16034:18;;;16027:30;16093:32;16073:18;;;16066:60;16143:18;;49452:114:0;15813:354:1;49452:114:0;49018:1020;;;49635:25;;49602:29;49620:11;49602:15;:29;:::i;:::-;:58;;49586:132;;;;-1:-1:-1;;;49586:132:0;;;;;;;:::i;:::-;49746:24;49759:11;49746:10;:24;:::i;:::-;49733:9;:37;;49725:68;;;;-1:-1:-1;;;49725:68:0;;;;;;;:::i;:::-;49831:20;;49816:11;:35;;49800:109;;;;-1:-1:-1;;;49800:109:0;;;;;;;:::i;:::-;49966:16;;49951:11;49932:16;:6;964:14;;872:114;49932:16;:30;;;;:::i;:::-;:50;;49916:114;;;;-1:-1:-1;;;49916:114:0;;16015:2:1;49916:114:0;;;15997:21:1;16054:2;16034:18;;;16027:30;16093:32;16073:18;;;16066:60;16143:18;;49916:114:0;15813:354:1;36913:315:0;37068:8;-1:-1:-1;;;;;37059:17:0;:5;-1:-1:-1;;;;;37059:17:0;;;37051:55;;;;-1:-1:-1;;;37051:55:0;;11756:2:1;37051:55:0;;;11738:21:1;11795:2;11775:18;;;11768:30;11834:27;11814:18;;;11807:55;11879:18;;37051:55:0;11554:349:1;37051:55:0;-1:-1:-1;;;;;37117:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;37117:46:0;;;;;;;;;;37179:41;;8574::1;;;37179::0;;8547:18:1;37179:41:0;;;;;;;36913:315;;;:::o;31823:::-;31980:28;31990:4;31996:2;32000:7;31980:9;:28::i;:::-;32027:48;32050:4;32056:2;32060:7;32069:5;32027:22;:48::i;:::-;32019:111;;;;-1:-1:-1;;;32019:111:0;;;;;;;:::i;48656:102::-;48716:13;48745:7;48738:14;;;;;:::i;1830:723::-;1886:13;2107:10;2103:53;;-1:-1:-1;;2134:10:0;;;;;;;;;;;;-1:-1:-1;;;2134:10:0;;;;;1830:723::o;2103:53::-;2181:5;2166:12;2222:78;2229:9;;2222:78;;2255:8;;;;:::i;:::-;;-1:-1:-1;2278:10:0;;-1:-1:-1;2286:2:0;2278:10;;:::i;:::-;;;2222:78;;;2310:19;2342:6;2332:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2332:17:0;;2310:39;;2360:154;2367:10;;2360:154;;2394:11;2404:1;2394:11;;:::i;:::-;;-1:-1:-1;2463:10:0;2471:2;2463:5;:10;:::i;:::-;2450:24;;:2;:24;:::i;:::-;2437:39;;2420:6;2427;2420:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;2420:56:0;;;;;;;;-1:-1:-1;2491:11:0;2500:2;2491:11;;:::i;:::-;;;2360:154;;33435:110;33511:26;33521:2;33525:7;33511:26;;;;;;;;;;;;:9;:26::i;37793:799::-;37948:4;-1:-1:-1;;;;;37969:13:0;;8540:19;:23;37965:620;;38005:72;;-1:-1:-1;;;38005:72:0;;-1:-1:-1;;;;;38005:36:0;;;;;:72;;4348:10;;38056:4;;38062:7;;38071:5;;38005:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38005:72:0;;;;;;;;-1:-1:-1;;38005:72:0;;;;;;;;;;;;:::i;:::-;;;38001:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38247:13:0;;38243:272;;38290:60;;-1:-1:-1;;;38290:60:0;;;;;;;:::i;38243:272::-;38465:6;38459:13;38450:6;38446:2;38442:15;38435:38;38001:529;-1:-1:-1;;;;;;38128:51:0;-1:-1:-1;;;38128:51:0;;-1:-1:-1;38121:58:0;;37965:620;-1:-1:-1;38569:4:0;37793:799;;;;;;:::o;33772:321::-;33902:18;33908:2;33912:7;33902:5;:18::i;:::-;33953:54;33984:1;33988:2;33992:7;34001:5;33953:22;:54::i;:::-;33931:154;;;;-1:-1:-1;;;33931:154:0;;;;;;;:::i;34429:439::-;-1:-1:-1;;;;;34509:16:0;;34501:61;;;;-1:-1:-1;;;34501:61:0;;14529:2:1;34501:61:0;;;14511:21:1;;;14548:18;;;14541:30;14607:34;14587:18;;;14580:62;14659:18;;34501:61:0;14327:356:1;34501:61:0;32516:4;32540:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32540:16:0;:30;34573:58;;;;-1:-1:-1;;;34573:58:0;;10637:2:1;34573:58:0;;;10619:21:1;10676:2;10656:18;;;10649:30;10715;10695:18;;;10688:58;10763:18;;34573:58:0;10435:352:1;34573:58:0;-1:-1:-1;;;;;34702:13:0;;;;;;:9;:13;;;;;:18;;34719:1;;34702:13;:18;;34719:1;;34702:18;:::i;:::-;;;;-1:-1:-1;;34731:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34731:21:0;-1:-1:-1;;;;;34731:21:0;;;;;;;;34770:33;;34731:16;;;34770:33;;34731:16;;34770:33;54595:21:::1;54524:98:::0;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:70;;588:1;585;578:12;603:160;668:20;;724:13;;717:21;707:32;;697:60;;753:1;750;743:12;768:186;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;919:29;938:9;919:29;:::i;959:260::-;1027:6;1035;1088:2;1076:9;1067:7;1063:23;1059:32;1056:52;;;1104:1;1101;1094:12;1056:52;1127:29;1146:9;1127:29;:::i;:::-;1117:39;;1175:38;1209:2;1198:9;1194:18;1175:38;:::i;:::-;1165:48;;959:260;;;;;:::o;1224:328::-;1301:6;1309;1317;1370:2;1358:9;1349:7;1345:23;1341:32;1338:52;;;1386:1;1383;1376:12;1338:52;1409:29;1428:9;1409:29;:::i;:::-;1399:39;;1457:38;1491:2;1480:9;1476:18;1457:38;:::i;:::-;1447:48;;1542:2;1531:9;1527:18;1514:32;1504:42;;1224:328;;;;;:::o;1557:666::-;1652:6;1660;1668;1676;1729:3;1717:9;1708:7;1704:23;1700:33;1697:53;;;1746:1;1743;1736:12;1697:53;1769:29;1788:9;1769:29;:::i;:::-;1759:39;;1817:38;1851:2;1840:9;1836:18;1817:38;:::i;:::-;1807:48;;1902:2;1891:9;1887:18;1874:32;1864:42;;1957:2;1946:9;1942:18;1929:32;1984:18;1976:6;1973:30;1970:50;;;2016:1;2013;2006:12;1970:50;2039:22;;2092:4;2084:13;;2080:27;-1:-1:-1;2070:55:1;;2121:1;2118;2111:12;2070:55;2144:73;2209:7;2204:2;2191:16;2186:2;2182;2178:11;2144:73;:::i;:::-;2134:83;;;1557:666;;;;;;;:::o;2228:254::-;2293:6;2301;2354:2;2342:9;2333:7;2329:23;2325:32;2322:52;;;2370:1;2367;2360:12;2322:52;2393:29;2412:9;2393:29;:::i;:::-;2383:39;;2441:35;2472:2;2461:9;2457:18;2441:35;:::i;2487:254::-;2555:6;2563;2616:2;2604:9;2595:7;2591:23;2587:32;2584:52;;;2632:1;2629;2622:12;2584:52;2655:29;2674:9;2655:29;:::i;:::-;2645:39;2731:2;2716:18;;;;2703:32;;-1:-1:-1;;;2487:254:1:o;2746:963::-;2830:6;2861:2;2904;2892:9;2883:7;2879:23;2875:32;2872:52;;;2920:1;2917;2910:12;2872:52;2960:9;2947:23;2989:18;3030:2;3022:6;3019:14;3016:34;;;3046:1;3043;3036:12;3016:34;3084:6;3073:9;3069:22;3059:32;;3129:7;3122:4;3118:2;3114:13;3110:27;3100:55;;3151:1;3148;3141:12;3100:55;3187:2;3174:16;3209:2;3205;3202:10;3199:36;;;3215:18;;:::i;:::-;3261:2;3258:1;3254:10;3244:20;;3284:28;3308:2;3304;3300:11;3284:28;:::i;:::-;3346:15;;;3377:12;;;;3409:11;;;3439;;;3435:20;;3432:33;-1:-1:-1;3429:53:1;;;3478:1;3475;3468:12;3429:53;3500:1;3491:10;;3510:169;3524:2;3521:1;3518:9;3510:169;;;3581:23;3600:3;3581:23;:::i;:::-;3569:36;;3542:1;3535:9;;;;;3625:12;;;;3657;;3510:169;;;-1:-1:-1;3698:5:1;2746:963;-1:-1:-1;;;;;;;;2746:963:1:o;3714:180::-;3770:6;3823:2;3811:9;3802:7;3798:23;3794:32;3791:52;;;3839:1;3836;3829:12;3791:52;3862:26;3878:9;3862:26;:::i;3899:245::-;3957:6;4010:2;3998:9;3989:7;3985:23;3981:32;3978:52;;;4026:1;4023;4016:12;3978:52;4065:9;4052:23;4084:30;4108:5;4084:30;:::i;4149:249::-;4218:6;4271:2;4259:9;4250:7;4246:23;4242:32;4239:52;;;4287:1;4284;4277:12;4239:52;4319:9;4313:16;4338:30;4362:5;4338:30;:::i;4403:450::-;4472:6;4525:2;4513:9;4504:7;4500:23;4496:32;4493:52;;;4541:1;4538;4531:12;4493:52;4581:9;4568:23;4614:18;4606:6;4603:30;4600:50;;;4646:1;4643;4636:12;4600:50;4669:22;;4722:4;4714:13;;4710:27;-1:-1:-1;4700:55:1;;4751:1;4748;4741:12;4700:55;4774:73;4839:7;4834:2;4821:16;4816:2;4812;4808:11;4774:73;:::i;4858:180::-;4917:6;4970:2;4958:9;4949:7;4945:23;4941:32;4938:52;;;4986:1;4983;4976:12;4938:52;-1:-1:-1;5009:23:1;;4858:180;-1:-1:-1;4858:180:1:o;5043:254::-;5111:6;5119;5172:2;5160:9;5151:7;5147:23;5143:32;5140:52;;;5188:1;5185;5178:12;5140:52;5224:9;5211:23;5201:33;;5253:38;5287:2;5276:9;5272:18;5253:38;:::i;5302:257::-;5343:3;5381:5;5375:12;5408:6;5403:3;5396:19;5424:63;5480:6;5473:4;5468:3;5464:14;5457:4;5450:5;5446:16;5424:63;:::i;:::-;5541:2;5520:15;-1:-1:-1;;5516:29:1;5507:39;;;;5548:4;5503:50;;5302:257;-1:-1:-1;;5302:257:1:o;5564:1527::-;5788:3;5826:6;5820:13;5852:4;5865:51;5909:6;5904:3;5899:2;5891:6;5887:15;5865:51;:::i;:::-;5979:13;;5938:16;;;;6001:55;5979:13;5938:16;6023:15;;;6001:55;:::i;:::-;6145:13;;6078:20;;;6118:1;;6205;6227:18;;;;6280;;;;6307:93;;6385:4;6375:8;6371:19;6359:31;;6307:93;6448:2;6438:8;6435:16;6415:18;6412:40;6409:167;;;-1:-1:-1;;;6475:33:1;;6531:4;6528:1;6521:15;6561:4;6482:3;6549:17;6409:167;6592:18;6619:110;;;;6743:1;6738:328;;;;6585:481;;6619:110;-1:-1:-1;;6654:24:1;;6640:39;;6699:20;;;;-1:-1:-1;6619:110:1;;6738:328;19407:1;19400:14;;;19444:4;19431:18;;6833:1;6847:169;6861:8;6858:1;6855:15;6847:169;;;6943:14;;6928:13;;;6921:37;6986:16;;;;6878:10;;6847:169;;;6851:3;;7047:8;7040:5;7036:20;7029:27;;6585:481;-1:-1:-1;7082:3:1;;5564:1527;-1:-1:-1;;;;;;;;;;;5564:1527:1:o;7304:488::-;-1:-1:-1;;;;;7573:15:1;;;7555:34;;7625:15;;7620:2;7605:18;;7598:43;7672:2;7657:18;;7650:34;;;7720:3;7715:2;7700:18;;7693:31;;;7498:4;;7741:45;;7766:19;;7758:6;7741:45;:::i;:::-;7733:53;7304:488;-1:-1:-1;;;;;;7304:488:1:o;7797:632::-;7968:2;8020:21;;;8090:13;;7993:18;;;8112:22;;;7939:4;;7968:2;8191:15;;;;8165:2;8150:18;;;7939:4;8234:169;8248:6;8245:1;8242:13;8234:169;;;8309:13;;8297:26;;8378:15;;;;8343:12;;;;8270:1;8263:9;8234:169;;;-1:-1:-1;8420:3:1;;7797:632;-1:-1:-1;;;;;;7797:632:1:o;8626:219::-;8775:2;8764:9;8757:21;8738:4;8795:44;8835:2;8824:9;8820:18;8812:6;8795:44;:::i;9203:414::-;9405:2;9387:21;;;9444:2;9424:18;;;9417:30;9483:34;9478:2;9463:18;;9456:62;-1:-1:-1;;;9549:2:1;9534:18;;9527:48;9607:3;9592:19;;9203:414::o;11908:404::-;12110:2;12092:21;;;12149:2;12129:18;;;12122:30;12188:34;12183:2;12168:18;;12161:62;-1:-1:-1;;;12254:2:1;12239:18;;12232:38;12302:3;12287:19;;11908:404::o;15101:356::-;15303:2;15285:21;;;15322:18;;;15315:30;15381:34;15376:2;15361:18;;15354:62;15448:2;15433:18;;15101:356::o;16990:342::-;17192:2;17174:21;;;17231:2;17211:18;;;17204:30;-1:-1:-1;;;17265:2:1;17250:18;;17243:48;17323:2;17308:18;;16990:342::o;17337:404::-;17539:2;17521:21;;;17578:2;17558:18;;;17551:30;17617:34;17612:2;17597:18;;17590:62;-1:-1:-1;;;17683:2:1;17668:18;;17661:38;17731:3;17716:19;;17337:404::o;17746:413::-;17948:2;17930:21;;;17987:2;17967:18;;;17960:30;18026:34;18021:2;18006:18;;17999:62;-1:-1:-1;;;18092:2:1;18077:18;;18070:47;18149:3;18134:19;;17746:413::o;19054:275::-;19125:2;19119:9;19190:2;19171:13;;-1:-1:-1;;19167:27:1;19155:40;;19225:18;19210:34;;19246:22;;;19207:62;19204:88;;;19272:18;;:::i;:::-;19308:2;19301:22;19054:275;;-1:-1:-1;19054:275:1:o;19460:128::-;19500:3;19531:1;19527:6;19524:1;19521:13;19518:39;;;19537:18;;:::i;:::-;-1:-1:-1;19573:9:1;;19460:128::o;19593:120::-;19633:1;19659;19649:35;;19664:18;;:::i;:::-;-1:-1:-1;19698:9:1;;19593:120::o;19718:168::-;19758:7;19824:1;19820;19816:6;19812:14;19809:1;19806:21;19801:1;19794:9;19787:17;19783:45;19780:71;;;19831:18;;:::i;:::-;-1:-1:-1;19871:9:1;;19718:168::o;19891:125::-;19931:4;19959:1;19956;19953:8;19950:34;;;19964:18;;:::i;:::-;-1:-1:-1;20001:9:1;;19891:125::o;20021:258::-;20093:1;20103:113;20117:6;20114:1;20111:13;20103:113;;;20193:11;;;20187:18;20174:11;;;20167:39;20139:2;20132:10;20103:113;;;20234:6;20231:1;20228:13;20225:48;;;-1:-1:-1;;20269:1:1;20251:16;;20244:27;20021:258::o;20284:380::-;20363:1;20359:12;;;;20406;;;20427:61;;20481:4;20473:6;20469:17;20459:27;;20427:61;20534:2;20526:6;20523:14;20503:18;20500:38;20497:161;;;20580:10;20575:3;20571:20;20568:1;20561:31;20615:4;20612:1;20605:15;20643:4;20640:1;20633:15;20497:161;;20284:380;;;:::o;20669:135::-;20708:3;-1:-1:-1;;20729:17:1;;20726:43;;;20749:18;;:::i;:::-;-1:-1:-1;20796:1:1;20785:13;;20669:135::o;20809:112::-;20841:1;20867;20857:35;;20872:18;;:::i;:::-;-1:-1:-1;20906:9:1;;20809:112::o;20926:127::-;20987:10;20982:3;20978:20;20975:1;20968:31;21018:4;21015:1;21008:15;21042:4;21039:1;21032:15;21058:127;21119:10;21114:3;21110:20;21107:1;21100:31;21150:4;21147:1;21140:15;21174:4;21171:1;21164:15;21190:127;21251:10;21246:3;21242:20;21239:1;21232:31;21282:4;21279:1;21272:15;21306:4;21303:1;21296:15;21322:127;21383:10;21378:3;21374:20;21371:1;21364:31;21414:4;21411:1;21404:15;21438:4;21435:1;21428:15;21454:131;-1:-1:-1;;;;;;21528:32:1;;21518:43;;21508:71;;21575:1;21572;21565:12

Swarm Source

ipfs://87b88e112ced9d08670a33cb4376a442259c1eb3a467e184ad7f720646d4cee0
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.