ETH Price: $2,366.34 (-2.09%)

Token

Mimon (MIMON)
 

Overview

Max Total Supply

1,330 MIMON

Holders

326

Total Transfers

-

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

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:
Mimon

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-29
*/

// SPDX-License-Identifier: MIT

// Sources flattened with hardhat v2.8.0 https://hardhat.org

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

// OpenZeppelin Contracts v4.4.0 (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 contracts/openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.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`, 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 Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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


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


// OpenZeppelin Contracts v4.4.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 `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}


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


// OpenZeppelin Contracts v4.4.0 (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 contracts/openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts v4.4.0 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 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 contracts/openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.0 (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 contracts/openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts v4.4.0 (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 contracts/openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.0 (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 contracts/openzeppelin/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts v4.4.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 overriden 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 || getApproved(tokenId) == spender || isApprovedForAll(owner, 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);
    }

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

    /**
     * @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 of token that is not own");
        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);
    }

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


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


// OpenZeppelin Contracts v4.4.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 tokenId);

    /**
     * @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 contracts/openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.0 (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/openzeppelin/contracts/access/IAccessControl.sol


// OpenZeppelin Contracts v4.4.0 (access/IAccessControl.sol)

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}


// File contracts/openzeppelin/contracts/access/IAccessControlEnumerable.sol


// OpenZeppelin Contracts v4.4.0 (access/IAccessControlEnumerable.sol)

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControlEnumerable declared to support ERC165 detection.
 */
interface IAccessControlEnumerable is IAccessControl {
    /**
     * @dev Returns one of the accounts that have `role`. `index` must be a
     * value between 0 and {getRoleMemberCount}, non-inclusive.
     *
     * Role bearers are not sorted in any particular way, and their ordering may
     * change at any point.
     *
     * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
     * you perform all queries on the same block. See the following
     * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
     * for more information.
     */
    function getRoleMember(bytes32 role, uint256 index) external view returns (address);

    /**
     * @dev Returns the number of accounts that have `role`. Can be used
     * together with {getRoleMember} to enumerate all bearers of a role.
     */
    function getRoleMemberCount(bytes32 role) external view returns (uint256);
}


// File contracts/openzeppelin/contracts/access/AccessControl.sol


// OpenZeppelin Contracts v4.4.0 (access/AccessControl.sol)

pragma solidity ^0.8.0;




/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}


// File contracts/openzeppelin/contracts/utils/structs/EnumerableSet.sol


// OpenZeppelin Contracts v4.4.0 (utils/structs/EnumerableSet.sol)

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastvalue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastvalue;
                // Update the index for the moved value
                set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        return _values(set._inner);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        assembly {
            result := store
        }

        return result;
    }
}


// File contracts/openzeppelin/contracts/access/AccessControlEnumerable.sol


// OpenZeppelin Contracts v4.4.0 (access/AccessControlEnumerable.sol)

pragma solidity ^0.8.0;



/**
 * @dev Extension of {AccessControl} that allows enumerating the members of each role.
 */
abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl {
    using EnumerableSet for EnumerableSet.AddressSet;

    mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers;

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

    /**
     * @dev Returns one of the accounts that have `role`. `index` must be a
     * value between 0 and {getRoleMemberCount}, non-inclusive.
     *
     * Role bearers are not sorted in any particular way, and their ordering may
     * change at any point.
     *
     * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
     * you perform all queries on the same block. See the following
     * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
     * for more information.
     */
    function getRoleMember(bytes32 role, uint256 index) public view override returns (address) {
        return _roleMembers[role].at(index);
    }

    /**
     * @dev Returns the number of accounts that have `role`. Can be used
     * together with {getRoleMember} to enumerate all bearers of a role.
     */
    function getRoleMemberCount(bytes32 role) public view override returns (uint256) {
        return _roleMembers[role].length();
    }

    /**
     * @dev Overload {_grantRole} to track enumerable memberships
     */
    function _grantRole(bytes32 role, address account) internal virtual override {
        super._grantRole(role, account);
        _roleMembers[role].add(account);
    }

    /**
     * @dev Overload {_revokeRole} to track enumerable memberships
     */
    function _revokeRole(bytes32 role, address account) internal virtual override {
        super._revokeRole(role, account);
        _roleMembers[role].remove(account);
    }
}


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


// OpenZeppelin Contracts v4.4.0 (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 contracts/openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev 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 contracts/Mimon/Mimon.sol



pragma solidity ^0.8.10;






contract Mimon is Context, ERC721, ERC721Enumerable, AccessControlEnumerable, Ownable {
	using Counters for Counters.Counter;

	string TOKEN_NAME = "Mimon";
	string TOKEN_SYMBOL = "MIMON";
	uint256 MAX_TOKEN_SUPPLY = 10000;
	string private _baseTokenURI;
	address public devAddress;
	address public minterContract;
	address public proxyContract;

	Counters.Counter private _tokenIdTracker;

	modifier onlyMinter() {
		require(_msgSender() == minterContract);
		_;
	}

	modifier onlyDev() {
		require(_msgSender() == devAddress);
		_;
	}

	constructor(
		string memory baseTokenURI,
		address dev,
		address proxy
	) ERC721(TOKEN_NAME, TOKEN_SYMBOL) {
		_baseTokenURI = baseTokenURI;
		setDevAddress(dev);
		proxyContract = address(proxy);
		_tokenIdTracker.increment();
	}

	function mint(address to) external virtual onlyMinter {
		require(totalSupply() < MAX_TOKEN_SUPPLY, "Mint end.");
		_mint(to, _tokenIdTracker.current());
		_tokenIdTracker.increment();
	}

	function massTransferFrom(
		address from,
		address to,
		uint256[] memory tokenIds
	) public {
		require(tokenIds.length <= 100, "Can only max transfer 100 Mimons at a time");
		for (uint256 i = 0; i < tokenIds.length; i++) {
			transferFrom(from, to, tokenIds[i]);
		}
	}

	function multiTransferFrom(
		address from,
		address[] memory to,
		uint256[] memory tokenIds
	) public {
		require(tokenIds.length <= 100, "Can only max transfer 100 Mimons at a time");
		for (uint256 i = 0; i < tokenIds.length; i++) {
			transferFrom(from, to[i], tokenIds[i]);
		}
	}

	function setBaseURI(string memory baseURI) public onlyDev {
		_baseTokenURI = baseURI;
	}

	function setMinterContract(address saleContract) public onlyDev {
		minterContract = saleContract;
	}

	function setProxyContract(address _proxyContract) public onlyDev {
		proxyContract = address(_proxyContract);
	}

	function setDevAddress(address _devAddress) public onlyOwner {
		devAddress = _devAddress;
	}

	/**
	 * Override isApprovedForAll to auto-approve OS's proxy contract
	 */
	function isApprovedForAll(address _owner, address _operator) public view override returns (bool isOperator) {
		// if OpenSea's ERC721 Proxy Address is detected, auto-return true
		if (proxyContract == _operator || devAddress == _operator) {
			return true;
		}
		return ERC721.isApprovedForAll(_owner, _operator);
	}

	function supportsInterface(bytes4 interfaceId) public view virtual override(AccessControlEnumerable, ERC721, ERC721Enumerable) returns (bool) {
		return super.supportsInterface(interfaceId);
	}

	function getBaseURI() public view returns (string memory) {
		return _baseURI();
	}

	function _baseURI() internal view virtual override returns (string memory) {
		return _baseTokenURI;
	}

	function _beforeTokenTransfer(
		address from,
		address to,
		uint256 tokenId
	) internal virtual override(ERC721, ERC721Enumerable) {
		super._beforeTokenTransfer(from, to, tokenId);
	}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseTokenURI","type":"string"},{"internalType":"address","name":"dev","type":"address"},{"internalType":"address","name":"proxy","type":"address"}],"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":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"devAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"isOperator","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"massTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minterContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address[]","name":"to","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"multiTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devAddress","type":"address"}],"name":"setDevAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"saleContract","type":"address"}],"name":"setMinterContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_proxyContract","type":"address"}],"name":"setProxyContract","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"}]

