ETH Price: $3,296.65 (-3.38%)
Gas: 21 Gwei

Token

ImmortalMonks (MONKS)
 

Overview

Max Total Supply

2,500 MONKS

Holders

959

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
200 MONKS
0x402eab3dc2ef532c9e8794318a39e1a3ef608511
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:
ImmortalMonks

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

/**************************************
╦╔╦╗╔╦╗╔═╗╦═╗╔╦╗╔═╗╦    ╔╦╗╔═╗╔╗╔╦╔═╔═╗
║║║║║║║║ ║╠╦╝ ║ ╠═╣║    ║║║║ ║║║║╠╩╗╚═╗
╩╩ ╩╩ ╩╚═╝╩╚═ ╩ ╩ ╩╩═╝  ╩ ╩╚═╝╝╚╝╩ ╩╚═╝
**************************************/

// Powered by NFT Artisans (nftartisans.io) - [email protected]
// Sources flattened with hardhat v2.7.1 https://hardhat.org
// SPDX-License-Identifier: MIT


// File @openzeppelin/contracts/utils/introspection/[email protected]

// 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 @openzeppelin/contracts/token/ERC721/[email protected]

// 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 @openzeppelin/contracts/token/ERC721/[email protected]

// 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 @openzeppelin/contracts/token/ERC721/extensions/[email protected]

// 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 @openzeppelin/contracts/utils/[email protected]

// 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 @openzeppelin/contracts/utils/[email protected]

// 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 @openzeppelin/contracts/utils/[email protected]

// 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 @openzeppelin/contracts/utils/introspection/[email protected]

// 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 @openzeppelin/contracts/token/ERC721/[email protected]

// 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 @openzeppelin/contracts/token/ERC721/extensions/[email protected]

// 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 @openzeppelin/contracts/token/ERC721/extensions/[email protected]

// 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 @openzeppelin/contracts/access/[email protected]

// 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/ImmortalMonks.sol

pragma solidity ^0.8.4;