60806040526040518060400160405280600581526020017f4d696d6f6e000000000000000000000000000000000000000000000000000000815250600d908051906020019062000051929190620004bf565b506040518060400160405280600581526020017f4d494d4f4e000000000000000000000000000000000000000000000000000000815250600e90805190602001906200009f929190620004bf565b50612710600f55348015620000b357600080fd5b5060405162005780380380620057808339818101604052810190620000d9919062000771565b600d8054620000e8906200081b565b80601f016020809104026020016040519081016040528092919081815260200182805462000116906200081b565b8015620001675780601f106200013b5761010080835404028352916020019162000167565b820191906000526020600020905b8154815290600101906020018083116200014957829003601f168201915b5050505050600e80546200017b906200081b565b80601f0160208091040260200160405190810160405280929190818152602001828054620001a9906200081b565b8015620001fa5780601f10620001ce57610100808354040283529160200191620001fa565b820191906000526020600020905b815481529060010190602001808311620001dc57829003601f168201915b5050505050816000908051906020019062000217929190620004bf565b50806001908051906020019062000230929190620004bf565b5050506200025362000247620002de60201b60201c565b620002e660201b60201c565b82601090805190602001906200026b929190620004bf565b506200027d82620003ac60201b60201c565b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620002d560146200047f60201b620017881760201c565b505050620008d4565b600033905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003bc620002de60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003e26200049560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200043b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200043290620008b2565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6001816000016000828254019250508190555050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620004cd906200081b565b90600052602060002090601f016020900481019282620004f157600085556200053d565b82601f106200050c57805160ff19168380011785556200053d565b828001600101855582156200053d579182015b828111156200053c5782518255916020019190600101906200051f565b5b5090506200054c919062000550565b5090565b5b808211156200056b57600081600090555060010162000551565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620005d8826200058d565b810181811067ffffffffffffffff82111715620005fa57620005f96200059e565b5b80604052505050565b60006200060f6200056f565b90506200061d8282620005cd565b919050565b600067ffffffffffffffff82111562000640576200063f6200059e565b5b6200064b826200058d565b9050602081019050919050565b60005b83811015620006785780820151818401526020810190506200065b565b8381111562000688576000848401525b50505050565b6000620006a56200069f8462000622565b62000603565b905082815260208101848484011115620006c457620006c362000588565b5b620006d184828562000658565b509392505050565b600082601f830112620006f157620006f062000583565b5b8151620007038482602086016200068e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000739826200070c565b9050919050565b6200074b816200072c565b81146200075757600080fd5b50565b6000815190506200076b8162000740565b92915050565b6000806000606084860312156200078d576200078c62000579565b5b600084015167ffffffffffffffff811115620007ae57620007ad6200057e565b5b620007bc86828701620006d9565b9350506020620007cf868287016200075a565b9250506040620007e2868287016200075a565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200083457607f821691505b602082108114156200084b576200084a620007ec565b5b50919050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200089a60208362000851565b9150620008a78262000862565b602082019050919050565b60006020820190508181036000830152620008cd816200088b565b9050919050565b614e9c80620008e46000396000f3fe608060405234801561001057600080fd5b50600436106102325760003560e01c8063714c539811610130578063a94ed1f8116100b8578063d0d41fe11161007c578063d0d41fe1146106ad578063d547741f146106c9578063e985e9c5146106e5578063ed55044314610715578063f2fde38b1461073357610232565b8063a94ed1f8146105f9578063b88d4fde14610615578063c87b56dd14610631578063ca15c87314610661578063cb31b6cd1461069157610232565b806391d14854116100ff57806391d148541461055357806392f002331461058357806395d89b41146105a1578063a217fddf146105bf578063a22cb465146105dd57610232565b8063714c5398146104dd578063715018a6146104fb5780638da5cb5b146105055780639010d07c1461052357610232565b806336568abe116101be57806355f804b31161018257806355f804b3146104295780636352211e146104455780636a6278421461047557806370a08231146104915780637137ed47146104c157610232565b806336568abe1461038757806338478ae7146103a35780633ad10ef6146103bf57806342842e0e146103dd5780634f6ccce7146103f957610232565b806318160ddd1161020557806318160ddd146102d157806323b872dd146102ef578063248a9ca31461030b5780632f2ff15d1461033b5780632f745c591461035757610232565b806301ffc9a71461023757806306fdde0314610267578063081812fc14610285578063095ea7b3146102b5575b600080fd5b610251600480360381019061024c9190613400565b61074f565b60405161025e9190613448565b60405180910390f35b61026f610761565b60405161027c91906134fc565b60405180910390f35b61029f600480360381019061029a9190613554565b6107f3565b6040516102ac91906135c2565b60405180910390f35b6102cf60048036038101906102ca9190613609565b610878565b005b6102d9610990565b6040516102e69190613658565b60405180910390f35b61030960048036038101906103049190613673565b61099d565b005b610325600480360381019061032091906136fc565b6109fd565b6040516103329190613738565b60405180910390f35b61035560048036038101906103509190613753565b610a1d565b005b610371600480360381019061036c9190613609565b610a46565b60405161037e9190613658565b60405180910390f35b6103a1600480360381019061039c9190613753565b610aeb565b005b6103bd60048036038101906103b89190613793565b610b6e565b005b6103c7610c13565b6040516103d491906135c2565b60405180910390f35b6103f760048036038101906103f29190613673565b610c39565b005b610413600480360381019061040e9190613554565b610c59565b6040516104209190613658565b60405180910390f35b610443600480360381019061043e91906138f5565b610cca565b005b61045f600480360381019061045a9190613554565b610d45565b60405161046c91906135c2565b60405180910390f35b61048f600480360381019061048a9190613793565b610df7565b005b6104ab60048036038101906104a69190613793565b610ec3565b6040516104b89190613658565b60405180910390f35b6104db60048036038101906104d69190613793565b610f7b565b005b6104e5611020565b6040516104f291906134fc565b60405180910390f35b61050361102f565b005b61050d6110b7565b60405161051a91906135c2565b60405180910390f35b61053d6004803603810190610538919061393e565b6110e1565b60405161054a91906135c2565b60405180910390f35b61056d60048036038101906105689190613753565b611110565b60405161057a9190613448565b60405180910390f35b61058b61117b565b60405161059891906135c2565b60405180910390f35b6105a96111a1565b6040516105b691906134fc565b60405180910390f35b6105c7611233565b6040516105d49190613738565b60405180910390f35b6105f760048036038101906105f291906139aa565b61123a565b005b610613600480360381019061060e9190613ab2565b611250565b005b61062f600480360381019061062a9190613bc2565b6112df565b005b61064b60048036038101906106469190613554565b611341565b60405161065891906134fc565b60405180910390f35b61067b600480360381019061067691906136fc565b6113e8565b6040516106889190613658565b60405180910390f35b6106ab60048036038101906106a69190613d08565b61140c565b005b6106c760048036038101906106c29190613793565b6114b5565b005b6106e360048036038101906106de9190613753565b611575565b005b6106ff60048036038101906106fa9190613d93565b61159e565b60405161070c9190613448565b60405180910390f35b61071d61166a565b60405161072a91906135c2565b60405180910390f35b61074d60048036038101906107489190613793565b611690565b005b600061075a8261179e565b9050919050565b60606000805461077090613e02565b80601f016020809104026020016040519081016040528092919081815260200182805461079c90613e02565b80156107e95780601f106107be576101008083540402835291602001916107e9565b820191906000526020600020905b8154815290600101906020018083116107cc57829003601f168201915b5050505050905090565b60006107fe82611818565b61083d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083490613ea6565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061088382610d45565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108eb90613f38565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610913611884565b73ffffffffffffffffffffffffffffffffffffffff16148061094257506109418161093c611884565b61159e565b5b610981576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097890613fca565b60405180910390fd5b61098b838361188c565b505050565b6000600880549050905090565b6109ae6109a8611884565b82611945565b6109ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e49061405c565b60405180910390fd5b6109f8838383611a23565b505050565b6000600a6000838152602001908152602001600020600101549050919050565b610a26826109fd565b610a3781610a32611884565b611c7f565b610a418383611d1c565b505050565b6000610a5183610ec3565b8210610a92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a89906140ee565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610af3611884565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5790614180565b60405180910390fd5b610b6a8282611d50565b5050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610baf611884565b73ffffffffffffffffffffffffffffffffffffffff1614610bcf57600080fd5b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610c54838383604051806020016040528060008152506112df565b505050565b6000610c63610990565b8210610ca4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9b90614212565b60405180910390fd5b60088281548110610cb857610cb7614232565b5b90600052602060002001549050919050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610d0b611884565b73ffffffffffffffffffffffffffffffffffffffff1614610d2b57600080fd5b8060109080519060200190610d419291906132f1565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610dee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de5906142d3565b60405180910390fd5b80915050919050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610e38611884565b73ffffffffffffffffffffffffffffffffffffffff1614610e5857600080fd5b600f54610e63610990565b10610ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9a9061433f565b60405180910390fd5b610eb681610eb16014611d84565b611d92565b610ec06014611788565b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2b906143d1565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610fbc611884565b73ffffffffffffffffffffffffffffffffffffffff1614610fdc57600080fd5b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606061102a611f60565b905090565b611037611884565b73ffffffffffffffffffffffffffffffffffffffff166110556110b7565b73ffffffffffffffffffffffffffffffffffffffff16146110ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a29061443d565b60405180910390fd5b6110b56000611ff2565b565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600061110882600b60008681526020019081526020016000206120b890919063ffffffff16565b905092915050565b6000600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600180546111b090613e02565b80601f01602080910402602001604051908101604052809291908181526020018280546111dc90613e02565b80156112295780601f106111fe57610100808354040283529160200191611229565b820191906000526020600020905b81548152906001019060200180831161120c57829003601f168201915b5050505050905090565b6000801b81565b61124c611245611884565b83836120d2565b5050565b606481511115611295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128c906144cf565b60405180910390fd5b60005b81518110156112d9576112c684848484815181106112b9576112b8614232565b5b602002602001015161099d565b80806112d19061451e565b915050611298565b50505050565b6112f06112ea611884565b83611945565b61132f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113269061405c565b60405180910390fd5b61133b8484848461223f565b50505050565b606061134c82611818565b61138b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611382906145d9565b60405180910390fd5b6000611395611f60565b905060008151116113b557604051806020016040528060008152506113e0565b806113bf8461229b565b6040516020016113d0929190614635565b6040516020818303038152906040525b915050919050565b6000611405600b60008481526020019081526020016000206123fc565b9050919050565b606481511115611451576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611448906144cf565b60405180910390fd5b60005b81518110156114af5761149c8484838151811061147457611473614232565b5b602002602001015184848151811061148f5761148e614232565b5b602002602001015161099d565b80806114a79061451e565b915050611454565b50505050565b6114bd611884565b73ffffffffffffffffffffffffffffffffffffffff166114db6110b7565b73ffffffffffffffffffffffffffffffffffffffff1614611531576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115289061443d565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61157e826109fd565b61158f8161158a611884565b611c7f565b6115998383611d50565b505050565b60008173ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061164957508173ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b156116575760019050611664565b6116618383612411565b90505b92915050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611698611884565b73ffffffffffffffffffffffffffffffffffffffff166116b66110b7565b73ffffffffffffffffffffffffffffffffffffffff161461170c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117039061443d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561177c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611773906146cb565b60405180910390fd5b61178581611ff2565b50565b6001816000016000828254019250508190555050565b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806118115750611810826124a5565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166118ff83610d45565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061195082611818565b61198f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119869061475d565b60405180910390fd5b600061199a83610d45565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a0957508373ffffffffffffffffffffffffffffffffffffffff166119f1846107f3565b73ffffffffffffffffffffffffffffffffffffffff16145b80611a1a5750611a19818561159e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611a4382610d45565b73ffffffffffffffffffffffffffffffffffffffff1614611a99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a90906147ef565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0090614881565b60405180910390fd5b611b1483838361251f565b611b1f60008261188c565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b6f91906148a1565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bc691906148d5565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611c898282611110565b611d1857611cae8173ffffffffffffffffffffffffffffffffffffffff16601461252f565b611cbc8360001c602061252f565b604051602001611ccd9291906149c3565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0f91906134fc565b60405180910390fd5b5050565b611d26828261276b565b611d4b81600b600085815260200190815260200160002061284c90919063ffffffff16565b505050565b611d5a828261287c565b611d7f81600b600085815260200190815260200160002061295e90919063ffffffff16565b505050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df990614a49565b60405180910390fd5b611e0b81611818565b15611e4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4290614ab5565b60405180910390fd5b611e576000838361251f565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ea791906148d5565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b606060108054611f6f90613e02565b80601f0160208091040260200160405190810160405280929190818152602001828054611f9b90613e02565b8015611fe85780601f10611fbd57610100808354040283529160200191611fe8565b820191906000526020600020905b815481529060010190602001808311611fcb57829003601f168201915b5050505050905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006120c7836000018361298e565b60001c905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612141576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213890614b21565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122329190613448565b60405180910390a3505050565b61224a848484611a23565b612256848484846129b9565b612295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228c90614bb3565b60405180910390fd5b50505050565b606060008214156122e3576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123f7565b600082905060005b600082146123155780806122fe9061451e565b915050600a8261230e9190614c02565b91506122eb565b60008167ffffffffffffffff811115612331576123306137ca565b5b6040519080825280601f01601f1916602001820160405280156123635781602001600182028036833780820191505090505b5090505b600085146123f05760018261237c91906148a1565b9150600a8561238b9190614c33565b603061239791906148d5565b60f81b8183815181106123ad576123ac614232565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123e99190614c02565b9450612367565b8093505050505b919050565b600061240a82600001612b41565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612518575061251782612b52565b5b9050919050565b61252a838383612bcc565b505050565b6060600060028360026125429190614c64565b61254c91906148d5565b67ffffffffffffffff811115612565576125646137ca565b5b6040519080825280601f01601f1916602001820160405280156125975781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106125cf576125ce614232565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061263357612632614232565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026126739190614c64565b61267d91906148d5565b90505b600181111561271d577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106126bf576126be614232565b5b1a60f81b8282815181106126d6576126d5614232565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061271690614cbe565b9050612680565b5060008414612761576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275890614d34565b60405180910390fd5b8091505092915050565b6127758282611110565b612848576001600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506127ed611884565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000612874836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612ce0565b905092915050565b6128868282611110565b1561295a576000600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506128ff611884565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000612986836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612d50565b905092915050565b60008260000182815481106129a6576129a5614232565b5b9060005260206000200154905092915050565b60006129da8473ffffffffffffffffffffffffffffffffffffffff16612e64565b15612b34578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a03611884565b8786866040518563ffffffff1660e01b8152600401612a259493929190614da9565b6020604051808303816000875af1925050508015612a6157506040513d601f19601f82011682018060405250810190612a5e9190614e0a565b60015b612ae4573d8060008114612a91576040519150601f19603f3d011682016040523d82523d6000602084013e612a96565b606091505b50600081511415612adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad390614bb3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b39565b600190505b949350505050565b600081600001805490509050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612bc55750612bc482612e77565b5b9050919050565b612bd7838383612f59565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c1a57612c1581612f5e565b612c59565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612c5857612c578382612fa7565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c9c57612c9781613114565b612cdb565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612cda57612cd982826131e5565b5b5b505050565b6000612cec8383613264565b612d45578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612d4a565b600090505b92915050565b60008083600101600084815260200190815260200160002054905060008114612e58576000600182612d8291906148a1565b9050600060018660000180549050612d9a91906148a1565b9050818114612e09576000866000018281548110612dbb57612dba614232565b5b9060005260206000200154905080876000018481548110612ddf57612dde614232565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480612e1d57612e1c614e37565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612e5e565b60009150505b92915050565b600080823b905060008111915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612f4257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612f525750612f5182613287565b5b9050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612fb484610ec3565b612fbe91906148a1565b90506000600760008481526020019081526020016000205490508181146130a3576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061312891906148a1565b905060006009600084815260200190815260200160002054905060006008838154811061315857613157614232565b5b90600052602060002001549050806008838154811061317a57613179614232565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806131c9576131c8614e37565b5b6001900381819060005260206000200160009055905550505050565b60006131f083610ec3565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8280546132fd90613e02565b90600052602060002090601f01602090048101928261331f5760008555613366565b82601f1061333857805160ff1916838001178555613366565b82800160010185558215613366579182015b8281111561336557825182559160200191906001019061334a565b5b5090506133739190613377565b5090565b5b80821115613390576000816000905550600101613378565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6133dd816133a8565b81146133e857600080fd5b50565b6000813590506133fa816133d4565b92915050565b6000602082840312156134165761341561339e565b5b6000613424848285016133eb565b91505092915050565b60008115159050919050565b6134428161342d565b82525050565b600060208201905061345d6000830184613439565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561349d578082015181840152602081019050613482565b838111156134ac576000848401525b50505050565b6000601f19601f8301169050919050565b60006134ce82613463565b6134d8818561346e565b93506134e881856020860161347f565b6134f1816134b2565b840191505092915050565b6000602082019050818103600083015261351681846134c3565b905092915050565b6000819050919050565b6135318161351e565b811461353c57600080fd5b50565b60008135905061354e81613528565b92915050565b60006020828403121561356a5761356961339e565b5b60006135788482850161353f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006135ac82613581565b9050919050565b6135bc816135a1565b82525050565b60006020820190506135d760008301846135b3565b92915050565b6135e6816135a1565b81146135f157600080fd5b50565b600081359050613603816135dd565b92915050565b600080604083850312156136205761361f61339e565b5b600061362e858286016135f4565b925050602061363f8582860161353f565b9150509250929050565b6136528161351e565b82525050565b600060208201905061366d6000830184613649565b92915050565b60008060006060848603121561368c5761368b61339e565b5b600061369a868287016135f4565b93505060206136ab868287016135f4565b92505060406136bc8682870161353f565b9150509250925092565b6000819050919050565b6136d9816136c6565b81146136e457600080fd5b50565b6000813590506136f6816136d0565b92915050565b6000602082840312156137125761371161339e565b5b6000613720848285016136e7565b91505092915050565b613732816136c6565b82525050565b600060208201905061374d6000830184613729565b92915050565b6000806040838503121561376a5761376961339e565b5b6000613778858286016136e7565b9250506020613789858286016135f4565b9150509250929050565b6000602082840312156137a9576137a861339e565b5b60006137b7848285016135f4565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613802826134b2565b810181811067ffffffffffffffff82111715613821576138206137ca565b5b80604052505050565b6000613834613394565b905061384082826137f9565b919050565b600067ffffffffffffffff8211156138605761385f6137ca565b5b613869826134b2565b9050602081019050919050565b82818337600083830152505050565b600061389861389384613845565b61382a565b9050828152602081018484840111156138b4576138b36137c5565b5b6138bf848285613876565b509392505050565b600082601f8301126138dc576138db6137c0565b5b81356138ec848260208601613885565b91505092915050565b60006020828403121561390b5761390a61339e565b5b600082013567ffffffffffffffff811115613929576139286133a3565b5b613935848285016138c7565b91505092915050565b600080604083850312156139555761395461339e565b5b6000613963858286016136e7565b92505060206139748582860161353f565b9150509250929050565b6139878161342d565b811461399257600080fd5b50565b6000813590506139a48161397e565b92915050565b600080604083850312156139c1576139c061339e565b5b60006139cf858286016135f4565b92505060206139e085828601613995565b9150509250929050565b600067ffffffffffffffff821115613a0557613a046137ca565b5b602082029050602081019050919050565b600080fd5b6000613a2e613a29846139ea565b61382a565b90508083825260208201905060208402830185811115613a5157613a50613a16565b5b835b81811015613a7a5780613a66888261353f565b845260208401935050602081019050613a53565b5050509392505050565b600082601f830112613a9957613a986137c0565b5b8135613aa9848260208601613a1b565b91505092915050565b600080600060608486031215613acb57613aca61339e565b5b6000613ad9868287016135f4565b9350506020613aea868287016135f4565b925050604084013567ffffffffffffffff811115613b0b57613b0a6133a3565b5b613b1786828701613a84565b9150509250925092565b600067ffffffffffffffff821115613b3c57613b3b6137ca565b5b613b45826134b2565b9050602081019050919050565b6000613b65613b6084613b21565b61382a565b905082815260208101848484011115613b8157613b806137c5565b5b613b8c848285613876565b509392505050565b600082601f830112613ba957613ba86137c0565b5b8135613bb9848260208601613b52565b91505092915050565b60008060008060808587031215613bdc57613bdb61339e565b5b6000613bea878288016135f4565b9450506020613bfb878288016135f4565b9350506040613c0c8782880161353f565b925050606085013567ffffffffffffffff811115613c2d57613c2c6133a3565b5b613c3987828801613b94565b91505092959194509250565b600067ffffffffffffffff821115613c6057613c5f6137ca565b5b602082029050602081019050919050565b6000613c84613c7f84613c45565b61382a565b90508083825260208201905060208402830185811115613ca757613ca6613a16565b5b835b81811015613cd05780613cbc88826135f4565b845260208401935050602081019050613ca9565b5050509392505050565b600082601f830112613cef57613cee6137c0565b5b8135613cff848260208601613c71565b91505092915050565b600080600060608486031215613d2157613d2061339e565b5b6000613d2f868287016135f4565b935050602084013567ffffffffffffffff811115613d5057613d4f6133a3565b5b613d5c86828701613cda565b925050604084013567ffffffffffffffff811115613d7d57613d7c6133a3565b5b613d8986828701613a84565b9150509250925092565b60008060408385031215613daa57613da961339e565b5b6000613db8858286016135f4565b9250506020613dc9858286016135f4565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613e1a57607f821691505b60208210811415613e2e57613e2d613dd3565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613e90602c8361346e565b9150613e9b82613e34565b604082019050919050565b60006020820190508181036000830152613ebf81613e83565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613f2260218361346e565b9150613f2d82613ec6565b604082019050919050565b60006020820190508181036000830152613f5181613f15565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613fb460388361346e565b9150613fbf82613f58565b604082019050919050565b60006020820190508181036000830152613fe381613fa7565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b600061404660318361346e565b915061405182613fea565b604082019050919050565b6000602082019050818103600083015261407581614039565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006140d8602b8361346e565b91506140e38261407c565b604082019050919050565b60006020820190508181036000830152614107816140cb565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b600061416a602f8361346e565b91506141758261410e565b604082019050919050565b600060208201905081810360008301526141998161415d565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006141fc602c8361346e565b9150614207826141a0565b604082019050919050565b6000602082019050818103600083015261422b816141ef565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006142bd60298361346e565b91506142c882614261565b604082019050919050565b600060208201905081810360008301526142ec816142b0565b9050919050565b7f4d696e7420656e642e0000000000000000000000000000000000000000000000600082015250565b600061432960098361346e565b9150614334826142f3565b602082019050919050565b600060208201905081810360008301526143588161431c565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006143bb602a8361346e565b91506143c68261435f565b604082019050919050565b600060208201905081810360008301526143ea816143ae565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061442760208361346e565b9150614432826143f1565b602082019050919050565b600060208201905081810360008301526144568161441a565b9050919050565b7f43616e206f6e6c79206d6178207472616e7366657220313030204d696d6f6e7360008201527f20617420612074696d6500000000000000000000000000000000000000000000602082015250565b60006144b9602a8361346e565b91506144c48261445d565b604082019050919050565b600060208201905081810360008301526144e8816144ac565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006145298261351e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561455c5761455b6144ef565b5b600182019050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006145c3602f8361346e565b91506145ce82614567565b604082019050919050565b600060208201905081810360008301526145f2816145b6565b9050919050565b600081905092915050565b600061460f82613463565b61461981856145f9565b935061462981856020860161347f565b80840191505092915050565b60006146418285614604565b915061464d8284614604565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006146b560268361346e565b91506146c082614659565b604082019050919050565b600060208201905081810360008301526146e4816146a8565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614747602c8361346e565b9150614752826146eb565b604082019050919050565b600060208201905081810360008301526147768161473a565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006147d960298361346e565b91506147e48261477d565b604082019050919050565b60006020820190508181036000830152614808816147cc565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061486b60248361346e565b91506148768261480f565b604082019050919050565b6000602082019050818103600083015261489a8161485e565b9050919050565b60006148ac8261351e565b91506148b78361351e565b9250828210156148ca576148c96144ef565b5b828203905092915050565b60006148e08261351e565b91506148eb8361351e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156149205761491f6144ef565b5b828201905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b60006149616017836145f9565b915061496c8261492b565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b60006149ad6011836145f9565b91506149b882614977565b601182019050919050565b60006149ce82614954565b91506149da8285614604565b91506149e5826149a0565b91506149f18284614604565b91508190509392505050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614a3360208361346e565b9150614a3e826149fd565b602082019050919050565b60006020820190508181036000830152614a6281614a26565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614a9f601c8361346e565b9150614aaa82614a69565b602082019050919050565b60006020820190508181036000830152614ace81614a92565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614b0b60198361346e565b9150614b1682614ad5565b602082019050919050565b60006020820190508181036000830152614b3a81614afe565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614b9d60328361346e565b9150614ba882614b41565b604082019050919050565b60006020820190508181036000830152614bcc81614b90565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614c0d8261351e565b9150614c188361351e565b925082614c2857614c27614bd3565b5b828204905092915050565b6000614c3e8261351e565b9150614c498361351e565b925082614c5957614c58614bd3565b5b828206905092915050565b6000614c6f8261351e565b9150614c7a8361351e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614cb357614cb26144ef565b5b828202905092915050565b6000614cc98261351e565b91506000821415614cdd57614cdc6144ef565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000614d1e60208361346e565b9150614d2982614ce8565b602082019050919050565b60006020820190508181036000830152614d4d81614d11565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614d7b82614d54565b614d858185614d5f565b9350614d9581856020860161347f565b614d9e816134b2565b840191505092915050565b6000608082019050614dbe60008301876135b3565b614dcb60208301866135b3565b614dd86040830185613649565b8181036060830152614dea8184614d70565b905095945050505050565b600081519050614e04816133d4565b92915050565b600060208284031215614e2057614e1f61339e565b5b6000614e2e84828501614df5565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea264697066735822122063b095122ded6ec8424b3f4313a0ead25550a1bdcc19925b557e06796097b13864736f6c634300080a00330000000000000000000000000000000000000000000000000000000000000060000000000000000000000000cea1d08a2497abf300ea3f0ef3f954993b4e5ab7000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1000000000000000000000000000000000000000000000000000000000000001c68747470733a2f2f6170692e6d696d6f6e732e696f2f6d696d6f6e2f00000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102325760003560e01c8063714c539811610130578063a94ed1f8116100b8578063d0d41fe11161007c578063d0d41fe1146106ad578063d547741f146106c9578063e985e9c5146106e5578063ed55044314610715578063f2fde38b1461073357610232565b8063a94ed1f8146105f9578063b88d4fde14610615578063c87b56dd14610631578063ca15c87314610661578063cb31b6cd1461069157610232565b806391d14854116100ff57806391d148541461055357806392f002331461058357806395d89b41146105a1578063a217fddf146105bf578063a22cb465146105dd57610232565b8063714c5398146104dd578063715018a6146104fb5780638da5cb5b146105055780639010d07c1461052357610232565b806336568abe116101be57806355f804b31161018257806355f804b3146104295780636352211e146104455780636a6278421461047557806370a08231146104915780637137ed47146104c157610232565b806336568abe1461038757806338478ae7146103a35780633ad10ef6146103bf57806342842e0e146103dd5780634f6ccce7146103f957610232565b806318160ddd1161020557806318160ddd146102d157806323b872dd146102ef578063248a9ca31461030b5780632f2ff15d1461033b5780632f745c591461035757610232565b806301ffc9a71461023757806306fdde0314610267578063081812fc14610285578063095ea7b3146102b5575b600080fd5b610251600480360381019061024c9190613400565b61074f565b60405161025e9190613448565b60405180910390f35b61026f610761565b60405161027c91906134fc565b60405180910390f35b61029f600480360381019061029a9190613554565b6107f3565b6040516102ac91906135c2565b60405180910390f35b6102cf60048036038101906102ca9190613609565b610878565b005b6102d9610990565b6040516102e69190613658565b60405180910390f35b61030960048036038101906103049190613673565b61099d565b005b610325600480360381019061032091906136fc565b6109fd565b6040516103329190613738565b60405180910390f35b61035560048036038101906103509190613753565b610a1d565b005b610371600480360381019061036c9190613609565b610a46565b60405161037e9190613658565b60405180910390f35b6103a1600480360381019061039c9190613753565b610aeb565b005b6103bd60048036038101906103b89190613793565b610b6e565b005b6103c7610c13565b6040516103d491906135c2565b60405180910390f35b6103f760048036038101906103f29190613673565b610c39565b005b610413600480360381019061040e9190613554565b610c59565b6040516104209190613658565b60405180910390f35b610443600480360381019061043e91906138f5565b610cca565b005b61045f600480360381019061045a9190613554565b610d45565b60405161046c91906135c2565b60405180910390f35b61048f600480360381019061048a9190613793565b610df7565b005b6104ab60048036038101906104a69190613793565b610ec3565b6040516104b89190613658565b60405180910390f35b6104db60048036038101906104d69190613793565b610f7b565b005b6104e5611020565b6040516104f291906134fc565b60405180910390f35b61050361102f565b005b61050d6110b7565b60405161051a91906135c2565b60405180910390f35b61053d6004803603810190610538919061393e565b6110e1565b60405161054a91906135c2565b60405180910390f35b61056d60048036038101906105689190613753565b611110565b60405161057a9190613448565b60405180910390f35b61058b61117b565b60405161059891906135c2565b60405180910390f35b6105a96111a1565b6040516105b691906134fc565b60405180910390f35b6105c7611233565b6040516105d49190613738565b60405180910390f35b6105f760048036038101906105f291906139aa565b61123a565b005b610613600480360381019061060e9190613ab2565b611250565b005b61062f600480360381019061062a9190613bc2565b6112df565b005b61064b60048036038101906106469190613554565b611341565b60405161065891906134fc565b60405180910390f35b61067b600480360381019061067691906136fc565b6113e8565b6040516106889190613658565b60405180910390f35b6106ab60048036038101906106a69190613d08565b61140c565b005b6106c760048036038101906106c29190613793565b6114b5565b005b6106e360048036038101906106de9190613753565b611575565b005b6106ff60048036038101906106fa9190613d93565b61159e565b60405161070c9190613448565b60405180910390f35b61071d61166a565b60405161072a91906135c2565b60405180910390f35b61074d60048036038101906107489190613793565b611690565b005b600061075a8261179e565b9050919050565b60606000805461077090613e02565b80601f016020809104026020016040519081016040528092919081815260200182805461079c90613e02565b80156107e95780601f106107be576101008083540402835291602001916107e9565b820191906000526020600020905b8154815290600101906020018083116107cc57829003601f168201915b5050505050905090565b60006107fe82611818565b61083d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083490613ea6565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061088382610d45565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108eb90613f38565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610913611884565b73ffffffffffffffffffffffffffffffffffffffff16148061094257506109418161093c611884565b61159e565b5b610981576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097890613fca565b60405180910390fd5b61098b838361188c565b505050565b6000600880549050905090565b6109ae6109a8611884565b82611945565b6109ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e49061405c565b60405180910390fd5b6109f8838383611a23565b505050565b6000600a6000838152602001908152602001600020600101549050919050565b610a26826109fd565b610a3781610a32611884565b611c7f565b610a418383611d1c565b505050565b6000610a5183610ec3565b8210610a92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a89906140ee565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610af3611884565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5790614180565b60405180910390fd5b610b6a8282611d50565b5050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610baf611884565b73ffffffffffffffffffffffffffffffffffffffff1614610bcf57600080fd5b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610c54838383604051806020016040528060008152506112df565b505050565b6000610c63610990565b8210610ca4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9b90614212565b60405180910390fd5b60088281548110610cb857610cb7614232565b5b90600052602060002001549050919050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610d0b611884565b73ffffffffffffffffffffffffffffffffffffffff1614610d2b57600080fd5b8060109080519060200190610d419291906132f1565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610dee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de5906142d3565b60405180910390fd5b80915050919050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610e38611884565b73ffffffffffffffffffffffffffffffffffffffff1614610e5857600080fd5b600f54610e63610990565b10610ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9a9061433f565b60405180910390fd5b610eb681610eb16014611d84565b611d92565b610ec06014611788565b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2b906143d1565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610fbc611884565b73ffffffffffffffffffffffffffffffffffffffff1614610fdc57600080fd5b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606061102a611f60565b905090565b611037611884565b73ffffffffffffffffffffffffffffffffffffffff166110556110b7565b73ffffffffffffffffffffffffffffffffffffffff16146110ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a29061443d565b60405180910390fd5b6110b56000611ff2565b565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600061110882600b60008681526020019081526020016000206120b890919063ffffffff16565b905092915050565b6000600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600180546111b090613e02565b80601f01602080910402602001604051908101604052809291908181526020018280546111dc90613e02565b80156112295780601f106111fe57610100808354040283529160200191611229565b820191906000526020600020905b81548152906001019060200180831161120c57829003601f168201915b5050505050905090565b6000801b81565b61124c611245611884565b83836120d2565b5050565b606481511115611295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128c906144cf565b60405180910390fd5b60005b81518110156112d9576112c684848484815181106112b9576112b8614232565b5b602002602001015161099d565b80806112d19061451e565b915050611298565b50505050565b6112f06112ea611884565b83611945565b61132f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113269061405c565b60405180910390fd5b61133b8484848461223f565b50505050565b606061134c82611818565b61138b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611382906145d9565b60405180910390fd5b6000611395611f60565b905060008151116113b557604051806020016040528060008152506113e0565b806113bf8461229b565b6040516020016113d0929190614635565b6040516020818303038152906040525b915050919050565b6000611405600b60008481526020019081526020016000206123fc565b9050919050565b606481511115611451576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611448906144cf565b60405180910390fd5b60005b81518110156114af5761149c8484838151811061147457611473614232565b5b602002602001015184848151811061148f5761148e614232565b5b602002602001015161099d565b80806114a79061451e565b915050611454565b50505050565b6114bd611884565b73ffffffffffffffffffffffffffffffffffffffff166114db6110b7565b73ffffffffffffffffffffffffffffffffffffffff1614611531576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115289061443d565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61157e826109fd565b61158f8161158a611884565b611c7f565b6115998383611d50565b505050565b60008173ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061164957508173ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b156116575760019050611664565b6116618383612411565b90505b92915050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611698611884565b73ffffffffffffffffffffffffffffffffffffffff166116b66110b7565b73ffffffffffffffffffffffffffffffffffffffff161461170c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117039061443d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561177c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611773906146cb565b60405180910390fd5b61178581611ff2565b50565b6001816000016000828254019250508190555050565b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806118115750611810826124a5565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166118ff83610d45565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061195082611818565b61198f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119869061475d565b60405180910390fd5b600061199a83610d45565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a0957508373ffffffffffffffffffffffffffffffffffffffff166119f1846107f3565b73ffffffffffffffffffffffffffffffffffffffff16145b80611a1a5750611a19818561159e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611a4382610d45565b73ffffffffffffffffffffffffffffffffffffffff1614611a99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a90906147ef565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0090614881565b60405180910390fd5b611b1483838361251f565b611b1f60008261188c565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b6f91906148a1565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bc691906148d5565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611c898282611110565b611d1857611cae8173ffffffffffffffffffffffffffffffffffffffff16601461252f565b611cbc8360001c602061252f565b604051602001611ccd9291906149c3565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0f91906134fc565b60405180910390fd5b5050565b611d26828261276b565b611d4b81600b600085815260200190815260200160002061284c90919063ffffffff16565b505050565b611d5a828261287c565b611d7f81600b600085815260200190815260200160002061295e90919063ffffffff16565b505050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df990614a49565b60405180910390fd5b611e0b81611818565b15611e4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4290614ab5565b60405180910390fd5b611e576000838361251f565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ea791906148d5565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b606060108054611f6f90613e02565b80601f0160208091040260200160405190810160405280929190818152602001828054611f9b90613e02565b8015611fe85780601f10611fbd57610100808354040283529160200191611fe8565b820191906000526020600020905b815481529060010190602001808311611fcb57829003601f168201915b5050505050905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006120c7836000018361298e565b60001c905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612141576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213890614b21565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122329190613448565b60405180910390a3505050565b61224a848484611a23565b612256848484846129b9565b612295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228c90614bb3565b60405180910390fd5b50505050565b606060008214156122e3576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123f7565b600082905060005b600082146123155780806122fe9061451e565b915050600a8261230e9190614c02565b91506122eb565b60008167ffffffffffffffff811115612331576123306137ca565b5b6040519080825280601f01601f1916602001820160405280156123635781602001600182028036833780820191505090505b5090505b600085146123f05760018261237c91906148a1565b9150600a8561238b9190614c33565b603061239791906148d5565b60f81b8183815181106123ad576123ac614232565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123e99190614c02565b9450612367565b8093505050505b919050565b600061240a82600001612b41565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612518575061251782612b52565b5b9050919050565b61252a838383612bcc565b505050565b6060600060028360026125429190614c64565b61254c91906148d5565b67ffffffffffffffff811115612565576125646137ca565b5b6040519080825280601f01601f1916602001820160405280156125975781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106125cf576125ce614232565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061263357612632614232565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026126739190614c64565b61267d91906148d5565b90505b600181111561271d577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106126bf576126be614232565b5b1a60f81b8282815181106126d6576126d5614232565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061271690614cbe565b9050612680565b5060008414612761576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275890614d34565b60405180910390fd5b8091505092915050565b6127758282611110565b612848576001600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506127ed611884565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000612874836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612ce0565b905092915050565b6128868282611110565b1561295a576000600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506128ff611884565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000612986836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612d50565b905092915050565b60008260000182815481106129a6576129a5614232565b5b9060005260206000200154905092915050565b60006129da8473ffffffffffffffffffffffffffffffffffffffff16612e64565b15612b34578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a03611884565b8786866040518563ffffffff1660e01b8152600401612a259493929190614da9565b6020604051808303816000875af1925050508015612a6157506040513d601f19601f82011682018060405250810190612a5e9190614e0a565b60015b612ae4573d8060008114612a91576040519150601f19603f3d011682016040523d82523d6000602084013e612a96565b606091505b50600081511415612adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad390614bb3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b39565b600190505b949350505050565b600081600001805490509050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612bc55750612bc482612e77565b5b9050919050565b612bd7838383612f59565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c1a57612c1581612f5e565b612c59565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612c5857612c578382612fa7565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c9c57612c9781613114565b612cdb565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612cda57612cd982826131e5565b5b5b505050565b6000612cec8383613264565b612d45578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612d4a565b600090505b92915050565b60008083600101600084815260200190815260200160002054905060008114612e58576000600182612d8291906148a1565b9050600060018660000180549050612d9a91906148a1565b9050818114612e09576000866000018281548110612dbb57612dba614232565b5b9060005260206000200154905080876000018481548110612ddf57612dde614232565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480612e1d57612e1c614e37565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612e5e565b60009150505b92915050565b600080823b905060008111915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612f4257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612f525750612f5182613287565b5b9050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612fb484610ec3565b612fbe91906148a1565b90506000600760008481526020019081526020016000205490508181146130a3576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061312891906148a1565b905060006009600084815260200190815260200160002054905060006008838154811061315857613157614232565b5b90600052602060002001549050806008838154811061317a57613179614232565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806131c9576131c8614e37565b5b6001900381819060005260206000200160009055905550505050565b60006131f083610ec3565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8280546132fd90613e02565b90600052602060002090601f01602090048101928261331f5760008555613366565b82601f1061333857805160ff1916838001178555613366565b82800160010185558215613366579182015b8281111561336557825182559160200191906001019061334a565b5b5090506133739190613377565b5090565b5b80821115613390576000816000905550600101613378565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6133dd816133a8565b81146133e857600080fd5b50565b6000813590506133fa816133d4565b92915050565b6000602082840312156134165761341561339e565b5b6000613424848285016133eb565b91505092915050565b60008115159050919050565b6134428161342d565b82525050565b600060208201905061345d6000830184613439565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561349d578082015181840152602081019050613482565b838111156134ac576000848401525b50505050565b6000601f19601f8301169050919050565b60006134ce82613463565b6134d8818561346e565b93506134e881856020860161347f565b6134f1816134b2565b840191505092915050565b6000602082019050818103600083015261351681846134c3565b905092915050565b6000819050919050565b6135318161351e565b811461353c57600080fd5b50565b60008135905061354e81613528565b92915050565b60006020828403121561356a5761356961339e565b5b60006135788482850161353f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006135ac82613581565b9050919050565b6135bc816135a1565b82525050565b60006020820190506135d760008301846135b3565b92915050565b6135e6816135a1565b81146135f157600080fd5b50565b600081359050613603816135dd565b92915050565b600080604083850312156136205761361f61339e565b5b600061362e858286016135f4565b925050602061363f8582860161353f565b9150509250929050565b6136528161351e565b82525050565b600060208201905061366d6000830184613649565b92915050565b60008060006060848603121561368c5761368b61339e565b5b600061369a868287016135f4565b93505060206136ab868287016135f4565b92505060406136bc8682870161353f565b9150509250925092565b6000819050919050565b6136d9816136c6565b81146136e457600080fd5b50565b6000813590506136f6816136d0565b92915050565b6000602082840312156137125761371161339e565b5b6000613720848285016136e7565b91505092915050565b613732816136c6565b82525050565b600060208201905061374d6000830184613729565b92915050565b6000806040838503121561376a5761376961339e565b5b6000613778858286016136e7565b9250506020613789858286016135f4565b9150509250929050565b6000602082840312156137a9576137a861339e565b5b60006137b7848285016135f4565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613802826134b2565b810181811067ffffffffffffffff82111715613821576138206137ca565b5b80604052505050565b6000613834613394565b905061384082826137f9565b919050565b600067ffffffffffffffff8211156138605761385f6137ca565b5b613869826134b2565b9050602081019050919050565b82818337600083830152505050565b600061389861389384613845565b61382a565b9050828152602081018484840111156138b4576138b36137c5565b5b6138bf848285613876565b509392505050565b600082601f8301126138dc576138db6137c0565b5b81356138ec848260208601613885565b91505092915050565b60006020828403121561390b5761390a61339e565b5b600082013567ffffffffffffffff811115613929576139286133a3565b5b613935848285016138c7565b91505092915050565b600080604083850312156139555761395461339e565b5b6000613963858286016136e7565b92505060206139748582860161353f565b9150509250929050565b6139878161342d565b811461399257600080fd5b50565b6000813590506139a48161397e565b92915050565b600080604083850312156139c1576139c061339e565b5b60006139cf858286016135f4565b92505060206139e085828601613995565b9150509250929050565b600067ffffffffffffffff821115613a0557613a046137ca565b5b602082029050602081019050919050565b600080fd5b6000613a2e613a29846139ea565b61382a565b90508083825260208201905060208402830185811115613a5157613a50613a16565b5b835b81811015613a7a5780613a66888261353f565b845260208401935050602081019050613a53565b5050509392505050565b600082601f830112613a9957613a986137c0565b5b8135613aa9848260208601613a1b565b91505092915050565b600080600060608486031215613acb57613aca61339e565b5b6000613ad9868287016135f4565b9350506020613aea868287016135f4565b925050604084013567ffffffffffffffff811115613b0b57613b0a6133a3565b5b613b1786828701613a84565b9150509250925092565b600067ffffffffffffffff821115613b3c57613b3b6137ca565b5b613b45826134b2565b9050602081019050919050565b6000613b65613b6084613b21565b61382a565b905082815260208101848484011115613b8157613b806137c5565b5b613b8c848285613876565b509392505050565b600082601f830112613ba957613ba86137c0565b5b8135613bb9848260208601613b52565b91505092915050565b60008060008060808587031215613bdc57613bdb61339e565b5b6000613bea878288016135f4565b9450506020613bfb878288016135f4565b9350506040613c0c8782880161353f565b925050606085013567ffffffffffffffff811115613c2d57613c2c6133a3565b5b613c3987828801613b94565b91505092959194509250565b600067ffffffffffffffff821115613c6057613c5f6137ca565b5b602082029050602081019050919050565b6000613c84613c7f84613c45565b61382a565b90508083825260208201905060208402830185811115613ca757613ca6613a16565b5b835b81811015613cd05780613cbc88826135f4565b845260208401935050602081019050613ca9565b5050509392505050565b600082601f830112613cef57613cee6137c0565b5b8135613cff848260208601613c71565b91505092915050565b600080600060608486031215613d2157613d2061339e565b5b6000613d2f868287016135f4565b935050602084013567ffffffffffffffff811115613d5057613d4f6133a3565b5b613d5c86828701613cda565b925050604084013567ffffffffffffffff811115613d7d57613d7c6133a3565b5b613d8986828701613a84565b9150509250925092565b60008060408385031215613daa57613da961339e565b5b6000613db8858286016135f4565b9250506020613dc9858286016135f4565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613e1a57607f821691505b60208210811415613e2e57613e2d613dd3565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613e90602c8361346e565b9150613e9b82613e34565b604082019050919050565b60006020820190508181036000830152613ebf81613e83565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613f2260218361346e565b9150613f2d82613ec6565b604082019050919050565b60006020820190508181036000830152613f5181613f15565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613fb460388361346e565b9150613fbf82613f58565b604082019050919050565b60006020820190508181036000830152613fe381613fa7565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b600061404660318361346e565b915061405182613fea565b604082019050919050565b6000602082019050818103600083015261407581614039565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006140d8602b8361346e565b91506140e38261407c565b604082019050919050565b60006020820190508181036000830152614107816140cb565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b600061416a602f8361346e565b91506141758261410e565b604082019050919050565b600060208201905081810360008301526141998161415d565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006141fc602c8361346e565b9150614207826141a0565b604082019050919050565b6000602082019050818103600083015261422b816141ef565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006142bd60298361346e565b91506142c882614261565b604082019050919050565b600060208201905081810360008301526142ec816142b0565b9050919050565b7f4d696e7420656e642e0000000000000000000000000000000000000000000000600082015250565b600061432960098361346e565b9150614334826142f3565b602082019050919050565b600060208201905081810360008301526143588161431c565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006143bb602a8361346e565b91506143c68261435f565b604082019050919050565b600060208201905081810360008301526143ea816143ae565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061442760208361346e565b9150614432826143f1565b602082019050919050565b600060208201905081810360008301526144568161441a565b9050919050565b7f43616e206f6e6c79206d6178207472616e7366657220313030204d696d6f6e7360008201527f20617420612074696d6500000000000000000000000000000000000000000000602082015250565b60006144b9602a8361346e565b91506144c48261445d565b604082019050919050565b600060208201905081810360008301526144e8816144ac565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006145298261351e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561455c5761455b6144ef565b5b600182019050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006145c3602f8361346e565b91506145ce82614567565b604082019050919050565b600060208201905081810360008301526145f2816145b6565b9050919050565b600081905092915050565b600061460f82613463565b61461981856145f9565b935061462981856020860161347f565b80840191505092915050565b60006146418285614604565b915061464d8284614604565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006146b560268361346e565b91506146c082614659565b604082019050919050565b600060208201905081810360008301526146e4816146a8565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614747602c8361346e565b9150614752826146eb565b604082019050919050565b600060208201905081810360008301526147768161473a565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006147d960298361346e565b91506147e48261477d565b604082019050919050565b60006020820190508181036000830152614808816147cc565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061486b60248361346e565b91506148768261480f565b604082019050919050565b6000602082019050818103600083015261489a8161485e565b9050919050565b60006148ac8261351e565b91506148b78361351e565b9250828210156148ca576148c96144ef565b5b828203905092915050565b60006148e08261351e565b91506148eb8361351e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156149205761491f6144ef565b5b828201905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b60006149616017836145f9565b915061496c8261492b565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b60006149ad6011836145f9565b91506149b882614977565b601182019050919050565b60006149ce82614954565b91506149da8285614604565b91506149e5826149a0565b91506149f18284614604565b91508190509392505050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614a3360208361346e565b9150614a3e826149fd565b602082019050919050565b60006020820190508181036000830152614a6281614a26565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614a9f601c8361346e565b9150614aaa82614a69565b602082019050919050565b60006020820190508181036000830152614ace81614a92565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614b0b60198361346e565b9150614b1682614ad5565b602082019050919050565b60006020820190508181036000830152614b3a81614afe565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614b9d60328361346e565b9150614ba882614b41565b604082019050919050565b60006020820190508181036000830152614bcc81614b90565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614c0d8261351e565b9150614c188361351e565b925082614c2857614c27614bd3565b5b828204905092915050565b6000614c3e8261351e565b9150614c498361351e565b925082614c5957614c58614bd3565b5b828206905092915050565b6000614c6f8261351e565b9150614c7a8361351e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614cb357614cb26144ef565b5b828202905092915050565b6000614cc98261351e565b91506000821415614cdd57614cdc6144ef565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000614d1e60208361346e565b9150614d2982614ce8565b602082019050919050565b60006020820190508181036000830152614d4d81614d11565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614d7b82614d54565b614d858185614d5f565b9350614d9581856020860161347f565b614d9e816134b2565b840191505092915050565b6000608082019050614dbe60008301876135b3565b614dcb60208301866135b3565b614dd86040830185613649565b8181036060830152614dea8184614d70565b905095945050505050565b600081519050614e04816133d4565b92915050565b600060208284031215614e2057614e1f61339e565b5b6000614e2e84828501614df5565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea264697066735822122063b095122ded6ec8424b3f4313a0ead25550a1bdcc19925b557e06796097b13864736f6c634300080a0033

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