contract ImmortalMonks is ERC721Enumerable, Ownable {

    // project settings
    uint256 public ethPrice = 250000000000000000; // 0.25 ETH
    uint256 public ethPricePresale = 220000000000000000; // 0.22 ETH

    bool public isActive = false;
    bool public isActivePresale = false;
    bool public hasReserved = false;
    uint8 public maxReserved = 50;
    uint8 public maxSell = 2;
    uint8 public maxSellPresale = 2;
    uint16 public maxSupply = 2500;
    uint16 public maxSupplyPresale = 1554;

    // withdraw addresses
    address private _t1; // 90%
    address private _t2; // 5%
    address private _t3; // 5%

    // presale whitelist
    mapping (address => bool) private _presaleWhitelist;

    string private _baseURIPath;

    event Reserved();

    constructor(address t1_, address t2_, address t3_) ERC721("ImmortalMonks", "MONKS") {
        _t1 = t1_;
        _t2 = t2_;
        _t3 = t3_;

        _setupPresaleWhitelist();
    }

    // Add a single address to the presale whitelist
    function addWhitelistAddress(address whitelistAddress) external onlyOwner {
        _presaleWhitelist[whitelistAddress] = true;
    }

    // Add addresses in bulk to the presale whitelist
    function addWhitelistBulk(address[] memory addresses) external onlyOwner {
        for(uint i; i < addresses.length; i++) {
            _presaleWhitelist[addresses[i]] = true;
        }
    }

    // Mint tokens
    function mintTokens(uint numberOfTokens) external payable {
        require(isActive, "Sale is not active");
        require(numberOfTokens <= maxSell, "Exceeds max number of Tokens in one transaction");
        require(totalSupply() + numberOfTokens <= maxSupply, "Purchase would exceed max supply");
        require(ethPrice * numberOfTokens == msg.value, "Ether value sent is not correct");

        uint mintIndex;
        for (uint i; i < numberOfTokens; i++) {
            mintIndex = totalSupply();
            if (totalSupply() < maxSupply) {
                _safeMint(_msgSender(), mintIndex);
            }
        }
    }

    // Mint tokens during pre-sale, must be on whitelist
    function mintTokensPresale(uint numberOfTokens) external payable {
        require(isActivePresale, "Presale is not active");
        require(_presaleWhitelist[msg.sender] == true, "Address is not whitelisted");
        require(balanceOf(msg.sender) + numberOfTokens <= maxSellPresale, "Exceeds max number of presale Tokens for address");
        require(totalSupply() + numberOfTokens <= maxSupplyPresale, "Purchase would exceed max presale supply");
        require(ethPricePresale * numberOfTokens == msg.value, "Ether value sent is not correct");

        uint mintIndex;
        for (uint i; i < numberOfTokens; i++) {
            mintIndex = totalSupply();
            if (totalSupply() < maxSupply) {
                _safeMint(_msgSender(), mintIndex);
            }
        }
    }

    // Remove a single address to the presale whitelist
    function removeWhitelistAddress(address whitelistAddress) external onlyOwner {
        _presaleWhitelist[whitelistAddress] = false;
    }

    // Reserve tokens for promotions
    function reserveTokens() external onlyOwner onReserve {
        uint supply = totalSupply();
        for (uint i; i < maxReserved; i++) {
            _safeMint(_msgSender(), supply + i);
        }
    }

    // Sets the base URI for the metadata
    function setBaseURI(string memory baseURI) external onlyOwner {
        _baseURIPath = baseURI;
    }

    // Just in case we have to change the max sell after deployment
    function setMaxSell(uint8 amount) external onlyOwner {
        maxSell = amount;
    }

    // Just in case we have to change the max sell for presales after deployment
    function setMaxSellPresale(uint8 amount) external onlyOwner {
        maxSellPresale = amount;
    }

    // Just in we have to change the address after deployment
    function setT1(address t1_) external onlyOwner {
        _t1 = t1_;
    }

    // Just in we have to change the address after deployment
    function setT2(address t2_) external onlyOwner {
        _t2 = t2_;
    }

    // Just in we have to change the address after deployment
    function setT3(address t3_) external onlyOwner {
        _t3 = t3_;
    }

    // Turn presale mode on/off
    function togglePreSaleState() external onlyOwner {
        isActivePresale = !isActivePresale;
    }

    // Turn live sale mode on/off
    function toggleSaleState() external onlyOwner {
        isActive = !isActive;
    }

    // Withdraw ETH from contract 90% to founders, 10% to dev
    function withdraw() external onlyOwner {
        uint256 _share = address(this).balance / 20;
        Address.sendValue(payable(_t1), _share * 18);
        Address.sendValue(payable(_t2), _share);
        Address.sendValue(payable(_t3), _share);
    }

    // Override the default baseURI path
    function _baseURI() internal view override returns (string memory) {
        return _baseURIPath;
    }

    // Include presale whitelist during deployment to save on gas costs
    function _setupPresaleWhitelist() internal {
        _presaleWhitelist[0x718D3cFB318f1dCCc55Fd63208d94830F9F1f97B] = true;
        _presaleWhitelist[0x0E3477186f120a185B79a21cc16cfC88651E8e9E] = true;
        _presaleWhitelist[0x8257aD6E227F4c0409C8a33E8ef546D41B9C9101] = true;
        _presaleWhitelist[0x4333273f2C7596D0bcD0caa00c1F734462C17778] = true;
        _presaleWhitelist[0xd15AfBCE982d2B7611668E4539B7fe30E8bAB1E6] = true;
        _presaleWhitelist[0xF241d82e31d54fa4f6c286eFa69c83BB9F0cbd5E] = true;
        _presaleWhitelist[0x19777288ec02D4d1D2C18B0369eE98A7512FE54A] = true;
        _presaleWhitelist[0xE0DA98D99eD92876c59b0DE3f0c36D405D421178] = true;
        _presaleWhitelist[0x8BC2744a7889C52F3d33D335Bb52E6F4830a988A] = true;
        _presaleWhitelist[0xeC2Ca6d3C3687EbD6E71C6A4a3dDf642Dbb8F453] = true;
        _presaleWhitelist[0xa17095432e6edA759ED9224037FeDA656a0E0256] = true;
        _presaleWhitelist[0x382bd2414d474137dd9Ee5d242c373E2675378ca] = true;
        _presaleWhitelist[0x0A6495c50196e8d728FC1610097A88f1D21FE923] = true;
        _presaleWhitelist[0x8158C89cC0Cd679c9035113e608f841d11BCd602] = true;
        _presaleWhitelist[0xBa2aeEdCA9eC9B9fD36d66723b5bBF41a2E31797] = true;
        _presaleWhitelist[0x87dbf13c9D6ffe57ffaEeBDfe4442993A5E5B619] = true;
        _presaleWhitelist[0x7c74dA0e22de8A7a8f8F04b1b11935c231FFd246] = true;
        _presaleWhitelist[0xB16c964095e7A59688f3f8471387D735b0F15584] = true;
        _presaleWhitelist[0xf81ca0c17423Ef1E918DaEE6035EEabb99401a89] = true;
        _presaleWhitelist[0x33e1DdE8Cc60E926fBf9605316ad23B1F2cde010] = true;
        _presaleWhitelist[0x1C85e528c06b06f49B3B3e6c5B10c160b84CC38e] = true;
        _presaleWhitelist[0x0CC5CB75c6759fF352D68577a628cBa98c4D20D0] = true;
        _presaleWhitelist[0xc2f4d768320eB6BedeF4fDf5DEe69b11E1A8F897] = true;
        _presaleWhitelist[0xDc53E34Ec757f7D3fb497cda91d0335c83ddAfb6] = true;
        _presaleWhitelist[0x853d89487352aa249E0580F8f82BeEa2E20b33b7] = true;
        _presaleWhitelist[0xCF7B02B17f4e9fBfFe122Afb10086Bf3CD5bae52] = true;
        _presaleWhitelist[0x996Aa4234081941cAb097D9b51cBD4197Aa87B4e] = true;
        _presaleWhitelist[0xcfb83F44646d02eBeb4639c87855a4280c1FC9bE] = true;
        _presaleWhitelist[0xcaA3A3573c42d587eBAa2E01b392507c70BfF2eE] = true;
        _presaleWhitelist[0x7265f2569E700Fccd5181263DFb5b94a3d449cc4] = true;
        _presaleWhitelist[0x597c12bb2D98e1b1Deb2775b55E23D984E9d8A75] = true;
        _presaleWhitelist[0x83B8e2EdA472A56De448C0964447Ca26a50DceD2] = true;
        _presaleWhitelist[0x131bB2F1bdaBCb08d37F33d5F40cd080aa3Ad5a8] = true;
        _presaleWhitelist[0xd3BaaaB871570C1f6C68eE027F2c7a9124f9DBbA] = true;
        _presaleWhitelist[0xC999E869B0C0ce72A705d5078B33155E67ceEc7F] = true;
        _presaleWhitelist[0x255510F0f3Ab227ee1a372738eaBFf50E52D0Af7] = true;
        _presaleWhitelist[0x81343aAc89e762cDE6Af45DfF78204811DFBE3FC] = true;
        _presaleWhitelist[0x26cC8a52748Ce934226599F52Ca7b03F90151CA1] = true;
        _presaleWhitelist[0xEff13d78Ec1093fe52Ec816ad8a9b1a08619EB46] = true;
        _presaleWhitelist[0xb6B2D07b830395A70BDAA5a67f5CFf5ed9C8BE0d] = true;
        _presaleWhitelist[0x002cfCe7088B9711D1df63E48EBc99C3c1b03C3D] = true;
        _presaleWhitelist[0xbf338Bdffc3142Aa2298b3343D6B11718e29B40b] = true;
        _presaleWhitelist[0xa6476d6655b0854eCE5909C0cb9240C304314464] = true;
        _presaleWhitelist[0xf89237d7465985ceA2f9036BF61637A27Bd899f7] = true;
        _presaleWhitelist[0x5DE02c8924922b756a79a9E69a7B2E644f0c4a3a] = true;
        _presaleWhitelist[0xF0d327f6be6123AD03C89A97C16753dd3635Ff14] = true;
        _presaleWhitelist[0x39D21b8B349328aCeD3EbBa434667f8aBb47c773] = true;
        _presaleWhitelist[0x81FE6EfeB62528b943eCF2dA47C55b48D218eA6b] = true;
        _presaleWhitelist[0x4C0269BB380aBc30345D19e7b03FDb98a0442891] = true;
        _presaleWhitelist[0x0C66665ABb84246F759576D5C2Bfd30e89416004] = true;
        _presaleWhitelist[0x6168b8fb98c5A8E5b9C7A7647673Bc3b4db708f0] = true;
        _presaleWhitelist[0xc9F737034D796cbc3a45744e83dB7b33c3ac9bef] = true;
        _presaleWhitelist[0xE3fC951776e7E607521cE0dCf46fB13FC8eCf582] = true;
        _presaleWhitelist[0x98c2EC93931C32AA1Bb6aFC6128d65B5706B26B8] = true;
        _presaleWhitelist[0x4d63edB5ac1B077Bb0bF48777D2eBb36b56F2577] = true;
        _presaleWhitelist[0x1F2e63669C55DFEC4cE1Fb94eC449080a7102298] = true;
        _presaleWhitelist[0x5821A1b92940A25A123852946DE51b600E69E34F] = true;
        _presaleWhitelist[0x429a7409499aE86dF47F5304E205cA35B8c49320] = true;
        _presaleWhitelist[0xBba16ffA7AB34837022c11f4435d9D6E90990b14] = true;
        _presaleWhitelist[0xED8F2fcef40f1f78B34c70eC00ffaf927fEBD077] = true;
        _presaleWhitelist[0x5f8955f2BaF74310cc140775E7DAFFa05921076A] = true;
        _presaleWhitelist[0xA82FbAEbCe44e7642C4E376C8e77425ae5b6634D] = true;
        _presaleWhitelist[0xa2c78F4802e83b47b634b5Dcbc2cC4CDd5B71D56] = true;
        _presaleWhitelist[0x0d55c4F3CCcd145b42753eDc89b6dc98b69a088C] = true;
        _presaleWhitelist[0xADe1BabbFA178812F85d3Be9Bb4EFaA92B77AbBc] = true;
        _presaleWhitelist[0xfbF546040Ee71dcC5FE30c046976592eb20B1325] = true;
        _presaleWhitelist[0xf3923bEC7cD34e05494e77F7Ed6c82e2daEd11C7] = true;
        _presaleWhitelist[0xe7cb8F61A3F4a833347FDAa59255f26916516045] = true;
        _presaleWhitelist[0xb77049081E26846A8f5D43Eb810898a5574Bdb9C] = true;
        _presaleWhitelist[0x7A91ee9A535bEd9Ba1bB3722C54D7918018Fa8Ab] = true;
        _presaleWhitelist[0x5a12f6F6b7fb16bfB9Eb0c14F7cbA531465d2998] = true;
        _presaleWhitelist[0x6c74955B3Af33EC42b00676A0dD0F2962fcF258c] = true;
        _presaleWhitelist[0x680119ee5A4983b15932c0a2785ec727Cc3ccDA2] = true;
        _presaleWhitelist[0x2c652d6A2fA74709Ca925c2c53c3a85fe6556e18] = true;
        _presaleWhitelist[0x42BA75BC5259DC25dD89bA6D3F14E01134880308] = true;
        _presaleWhitelist[0x53768Af818be06f9ef58B78f2Fcad795Ad433F1D] = true;
        _presaleWhitelist[0x77F0a25935bf47c5ce771Ad0f0AA2AB8f07fe104] = true;
        _presaleWhitelist[0xe135C4b13a26b52954df2F8813a363617C57Efa4] = true;
        _presaleWhitelist[0x533D5B4A84795Ec5edA37f73b198e6e77495dE59] = true;
        _presaleWhitelist[0xB02519588F3982b6A3EB5bcb2692C3eb379F2048] = true;
        _presaleWhitelist[0xAA7225Fc586D2B9041Fa1AD906C91e4909805865] = true;
        _presaleWhitelist[0x2D9db0402A3F26fe13751427541bF701131aa6AC] = true;
        _presaleWhitelist[0x738726AC023b3f559D822Ef13E4f91b8AF18EB39] = true;
        _presaleWhitelist[0x41457FD8F460768C0AbE1E236A265AE0A9C41091] = true;
        _presaleWhitelist[0xe14945a03194Cb58F72eb04809f99dD829f27AE1] = true;
        _presaleWhitelist[0xC91f408C580E2bC75b281Dfc452E1763a905ccA2] = true;
        _presaleWhitelist[0xBA534dd699A6908d6ED1D114b03e43554ACf7b96] = true;
        _presaleWhitelist[0x85b0F9498ed437f412C58dfE017d64fFc2694e6d] = true;
        _presaleWhitelist[0x477DfA5966fD4dDc3f3675862f19b071DA021ed6] = true;
        _presaleWhitelist[0xb045458c8bc244D67dc40f07e2c75A22dc403F4b] = true;
        _presaleWhitelist[0xD8DC72De813AbE60096dfEC14c05AC2cd3D4B801] = true;
        _presaleWhitelist[0x2A5CD5Fd05bFA8b4AdFD4e1315F37753D71a5c69] = true;
        _presaleWhitelist[0x80b3A22a4be1a582580b34B7E600D2cb3aa28452] = true;
        _presaleWhitelist[0xce7395C9C048065088D230E78C6d32c4D53e2b36] = true;
        _presaleWhitelist[0x8402818700bEb9E92947c632b8a214B56Ed5a6d9] = true;
        _presaleWhitelist[0x86F93A1C78277B55Ca1dF92f272B74485B208C98] = true;
        _presaleWhitelist[0xf4Ac8Fe9AD731d111B2318b8233b1c4fCEE272b5] = true;
        _presaleWhitelist[0x35d1dDF0Eb6d265052Da00D5E6ADee446fF9dCE7] = true;
        _presaleWhitelist[0xF1C584aa328408185a6670C1949975E8436cD95a] = true;
        _presaleWhitelist[0xcAbe239E2B998f9F1747C83895a48Cc99a7746b7] = true;
        _presaleWhitelist[0x7c31925b73FDC165faB89396E54084dDADFCab39] = true;
        _presaleWhitelist[0xD8A510a5eC59fDb52F0C6c052Af6E669c4577852] = true;
        _presaleWhitelist[0x069cA681Fb96d10c7F25e56B9902d255a576b61f] = true;
        _presaleWhitelist[0xf65d5dC340545EB426DA011F219B2Cf517904c9E] = true;
        _presaleWhitelist[0x090a89b6ef2265eCDEe6266F34c4571fB1bF9138] = true;
        _presaleWhitelist[0x30f97245663B7a31EC3FDb23C3b368B4941AfaF4] = true;
        _presaleWhitelist[0xe6dA1D19FdCEc179bA9755F2C6139f8FFEcbfeB0] = true;
        _presaleWhitelist[0x17917ba68adF72977023Fb97f133Bf8B96424998] = true;
        _presaleWhitelist[0xB21f8EB437065542E75fb71a52a573DF0E9097ba] = true;
        _presaleWhitelist[0xa6578b79A27aCF29f3C20da21Eef9b75226812C9] = true;
        _presaleWhitelist[0x4E68Fb65f76bE2C5afe9AE50afB953843BdcbFd0] = true;
        _presaleWhitelist[0xF7827701D4C1E5AE6B7741328Df34A43F7e5eDF2] = true;
        _presaleWhitelist[0xe9A506466024C8b4b27B0e675DF78d86F98cF0E2] = true;
        _presaleWhitelist[0xfbA934f80bEd2c974B0Bb8d946b8d270F774a4b6] = true;
        _presaleWhitelist[0xe0A051886A77f47150b2378333C7d58F20225b78] = true;
        _presaleWhitelist[0xFf1B4990136303f3772799091e52Cbdfb9ab8E4D] = true;
        _presaleWhitelist[0x1d4604430e54f5E07846320d8B189be1572047cB] = true;
        _presaleWhitelist[0x1ADca51D058569BfCcD0F5C5fb2Dc351307b3FF3] = true;
        _presaleWhitelist[0x103b8FbdF3284CbF5B202624493E66a336511c39] = true;
        _presaleWhitelist[0x341325d6E5B929e646C5080Dc4Ee2b27C684d59B] = true;
        _presaleWhitelist[0xFF29a3FDFEC02c288308198Eb3990479f7135cD0] = true;
        _presaleWhitelist[0xEa01645ec3501A553c2E9E04d5Ae8d247aF7b058] = true;
        _presaleWhitelist[0x4Ab8D60880B80AF2580aE1B0CfDe949f98586FF5] = true;
        _presaleWhitelist[0x475a289877cbcdB92E4768309827FD238BB3fc0f] = true;
        _presaleWhitelist[0x273D81611981363e916Fb7B458833b45125383aD] = true;
        _presaleWhitelist[0x667D260E1ADEafF17e548C0ab8C0aC49c6222333] = true;
        _presaleWhitelist[0xCD390Eb31886bF06ec5C94ca0cDeb8C56bA128d1] = true;
        _presaleWhitelist[0xB3BbD2e85bE786B59cfc4EB787EcFa8728a7e49b] = true;
        _presaleWhitelist[0x8308A17925da4023309De6Bd4460654eDB7DD480] = true;
        _presaleWhitelist[0x7E3201d358edB91925d8e6e7F4415Cb7c50686df] = true;
        _presaleWhitelist[0x0Be57780ba56c29601E26549AAEd584E5ACc78A0] = true;
        _presaleWhitelist[0x12C0d019683770883A35C3598B6F993a691Be15C] = true;
        _presaleWhitelist[0x75539c237B1D2154B3Ec7a4433ACD8dF6f4aaB29] = true;
        _presaleWhitelist[0xD14D8D43949b7BF9862d591dD81640682b290167] = true;
        _presaleWhitelist[0xFd2c6F0Baca2E3319FD3fEbab4d726c46803B79e] = true;
        _presaleWhitelist[0xC2239Bc0e6a001437Aa9207a7717bA7A0cD65B5a] = true;
        _presaleWhitelist[0xbbd5D9BFec105378043E9Ce54DE6650194De50e1] = true;
        _presaleWhitelist[0x20c9f7140794B0578fE569E99e14a3710e91D9b7] = true;
        _presaleWhitelist[0x444D371eBc8dEAC789D9c001f9744B02c9d70e68] = true;
        _presaleWhitelist[0x487B54bBEcbCe2C0222B49c3bE292642855D5Bf3] = true;
        _presaleWhitelist[0xDFB6f86A41c87020bC19A0FAA790F6B8fDEb560b] = true;
        _presaleWhitelist[0x6Bd819c0AE4Ef0Bc7579d49E06E6f10F745D813d] = true;
        _presaleWhitelist[0xDBa1C8cc0Bf243d80B265A4127384E40A0901aAB] = true;
        _presaleWhitelist[0x0bf03623783FCc3e0a5110e7Dd881Cdba7213e46] = true;
        _presaleWhitelist[0x40AE3c21738fDCE23E4Adec87372935A375370b6] = true;
        _presaleWhitelist[0x2eA84c5bcDe9fE6e4cB76C25dEE2F1664CfBAB1B] = true;
        _presaleWhitelist[0x4C6382c22F1622bc41B634C5d3ba5a266E1332Bc] = true;
        _presaleWhitelist[0xBA78031376a6264B6452145b19461065BfbE8876] = true;
        _presaleWhitelist[0xEE3dEa4E526784eAD93fD50bC63e11e1be5934B7] = true;
        _presaleWhitelist[0x674860E9F965c4D22a48eE0F57587DE319637e46] = true;
        _presaleWhitelist[0xEE80F8B2A1b089053f83040C474EDBce19085246] = true;
        _presaleWhitelist[0xaf22998910cC0D6c50d4234CCC5e17a96ada4F2B] = true;
        _presaleWhitelist[0x3601a2B2f085Fa489599bd5fC2bbcB39581f2122] = true;
        _presaleWhitelist[0xE48c1010b538932D2F65F14811C05945A4aa193F] = true;
        _presaleWhitelist[0xcdbae7B74c7A9399372576c7ffC495d3124623D2] = true;
        _presaleWhitelist[0x330AA0a042347313B68Be4CB629323488CF19D20] = true;
        _presaleWhitelist[0x92f5bF5c0808182D37DbcF4E0B81AC5BA79fa972] = true;
        _presaleWhitelist[0x6F2971734927D9731ED19c964e11C7730a30C9cf] = true;
        _presaleWhitelist[0xcEF36627931fC1C16e39Fb42308c3245a18dC597] = true;
        _presaleWhitelist[0xC3d080A08c2fc57a5248DC9865DB775eD492Ec6c] = true;
        _presaleWhitelist[0x4F25A32bF24990D43374539c82C70AcdEe0DC924] = true;
        _presaleWhitelist[0xC2c753418f3c06cE2fb071DDC41CEC1Bc392cD7C] = true;
        _presaleWhitelist[0x8f7DBc40AD189023DfB9669dA81c183bC39799eb] = true;
        _presaleWhitelist[0x8bC065E0Cf4a63c3AcBB446C9884413ea3BAFb22] = true;
        _presaleWhitelist[0x17c44CC31C205a47C7A02De56422b817269fD115] = true;
        _presaleWhitelist[0x8F1DD05e4Ce1D175ae5e84c6AD0E73B590ba23F9] = true;
        _presaleWhitelist[0xb5aF7e70f0B307D07D6546eb046a0790E305BB56] = true;
        _presaleWhitelist[0xeA9fc77F8Fbb5F24ac4247d44cf978B6c3600DbD] = true;
        _presaleWhitelist[0x429a40569087d42C506335Ef39D0786d306A8021] = true;
        _presaleWhitelist[0x04C4C2AC22dbE1451684d5CEc50d672279B9Cdb1] = true;
        _presaleWhitelist[0x53CbcDD4aa85ce2303ce4109adf494ABdf3D46fD] = true;
        _presaleWhitelist[0x1cC6929926959B6Ee44ae50FBA125E30Bb95537B] = true;
        _presaleWhitelist[0x74C002c4Edee654f81F0F6B18E3425ee56eCfd12] = true;
        _presaleWhitelist[0x877932B0D29dEbaa7E90Dc41d5AA862239FDb284] = true;
        _presaleWhitelist[0x695e1FC091309e66C1EeEeE955aFE573564E6Ed0] = true;
        _presaleWhitelist[0x3896F3fd5Ccf2faBAd94E8BB73951e289742536F] = true;
        _presaleWhitelist[0x28A85E00575CC9Fc6F4F5cDf2e54A971Bbc4A978] = true;
        _presaleWhitelist[0x05A83721E016B9dD6742A96eC8d68c26b040Fb08] = true;
        _presaleWhitelist[0x10824D1c2fCE4632af7fbA886a6903fb1D4CEdcF] = true;
        _presaleWhitelist[0x37A4dE30A6Afc28ba547271A9A588bc05AE8566c] = true;
        _presaleWhitelist[0x90E90f12486cAe24a4E891Aaf9C336269aABA7EB] = true;
        _presaleWhitelist[0x5E47a44D1c2ea6c1024F495CDcc55B05aA82E349] = true;
        _presaleWhitelist[0x19E5B153Face9EEefC09de57D22CC817e4Af6b2c] = true;
        _presaleWhitelist[0x3e8289CD7a49B8E59Ed9b4bFFc958Ab85c1D637c] = true;
        _presaleWhitelist[0x012f4881D429d59F8917e2908773eCBd6E570D2F] = true;
        _presaleWhitelist[0x02C05D1625B7460Afd2C9e063c5fD40B122393a8] = true;
        _presaleWhitelist[0xec62B648c214B130ebA5ABd54C2Ee88984b39083] = true;
        _presaleWhitelist[0x82400eA848CA71A7dc491e33496E3f2b3509b947] = true;
        _presaleWhitelist[0x1159DBC66C3b6F7742f8e951656a830631dFe69B] = true;
        _presaleWhitelist[0xf45a877A7A3A1aa82fe2313080728cC3DA90cF16] = true;
        _presaleWhitelist[0x87302A99d1Bbb367E95ad9da9265feafe57b95a4] = true;
        _presaleWhitelist[0x8f3E5f24293DAcc1EcA931811B4fccc30a70d26F] = true;
        _presaleWhitelist[0x2EdB8bfb8cACA74ddcF0a1914864a8E37BD4b000] = true;
        _presaleWhitelist[0x563d6b022FcA35bE0eeFDD9Df57D31e743ae5a42] = true;
        _presaleWhitelist[0x469B86b8992b2d4db8D7C74033991a2c75d6454e] = true;
        _presaleWhitelist[0xBCF0C6870018C889726AfA2B3a0c0eaB03381Bf1] = true;
        _presaleWhitelist[0x4f86e6A54881083028E38cC1cF48e08A47e576d7] = true;
        _presaleWhitelist[0x21a692edaD23512386bc7664C5B20A175Aa39811] = true;
        _presaleWhitelist[0x3379aEc4aEC5f88f6B239aaBAe542516D3d113E6] = true;
        _presaleWhitelist[0xE633D5b2Ae8928d43D258E8c131583E6232B0dfc] = true;
        _presaleWhitelist[0x2F5b62B1fC025Ac53690d339064eBC01b4a1F138] = true;
        _presaleWhitelist[0x538E7b26473a50a250E4B61c1062adBaf6cf474D] = true;
        _presaleWhitelist[0xe4E68F43704263caf50808714DA38b079809D49A] = true;
        _presaleWhitelist[0x2B4AbB161D69c0BD3C54B48ad8A5403B52480A44] = true;
        _presaleWhitelist[0x3d87eB98b84630FAE7CD663D1Ee1e8bf05b999A2] = true;
        _presaleWhitelist[0x9c9eC8bDBC3642ad28b1320D31A656D258E27618] = true;
        _presaleWhitelist[0x54E82b511F2f2B111b67788f11F7179969013BaF] = true;
        _presaleWhitelist[0x07852203b89088F3Fe360f8621Ec7d835E950cBe] = true;
        _presaleWhitelist[0xF69189af9A2eB9bE094BEc32D5aEA8E330f24900] = true;
        _presaleWhitelist[0x7d4c5964e07c7d85D73dcbf4547Eec9bAe58Ae02] = true;
        _presaleWhitelist[0xAf72D4494C7e72dab807fBDf369291cE34C93872] = true;
        _presaleWhitelist[0x1AAbC85Dc99Eba0C833ADbAb22de3ef4da5f60C5] = true;
        _presaleWhitelist[0xe848812f5192D9FFb49fbd1E5c4eeFc26d0A5Bc1] = true;
        _presaleWhitelist[0x2aF225b3D7D102B81A3BCa7e43B8Cd1b1eAEd1A9] = true;
        _presaleWhitelist[0x8F89DFaB75EA709aC704389c36228FCCfaE37EF8] = true;
        _presaleWhitelist[0x37c9eD3b53adD2c4186FFcC61DD7d7B9C4F6a8e3] = true;
        _presaleWhitelist[0x7b3040879F1E1b987f33E1D7449C4BFeeF083cC5] = true;
        _presaleWhitelist[0x85C1047737D91E3e84320d5e6228DDdB1fd61D80] = true;
        _presaleWhitelist[0x35DF56164944bB3C2DF2ef8453Ae394E8DEF9F25] = true;
        _presaleWhitelist[0x7ed018F10294EbA79a47f8C65C0F6380299f40B4] = true;
        _presaleWhitelist[0x0F717344c35f1ACc2795344583db5A006E08C88b] = true;
        _presaleWhitelist[0x7817E0F3877b86371F80746fE2Ef186dF1807e4c] = true;
        _presaleWhitelist[0xFE2378F2EB684D609175D5c9E94F7f8f7a5d6DBA] = true;
        _presaleWhitelist[0x3E9Dd7801a609Eb1DC2DD5faA8af8E23598E15Ba] = true;
        _presaleWhitelist[0x369b3595273dde3A7a4064BbA4Afe3ad0DfD9983] = true;
        _presaleWhitelist[0x0479886A0335F96df5A9eC164Dc4cC621c2b119f] = true;
        _presaleWhitelist[0x3053eCb8B6C14c307FCf49728B299cb8367fc226] = true;
        _presaleWhitelist[0xC18dfCB1C5b8E4A626B406685B8a56Db3aEa5C64] = true;
        _presaleWhitelist[0x3Ecc7e334BBCF13A72060145Cadd4c5Af6941Ca9] = true;
        _presaleWhitelist[0xE540B924E809cBFdaEb4C70b0589FA0622C4057b] = true;
        _presaleWhitelist[0x247bE5421cc8Aab9207e607Fea6ed6699a44ACfF] = true;
        _presaleWhitelist[0x1Cca3C96783cA665450eB4Fe7ccE5D8D0962E10e] = true;
        _presaleWhitelist[0x1c8AfD8500CaE37aEF9A1bB71d6E1Fea2331Ed36] = true;
        _presaleWhitelist[0x445fdA5D695e26938E4d6059e0A25b6f6D234E33] = true;
        _presaleWhitelist[0x47829e099FE2c07262BaA3E7b039876086F4A9D8] = true;
        _presaleWhitelist[0x3AE42cDdE0aA6889049eb67ceBF56b6fcfFE24f9] = true;
        _presaleWhitelist[0x634Cc4e2F0bE96b2642EfD10FC0E750FDFaa28d9] = true;
        _presaleWhitelist[0xAD2B8E18CC7BDDDe1Fe7e254D78ABF1188b6C8f4] = true;
        _presaleWhitelist[0x20148934F6bA904562128495a007Cf1D4f3B11A7] = true;
        _presaleWhitelist[0xDb17f648a5da5a4B2E8706Fc9Dd8822407e684A0] = true;
        _presaleWhitelist[0x4233fdEB1cDc84eA29764598Ea997CF6c06B2B79] = true;
        _presaleWhitelist[0x985A19cb5a8316C3aD2c8d6af2bcD8Fe22e18b89] = true;
        _presaleWhitelist[0xf3a5731285656E925e82AD25666A580c381A5A09] = true;
        _presaleWhitelist[0x1e1055Ed1281101C6d149de602e32B6C64aE9412] = true;
        _presaleWhitelist[0xCDe721640EfAAD64d34B0663F6096a7Fcc759483] = true;
        _presaleWhitelist[0x3fC4822F7363E906C6d4E5eF319e4a5ff2fCB517] = true;
        _presaleWhitelist[0x31460cFda82af09c26306092843dFDb8b65F0544] = true;
        _presaleWhitelist[0x1c3c5305Eeaf72B3d6D20D1c20bcbC894FFeafeE] = true;
        _presaleWhitelist[0xF834C6Da7AA4aA71d94c2496554e54103492D5ee] = true;
        _presaleWhitelist[0x98605B0303D2786451E062a414A458Aa2CF0A2a9] = true;
        _presaleWhitelist[0x075BE9842f966A124b55D1E8Ef8D16e04443D9C0] = true;
        _presaleWhitelist[0x252A755AeCad8b802552697ad1c0a7B095F4Bb36] = true;
        _presaleWhitelist[0x2A1B414b392529D4468e7b6FDfdD1227eFfDbFeF] = true;
        _presaleWhitelist[0xdfC3D0FEA0e64CA062C6bb82cF0896109BC8F327] = true;
        _presaleWhitelist[0x1Dbb4D1C3dB0D3d69134cCB49375AF6AF70C80eD] = true;
        _presaleWhitelist[0x0aa24e153B8371878691db4219F4C24155f61784] = true;
        _presaleWhitelist[0x90A1467D64535C43a205601A4D53E390C29f672F] = true;
        _presaleWhitelist[0x0f561ee1EaecbDCCb9Dc14a51EB729601cA5233a] = true;
        _presaleWhitelist[0x7d1Ca405009FAE414A340249cDFfAFDbB957F98c] = true;
        _presaleWhitelist[0xf4fD3ac9867469C325CD8a8DBe8eBFC80B50c3e4] = true;
        _presaleWhitelist[0x66CC6Eb1D8D64099d07720F6Bd502e95b760b821] = true;
        _presaleWhitelist[0xda933A14805821E85c8Fe31a5B2984C2Dd3d83d3] = true;
        _presaleWhitelist[0x63B093fdD96d566011B6974DBA50C8fF9c0F20B1] = true;
        _presaleWhitelist[0x06DD41e3370d2Db6614c0029DC2B2085cE1Cd061] = true;
        _presaleWhitelist[0x52262De29D8B5Df89C64113E4B3A1acc1D8139CA] = true;
        _presaleWhitelist[0x4694398055c10Ee95Fd59d951fab817417A3Ff36] = true;
        _presaleWhitelist[0xFC76f691c9c816fea2687cD32835EAb4c31D2d5f] = true;
        _presaleWhitelist[0x84B59D6208e41c6088cc0198fbc9874D0f84892f] = true;
        _presaleWhitelist[0x97706e57D9C4EAeD5a4c1C245E1e21F8233301bc] = true;
        _presaleWhitelist[0x294e1dA868084bf8951A09C7B5Df035Ce3658b1D] = true;
        _presaleWhitelist[0xFb8DCCBE99Bd647A2a0c7EAC57C422BC3a530ECd] = true;
        _presaleWhitelist[0xefBc0039FdBe3FEa731B02f4Ee2577437b2161Dc] = true;
        _presaleWhitelist[0xAe35922D6E3037e7223ba3AcDCCde497C9a462e8] = true;
        _presaleWhitelist[0x5B6b15D55Ad78D9Abee7D08944F781407fc492Fa] = true;
        _presaleWhitelist[0x73d6D1fE53C2DA73968F0EbD10A95290b6912b5E] = true;
        _presaleWhitelist[0x193E08ef534F22BE30Fe9d8456912f6E5E4F2A8a] = true;
        _presaleWhitelist[0x87a4bb507C45B06B17189EE886C6f568dEfb2014] = true;
        _presaleWhitelist[0x935E8E924CbB5e6020C54149852bdb43bEbbd036] = true;
        _presaleWhitelist[0xc0E88265e4c4333E7Ec7DbF978fbEaA46F3d46D6] = true;
        _presaleWhitelist[0x8BeCa0309248700dadDE5679E95ae809320f23Cc] = true;
        _presaleWhitelist[0xE52085a7d4855c3a7BB748f5c8D2741efD0C7807] = true;
        _presaleWhitelist[0x646EF9cF794662448FE1A544A0f7B234e22281E5] = true;
        _presaleWhitelist[0xC3d90644F686b1cb2C4A43D8Dee621BA09DAe370] = true;
        _presaleWhitelist[0xD6d710f0Fa57f25135fB8c3e7d34455300B9eF4a] = true;
        _presaleWhitelist[0xa049AFeF83d112F9B9Ac4E9d743C50aD08EBEe01] = true;
        _presaleWhitelist[0xc2065E8C845448b6FD7a3aD168918f2BA6e9d45f] = true;
        _presaleWhitelist[0xc12Dd428DEbb46697AeC5774A04347DE160e7B39] = true;
        _presaleWhitelist[0xa8De98c84B3c4Db23F34614bd290f0490EF9649B] = true;
        _presaleWhitelist[0x05B016636d078e501338343039dCf3e6254ea51D] = true;
        _presaleWhitelist[0x94D6CbEeD9341aab1AA4fdCd329703D357510a81] = true;
        _presaleWhitelist[0x586ABD52822cA273c5a0ABC881143E7326dC4101] = true;
        _presaleWhitelist[0x8fEfB5C2C78c5227146da2Bba3E9bd75Dc763365] = true;
        _presaleWhitelist[0x48F4efc8EaA90C747E7859216dA14149fFd31eA2] = true;
        _presaleWhitelist[0xC824D3869b2C08b825C835FeA4eDdbA4cdEd3A01] = true;
        _presaleWhitelist[0xa41813CbCE447376dF8936a69b449064D9F2A016] = true;
        _presaleWhitelist[0x000376dA4117e04233A39C29161e99e829516cF7] = true;
        _presaleWhitelist[0xd0AD343F78D3864f4fFCA528aCE86551754AdeC7] = true;
        _presaleWhitelist[0xF3b7C59cACC5E78C2b49c1C27Cd0099f1d9209c2] = true;
        _presaleWhitelist[0x3a3cd3c556c424fBbc4527CbAc907B3D13B3f3EE] = true;
        _presaleWhitelist[0xc20420853CAa5bc5c8Ea359599EE27e74C7A65D4] = true;
        _presaleWhitelist[0xeAf0dA467cABE404727F2221b5Be72F6F54BE508] = true;
        _presaleWhitelist[0xA01d590200946D92eE84364624ba459e8B75FFc1] = true;
        _presaleWhitelist[0x95408cb170E01DE663016D1865b926E9aB90258E] = true;
        _presaleWhitelist[0x443C153019df225F6842532509303C2A778185cA] = true;
        _presaleWhitelist[0x2f18B365BF7561f38983256CBd8cb5113953a985] = true;
        _presaleWhitelist[0xF3676091e6BEFCEF0f86Ace8D69995794Ca13715] = true;
        _presaleWhitelist[0xAbf29fAb7D6389408691682BF3362001fa65053b] = true;
        _presaleWhitelist[0xFA14dE9Ae7E438b81ACDEF3d37d3fB76ccEF18dB] = true;
        _presaleWhitelist[0x3d706016C74123b1751138D2AD13A48265cb4Fd6] = true;
        _presaleWhitelist[0xcB53E30C599550f30c1c7fa456C6614fCfE8d5C4] = true;
        _presaleWhitelist[0xb12B414444C3D8eD68684AF9f1D1A765d3c63D09] = true;
        _presaleWhitelist[0xC9D3C2d5AB6c2Ca7aBfBea5238332322f05A74a6] = true;
        _presaleWhitelist[0x1c3c5305Eeaf72B3d6D20D1c20bcbC894FFeafeE] = true;
        _presaleWhitelist[0xD4Db7364A1218fd77a77481D340dC0a0E052a6dE] = true;
        _presaleWhitelist[0x9EC64c6Ee1C7dB8F79d7691B5A2d9e00399dAE98] = true;
        _presaleWhitelist[0x786C56F3E470CE0149dFEe5F3aCB6e6ebA794A69] = true;
        _presaleWhitelist[0xC45382F287A69A912f4554E5F33A498f6672b023] = true;
        _presaleWhitelist[0xA289272eB38D5cDd0aD8DAF4144c0676606d09F0] = true;
        _presaleWhitelist[0xe0b4FB4549656992fba30A11647252AEC107Ee14] = true;
        _presaleWhitelist[0x412d4F62d94462128Cb3e7684739bD5244281B90] = true;
        _presaleWhitelist[0x5b48ADB79E1743d4675FD035FdD789D417eD78bE] = true;
        _presaleWhitelist[0x933b7122cD94B89215aC10F689cC26b395a57FBe] = true;
        _presaleWhitelist[0x2D3bCFDfAD3434dE22BC8b698021cAdf4115A29f] = true;
        _presaleWhitelist[0xFb8d0640198593B4680861a913E29d0BFe6ba319] = true;
        _presaleWhitelist[0x63826836D9F139314d129955bc6905607AEB679c] = true;
        _presaleWhitelist[0xCFC6bbFb3f8584c7ff0AEB032172ee472Ed4E7dC] = true;
        _presaleWhitelist[0x650cdC41bf81317D0D3d49BD92f6A17f38DA0aE4] = true;
        _presaleWhitelist[0x776dd6AAb2F0CA98d3D69E4396c6165DE2659e80] = true;
        _presaleWhitelist[0x035F0193f73C50A6012fD2C28B746Cd7b4235C3F] = true;
        _presaleWhitelist[0xfa5d5940091f527E56807568f79fB0fe75225037] = true;
        _presaleWhitelist[0x22d0CcB3315eFeCa1eE95f7E68A199e053719b16] = true;
        _presaleWhitelist[0x5b8301FBFFFf378CA466953724088Bc2e6D34084] = true;
        _presaleWhitelist[0xf189408B372ce23a6d5E3be4Caa02277031fC145] = true;
        _presaleWhitelist[0x917e929Ecaf20bc263984CEa8E8A705216aCEF1b] = true;
        _presaleWhitelist[0x44F25d162195b914446B3335ced1E57C4749C723] = true;
        _presaleWhitelist[0x092A80Bc64d39B1A5F06B14E3Ad9bc742bb89Bb0] = true;
        _presaleWhitelist[0x77A1A469BcAf321215408C5AB90fbd448A9d720F] = true;
        _presaleWhitelist[0x35A9D311413A031D992b80571c1e8E6bfAd4A07D] = true;
        _presaleWhitelist[0x7709b86438eac31760c9c084BE1E7CbC255740D6] = true;
        _presaleWhitelist[0x041A9Be52b2C577394BE60cBcA736034e972aD0b] = true;
        _presaleWhitelist[0x5D8D788115EE34Aa6714FaD133E19eAc46480123] = true;
        _presaleWhitelist[0xa8Ff368be65800e1b7BD5f36C2a617c661C153B5] = true;
        _presaleWhitelist[0x22d1f38a420520a380577359e976E2b4FD70fAd7] = true;
        _presaleWhitelist[0x175B3Bec10500aE28594450F7c1FC08d7Fb4465f] = true;
        _presaleWhitelist[0xB8EE7cD064ADACC915D4F3849Fc12DbC85D74B33] = true;
        _presaleWhitelist[0x0525Ed76CAA96C807843015ffE1E56Fa25e75AD5] = true;
        _presaleWhitelist[0x9CC6908A1b59F2C25d6D1356DD192886F8A6c266] = true;
        _presaleWhitelist[0x65c732C561c31563603cFC141259C5398A96fC35] = true;
        _presaleWhitelist[0x6c68052eAb2eA9C630C56251f34e4bAA4a02aa4A] = true;
        _presaleWhitelist[0x47E8849408b31F690048b35Aa7BbF7198575ffec] = true;
        _presaleWhitelist[0x6eA8F1B1F8242c29D09739B88cB8Ae20960EEe36] = true;
        _presaleWhitelist[0xE01bB320423A5Fd248b23e5ABA5580575737dC51] = true;
        _presaleWhitelist[0x2Cd851C024738ae095c8037D02b3bE5FAc1054aA] = true;
        _presaleWhitelist[0x323f35F58c7A5a954116F1A7ad8fD1085e525c4d] = true;
        _presaleWhitelist[0xC8Ef7FCac332558Bb2387D6fb64938F5DdB79C37] = true;
        _presaleWhitelist[0x0274D9f7417d421A1384d31e57FB641D8890204f] = true;
        _presaleWhitelist[0x3A3151dBd76f2Fd28b7156A3A55846EDa0266Cbf] = true;
        _presaleWhitelist[0xD8802D37df9B0c363E68Ef13EC7c6CD58dbaeadF] = true;
        _presaleWhitelist[0x9A30F112F5d35EBfA6F101466DFA68415FAEE817] = true;
        _presaleWhitelist[0x3f124dc9CC4844921c5a5e8564F7E874109b0A95] = true;
        _presaleWhitelist[0xFFB430140F55333DEdA69999f5AD4EDd5b29794b] = true;
        _presaleWhitelist[0xcfA97E4872bC679811c3fFcBC7D189093B72b341] = true;
        _presaleWhitelist[0x7C4D73F63a7E16EE227b5f6b4e87378865F22CdD] = true;
        _presaleWhitelist[0x0854d59f5Dd94b579CA9BC7689F96f3C744e3bF2] = true;
        _presaleWhitelist[0x1Ff2a117E9979a5A21b37B5254A64a9D3DfD8Bfb] = true;
        _presaleWhitelist[0xbc190c1336fD700A0CC3611BE6F2f060526cB3d3] = true;
        _presaleWhitelist[0x5A0CA2353a5E284BC23B53D130070495E1b598A1] = true;
        _presaleWhitelist[0x5c95679A83363ae561453827a0376fca9Bb7587B] = true;
        _presaleWhitelist[0xd56Fa666456bF332A6Fdee45EC41DFEb940B679f] = true;
        _presaleWhitelist[0x282B774ab025FC2c1E9ccd17e2D3CD2d2750acdE] = true;
        _presaleWhitelist[0xf8174653aC1eb9D030f0Ad630534Ae61Ef9a265d] = true;
        _presaleWhitelist[0xAA6D07B859b9D1630a2d86DAA7D140c3Ec8eE447] = true;
        _presaleWhitelist[0xf310Ea2800a76132202945fd32aE09dE8798440a] = true;
        _presaleWhitelist[0x40b8F09AfCF1D271D805Ce13F8064853D353cf59] = true;
        _presaleWhitelist[0xaEF1EfE94597bd46c1b862C92b8CFBd03A3131E6] = true;
        _presaleWhitelist[0x0D422ef6A5c3A552ee1E00CF2332a833C36162cC] = true;
        _presaleWhitelist[0x8272A6B75d902FD5E1cCDCEB213D853908E1F434] = true;
        _presaleWhitelist[0x5583E73AAbA2E4ECce4C038060131729B94F4C08] = true;
        _presaleWhitelist[0x1719dCFD708F7833BA4A3ef3047025bceEbCF7A1] = true;
        _presaleWhitelist[0xbdC16a0FFFcD2850FE68910f208B2be8b6E278Eb] = true;
        _presaleWhitelist[0x89247ef46707cB6ffc93208938Bf08d3CBA10e56] = true;
        _presaleWhitelist[0xf37841F3511ABe49E416740682Eb4baD403e7a14] = true;
        _presaleWhitelist[0xA2B48C299A90303E758680E4FdEcE6C0AdC1D588] = true;
        _presaleWhitelist[0x5c6f5A221B11284DC72C386E2CafB55dF0dffdf8] = true;
        _presaleWhitelist[0xB5779258Ce52F0b46890675B098d082e8a152CE7] = true;
        _presaleWhitelist[0xA30a03AaD5044DcE54F4E7f7faE53E07A79a26B2] = true;
        _presaleWhitelist[0x0Da5A861f2Df0D7d78D29347c1952f23D07fB208] = true;
        _presaleWhitelist[0xc723c68aC5962a3496e7EB3C9eF3f9373131eE2a] = true;
        _presaleWhitelist[0x3C218A2476E6Be3160BEd701fC859ef432BD13c4] = true;
        _presaleWhitelist[0x3d98C0a700A459740a290F4B7b13b3D1dE0B8675] = true;
        _presaleWhitelist[0x028A7316e38DE582e4E47b5ED747569DA30070E5] = true;
        _presaleWhitelist[0x3f137C1AD4FB32b10F9E117A035543B365535BC7] = true;
        _presaleWhitelist[0x1C0Acaf31f038DAC65e0D4a9a1550AE75784aAdE] = true;
        _presaleWhitelist[0xF39eD7878e4eE8c555516dF4423c01E3AD95E4BA] = true;
        _presaleWhitelist[0x86Fa7eC7176c3893721ABC7058F210e2C7900aB2] = true;
        _presaleWhitelist[0x82400eA848CA71A7dc491e33496E3f2b3509b947] = true;
        _presaleWhitelist[0xfCD067A1825904668bC6c8Ca135E312BF0bD61d0] = true;
        _presaleWhitelist[0x4500C6A5E5E9b1967885B0d393eb6FF570e08126] = true;
        _presaleWhitelist[0x54A3256d6fb04BF526B09Ef4fF4ad265305A034e] = true;
        _presaleWhitelist[0x26c3d14Fd3DBb50D50f853adf364e9616Aa1EB14] = true;
        _presaleWhitelist[0x286C9359f1DbF45E5aD4e90153474fF2d6dFC405] = true;
        _presaleWhitelist[0x117E53e814BF3a70F61a5bb168A21e4564EdE179] = true;
    }

    modifier onReserve() {
        require(!hasReserved, "Tokens reserved");
        _;
        hasReserved = true;
        emit Reserved();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"t1_","type":"address"},{"internalType":"address","name":"t2_","type":"address"},{"internalType":"address","name":"t3_","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":[],"name":"Reserved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"whitelistAddress","type":"address"}],"name":"addWhitelistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addWhitelistBulk","outputs":[],"stateMutability":"nonpayable","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":"ethPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ethPricePresale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasReserved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActivePresale","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":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxReserved","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSell","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellPresale","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupplyPresale","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintTokensPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"whitelistAddress","type":"address"}],"name":"removeWhitelistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveTokens","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":"uint8","name":"amount","type":"uint8"}],"name":"setMaxSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"amount","type":"uint8"}],"name":"setMaxSellPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"t1_","type":"address"}],"name":"setT1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"t2_","type":"address"}],"name":"setT2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"t3_","type":"address"}],"name":"setT3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePreSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleSaleState","outputs":[],"stateMutability":"nonpayable","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"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526703782dace9d90000600b5567030d98d59a960000600c55600d80546001600160501b03191669061209c40202320000001790553480156200004557600080fd5b5060405162006e9738038062006e978339810160408190526200006891620042a4565b604080518082018252600d81526c496d6d6f7274616c4d6f6e6b7360981b6020808301918252835180850190945260058452644d4f4e4b5360d81b908401528151919291620000ba91600091620041e1565b508051620000d0906001906020840190620041e1565b505050620000ed620000e76200418b60201b60201c565b6200418f565b600d80546001600160a01b038086166a010000000000000000000002600160501b600160f01b031990921691909117909155600e80548483166001600160a01b031991821617909155600f8054928416929091169190911790556200418260106020527f5cc6ffed0ac71f2799ddd84777f37ab3bab9da67e258c4989f351119f9156a958054600160ff1991821681179092557f4fe586c66f91fcd44810dc82213ffd7d05632ab50c888c22b7bfc1c8b489e88180548216831790557fe6704a38a074af52d72b497122202e6cd4d99cca49b94441162bddee5f9e6f3880548216831790557fe6520095dab83e04f255d1c335dc0b4f289548a32b6dbe22189ad502aa080c0180548216831790557fa353129ba75b643356e5e9d77030a861442a876df035711b5e5cff73579cf71b80548216831790557f087057ea86ffcb665c69c25ca5fd82c446555842443c17140369f89653558f6480548216831790557fc59f1679488bacbbaf57742c62354f63b1c5162f26f2c9f078da8c2ce64c5d3a80548216831790557fd0e07b088f27796c9b16d8673812599dd320d73b6573186de9fe516f1911ece680548216831790557fb122cab0f2420b289004714ef7db07dedee8fad9e5bdd13aa0104aabd6ca7f2e80548216831790557f44f370e59ea8349618e99c634927f45eae06894521095c8c3b8c9ffe0bff26fa80548216831790557fa30cbafc4376636d04f2e73baa9412289c4df96bb3047a12ee0218d3e3b7062a80548216831790557f3c5c96e1c51ca9c371d70f0b19787d0ea1b73660a1bab135547290d9b4724b4280548216831790557ff0143a7f95d4d1967a7f6f5e274a3493d1ab0e60c43df37fb329fd002401224480548216831790557f4d1d573cd81f98bd348290fc14be16c2b04a8c03f4cfc2fd519897d2ea0ce89d80548216831790557f2a82be85b615f351356f27508fb10bfb6a3ba7f348633dfddbcf5775c882d0c280548216831790557fe01147994320e1c7c636f9c74a4ecd6cef58ad1955f41c48df96a497abd8688280548216831790557f2fb9780745abdf4807d1eba7ff3cf806b62a2061efbbc2b15506b80f90a37d8b80548216831790557f72854862390ef8fc65afa9e112628bf0a9e9b786718571dd7de61d0b3314068c80548216831790557f8429e5680e32ea0bd09ec8adf092efa15098782bf38d538af9b30d3094487a3980548216831790557f46eb2da585302486e891b35aa18df87cea509c680eaec6f1e7d3507c9f8a1c7280548216831790557f8398fc0e221f34bf375016c7facf8336e41c2f5d9cd99091199cee74479d244480548216831790557f801e3d8282ac7a78147e3c9225ffd508457dd070efd52a37768c64e468a8f2dc80548216831790557fb674efc0b3688bdaca044d8156ee3730c4011fa93d1caa3e3df16adfde43be4b80548216831790557f93c479c11cfc0ad7eda9118411f472391878c28c476dbb124d391b9d721c2be180548216831790557fb1acab3695e6b057fdf626d3788e1a5293c8f23652bc07fb4bde41c36190982080548216831790557f46301b86c86ae03837a85669e50185764cf2f9af2bfea97aa453efdefb76549480548216831790557fb589b7097ebaa66666c7dce0fcb5c8a5dc46b2916c55eca62580b15dd6a6a9b680548216831790557f901748f87557c068fad9dd2b6fb69c83934fb802a68a30d9d255723f6290160080548216831790557fec9dc5ef606e88e88a479a462641ff61b9f99aaf7cd123c0cf7c7876ef64a50a80548216831790557f0cd757ac97ef654ee719f43662fb554114eb49fccb98a61705e5d5c89c0f370a80548216831790557f114610ac216b1a593dc7c65e6714c2cd31c6ab60e97fcc4a16f403a0cb2233e980548216831790557f146a8693b4f01a53a6036dd132a0f1ac621cde5af1b1f38db05254f4bff010e180548216831790557faf29ed5dee019d5e0e4bce213e7040e762353f882ad71aee59f2a42e4160158580548216831790557f49d0917026577ce686246080a455129e35297c476129e7898fbb61a75a6c717e80548216831790557f253807d19f833f51a3c38802f652572d11602a0b2efdfc08cfecb1ba8cdb3c7b80548216831790557fe69bbb74b12f9dd81a643fdd1fd01b26b8e9fbe69ccadd66d9e00e99ef1794e180548216831790557fd82be7efc15306497754a3615839a1f0d9be886a9ddbb88b686665311083f8a880548216831790557f793edb80fbcb35632042d25179ab2ba8777f286f0dd7a26745e2734aa0ef3a7880548216831790557f8ad5cc2758834f34e119e604a442a376d11c658e6a6e31e907d5ffd5e1e9ce3f80548216831790557f8a54449af96f846079af7facede3938e669744866c9a2956d9ab6c527f44b41380548216831790557f29582c0640fcf7a1c6f1f5e570ac9d5d8ed08ced1718c1e401805b7a63b49b7b80548216831790557f8bb89a5a8150a00669a83d46b8174aab5acaaa0d626ffbeea413848f9cd484a880548216831790557fd124b08b0d571b58a612bd888dc7f75edffb86b59dcb3d617769550f1cb5c3f380548216831790557fdaf4b25ee5d1ad6efd31b92de47130fd3669165de82b31b2f10e53a4a393ebe780548216831790557f9c8e358e3c55af4007f638688d4db9c2c93b0613f84c23111664d7e3f362101e80548216831790557ff7f09a706e3f502193d9f8b3d32a37b9163b01cfceb81542bb8764c14a149e9b80548216831790557f554f7b7297377e7398110fc95331fe6c1c710420ce48d5719441bd455760235580548216831790557f954e9b26327ed40860aa1b84415b27b1f23061d8dbcbc656e1c2dc5fcb4bbeb580548216831790557f539e39472327784f6b0c91cd9b82af9a00afd0b30a6758f1299a184b21165c3380548216831790557f986295001ea161052cae75c9ef69f4f84e24c93ebd3d4822164ffcfb1de50f6380548216831790557fb772ba1738562c3aa636a4db74c45cfbffc42b7e04af68b88c565d95e3a82b9880548216831790557fce3c58530cb4f9d21d1eab8627d30c643de99b745c34c343ee5071f9102f019880548216831790557fc3c00ba3af28c866a3056a91419d44a4d5948ad549e0a1602de763298941cc0380548216831790557f2e9da4b51359d5a03c102d95b334572bd4246b30847e78914fd659d3fe426d8780548216831790557f8cef793134ebc0bec692d607c1efa1618ffab757a68cb24a89fdc5c648c02e1680548216831790557f3c9470dad0806ccf7fdc9c4047521c27acb8e9518170af5cc71793e30123075b80548216831790557f762c3816e5aa2b14840e9e4eedec75c683a31aacb751d5fa61d9e44a69f4ee0e80548216831790557f8e9d8a507cfc48097b134dd663cd00bac6f5cea4a5520c3bda23f00663e813fd80548216831790557f108b4c4b7bea2f85c8ce152f6ec3ee621737a26dbe35659faae0aea37d28da9280548216831790557f93f88d122459d606ad5738231facff4a93d2c4d2e27db0f139d8ef4ac99651d580548216831790557fe0173780cf6f7af68e0223af00dbd8ee77b89660529ed4aaf070bcbfaf44f2bb80548216831790557febd9dea1d6666e033f9ebac7f5fcd61cea70c321ce1877147f919c2f0a5e87dd80548216831790557f4dae950e944ab6f5624a75b045f0fff07ee830ca80e5a76e7e11d02a69a3159f80548216831790557f2c0d74cb566f33277c381e8d67f1d2a3f3b340e8bf57498ed57fae864edeae2480548216831790557fd2a6f04d88a85c652a6ee6357fa7de0872dff655cf84de17fe49279157789c4f80548216831790557f977bf9187d4066c5123b611124d8fbf2808e145cef8e643ef0b2b8bc72c255ef80548216831790557faabc594fb4931f926f2cfd759a7f5bbaf67c176f8af5b9802a594923a08c6b3780548216831790557f278d36a13a1729c4378afb52b85c57e23e13634bd01f83126cb91f5c738d9bce80548216831790557f0769f147081e1b5c3421e9874faeb97ebd5e37aada9172f7d2cffb42edb214ba80548216831790557f4daf0b60a96989b02467920b03de28e725d6723f9e544b7939f86a0ba06d94cd80548216831790557f896eafe1df5e26e4790cc3d58193ef673a6b189be16b0e43cdf6c241b91095a480548216831790557ff7102049a73e37593ef37be6bf73c3cdd47c1e674fb9e0fdf0a5a0e1df6f3db080548216831790557f0521c9bceb2302cead0fdf89c29c4114166ee94ff27cd104e3b7810ac804751c80548216831790557fce3cfa4ec49ecabbf45e95bc331f05a1172e66fb15222e387be1569c775d565480548216831790557fda659be631c77c577c239a06deebf52a2b9930b67fe04e4f7b21e98430904b8680548216831790557f717a9248b81ec69efddd5abfa5e9575306aaedd1234d6949285bc4772b7f10ea80548216831790557fd93fcb4c9aa4f027f2cfb00e123892111e295f0a9ce72df660c6a2aea17d6a1480548216831790557f472af03f4e036670f6b9dcb2add4ca64879f4b1d696b8f6c2797b500d904c21580548216831790557f3e2a727c2c3223d95fc13f76b97174e94e2b76828691c032baecc8240acb2cc480548216831790557f115d8e37fb323882002b7f0d71d053d461e52335a3a544a9c8812fa364eb93db80548216831790557fca533377eb248f05f15f5916aa1dc7faa714069c4262f24699ffe29a840d5db280548216831790557f76cce104087687a8759d9616f7c0deab4f532911a3702b48aab030043c232e1980548216831790557f0675787e88eeb2774b12613adbb24df7380a32b6bfa41020a68ee7dbc0d987c380548216831790557f610e52153a6ac2a2c6806445691249599e3644e95b4fcd8c000162ca7cbd95c380548216831790557f3a0e354251dd4f1071cd34e643be67f5a1c7f02c3d61fab84d9aee54018ba1a280548216831790557f5361cb9b8e02a6b8d84027a8ae7956d2e27542e7c3dd4aba65f2b4291b394c1b80548216831790557fd120865f49f54fbf68c4e95bd38ba042ef5146cfbc952635cd26f18258eae17680548216831790557f8ad5a1b6eb018b7be98a0242db6b63d6e1a71f757f036a0d627ba389980568f680548216831790557fa4eed26fdcedef389b2bb50daa8a683349074cb37818efe14b9c6fb7710f947c80548216831790557f7d9ca2b4d2ccd6e695ea8886d3123f794c9e34d3f7a5cee6210048846351847380548216831790557f9fb8728df7ae8a0ec948b30a5fb372bcaba7ef601364276b1696d8ce1480520880548216831790557feded0678a40d47ccb13201add5b9729ac04bfad2556c41ebe245cab92589e60680548216831790557ff3e567eec42d46964705339612f3d496cedd95c8f6dd540482f0302b285c08cb80548216831790557f989637fa5c5a2cd6766a7abacb01c37c8ee4f81f05e5b2960a08b88524b4bd6b80548216831790557fa8f69121d14c899847090e17b178e872622b2e62586836836bf4f342f7cd761b80548216831790557f8c7fec16bfa94a109b1a11f7d895f2029f0f8717941bd18e393cfefad002640280548216831790557f426604a169034ac8b928242f3270afa0f8c21f13d627636ef8746b741f98470980548216831790557f9726a7e3bdd7a88da7abbe1ac7ade7ec51e308e0c36f134acb5a85fe926b522c80548216831790557ff49f38bfb536106253ca385b8a721bb8bb147d50f0fb88bc161c497dd5759f2d80548216831790557f1b9e3be61f96ea93509ce44e58be92b8e437490f1ff326d9a7899f42ea12bcb780548216831790557fd62632ce0d2c1e84f53fc0650ed5df7f209a19510965ee710fbe65494fff9e3b80548216831790557f125c4efb5d6d7636663503059be355bdebdf1b4ffe71fc8747e7d59e3a8809c480548216831790557f8369313b19804bf9898f0533931f918475d69f70926d4cb6d4484d6f8393e12c80548216831790557f38c440a698bdbb9a544f2f0d35f2b09104f579eda98009cf0ed86d7ddce2bbc380548216831790557f9ca7dcc9a7ac2bec83d9ad849c5ca8804d29bae2512ebbb0313e3f2afec05d9080548216831790557f84470191d4d8064243c8f2987f49a3f4015fe6d9471625f1b625bba29b48dc2d80548216831790557f9e5c6827cb8f7d0182799020b15edbec47600050d8dc4bcbde53579fe35b81a780548216831790557fd4fa40fd60fa0348ae4e6c6243631e1703b5b1fe616af519ff7fe8674bb2659980548216831790557f454f683d3fd41cb7f3d8affa47d8aa645c85e659b98d61e2e0bcdf60c4e3ec9a80548216831790557fb493ada02df2d183d3c4d48b5847ad5cf20e46fd98896c78723363e37c264a8980548216831790557f2eb7af0725feced6cb0d187ab636ea580cf2d9c189354d2738f7d2fe8370099680548216831790557f466c02d3063b3d990ac727c5ebf933463f08de071a8b8cbadca8808b236fcbe080548216831790557f8cd7d5c2cf03e42148717a82e198944d7fb2a69ae0e043262ce0c3d48e12068080548216831790557f41bb99b694543e2f0a0c95231cfe1f4b30ca74a8e2582c4cb0991e90d47d3a8b80548216831790557f724627e4a8594bd7d9a7f4211688257f4067acf81b072542090c96a58d2f408080548216831790557f1dca44bd7b038b0c496c3c0d38ee94559e79941f7dc52926f02e676196eb991b80548216831790557fe35182b69932e3c014f662bf34046c6dbe3df041169e784ae9d7ede3d642c2a480548216831790557fb992f2863f5c12901f1a229804e996e48890056c9005f84310c786d048450d5f80548216831790557f3217ec92f716cb042fed79bfbaddfb436c4026937ec4a84c32eb50b076d428cd80548216831790557ffd3d04cfd2d46902f08ce7cb11b70d00fb2d3a6407f59e7819ac5934e2d1fc3e80548216831790557f83f4f6d21be5ff3b0858dc8a432cae9e28824cc53de0ac1e651066546f9b323b80548216831790557fe6a7f18c06786002b1724bfe06b3934a94f7a59af1d282886fa6c91ecba68b2380548216831790557fe5611a45ddbd3c264428501e5fcfd2b702e645af8cf9b5838db6b4cb7a0a722480548216831790557f9a1a80004c8557aa5af7cf18dceaa05687aa3c615283931dc3c3392fde30fa5180548216831790557fe168ce291e6adfd9de5d2d385661b7bdcb8feae0596a10153f6a09182a2841ce80548216831790557f54b2453d661e9859355b240cb550bdd3fd4df2eecc0606e7b1ed8cb46ad9959380548216831790557f0dfb754dd728e31e7beeea316b5e4c1898cdb67eafcab7ac0bb43598cca8b4de80548216831790557f6081f45ca652d8520051ceaf4cddfd23fd478bb46773222d0c0ae89d60d5100880548216831790557f85645b322c62ebe36e482fcdb494de435b9b5f879c1262308a7b1f16ab6971b880548216831790557fd3f7d311895eacb01c751afdf5ace0d889103622b5a69dfc893f7f4e738fc49c80548216831790557f7f3262173ae42e07193ef8b5c27b423560f08b59fa8b71e10b69967c1bb4777080548216831790557f58523d4991027127c14874792306ce7009b46e9ce407bd498031b4291046031880548216831790557fc51d8080e11c63e657d7bc0c67accb7b19fed16beb2630677bd1a729bb6bdbd980548216831790557f6c4f89e03c2c9dbe83f489b6b96dbab77698a8acae33c6f68496e1eb9811726d80548216831790557f290a4744dab09520a6b76d83a2504079d36df74fa29414723b07a9929714a00380548216831790557f195186b85e6ea3b08f90d7c6bce948c4415b15485733e6e6e3702ce24ff4472080548216831790557f32bbaac58e78c79526aa5b38025873d0ba45fbdbfa0d734ad9d5e8554dddf56580548216831790557f2ccecfd5f30e5a3bda1f3102194f375b3f653a484befe22ad4a84d53f6cbff1280548216831790557f51e1ceb68d9e2267ea3cee935233e51090354d52e48acf030cd9311b1939271680548216831790557ff24cc512f12c93ebd97fa1bacef031f5c3b02d1cbe64771c27f7d0798f0933da80548216831790557f91876ee4f05b88f80b895076cf60c6bb6b906e916ca1078d4e8ba0cd81fcad4c80548216831790557f113d52b584740faf31cc81750c7157339562b847346c41bfbe1098bf6154a44c80548216831790557fbc9b230a16e8588044d05b070004154d5272a48e1e459f6d1ee86c790252f45780548216831790557ffdc619c91a15e20d97899ffbc4d5f70c8451def4c0a7d7cb4cd3a9135fb0811580548216831790557f64a9811dabc45a5517b622713183fcda7d2ce37f06cdadcde89de95ce0ce4e0880548216831790557ffee17716820af6c13f493128b79dc69b64e3931e890dcb92c0bfa20a646be3ce80548216831790557f79de23bb807abe5e0266a6847d95b17dce454ae2f63b761e1807fcd28ba112ed80548216831790557f32d1a1824782b4d61f2503a7128885cbe2392e89797849be533eca60c1b6c84980548216831790557f6a2f103b175c3dbfced8428a2d61a70f4361ce704d86442f366383076021e21080548216831790557fd0f47ce970aa9acf52d86d45fbb5eb5d73183170ba2df0fae0c4c33bd88a93f480548216831790557f5e62a5db1e33ff6533386f8c08c195e942710af270a6430f3e75a0da2f549e8980548216831790557f50103d8f8d91ed4a8f318dba9a610b057a9ee47985ac408fd89a11ad7e0d508180548216831790557f6fe49cebab6c1e1e1d3bdeb23a4e03a4b761352e3d5f56055214d1361bfb255480548216831790557f54e693a108452efacfdfada8aae5dcb6602ea8ee1b330d31383de77f7001ce4d80548216831790557f14dbc5ae7babecb7b4b54237a8109fba1e4bdbabda632804d05fe62f080fd1e880548216831790557f53bc087820c95ca0e26ca254c0f6933167013a5e844e177f455c0150b7c88a8280548216831790557f0cdde06eb887652a2e1237c69d99ed19fb7ecb0046be74fe0506e95b71e88d4680548216831790557fc20bb9ae8934b4ef8f177da0234aaf471845d50db4775679e5dbad46deef60fe80548216831790557fc2df02af3d495c94f2d70413a46343bb84c23c8f1e12c5f3c44d4d1dfb9094ee80548216831790557f9e2592721773a75668dc48ba34c25599586d5351f66b203156bc523c396b150a80548216831790557fb27574a42468b7935a58853f8c9081c16139076a8e562cfbd18d2b16bee398bd80548216831790557f7bd7fc824fff2f3f395cb0bf9c06503e32cb9662bf5126ff862dc225fc82af4980548216831790557f1d29da77fcd47d2bf95cd74dee8506087b3a5c432c855e8141f011f541e5ca6480548216831790557ffda01bdad6e0e050ad7895856fe146ec812ed6cda623d5a32ab7ed77d59560a780548216831790557f424e4f4b105bf2659fafb8d2f7413b7a0b5e4c7405a2d12c7cf4976434c596c180548216831790557f018610abe67c75bae4378eadd521b868a74708cd1483a47a32c9b99352d6dff480548216831790557fadf705aa9ecaad92dd2c592f50687c8192493db07c759ee2e1e747a62381e16180548216831790557f353aaee435eca06ef6542d08d56fa9a2230da496874aeef3e4e60cb5b3870b4880548216831790557fd716199aa0d41ff244c3c85ed427f17e256a4a1a8c2d0fddb4500660b3b20bf780548216831790557f4ddf7208f4c99394285636c1d7c5a7d59340725724e9f6873c97d77805f485fd80548216831790557f63b03ce62784e2c1e67ca7da6ae5dfbe9e2d7757c3b7c2a03b86f0bc0106818380548216831790557f3fa4b8df15ac88d67cf12d50a52d77a2fd52e067dbc427ca0906e346090ae8d680548216831790557fae9c85ad54a34276b92688be7b070873f687a02f30cef8141dd38d0b7ae9b0ee80548216831790557f1ab0867490d8da69291b7692eb4b6139091e81d8eaf1a1c6471ed28eadb9721580548216831790557f63270f351020f5e61e839b8c930c87bd9eb906ca331769b768d693b0b343730080548216831790557f2cd54397a56ecc2e874be397f3f71605f4a72cc34eb32ec272323c158bcbff9880548216831790557f12adfe2580f8727bb83d56330244087b753dfc0a0218596d5543ea85627257cd80548216831790557f4977e22665909d77165b861d0d1cb9a60cd37b9f11b2ab7d3c83e9f0649cf8e280548216831790557f565f03d78fd3163785d83320f4cba1426cbcab9823e321e9b232c1c9c1485d3180548216831790557f64c996a917b64964eba057ad1c1bcb97e3be5dde049761f87f820ddba25d18b580548216831790557f3d866653722164051d413941ce9b3506ca71528a8f6a9b00c7c3de6f71686eba80548216831790557fffcfbddeb719e776914bd8841e0abb5eb1b464261df3d1e5b62066948fbcf5f380548216831790557f20a7ed62175fd7f6a3c882c2abfa487ce9932d2ed640f0e9c11253dd375467b180548216831790557f237e280c2b94fedfc1e0f0a0de17db02ea6e7bfafb5b7c32fac117761c7539d480548216831790557f749fa62c7c199f038dd0afe59d413fa7e50117218995660ae8556ae1d061422780548216831790557fad216612b5e9281bdb002866a0a1c0d8d4ba3de679819b5ede1e10cf3587622980548216831790557f938641120f160315d17157e10e680911d23a4bef344e2ffff09d355f2c3f503180548216831790557f6b3a5dfa42056ed9d2e797bd846391c416e35625578f88423cabc9db619d571480548216831790557f966633e37c9dcd52cc2c3a329601a6f3f8a52a316a51c15eceb294be945ebe8880548216831790557fe1faec88ea5e311077aa2e4e72a7713797b175e4905257cac5adfd7f0cfd744080548216831790557f9a44adf595e47037a6c24adcf8874377aa6ce8b524412a419d47d1561a8e304880548216831790557f388a1eeb3effe05538e8b64e70015400c523c4b069413de551237fe7510664a880548216831790557f045384b27e368b0f005cc544d91c53cb4ed3764db65b03408953cb7d5c8914a280548216831790557fcba1d8ffebc8b8d2373c11aad589fccb641079f30e3cf95a7bbfceb8cfe4382480548216831790557f71d7e44aa11949c6af4441aaee65bf76c5dfeea4519f1302d78185eef7eae61c80548216831790557fb4a4406cd10740dae063aa96b28aaa9f1eb730c19b503ca2fc76f221ef9b2dbd80548216831790557f53d244ba8e6cd91eff6763928ef628250dc91da6b8e9f72f153f2cea180b762d80548216831790557feb71e7ce501825d7fd5bf8c05e17ddbb8d63f244a41bac00c714f7a1d16649cf80548216831790557f38e9607ad1d6800503e8ef8150716281d68fb214aa48e488c099d1a43c12ad1480548216831790557fc608bf14a1ac931c5d9cafce3421b5d4a3eaeff69b22a58f6833397cdae5345680548216831790557fd33a8b6fa868bde53b63dd0ae3c7c6b24bcdf53c32c9ac52a134cdc465b8eebd80548216831790557f2192eb950dd9645a93d19236c38606265b6bfa97b4dd12c4ad0c0bee6774f9dc80548216831790557fb36089ee558d6498fc9e079573b1688c97a516e7c8af45e7a32a7f107a8aedd580548216831790557fab991ff4d9c19e6f1d57e68183d737fe3811160710b28d7e83b1ed3ce64ee39680548216831790557fcedfcc86effff00ef2f09a552f32f17c0d7b82ecd998f5a8007d87cbf39d477d80548216831790557fac25d4a12892d90a538d669cc5d3420d55cb4e9c247bdfd884f20305ae3da98a80548216831790557fef1965946b6a63fe23c22330c2cb955a843e4fd49af0b8f6ea4d71562d820b9f80548216831790557f6c787414584c5bff85ffa8288759815d4b3550fceb46a9bb044deace09aaca4d80548216831790557f62877d451cc9e4b15bebd41c4c7c0458f8174b747e19266187d817dd38c833a480548216831790557f6be0c01c3e86df00d3730f12454512c502b08d3d87b9dca689e91656e9af555d80548216831790557f107c399e8510815413311b6d715c89838c15c5851c4eefc2890ea9a341c43fea80548216831790557fe72b60ee0249dd8bb71638b9a50c07317c020169ba65cfa271f15a4299bd2cb480548216831790557fc4a66d792bb2299e4f7e1137a25e483416ce6c5daf8ed78d9d301a87f9006b6280548216831790557fc9eb3e0182d33ef30deb4e4e5523e18947960bda3e498c3d0f919636b6b9e73580548216831790557f721df5bf11bf3262e4d8e171ccda7d9a88c6da3b0382fc99a1e3761de7f697f180548216831790557f1c024ef5802e8c7c8096987071c5a4d375567e98bfbca41481972cff1781466780548216831790557f92bcfa19b0d126b1dddbf6db48d5029fb0b66fa681bee8ec9518f79383d6425b80548216831790557fd45e536afa943f6f3b49822d9449c2d2878b3d33f30810cc2966d91e8b972f4480548216831790557f249975d7bf7a8e6410f0b97aaf0078226892240b047eeeb59e03f169b14a82d180548216831790557f215f7505c94b4a8528b83edcd980d509d6df5ed1a6ccfe3d777d00f3c084215880548216831790557fb8c01462dda3f0c1dc1b9f3907de4f5d8f3c043060e64cdc6cc72ff6ab71510b80548216831790557f70e8497f19bd4e58158504348dee41a4708ede0e98fc3253208deb57368cf4c280548216831790557f7cc504106c5708e21ecc0eb2af1b1584698aed244b001e81b063260b3b0b56ee80548216831790557ff71f3ab5d62181a4d399bf0bad0d5fcc51679d30000b7e992f8b32441ae0d5ab80548216831790557fee1bbdeae689ec4b217959f96f362f5b05fc990f40b9c02f3519eb3fde533ed380548216831790557f999cd072329da98c475e2d35e2755aea4e7025058a2ac42eefdc9fd26c73cbf280548216831790557faf995e8015a41e71bd20872245d5164b2544e1b1cce472f40c74df1b9159031380548216831790557f873e7d6f6f2855e343763dff5b6aa338dc98f4d6a026b0bf78766ed4c704941f80548216831790557f5bce9b5f09c81841791b980c8dcc7dd0ac7d0a855a88d116e03ca9a05384b01580548216831790557f39446cf6c52721d305355afe28376818118c74250cebfa12416a0eaed1bc812180548216831790557f73e99eadc620485c45f80c5b067f4572d06cd61066d3b959953508ebbe831fe780548216831790557f67d8c0551aa12ee7f5813a992168f84533693562b992c5193be40a09c8295c0f80548216831790557f4b43c4472899f3c7ab2aa4b267b664ab15710318d666401cccb1c4019a2b940080548216831790557f55cd8afeae69318ac9502a1e38553dc3894a3c1049ec80929029cc616673565080548216831790557f94ba859b91c6f90e5bd60205de75fe6f9dedd1b4fd02df846eb82b2d6a3d9ea080548216831790557f7f69676d13e5e523c35c84e8f85fca3354a0d50d03beab9faf23b9067299772680548216831790557f71a7f1eba939f1e61017fdaa726018f5938a9f18d6768bbf73cc4839e4fcda2380548216831790557fb00c7f72bc9db20880006e7586e3f77352cc5f2b51769c7383f41c9af30ae06980548216831790557f6e673cb2be23b79a402260886a1e8b1513727a6d95d2f126c6e93891f79bd43780548216831790557fd1eba6e06fc8787d92306fbaaee269ca93c2ae9980420c8bb1e2354f25a39f3f80548216831790557fe7122e544cdee8c344c711190defb13761f537a5672e99d1b80d3f4f00e018cf80548216831790557fe7965682a845bf3154c2f5de5e33acccb6e314fc2eaf7c5f57c675d6cf4334f080548216831790557f4f31fdc4c55733bfb1e405967c82ae4e43e858ffe371437383a8f66f27ca8a6b80548216831790557f514d399c9a621d85c3f3b2cecffdc0f73394f609f9434261680b3a95467d771580548216831790557fda68cb9342682394d3f65fabb6d0ffb77c106e934537bdbcec6515e31589046e80548216831790557f410b3158a34edd71abc9f04cfdaaaac114e170888b5548c8b5fd2daa20d89f2280548216831790557f1131035497f5baf99b68211a57a66c44e023a4ebd4053e97d129200c08c7072b80548216831790557fad878fd58c059014d329f7f37a2aebef431e5635264ec10a3a20457a1702eddc80548216831790557fd6e50f6eda46582f3ca2cf237fc79d35eda4d3c13e2c70415480c270a78c5dfa80548216831790557f34569920e16acb5078f1dad3bc39aab4bdf56f8f83131360af4ad3209f8a1c5280548216831790557fc47c3e533ca6c67f1e17feaf926043398709b475afa41693899f170ac36e064b80548216831790557fec71b45c8ea6a8e863e4ac5803c77399a8f040a8aca88a09fa52e475884f995e80548216831790557f167da2c013b855c90d007bcfa0af9f1410a9d2e10cd331a7ebe4cd7016f6d1c180548216831790557f14164b409710776c971b38942cc9d7f6eb0664aaa4a035fa6e4907321c0e417c80548216831790557f61f68b40ca2eb6e98723548b259d6090d62b49a086bb2fc429139dfe6e9f51c780548216831790557f44fa05b87fb4820f514eaaf811bdd88b28f7fde04977430fcfecf5831b68b9f880548216831790557fb7ba94ab6d59ead5eb10dd27f45727bce7da6fd59e54a104df69ef9ed0f5da8a80548216831790557fc506b221769f75247281f6d5e1b7f3b96543747cd5c9e4c3da684b375be8ba3d80548216831790557f1ecc0f07e3d9a88b8c67a4390e97165eb7f5403a89a87e0993605807f52edb0b80548216831790557f7c32d0e905f5e6f575c24e97e2ffbdcb89171413a1f65783a270c49a7b6b592c80548216831790557f4882ac63e5f4c1ea11ed68e69ee1173b6ee1b4281e24677dd16bf686a688626880548216831790557fb20a223cd8684a11c15e6ffb95e5646980188d055e4930097b3262150249050480548216831790557f0458259e8fffda1d8bbf865ead06a39f6ff40c8a0c353f76d3a38690538bc55480548216831790557fa13e2bfda9522d580015a030b4dddf5583057fd5876eb96769c68e8d18385a7f80548216831790557f7f696fbf6ac34042dd50ca36ed10fd50ed4a5c800a78badac5ac7a2764bf0cee80548216831790557f41a96faf31e7987419b874204820b2a7c91ac3e72c4ca6f5a3fbf973739a759c80548216831790557f5cf6d4314d904afe755b80b4c1ac04cb2ff289a8da7414c3ba55fdddc19fa86a80548216831790557faf52585bae52c6c76f3bff4fb004ac84385042d94ca325608a26417530188f5c80548216831790557fef7c42aeb5f8da4d9f927bc1ceba75403e7226621d7058cb702dd29b07b398a480548216831790557ffda0c78166c70677af59b16e11d651358b6c1558113e6114baa2c66692bfc65880548216831790557fc09dc108d49d95b05116246f186dafe719ee2c2dc5c0a466b92b56f0a825560d80548216831790557f2f70c1b7adcb31feb729da389f08b1c18a809da524da58c3931bfc68b97aa12c80548216831790557f712b3a4aafe7363527ecb150d7e68b7993e001617c0523d538ede92b1997578480548216831790557f934745bdfc841ed02d0ad3eed89af9927c66068ff16f36b5aafad14b07f9d79280548216831790557f2f4d4844eacc97fb799d0d58aa334bbc2cd662a0b73fbc4674330084633e67d080548216831790557f088022eff6b9a83ce3da6af66fb1331323c9ee04bd81303d3caf8de9849be41780548216831790557f5837c19df275e702760eac648caf2ca5a523333a70ae80d98dd3607bad51d48980548216831790557f55d6cde7b66648204eb35a4c11507ceaad3e490874056e9e3dbc926c5a4523f980548216831790557fedd9c0b66f1286f84960fee3d4f3f9b7c8807eb13b61c793b6a69e5a519dd7bb80548216831790557ffd91c8fe8e8d2392b5d73d40e3cc1ada36992ceb1279844705814f1d2e751fc280548216831790557f03b354403bc0e641358f20257f70308c120fb3a6060a509dab05f7f5ede4333280548216831790557f0717df89bb3c99d3bd91453e548e72884b322fb2f717ca6a9edc82806c4975c580548216831790557f6d54af0c7b5500dbb0ac20f9975768fdf4138b6a4f66b61d9ae62a0e5d1ab74c80548216831790557f96e1a97bb8ce6b2784397e1952fbe8d0033463ed2d2e93cbf23bc36c54c93a7f80548216831790557f5825052636ca43350a84f068d7e1a89554e51b7380dab241173d3c3ac0eaa05d80548216831790557f23d2962c4c5bdd5aa65e0574847c2061315325f8551a85025da9dbc0fbadd94480548216831790557f640c2a23c6c8d27926d9e8994d935e5c96f0c371d7e8f1f6b3555c60f6e4298080548216831790557fe9aa21593e159b3d32e45228709248b87ad5f0ae3e27e5e8b05f9106a379d15e80548216831790557f7e3407d8fca90c41dc459c73ff6606026f8c54fbb96cbd0a38b854a06c34d16280548216831790557f56178293640d46b61c3fba104c8da6a78f2d37c0382236b4955ec001b308d87680548216831790557fd2e64a776504063fd30829c44eaef7ebb825676a7697dde580daa71bcf191aad80548216831790557f2e6132854d439dd84241e34a70ba9238ff9e84af2518a1d77bce443315202fce80548216831790557feb659c6280cd2a9442b57b7e1a54bc4d9264ffb9f153e37b86773a8516c6fe9e80548216831790557f2f92aa46e1f57cf38481165e7aa285743383da2d3d2cf498bd21f835e34af89680548216831790557fd52dd29569272bfd12bd0c776e8c23034ef2b843e536a61d6f1c7c898f2986ba80548216831790557f3693b513df20263d4884a03efd40d513a0eac3a4fcf1ba3fe507a823ed16a53880548216831790557fc505d5f017d8c5dba8cbafa38928dd1e05ed79d378875ad5881ab17392db9f0880548216831790557fdcc7a4c89db136c6ebcbbe9aeb388a1684c7d311e8cf9b311294fb73798dde9e80548216831790557f123c03eb2cf21001fc20dc13bcd59af0ae4bf8c4a1209a086075baf008d4160c80548216831790557f3ccadd24f0578cb52526f94a6a07447f55417a318ff1972aef404f724c996b8f80548216831790557f5ce809bc5e8a217139268cfb915305de49579e23065958e88bfcf87e2519092780548216831790557fc57937613f0d86d9a720b12021f4a276c5f78fa4647ea7362ae11c9db771c0fd80548216831790557f8092d739c82faecf4d291499a34153370612cefd8f73381d4334f3af1686dd2580548216831790557f4d558a0890d3d966fadcc72a3c8e4154069220b3fa0b1b6f6653296281f98a5a80548216831790557ff28d9a04c6ebb4bf38007cc33528294eb248d8b774caeac5db87f8050a8b921780548216831790557f1f5392cc8e1a5f1b911d9991c39d9640f17c5e7706c0c3fb117143794dad84c780548216831790557f9aca5c898652e5daf01bbd2bb65b05ec6ae0ba3daf1fd7a8c9ff3a2a9734f92380548216831790557feec936251819ceec7e8eab82dd9dd8e5c6ba8e3988d5476df8556d9bb9ee069780548216831790557f8f1c62d786ca81d86ea151d5a1112d0c06aa4ba2d00a994528a7b95b9d2d4c6480548216831790557ff0361bbac37729ae9af3b1348a25770be15f538620eaeb556e24d94e570db0ae80548216831790557f0a5c530ccad212307c12f30bf9f4f1990e6f79bd987716f54225b978c864805080548216831790557fca36d7d30a22febfafbc115caabd0894cb1497dbb598a15c06c36161660426b280548216831790557f7dfa75d12627c9dc50c7b476f70b902624c65d0046b2a4472023b842a917236e80548216831790557fddae7bff2cf14a7152c048157455c8a39383714603c7e87e1e5b114c857e661f80548216831790557f0c6abb80a02e6254b75ad11aaa5a8a489c91be9d6b8134c40efe7e7ef733042380548216831790557f8a93b364d243062863287c78e27f87ace141a3eb1c418ad49ca6c649242bc19880548216831790557fcfebc333b7ca2031ba857e1be766a71cb94213cb64ea1fada6354f7f169dd2a680548216831790557ff68514e8a9b3b2b7d468ca483eb60d91bbf416d068086fec29b11f385cc4f06180548216831790557fe35422dc912de62e89f3fe58ba60b5030478b2a3d986e584afade6775f9a0fd080548216831790557fb89cbb33f429cee049b46006d14a801d9c97a9ec4b2e7945991720a0a4c7f38880548216831790557ff73951cf7c18e37dc223bdf1f086bec4d870e6e698007843b4ec78bf1a6f5ac180548216831790557fa43cbb61c9f4b4e41a6eff23bb252fb631b1ecaf363415db8ec75ce9e8f7338c80548216831790557f3342b8466dd1d69155d71e130817799bd9219a9836de7a70b40e3b89fbf99c2280548216831790557f813c6bd202f3f0543876c732be1767c9a161a8b3a65f074e5fa27baf5f67486180548216831790557f3c6800ccb1f130842d4a7ec4d8ebe4458f4f81e42c6f37a1b7b6fea520a144db80548216831790557f92b88ee3d830a278a9364b2605eb2775d2752fad346a6b08218e03664d8d56bc80548216831790557f6ae0e288ae2b419e34b6ccf516620a8a8594a4879d61cebe83620b96c7f38d3280548216831790557fdc1a5047ac2b7ace32cb2ffd56038bf1165aea19a606103c51428cad7bfc140180548216831790557fe135682aad190141fd905348d2661b4667e864aedfbd05ead4ddb1703e2999cc80548216831790557f5efc59b7d04b9352700799109f46ef9e6928be3415d98d3e36de57fa61991f2d80548216831790557f7d44bffbea0e28a116342683d6673c3a5ba1022e6a664217848f487bae6567ff80548216831790557fb3d0fe9c826aab52094e482de32f7a9d75831f50aaee382dc24e61e73cbe1db980548216831790557fb74807f50c1d68341baf7551acf7854a65694acde966fed408615116dc4d16f680548216831790557fb9bd38c49f3b01e4f1fe14ed649573f4755670d645f49619a9708f75a2b8c4b580548216831790557f282d71403a38d38e7db58eb38178bc414e7a25427718add3a35335d11b0facd880548216831790557ff5b585be4d8467464a520da8a1163053df2b9a8cf534cfd59b33dc8919e2b7d180548216831790557f2227224e6b0228587288b4cf61731038e536be3cea211deb06c242902e1a0c5080548216831790557ec960caf58be234b97c6616de1c94d784227698598513042597a896b1c1021780548216831790557f3cc08338acc2180c0007912b917b15bbe8ae48355a45a872a572123a796e29c680548216831790557f6d14c0d5a9a84427cd98cd73d266082f864aca5b13eb180df5a9b97a7a068f0d80548216831790557f19d07e4cfaddbdcafe6f0025249eda4ad396d9a3767c66f0ae6224c37349940a80548216831790557f454c6c21390f022a48e61e99b90947d06e439abb51cdd0d3969076b931c8187b80548216831790557f48d3816cb0d69d6943b590eb3b585372d7811e51fc783ddd07116e70767cacf380548216831790557f51afce9a76cb4c3cb8cc600d507b548373b3961a53c5f90c54c10198c155c1ba80548216831790557f2b2a609323f6b11bbc1b5858d2a8c8a5db8bc8c2468ab226706ce7f3e31bd41780548216831790557fa164ba128440b8510ef1cb9897b2bf02f035a2fc91c48a7a43f5222a285019f380548216831790557f2ae15abeac7c49ceb84e7e21db1d89a2c556b62a8aad8efcae05abd6bd5ae22f80548216831790557fd7071986c76b034f8fccb6c3759121d220c32d44397e2ba2c0a2802572f79b0080548216831790557f10d3ba41d4b05a17ddf41861872e16dd0e12ed5c62a1268bd64c61de7cbbdfee80548216831790557f2f7065a6a86094d9a4841bdbca3eb1f46f31d934904ffbcfea625f60073b987b80548216831790557ff4d467f7305bbc9f44e63f2d559b218baafbd9fe8bc3548a6b39066db88b097280548216831790557fe06913243ce4d57d898897b5f4ed5e3d20d60218ff2c60946dc14fe85060f9cd80548216831790557f7a4cc135f8f7302c981475b994187a07173fa67005ea231257e82a5bdd29e02580548216831790557fc4648b4d8defff5f88ab78e9c33911b732ea352c2a268efc9f8bd94a4724461380548216831790557f62c51a5410641f1193b78f41b5d17aadc9e3661a7b7f7f9d52a0a570977d57d280548216831790557fdc4e97dcde77a661ddace5ee2fdd8defe7d3dad5fee5f74f6846902fb937bb6d80548216831790557ff30b22c291a45d831c4c222f83c0bc9a99948ff344d6124ca7d70269f07ff3c480548216831790557f9ba746d053e70187efbf5fca6253ff0880d8cb1647a628408f03ade4078c0cb680548216831790557f044777989ddbbfc5e53d67ab6569a02e9d3e160048fdee3bd84050d12d8e180380548216831790557ff394ed81c953c1927d31869f3ba43dffac0dac21b13c99398abf96fa6434db5680548216831790557f323c21ab90a2983614c0bde60645d48548dd2f0697e761025fc7c735dc9e531180548216831790557f1a15263a365be4708b733ced456ba0f5b51bd4274f38f0a6b47b9160db1d6ff480548216831790557f6a57447ce8f8cf0ba3c004ebd7d04b08dff84a4aa8f5960c1b89d0143cdc046180548216831790557f40a64ed8700946147abb295fa96f10ea7ce5c2ec63a708a83e8e5b8c9fde9a3480548216831790557fc6d8ff18b8efd4ae4761bbf5d5a8717de40dc25fbcfd42fd09bc063d400ee29d80548216831790557f24fe08f4c16128d344fbd83d8a76fca15d2f71a8f2e34dfbf6c46f28137ceae880548216831790557f37d3da68108388144933edebb6cb1db962d04617c5bf6dce33dc28e484c74aa980548216831790557f9998027e8df32b473aab9cefadd044a514908cc88365718171b342faf08fcfc680548216831790557f733907ab7f6856161dbc7ed6b81fdf637a638fd4ba9bacaa61c9d776925f198380548216831790557f584539b6a5e1f8b06f5514dfc2959cb6be12426aa74f113bd2384379d6933e4c80548216831790557feaa982030f2824bb614163339ad413272e6d494e3f695077a6ba2fcd2564792e80548216831790557fad463d6005943d84bdd7fdc4002bb617f80bb1f636b1673f382c4bac4a2b710780548216831790557fb10f117d8e0fb6fb3de1bcd381a76d61a938cd55587b9c82b583e610712a57e780548216831790557f494ace7d96d38a2bac9a409b004e83bff135f7726a4a280e3659bc1f910ccca680548216831790557f5738f6e4f8eeccb1162c815f3217e8354b6260f087bcb05f096205b48d9089ed80548216831790557f4b8de2695a9a9accfe62a9ecdcbdf00fc73b3c412ebe6b594bc61a7dd40ef09e80548216831790557fd5a400c1aa2b45205e378517c7bb438096f29653f7b7eab2e2fb4f9ad7780e7080548216831790557f911b47c524c1cd52a21b220640ef59d86bf5daadde6b874ab245c1faacb2b2a780548216831790557fc705be7996725582edaf66d047b889c8f9074f3192daa16d89d4495de03cc72680548216831790557f809b96296df283d9dcb0657940e73cdfa324a61f68c23c9540827d2fb96ee6ab80548216831790557f8c4df42239aef1bc03dad3a24b854431223979e761274270b38cdf2f42d0d94080548216831790557f7688c7413160e7fe2871706b93068dfab7580dc46d37fe96084a56205cf03c3b80548216831790557f3d71a2f9f27252340310d6dee439685725b969104f4f079e7d7cecc923fd100280548216831790557fe66afa0720a6eef769ccbb1d499d538482334f3f7859137f30ac048978a75a2380548216831790557fa7a6a675248fa67e90df3efd9e4df2c999560c90a705129054239796b688d8d480548216831790557fe6cd72f8327f5178e40045685a540c3cde27019dd9248236ded522a28293fe2d80548216831790557f6e5d95a934f2d1157fb7ea429bc636b8cd93911a45db30c1da7e18cde2b0910280548216831790557f8b2947e08cbfde1f231f2c70c0b667284f1568118b674f86d3cea695c872270180548216831790557fca587e084b3688561afb43f9d26668086806cd942b359eaffce528e3bb9e69c580548216831790557f1e3c957af9abf5bc2d0a9c88e7698ce1419230f3b6f08f1489aeb70d5699195d80548216831790557f6e1b256b16275144c4aa3bb755fd4af9696b3b67381cb709adfd38b540ed629480548216831790557ffeabacae896302973f7686e36b8111d58566e92ce1ef45ddf9f05545cc21a81e80548216831790557fbc7137cce856a8a3cced029a6cfe0217fc0065116e5f5bf17a84215ecd6225b280548216831790557ff6175a0483eed18a5fbf86189dcc5630187c4c669ecacafa0f535c655ec2133980548216831790557fb36a3486a2be18f3c6e05289d5c1b9bf13eda08e4a8340f534c9c0a26fae737e80548216831790557f10cafe2223200d2f28496943b826a8da664ad650a71dc5d9e1f4f9c628d7ea8280548216831790557f3d33ba807eb8fbf54555c34b5f355cb2a7f068f8371d2928d0a270679b3328f580548216831790557f3fa7a1b4ab75025f9403b9df9f9110f44ac92183010446e0718b423383add79980548216831790557f0414115400bc48c0f501bdf2a46782ed5fd452a2e2d5379db08e0ea175bb1177805482168317905573117e53e814bf3a70f61a5bb168a21e4564ede1796000527fce6fca067260d700facc88e524d8a12b38679ce3786280ad8bdd07e44e5fb43e80549091169091179055565b5050506200432a565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620041ef90620042ed565b90600052602060002090601f0160209004810192826200421357600085556200425e565b82601f106200422e57805160ff19168380011785556200425e565b828001600101855582156200425e579182015b828111156200425e57825182559160200191906001019062004241565b506200426c92915062004270565b5090565b5b808211156200426c576000815560010162004271565b80516001600160a01b03811681146200429f57600080fd5b919050565b600080600060608486031215620042b9578283fd5b620042c48462004287565b9250620042d46020850162004287565b9150620042e46040850162004287565b90509250925092565b600181811c908216806200430257607f821691505b602082108114156200432457634e487b7160e01b600052602260045260246000fd5b50919050565b612b5d806200433a6000396000f3fe6080604052600436106102665760003560e01c80638746b4e011610144578063b7ecbaae116100b6578063d5abeb011161007a578063d5abeb011461072f578063d91f1ad414610751578063daaeec8614610766578063e985e9c51461077b578063f2fde38b146107c4578063ff186b2e146107e457600080fd5b8063b7ecbaae1461069a578063b88d4fde146106ba578063b8eb3546146106da578063be6da4b1146106fc578063c87b56dd1461070f57600080fd5b806395f4f7d41161010857806395f4f7d4146105e657806397304ced146106065780639748ecb61461061957806398076ede14610639578063a22cb46514610659578063a9898fd91461067957600080fd5b80638746b4e0146105545780638da5cb5b1461057457806390a39b9b1461059257806394a7ef15146105b157806395d89b41146105d157600080fd5b80632f745c59116101dd57806355f804b3116101a157806355f804b3146104a95780635c335513146104c957806361eb605d146104df5780636352211e146104ff57806370a082311461051f578063715018a61461053f57600080fd5b80632f745c59146103ff5780633ccfd60b1461041f57806342842e0e146104345780634435da94146104545780634f6ccce71461048957600080fd5b8063130789481161022f578063130789481461033c57806318160ddd1461037157806322f3e2d41461039057806323b872dd146103aa57806327ac36c4146103ca5780632c8184a2146103df57600080fd5b806249e5ad1461026b57806301ffc9a71461028d57806306fdde03146102c2578063081812fc146102e4578063095ea7b31461031c575b600080fd5b34801561027757600080fd5b5061028b61028636600461255a565b6107fa565b005b34801561029957600080fd5b506102ad6102a836600461276c565b61084f565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102d761087a565b6040516102b991906128bb565b3480156102f057600080fd5b506103046102ff3660046127ea565b61090c565b6040516001600160a01b0390911681526020016102b9565b34801561032857600080fd5b5061028b610337366004612694565b6109a1565b34801561034857600080fd5b50600d5461035e90600160401b900461ffff1681565b60405161ffff90911681526020016102b9565b34801561037d57600080fd5b506008545b6040519081526020016102b9565b34801561039c57600080fd5b50600d546102ad9060ff1681565b3480156103b657600080fd5b5061028b6103c53660046125a6565b610ab7565b3480156103d657600080fd5b5061028b610ae8565b3480156103eb57600080fd5b5061028b6103fa366004612802565b610be4565b34801561040b57600080fd5b5061038261041a366004612694565b610c32565b34801561042b57600080fd5b5061028b610cc8565b34801561044057600080fd5b5061028b61044f3660046125a6565b610d58565b34801561046057600080fd5b50600d546104779065010000000000900460ff1681565b60405160ff90911681526020016102b9565b34801561049557600080fd5b506103826104a43660046127ea565b610d73565b3480156104b557600080fd5b5061028b6104c43660046127a4565b610e14565b3480156104d557600080fd5b50610382600c5481565b3480156104eb57600080fd5b50600d546102ad9062010000900460ff1681565b34801561050b57600080fd5b5061030461051a3660046127ea565b610e55565b34801561052b57600080fd5b5061038261053a36600461255a565b610ecc565b34801561054b57600080fd5b5061028b610f53565b34801561056057600080fd5b5061028b61056f36600461255a565b610f89565b34801561058057600080fd5b50600a546001600160a01b0316610304565b34801561059e57600080fd5b50600d546102ad90610100900460ff1681565b3480156105bd57600080fd5b5061028b6105cc36600461255a565b610ff4565b3480156105dd57600080fd5b506102d7611042565b3480156105f257600080fd5b5061028b61060136600461255a565b611051565b61028b6106143660046127ea565b61109d565b34801561062557600080fd5b5061028b610634366004612802565b61126c565b34801561064557600080fd5b5061028b6106543660046126bd565b6112b8565b34801561066557600080fd5b5061028b61067436600461265a565b611358565b34801561068557600080fd5b50600d54610477906301000000900460ff1681565b3480156106a657600080fd5b5061028b6106b536600461255a565b611363565b3480156106c657600080fd5b5061028b6106d53660046125e1565b6113ae565b3480156106e657600080fd5b50600d5461047790640100000000900460ff1681565b61028b61070a3660046127ea565b6113e6565b34801561071b57600080fd5b506102d761072a3660046127ea565b611645565b34801561073b57600080fd5b50600d5461035e90600160301b900461ffff1681565b34801561075d57600080fd5b5061028b611720565b34801561077257600080fd5b5061028b611767565b34801561078757600080fd5b506102ad610796366004612574565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107d057600080fd5b5061028b6107df36600461255a565b6117a5565b3480156107f057600080fd5b50610382600b5481565b600a546001600160a01b0316331461082d5760405162461bcd60e51b815260040161082490612920565b60405180910390fd5b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b0319821663780e9d6360e01b148061087457506108748261183d565b92915050565b60606000805461088990612a65565b80601f01602080910402602001604051908101604052809291908181526020018280546108b590612a65565b80156109025780601f106108d757610100808354040283529160200191610902565b820191906000526020600020905b8154815290600101906020018083116108e557829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109855760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610824565b506000908152600460205260409020546001600160a01b031690565b60006109ac82610e55565b9050806001600160a01b0316836001600160a01b03161415610a1a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610824565b336001600160a01b0382161480610a365750610a368133610796565b610aa85760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610824565b610ab2838361188d565b505050565b610ac133826118fb565b610add5760405162461bcd60e51b815260040161082490612955565b610ab28383836119f2565b600a546001600160a01b03163314610b125760405162461bcd60e51b815260040161082490612920565b600d5462010000900460ff1615610b5d5760405162461bcd60e51b815260206004820152600f60248201526e151bdad95b9cc81c995cd95c9d9959608a1b6044820152606401610824565b6000610b6860085490565b905060005b600d546301000000900460ff16811015610ba657610b9433610b8f83856129d7565b611b9d565b80610b9e81612aa0565b915050610b6d565b5050600d805462ff00001916620100001790556040517ffaf3f41ea35a400568360902f791821569be418844cb8bb6481a690b29e8a20990600090a1565b600a546001600160a01b03163314610c0e5760405162461bcd60e51b815260040161082490612920565b600d805460ff909216650100000000000265ff000000000019909216919091179055565b6000610c3d83610ecc565b8210610c9f5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610824565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610cf25760405162461bcd60e51b815260040161082490612920565b6000610cff6014476129ef565b600d54909150610d2990600160501b90046001600160a01b0316610d24836012612a03565b611bb7565b600e54610d3f906001600160a01b031682611bb7565b600f54610d55906001600160a01b031682611bb7565b50565b610ab2838383604051806020016040528060008152506113ae565b6000610d7e60085490565b8210610de15760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610824565b60088281548110610e0257634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600a546001600160a01b03163314610e3e5760405162461bcd60e51b815260040161082490612920565b8051610e5190601190602084019061244d565b5050565b6000818152600260205260408120546001600160a01b0316806108745760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610824565b60006001600160a01b038216610f375760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610824565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610f7d5760405162461bcd60e51b815260040161082490612920565b610f876000611cd0565b565b600a546001600160a01b03163314610fb35760405162461bcd60e51b815260040161082490612920565b600d80546001600160a01b03909216600160501b027fffff0000000000000000000000000000000000000000ffffffffffffffffffff909216919091179055565b600a546001600160a01b0316331461101e5760405162461bcd60e51b815260040161082490612920565b6001600160a01b03166000908152601060205260409020805460ff19166001179055565b60606001805461088990612a65565b600a546001600160a01b0316331461107b5760405162461bcd60e51b815260040161082490612920565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b600d5460ff166110e45760405162461bcd60e51b815260206004820152601260248201527153616c65206973206e6f742061637469766560701b6044820152606401610824565b600d54640100000000900460ff168111156111595760405162461bcd60e51b815260206004820152602f60248201527f45786365656473206d6178206e756d626572206f6620546f6b656e7320696e2060448201526e37b732903a3930b739b0b1ba34b7b760891b6064820152608401610824565b600d5461ffff600160301b909104168161117260085490565b61117c91906129d7565b11156111ca5760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c796044820152606401610824565b3481600b546111d99190612a03565b146112265760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610824565b6000805b82811015610ab257600854600d54600854919350600160301b900461ffff16111561125a5761125a335b83611b9d565b8061126481612aa0565b91505061122a565b600a546001600160a01b031633146112965760405162461bcd60e51b815260040161082490612920565b600d805460ff9092166401000000000264ff0000000019909216919091179055565b600a546001600160a01b031633146112e25760405162461bcd60e51b815260040161082490612920565b60005b8151811015610e515760016010600084848151811061131457634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061135081612aa0565b9150506112e5565b610e51338383611d22565b600a546001600160a01b0316331461138d5760405162461bcd60e51b815260040161082490612920565b6001600160a01b03166000908152601060205260409020805460ff19169055565b6113b833836118fb565b6113d45760405162461bcd60e51b815260040161082490612955565b6113e084848484611df1565b50505050565b600d54610100900460ff166114355760405162461bcd60e51b815260206004820152601560248201527450726573616c65206973206e6f742061637469766560581b6044820152606401610824565b3360009081526010602052604090205460ff1615156001146114995760405162461bcd60e51b815260206004820152601a60248201527f41646472657373206973206e6f742077686974656c69737465640000000000006044820152606401610824565b600d5465010000000000900460ff16816114b233610ecc565b6114bc91906129d7565b11156115235760405162461bcd60e51b815260206004820152603060248201527f45786365656473206d6178206e756d626572206f662070726573616c6520546f60448201526f6b656e7320666f72206164647265737360801b6064820152608401610824565b600d5461ffff600160401b909104168161153c60085490565b61154691906129d7565b11156115a55760405162461bcd60e51b815260206004820152602860248201527f507572636861736520776f756c6420657863656564206d61782070726573616c6044820152676520737570706c7960c01b6064820152608401610824565b3481600c546115b49190612a03565b146116015760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610824565b6000805b82811015610ab257600854600d54600854919350600160301b900461ffff1611156116335761163333611254565b8061163d81612aa0565b915050611605565b6000818152600260205260409020546060906001600160a01b03166116c45760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610824565b60006116ce611e24565b905060008151116116ee5760405180602001604052806000815250611719565b806116f884611e33565b60405160200161170992919061284f565b6040516020818303038152906040525b9392505050565b600a546001600160a01b0316331461174a5760405162461bcd60e51b815260040161082490612920565b600d805461ff001981166101009182900460ff1615909102179055565b600a546001600160a01b031633146117915760405162461bcd60e51b815260040161082490612920565b600d805460ff19811660ff90911615179055565b600a546001600160a01b031633146117cf5760405162461bcd60e51b815260040161082490612920565b6001600160a01b0381166118345760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610824565b610d5581611cd0565b60006001600160e01b031982166380ac58cd60e01b148061186e57506001600160e01b03198216635b5e139f60e01b145b8061087457506301ffc9a760e01b6001600160e01b0319831614610874565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906118c282610e55565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166119745760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610824565b600061197f83610e55565b9050806001600160a01b0316846001600160a01b031614806119ba5750836001600160a01b03166119af8461090c565b6001600160a01b0316145b806119ea57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611a0582610e55565b6001600160a01b031614611a6d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610824565b6001600160a01b038216611acf5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610824565b611ada838383611f4d565b611ae560008261188d565b6001600160a01b0383166000908152600360205260408120805460019290611b0e908490612a22565b90915550506001600160a01b0382166000908152600360205260408120805460019290611b3c9084906129d7565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610e51828260405180602001604052806000815250612005565b80471015611c075760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610824565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611c54576040519150601f19603f3d011682016040523d82523d6000602084013e611c59565b606091505b5050905080610ab25760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610824565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611d845760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610824565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611dfc8484846119f2565b611e0884848484612038565b6113e05760405162461bcd60e51b8152600401610824906128ce565b60606011805461088990612a65565b606081611e575750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611e815780611e6b81612aa0565b9150611e7a9050600a836129ef565b9150611e5b565b60008167ffffffffffffffff811115611eaa57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611ed4576020820181803683370190505b5090505b84156119ea57611ee9600183612a22565b9150611ef6600a86612abb565b611f019060306129d7565b60f81b818381518110611f2457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611f46600a866129ef565b9450611ed8565b6001600160a01b038316611fa857611fa381600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611fcb565b816001600160a01b0316836001600160a01b031614611fcb57611fcb8382612145565b6001600160a01b038216611fe257610ab2816121e2565b826001600160a01b0316826001600160a01b031614610ab257610ab282826122bb565b61200f83836122ff565b61201c6000848484612038565b610ab25760405162461bcd60e51b8152600401610824906128ce565b60006001600160a01b0384163b1561213a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061207c90339089908890889060040161287e565b602060405180830381600087803b15801561209657600080fd5b505af19250505080156120c6575060408051601f3d908101601f191682019092526120c391810190612788565b60015b612120573d8080156120f4576040519150601f19603f3d011682016040523d82523d6000602084013e6120f9565b606091505b5080516121185760405162461bcd60e51b8152600401610824906128ce565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506119ea565b506001949350505050565b6000600161215284610ecc565b61215c9190612a22565b6000838152600760205260409020549091508082146121af576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906121f490600190612a22565b6000838152600960205260408120546008805493945090928490811061222a57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061225957634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061229f57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006122c683610ecc565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166123555760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610824565b6000818152600260205260409020546001600160a01b0316156123ba5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610824565b6123c660008383611f4d565b6001600160a01b03821660009081526003602052604081208054600192906123ef9084906129d7565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461245990612a65565b90600052602060002090601f01602090048101928261247b57600085556124c1565b82601f1061249457805160ff19168380011785556124c1565b828001600101855582156124c1579182015b828111156124c15782518255916020019190600101906124a6565b506124cd9291506124d1565b5090565b5b808211156124cd57600081556001016124d2565b600067ffffffffffffffff83111561250057612500612afb565b612513601f8401601f19166020016129a6565b905082815283838301111561252757600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461255557600080fd5b919050565b60006020828403121561256b578081fd5b6117198261253e565b60008060408385031215612586578081fd5b61258f8361253e565b915061259d6020840161253e565b90509250929050565b6000806000606084860312156125ba578081fd5b6125c38461253e565b92506125d16020850161253e565b9150604084013590509250925092565b600080600080608085870312156125f6578081fd5b6125ff8561253e565b935061260d6020860161253e565b925060408501359150606085013567ffffffffffffffff81111561262f578182fd5b8501601f8101871361263f578182fd5b61264e878235602084016124e6565b91505092959194509250565b6000806040838503121561266c578182fd5b6126758361253e565b915060208301358015158114612689578182fd5b809150509250929050565b600080604083850312156126a6578182fd5b6126af8361253e565b946020939093013593505050565b600060208083850312156126cf578182fd5b823567ffffffffffffffff808211156126e6578384fd5b818501915085601f8301126126f9578384fd5b81358181111561270b5761270b612afb565b8060051b915061271c8483016129a6565b8181528481019084860184860187018a1015612736578788fd5b8795505b8386101561275f5761274b8161253e565b83526001959095019491860191860161273a565b5098975050505050505050565b60006020828403121561277d578081fd5b813561171981612b11565b600060208284031215612799578081fd5b815161171981612b11565b6000602082840312156127b5578081fd5b813567ffffffffffffffff8111156127cb578182fd5b8201601f810184136127db578182fd5b6119ea848235602084016124e6565b6000602082840312156127fb578081fd5b5035919050565b600060208284031215612813578081fd5b813560ff81168114611719578182fd5b6000815180845261283b816020860160208601612a39565b601f01601f19169290920160200192915050565b60008351612861818460208801612a39565b835190830190612875818360208801612a39565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906128b190830184612823565b9695505050505050565b6020815260006117196020830184612823565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff811182821017156129cf576129cf612afb565b604052919050565b600082198211156129ea576129ea612acf565b500190565b6000826129fe576129fe612ae5565b500490565b6000816000190483118215151615612a1d57612a1d612acf565b500290565b600082821015612a3457612a34612acf565b500390565b60005b83811015612a54578181015183820152602001612a3c565b838111156113e05750506000910152565b600181811c90821680612a7957607f821691505b60208210811415612a9a57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612ab457612ab4612acf565b5060010190565b600082612aca57612aca612ae5565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610d5557600080fdfea2646970667358221220023376f58f391d46e0163f45f4916bad5beaf465abcca1c02118584f9a55e39364736f6c63430008040033000000000000000000000000c0d542d46d5bbd0589a1832d09108d739f83b260000000000000000000000000da30332e59525e4fdff1a32c105a61108c9b0dca0000000000000000000000009c8447bdb963740278a7dd7629c1ee96449de440

Deployed Bytecode

0x6080604052600436106102665760003560e01c80638746b4e011610144578063b7ecbaae116100b6578063d5abeb011161007a578063d5abeb011461072f578063d91f1ad414610751578063daaeec8614610766578063e985e9c51461077b578063f2fde38b146107c4578063ff186b2e146107e457600080fd5b8063b7ecbaae1461069a578063b88d4fde146106ba578063b8eb3546146106da578063be6da4b1146106fc578063c87b56dd1461070f57600080fd5b806395f4f7d41161010857806395f4f7d4146105e657806397304ced146106065780639748ecb61461061957806398076ede14610639578063a22cb46514610659578063a9898fd91461067957600080fd5b80638746b4e0146105545780638da5cb5b1461057457806390a39b9b1461059257806394a7ef15146105b157806395d89b41146105d157600080fd5b80632f745c59116101dd57806355f804b3116101a157806355f804b3146104a95780635c335513146104c957806361eb605d146104df5780636352211e146104ff57806370a082311461051f578063715018a61461053f57600080fd5b80632f745c59146103ff5780633ccfd60b1461041f57806342842e0e146104345780634435da94146104545780634f6ccce71461048957600080fd5b8063130789481161022f578063130789481461033c57806318160ddd1461037157806322f3e2d41461039057806323b872dd146103aa57806327ac36c4146103ca5780632c8184a2146103df57600080fd5b806249e5ad1461026b57806301ffc9a71461028d57806306fdde03146102c2578063081812fc146102e4578063095ea7b31461031c575b600080fd5b34801561027757600080fd5b5061028b61028636600461255a565b6107fa565b005b34801561029957600080fd5b506102ad6102a836600461276c565b61084f565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102d761087a565b6040516102b991906128bb565b3480156102f057600080fd5b506103046102ff3660046127ea565b61090c565b6040516001600160a01b0390911681526020016102b9565b34801561032857600080fd5b5061028b610337366004612694565b6109a1565b34801561034857600080fd5b50600d5461035e90600160401b900461ffff1681565b60405161ffff90911681526020016102b9565b34801561037d57600080fd5b506008545b6040519081526020016102b9565b34801561039c57600080fd5b50600d546102ad9060ff1681565b3480156103b657600080fd5b5061028b6103c53660046125a6565b610ab7565b3480156103d657600080fd5b5061028b610ae8565b3480156103eb57600080fd5b5061028b6103fa366004612802565b610be4565b34801561040b57600080fd5b5061038261041a366004612694565b610c32565b34801561042b57600080fd5b5061028b610cc8565b34801561044057600080fd5b5061028b61044f3660046125a6565b610d58565b34801561046057600080fd5b50600d546104779065010000000000900460ff1681565b60405160ff90911681526020016102b9565b34801561049557600080fd5b506103826104a43660046127ea565b610d73565b3480156104b557600080fd5b5061028b6104c43660046127a4565b610e14565b3480156104d557600080fd5b50610382600c5481565b3480156104eb57600080fd5b50600d546102ad9062010000900460ff1681565b34801561050b57600080fd5b5061030461051a3660046127ea565b610e55565b34801561052b57600080fd5b5061038261053a36600461255a565b610ecc565b34801561054b57600080fd5b5061028b610f53565b34801561056057600080fd5b5061028b61056f36600461255a565b610f89565b34801561058057600080fd5b50600a546001600160a01b0316610304565b34801561059e57600080fd5b50600d546102ad90610100900460ff1681565b3480156105bd57600080fd5b5061028b6105cc36600461255a565b610ff4565b3480156105dd57600080fd5b506102d7611042565b3480156105f257600080fd5b5061028b61060136600461255a565b611051565b61028b6106143660046127ea565b61109d565b34801561062557600080fd5b5061028b610634366004612802565b61126c565b34801561064557600080fd5b5061028b6106543660046126bd565b6112b8565b34801561066557600080fd5b5061028b61067436600461265a565b611358565b34801561068557600080fd5b50600d54610477906301000000900460ff1681565b3480156106a657600080fd5b5061028b6106b536600461255a565b611363565b3480156106c657600080fd5b5061028b6106d53660046125e1565b6113ae565b3480156106e657600080fd5b50600d5461047790640100000000900460ff1681565b61028b61070a3660046127ea565b6113e6565b34801561071b57600080fd5b506102d761072a3660046127ea565b611645565b34801561073b57600080fd5b50600d5461035e90600160301b900461ffff1681565b34801561075d57600080fd5b5061028b611720565b34801561077257600080fd5b5061028b611767565b34801561078757600080fd5b506102ad610796366004612574565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107d057600080fd5b5061028b6107df36600461255a565b6117a5565b3480156107f057600080fd5b50610382600b5481565b600a546001600160a01b0316331461082d5760405162461bcd60e51b815260040161082490612920565b60405180910390fd5b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b0319821663780e9d6360e01b148061087457506108748261183d565b92915050565b60606000805461088990612a65565b80601f01602080910402602001604051908101604052809291908181526020018280546108b590612a65565b80156109025780601f106108d757610100808354040283529160200191610902565b820191906000526020600020905b8154815290600101906020018083116108e557829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109855760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610824565b506000908152600460205260409020546001600160a01b031690565b60006109ac82610e55565b9050806001600160a01b0316836001600160a01b03161415610a1a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610824565b336001600160a01b0382161480610a365750610a368133610796565b610aa85760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610824565b610ab2838361188d565b505050565b610ac133826118fb565b610add5760405162461bcd60e51b815260040161082490612955565b610ab28383836119f2565b600a546001600160a01b03163314610b125760405162461bcd60e51b815260040161082490612920565b600d5462010000900460ff1615610b5d5760405162461bcd60e51b815260206004820152600f60248201526e151bdad95b9cc81c995cd95c9d9959608a1b6044820152606401610824565b6000610b6860085490565b905060005b600d546301000000900460ff16811015610ba657610b9433610b8f83856129d7565b611b9d565b80610b9e81612aa0565b915050610b6d565b5050600d805462ff00001916620100001790556040517ffaf3f41ea35a400568360902f791821569be418844cb8bb6481a690b29e8a20990600090a1565b600a546001600160a01b03163314610c0e5760405162461bcd60e51b815260040161082490612920565b600d805460ff909216650100000000000265ff000000000019909216919091179055565b6000610c3d83610ecc565b8210610c9f5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610824565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610cf25760405162461bcd60e51b815260040161082490612920565b6000610cff6014476129ef565b600d54909150610d2990600160501b90046001600160a01b0316610d24836012612a03565b611bb7565b600e54610d3f906001600160a01b031682611bb7565b600f54610d55906001600160a01b031682611bb7565b50565b610ab2838383604051806020016040528060008152506113ae565b6000610d7e60085490565b8210610de15760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610824565b60088281548110610e0257634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600a546001600160a01b03163314610e3e5760405162461bcd60e51b815260040161082490612920565b8051610e5190601190602084019061244d565b5050565b6000818152600260205260408120546001600160a01b0316806108745760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610824565b60006001600160a01b038216610f375760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610824565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610f7d5760405162461bcd60e51b815260040161082490612920565b610f876000611cd0565b565b600a546001600160a01b03163314610fb35760405162461bcd60e51b815260040161082490612920565b600d80546001600160a01b03909216600160501b027fffff0000000000000000000000000000000000000000ffffffffffffffffffff909216919091179055565b600a546001600160a01b0316331461101e5760405162461bcd60e51b815260040161082490612920565b6001600160a01b03166000908152601060205260409020805460ff19166001179055565b60606001805461088990612a65565b600a546001600160a01b0316331461107b5760405162461bcd60e51b815260040161082490612920565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b600d5460ff166110e45760405162461bcd60e51b815260206004820152601260248201527153616c65206973206e6f742061637469766560701b6044820152606401610824565b600d54640100000000900460ff168111156111595760405162461bcd60e51b815260206004820152602f60248201527f45786365656473206d6178206e756d626572206f6620546f6b656e7320696e2060448201526e37b732903a3930b739b0b1ba34b7b760891b6064820152608401610824565b600d5461ffff600160301b909104168161117260085490565b61117c91906129d7565b11156111ca5760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c796044820152606401610824565b3481600b546111d99190612a03565b146112265760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610824565b6000805b82811015610ab257600854600d54600854919350600160301b900461ffff16111561125a5761125a335b83611b9d565b8061126481612aa0565b91505061122a565b600a546001600160a01b031633146112965760405162461bcd60e51b815260040161082490612920565b600d805460ff9092166401000000000264ff0000000019909216919091179055565b600a546001600160a01b031633146112e25760405162461bcd60e51b815260040161082490612920565b60005b8151811015610e515760016010600084848151811061131457634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061135081612aa0565b9150506112e5565b610e51338383611d22565b600a546001600160a01b0316331461138d5760405162461bcd60e51b815260040161082490612920565b6001600160a01b03166000908152601060205260409020805460ff19169055565b6113b833836118fb565b6113d45760405162461bcd60e51b815260040161082490612955565b6113e084848484611df1565b50505050565b600d54610100900460ff166114355760405162461bcd60e51b815260206004820152601560248201527450726573616c65206973206e6f742061637469766560581b6044820152606401610824565b3360009081526010602052604090205460ff1615156001146114995760405162461bcd60e51b815260206004820152601a60248201527f41646472657373206973206e6f742077686974656c69737465640000000000006044820152606401610824565b600d5465010000000000900460ff16816114b233610ecc565b6114bc91906129d7565b11156115235760405162461bcd60e51b815260206004820152603060248201527f45786365656473206d6178206e756d626572206f662070726573616c6520546f60448201526f6b656e7320666f72206164647265737360801b6064820152608401610824565b600d5461ffff600160401b909104168161153c60085490565b61154691906129d7565b11156115a55760405162461bcd60e51b815260206004820152602860248201527f507572636861736520776f756c6420657863656564206d61782070726573616c6044820152676520737570706c7960c01b6064820152608401610824565b3481600c546115b49190612a03565b146116015760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610824565b6000805b82811015610ab257600854600d54600854919350600160301b900461ffff1611156116335761163333611254565b8061163d81612aa0565b915050611605565b6000818152600260205260409020546060906001600160a01b03166116c45760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610824565b60006116ce611e24565b905060008151116116ee5760405180602001604052806000815250611719565b806116f884611e33565b60405160200161170992919061284f565b6040516020818303038152906040525b9392505050565b600a546001600160a01b0316331461174a5760405162461bcd60e51b815260040161082490612920565b600d805461ff001981166101009182900460ff1615909102179055565b600a546001600160a01b031633146117915760405162461bcd60e51b815260040161082490612920565b600d805460ff19811660ff90911615179055565b600a546001600160a01b031633146117cf5760405162461bcd60e51b815260040161082490612920565b6001600160a01b0381166118345760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610824565b610d5581611cd0565b60006001600160e01b031982166380ac58cd60e01b148061186e57506001600160e01b03198216635b5e139f60e01b145b8061087457506301ffc9a760e01b6001600160e01b0319831614610874565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906118c282610e55565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166119745760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610824565b600061197f83610e55565b9050806001600160a01b0316846001600160a01b031614806119ba5750836001600160a01b03166119af8461090c565b6001600160a01b0316145b806119ea57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611a0582610e55565b6001600160a01b031614611a6d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610824565b6001600160a01b038216611acf5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610824565b611ada838383611f4d565b611ae560008261188d565b6001600160a01b0383166000908152600360205260408120805460019290611b0e908490612a22565b90915550506001600160a01b0382166000908152600360205260408120805460019290611b3c9084906129d7565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610e51828260405180602001604052806000815250612005565b80471015611c075760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610824565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611c54576040519150601f19603f3d011682016040523d82523d6000602084013e611c59565b606091505b5050905080610ab25760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610824565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611d845760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610824565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611dfc8484846119f2565b611e0884848484612038565b6113e05760405162461bcd60e51b8152600401610824906128ce565b60606011805461088990612a65565b606081611e575750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611e815780611e6b81612aa0565b9150611e7a9050600a836129ef565b9150611e5b565b60008167ffffffffffffffff811115611eaa57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611ed4576020820181803683370190505b5090505b84156119ea57611ee9600183612a22565b9150611ef6600a86612abb565b611f019060306129d7565b60f81b818381518110611f2457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611f46600a866129ef565b9450611ed8565b6001600160a01b038316611fa857611fa381600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611fcb565b816001600160a01b0316836001600160a01b031614611fcb57611fcb8382612145565b6001600160a01b038216611fe257610ab2816121e2565b826001600160a01b0316826001600160a01b031614610ab257610ab282826122bb565b61200f83836122ff565b61201c6000848484612038565b610ab25760405162461bcd60e51b8152600401610824906128ce565b60006001600160a01b0384163b1561213a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061207c90339089908890889060040161287e565b602060405180830381600087803b15801561209657600080fd5b505af19250505080156120c6575060408051601f3d908101601f191682019092526120c391810190612788565b60015b612120573d8080156120f4576040519150601f19603f3d011682016040523d82523d6000602084013e6120f9565b606091505b5080516121185760405162461bcd60e51b8152600401610824906128ce565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506119ea565b506001949350505050565b6000600161215284610ecc565b61215c9190612a22565b6000838152600760205260409020549091508082146121af576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906121f490600190612a22565b6000838152600960205260408120546008805493945090928490811061222a57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061225957634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061229f57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006122c683610ecc565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166123555760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610824565b6000818152600260205260409020546001600160a01b0316156123ba5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610824565b6123c660008383611f4d565b6001600160a01b03821660009081526003602052604081208054600192906123ef9084906129d7565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461245990612a65565b90600052602060002090601f01602090048101928261247b57600085556124c1565b82601f1061249457805160ff19168380011785556124c1565b828001600101855582156124c1579182015b828111156124c15782518255916020019190600101906124a6565b506124cd9291506124d1565b5090565b5b808211156124cd57600081556001016124d2565b600067ffffffffffffffff83111561250057612500612afb565b612513601f8401601f19166020016129a6565b905082815283838301111561252757600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461255557600080fd5b919050565b60006020828403121561256b578081fd5b6117198261253e565b60008060408385031215612586578081fd5b61258f8361253e565b915061259d6020840161253e565b90509250929050565b6000806000606084860312156125ba578081fd5b6125c38461253e565b92506125d16020850161253e565b9150604084013590509250925092565b600080600080608085870312156125f6578081fd5b6125ff8561253e565b935061260d6020860161253e565b925060408501359150606085013567ffffffffffffffff81111561262f578182fd5b8501601f8101871361263f578182fd5b61264e878235602084016124e6565b91505092959194509250565b6000806040838503121561266c578182fd5b6126758361253e565b915060208301358015158114612689578182fd5b809150509250929050565b600080604083850312156126a6578182fd5b6126af8361253e565b946020939093013593505050565b600060208083850312156126cf578182fd5b823567ffffffffffffffff808211156126e6578384fd5b818501915085601f8301126126f9578384fd5b81358181111561270b5761270b612afb565b8060051b915061271c8483016129a6565b8181528481019084860184860187018a1015612736578788fd5b8795505b8386101561275f5761274b8161253e565b83526001959095019491860191860161273a565b5098975050505050505050565b60006020828403121561277d578081fd5b813561171981612b11565b600060208284031215612799578081fd5b815161171981612b11565b6000602082840312156127b5578081fd5b813567ffffffffffffffff8111156127cb578182fd5b8201601f810184136127db578182fd5b6119ea848235602084016124e6565b6000602082840312156127fb578081fd5b5035919050565b600060208284031215612813578081fd5b813560ff81168114611719578182fd5b6000815180845261283b816020860160208601612a39565b601f01601f19169290920160200192915050565b60008351612861818460208801612a39565b835190830190612875818360208801612a39565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906128b190830184612823565b9695505050505050565b6020815260006117196020830184612823565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff811182821017156129cf576129cf612afb565b604052919050565b600082198211156129ea576129ea612acf565b500190565b6000826129fe576129fe612ae5565b500490565b6000816000190483118215151615612a1d57612a1d612acf565b500290565b600082821015612a3457612a34612acf565b500390565b60005b83811015612a54578181015183820152602001612a3c565b838111156113e05750506000910152565b600181811c90821680612a7957607f821691505b60208210811415612a9a57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612ab457612ab4612acf565b5060010190565b600082612aca57612aca612ae5565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610d5557600080fdfea2646970667358221220023376f58f391d46e0163f45f4916bad5beaf465abcca1c02118584f9a55e39364736f6c63430008040033

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