0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000cea1d08a2497abf300ea3f0ef3f954993b4e5ab7000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1000000000000000000000000000000000000000000000000000000000000001c68747470733a2f2f6170692e6d696d6f6e732e696f2f6d696d6f6e2f00000000

-----Decoded View---------------
Arg [0] : baseTokenURI (string): https://api.mimons.io/mimon/
Arg [1] : dev (address): 0xCea1d08a2497abf300Ea3F0EF3F954993B4e5ab7
Arg [2] : proxy (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 000000000000000000000000cea1d08a2497abf300ea3f0ef3f954993b4e5ab7
Arg [2] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
Arg [3] : 000000000000000000000000000000000000000000000000000000000000001c
Arg [4] : 68747470733a2f2f6170692e6d696d6f6e732e696f2f6d696d6f6e2f00000000


Deployed Bytecode Sourcemap

73007:3020:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75431:195;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22334:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23893:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23416:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36569:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24643:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50401:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50786:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36237:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51834:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74697:103;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73270:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25053:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36759:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74601:91;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22028:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73816:191;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21758:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74805:114;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75631:85;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72109:103;;;:::i;:::-;;71458:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67923:145;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49286:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73299:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22503:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48377:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24186:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74012:283;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25309:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22678:334;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68242:134;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74300:296;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74924:95;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51178:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75103:323;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73332:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72367:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75431:195;75567:4;75585:36;75609:11;75585:23;:36::i;:::-;75578:43;;75431:195;;;:::o;22334:100::-;22388:13;22421:5;22414:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22334:100;:::o;23893:221::-;23969:7;23997:16;24005:7;23997;:16::i;:::-;23989:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24082:15;:24;24098:7;24082:24;;;;;;;;;;;;;;;;;;;;;24075:31;;23893:221;;;:::o;23416:411::-;23497:13;23513:23;23528:7;23513:14;:23::i;:::-;23497:39;;23561:5;23555:11;;:2;:11;;;;23547:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23655:5;23639:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23664:37;23681:5;23688:12;:10;:12::i;:::-;23664:16;:37::i;:::-;23639:62;23617:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23798:21;23807:2;23811:7;23798:8;:21::i;:::-;23486:341;23416:411;;:::o;36569:113::-;36630:7;36657:10;:17;;;;36650:24;;36569:113;:::o;24643:339::-;24838:41;24857:12;:10;:12::i;:::-;24871:7;24838:18;:41::i;:::-;24830:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24946:28;24956:4;24962:2;24966:7;24946:9;:28::i;:::-;24643:339;;;:::o;50401:123::-;50467:7;50494:6;:12;50501:4;50494:12;;;;;;;;;;;:22;;;50487:29;;50401:123;;;:::o;50786:147::-;50869:18;50882:4;50869:12;:18::i;:::-;48868:30;48879:4;48885:12;:10;:12::i;:::-;48868:10;:30::i;:::-;50900:25:::1;50911:4;50917:7;50900:10;:25::i;:::-;50786:147:::0;;;:::o;36237:256::-;36334:7;36370:23;36387:5;36370:16;:23::i;:::-;36362:5;:31;36354:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;36459:12;:19;36472:5;36459:19;;;;;;;;;;;;;;;:26;36479:5;36459:26;;;;;;;;;;;;36452:33;;36237:256;;;;:::o;51834:218::-;51941:12;:10;:12::i;:::-;51930:23;;:7;:23;;;51922:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;52018:26;52030:4;52036:7;52018:11;:26::i;:::-;51834:218;;:::o;74697:103::-;73542:10;;;;;;;;;;;73526:26;;:12;:10;:12::i;:::-;:26;;;73518:35;;;;;;74783:12:::1;74766:14;;:29;;;;;;;;;;;;;;;;;;74697:103:::0;:::o;73270:25::-;;;;;;;;;;;;;:::o;25053:185::-;25191:39;25208:4;25214:2;25218:7;25191:39;;;;;;;;;;;;:16;:39::i;:::-;25053:185;;;:::o;36759:233::-;36834:7;36870:30;:28;:30::i;:::-;36862:5;:38;36854:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;36967:10;36978:5;36967:17;;;;;;;;:::i;:::-;;;;;;;;;;36960:24;;36759:233;;;:::o;74601:91::-;73542:10;;;;;;;;;;;73526:26;;:12;:10;:12::i;:::-;:26;;;73518:35;;;;;;74680:7:::1;74664:13;:23;;;;;;;;;;;;:::i;:::-;;74601:91:::0;:::o;22028:239::-;22100:7;22120:13;22136:7;:16;22144:7;22136:16;;;;;;;;;;;;;;;;;;;;;22120:32;;22188:1;22171:19;;:5;:19;;;;22163:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22254:5;22247:12;;;22028:239;;;:::o;73816:191::-;73463:14;;;;;;;;;;;73447:30;;:12;:10;:12::i;:::-;:30;;;73439:39;;;;;;73899:16:::1;;73883:13;:11;:13::i;:::-;:32;73875:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;73934:36;73940:2;73944:25;:15;:23;:25::i;:::-;73934:5;:36::i;:::-;73975:27;:15;:25;:27::i;:::-;73816:191:::0;:::o;21758:208::-;21830:7;21875:1;21858:19;;:5;:19;;;;21850:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21942:9;:16;21952:5;21942:16;;;;;;;;;;;;;;;;21935:23;;21758:208;;;:::o;74805:114::-;73542:10;;;;;;;;;;;73526:26;;:12;:10;:12::i;:::-;:26;;;73518:35;;;;;;74899:14:::1;74875:13;;:39;;;;;;;;;;;;;;;;;;74805:114:::0;:::o;75631:85::-;75674:13;75701:10;:8;:10::i;:::-;75694:17;;75631:85;:::o;72109:103::-;71689:12;:10;:12::i;:::-;71678:23;;:7;:5;:7::i;:::-;:23;;;71670:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72174:30:::1;72201:1;72174:18;:30::i;:::-;72109:103::o:0;71458:87::-;71504:7;71531:6;;;;;;;;;;;71524:13;;71458:87;:::o;67923:145::-;68005:7;68032:28;68054:5;68032:12;:18;68045:4;68032:18;;;;;;;;;;;:21;;:28;;;;:::i;:::-;68025:35;;67923:145;;;;:::o;49286:139::-;49364:4;49388:6;:12;49395:4;49388:12;;;;;;;;;;;:20;;:29;49409:7;49388:29;;;;;;;;;;;;;;;;;;;;;;;;;49381:36;;49286:139;;;;:::o;73299:29::-;;;;;;;;;;;;;:::o;22503:104::-;22559:13;22592:7;22585:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22503:104;:::o;48377:49::-;48422:4;48377:49;;;:::o;24186:155::-;24281:52;24300:12;:10;:12::i;:::-;24314:8;24324;24281:18;:52::i;:::-;24186:155;;:::o;74012:283::-;74143:3;74124:8;:15;:22;;74116:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;74203:9;74198:93;74222:8;:15;74218:1;:19;74198:93;;;74250:35;74263:4;74269:2;74273:8;74282:1;74273:11;;;;;;;;:::i;:::-;;;;;;;;74250:12;:35::i;:::-;74239:3;;;;;:::i;:::-;;;;74198:93;;;;74012:283;;;:::o;25309:328::-;25484:41;25503:12;:10;:12::i;:::-;25517:7;25484:18;:41::i;:::-;25476:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25590:39;25604:4;25610:2;25614:7;25623:5;25590:13;:39::i;:::-;25309:328;;;;:::o;22678:334::-;22751:13;22785:16;22793:7;22785;:16::i;:::-;22777:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22866:21;22890:10;:8;:10::i;:::-;22866:34;;22942:1;22924:7;22918:21;:25;:86;;;;;;;;;;;;;;;;;22970:7;22979:18;:7;:16;:18::i;:::-;22953:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22918:86;22911:93;;;22678:334;;;:::o;68242:134::-;68314:7;68341:27;:12;:18;68354:4;68341:18;;;;;;;;;;;:25;:27::i;:::-;68334:34;;68242:134;;;:::o;74300:296::-;74441:3;74422:8;:15;:22;;74414:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;74501:9;74496:96;74520:8;:15;74516:1;:19;74496:96;;;74548:38;74561:4;74567:2;74570:1;74567:5;;;;;;;;:::i;:::-;;;;;;;;74574:8;74583:1;74574:11;;;;;;;;:::i;:::-;;;;;;;;74548:12;:38::i;:::-;74537:3;;;;;:::i;:::-;;;;74496:96;;;;74300:296;;;:::o;74924:95::-;71689:12;:10;:12::i;:::-;71678:23;;:7;:5;:7::i;:::-;:23;;;71670:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75003:11:::1;74990:10;;:24;;;;;;;;;;;;;;;;;;74924:95:::0;:::o;51178:149::-;51262:18;51275:4;51262:12;:18::i;:::-;48868:30;48879:4;48885:12;:10;:12::i;:::-;48868:10;:30::i;:::-;51293:26:::1;51305:4;51311:7;51293:11;:26::i;:::-;51178:149:::0;;;:::o;75103:323::-;75194:15;75307:9;75290:26;;:13;;;;;;;;;;;:26;;;:53;;;;75334:9;75320:23;;:10;;;;;;;;;;;:23;;;75290:53;75286:82;;;75358:4;75351:11;;;;75286:82;75379:42;75403:6;75411:9;75379:23;:42::i;:::-;75372:49;;75103:323;;;;;:::o;73332:28::-;;;;;;;;;;;;;:::o;72367:201::-;71689:12;:10;:12::i;:::-;71678:23;;:7;:5;:7::i;:::-;:23;;;71670:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72476:1:::1;72456:22;;:8;:22;;;;72448:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;72532:28;72551:8;72532:18;:28::i;:::-;72367:201:::0;:::o;69917:127::-;70024:1;70006:7;:14;;;:19;;;;;;;;;;;69917:127;:::o;67110:214::-;67195:4;67234:42;67219:57;;;:11;:57;;;;:97;;;;67280:36;67304:11;67280:23;:36::i;:::-;67219:97;67212:104;;67110:214;;;:::o;27147:127::-;27212:4;27264:1;27236:30;;:7;:16;27244:7;27236:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27229:37;;27147:127;;;:::o;16604:98::-;16657:7;16684:10;16677:17;;16604:98;:::o;31129:174::-;31231:2;31204:15;:24;31220:7;31204:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31287:7;31283:2;31249:46;;31258:23;31273:7;31258:14;:23::i;:::-;31249:46;;;;;;;;;;;;31129:174;;:::o;27441:348::-;27534:4;27559:16;27567:7;27559;:16::i;:::-;27551:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27635:13;27651:23;27666:7;27651:14;:23::i;:::-;27635:39;;27704:5;27693:16;;:7;:16;;;:51;;;;27737:7;27713:31;;:20;27725:7;27713:11;:20::i;:::-;:31;;;27693:51;:87;;;;27748:32;27765:5;27772:7;27748:16;:32::i;:::-;27693:87;27685:96;;;27441:348;;;;:::o;30433:578::-;30592:4;30565:31;;:23;30580:7;30565:14;:23::i;:::-;:31;;;30557:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30675:1;30661:16;;:2;:16;;;;30653:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30731:39;30752:4;30758:2;30762:7;30731:20;:39::i;:::-;30835:29;30852:1;30856:7;30835:8;:29::i;:::-;30896:1;30877:9;:15;30887:4;30877:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30925:1;30908:9;:13;30918:2;30908:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30956:2;30937:7;:16;30945:7;30937:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30995:7;30991:2;30976:27;;30985:4;30976:27;;;;;;;;;;;;30433:578;;;:::o;49715:497::-;49796:22;49804:4;49810:7;49796;:22::i;:::-;49791:414;;49984:41;50012:7;49984:41;;50022:2;49984:19;:41::i;:::-;50098:38;50126:4;50118:13;;50133:2;50098:19;:38::i;:::-;49889:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49835:358;;;;;;;;;;;:::i;:::-;;;;;;;;49791:414;49715:497;;:::o;68469:169::-;68557:31;68574:4;68580:7;68557:16;:31::i;:::-;68599;68622:7;68599:12;:18;68612:4;68599:18;;;;;;;;;;;:22;;:31;;;;:::i;:::-;;68469:169;;:::o;68732:174::-;68821:32;68839:4;68845:7;68821:17;:32::i;:::-;68864:34;68890:7;68864:12;:18;68877:4;68864:18;;;;;;;;;;;:25;;:34;;;;:::i;:::-;;68732:174;;:::o;69795:114::-;69860:7;69887;:14;;;69880:21;;69795:114;;;:::o;29125:382::-;29219:1;29205:16;;:2;:16;;;;29197:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29278:16;29286:7;29278;:16::i;:::-;29277:17;29269:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29340:45;29369:1;29373:2;29377:7;29340:20;:45::i;:::-;29415:1;29398:9;:13;29408:2;29398:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29446:2;29427:7;:16;29435:7;29427:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29491:7;29487:2;29466:33;;29483:1;29466:33;;;;;;;;;;;;29125:382;;:::o;75721:105::-;75781:13;75808;75801:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75721:105;:::o;72728:191::-;72802:16;72821:6;;;;;;;;;;;72802:25;;72847:8;72838:6;;:17;;;;;;;;;;;;;;;;;;72902:8;72871:40;;72892:8;72871:40;;;;;;;;;;;;72791:128;72728:191;:::o;63129:158::-;63203:7;63254:22;63258:3;:10;;63270:5;63254:3;:22::i;:::-;63246:31;;63223:56;;63129:158;;;;:::o;31445:315::-;31600:8;31591:17;;:5;:17;;;;31583:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;31687:8;31649:18;:25;31668:5;31649:25;;;;;;;;;;;;;;;:35;31675:8;31649:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;31733:8;31711:41;;31726:5;31711:41;;;31743:8;31711:41;;;;;;:::i;:::-;;;;;;;;31445:315;;;:::o;26519:::-;26676:28;26686:4;26692:2;26696:7;26676:9;:28::i;:::-;26723:48;26746:4;26752:2;26756:7;26765:5;26723:22;:48::i;:::-;26715:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26519:315;;;;:::o;17193:723::-;17249:13;17479:1;17470:5;:10;17466:53;;;17497:10;;;;;;;;;;;;;;;;;;;;;17466:53;17529:12;17544:5;17529:20;;17560:14;17585:78;17600:1;17592:4;:9;17585:78;;17618:8;;;;;:::i;:::-;;;;17649:2;17641:10;;;;;:::i;:::-;;;17585:78;;;17673:19;17705:6;17695:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17673:39;;17723:154;17739:1;17730:5;:10;17723:154;;17767:1;17757:11;;;;;:::i;:::-;;;17834:2;17826:5;:10;;;;:::i;:::-;17813:2;:24;;;;:::i;:::-;17800:39;;17783:6;17790;17783:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17863:2;17854:11;;;;;:::i;:::-;;;17723:154;;;17901:6;17887:21;;;;;17193:723;;;;:::o;62658:117::-;62721:7;62748:19;62756:3;:10;;62748:7;:19::i;:::-;62741:26;;62658:117;;;:::o;24412:164::-;24509:4;24533:18;:25;24552:5;24533:25;;;;;;;;;;;;;;;:35;24559:8;24533:35;;;;;;;;;;;;;;;;;;;;;;;;;24526:42;;24412:164;;;;:::o;48990:204::-;49075:4;49114:32;49099:47;;;:11;:47;;;;:87;;;;49150:36;49174:11;49150:23;:36::i;:::-;49099:87;49092:94;;48990:204;;;:::o;75831:193::-;75974:45;76001:4;76007:2;76011:7;75974:26;:45::i;:::-;75831:193;;;:::o;18494:451::-;18569:13;18595:19;18640:1;18631:6;18627:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;18617:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18595:47;;18653:15;:6;18660:1;18653:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;18679;:6;18686:1;18679:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;18710:9;18735:1;18726:6;18722:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;18710:26;;18705:135;18742:1;18738;:5;18705:135;;;18777:12;18798:3;18790:5;:11;18777:25;;;;;;;:::i;:::-;;;;;18765:6;18772:1;18765:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;18827:1;18817:11;;;;;18745:3;;;;:::i;:::-;;;18705:135;;;;18867:1;18858:5;:10;18850:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;18930:6;18916:21;;;18494:451;;;;:::o;53335:238::-;53419:22;53427:4;53433:7;53419;:22::i;:::-;53414:152;;53490:4;53458:6;:12;53465:4;53458:12;;;;;;;;;;;:20;;:29;53479:7;53458:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;53541:12;:10;:12::i;:::-;53514:40;;53532:7;53514:40;;53526:4;53514:40;;;;;;;;;;53414:152;53335:238;;:::o;61833:152::-;61903:4;61927:50;61932:3;:10;;61968:5;61952:23;;61944:32;;61927:4;:50::i;:::-;61920:57;;61833:152;;;;:::o;53705:239::-;53789:22;53797:4;53803:7;53789;:22::i;:::-;53785:152;;;53860:5;53828:6;:12;53835:4;53828:12;;;;;;;;;;;:20;;:29;53849:7;53828:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;53912:12;:10;:12::i;:::-;53885:40;;53903:7;53885:40;;53897:4;53885:40;;;;;;;;;;53785:152;53705:239;;:::o;62161:158::-;62234:4;62258:53;62266:3;:10;;62302:5;62286:23;;62278:32;;62258:7;:53::i;:::-;62251:60;;62161:158;;;;:::o;58522:120::-;58589:7;58616:3;:11;;58628:5;58616:18;;;;;;;;:::i;:::-;;;;;;;;;;58609:25;;58522:120;;;;:::o;32325:799::-;32480:4;32501:15;:2;:13;;;:15::i;:::-;32497:620;;;32553:2;32537:36;;;32574:12;:10;:12::i;:::-;32588:4;32594:7;32603:5;32537:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32533:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32796:1;32779:6;:13;:18;32775:272;;;32822:60;;;;;;;;;;:::i;:::-;;;;;;;;32775:272;32997:6;32991:13;32982:6;32978:2;32974:15;32967:38;32533:529;32670:41;;;32660:51;;;:6;:51;;;;32653:58;;;;;32497:620;33101:4;33094:11;;32325:799;;;;;;;:::o;58059:109::-;58115:7;58142:3;:11;;:18;;;;58135:25;;58059:109;;;:::o;35929:224::-;36031:4;36070:35;36055:50;;;:11;:50;;;;:90;;;;36109:36;36133:11;36109:23;:36::i;:::-;36055:90;36048:97;;35929:224;;;:::o;37605:589::-;37749:45;37776:4;37782:2;37786:7;37749:26;:45::i;:::-;37827:1;37811:18;;:4;:18;;;37807:187;;;37846:40;37878:7;37846:31;:40::i;:::-;37807:187;;;37916:2;37908:10;;:4;:10;;;37904:90;;37935:47;37968:4;37974:7;37935:32;:47::i;:::-;37904:90;37807:187;38022:1;38008:16;;:2;:16;;;38004:183;;;38041:45;38078:7;38041:36;:45::i;:::-;38004:183;;;38114:4;38108:10;;:2;:10;;;38104:83;;38135:40;38163:2;38167:7;38135:27;:40::i;:::-;38104:83;38004:183;37605:589;;;:::o;55748:414::-;55811:4;55833:21;55843:3;55848:5;55833:9;:21::i;:::-;55828:327;;55871:3;:11;;55888:5;55871:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56054:3;:11;;:18;;;;56032:3;:12;;:19;56045:5;56032:19;;;;;;;;;;;:40;;;;56094:4;56087:11;;;;55828:327;56138:5;56131:12;;55748:414;;;;;:::o;56338:1420::-;56404:4;56522:18;56543:3;:12;;:19;56556:5;56543:19;;;;;;;;;;;;56522:40;;56593:1;56579:10;:15;56575:1176;;56954:21;56991:1;56978:10;:14;;;;:::i;:::-;56954:38;;57007:17;57048:1;57027:3;:11;;:18;;;;:22;;;;:::i;:::-;57007:42;;57083:13;57070:9;:26;57066:405;;57117:17;57137:3;:11;;57149:9;57137:22;;;;;;;;:::i;:::-;;;;;;;;;;57117:42;;57291:9;57262:3;:11;;57274:13;57262:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;57402:10;57376:3;:12;;:23;57389:9;57376:23;;;;;;;;;;;:36;;;;57098:373;57066:405;57552:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;57647:3;:12;;:19;57660:5;57647:19;;;;;;;;;;;57640:26;;;57690:4;57683:11;;;;;;;56575:1176;57734:5;57727:12;;;56338:1420;;;;;:::o;8584:387::-;8644:4;8852:12;8919:7;8907:20;8899:28;;8962:1;8955:4;:8;8948:15;;;8584:387;;;:::o;21389:305::-;21491:4;21543:25;21528:40;;;:11;:40;;;;:105;;;;21600:33;21585:48;;;:11;:48;;;;21528:105;:158;;;;21650:36;21674:11;21650:23;:36::i;:::-;21528:158;21508:178;;21389:305;;;:::o;33696:126::-;;;;:::o;38917:164::-;39021:10;:17;;;;38994:15;:24;39010:7;38994:24;;;;;;;;;;;:44;;;;39049:10;39065:7;39049:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38917:164;:::o;39708:988::-;39974:22;40024:1;39999:22;40016:4;39999:16;:22::i;:::-;:26;;;;:::i;:::-;39974:51;;40036:18;40057:17;:26;40075:7;40057:26;;;;;;;;;;;;40036:47;;40204:14;40190:10;:28;40186:328;;40235:19;40257:12;:18;40270:4;40257:18;;;;;;;;;;;;;;;:34;40276:14;40257:34;;;;;;;;;;;;40235:56;;40341:11;40308:12;:18;40321:4;40308:18;;;;;;;;;;;;;;;:30;40327:10;40308:30;;;;;;;;;;;:44;;;;40458:10;40425:17;:30;40443:11;40425:30;;;;;;;;;;;:43;;;;40220:294;40186:328;40610:17;:26;40628:7;40610:26;;;;;;;;;;;40603:33;;;40654:12;:18;40667:4;40654:18;;;;;;;;;;;;;;;:34;40673:14;40654:34;;;;;;;;;;;40647:41;;;39789:907;;39708:988;;:::o;40991:1079::-;41244:22;41289:1;41269:10;:17;;;;:21;;;;:::i;:::-;41244:46;;41301:18;41322:15;:24;41338:7;41322:24;;;;;;;;;;;;41301:45;;41673:19;41695:10;41706:14;41695:26;;;;;;;;:::i;:::-;;;;;;;;;;41673:48;;41759:11;41734:10;41745;41734:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;41870:10;41839:15;:28;41855:11;41839:28;;;;;;;;;;;:41;;;;42011:15;:24;42027:7;42011:24;;;;;;;;;;;42004:31;;;42046:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41062:1008;;;40991:1079;:::o;38495:221::-;38580:14;38597:20;38614:2;38597:16;:20::i;:::-;38580:37;;38655:7;38628:12;:16;38641:2;38628:16;;;;;;;;;;;;;;;:24;38645:6;38628:24;;;;;;;;;;;:34;;;;38702:6;38673:17;:26;38691:7;38673:26;;;;;;;;;;;:35;;;;38569:147;38495:221;;:::o;57844:129::-;57917:4;57964:1;57941:3;:12;;:19;57954:5;57941:19;;;;;;;;;;;;:24;;57934:31;;57844:129;;;;:::o;19825:157::-;19910:4;19949:25;19934:40;;;:11;:40;;;;19927:47;;19825:157;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:77::-;5952:7;5981:5;5970:16;;5915:77;;;:::o;5998:122::-;6071:24;6089:5;6071:24;:::i;:::-;6064:5;6061:35;6051:63;;6110:1;6107;6100:12;6051:63;5998:122;:::o;6126:139::-;6172:5;6210:6;6197:20;6188:29;;6226:33;6253:5;6226:33;:::i;:::-;6126:139;;;;:::o;6271:329::-;6330:6;6379:2;6367:9;6358:7;6354:23;6350:32;6347:119;;;6385:79;;:::i;:::-;6347:119;6505:1;6530:53;6575:7;6566:6;6555:9;6551:22;6530:53;:::i;:::-;6520:63;;6476:117;6271:329;;;;:::o;6606:118::-;6693:24;6711:5;6693:24;:::i;:::-;6688:3;6681:37;6606:118;;:::o;6730:222::-;6823:4;6861:2;6850:9;6846:18;6838:26;;6874:71;6942:1;6931:9;6927:17;6918:6;6874:71;:::i;:::-;6730:222;;;;:::o;6958:474::-;7026:6;7034;7083:2;7071:9;7062:7;7058:23;7054:32;7051:119;;;7089:79;;:::i;:::-;7051:119;7209:1;7234:53;7279:7;7270:6;7259:9;7255:22;7234:53;:::i;:::-;7224:63;;7180:117;7336:2;7362:53;7407:7;7398:6;7387:9;7383:22;7362:53;:::i;:::-;7352:63;;7307:118;6958:474;;;;;:::o;7438:329::-;7497:6;7546:2;7534:9;7525:7;7521:23;7517:32;7514:119;;;7552:79;;:::i;:::-;7514:119;7672:1;7697:53;7742:7;7733:6;7722:9;7718:22;7697:53;:::i;:::-;7687:63;;7643:117;7438:329;;;;:::o;7773:117::-;7882:1;7879;7872:12;7896:117;8005:1;8002;7995:12;8019:180;8067:77;8064:1;8057:88;8164:4;8161:1;8154:15;8188:4;8185:1;8178:15;8205:281;8288:27;8310:4;8288:27;:::i;:::-;8280:6;8276:40;8418:6;8406:10;8403:22;8382:18;8370:10;8367:34;8364:62;8361:88;;;8429:18;;:::i;:::-;8361:88;8469:10;8465:2;8458:22;8248:238;8205:281;;:::o;8492:129::-;8526:6;8553:20;;:::i;:::-;8543:30;;8582:33;8610:4;8602:6;8582:33;:::i;:::-;8492:129;;;:::o;8627:308::-;8689:4;8779:18;8771:6;8768:30;8765:56;;;8801:18;;:::i;:::-;8765:56;8839:29;8861:6;8839:29;:::i;:::-;8831:37;;8923:4;8917;8913:15;8905:23;;8627:308;;;:::o;8941:154::-;9025:6;9020:3;9015;9002:30;9087:1;9078:6;9073:3;9069:16;9062:27;8941:154;;;:::o;9101:412::-;9179:5;9204:66;9220:49;9262:6;9220:49;:::i;:::-;9204:66;:::i;:::-;9195:75;;9293:6;9286:5;9279:21;9331:4;9324:5;9320:16;9369:3;9360:6;9355:3;9351:16;9348:25;9345:112;;;9376:79;;:::i;:::-;9345:112;9466:41;9500:6;9495:3;9490;9466:41;:::i;:::-;9185:328;9101:412;;;;;:::o;9533:340::-;9589:5;9638:3;9631:4;9623:6;9619:17;9615:27;9605:122;;9646:79;;:::i;:::-;9605:122;9763:6;9750:20;9788:79;9863:3;9855:6;9848:4;9840:6;9836:17;9788:79;:::i;:::-;9779:88;;9595:278;9533:340;;;;:::o;9879:509::-;9948:6;9997:2;9985:9;9976:7;9972:23;9968:32;9965:119;;;10003:79;;:::i;:::-;9965:119;10151:1;10140:9;10136:17;10123:31;10181:18;10173:6;10170:30;10167:117;;;10203:79;;:::i;:::-;10167:117;10308:63;10363:7;10354:6;10343:9;10339:22;10308:63;:::i;:::-;10298:73;;10094:287;9879:509;;;;:::o;10394:474::-;10462:6;10470;10519:2;10507:9;10498:7;10494:23;10490:32;10487:119;;;10525:79;;:::i;:::-;10487:119;10645:1;10670:53;10715:7;10706:6;10695:9;10691:22;10670:53;:::i;:::-;10660:63;;10616:117;10772:2;10798:53;10843:7;10834:6;10823:9;10819:22;10798:53;:::i;:::-;10788:63;;10743:118;10394:474;;;;;:::o;10874:116::-;10944:21;10959:5;10944:21;:::i;:::-;10937:5;10934:32;10924:60;;10980:1;10977;10970:12;10924:60;10874:116;:::o;10996:133::-;11039:5;11077:6;11064:20;11055:29;;11093:30;11117:5;11093:30;:::i;:::-;10996:133;;;;:::o;11135:468::-;11200:6;11208;11257:2;11245:9;11236:7;11232:23;11228:32;11225:119;;;11263:79;;:::i;:::-;11225:119;11383:1;11408:53;11453:7;11444:6;11433:9;11429:22;11408:53;:::i;:::-;11398:63;;11354:117;11510:2;11536:50;11578:7;11569:6;11558:9;11554:22;11536:50;:::i;:::-;11526:60;;11481:115;11135:468;;;;;:::o;11609:311::-;11686:4;11776:18;11768:6;11765:30;11762:56;;;11798:18;;:::i;:::-;11762:56;11848:4;11840:6;11836:17;11828:25;;11908:4;11902;11898:15;11890:23;;11609:311;;;:::o;11926:117::-;12035:1;12032;12025:12;12066:710;12162:5;12187:81;12203:64;12260:6;12203:64;:::i;:::-;12187:81;:::i;:::-;12178:90;;12288:5;12317:6;12310:5;12303:21;12351:4;12344:5;12340:16;12333:23;;12404:4;12396:6;12392:17;12384:6;12380:30;12433:3;12425:6;12422:15;12419:122;;;12452:79;;:::i;:::-;12419:122;12567:6;12550:220;12584:6;12579:3;12576:15;12550:220;;;12659:3;12688:37;12721:3;12709:10;12688:37;:::i;:::-;12683:3;12676:50;12755:4;12750:3;12746:14;12739:21;;12626:144;12610:4;12605:3;12601:14;12594:21;;12550:220;;;12554:21;12168:608;;12066:710;;;;;:::o;12799:370::-;12870:5;12919:3;12912:4;12904:6;12900:17;12896:27;12886:122;;12927:79;;:::i;:::-;12886:122;13044:6;13031:20;13069:94;13159:3;13151:6;13144:4;13136:6;13132:17;13069:94;:::i;:::-;13060:103;;12876:293;12799:370;;;;:::o;13175:829::-;13277:6;13285;13293;13342:2;13330:9;13321:7;13317:23;13313:32;13310:119;;;13348:79;;:::i;:::-;13310:119;13468:1;13493:53;13538:7;13529:6;13518:9;13514:22;13493:53;:::i;:::-;13483:63;;13439:117;13595:2;13621:53;13666:7;13657:6;13646:9;13642:22;13621:53;:::i;:::-;13611:63;;13566:118;13751:2;13740:9;13736:18;13723:32;13782:18;13774:6;13771:30;13768:117;;;13804:79;;:::i;:::-;13768:117;13909:78;13979:7;13970:6;13959:9;13955:22;13909:78;:::i;:::-;13899:88;;13694:303;13175:829;;;;;:::o;14010:307::-;14071:4;14161:18;14153:6;14150:30;14147:56;;;14183:18;;:::i;:::-;14147:56;14221:29;14243:6;14221:29;:::i;:::-;14213:37;;14305:4;14299;14295:15;14287:23;;14010:307;;;:::o;14323:410::-;14400:5;14425:65;14441:48;14482:6;14441:48;:::i;:::-;14425:65;:::i;:::-;14416:74;;14513:6;14506:5;14499:21;14551:4;14544:5;14540:16;14589:3;14580:6;14575:3;14571:16;14568:25;14565:112;;;14596:79;;:::i;:::-;14565:112;14686:41;14720:6;14715:3;14710;14686:41;:::i;:::-;14406:327;14323:410;;;;;:::o;14752:338::-;14807:5;14856:3;14849:4;14841:6;14837:17;14833:27;14823:122;;14864:79;;:::i;:::-;14823:122;14981:6;14968:20;15006:78;15080:3;15072:6;15065:4;15057:6;15053:17;15006:78;:::i;:::-;14997:87;;14813:277;14752:338;;;;:::o;15096:943::-;15191:6;15199;15207;15215;15264:3;15252:9;15243:7;15239:23;15235:33;15232:120;;;15271:79;;:::i;:::-;15232:120;15391:1;15416:53;15461:7;15452:6;15441:9;15437:22;15416:53;:::i;:::-;15406:63;;15362:117;15518:2;15544:53;15589:7;15580:6;15569:9;15565:22;15544:53;:::i;:::-;15534:63;;15489:118;15646:2;15672:53;15717:7;15708:6;15697:9;15693:22;15672:53;:::i;:::-;15662:63;;15617:118;15802:2;15791:9;15787:18;15774:32;15833:18;15825:6;15822:30;15819:117;;;15855:79;;:::i;:::-;15819:117;15960:62;16014:7;16005:6;15994:9;15990:22;15960:62;:::i;:::-;15950:72;;15745:287;15096:943;;;;;;;:::o;16045:311::-;16122:4;16212:18;16204:6;16201:30;16198:56;;;16234:18;;:::i;:::-;16198:56;16284:4;16276:6;16272:17;16264:25;;16344:4;16338;16334:15;16326:23;;16045:311;;;:::o;16379:710::-;16475:5;16500:81;16516:64;16573:6;16516:64;:::i;:::-;16500:81;:::i;:::-;16491:90;;16601:5;16630:6;16623:5;16616:21;16664:4;16657:5;16653:16;16646:23;;16717:4;16709:6;16705:17;16697:6;16693:30;16746:3;16738:6;16735:15;16732:122;;;16765:79;;:::i;:::-;16732:122;16880:6;16863:220;16897:6;16892:3;16889:15;16863:220;;;16972:3;17001:37;17034:3;17022:10;17001:37;:::i;:::-;16996:3;16989:50;17068:4;17063:3;17059:14;17052:21;;16939:144;16923:4;16918:3;16914:14;16907:21;;16863:220;;;16867:21;16481:608;;16379:710;;;;;:::o;17112:370::-;17183:5;17232:3;17225:4;17217:6;17213:17;17209:27;17199:122;;17240:79;;:::i;:::-;17199:122;17357:6;17344:20;17382:94;17472:3;17464:6;17457:4;17449:6;17445:17;17382:94;:::i;:::-;17373:103;;17189:293;17112:370;;;;:::o;17488:1039::-;17615:6;17623;17631;17680:2;17668:9;17659:7;17655:23;17651:32;17648:119;;;17686:79;;:::i;:::-;17648:119;17806:1;17831:53;17876:7;17867:6;17856:9;17852:22;17831:53;:::i;:::-;17821:63;;17777:117;17961:2;17950:9;17946:18;17933:32;17992:18;17984:6;17981:30;17978:117;;;18014:79;;:::i;:::-;17978:117;18119:78;18189:7;18180:6;18169:9;18165:22;18119:78;:::i;:::-;18109:88;;17904:303;18274:2;18263:9;18259:18;18246:32;18305:18;18297:6;18294:30;18291:117;;;18327:79;;:::i;:::-;18291:117;18432:78;18502:7;18493:6;18482:9;18478:22;18432:78;:::i;:::-;18422:88;;18217:303;17488:1039;;;;;:::o;18533:474::-;18601:6;18609;18658:2;18646:9;18637:7;18633:23;18629:32;18626:119;;;18664:79;;:::i;:::-;18626:119;18784:1;18809:53;18854:7;18845:6;18834:9;18830:22;18809:53;:::i;:::-;18799:63;;18755:117;18911:2;18937:53;18982:7;18973:6;18962:9;18958:22;18937:53;:::i;:::-;18927:63;;18882:118;18533:474;;;;;:::o;19013:180::-;19061:77;19058:1;19051:88;19158:4;19155:1;19148:15;19182:4;19179:1;19172:15;19199:320;19243:6;19280:1;19274:4;19270:12;19260:22;;19327:1;19321:4;19317:12;19348:18;19338:81;;19404:4;19396:6;19392:17;19382:27;;19338:81;19466:2;19458:6;19455:14;19435:18;19432:38;19429:84;;;19485:18;;:::i;:::-;19429:84;19250:269;19199:320;;;:::o;19525:231::-;19665:34;19661:1;19653:6;19649:14;19642:58;19734:14;19729:2;19721:6;19717:15;19710:39;19525:231;:::o;19762:366::-;19904:3;19925:67;19989:2;19984:3;19925:67;:::i;:::-;19918:74;;20001:93;20090:3;20001:93;:::i;:::-;20119:2;20114:3;20110:12;20103:19;;19762:366;;;:::o;20134:419::-;20300:4;20338:2;20327:9;20323:18;20315:26;;20387:9;20381:4;20377:20;20373:1;20362:9;20358:17;20351:47;20415:131;20541:4;20415:131;:::i;:::-;20407:139;;20134:419;;;:::o;20559:220::-;20699:34;20695:1;20687:6;20683:14;20676:58;20768:3;20763:2;20755:6;20751:15;20744:28;20559:220;:::o;20785:366::-;20927:3;20948:67;21012:2;21007:3;20948:67;:::i;:::-;20941:74;;21024:93;21113:3;21024:93;:::i;:::-;21142:2;21137:3;21133:12;21126:19;;20785:366;;;:::o;21157:419::-;21323:4;21361:2;21350:9;21346:18;21338:26;;21410:9;21404:4;21400:20;21396:1;21385:9;21381:17;21374:47;21438:131;21564:4;21438:131;:::i;:::-;21430:139;;21157:419;;;:::o;21582:243::-;21722:34;21718:1;21710:6;21706:14;21699:58;21791:26;21786:2;21778:6;21774:15;21767:51;21582:243;:::o;21831:366::-;21973:3;21994:67;22058:2;22053:3;21994:67;:::i;:::-;21987:74;;22070:93;22159:3;22070:93;:::i;:::-;22188:2;22183:3;22179:12;22172:19;;21831:366;;;:::o;22203:419::-;22369:4;22407:2;22396:9;22392:18;22384:26;;22456:9;22450:4;22446:20;22442:1;22431:9;22427:17;22420:47;22484:131;22610:4;22484:131;:::i;:::-;22476:139;;22203:419;;;:::o;22628:236::-;22768:34;22764:1;22756:6;22752:14;22745:58;22837:19;22832:2;22824:6;22820:15;22813:44;22628:236;:::o;22870:366::-;23012:3;23033:67;23097:2;23092:3;23033:67;:::i;:::-;23026:74;;23109:93;23198:3;23109:93;:::i;:::-;23227:2;23222:3;23218:12;23211:19;;22870:366;;;:::o;23242:419::-;23408:4;23446:2;23435:9;23431:18;23423:26;;23495:9;23489:4;23485:20;23481:1;23470:9;23466:17;23459:47;23523:131;23649:4;23523:131;:::i;:::-;23515:139;;23242:419;;;:::o;23667:230::-;23807:34;23803:1;23795:6;23791:14;23784:58;23876:13;23871:2;23863:6;23859:15;23852:38;23667:230;:::o;23903:366::-;24045:3;24066:67;24130:2;24125:3;24066:67;:::i;:::-;24059:74;;24142:93;24231:3;24142:93;:::i;:::-;24260:2;24255:3;24251:12;24244:19;;23903:366;;;:::o;24275:419::-;24441:4;24479:2;24468:9;24464:18;24456:26;;24528:9;24522:4;24518:20;24514:1;24503:9;24499:17;24492:47;24556:131;24682:4;24556:131;:::i;:::-;24548:139;;24275:419;;;:::o;24700:234::-;24840:34;24836:1;24828:6;24824:14;24817:58;24909:17;24904:2;24896:6;24892:15;24885:42;24700:234;:::o;24940:366::-;25082:3;25103:67;25167:2;25162:3;25103:67;:::i;:::-;25096:74;;25179:93;25268:3;25179:93;:::i;:::-;25297:2;25292:3;25288:12;25281:19;;24940:366;;;:::o;25312:419::-;25478:4;25516:2;25505:9;25501:18;25493:26;;25565:9;25559:4;25555:20;25551:1;25540:9;25536:17;25529:47;25593:131;25719:4;25593:131;:::i;:::-;25585:139;;25312:419;;;:::o;25737:231::-;25877:34;25873:1;25865:6;25861:14;25854:58;25946:14;25941:2;25933:6;25929:15;25922:39;25737:231;:::o;25974:366::-;26116:3;26137:67;26201:2;26196:3;26137:67;:::i;:::-;26130:74;;26213:93;26302:3;26213:93;:::i;:::-;26331:2;26326:3;26322:12;26315:19;;25974:366;;;:::o;26346:419::-;26512:4;26550:2;26539:9;26535:18;26527:26;;26599:9;26593:4;26589:20;26585:1;26574:9;26570:17;26563:47;26627:131;26753:4;26627:131;:::i;:::-;26619:139;;26346:419;;;:::o;26771:180::-;26819:77;26816:1;26809:88;26916:4;26913:1;26906:15;26940:4;26937:1;26930:15;26957:228;27097:34;27093:1;27085:6;27081:14;27074:58;27166:11;27161:2;27153:6;27149:15;27142:36;26957:228;:::o;27191:366::-;27333:3;27354:67;27418:2;27413:3;27354:67;:::i;:::-;27347:74;;27430:93;27519:3;27430:93;:::i;:::-;27548:2;27543:3;27539:12;27532:19;;27191:366;;;:::o;27563:419::-;27729:4;27767:2;27756:9;27752:18;27744:26;;27816:9;27810:4;27806:20;27802:1;27791:9;27787:17;27780:47;27844:131;27970:4;27844:131;:::i;:::-;27836:139;;27563:419;;;:::o;27988:159::-;28128:11;28124:1;28116:6;28112:14;28105:35;27988:159;:::o;28153:365::-;28295:3;28316:66;28380:1;28375:3;28316:66;:::i;:::-;28309:73;;28391:93;28480:3;28391:93;:::i;:::-;28509:2;28504:3;28500:12;28493:19;;28153:365;;;:::o;28524:419::-;28690:4;28728:2;28717:9;28713:18;28705:26;;28777:9;28771:4;28767:20;28763:1;28752:9;28748:17;28741:47;28805:131;28931:4;28805:131;:::i;:::-;28797:139;;28524:419;;;:::o;28949:229::-;29089:34;29085:1;29077:6;29073:14;29066:58;29158:12;29153:2;29145:6;29141:15;29134:37;28949:229;:::o;29184:366::-;29326:3;29347:67;29411:2;29406:3;29347:67;:::i;:::-;29340:74;;29423:93;29512:3;29423:93;:::i;:::-;29541:2;29536:3;29532:12;29525:19;;29184:366;;;:::o;29556:419::-;29722:4;29760:2;29749:9;29745:18;29737:26;;29809:9;29803:4;29799:20;29795:1;29784:9;29780:17;29773:47;29837:131;29963:4;29837:131;:::i;:::-;29829:139;;29556:419;;;:::o;29981:182::-;30121:34;30117:1;30109:6;30105:14;30098:58;29981:182;:::o;30169:366::-;30311:3;30332:67;30396:2;30391:3;30332:67;:::i;:::-;30325:74;;30408:93;30497:3;30408:93;:::i;:::-;30526:2;30521:3;30517:12;30510:19;;30169:366;;;:::o;30541:419::-;30707:4;30745:2;30734:9;30730:18;30722:26;;30794:9;30788:4;30784:20;30780:1;30769:9;30765:17;30758:47;30822:131;30948:4;30822:131;:::i;:::-;30814:139;;30541:419;;;:::o;30966:229::-;31106:34;31102:1;31094:6;31090:14;31083:58;31175:12;31170:2;31162:6;31158:15;31151:37;30966:229;:::o;31201:366::-;31343:3;31364:67;31428:2;31423:3;31364:67;:::i;:::-;31357:74;;31440:93;31529:3;31440:93;:::i;:::-;31558:2;31553:3;31549:12;31542:19;;31201:366;;;:::o;31573:419::-;31739:4;31777:2;31766:9;31762:18;31754:26;;31826:9;31820:4;31816:20;31812:1;31801:9;31797:17;31790:47;31854:131;31980:4;31854:131;:::i;:::-;31846:139;;31573:419;;;:::o;31998:180::-;32046:77;32043:1;32036:88;32143:4;32140:1;32133:15;32167:4;32164:1;32157:15;32184:233;32223:3;32246:24;32264:5;32246:24;:::i;:::-;32237:33;;32292:66;32285:5;32282:77;32279:103;;;32362:18;;:::i;:::-;32279:103;32409:1;32402:5;32398:13;32391:20;;32184:233;;;:::o;32423:234::-;32563:34;32559:1;32551:6;32547:14;32540:58;32632:17;32627:2;32619:6;32615:15;32608:42;32423:234;:::o;32663:366::-;32805:3;32826:67;32890:2;32885:3;32826:67;:::i;:::-;32819:74;;32902:93;32991:3;32902:93;:::i;:::-;33020:2;33015:3;33011:12;33004:19;;32663:366;;;:::o;33035:419::-;33201:4;33239:2;33228:9;33224:18;33216:26;;33288:9;33282:4;33278:20;33274:1;33263:9;33259:17;33252:47;33316:131;33442:4;33316:131;:::i;:::-;33308:139;;33035:419;;;:::o;33460:148::-;33562:11;33599:3;33584:18;;33460:148;;;;:::o;33614:377::-;33720:3;33748:39;33781:5;33748:39;:::i;:::-;33803:89;33885:6;33880:3;33803:89;:::i;:::-;33796:96;;33901:52;33946:6;33941:3;33934:4;33927:5;33923:16;33901:52;:::i;:::-;33978:6;33973:3;33969:16;33962:23;;33724:267;33614:377;;;;:::o;33997:435::-;34177:3;34199:95;34290:3;34281:6;34199:95;:::i;:::-;34192:102;;34311:95;34402:3;34393:6;34311:95;:::i;:::-;34304:102;;34423:3;34416:10;;33997:435;;;;;:::o;34438:225::-;34578:34;34574:1;34566:6;34562:14;34555:58;34647:8;34642:2;34634:6;34630:15;34623:33;34438:225;:::o;34669:366::-;34811:3;34832:67;34896:2;34891:3;34832:67;:::i;:::-;34825:74;;34908:93;34997:3;34908:93;:::i;:::-;35026:2;35021:3;35017:12;35010:19;;34669:366;;;:::o;35041:419::-;35207:4;35245:2;35234:9;35230:18;35222:26;;35294:9;35288:4;35284:20;35280:1;35269:9;35265:17;35258:47;35322:131;35448:4;35322:131;:::i;:::-;35314:139;;35041:419;;;:::o;35466:231::-;35606:34;35602:1;35594:6;35590:14;35583:58;35675:14;35670:2;35662:6;35658:15;35651:39;35466:231;:::o;35703:366::-;35845:3;35866:67;35930:2;35925:3;35866:67;:::i;:::-;35859:74;;35942:93;36031:3;35942:93;:::i;:::-;36060:2;36055:3;36051:12;36044:19;;35703:366;;;:::o;36075:419::-;36241:4;36279:2;36268:9;36264:18;36256:26;;36328:9;36322:4;36318:20;36314:1;36303:9;36299:17;36292:47;36356:131;36482:4;36356:131;:::i;:::-;36348:139;;36075:419;;;:::o;36500:228::-;36640:34;36636:1;36628:6;36624:14;36617:58;36709:11;36704:2;36696:6;36692:15;36685:36;36500:228;:::o;36734:366::-;36876:3;36897:67;36961:2;36956:3;36897:67;:::i;:::-;36890:74;;36973:93;37062:3;36973:93;:::i;:::-;37091:2;37086:3;37082:12;37075:19;;36734:366;;;:::o;37106:419::-;37272:4;37310:2;37299:9;37295:18;37287:26;;37359:9;37353:4;37349:20;37345:1;37334:9;37330:17;37323:47;37387:131;37513:4;37387:131;:::i;:::-;37379:139;;37106:419;;;:::o;37531:223::-;37671:34;37667:1;37659:6;37655:14;37648:58;37740:6;37735:2;37727:6;37723:15;37716:31;37531:223;:::o;37760:366::-;37902:3;37923:67;37987:2;37982:3;37923:67;:::i;:::-;37916:74;;37999:93;38088:3;37999:93;:::i;:::-;38117:2;38112:3;38108:12;38101:19;;37760:366;;;:::o;38132:419::-;38298:4;38336:2;38325:9;38321:18;38313:26;;38385:9;38379:4;38375:20;38371:1;38360:9;38356:17;38349:47;38413:131;38539:4;38413:131;:::i;:::-;38405:139;;38132:419;;;:::o;38557:191::-;38597:4;38617:20;38635:1;38617:20;:::i;:::-;38612:25;;38651:20;38669:1;38651:20;:::i;:::-;38646:25;;38690:1;38687;38684:8;38681:34;;;38695:18;;:::i;:::-;38681:34;38740:1;38737;38733:9;38725:17;;38557:191;;;;:::o;38754:305::-;38794:3;38813:20;38831:1;38813:20;:::i;:::-;38808:25;;38847:20;38865:1;38847:20;:::i;:::-;38842:25;;39001:1;38933:66;38929:74;38926:1;38923:81;38920:107;;;39007:18;;:::i;:::-;38920:107;39051:1;39048;39044:9;39037:16;;38754:305;;;;:::o;39065:173::-;39205:25;39201:1;39193:6;39189:14;39182:49;39065:173;:::o;39244:402::-;39404:3;39425:85;39507:2;39502:3;39425:85;:::i;:::-;39418:92;;39519:93;39608:3;39519:93;:::i;:::-;39637:2;39632:3;39628:12;39621:19;;39244:402;;;:::o;39652:167::-;39792:19;39788:1;39780:6;39776:14;39769:43;39652:167;:::o;39825:402::-;39985:3;40006:85;40088:2;40083:3;40006:85;:::i;:::-;39999:92;;40100:93;40189:3;40100:93;:::i;:::-;40218:2;40213:3;40209:12;40202:19;;39825:402;;;:::o;40233:967::-;40615:3;40637:148;40781:3;40637:148;:::i;:::-;40630:155;;40802:95;40893:3;40884:6;40802:95;:::i;:::-;40795:102;;40914:148;41058:3;40914:148;:::i;:::-;40907:155;;41079:95;41170:3;41161:6;41079:95;:::i;:::-;41072:102;;41191:3;41184:10;;40233:967;;;;;:::o;41206:182::-;41346:34;41342:1;41334:6;41330:14;41323:58;41206:182;:::o;41394:366::-;41536:3;41557:67;41621:2;41616:3;41557:67;:::i;:::-;41550:74;;41633:93;41722:3;41633:93;:::i;:::-;41751:2;41746:3;41742:12;41735:19;;41394:366;;;:::o;41766:419::-;41932:4;41970:2;41959:9;41955:18;41947:26;;42019:9;42013:4;42009:20;42005:1;41994:9;41990:17;41983:47;42047:131;42173:4;42047:131;:::i;:::-;42039:139;;41766:419;;;:::o;42191:178::-;42331:30;42327:1;42319:6;42315:14;42308:54;42191:178;:::o;42375:366::-;42517:3;42538:67;42602:2;42597:3;42538:67;:::i;:::-;42531:74;;42614:93;42703:3;42614:93;:::i;:::-;42732:2;42727:3;42723:12;42716:19;;42375:366;;;:::o;42747:419::-;42913:4;42951:2;42940:9;42936:18;42928:26;;43000:9;42994:4;42990:20;42986:1;42975:9;42971:17;42964:47;43028:131;43154:4;43028:131;:::i;:::-;43020:139;;42747:419;;;:::o;43172:175::-;43312:27;43308:1;43300:6;43296:14;43289:51;43172:175;:::o;43353:366::-;43495:3;43516:67;43580:2;43575:3;43516:67;:::i;:::-;43509:74;;43592:93;43681:3;43592:93;:::i;:::-;43710:2;43705:3;43701:12;43694:19;;43353:366;;;:::o;43725:419::-;43891:4;43929:2;43918:9;43914:18;43906:26;;43978:9;43972:4;43968:20;43964:1;43953:9;43949:17;43942:47;44006:131;44132:4;44006:131;:::i;:::-;43998:139;;43725:419;;;:::o;44150:237::-;44290:34;44286:1;44278:6;44274:14;44267:58;44359:20;44354:2;44346:6;44342:15;44335:45;44150:237;:::o;44393:366::-;44535:3;44556:67;44620:2;44615:3;44556:67;:::i;:::-;44549:74;;44632:93;44721:3;44632:93;:::i;:::-;44750:2;44745:3;44741:12;44734:19;;44393:366;;;:::o;44765:419::-;44931:4;44969:2;44958:9;44954:18;44946:26;;45018:9;45012:4;45008:20;45004:1;44993:9;44989:17;44982:47;45046:131;45172:4;45046:131;:::i;:::-;45038:139;;44765:419;;;:::o;45190:180::-;45238:77;45235:1;45228:88;45335:4;45332:1;45325:15;45359:4;45356:1;45349:15;45376:185;45416:1;45433:20;45451:1;45433:20;:::i;:::-;45428:25;;45467:20;45485:1;45467:20;:::i;:::-;45462:25;;45506:1;45496:35;;45511:18;;:::i;:::-;45496:35;45553:1;45550;45546:9;45541:14;;45376:185;;;;:::o;45567:176::-;45599:1;45616:20;45634:1;45616:20;:::i;:::-;45611:25;;45650:20;45668:1;45650:20;:::i;:::-;45645:25;;45689:1;45679:35;;45694:18;;:::i;:::-;45679:35;45735:1;45732;45728:9;45723:14;;45567:176;;;;:::o;45749:348::-;45789:7;45812:20;45830:1;45812:20;:::i;:::-;45807:25;;45846:20;45864:1;45846:20;:::i;:::-;45841:25;;46034:1;45966:66;45962:74;45959:1;45956:81;45951:1;45944:9;45937:17;45933:105;45930:131;;;46041:18;;:::i;:::-;45930:131;46089:1;46086;46082:9;46071:20;;45749:348;;;;:::o;46103:171::-;46142:3;46165:24;46183:5;46165:24;:::i;:::-;46156:33;;46211:4;46204:5;46201:15;46198:41;;;46219:18;;:::i;:::-;46198:41;46266:1;46259:5;46255:13;46248:20;;46103:171;;;:::o;46280:182::-;46420:34;46416:1;46408:6;46404:14;46397:58;46280:182;:::o;46468:366::-;46610:3;46631:67;46695:2;46690:3;46631:67;:::i;:::-;46624:74;;46707:93;46796:3;46707:93;:::i;:::-;46825:2;46820:3;46816:12;46809:19;;46468:366;;;:::o;46840:419::-;47006:4;47044:2;47033:9;47029:18;47021:26;;47093:9;47087:4;47083:20;47079:1;47068:9;47064:17;47057:47;47121:131;47247:4;47121:131;:::i;:::-;47113:139;;46840:419;;;:::o;47265:98::-;47316:6;47350:5;47344:12;47334:22;;47265:98;;;:::o;47369:168::-;47452:11;47486:6;47481:3;47474:19;47526:4;47521:3;47517:14;47502:29;;47369:168;;;;:::o;47543:360::-;47629:3;47657:38;47689:5;47657:38;:::i;:::-;47711:70;47774:6;47769:3;47711:70;:::i;:::-;47704:77;;47790:52;47835:6;47830:3;47823:4;47816:5;47812:16;47790:52;:::i;:::-;47867:29;47889:6;47867:29;:::i;:::-;47862:3;47858:39;47851:46;;47633:270;47543:360;;;;:::o;47909:640::-;48104:4;48142:3;48131:9;48127:19;48119:27;;48156:71;48224:1;48213:9;48209:17;48200:6;48156:71;:::i;:::-;48237:72;48305:2;48294:9;48290:18;48281:6;48237:72;:::i;:::-;48319;48387:2;48376:9;48372:18;48363:6;48319:72;:::i;:::-;48438:9;48432:4;48428:20;48423:2;48412:9;48408:18;48401:48;48466:76;48537:4;48528:6;48466:76;:::i;:::-;48458:84;;47909:640;;;;;;;:::o;48555:141::-;48611:5;48642:6;48636:13;48627:22;;48658:32;48684:5;48658:32;:::i;:::-;48555:141;;;;:::o;48702:349::-;48771:6;48820:2;48808:9;48799:7;48795:23;48791:32;48788:119;;;48826:79;;:::i;:::-;48788:119;48946:1;48971:63;49026:7;49017:6;49006:9;49002:22;48971:63;:::i;:::-;48961:73;;48917:127;48702:349;;;;:::o;49057:180::-;49105:77;49102:1;49095:88;49202:4;49199:1;49192:15;49226:4;49223:1;49216:15

Swarm Source

ipfs://63b095122ded6ec8424b3f4313a0ead25550a1bdcc19925b557e06796097b138
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.