000000000000000000000000c0d542d46d5bbd0589a1832d09108d739f83b260000000000000000000000000da30332e59525e4fdff1a32c105a61108c9b0dca0000000000000000000000009c8447bdb963740278a7dd7629c1ee96449de440

-----Decoded View---------------
Arg [0] : t1_ (address): 0xC0D542D46D5bBD0589a1832d09108D739f83b260
Arg [1] : t2_ (address): 0xdA30332e59525e4FdFf1a32c105a61108c9B0Dca
Arg [2] : t3_ (address): 0x9C8447bdB963740278A7dD7629C1Ee96449dE440

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000c0d542d46d5bbd0589a1832d09108d739f83b260
Arg [1] : 000000000000000000000000da30332e59525e4fdff1a32c105a61108c9b0dca
Arg [2] : 0000000000000000000000009c8447bdb963740278a7dd7629c1ee96449de440


Deployed Bytecode Sourcemap

45108:37190:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49276:75;;;;;;;;;;-1:-1:-1;49276:75:0;;;;;:::i;:::-;;:::i;:::-;;36356:224;;;;;;;;;;-1:-1:-1;36356:224:0;;;;;:::i;:::-;;:::i;:::-;;;7088:14:1;;7081:22;7063:41;;7051:2;7036:18;36356:224:0;;;;;;;;22769:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24328:221::-;;;;;;;;;;-1:-1:-1;24328:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6386:32:1;;;6368:51;;6356:2;6341:18;24328:221:0;6323:102:1;23851:411:0;;;;;;;;;;-1:-1:-1;23851:411:0;;;;;:::i;:::-;;:::i;45586:37::-;;;;;;;;;;-1:-1:-1;45586:37:0;;;;-1:-1:-1;;;45586:37:0;;;;;;;;;18864:6:1;18852:19;;;18834:38;;18822:2;18807:18;45586:37:0;18789:89:1;36996:113:0;;;;;;;;;;-1:-1:-1;37084:10:0;:17;36996:113;;;19029:25:1;;;19017:2;19002:18;36996:113:0;18984:76:1;45329:28:0;;;;;;;;;;-1:-1:-1;45329:28:0;;;;;;;;25078:339;;;;;;;;;;-1:-1:-1;25078:339:0;;;;;:::i;:::-;;:::i;48341:207::-;;;;;;;;;;;;;:::i;48957:102::-;;;;;;;;;;-1:-1:-1;48957:102:0;;;;;:::i;:::-;;:::i;36664:256::-;;;;;;;;;;-1:-1:-1;36664:256:0;;;;;:::i;:::-;;:::i;49839:::-;;;;;;;;;;;;;:::i;25488:185::-;;;;;;;;;;-1:-1:-1;25488:185:0;;;;;:::i;:::-;;:::i;45511:31::-;;;;;;;;;;-1:-1:-1;45511:31:0;;;;;;;;;;;;;;19237:4:1;19225:17;;;19207:36;;19195:2;19180:18;45511:31:0;19162:87:1;37186:233:0;;;;;;;;;;-1:-1:-1;37186:233:0;;;;;:::i;:::-;;:::i;48599:103::-;;;;;;;;;;-1:-1:-1;48599:103:0;;;;;:::i;:::-;;:::i;45257:51::-;;;;;;;;;;;;;;;;45406:31;;;;;;;;;;-1:-1:-1;45406:31:0;;;;;;;;;;;22463:239;;;;;;;;;;-1:-1:-1;22463:239:0;;;;;:::i;:::-;;:::i;22193:208::-;;;;;;;;;;-1:-1:-1;22193:208:0;;;;;:::i;:::-;;:::i;44221:103::-;;;;;;;;;;;;;:::i;49130:75::-;;;;;;;;;;-1:-1:-1;49130:75:0;;;;;:::i;:::-;;:::i;43570:87::-;;;;;;;;;;-1:-1:-1;43643:6:0;;-1:-1:-1;;;;;43643:6:0;43570:87;;45364:35;;;;;;;;;;-1:-1:-1;45364:35:0;;;;;;;;;;;46156:135;;;;;;;;;;-1:-1:-1;46156:135:0;;;;;:::i;:::-;;:::i;22938:104::-;;;;;;;;;;;;;:::i;49422:75::-;;;;;;;;;;-1:-1:-1;49422:75:0;;;;;:::i;:::-;;:::i;46577:645::-;;;;;;:::i;:::-;;:::i;48779:88::-;;;;;;;;;;-1:-1:-1;48779:88:0;;;;;:::i;:::-;;:::i;46354:195::-;;;;;;;;;;-1:-1:-1;46354:195:0;;;;;:::i;:::-;;:::i;24621:155::-;;;;;;;;;;-1:-1:-1;24621:155:0;;;;;:::i;:::-;;:::i;45444:29::-;;;;;;;;;;-1:-1:-1;45444:29:0;;;;;;;;;;;48156:139;;;;;;;;;;-1:-1:-1;48156:139:0;;;;;:::i;:::-;;:::i;25744:328::-;;;;;;;;;;-1:-1:-1;25744:328:0;;;;;:::i;:::-;;:::i;45480:24::-;;;;;;;;;;-1:-1:-1;45480:24:0;;;;;;;;;;;47288:803;;;;;;:::i;:::-;;:::i;23113:334::-;;;;;;;;;;-1:-1:-1;23113:334:0;;;;;:::i;:::-;;:::i;45549:30::-;;;;;;;;;;-1:-1:-1;45549:30:0;;;;-1:-1:-1;;;45549:30:0;;;;;;49538:102;;;;;;;;;;;;;:::i;49683:85::-;;;;;;;;;;;;;:::i;24847:164::-;;;;;;;;;;-1:-1:-1;24847:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;24968:25:0;;;24944:4;24968:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24847:164;44479:201;;;;;;;;;;-1:-1:-1;44479:201:0;;;;;:::i;:::-;;:::i;45194:44::-;;;;;;;;;;;;;;;;49276:75;43643:6;;-1:-1:-1;;;;;43643:6:0;17131:10;43790:23;43782:68;;;;-1:-1:-1;;;43782:68:0;;;;;;;:::i;:::-;;;;;;;;;49334:3:::1;:9:::0;;-1:-1:-1;;;;;;49334:9:0::1;-1:-1:-1::0;;;;;49334:9:0;;;::::1;::::0;;;::::1;::::0;;49276:75::o;36356:224::-;36458:4;-1:-1:-1;;;;;;36482:50:0;;-1:-1:-1;;;36482:50:0;;:90;;;36536:36;36560:11;36536:23;:36::i;:::-;36475:97;36356:224;-1:-1:-1;;36356:224:0:o;22769:100::-;22823:13;22856:5;22849:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22769:100;:::o;24328:221::-;24404:7;27671:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27671:16:0;24424:73;;;;-1:-1:-1;;;24424:73:0;;14467:2:1;24424:73:0;;;14449:21:1;14506:2;14486:18;;;14479:30;14545:34;14525:18;;;14518:62;-1:-1:-1;;;14596:18:1;;;14589:42;14648:19;;24424:73:0;14439:234:1;24424:73:0;-1:-1:-1;24517:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24517:24:0;;24328:221::o;23851:411::-;23932:13;23948:23;23963:7;23948:14;:23::i;:::-;23932:39;;23996:5;-1:-1:-1;;;;;23990:11:0;:2;-1:-1:-1;;;;;23990:11:0;;;23982:57;;;;-1:-1:-1;;;23982:57:0;;16484:2:1;23982:57:0;;;16466:21:1;16523:2;16503:18;;;16496:30;16562:34;16542:18;;;16535:62;-1:-1:-1;;;16613:18:1;;;16606:31;16654:19;;23982:57:0;16456:223:1;23982:57:0;17131:10;-1:-1:-1;;;;;24074:21:0;;;;:62;;-1:-1:-1;24099:37:0;24116:5;17131:10;24847:164;:::i;24099:37::-;24052:168;;;;-1:-1:-1;;;24052:168:0;;12499:2:1;24052:168:0;;;12481:21:1;12538:2;12518:18;;;12511:30;12577:34;12557:18;;;12550:62;12648:26;12628:18;;;12621:54;12692:19;;24052:168:0;12471:246:1;24052:168:0;24233:21;24242:2;24246:7;24233:8;:21::i;:::-;23851:411;;;:::o;25078:339::-;25273:41;17131:10;25306:7;25273:18;:41::i;:::-;25265:103;;;;-1:-1:-1;;;25265:103:0;;;;;;;:::i;:::-;25381:28;25391:4;25397:2;25401:7;25381:9;:28::i;48341:207::-;43643:6;;-1:-1:-1;;;;;43643:6:0;17131:10;43790:23;43782:68;;;;-1:-1:-1;;;43782:68:0;;;;;;;:::i;:::-;82189:11:::1;::::0;;;::::1;;;82188:12;82180:40;;;::::0;-1:-1:-1;;;82180:40:0;;11384:2:1;82180:40:0::1;::::0;::::1;11366:21:1::0;11423:2;11403:18;;;11396:30;-1:-1:-1;;;11442:18:1;;;11435:45;11497:18;;82180:40:0::1;11356:165:1::0;82180:40:0::1;48406:11:::2;48420:13;37084:10:::0;:17;;36996:113;48420:13:::2;48406:27;;48449:6;48444:97;48461:11;::::0;;;::::2;;;48457:15:::0;::::2;48444:97;;;48494:35;17131:10:::0;48518::::2;48527:1:::0;48518:6;:10:::2;:::i;:::-;48494:9;:35::i;:::-;48474:3:::0;::::2;::::0;::::2;:::i;:::-;;;;48444:97;;;-1:-1:-1::0;;82243:11:0::1;:18:::0;;-1:-1:-1;;82243:18:0::1;::::0;::::1;::::0;;82277:10:::1;::::0;::::1;::::0;82243:18;;82277:10:::1;48341:207::o:0;48957:102::-;43643:6;;-1:-1:-1;;;;;43643:6:0;17131:10;43790:23;43782:68;;;;-1:-1:-1;;;43782:68:0;;;;;;;:::i;:::-;49028:14:::1;:23:::0;;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;49028:23:0;;::::1;::::0;;;::::1;::::0;;48957:102::o;36664:256::-;36761:7;36797:23;36814:5;36797:16;:23::i;:::-;36789:5;:31;36781:87;;;;-1:-1:-1;;;36781:87:0;;7541:2:1;36781:87:0;;;7523:21:1;7580:2;7560:18;;;7553:30;7619:34;7599:18;;;7592:62;-1:-1:-1;;;7670:18:1;;;7663:41;7721:19;;36781:87:0;7513:233:1;36781:87:0;-1:-1:-1;;;;;;36886:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;36664:256::o;49839:::-;43643:6;;-1:-1:-1;;;;;43643:6:0;17131:10;43790:23;43782:68;;;;-1:-1:-1;;;43782:68:0;;;;;;;:::i;:::-;49889:14:::1;49906:26;49930:2;49906:21;:26;:::i;:::-;49969:3;::::0;49889:43;;-1:-1:-1;49943:44:0::1;::::0;-1:-1:-1;;;49969:3:0;::::1;-1:-1:-1::0;;;;;49969:3:0::1;49975:11;49889:43:::0;49984:2:::1;49975:11;:::i;:::-;49943:17;:44::i;:::-;50024:3;::::0;49998:39:::1;::::0;-1:-1:-1;;;;;50024:3:0::1;50030:6:::0;49998:17:::1;:39::i;:::-;50074:3;::::0;50048:39:::1;::::0;-1:-1:-1;;;;;50074:3:0::1;50080:6:::0;50048:17:::1;:39::i;:::-;43861:1;49839:256::o:0;25488:185::-;25626:39;25643:4;25649:2;25653:7;25626:39;;;;;;;;;;;;:16;:39::i;37186:233::-;37261:7;37297:30;37084:10;:17;;36996:113;37297:30;37289:5;:38;37281:95;;;;-1:-1:-1;;;37281:95:0;;17304:2:1;37281:95:0;;;17286:21:1;17343:2;17323:18;;;17316:30;17382:34;17362:18;;;17355:62;-1:-1:-1;;;17433:18:1;;;17426:42;17485:19;;37281:95:0;17276:234:1;37281:95:0;37394:10;37405:5;37394:17;;;;;;-1:-1:-1;;;37394:17:0;;;;;;;;;;;;;;;;;37387:24;;37186:233;;;:::o;48599:103::-;43643:6;;-1:-1:-1;;;;;43643:6:0;17131:10;43790:23;43782:68;;;;-1:-1:-1;;;43782:68:0;;;;;;;:::i;:::-;48672:22;;::::1;::::0;:12:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;48599:103:::0;:::o;22463:239::-;22535:7;22571:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22571:16:0;22606:19;22598:73;;;;-1:-1:-1;;;22598:73:0;;13335:2:1;22598:73:0;;;13317:21:1;13374:2;13354:18;;;13347:30;13413:34;13393:18;;;13386:62;-1:-1:-1;;;13464:18:1;;;13457:39;13513:19;;22598:73:0;13307:231:1;22193:208:0;22265:7;-1:-1:-1;;;;;22293:19:0;;22285:74;;;;-1:-1:-1;;;22285:74:0;;12924:2:1;22285:74:0;;;12906:21:1;12963:2;12943:18;;;12936:30;13002:34;12982:18;;;12975:62;-1:-1:-1;;;13053:18:1;;;13046:40;13103:19;;22285:74:0;12896:232:1;22285:74:0;-1:-1:-1;;;;;;22377:16:0;;;;;:9;:16;;;;;;;22193:208::o;44221:103::-;43643:6;;-1:-1:-1;;;;;43643:6:0;17131:10;43790:23;43782:68;;;;-1:-1:-1;;;43782:68:0;;;;;;;:::i;:::-;44286:30:::1;44313:1;44286:18;:30::i;:::-;44221:103::o:0;49130:75::-;43643:6;;-1:-1:-1;;;;;43643:6:0;17131:10;43790:23;43782:68;;;;-1:-1:-1;;;43782:68:0;;;;;;;:::i;:::-;49188:3:::1;:9:::0;;-1:-1:-1;;;;;49188:9:0;;::::1;-1:-1:-1::0;;;49188:9:0::1;::::0;;;::::1;::::0;;;::::1;::::0;;49130:75::o;46156:135::-;43643:6;;-1:-1:-1;;;;;43643:6:0;17131:10;43790:23;43782:68;;;;-1:-1:-1;;;43782:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;46241:35:0::1;;::::0;;;:17:::1;:35;::::0;;;;:42;;-1:-1:-1;;46241:42:0::1;46279:4;46241:42;::::0;;46156:135::o;22938:104::-;22994:13;23027:7;23020:14;;;;;:::i;49422:75::-;43643:6;;-1:-1:-1;;;;;43643:6:0;17131:10;43790:23;43782:68;;;;-1:-1:-1;;;43782:68:0;;;;;;;:::i;:::-;49480:3:::1;:9:::0;;-1:-1:-1;;;;;;49480:9:0::1;-1:-1:-1::0;;;;;49480:9:0;;;::::1;::::0;;;::::1;::::0;;49422:75::o;46577:645::-;46654:8;;;;46646:39;;;;-1:-1:-1;;;46646:39:0;;10250:2:1;46646:39:0;;;10232:21:1;10289:2;10269:18;;;10262:30;-1:-1:-1;;;10308:18:1;;;10301:48;10366:18;;46646:39:0;10222:168:1;46646:39:0;46722:7;;;;;;;46704:25;;;46696:85;;;;-1:-1:-1;;;46696:85:0;;17717:2:1;46696:85:0;;;17699:21:1;17756:2;17736:18;;;17729:30;17795:34;17775:18;;;17768:62;-1:-1:-1;;;17846:18:1;;;17839:45;17901:19;;46696:85:0;17689:237:1;46696:85:0;46834:9;;;-1:-1:-1;;;46834:9:0;;;;46816:14;46800:13;37084:10;:17;;36996:113;46800:13;:30;;;;:::i;:::-;:43;;46792:88;;;;-1:-1:-1;;;46792:88:0;;13745:2:1;46792:88:0;;;13727:21:1;;;13764:18;;;13757:30;13823:34;13803:18;;;13796:62;13875:18;;46792:88:0;13717:182:1;46792:88:0;46928:9;46910:14;46899:8;;:25;;;;:::i;:::-;:38;46891:82;;;;-1:-1:-1;;;46891:82:0;;10597:2:1;46891:82:0;;;10579:21:1;10636:2;10616:18;;;10609:30;10675:33;10655:18;;;10648:61;10726:18;;46891:82:0;10569:181:1;46891:82:0;46986:14;47016:6;47011:204;47028:14;47024:1;:18;47011:204;;;37084:10;:17;47124:9;;37084:10;:17;47064:25;;-1:-1:-1;;;;47124:9:0;;;;-1:-1:-1;47104:100:0;;;47154:34;17131:10;47164:12;47178:9;47154;:34::i;:::-;47044:3;;;;:::i;:::-;;;;47011:204;;48779:88;43643:6;;-1:-1:-1;;;;;43643:6:0;17131:10;43790:23;43782:68;;;;-1:-1:-1;;;43782:68:0;;;;;;;:::i;:::-;48843:7:::1;:16:::0;;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;48843:16:0;;::::1;::::0;;;::::1;::::0;;48779:88::o;46354:195::-;43643:6;;-1:-1:-1;;;;;43643:6:0;17131:10;43790:23;43782:68;;;;-1:-1:-1;;;43782:68:0;;;;;;;:::i;:::-;46442:6:::1;46438:104;46454:9;:16;46450:1;:20;46438:104;;;46526:4;46492:17;:31;46510:9;46520:1;46510:12;;;;;;-1:-1:-1::0;;;46510:12:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;46492:31:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;46492:31:0;:38;;-1:-1:-1;;46492:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;46472:3;::::1;::::0;::::1;:::i;:::-;;;;46438:104;;24621:155:::0;24716:52;17131:10;24749:8;24759;24716:18;:52::i;48156:139::-;43643:6;;-1:-1:-1;;;;;43643:6:0;17131:10;43790:23;43782:68;;;;-1:-1:-1;;;43782:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48244:35:0::1;48282:5;48244:35:::0;;;:17:::1;:35;::::0;;;;:43;;-1:-1:-1;;48244:43:0::1;::::0;;48156:139::o;25744:328::-;25919:41;17131:10;25952:7;25919:18;:41::i;:::-;25911:103;;;;-1:-1:-1;;;25911:103:0;;;;;;;:::i;:::-;26025:39;26039:4;26045:2;26049:7;26058:5;26025:13;:39::i;:::-;25744:328;;;;:::o;47288:803::-;47372:15;;;;;;;47364:49;;;;-1:-1:-1;;;47364:49:0;;18133:2:1;47364:49:0;;;18115:21:1;18172:2;18152:18;;;18145:30;-1:-1:-1;;;18191:18:1;;;18184:51;18252:18;;47364:49:0;18105:171:1;47364:49:0;47450:10;47432:29;;;;:17;:29;;;;;;;;:37;;:29;:37;47424:76;;;;-1:-1:-1;;;47424:76:0;;9895:2:1;47424:76:0;;;9877:21:1;9934:2;9914:18;;;9907:30;9973:28;9953:18;;;9946:56;10019:18;;47424:76:0;9867:176:1;47424:76:0;47561:14;;;;;;;47543;47519:21;47529:10;47519:9;:21::i;:::-;:38;;;;:::i;:::-;:56;;47511:117;;;;-1:-1:-1;;;47511:117:0;;15241:2:1;47511:117:0;;;15223:21:1;15280:2;15260:18;;;15253:30;15319:34;15299:18;;;15292:62;-1:-1:-1;;;15370:18:1;;;15363:46;15426:19;;47511:117:0;15213:238:1;47511:117:0;47681:16;;;-1:-1:-1;;;47681:16:0;;;;47663:14;47647:13;37084:10;:17;;36996:113;47647:13;:30;;;;:::i;:::-;:50;;47639:103;;;;-1:-1:-1;;;47639:103:0;;18483:2:1;47639:103:0;;;18465:21:1;18522:2;18502:18;;;18495:30;18561:34;18541:18;;;18534:62;-1:-1:-1;;;18612:18:1;;;18605:38;18660:19;;47639:103:0;18455:230:1;47639:103:0;47797:9;47779:14;47761:15;;:32;;;;:::i;:::-;:45;47753:89;;;;-1:-1:-1;;;47753:89:0;;10597:2:1;47753:89:0;;;10579:21:1;10636:2;10616:18;;;10609:30;10675:33;10655:18;;;10648:61;10726:18;;47753:89:0;10569:181:1;47753:89:0;47855:14;47885:6;47880:204;47897:14;47893:1;:18;47880:204;;;37084:10;:17;47993:9;;37084:10;:17;47933:25;;-1:-1:-1;;;;47993:9:0;;;;-1:-1:-1;47973:100:0;;;48023:34;17131:10;48033:12;17051:98;48023:34;47913:3;;;;:::i;:::-;;;;47880:204;;23113:334;27647:4;27671:16;;;:7;:16;;;;;;23186:13;;-1:-1:-1;;;;;27671:16:0;23212:76;;;;-1:-1:-1;;;23212:76:0;;16068:2:1;23212:76:0;;;16050:21:1;16107:2;16087:18;;;16080:30;16146:34;16126:18;;;16119:62;-1:-1:-1;;;16197:18:1;;;16190:45;16252:19;;23212:76:0;16040:237:1;23212:76:0;23301:21;23325:10;:8;:10::i;:::-;23301:34;;23377:1;23359:7;23353:21;:25;:86;;;;;;;;;;;;;;;;;23405:7;23414:18;:7;:16;:18::i;:::-;23388:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23353:86;23346:93;23113:334;-1:-1:-1;;;23113:334:0:o;49538:102::-;43643:6;;-1:-1:-1;;;;;43643:6:0;17131:10;43790:23;43782:68;;;;-1:-1:-1;;;43782:68:0;;;;;;;:::i;:::-;49617:15:::1;::::0;;-1:-1:-1;;49598:34:0;::::1;49617:15;::::0;;;::::1;;;49616:16;49598:34:::0;;::::1;;::::0;;49538:102::o;49683:85::-;43643:6;;-1:-1:-1;;;;;43643:6:0;17131:10;43790:23;43782:68;;;;-1:-1:-1;;;43782:68:0;;;;;;;:::i;:::-;49752:8:::1;::::0;;-1:-1:-1;;49740:20:0;::::1;49752:8;::::0;;::::1;49751:9;49740:20;::::0;;49683:85::o;44479:201::-;43643:6;;-1:-1:-1;;;;;43643:6:0;17131:10;43790:23;43782:68;;;;-1:-1:-1;;;43782:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44568:22:0;::::1;44560:73;;;::::0;-1:-1:-1;;;44560:73:0;;8372:2:1;44560:73:0::1;::::0;::::1;8354:21:1::0;8411:2;8391:18;;;8384:30;8450:34;8430:18;;;8423:62;-1:-1:-1;;;8501:18:1;;;8494:36;8547:19;;44560:73:0::1;8344:228:1::0;44560:73:0::1;44644:28;44663:8;44644:18;:28::i;21824:305::-:0;21926:4;-1:-1:-1;;;;;;21963:40:0;;-1:-1:-1;;;21963:40:0;;:105;;-1:-1:-1;;;;;;;22020:48:0;;-1:-1:-1;;;22020:48:0;21963:105;:158;;;-1:-1:-1;;;;;;;;;;20373:40:0;;;22085:36;20264:157;31564:174;31639:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;31639:29:0;-1:-1:-1;;;;;31639:29:0;;;;;;;;:24;;31693:23;31639:24;31693:14;:23::i;:::-;-1:-1:-1;;;;;31684:46:0;;;;;;;;;;;31564:174;;:::o;27876:348::-;27969:4;27671:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27671:16:0;27986:73;;;;-1:-1:-1;;;27986:73:0;;12086:2:1;27986:73:0;;;12068:21:1;12125:2;12105:18;;;12098:30;12164:34;12144:18;;;12137:62;-1:-1:-1;;;12215:18:1;;;12208:42;12267:19;;27986:73:0;12058:234:1;27986:73:0;28070:13;28086:23;28101:7;28086:14;:23::i;:::-;28070:39;;28139:5;-1:-1:-1;;;;;28128:16:0;:7;-1:-1:-1;;;;;28128:16:0;;:51;;;;28172:7;-1:-1:-1;;;;;28148:31:0;:20;28160:7;28148:11;:20::i;:::-;-1:-1:-1;;;;;28148:31:0;;28128:51;:87;;;-1:-1:-1;;;;;;24968:25:0;;;24944:4;24968:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;28183:32;28120:96;27876:348;-1:-1:-1;;;;27876:348:0:o;30868:578::-;31027:4;-1:-1:-1;;;;;31000:31:0;:23;31015:7;31000:14;:23::i;:::-;-1:-1:-1;;;;;31000:31:0;;30992:85;;;;-1:-1:-1;;;30992:85:0;;15658:2:1;30992:85:0;;;15640:21:1;15697:2;15677:18;;;15670:30;15736:34;15716:18;;;15709:62;-1:-1:-1;;;15787:18:1;;;15780:39;15836:19;;30992:85:0;15630:231:1;30992:85:0;-1:-1:-1;;;;;31096:16:0;;31088:65;;;;-1:-1:-1;;;31088:65:0;;9136:2:1;31088:65:0;;;9118:21:1;9175:2;9155:18;;;9148:30;9214:34;9194:18;;;9187:62;-1:-1:-1;;;9265:18:1;;;9258:34;9309:19;;31088:65:0;9108:226:1;31088:65:0;31166:39;31187:4;31193:2;31197:7;31166:20;:39::i;:::-;31270:29;31287:1;31291:7;31270:8;:29::i;:::-;-1:-1:-1;;;;;31312:15:0;;;;;;:9;:15;;;;;:20;;31331:1;;31312:15;:20;;31331:1;;31312:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31343:13:0;;;;;;:9;:13;;;;;:18;;31360:1;;31343:13;:18;;31360:1;;31343:18;:::i;:::-;;;;-1:-1:-1;;31372:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31372:21:0;-1:-1:-1;;;;;31372:21:0;;;;;;;;;31411:27;;31372:16;;31411:27;;;;;;;30868:578;;;:::o;28566:110::-;28642:26;28652:2;28656:7;28642:26;;;;;;;;;;;;:9;:26::i;10357:317::-;10472:6;10447:21;:31;;10439:73;;;;-1:-1:-1;;;10439:73:0;;11728:2:1;10439:73:0;;;11710:21:1;11767:2;11747:18;;;11740:30;11806:31;11786:18;;;11779:59;11855:18;;10439:73:0;11700:179:1;10439:73:0;10526:12;10544:9;-1:-1:-1;;;;;10544:14:0;10566:6;10544:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10525:52;;;10596:7;10588:78;;;;-1:-1:-1;;;10588:78:0;;10957:2:1;10588:78:0;;;10939:21:1;10996:2;10976:18;;;10969:30;11035:34;11015:18;;;11008:62;11106:28;11086:18;;;11079:56;11152:19;;10588:78:0;10929:248:1;44840:191:0;44933:6;;;-1:-1:-1;;;;;44950:17:0;;;-1:-1:-1;;;;;;44950:17:0;;;;;;;44983:40;;44933:6;;;44950:17;44933:6;;44983:40;;44914:16;;44983:40;44840:191;;:::o;31880:315::-;32035:8;-1:-1:-1;;;;;32026:17:0;:5;-1:-1:-1;;;;;32026:17:0;;;32018:55;;;;-1:-1:-1;;;32018:55:0;;9541:2:1;32018:55:0;;;9523:21:1;9580:2;9560:18;;;9553:30;9619:27;9599:18;;;9592:55;9664:18;;32018:55:0;9513:175:1;32018:55:0;-1:-1:-1;;;;;32084:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;32084:46:0;;;;;;;;;;32146:41;;7063::1;;;32146::0;;7036:18:1;32146:41:0;;;;;;;31880:315;;;:::o;26954:::-;27111:28;27121:4;27127:2;27131:7;27111:9;:28::i;:::-;27158:48;27181:4;27187:2;27191:7;27200:5;27158:22;:48::i;:::-;27150:111;;;;-1:-1:-1;;;27150:111:0;;;;;;;:::i;50145:105::-;50197:13;50230:12;50223:19;;;;;:::i;17636:723::-;17692:13;17913:10;17909:53;;-1:-1:-1;;17940:10:0;;;;;;;;;;;;-1:-1:-1;;;17940:10:0;;;;;17636:723::o;17909:53::-;17987:5;17972:12;18028:78;18035:9;;18028:78;;18061:8;;;;:::i;:::-;;-1:-1:-1;18084:10:0;;-1:-1:-1;18092:2:0;18084:10;;:::i;:::-;;;18028:78;;;18116:19;18148:6;18138:17;;;;;;-1:-1:-1;;;18138:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18138:17:0;;18116:39;;18166:154;18173:10;;18166:154;;18200:11;18210:1;18200:11;;:::i;:::-;;-1:-1:-1;18269:10:0;18277:2;18269:5;:10;:::i;:::-;18256:24;;:2;:24;:::i;:::-;18243:39;;18226:6;18233;18226:14;;;;;;-1:-1:-1;;;18226:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;18226:56:0;;;;;;;;-1:-1:-1;18297:11:0;18306:2;18297:11;;:::i;:::-;;;18166:154;;38032:589;-1:-1:-1;;;;;38238:18:0;;38234:187;;38273:40;38305:7;39448:10;:17;;39421:24;;;;:15;:24;;;;;:44;;;39476:24;;;;;;;;;;;;39344:164;38273:40;38234:187;;;38343:2;-1:-1:-1;;;;;38335:10:0;:4;-1:-1:-1;;;;;38335:10:0;;38331:90;;38362:47;38395:4;38401:7;38362:32;:47::i;:::-;-1:-1:-1;;;;;38435:16:0;;38431:183;;38468:45;38505:7;38468:36;:45::i;38431:183::-;38541:4;-1:-1:-1;;;;;38535:10:0;:2;-1:-1:-1;;;;;38535:10:0;;38531:83;;38562:40;38590:2;38594:7;38562:27;:40::i;28903:321::-;29033:18;29039:2;29043:7;29033:5;:18::i;:::-;29084:54;29115:1;29119:2;29123:7;29132:5;29084:22;:54::i;:::-;29062:154;;;;-1:-1:-1;;;29062:154:0;;;;;;;:::i;32760:799::-;32915:4;-1:-1:-1;;;;;32936:13:0;;9358:20;9406:8;32932:620;;32972:72;;-1:-1:-1;;;32972:72:0;;-1:-1:-1;;;;;32972:36:0;;;;;:72;;17131:10;;33023:4;;33029:7;;33038:5;;32972:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32972:72:0;;;;;;;;-1:-1:-1;;32972:72:0;;;;;;;;;;;;:::i;:::-;;;32968:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33214:13:0;;33210:272;;33257:60;;-1:-1:-1;;;33257:60:0;;;;;;;:::i;33210:272::-;33432:6;33426:13;33417:6;33413:2;33409:15;33402:38;32968:529;-1:-1:-1;;;;;;33095:51:0;-1:-1:-1;;;33095:51:0;;-1:-1:-1;33088:58:0;;32932:620;-1:-1:-1;33536:4:0;32760:799;;;;;;:::o;40135:988::-;40401:22;40451:1;40426:22;40443:4;40426:16;:22::i;:::-;:26;;;;:::i;:::-;40463:18;40484:26;;;:17;:26;;;;;;40401:51;;-1:-1:-1;40617:28:0;;;40613:328;;-1:-1:-1;;;;;40684:18:0;;40662:19;40684:18;;;:12;:18;;;;;;;;:34;;;;;;;;;40735:30;;;;;;:44;;;40852:30;;:17;:30;;;;;:43;;;40613:328;-1:-1:-1;41037:26:0;;;;:17;:26;;;;;;;;41030:33;;;-1:-1:-1;;;;;41081:18:0;;;;;:12;:18;;;;;:34;;;;;;;41074:41;40135:988::o;41418:1079::-;41696:10;:17;41671:22;;41696:21;;41716:1;;41696:21;:::i;:::-;41728:18;41749:24;;;:15;:24;;;;;;42122:10;:26;;41671:46;;-1:-1:-1;41749:24:0;;41671:46;;42122:26;;;;-1:-1:-1;;;42122:26:0;;;;;;;;;;;;;;;;;42100:48;;42186:11;42161:10;42172;42161:22;;;;;;-1:-1:-1;;;42161:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;42266:28;;;:15;:28;;;;;;;:41;;;42438:24;;;;;42431:31;42473:10;:16;;;;;-1:-1:-1;;;42473:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;41418:1079;;;;:::o;38922:221::-;39007:14;39024:20;39041:2;39024:16;:20::i;:::-;-1:-1:-1;;;;;39055:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;39100:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;38922:221:0:o;29560:382::-;-1:-1:-1;;;;;29640:16:0;;29632:61;;;;-1:-1:-1;;;29632:61:0;;14106:2:1;29632:61:0;;;14088:21:1;;;14125:18;;;14118:30;14184:34;14164:18;;;14157:62;14236:18;;29632:61:0;14078:182:1;29632:61:0;27647:4;27671:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27671:16:0;:30;29704:58;;;;-1:-1:-1;;;29704:58:0;;8779:2:1;29704:58:0;;;8761:21:1;8818:2;8798:18;;;8791:30;8857;8837:18;;;8830:58;8905:18;;29704:58:0;8751:178:1;29704:58:0;29775:45;29804:1;29808:2;29812:7;29775:20;:45::i;:::-;-1:-1:-1;;;;;29833:13:0;;;;;;:9;:13;;;;;:18;;29850:1;;29833:13;:18;;29850:1;;29833:18;:::i;:::-;;;;-1:-1:-1;;29862:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29862:21:0;-1:-1:-1;;;;;29862:21:0;;;;;;;;29901:33;;29862:16;;;29901:33;;29862:16;;29901:33;29560:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:2;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:2;;;309:1;306;299:12;268:2;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;88:332;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:2;;588:1;585;578:12;522:2;474:124;;;:::o;603:196::-;662:6;715:2;703:9;694:7;690:23;686:32;683:2;;;736:6;728;721:22;683:2;764:29;783:9;764:29;:::i;804:270::-;872:6;880;933:2;921:9;912:7;908:23;904:32;901:2;;;954:6;946;939:22;901:2;982:29;1001:9;982:29;:::i;:::-;972:39;;1030:38;1064:2;1053:9;1049:18;1030:38;:::i;:::-;1020:48;;891:183;;;;;:::o;1079:338::-;1156:6;1164;1172;1225:2;1213:9;1204:7;1200:23;1196:32;1193:2;;;1246:6;1238;1231:22;1193:2;1274:29;1293:9;1274:29;:::i;:::-;1264:39;;1322:38;1356:2;1345:9;1341:18;1322:38;:::i;:::-;1312:48;;1407:2;1396:9;1392:18;1379:32;1369:42;;1183:234;;;;;:::o;1422:696::-;1517:6;1525;1533;1541;1594:3;1582:9;1573:7;1569:23;1565:33;1562:2;;;1616:6;1608;1601:22;1562:2;1644:29;1663:9;1644:29;:::i;:::-;1634:39;;1692:38;1726:2;1715:9;1711:18;1692:38;:::i;:::-;1682:48;;1777:2;1766:9;1762:18;1749:32;1739:42;;1832:2;1821:9;1817:18;1804:32;1859:18;1851:6;1848:30;1845:2;;;1896:6;1888;1881:22;1845:2;1924:22;;1977:4;1969:13;;1965:27;-1:-1:-1;1955:2:1;;2011:6;2003;1996:22;1955:2;2039:73;2104:7;2099:2;2086:16;2081:2;2077;2073:11;2039:73;:::i;:::-;2029:83;;;1552:566;;;;;;;:::o;2123:367::-;2188:6;2196;2249:2;2237:9;2228:7;2224:23;2220:32;2217:2;;;2270:6;2262;2255:22;2217:2;2298:29;2317:9;2298:29;:::i;:::-;2288:39;;2377:2;2366:9;2362:18;2349:32;2424:5;2417:13;2410:21;2403:5;2400:32;2390:2;;2451:6;2443;2436:22;2390:2;2479:5;2469:15;;;2207:283;;;;;:::o;2495:264::-;2563:6;2571;2624:2;2612:9;2603:7;2599:23;2595:32;2592:2;;;2645:6;2637;2630:22;2592:2;2673:29;2692:9;2673:29;:::i;:::-;2663:39;2749:2;2734:18;;;;2721:32;;-1:-1:-1;;;2582:177:1:o;2764:1008::-;2848:6;2879:2;2922;2910:9;2901:7;2897:23;2893:32;2890:2;;;2943:6;2935;2928:22;2890:2;2988:9;2975:23;3017:18;3058:2;3050:6;3047:14;3044:2;;;3079:6;3071;3064:22;3044:2;3122:6;3111:9;3107:22;3097:32;;3167:7;3160:4;3156:2;3152:13;3148:27;3138:2;;3194:6;3186;3179:22;3138:2;3235;3222:16;3257:2;3253;3250:10;3247:2;;;3263:18;;:::i;:::-;3309:2;3306:1;3302:10;3292:20;;3332:28;3356:2;3352;3348:11;3332:28;:::i;:::-;3394:15;;;3425:12;;;;3457:11;;;3487;;;3483:20;;3480:33;-1:-1:-1;3477:2:1;;;3531:6;3523;3516:22;3477:2;3558:6;3549:15;;3573:169;3587:2;3584:1;3581:9;3573:169;;;3644:23;3663:3;3644:23;:::i;:::-;3632:36;;3605:1;3598:9;;;;;3688:12;;;;3720;;3573:169;;;-1:-1:-1;3761:5:1;2859:913;-1:-1:-1;;;;;;;;2859:913:1:o;3777:255::-;3835:6;3888:2;3876:9;3867:7;3863:23;3859:32;3856:2;;;3909:6;3901;3894:22;3856:2;3953:9;3940:23;3972:30;3996:5;3972:30;:::i;4037:259::-;4106:6;4159:2;4147:9;4138:7;4134:23;4130:32;4127:2;;;4180:6;4172;4165:22;4127:2;4217:9;4211:16;4236:30;4260:5;4236:30;:::i;4301:480::-;4370:6;4423:2;4411:9;4402:7;4398:23;4394:32;4391:2;;;4444:6;4436;4429:22;4391:2;4489:9;4476:23;4522:18;4514:6;4511:30;4508:2;;;4559:6;4551;4544:22;4508:2;4587:22;;4640:4;4632:13;;4628:27;-1:-1:-1;4618:2:1;;4674:6;4666;4659:22;4618:2;4702:73;4767:7;4762:2;4749:16;4744:2;4740;4736:11;4702:73;:::i;4786:190::-;4845:6;4898:2;4886:9;4877:7;4873:23;4869:32;4866:2;;;4919:6;4911;4904:22;4866:2;-1:-1:-1;4947:23:1;;4856:120;-1:-1:-1;4856:120:1:o;4981:289::-;5038:6;5091:2;5079:9;5070:7;5066:23;5062:32;5059:2;;;5112:6;5104;5097:22;5059:2;5156:9;5143:23;5206:4;5199:5;5195:16;5188:5;5185:27;5175:2;;5231:6;5223;5216:22;5275:257;5316:3;5354:5;5348:12;5381:6;5376:3;5369:19;5397:63;5453:6;5446:4;5441:3;5437:14;5430:4;5423:5;5419:16;5397:63;:::i;:::-;5514:2;5493:15;-1:-1:-1;;5489:29:1;5480:39;;;;5521:4;5476:50;;5324:208;-1:-1:-1;;5324:208:1:o;5537:470::-;5716:3;5754:6;5748:13;5770:53;5816:6;5811:3;5804:4;5796:6;5792:17;5770:53;:::i;:::-;5886:13;;5845:16;;;;5908:57;5886:13;5845:16;5942:4;5930:17;;5908:57;:::i;:::-;5981:20;;5724:283;-1:-1:-1;;;;5724:283:1:o;6430:488::-;-1:-1:-1;;;;;6699:15:1;;;6681:34;;6751:15;;6746:2;6731:18;;6724:43;6798:2;6783:18;;6776:34;;;6846:3;6841:2;6826:18;;6819:31;;;6624:4;;6867:45;;6892:19;;6884:6;6867:45;:::i;:::-;6859:53;6633:285;-1:-1:-1;;;;;;6633:285:1:o;7115:219::-;7264:2;7253:9;7246:21;7227:4;7284:44;7324:2;7313:9;7309:18;7301:6;7284:44;:::i;7751:414::-;7953:2;7935:21;;;7992:2;7972:18;;;7965:30;8031:34;8026:2;8011:18;;8004:62;-1:-1:-1;;;8097:2:1;8082:18;;8075:48;8155:3;8140:19;;7925:240::o;14678:356::-;14880:2;14862:21;;;14899:18;;;14892:30;14958:34;14953:2;14938:18;;14931:62;15025:2;15010:18;;14852:182::o;16684:413::-;16886:2;16868:21;;;16925:2;16905:18;;;16898:30;16964:34;16959:2;16944:18;;16937:62;-1:-1:-1;;;17030:2:1;17015:18;;17008:47;17087:3;17072:19;;16858:239::o;19254:275::-;19325:2;19319:9;19390:2;19371:13;;-1:-1:-1;;19367:27:1;19355:40;;19425:18;19410:34;;19446:22;;;19407:62;19404:2;;;19472:18;;:::i;:::-;19508:2;19501:22;19299:230;;-1:-1:-1;19299:230:1:o;19534:128::-;19574:3;19605:1;19601:6;19598:1;19595:13;19592:2;;;19611:18;;:::i;:::-;-1:-1:-1;19647:9:1;;19582:80::o;19667:120::-;19707:1;19733;19723:2;;19738:18;;:::i;:::-;-1:-1:-1;19772:9:1;;19713:74::o;19792:168::-;19832:7;19898:1;19894;19890:6;19886:14;19883:1;19880:21;19875:1;19868:9;19861:17;19857:45;19854:2;;;19905:18;;:::i;:::-;-1:-1:-1;19945:9:1;;19844:116::o;19965:125::-;20005:4;20033:1;20030;20027:8;20024:2;;;20038:18;;:::i;:::-;-1:-1:-1;20075:9:1;;20014:76::o;20095:258::-;20167:1;20177:113;20191:6;20188:1;20185:13;20177:113;;;20267:11;;;20261:18;20248:11;;;20241:39;20213:2;20206:10;20177:113;;;20308:6;20305:1;20302:13;20299:2;;;-1:-1:-1;;20343:1:1;20325:16;;20318:27;20148:205::o;20358:380::-;20437:1;20433:12;;;;20480;;;20501:2;;20555:4;20547:6;20543:17;20533:27;;20501:2;20608;20600:6;20597:14;20577:18;20574:38;20571:2;;;20654:10;20649:3;20645:20;20642:1;20635:31;20689:4;20686:1;20679:15;20717:4;20714:1;20707:15;20571:2;;20413:325;;;:::o;20743:135::-;20782:3;-1:-1:-1;;20803:17:1;;20800:2;;;20823:18;;:::i;:::-;-1:-1:-1;20870:1:1;20859:13;;20790:88::o;20883:112::-;20915:1;20941;20931:2;;20946:18;;:::i;:::-;-1:-1:-1;20980:9:1;;20921:74::o;21000:127::-;21061:10;21056:3;21052:20;21049:1;21042:31;21092:4;21089:1;21082:15;21116:4;21113:1;21106:15;21132:127;21193:10;21188:3;21184:20;21181:1;21174:31;21224:4;21221:1;21214:15;21248:4;21245:1;21238:15;21264:127;21325:10;21320:3;21316:20;21313:1;21306:31;21356:4;21353:1;21346:15;21380:4;21377:1;21370:15;21396:131;-1:-1:-1;;;;;;21470:32:1;;21460:43;;21450:2;;21517:1;21514;21507:12

Swarm Source

ipfs://023376f58f391d46e0163f45f4916bad5beaf465abcca1c02118584f9a55e393
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.