ETH Price: $3,447.27 (-1.70%)
Gas: 4 Gwei

Unimpressed Geisha (UG)
 

Overview

TokenID

709

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

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

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-18
*/

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/access/Ownable.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;
    }
}

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() {
        _setOwner(_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 {
        _setOwner(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"
        );
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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

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

pragma solidity ^0.8.0;

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

pragma solidity ^0.8.0;

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

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

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/utils/Strings.sol

pragma solidity ^0.8.0;

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length)
        internal
        pure
        returns (string memory)
    {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

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

// File: @openzeppelin/contracts/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);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

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

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

/**
 * @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/ERC721Enumerable.sol

pragma solidity ^0.8.0;

// File: @openzeppelin/contracts/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
    {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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 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(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert(
                        "ERC721: transfer to non ERC721Receiver implementer"
                    );
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

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

pragma solidity ^0.8.0;

/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI)
        internal
        virtual
    {
        require(
            _exists(tokenId),
            "ERC721URIStorage: URI set of nonexistent token"
        );
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @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 override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

//SPDX-License-Identifier: GPL-3.0-or-later
// pragma solidity 0.8.0;

contract UnimpressedGeisha is
    ERC721,
    ERC721Enumerable,
    ERC721URIStorage,
    Ownable
{
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;
    Counters.Counter private _freeSupply;

    uint16 public constant maxSupply = 3333;
    uint16 public constant freeSupplyLimit = 500;
    uint256 internal constant matchaWhitelistBonus = 50;
    uint256 internal constant baseMatchaUGRewardValuePA = 1000;
    uint256 internal constant baseMatchaRewardApr = 100;
    string private _baseTokenURI;
    uint256 public _whitelistStartDate;
    uint256 public _whitelistSaleStartDate;
    uint256 public _startDate;
    address public _teamWallet;
    address public _secondTeamWallet;

    mapping(address => bool) private _whitelisted;
    mapping(address => bool) public _oneFreeClaimed;
    mapping(address => uint256) public _matchaAPRRewardPeriod;
    mapping(address => uint256) public _earnedFutureMatcha;

    constructor() ERC721("Unimpressed Geisha", "UG") {}

    function setBaseURI(string memory _newbaseTokenURI) public onlyOwner {
        _baseTokenURI = _newbaseTokenURI;
    }

    function setWhitelistStartDate(uint256 whitelistStartDate)
        public
        onlyOwner
    {
        _whitelistStartDate = whitelistStartDate;
    }

    function setWhitelistSaleStartDate(uint256 whitelistSaleStartDate)
        public
        onlyOwner
    {
        _whitelistSaleStartDate = whitelistSaleStartDate;
    }

    function setStartDate(uint256 startDate) public onlyOwner {
        _startDate = startDate;
    }

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

    function getMintPrice() public pure returns (uint64) {
        return 40_000_000_000_000_000;
    }

    function getDiscountedPrice() public pure returns (uint64) {
        return 20_000_000_000_000_000;
    }

    function getWhitelisted() public {
        require(
            whitelistingOpen(),
            "Whitelisting did not start yet or it's already over"
        );
        _whitelisted[msg.sender] = true;
        _matchaAPRRewardPeriod[msg.sender] = block.timestamp;
        _earnedFutureMatcha[msg.sender] = matchaWhitelistBonus * (10 ** uint256(18));
    }

    function removeUserFromWhitelist(address wallet) public onlyOwner {
        _whitelisted[wallet] = false;
    }

    function isWhitelisted(address wallet) public view returns (bool) {
        return _whitelisted[wallet];
    }

    function oneFreeClaimed(address wallet) public view returns (bool) {
        return _oneFreeClaimed[wallet];
    }

    function whitelistingOpen() public view returns (bool) {
        return
            block.timestamp >= _whitelistStartDate &&
            block.timestamp <= _whitelistSaleStartDate;
    }

    function whitelistedSaleStarted() public view returns (bool) {
        return _whitelistSaleStartDate <= block.timestamp;
    }

    function saleStarted() public view returns (bool) {
        return _startDate <= block.timestamp;
    }

    function whitelistedMint(uint8 _quantityToMint) public payable {
        require(
            _startDate <= block.timestamp ||
                (block.timestamp >= _whitelistSaleStartDate &&
                    _whitelisted[msg.sender] == true),
            block.timestamp <= _whitelistSaleStartDate
                ? "Whitelist sale is not open"
                : "Not whitelisted"
        );
        require(_quantityToMint >= 1, "Must mint at least 1");
        require(_quantityToMint <= 5, "Can mint max 5");

        require(
            (_quantityToMint + totalSupply()) <= maxSupply,
            "Exceeds maximum supply"
        );
        require(
            (_quantityToMint + _freeSupply.current()) <= freeSupplyLimit,
            "Exceeds free supply"
        );

        if (_oneFreeClaimed[msg.sender]) {
            require(
                msg.value == (getDiscountedPrice() * _quantityToMint),
                "Ether submitted does not match discounted price"
            );
            calcMint(msg.sender, _quantityToMint);
        } else {
            if (_quantityToMint > 1) {
                require(
                    msg.value == (getDiscountedPrice() * (_quantityToMint - 1)),
                    "Ether submitted does not match discounted price"
                );
            }
            _oneFreeClaimed[msg.sender] = true;
            _freeSupply.increment();
            calcMint(msg.sender, _quantityToMint);
        }
    }

    function mint(address _wallet, uint8 _quantityToMint) public payable {
        require(_startDate <= block.timestamp, "Sale is not open");
        require(_quantityToMint >= 1, "Must mint at least 1");
        require(_quantityToMint <= 5, "Can mint max 5");
        require(
            (_quantityToMint + totalSupply()) <= maxSupply,
            "Exceeds maximum supply"
        );
        require(
            msg.value == (getMintPrice() * _quantityToMint),
            "Ether submitted does not match current price"
        );
        calcMint(_wallet, _quantityToMint);
    }

    function calcMint(address _wallet, uint8 _quantityToMint) internal {
        for (uint8 i = 0; i < _quantityToMint; i++) {
            _tokenIds.increment();
            uint256 newItemId = _tokenIds.current();
            _mint(_wallet, newItemId);
        }
    }

    function reserveMint(uint8 _quantityToMint) public onlyOwner {
        require(_quantityToMint >= 1, "Must mint at least 1");
        require(_quantityToMint <= 10, "Can mint max 10");
        require(
            (_quantityToMint + totalSupply()) <= maxSupply,
            "Exceeds maximum supply"
        );

        for (uint8 i = 0; i < _quantityToMint; i++) {
            _tokenIds.increment();
            uint256 newItemId = _tokenIds.current();
            _mint(msg.sender, newItemId);
        }
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }

    function setWithdrawAddress(address _wallet) public onlyOwner {
        _teamWallet = _wallet;
    }

    function setSecondWithdrawAddress(address _wallet) public onlyOwner {
        _secondTeamWallet = _wallet;
    }

    function withdraw() public onlyOwner {
        require(address(this).balance > 0, "Balance must be positive");
        require(
            _teamWallet != address(0) && _secondTeamWallet != address(0),
            "Wallets must be set"
        );
        uint256 _balance = address(this).balance;
        uint256 _split = _balance / 2;
        payable(_teamWallet).transfer(_split);
        payable(_secondTeamWallet).transfer(_split);
    }

    function balanceOfMatchaReward(address owner)
        public
        view
        virtual
        returns (uint256)
    {
        require(
            owner != address(0),
            "Balance query for the zero address"
        );
        return _earnedFutureMatcha[owner];
    }

    function joinMatchaReward() public {
        require(block.timestamp >= _whitelistStartDate, "Whitelisting or sale not started");
        require(
            isJoinedInMatchaReward(msg.sender) == uint256(0),
            "You already joined"
        );
        _matchaAPRRewardPeriod[msg.sender] = block.timestamp;
    }

    function isJoinedInMatchaReward(address wallet) public view returns (uint256) {
        return _matchaAPRRewardPeriod[wallet];
    }

    function claimMatchaReward() public {
        uint256 userBalance = balanceOf(msg.sender);
        require(userBalance >= 1, "Only holders are able to claim");
        uint256 reward = calculateMatchaReward(msg.sender, userBalance);
        _matchaAPRRewardPeriod[msg.sender] = block.timestamp;
        _earnedFutureMatcha[msg.sender] = _earnedFutureMatcha[msg.sender] + reward;
    }

    function calculateMatchaRewardAPRSingle() public view returns (uint256) {
        uint256 coef = ((maxSupply - totalSupply()) * (10**18)) / baseMatchaUGRewardValuePA;
        uint256 baseMAPR = baseMatchaRewardApr * (10**18);
        return baseMAPR + (baseMatchaRewardApr * coef);
    }

    function calculateMatchaRewardAPR() public view returns (uint256) {
        uint256 coef = ((maxSupply - totalSupply()) * (10**18)) / baseMatchaUGRewardValuePA;
        uint256 baseMAPR = baseMatchaRewardApr * (10**18);
        uint256 calcAPR = baseMAPR + (baseMatchaRewardApr * coef);
        return calcAPR * balanceOf(msg.sender);
    }

    function calculateMatchaReward(address _wallet, uint256 _userbalace)
        public
        view
        returns (uint256)
    {
        uint256 matchaPA = (_userbalace * baseMatchaUGRewardValuePA) / (100) * calculateMatchaRewardAPR();
        uint256 matchaPerSecond = matchaPA / uint256(31556926);
        uint256 initialPeriod = _matchaAPRRewardPeriod[_wallet];
        uint256 diffPeriod = block.timestamp - initialPeriod;
        return (diffPeriod * matchaPerSecond);
    }

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

    function _burn(uint256 tokenId)
        internal
        override(ERC721, ERC721URIStorage)
    {
        super._burn(tokenId);
    }

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

    fallback() external payable {}

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_earnedFutureMatcha","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_matchaAPRRewardPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_oneFreeClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_secondTeamWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_startDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_teamWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_whitelistSaleStartDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_whitelistStartDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOfMatchaReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"uint256","name":"_userbalace","type":"uint256"}],"name":"calculateMatchaReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateMatchaRewardAPR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateMatchaRewardAPRSingle","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimMatchaReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeSupplyLimit","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"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":"getDiscountedPrice","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getMintPrice","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"isJoinedInMatchaReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"joinMatchaReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"uint8","name":"_quantityToMint","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"oneFreeClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"removeUserFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_quantityToMint","type":"uint8"}],"name":"reserveMint","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":[],"name":"saleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"_newbaseTokenURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"setSecondWithdrawAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"startDate","type":"uint256"}],"name":"setStartDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"whitelistSaleStartDate","type":"uint256"}],"name":"setWhitelistSaleStartDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"whitelistStartDate","type":"uint256"}],"name":"setWhitelistStartDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"setWithdrawAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_quantityToMint","type":"uint8"}],"name":"whitelistedMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistedSaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistingOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b506040805180820182526012815271556e696d707265737365642047656973686160701b602080830191825283518085019094526002845261554760f01b9084015281519192916200006691600091620000f5565b5080516200007c906001906020840190620000f5565b50505062000099620000936200009f60201b60201c565b620000a3565b620001d8565b3390565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805462000103906200019b565b90600052602060002090601f01602090048101928262000127576000855562000172565b82601f106200014257805160ff191683800117855562000172565b8280016001018555821562000172579182015b828111156200017257825182559160200191906001019062000155565b506200018092915062000184565b5090565b5b8082111562000180576000815560010162000185565b600181811c90821680620001b057607f821691505b60208210811415620001d257634e487b7160e01b600052602260045260246000fd5b50919050565b61325f80620001e86000396000f3fe6080604052600436106103275760003560e01c806370a08231116101ae578063b88d4fde116100eb578063d5abeb011161008f578063f252918b1161006c578063f252918b146109c3578063f2fde38b146109e3578063f9902bb114610a03578063fb4454d914610a2357005b8063d5abeb011461094f578063d958c55b14610965578063e985e9c51461097a57005b8063c141f0e5116100c8578063c141f0e5146108cf578063c2656aff146108ef578063c7c853d61461090f578063c87b56dd1461092f57005b8063b88d4fde14610850578063b98c08d114610870578063be905c40146108a657005b806397ed7a3211610152578063a22cb4651161012f578063a22cb465146107ea578063a7f93ebd1461080a578063a9398d4014610824578063ac8daba01461083a57005b806397ed7a32146107925780639b372b2b146107c25780639f62cc2f146107d757005b806382d95df51161018b57806382d95df51461071f5780638da5cb5b1461073f57806395d89b411461075d57806397588fdc1461077257005b806370a08231146106bd578063715018a6146106dd57806371e1b8fc146106f257005b80632f745c591161027c57806342842e0e1161022057806355f804b3116101fd57806355f804b3146106525780635c474f9e146106725780636352211e1461068a578063691562a0146106aa57005b806342842e0e146105fa5780634e3dd49b1461061a5780634f6ccce71461063257005b80633ab1a494116102595780633ab1a4941461055d5780633af32abf1461057d5780633ccfd60b146105b65780634181b391146105cb57005b80632f745c591461050857806337e294d514610528578063381b15161461054857005b806318160ddd116102e357806323b872dd116102c057806323b872dd1461046d57806324566a221461048d5780632585ec7e146104a257806327d559c4146104db57005b806318160ddd146104185780631f8cf4601461042d5780631fae0ab91461044d57005b806301ffc9a71461033057806306fdde0314610365578063081812fc1461038757806308dcf921146103bf578063095ea7b3146103d4578063125408bb146103f457005b3661032e57005b005b34801561033c57600080fd5b5061035061034b366004612c68565b610a38565b60405190151581526020015b60405180910390f35b34801561037157600080fd5b5061037a610a49565b60405161035c9190612db7565b34801561039357600080fd5b506103a76103a2366004612ceb565b610adb565b6040516001600160a01b03909116815260200161035c565b3480156103cb57600080fd5b50610350610b75565b3480156103e057600080fd5b5061032e6103ef366004612c14565b610b90565b34801561040057600080fd5b5061040a600f5481565b60405190815260200161035c565b34801561042457600080fd5b5060085461040a565b34801561043957600080fd5b5061040a610448366004612c14565b610ca6565b34801561045957600080fd5b506013546103a7906001600160a01b031681565b34801561047957600080fd5b5061032e610488366004612b20565b610d22565b34801561049957600080fd5b5061040a610d53565b3480156104ae57600080fd5b506103506104bd366004612ad2565b6001600160a01b031660009081526015602052604090205460ff1690565b3480156104e757600080fd5b5061040a6104f6366004612ad2565b60166020526000908152604090205481565b34801561051457600080fd5b5061040a610523366004612c14565b610dbf565b34801561053457600080fd5b506012546103a7906001600160a01b031681565b34801561055457600080fd5b5061032e610e55565b34801561056957600080fd5b5061032e610578366004612ad2565b610efe565b34801561058957600080fd5b50610350610598366004612ad2565b6001600160a01b031660009081526014602052604090205460ff1690565b3480156105c257600080fd5b5061032e610f4a565b3480156105d757600080fd5b5066470de4df8200005b60405167ffffffffffffffff909116815260200161035c565b34801561060657600080fd5b5061032e610615366004612b20565b6110ae565b34801561062657600080fd5b50601054421015610350565b34801561063e57600080fd5b5061040a61064d366004612ceb565b6110c9565b34801561065e57600080fd5b5061032e61066d366004612ca2565b61115c565b34801561067e57600080fd5b50601154421015610350565b34801561069657600080fd5b506103a76106a5366004612ceb565b61119d565b61032e6106b8366004612c3e565b611214565b3480156106c957600080fd5b5061040a6106d8366004612ad2565b611384565b3480156106e957600080fd5b5061032e61140b565b3480156106fe57600080fd5b5061040a61070d366004612ad2565b60176020526000908152604090205481565b34801561072b57600080fd5b5061032e61073a366004612ceb565b611441565b34801561074b57600080fd5b50600b546001600160a01b03166103a7565b34801561076957600080fd5b5061037a611470565b34801561077e57600080fd5b5061032e61078d366004612ad2565b61147f565b34801561079e57600080fd5b506103506107ad366004612ad2565b60156020526000908152604090205460ff1681565b3480156107ce57600080fd5b5061032e6114cb565b61032e6107e5366004612d04565b61158b565b3480156107f657600080fd5b5061032e610805366004612bd8565b611823565b34801561081657600080fd5b50668e1bc9bf0400006105e1565b34801561083057600080fd5b5061040a60105481565b34801561084657600080fd5b5061040a60115481565b34801561085c57600080fd5b5061032e61086b366004612b5c565b6118e8565b34801561087c57600080fd5b5061040a61088b366004612ad2565b6001600160a01b031660009081526016602052604090205490565b3480156108b257600080fd5b506108bc6101f481565b60405161ffff909116815260200161035c565b3480156108db57600080fd5b5061032e6108ea366004612d04565b611920565b3480156108fb57600080fd5b5061032e61090a366004612ceb565b611a34565b34801561091b57600080fd5b5061040a61092a366004612ad2565b611a63565b34801561093b57600080fd5b5061037a61094a366004612ceb565b611ae2565b34801561095b57600080fd5b506108bc610d0581565b34801561097157600080fd5b5061032e611aed565b34801561098657600080fd5b50610350610995366004612aed565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156109cf57600080fd5b5061032e6109de366004612ceb565b611ba5565b3480156109ef57600080fd5b5061032e6109fe366004612ad2565b611bd4565b348015610a0f57600080fd5b5061032e610a1e366004612ad2565b611c6c565b348015610a2f57600080fd5b5061040a611cb7565b6000610a4382611d3b565b92915050565b606060008054610a589061311b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a849061311b565b8015610ad15780601f10610aa657610100808354040283529160200191610ad1565b820191906000526020600020905b815481529060010190602001808311610ab457829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610b595760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000600f544210158015610b8b57506010544211155b905090565b6000610b9b8261119d565b9050806001600160a01b0316836001600160a01b03161415610c095760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b50565b336001600160a01b0382161480610c255750610c258133610995565b610c975760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b50565b610ca18383611d60565b505050565b600080610cb1611cb7565b6064610cbf6103e886613066565b610cc99190612f67565b610cd39190613066565b90506000610ce56301e1853e83612f67565b6001600160a01b038616600090815260166020526040812054919250610d0b82426130b5565b9050610d178382613066565b979650505050505050565b610d2c3382611dce565b610d485760405162461bcd60e51b8152600401610b5090612efe565b610ca1838383611ec5565b6000806103e8610d6260085490565b610d6e90610d056130b5565b610d8090670de0b6b3a7640000613066565b610d8a9190612f67565b90506000610da16064670de0b6b3a7640000613066565b9050610dae826064613066565b610db89082612f4f565b9250505090565b6000610dca83611384565b8210610e2c5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610b50565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6000610e6033611384565b90506001811015610eb35760405162461bcd60e51b815260206004820152601e60248201527f4f6e6c7920686f6c64657273206172652061626c6520746f20636c61696d00006044820152606401610b50565b6000610ebf3383610ca6565b3360009081526016602090815260408083204290556017909152902054909150610eea908290612f4f565b336000908152601760205260409020555050565b600b546001600160a01b03163314610f285760405162461bcd60e51b8152600401610b5090612e6b565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b600b546001600160a01b03163314610f745760405162461bcd60e51b8152600401610b5090612e6b565b60004711610fc45760405162461bcd60e51b815260206004820152601860248201527f42616c616e6365206d75737420626520706f73697469766500000000000000006044820152606401610b50565b6012546001600160a01b031615801590610fe857506013546001600160a01b031615155b61102a5760405162461bcd60e51b815260206004820152601360248201527215d85b1b195d1cc81b5d5cdd081899481cd95d606a1b6044820152606401610b50565b476000611038600283612f67565b6012546040519192506001600160a01b03169082156108fc029083906000818181858888f19350505050158015611073573d6000803e3d6000fd5b506013546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015610ca1573d6000803e3d6000fd5b610ca1838383604051806020016040528060008152506118e8565b60006110d460085490565b82106111375760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610b50565b6008828154811061114a5761114a6131e7565b90600052602060002001549050919050565b600b546001600160a01b031633146111865760405162461bcd60e51b8152600401610b5090612e6b565b805161119990600e906020840190612996565b5050565b6000818152600260205260408120546001600160a01b031680610a435760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b50565b4260115411156112595760405162461bcd60e51b815260206004820152601060248201526f29b0b6329034b9903737ba1037b832b760811b6044820152606401610b50565b60018160ff16101561127d5760405162461bcd60e51b8152600401610b5090612ed0565b60058160ff1611156112c25760405162461bcd60e51b815260206004820152600e60248201526d43616e206d696e74206d6178203560901b6044820152606401610b50565b610d056112ce60085490565b6112db9060ff8416612f4f565b11156112f95760405162461bcd60e51b8152600401610b5090612ea0565b61130d60ff8216668e1bc9bf040000613085565b67ffffffffffffffff16341461137a5760405162461bcd60e51b815260206004820152602c60248201527f4574686572207375626d697474656420646f6573206e6f74206d61746368206360448201526b757272656e7420707269636560a01b6064820152608401610b50565b6111998282612070565b60006001600160a01b0382166113ef5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b50565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b031633146114355760405162461bcd60e51b8152600401610b5090612e6b565b61143f60006120b9565b565b600b546001600160a01b0316331461146b5760405162461bcd60e51b8152600401610b5090612e6b565b601155565b606060018054610a589061311b565b600b546001600160a01b031633146114a95760405162461bcd60e51b8152600401610b5090612e6b565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6114d3610b75565b61153b5760405162461bcd60e51b815260206004820152603360248201527f57686974656c697374696e6720646964206e6f7420737461727420796574206f604482015272391034ba13b99030b63932b0b23c9037bb32b960691b6064820152608401610b50565b336000908152601460209081526040808320805460ff191660011790556016909152902042905561156e6012600a612fbe565b611579906032613066565b33600090815260176020526040902055565b426011541115806115bd575060105442101580156115bd57503360009081526014602052604090205460ff1615156001145b6010544211156115f4576040518060400160405280600f81526020016e139bdd081dda1a5d195b1a5cdd1959608a1b81525061162b565b6040518060400160405280601a81526020017f57686974656c6973742073616c65206973206e6f74206f70656e0000000000008152505b906116495760405162461bcd60e51b8152600401610b509190612db7565b5060018160ff16101561166e5760405162461bcd60e51b8152600401610b5090612ed0565b60058160ff1611156116b35760405162461bcd60e51b815260206004820152600e60248201526d43616e206d696e74206d6178203560901b6044820152606401610b50565b610d056116bf60085490565b6116cc9060ff8416612f4f565b11156116ea5760405162461bcd60e51b8152600401610b5090612ea0565b6101f46116f6600d5490565b6117039060ff8416612f4f565b11156117475760405162461bcd60e51b815260206004820152601360248201527245786365656473206672656520737570706c7960681b6044820152606401610b50565b3360009081526015602052604090205460ff16156117a85761177360ff821666470de4df820000613085565b67ffffffffffffffff16341461179b5760405162461bcd60e51b8152600401610b5090612e1c565b6117a53382612070565b50565b60018160ff1611156117fb576117bf6001826130cc565b6117d39060ff1666470de4df820000613085565b67ffffffffffffffff1634146117fb5760405162461bcd60e51b8152600401610b5090612e1c565b336000908152601560205260409020805460ff1916600117905561179b600d80546001019055565b6001600160a01b03821633141561187c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b50565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6118f23383611dce565b61190e5760405162461bcd60e51b8152600401610b5090612efe565b61191a8484848461210b565b50505050565b600b546001600160a01b0316331461194a5760405162461bcd60e51b8152600401610b5090612e6b565b60018160ff16101561196e5760405162461bcd60e51b8152600401610b5090612ed0565b600a8160ff1611156119b45760405162461bcd60e51b815260206004820152600f60248201526e043616e206d696e74206d617820313608c1b6044820152606401610b50565b610d056119c060085490565b6119cd9060ff8416612f4f565b11156119eb5760405162461bcd60e51b8152600401610b5090612ea0565b60005b8160ff168160ff16101561119957611a0a600c80546001019055565b6000611a15600c5490565b9050611a21338261213e565b5080611a2c81613171565b9150506119ee565b600b546001600160a01b03163314611a5e5760405162461bcd60e51b8152600401610b5090612e6b565b600f55565b60006001600160a01b038216611ac65760405162461bcd60e51b815260206004820152602260248201527f42616c616e636520717565727920666f7220746865207a65726f206164647265604482015261737360f01b6064820152608401610b50565b506001600160a01b031660009081526017602052604090205490565b6060610a438261228c565b600f54421015611b3f5760405162461bcd60e51b815260206004820181905260248201527f57686974656c697374696e67206f722073616c65206e6f7420737461727465646044820152606401610b50565b3360009081526016602052604081205414611b915760405162461bcd60e51b8152602060048201526012602482015271165bdd48185b1c9958591e481a9bda5b995960721b6044820152606401610b50565b336000908152601660205260409020429055565b600b546001600160a01b03163314611bcf5760405162461bcd60e51b8152600401610b5090612e6b565b601055565b600b546001600160a01b03163314611bfe5760405162461bcd60e51b8152600401610b5090612e6b565b6001600160a01b038116611c635760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b50565b6117a5816120b9565b600b546001600160a01b03163314611c965760405162461bcd60e51b8152600401610b5090612e6b565b6001600160a01b03166000908152601460205260409020805460ff19169055565b6000806103e8611cc660085490565b611cd290610d056130b5565b611ce490670de0b6b3a7640000613066565b611cee9190612f67565b90506000611d056064670de0b6b3a7640000613066565b90506000611d14836064613066565b611d1e9083612f4f565b9050611d2933611384565b611d339082613066565b935050505090565b60006001600160e01b0319821663780e9d6360e01b1480610a435750610a43826123fe565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611d958261119d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611e475760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b50565b6000611e528361119d565b9050806001600160a01b0316846001600160a01b03161480611e8d5750836001600160a01b0316611e8284610adb565b6001600160a01b0316145b80611ebd57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611ed88261119d565b6001600160a01b031614611f405760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610b50565b6001600160a01b038216611fa25760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b50565b611fad83838361244e565b611fb8600082611d60565b6001600160a01b0383166000908152600360205260408120805460019290611fe19084906130b5565b90915550506001600160a01b038216600090815260036020526040812080546001929061200f908490612f4f565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60005b8160ff168160ff161015610ca15761208f600c80546001019055565b600061209a600c5490565b90506120a6848261213e565b50806120b181613171565b915050612073565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b612116848484611ec5565b61212284848484612459565b61191a5760405162461bcd60e51b8152600401610b5090612dca565b6001600160a01b0382166121945760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b50565b6000818152600260205260409020546001600160a01b0316156121f95760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b50565b6122056000838361244e565b6001600160a01b038216600090815260036020526040812080546001929061222e908490612f4f565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000818152600260205260409020546060906001600160a01b031661230d5760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b6064820152608401610b50565b6000828152600a6020526040812080546123269061311b565b80601f01602080910402602001604051908101604052809291908181526020018280546123529061311b565b801561239f5780601f106123745761010080835404028352916020019161239f565b820191906000526020600020905b81548152906001019060200180831161238257829003601f168201915b5050505050905060006123b0612566565b90508051600014156123c3575092915050565b8151156123f55780826040516020016123dd929190612d4b565b60405160208183030381529060405292505050919050565b611ebd84612575565b60006001600160e01b031982166380ac58cd60e01b148061242f57506001600160e01b03198216635b5e139f60e01b145b80610a4357506301ffc9a760e01b6001600160e01b0319831614610a43565b610ca1838383612650565b60006001600160a01b0384163b1561255b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061249d903390899088908890600401612d7a565b602060405180830381600087803b1580156124b757600080fd5b505af19250505080156124e7575060408051601f3d908101601f191682019092526124e491810190612c85565b60015b612541573d808015612515576040519150601f19603f3d011682016040523d82523d6000602084013e61251a565b606091505b5080516125395760405162461bcd60e51b8152600401610b5090612dca565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611ebd565b506001949350505050565b6060600e8054610a589061311b565b6000818152600260205260409020546060906001600160a01b03166125f45760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b50565b60006125fe612566565b9050600081511161261e5760405180602001604052806000815250612649565b8061262884612708565b604051602001612639929190612d4b565b6040516020818303038152906040525b9392505050565b6001600160a01b0383166126ab576126a681600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6126ce565b816001600160a01b0316836001600160a01b0316146126ce576126ce8382612806565b6001600160a01b0382166126e557610ca1816128a3565b826001600160a01b0316826001600160a01b031614610ca157610ca18282612952565b60608161272c5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612756578061274081613156565b915061274f9050600a83612f67565b9150612730565b60008167ffffffffffffffff811115612771576127716131fd565b6040519080825280601f01601f19166020018201604052801561279b576020820181803683370190505b5090505b8415611ebd576127b06001836130b5565b91506127bd600a86613191565b6127c8906030612f4f565b60f81b8183815181106127dd576127dd6131e7565b60200101906001600160f81b031916908160001a9053506127ff600a86612f67565b945061279f565b6000600161281384611384565b61281d91906130b5565b600083815260076020526040902054909150808214612870576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906128b5906001906130b5565b600083815260096020526040812054600880549394509092849081106128dd576128dd6131e7565b9060005260206000200154905080600883815481106128fe576128fe6131e7565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612936576129366131d1565b6001900381819060005260206000200160009055905550505050565b600061295d83611384565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b8280546129a29061311b565b90600052602060002090601f0160209004810192826129c45760008555612a0a565b82601f106129dd57805160ff1916838001178555612a0a565b82800160010185558215612a0a579182015b82811115612a0a5782518255916020019190600101906129ef565b50612a16929150612a1a565b5090565b5b80821115612a165760008155600101612a1b565b600067ffffffffffffffff80841115612a4a57612a4a6131fd565b604051601f8501601f19908116603f01168101908282118183101715612a7257612a726131fd565b81604052809350858152868686011115612a8b57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114612abc57600080fd5b919050565b803560ff81168114612abc57600080fd5b600060208284031215612ae457600080fd5b61264982612aa5565b60008060408385031215612b0057600080fd5b612b0983612aa5565b9150612b1760208401612aa5565b90509250929050565b600080600060608486031215612b3557600080fd5b612b3e84612aa5565b9250612b4c60208501612aa5565b9150604084013590509250925092565b60008060008060808587031215612b7257600080fd5b612b7b85612aa5565b9350612b8960208601612aa5565b925060408501359150606085013567ffffffffffffffff811115612bac57600080fd5b8501601f81018713612bbd57600080fd5b612bcc87823560208401612a2f565b91505092959194509250565b60008060408385031215612beb57600080fd5b612bf483612aa5565b915060208301358015158114612c0957600080fd5b809150509250929050565b60008060408385031215612c2757600080fd5b612c3083612aa5565b946020939093013593505050565b60008060408385031215612c5157600080fd5b612c5a83612aa5565b9150612b1760208401612ac1565b600060208284031215612c7a57600080fd5b813561264981613213565b600060208284031215612c9757600080fd5b815161264981613213565b600060208284031215612cb457600080fd5b813567ffffffffffffffff811115612ccb57600080fd5b8201601f81018413612cdc57600080fd5b611ebd84823560208401612a2f565b600060208284031215612cfd57600080fd5b5035919050565b600060208284031215612d1657600080fd5b61264982612ac1565b60008151808452612d378160208601602086016130ef565b601f01601f19169290920160200192915050565b60008351612d5d8184602088016130ef565b835190830190612d718183602088016130ef565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612dad90830184612d1f565b9695505050505050565b6020815260006126496020830184612d1f565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602f908201527f4574686572207375626d697474656420646f6573206e6f74206d61746368206460408201526e6973636f756e74656420707269636560881b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526016908201527545786365656473206d6178696d756d20737570706c7960501b604082015260600190565b6020808252601490820152734d757374206d696e74206174206c65617374203160601b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612f6257612f626131a5565b500190565b600082612f7657612f766131bb565b500490565b600181815b80851115612fb6578160001904821115612f9c57612f9c6131a5565b80851615612fa957918102915b93841c9390800290612f80565b509250929050565b60006126498383600082612fd457506001610a43565b81612fe157506000610a43565b8160018114612ff757600281146130015761301d565b6001915050610a43565b60ff841115613012576130126131a5565b50506001821b610a43565b5060208310610133831016604e8410600b8410161715613040575081810a610a43565b61304a8383612f7b565b806000190482111561305e5761305e6131a5565b029392505050565b6000816000190483118215151615613080576130806131a5565b500290565b600067ffffffffffffffff808316818516818304811182151516156130ac576130ac6131a5565b02949350505050565b6000828210156130c7576130c76131a5565b500390565b600060ff821660ff8416808210156130e6576130e66131a5565b90039392505050565b60005b8381101561310a5781810151838201526020016130f2565b8381111561191a5750506000910152565b600181811c9082168061312f57607f821691505b6020821081141561315057634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561316a5761316a6131a5565b5060010190565b600060ff821660ff811415613188576131886131a5565b60010192915050565b6000826131a0576131a06131bb565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146117a557600080fdfea264697066735822122073d0410a5d44c607e55b5b7ae20c407c6f47b50e3dca02c6700a525f802e41f664736f6c63430008070033

Deployed Bytecode

0x6080604052600436106103275760003560e01c806370a08231116101ae578063b88d4fde116100eb578063d5abeb011161008f578063f252918b1161006c578063f252918b146109c3578063f2fde38b146109e3578063f9902bb114610a03578063fb4454d914610a2357005b8063d5abeb011461094f578063d958c55b14610965578063e985e9c51461097a57005b8063c141f0e5116100c8578063c141f0e5146108cf578063c2656aff146108ef578063c7c853d61461090f578063c87b56dd1461092f57005b8063b88d4fde14610850578063b98c08d114610870578063be905c40146108a657005b806397ed7a3211610152578063a22cb4651161012f578063a22cb465146107ea578063a7f93ebd1461080a578063a9398d4014610824578063ac8daba01461083a57005b806397ed7a32146107925780639b372b2b146107c25780639f62cc2f146107d757005b806382d95df51161018b57806382d95df51461071f5780638da5cb5b1461073f57806395d89b411461075d57806397588fdc1461077257005b806370a08231146106bd578063715018a6146106dd57806371e1b8fc146106f257005b80632f745c591161027c57806342842e0e1161022057806355f804b3116101fd57806355f804b3146106525780635c474f9e146106725780636352211e1461068a578063691562a0146106aa57005b806342842e0e146105fa5780634e3dd49b1461061a5780634f6ccce71461063257005b80633ab1a494116102595780633ab1a4941461055d5780633af32abf1461057d5780633ccfd60b146105b65780634181b391146105cb57005b80632f745c591461050857806337e294d514610528578063381b15161461054857005b806318160ddd116102e357806323b872dd116102c057806323b872dd1461046d57806324566a221461048d5780632585ec7e146104a257806327d559c4146104db57005b806318160ddd146104185780631f8cf4601461042d5780631fae0ab91461044d57005b806301ffc9a71461033057806306fdde0314610365578063081812fc1461038757806308dcf921146103bf578063095ea7b3146103d4578063125408bb146103f457005b3661032e57005b005b34801561033c57600080fd5b5061035061034b366004612c68565b610a38565b60405190151581526020015b60405180910390f35b34801561037157600080fd5b5061037a610a49565b60405161035c9190612db7565b34801561039357600080fd5b506103a76103a2366004612ceb565b610adb565b6040516001600160a01b03909116815260200161035c565b3480156103cb57600080fd5b50610350610b75565b3480156103e057600080fd5b5061032e6103ef366004612c14565b610b90565b34801561040057600080fd5b5061040a600f5481565b60405190815260200161035c565b34801561042457600080fd5b5060085461040a565b34801561043957600080fd5b5061040a610448366004612c14565b610ca6565b34801561045957600080fd5b506013546103a7906001600160a01b031681565b34801561047957600080fd5b5061032e610488366004612b20565b610d22565b34801561049957600080fd5b5061040a610d53565b3480156104ae57600080fd5b506103506104bd366004612ad2565b6001600160a01b031660009081526015602052604090205460ff1690565b3480156104e757600080fd5b5061040a6104f6366004612ad2565b60166020526000908152604090205481565b34801561051457600080fd5b5061040a610523366004612c14565b610dbf565b34801561053457600080fd5b506012546103a7906001600160a01b031681565b34801561055457600080fd5b5061032e610e55565b34801561056957600080fd5b5061032e610578366004612ad2565b610efe565b34801561058957600080fd5b50610350610598366004612ad2565b6001600160a01b031660009081526014602052604090205460ff1690565b3480156105c257600080fd5b5061032e610f4a565b3480156105d757600080fd5b5066470de4df8200005b60405167ffffffffffffffff909116815260200161035c565b34801561060657600080fd5b5061032e610615366004612b20565b6110ae565b34801561062657600080fd5b50601054421015610350565b34801561063e57600080fd5b5061040a61064d366004612ceb565b6110c9565b34801561065e57600080fd5b5061032e61066d366004612ca2565b61115c565b34801561067e57600080fd5b50601154421015610350565b34801561069657600080fd5b506103a76106a5366004612ceb565b61119d565b61032e6106b8366004612c3e565b611214565b3480156106c957600080fd5b5061040a6106d8366004612ad2565b611384565b3480156106e957600080fd5b5061032e61140b565b3480156106fe57600080fd5b5061040a61070d366004612ad2565b60176020526000908152604090205481565b34801561072b57600080fd5b5061032e61073a366004612ceb565b611441565b34801561074b57600080fd5b50600b546001600160a01b03166103a7565b34801561076957600080fd5b5061037a611470565b34801561077e57600080fd5b5061032e61078d366004612ad2565b61147f565b34801561079e57600080fd5b506103506107ad366004612ad2565b60156020526000908152604090205460ff1681565b3480156107ce57600080fd5b5061032e6114cb565b61032e6107e5366004612d04565b61158b565b3480156107f657600080fd5b5061032e610805366004612bd8565b611823565b34801561081657600080fd5b50668e1bc9bf0400006105e1565b34801561083057600080fd5b5061040a60105481565b34801561084657600080fd5b5061040a60115481565b34801561085c57600080fd5b5061032e61086b366004612b5c565b6118e8565b34801561087c57600080fd5b5061040a61088b366004612ad2565b6001600160a01b031660009081526016602052604090205490565b3480156108b257600080fd5b506108bc6101f481565b60405161ffff909116815260200161035c565b3480156108db57600080fd5b5061032e6108ea366004612d04565b611920565b3480156108fb57600080fd5b5061032e61090a366004612ceb565b611a34565b34801561091b57600080fd5b5061040a61092a366004612ad2565b611a63565b34801561093b57600080fd5b5061037a61094a366004612ceb565b611ae2565b34801561095b57600080fd5b506108bc610d0581565b34801561097157600080fd5b5061032e611aed565b34801561098657600080fd5b50610350610995366004612aed565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156109cf57600080fd5b5061032e6109de366004612ceb565b611ba5565b3480156109ef57600080fd5b5061032e6109fe366004612ad2565b611bd4565b348015610a0f57600080fd5b5061032e610a1e366004612ad2565b611c6c565b348015610a2f57600080fd5b5061040a611cb7565b6000610a4382611d3b565b92915050565b606060008054610a589061311b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a849061311b565b8015610ad15780601f10610aa657610100808354040283529160200191610ad1565b820191906000526020600020905b815481529060010190602001808311610ab457829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610b595760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000600f544210158015610b8b57506010544211155b905090565b6000610b9b8261119d565b9050806001600160a01b0316836001600160a01b03161415610c095760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b50565b336001600160a01b0382161480610c255750610c258133610995565b610c975760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b50565b610ca18383611d60565b505050565b600080610cb1611cb7565b6064610cbf6103e886613066565b610cc99190612f67565b610cd39190613066565b90506000610ce56301e1853e83612f67565b6001600160a01b038616600090815260166020526040812054919250610d0b82426130b5565b9050610d178382613066565b979650505050505050565b610d2c3382611dce565b610d485760405162461bcd60e51b8152600401610b5090612efe565b610ca1838383611ec5565b6000806103e8610d6260085490565b610d6e90610d056130b5565b610d8090670de0b6b3a7640000613066565b610d8a9190612f67565b90506000610da16064670de0b6b3a7640000613066565b9050610dae826064613066565b610db89082612f4f565b9250505090565b6000610dca83611384565b8210610e2c5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610b50565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6000610e6033611384565b90506001811015610eb35760405162461bcd60e51b815260206004820152601e60248201527f4f6e6c7920686f6c64657273206172652061626c6520746f20636c61696d00006044820152606401610b50565b6000610ebf3383610ca6565b3360009081526016602090815260408083204290556017909152902054909150610eea908290612f4f565b336000908152601760205260409020555050565b600b546001600160a01b03163314610f285760405162461bcd60e51b8152600401610b5090612e6b565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b600b546001600160a01b03163314610f745760405162461bcd60e51b8152600401610b5090612e6b565b60004711610fc45760405162461bcd60e51b815260206004820152601860248201527f42616c616e6365206d75737420626520706f73697469766500000000000000006044820152606401610b50565b6012546001600160a01b031615801590610fe857506013546001600160a01b031615155b61102a5760405162461bcd60e51b815260206004820152601360248201527215d85b1b195d1cc81b5d5cdd081899481cd95d606a1b6044820152606401610b50565b476000611038600283612f67565b6012546040519192506001600160a01b03169082156108fc029083906000818181858888f19350505050158015611073573d6000803e3d6000fd5b506013546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015610ca1573d6000803e3d6000fd5b610ca1838383604051806020016040528060008152506118e8565b60006110d460085490565b82106111375760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610b50565b6008828154811061114a5761114a6131e7565b90600052602060002001549050919050565b600b546001600160a01b031633146111865760405162461bcd60e51b8152600401610b5090612e6b565b805161119990600e906020840190612996565b5050565b6000818152600260205260408120546001600160a01b031680610a435760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b50565b4260115411156112595760405162461bcd60e51b815260206004820152601060248201526f29b0b6329034b9903737ba1037b832b760811b6044820152606401610b50565b60018160ff16101561127d5760405162461bcd60e51b8152600401610b5090612ed0565b60058160ff1611156112c25760405162461bcd60e51b815260206004820152600e60248201526d43616e206d696e74206d6178203560901b6044820152606401610b50565b610d056112ce60085490565b6112db9060ff8416612f4f565b11156112f95760405162461bcd60e51b8152600401610b5090612ea0565b61130d60ff8216668e1bc9bf040000613085565b67ffffffffffffffff16341461137a5760405162461bcd60e51b815260206004820152602c60248201527f4574686572207375626d697474656420646f6573206e6f74206d61746368206360448201526b757272656e7420707269636560a01b6064820152608401610b50565b6111998282612070565b60006001600160a01b0382166113ef5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b50565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b031633146114355760405162461bcd60e51b8152600401610b5090612e6b565b61143f60006120b9565b565b600b546001600160a01b0316331461146b5760405162461bcd60e51b8152600401610b5090612e6b565b601155565b606060018054610a589061311b565b600b546001600160a01b031633146114a95760405162461bcd60e51b8152600401610b5090612e6b565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6114d3610b75565b61153b5760405162461bcd60e51b815260206004820152603360248201527f57686974656c697374696e6720646964206e6f7420737461727420796574206f604482015272391034ba13b99030b63932b0b23c9037bb32b960691b6064820152608401610b50565b336000908152601460209081526040808320805460ff191660011790556016909152902042905561156e6012600a612fbe565b611579906032613066565b33600090815260176020526040902055565b426011541115806115bd575060105442101580156115bd57503360009081526014602052604090205460ff1615156001145b6010544211156115f4576040518060400160405280600f81526020016e139bdd081dda1a5d195b1a5cdd1959608a1b81525061162b565b6040518060400160405280601a81526020017f57686974656c6973742073616c65206973206e6f74206f70656e0000000000008152505b906116495760405162461bcd60e51b8152600401610b509190612db7565b5060018160ff16101561166e5760405162461bcd60e51b8152600401610b5090612ed0565b60058160ff1611156116b35760405162461bcd60e51b815260206004820152600e60248201526d43616e206d696e74206d6178203560901b6044820152606401610b50565b610d056116bf60085490565b6116cc9060ff8416612f4f565b11156116ea5760405162461bcd60e51b8152600401610b5090612ea0565b6101f46116f6600d5490565b6117039060ff8416612f4f565b11156117475760405162461bcd60e51b815260206004820152601360248201527245786365656473206672656520737570706c7960681b6044820152606401610b50565b3360009081526015602052604090205460ff16156117a85761177360ff821666470de4df820000613085565b67ffffffffffffffff16341461179b5760405162461bcd60e51b8152600401610b5090612e1c565b6117a53382612070565b50565b60018160ff1611156117fb576117bf6001826130cc565b6117d39060ff1666470de4df820000613085565b67ffffffffffffffff1634146117fb5760405162461bcd60e51b8152600401610b5090612e1c565b336000908152601560205260409020805460ff1916600117905561179b600d80546001019055565b6001600160a01b03821633141561187c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b50565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6118f23383611dce565b61190e5760405162461bcd60e51b8152600401610b5090612efe565b61191a8484848461210b565b50505050565b600b546001600160a01b0316331461194a5760405162461bcd60e51b8152600401610b5090612e6b565b60018160ff16101561196e5760405162461bcd60e51b8152600401610b5090612ed0565b600a8160ff1611156119b45760405162461bcd60e51b815260206004820152600f60248201526e043616e206d696e74206d617820313608c1b6044820152606401610b50565b610d056119c060085490565b6119cd9060ff8416612f4f565b11156119eb5760405162461bcd60e51b8152600401610b5090612ea0565b60005b8160ff168160ff16101561119957611a0a600c80546001019055565b6000611a15600c5490565b9050611a21338261213e565b5080611a2c81613171565b9150506119ee565b600b546001600160a01b03163314611a5e5760405162461bcd60e51b8152600401610b5090612e6b565b600f55565b60006001600160a01b038216611ac65760405162461bcd60e51b815260206004820152602260248201527f42616c616e636520717565727920666f7220746865207a65726f206164647265604482015261737360f01b6064820152608401610b50565b506001600160a01b031660009081526017602052604090205490565b6060610a438261228c565b600f54421015611b3f5760405162461bcd60e51b815260206004820181905260248201527f57686974656c697374696e67206f722073616c65206e6f7420737461727465646044820152606401610b50565b3360009081526016602052604081205414611b915760405162461bcd60e51b8152602060048201526012602482015271165bdd48185b1c9958591e481a9bda5b995960721b6044820152606401610b50565b336000908152601660205260409020429055565b600b546001600160a01b03163314611bcf5760405162461bcd60e51b8152600401610b5090612e6b565b601055565b600b546001600160a01b03163314611bfe5760405162461bcd60e51b8152600401610b5090612e6b565b6001600160a01b038116611c635760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b50565b6117a5816120b9565b600b546001600160a01b03163314611c965760405162461bcd60e51b8152600401610b5090612e6b565b6001600160a01b03166000908152601460205260409020805460ff19169055565b6000806103e8611cc660085490565b611cd290610d056130b5565b611ce490670de0b6b3a7640000613066565b611cee9190612f67565b90506000611d056064670de0b6b3a7640000613066565b90506000611d14836064613066565b611d1e9083612f4f565b9050611d2933611384565b611d339082613066565b935050505090565b60006001600160e01b0319821663780e9d6360e01b1480610a435750610a43826123fe565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611d958261119d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611e475760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b50565b6000611e528361119d565b9050806001600160a01b0316846001600160a01b03161480611e8d5750836001600160a01b0316611e8284610adb565b6001600160a01b0316145b80611ebd57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611ed88261119d565b6001600160a01b031614611f405760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610b50565b6001600160a01b038216611fa25760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b50565b611fad83838361244e565b611fb8600082611d60565b6001600160a01b0383166000908152600360205260408120805460019290611fe19084906130b5565b90915550506001600160a01b038216600090815260036020526040812080546001929061200f908490612f4f565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60005b8160ff168160ff161015610ca15761208f600c80546001019055565b600061209a600c5490565b90506120a6848261213e565b50806120b181613171565b915050612073565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b612116848484611ec5565b61212284848484612459565b61191a5760405162461bcd60e51b8152600401610b5090612dca565b6001600160a01b0382166121945760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b50565b6000818152600260205260409020546001600160a01b0316156121f95760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b50565b6122056000838361244e565b6001600160a01b038216600090815260036020526040812080546001929061222e908490612f4f565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000818152600260205260409020546060906001600160a01b031661230d5760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b6064820152608401610b50565b6000828152600a6020526040812080546123269061311b565b80601f01602080910402602001604051908101604052809291908181526020018280546123529061311b565b801561239f5780601f106123745761010080835404028352916020019161239f565b820191906000526020600020905b81548152906001019060200180831161238257829003601f168201915b5050505050905060006123b0612566565b90508051600014156123c3575092915050565b8151156123f55780826040516020016123dd929190612d4b565b60405160208183030381529060405292505050919050565b611ebd84612575565b60006001600160e01b031982166380ac58cd60e01b148061242f57506001600160e01b03198216635b5e139f60e01b145b80610a4357506301ffc9a760e01b6001600160e01b0319831614610a43565b610ca1838383612650565b60006001600160a01b0384163b1561255b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061249d903390899088908890600401612d7a565b602060405180830381600087803b1580156124b757600080fd5b505af19250505080156124e7575060408051601f3d908101601f191682019092526124e491810190612c85565b60015b612541573d808015612515576040519150601f19603f3d011682016040523d82523d6000602084013e61251a565b606091505b5080516125395760405162461bcd60e51b8152600401610b5090612dca565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611ebd565b506001949350505050565b6060600e8054610a589061311b565b6000818152600260205260409020546060906001600160a01b03166125f45760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b50565b60006125fe612566565b9050600081511161261e5760405180602001604052806000815250612649565b8061262884612708565b604051602001612639929190612d4b565b6040516020818303038152906040525b9392505050565b6001600160a01b0383166126ab576126a681600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6126ce565b816001600160a01b0316836001600160a01b0316146126ce576126ce8382612806565b6001600160a01b0382166126e557610ca1816128a3565b826001600160a01b0316826001600160a01b031614610ca157610ca18282612952565b60608161272c5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612756578061274081613156565b915061274f9050600a83612f67565b9150612730565b60008167ffffffffffffffff811115612771576127716131fd565b6040519080825280601f01601f19166020018201604052801561279b576020820181803683370190505b5090505b8415611ebd576127b06001836130b5565b91506127bd600a86613191565b6127c8906030612f4f565b60f81b8183815181106127dd576127dd6131e7565b60200101906001600160f81b031916908160001a9053506127ff600a86612f67565b945061279f565b6000600161281384611384565b61281d91906130b5565b600083815260076020526040902054909150808214612870576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906128b5906001906130b5565b600083815260096020526040812054600880549394509092849081106128dd576128dd6131e7565b9060005260206000200154905080600883815481106128fe576128fe6131e7565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612936576129366131d1565b6001900381819060005260206000200160009055905550505050565b600061295d83611384565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b8280546129a29061311b565b90600052602060002090601f0160209004810192826129c45760008555612a0a565b82601f106129dd57805160ff1916838001178555612a0a565b82800160010185558215612a0a579182015b82811115612a0a5782518255916020019190600101906129ef565b50612a16929150612a1a565b5090565b5b80821115612a165760008155600101612a1b565b600067ffffffffffffffff80841115612a4a57612a4a6131fd565b604051601f8501601f19908116603f01168101908282118183101715612a7257612a726131fd565b81604052809350858152868686011115612a8b57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114612abc57600080fd5b919050565b803560ff81168114612abc57600080fd5b600060208284031215612ae457600080fd5b61264982612aa5565b60008060408385031215612b0057600080fd5b612b0983612aa5565b9150612b1760208401612aa5565b90509250929050565b600080600060608486031215612b3557600080fd5b612b3e84612aa5565b9250612b4c60208501612aa5565b9150604084013590509250925092565b60008060008060808587031215612b7257600080fd5b612b7b85612aa5565b9350612b8960208601612aa5565b925060408501359150606085013567ffffffffffffffff811115612bac57600080fd5b8501601f81018713612bbd57600080fd5b612bcc87823560208401612a2f565b91505092959194509250565b60008060408385031215612beb57600080fd5b612bf483612aa5565b915060208301358015158114612c0957600080fd5b809150509250929050565b60008060408385031215612c2757600080fd5b612c3083612aa5565b946020939093013593505050565b60008060408385031215612c5157600080fd5b612c5a83612aa5565b9150612b1760208401612ac1565b600060208284031215612c7a57600080fd5b813561264981613213565b600060208284031215612c9757600080fd5b815161264981613213565b600060208284031215612cb457600080fd5b813567ffffffffffffffff811115612ccb57600080fd5b8201601f81018413612cdc57600080fd5b611ebd84823560208401612a2f565b600060208284031215612cfd57600080fd5b5035919050565b600060208284031215612d1657600080fd5b61264982612ac1565b60008151808452612d378160208601602086016130ef565b601f01601f19169290920160200192915050565b60008351612d5d8184602088016130ef565b835190830190612d718183602088016130ef565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612dad90830184612d1f565b9695505050505050565b6020815260006126496020830184612d1f565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602f908201527f4574686572207375626d697474656420646f6573206e6f74206d61746368206460408201526e6973636f756e74656420707269636560881b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526016908201527545786365656473206d6178696d756d20737570706c7960501b604082015260600190565b6020808252601490820152734d757374206d696e74206174206c65617374203160601b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612f6257612f626131a5565b500190565b600082612f7657612f766131bb565b500490565b600181815b80851115612fb6578160001904821115612f9c57612f9c6131a5565b80851615612fa957918102915b93841c9390800290612f80565b509250929050565b60006126498383600082612fd457506001610a43565b81612fe157506000610a43565b8160018114612ff757600281146130015761301d565b6001915050610a43565b60ff841115613012576130126131a5565b50506001821b610a43565b5060208310610133831016604e8410600b8410161715613040575081810a610a43565b61304a8383612f7b565b806000190482111561305e5761305e6131a5565b029392505050565b6000816000190483118215151615613080576130806131a5565b500290565b600067ffffffffffffffff808316818516818304811182151516156130ac576130ac6131a5565b02949350505050565b6000828210156130c7576130c76131a5565b500390565b600060ff821660ff8416808210156130e6576130e66131a5565b90039392505050565b60005b8381101561310a5781810151838201526020016130f2565b8381111561191a5750506000910152565b600181811c9082168061312f57607f821691505b6020821081141561315057634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561316a5761316a6131a5565b5060010190565b600060ff821660ff811415613188576131886131a5565b60010192915050565b6000826131a0576131a06131bb565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146117a557600080fdfea264697066735822122073d0410a5d44c607e55b5b7ae20c407c6f47b50e3dca02c6700a525f802e41f664736f6c63430008070033

Deployed Bytecode Sourcemap

48333:9936:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57979:212;;;;;;;;;;-1:-1:-1;57979:212:0;;;;;:::i;:::-;;:::i;:::-;;;6255:14:1;;6248:22;6230:41;;6218:2;6203:18;57979:212:0;;;;;;;;27131:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;28824:308::-;;;;;;;;;;-1:-1:-1;28824:308:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;5553:32:1;;;5535:51;;5523:2;5508:18;28824:308:0;5389:203:1;51025:191:0;;;;;;;;;;;;;:::i;28347:411::-;;;;;;;;;;-1:-1:-1;28347:411:0;;;;;:::i;:::-;;:::i;48884:34::-;;;;;;;;;;;;;;;;;;;19970:25:1;;;19958:2;19943:18;48884:34:0;19824:177:1;40666:113:0;;;;;;;;;;-1:-1:-1;40754:10:0;:17;40666:113;;57113:489;;;;;;;;;;-1:-1:-1;57113:489:0;;;;;:::i;:::-;;:::i;49035:32::-;;;;;;;;;;-1:-1:-1;49035:32:0;;;;-1:-1:-1;;;;;49035:32:0;;;29883:376;;;;;;;;;;-1:-1:-1;29883:376:0;;;;;:::i;:::-;;:::i;56461:291::-;;;;;;;;;;;;;:::i;50901:116::-;;;;;;;;;;-1:-1:-1;50901:116:0;;;;;:::i;:::-;-1:-1:-1;;;;;50986:23:0;50962:4;50986:23;;;:15;:23;;;;;;;;;50901:116;49182:57;;;;;;;;;;-1:-1:-1;49182:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;40247:343;;;;;;;;;;-1:-1:-1;40247:343:0;;;;;:::i;:::-;;:::i;49002:26::-;;;;;;;;;;-1:-1:-1;49002:26:0;;;;-1:-1:-1;;;;;49002:26:0;;;56063:390;;;;;;;;;;;;;:::i;54596:102::-;;;;;;;;;;-1:-1:-1;54596:102:0;;;;;:::i;:::-;;:::i;50781:112::-;;;;;;;;;;-1:-1:-1;50781:112:0;;;;;:::i;:::-;-1:-1:-1;;;;;50865:20:0;50841:4;50865:20;;;:12;:20;;;;;;;;;50781:112;54828:451;;;;;;;;;;;;;:::i;50174:107::-;;;;;;;;;;-1:-1:-1;50251:22:0;50174:107;;;20180:18:1;20168:31;;;20150:50;;20138:2;20123:18;50174:107:0;20006:200:1;30330:185:0;;;;;;;;;;-1:-1:-1;30330:185:0;;;;;:::i;:::-;;:::i;51224:129::-;;;;;;;;;;-1:-1:-1;51303:23:0;;51330:15;-1:-1:-1;51303:42:0;51224:129;;40856:320;;;;;;;;;;-1:-1:-1;40856:320:0;;;;;:::i;:::-;;:::i;49368:120::-;;;;;;;;;;-1:-1:-1;49368:120:0;;;;;:::i;:::-;;:::i;51361:105::-;;;;;;;;;;-1:-1:-1;51429:10:0;;51443:15;-1:-1:-1;51429:29:0;51361:105;;26738:326;;;;;;;;;;-1:-1:-1;26738:326:0;;;;;:::i;:::-;;:::i;52980:594::-;;;;;;:::i;:::-;;:::i;26381:295::-;;;;;;;;;;-1:-1:-1;26381:295:0;;;;;:::i;:::-;;:::i;3799:94::-;;;;;;;;;;;;;:::i;49246:54::-;;;;;;;;;;-1:-1:-1;49246:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;49844:99;;;;;;;;;;-1:-1:-1;49844:99:0;;;;;:::i;:::-;;:::i;3148:87::-;;;;;;;;;;-1:-1:-1;3221:6:0;;-1:-1:-1;;;;;3221:6:0;3148:87;;27300:104;;;;;;;;;;;;;:::i;54706:114::-;;;;;;;;;;-1:-1:-1;54706:114:0;;;;;:::i;:::-;;:::i;49128:47::-;;;;;;;;;;-1:-1:-1;49128:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;50289:363;;;;;;;;;;;;;:::i;51474:1498::-;;;;;;:::i;:::-;;:::i;29204:327::-;;;;;;;;;;-1:-1:-1;29204:327:0;;;;;:::i;:::-;;:::i;50065:101::-;;;;;;;;;;-1:-1:-1;50136:22:0;50065:101;;48925:38;;;;;;;;;;;;;;;;48970:25;;;;;;;;;;;;;;;;30586:365;;;;;;;;;;-1:-1:-1;30586:365:0;;;;;:::i;:::-;;:::i;55921:134::-;;;;;;;;;;-1:-1:-1;55921:134:0;;;;;:::i;:::-;-1:-1:-1;;;;;56017:30:0;55990:7;56017:30;;;:22;:30;;;;;;;55921:134;48617:44;;;;;;;;;;;;48658:3;48617:44;;;;;19805:6:1;19793:19;;;19775:38;;19763:2;19748:18;48617:44:0;19631:188:1;53861:523:0;;;;;;;;;;-1:-1:-1;53861:523:0;;;;;:::i;:::-;;:::i;49496:158::-;;;;;;;;;;-1:-1:-1;49496:158:0;;;;;:::i;:::-;;:::i;55287:291::-;;;;;;;;;;-1:-1:-1;55287:291:0;;;;;:::i;:::-;;:::i;54392:196::-;;;;;;;;;;-1:-1:-1;54392:196:0;;;;;:::i;:::-;;:::i;48571:39::-;;;;;;;;;;;;48606:4;48571:39;;55586:327;;;;;;;;;;;;;:::i;29602:214::-;;;;;;;;;;-1:-1:-1;29602:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;29773:25:0;;;29744:4;29773:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;29602:214;49662:174;;;;;;;;;;-1:-1:-1;49662:174:0;;;;;:::i;:::-;;:::i;4048:229::-;;;;;;;;;;-1:-1:-1;4048:229:0;;;;;:::i;:::-;;:::i;50660:113::-;;;;;;;;;;-1:-1:-1;50660:113:0;;;;;:::i;:::-;;:::i;56760:345::-;;;;;;;;;;;;;:::i;57979:212::-;58118:4;58147:36;58171:11;58147:23;:36::i;:::-;58140:43;57979:212;-1:-1:-1;;57979:212:0:o;27131:100::-;27185:13;27218:5;27211:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27131:100;:::o;28824:308::-;28945:7;32587:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32587:16:0;28970:110;;;;-1:-1:-1;;;28970:110:0;;14518:2:1;28970:110:0;;;14500:21:1;14557:2;14537:18;;;14530:30;14596:34;14576:18;;;14569:62;-1:-1:-1;;;14647:18:1;;;14640:42;14699:19;;28970:110:0;;;;;;;;;-1:-1:-1;29100:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;29100:24:0;;28824:308::o;51025:191::-;51074:4;51130:19;;51111:15;:38;;:97;;;;;51185:23;;51166:15;:42;;51111:97;51091:117;;51025:191;:::o;28347:411::-;28428:13;28444:23;28459:7;28444:14;:23::i;:::-;28428:39;;28492:5;-1:-1:-1;;;;;28486:11:0;:2;-1:-1:-1;;;;;28486:11:0;;;28478:57;;;;-1:-1:-1;;;28478:57:0;;16864:2:1;28478:57:0;;;16846:21:1;16903:2;16883:18;;;16876:30;16942:34;16922:18;;;16915:62;-1:-1:-1;;;16993:18:1;;;16986:31;17034:19;;28478:57:0;16662:397:1;28478:57:0;2052:10;-1:-1:-1;;;;;28570:21:0;;;;:62;;-1:-1:-1;28595:37:0;28612:5;2052:10;29602:214;:::i;28595:37::-;28548:168;;;;-1:-1:-1;;;28548:168:0;;12073:2:1;28548:168:0;;;12055:21:1;12112:2;12092:18;;;12085:30;12151:34;12131:18;;;12124:62;12222:26;12202:18;;;12195:54;12266:19;;28548:168:0;11871:420:1;28548:168:0;28729:21;28738:2;28742:7;28729:8;:21::i;:::-;28417:341;28347:411;;:::o;57113:489::-;57230:7;57255:16;57326:26;:24;:26::i;:::-;57319:3;57275:39;48780:4;57275:11;:39;:::i;:::-;57274:49;;;;:::i;:::-;:78;;;;:::i;:::-;57255:97;-1:-1:-1;57363:23:0;57389:28;57408:8;57255:97;57389:28;:::i;:::-;-1:-1:-1;;;;;57452:31:0;;57428:21;57452:31;;;:22;:31;;;;;;57363:54;;-1:-1:-1;57515:31:0;57452;57515:15;:31;:::i;:::-;57494:52;-1:-1:-1;57565:28:0;57578:15;57494:52;57565:28;:::i;:::-;57557:37;57113:489;-1:-1:-1;;;;;;;57113:489:0:o;29883:376::-;30092:41;2052:10;30125:7;30092:18;:41::i;:::-;30070:140;;;;-1:-1:-1;;;30070:140:0;;;;;;;:::i;:::-;30223:28;30233:4;30239:2;30243:7;30223:9;:28::i;56461:291::-;56524:7;56544:12;48780:4;56573:13;40754:10;:17;;40666:113;56573:13;56561:25;;48606:4;56561:25;:::i;:::-;56560:38;;56591:6;56560:38;:::i;:::-;56559:68;;;;:::i;:::-;56544:83;-1:-1:-1;56638:16:0;56657:30;48839:3;56680:6;56657:30;:::i;:::-;56638:49;-1:-1:-1;56717:26:0;56739:4;48839:3;56717:26;:::i;:::-;56705:39;;:8;:39;:::i;:::-;56698:46;;;;56461:291;:::o;40247:343::-;40389:7;40444:23;40461:5;40444:16;:23::i;:::-;40436:5;:31;40414:124;;;;-1:-1:-1;;;40414:124:0;;6708:2:1;40414:124:0;;;6690:21:1;6747:2;6727:18;;;6720:30;6786:34;6766:18;;;6759:62;-1:-1:-1;;;6837:18:1;;;6830:41;6888:19;;40414:124:0;6506:407:1;40414:124:0;-1:-1:-1;;;;;;40556:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;40247:343::o;56063:390::-;56110:19;56132:21;56142:10;56132:9;:21::i;:::-;56110:43;;56187:1;56172:11;:16;;56164:59;;;;-1:-1:-1;;;56164:59:0;;8300:2:1;56164:59:0;;;8282:21:1;8339:2;8319:18;;;8312:30;8378:32;8358:18;;;8351:60;8428:18;;56164:59:0;8098:354:1;56164:59:0;56234:14;56251:46;56273:10;56285:11;56251:21;:46::i;:::-;56331:10;56308:34;;;;:22;:34;;;;;;;;56345:15;56308:52;;56405:19;:31;;;;;;56234:63;;-1:-1:-1;56405:40:0;;56234:63;;56405:40;:::i;:::-;56391:10;56371:31;;;;:19;:31;;;;;:74;-1:-1:-1;;56063:390:0:o;54596:102::-;3221:6;;-1:-1:-1;;;;;3221:6:0;2052:10;3368:23;3360:68;;;;-1:-1:-1;;;3360:68:0;;;;;;;:::i;:::-;54669:11:::1;:21:::0;;-1:-1:-1;;;;;;54669:21:0::1;-1:-1:-1::0;;;;;54669:21:0;;;::::1;::::0;;;::::1;::::0;;54596:102::o;54828:451::-;3221:6;;-1:-1:-1;;;;;3221:6:0;2052:10;3368:23;3360:68;;;;-1:-1:-1;;;3360:68:0;;;;;;;:::i;:::-;54908:1:::1;54884:21;:25;54876:62;;;::::0;-1:-1:-1;;;54876:62:0;;9784:2:1;54876:62:0::1;::::0;::::1;9766:21:1::0;9823:2;9803:18;;;9796:30;9862:26;9842:18;;;9835:54;9906:18;;54876:62:0::1;9582:348:1::0;54876:62:0::1;54971:11;::::0;-1:-1:-1;;;;;54971:11:0::1;:25:::0;;::::1;::::0;:60:::1;;-1:-1:-1::0;55000:17:0::1;::::0;-1:-1:-1;;;;;55000:17:0::1;:31:::0;::::1;54971:60;54949:129;;;::::0;-1:-1:-1;;;54949:129:0;;7952:2:1;54949:129:0::1;::::0;::::1;7934:21:1::0;7991:2;7971:18;;;7964:30;-1:-1:-1;;;8010:18:1;;;8003:49;8069:18;;54949:129:0::1;7750:343:1::0;54949:129:0::1;55108:21;55089:16;55157:12;55168:1;55108:21:::0;55157:12:::1;:::i;:::-;55188:11;::::0;55180:37:::1;::::0;55140:29;;-1:-1:-1;;;;;;55188:11:0::1;::::0;55180:37;::::1;;;::::0;55140:29;;55188:11:::1;55180:37:::0;55188:11;55180:37;55140:29;55188:11;55180:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;55236:17:0::1;::::0;55228:43:::1;::::0;-1:-1:-1;;;;;55236:17:0;;::::1;::::0;55228:43;::::1;;;::::0;55264:6;;55236:17:::1;55228:43:::0;55236:17;55228:43;55264:6;55236:17;55228:43;::::1;;;;;;;;;;;;;::::0;::::1;;;;30330:185:::0;30468:39;30485:4;30491:2;30495:7;30468:39;;;;;;;;;;;;:16;:39::i;40856:320::-;40976:7;41031:30;40754:10;:17;;40666:113;41031:30;41023:5;:38;41001:132;;;;-1:-1:-1;;;41001:132:0;;19076:2:1;41001:132:0;;;19058:21:1;19115:2;19095:18;;;19088:30;19154:34;19134:18;;;19127:62;-1:-1:-1;;;19205:18:1;;;19198:42;19257:19;;41001:132:0;18874:408:1;41001:132:0;41151:10;41162:5;41151:17;;;;;;;;:::i;:::-;;;;;;;;;41144:24;;40856:320;;;:::o;49368:120::-;3221:6;;-1:-1:-1;;;;;3221:6:0;2052:10;3368:23;3360:68;;;;-1:-1:-1;;;3360:68:0;;;;;;;:::i;:::-;49448:32;;::::1;::::0;:13:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;:::-;;49368:120:::0;:::o;26738:326::-;26855:7;26896:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26896:16:0;26945:19;26923:110;;;;-1:-1:-1;;;26923:110:0;;12909:2:1;26923:110:0;;;12891:21:1;12948:2;12928:18;;;12921:30;12987:34;12967:18;;;12960:62;-1:-1:-1;;;13038:18:1;;;13031:39;13087:19;;26923:110:0;12707:405:1;52980:594:0;53082:15;53068:10;;:29;;53060:58;;;;-1:-1:-1;;;53060:58:0;;18313:2:1;53060:58:0;;;18295:21:1;18352:2;18332:18;;;18325:30;-1:-1:-1;;;18371:18:1;;;18364:46;18427:18;;53060:58:0;18111:340:1;53060:58:0;53156:1;53137:15;:20;;;;53129:53;;;;-1:-1:-1;;;53129:53:0;;;;;;;:::i;:::-;53220:1;53201:15;:20;;;;53193:47;;;;-1:-1:-1;;;53193:47:0;;16521:2:1;53193:47:0;;;16503:21:1;16560:2;16540:18;;;16533:30;-1:-1:-1;;;16579:18:1;;;16572:44;16633:18;;53193:47:0;16319:338:1;53193:47:0;48606:4;53292:13;40754:10;:17;;40666:113;53292:13;53274:31;;;;;;:::i;:::-;53273:46;;53251:118;;;;-1:-1:-1;;;53251:118:0;;;;;;;:::i;:::-;53416:32;;;;50136:22;53416:32;:::i;:::-;53402:47;;:9;:47;53380:141;;;;-1:-1:-1;;;53380:141:0;;7120:2:1;53380:141:0;;;7102:21:1;7159:2;7139:18;;;7132:30;7198:34;7178:18;;;7171:62;-1:-1:-1;;;7249:18:1;;;7242:42;7301:19;;53380:141:0;6918:408:1;53380:141:0;53532:34;53541:7;53550:15;53532:8;:34::i;26381:295::-;26498:7;-1:-1:-1;;;;;26545:19:0;;26523:111;;;;-1:-1:-1;;;26523:111:0;;12498:2:1;26523:111:0;;;12480:21:1;12537:2;12517:18;;;12510:30;12576:34;12556:18;;;12549:62;-1:-1:-1;;;12627:18:1;;;12620:40;12677:19;;26523:111:0;12296:406:1;26523:111:0;-1:-1:-1;;;;;;26652:16:0;;;;;:9;:16;;;;;;;26381:295::o;3799:94::-;3221:6;;-1:-1:-1;;;;;3221:6:0;2052:10;3368:23;3360:68;;;;-1:-1:-1;;;3360:68:0;;;;;;;:::i;:::-;3864:21:::1;3882:1;3864:9;:21::i;:::-;3799:94::o:0;49844:99::-;3221:6;;-1:-1:-1;;;;;3221:6:0;2052:10;3368:23;3360:68;;;;-1:-1:-1;;;3360:68:0;;;;;;;:::i;:::-;49913:10:::1;:22:::0;49844:99::o;27300:104::-;27356:13;27389:7;27382:14;;;;;:::i;54706:114::-;3221:6;;-1:-1:-1;;;;;3221:6:0;2052:10;3368:23;3360:68;;;;-1:-1:-1;;;3360:68:0;;;;;;;:::i;:::-;54785:17:::1;:27:::0;;-1:-1:-1;;;;;;54785:27:0::1;-1:-1:-1::0;;;;;54785:27:0;;;::::1;::::0;;;::::1;::::0;;54706:114::o;50289:363::-;50355:18;:16;:18::i;:::-;50333:119;;;;-1:-1:-1;;;50333:119:0;;14098:2:1;50333:119:0;;;14080:21:1;14137:2;14117:18;;;14110:30;14176:34;14156:18;;;14149:62;-1:-1:-1;;;14227:18:1;;;14220:49;14286:19;;50333:119:0;13896:415:1;50333:119:0;50476:10;50463:24;;;;:12;:24;;;;;;;;:31;;-1:-1:-1;;50463:31:0;50490:4;50463:31;;;50505:22;:34;;;;;50542:15;50505:52;;50626:17;50640:2;50626;:17;:::i;:::-;50602:42;;48717:2;50602:42;:::i;:::-;50588:10;50568:31;;;;:19;:31;;;;;:76;50289:363::o;51474:1498::-;51584:15;51570:10;;:29;;:151;;;;51640:23;;51621:15;:42;;:99;;;;-1:-1:-1;51701:10:0;51688:24;;;;:12;:24;;;;;;;;:32;;:24;:32;51621:99;51755:23;;51736:15;:42;;:127;;;;;;;;;;;;;;;-1:-1:-1;;;51736:127:0;;;;;;;;;;;;;;;;;;;;;;;;51548:326;;;;;-1:-1:-1;;;51548:326:0;;;;;;;;:::i;:::-;;51912:1;51893:15;:20;;;;51885:53;;;;-1:-1:-1;;;51885:53:0;;;;;;;:::i;:::-;51976:1;51957:15;:20;;;;51949:47;;;;-1:-1:-1;;;51949:47:0;;16521:2:1;51949:47:0;;;16503:21:1;16560:2;16540:18;;;16533:30;-1:-1:-1;;;16579:18:1;;;16572:44;16633:18;;51949:47:0;16319:338:1;51949:47:0;48606:4;52050:13;40754:10;:17;;40666:113;52050:13;52032:31;;;;;;:::i;:::-;52031:46;;52009:118;;;;-1:-1:-1;;;52009:118:0;;;;;;;:::i;:::-;48658:3;52179:21;:11;850:14;;758:114;52179:21;52161:39;;;;;;:::i;:::-;52160:60;;52138:129;;;;-1:-1:-1;;;52138:129:0;;11725:2:1;52138:129:0;;;11707:21:1;11764:2;11744:18;;;11737:30;-1:-1:-1;;;11783:18:1;;;11776:49;11842:18;;52138:129:0;11523:343:1;52138:129:0;52300:10;52284:27;;;;:15;:27;;;;;;;;52280:685;;;52368:38;;;;50251:22;52368:38;:::i;:::-;52354:53;;:9;:53;52328:162;;;;-1:-1:-1;;;52328:162:0;;;;;;;:::i;:::-;52505:37;52514:10;52526:15;52505:8;:37::i;:::-;51474:1498;:::o;52280:685::-;52597:1;52579:15;:19;;;52575:240;;;52687:19;52705:1;52687:15;:19;:::i;:::-;52663:44;;;;50251:22;52663:44;:::i;:::-;52649:59;;:9;:59;52619:180;;;;-1:-1:-1;;;52619:180:0;;;;;;;:::i;:::-;52845:10;52829:27;;;;:15;:27;;;;;:34;;-1:-1:-1;;52829:34:0;52859:4;52829:34;;;52878:23;:11;969:19;;987:1;969:19;;;880:127;29204:327;-1:-1:-1;;;;;29339:24:0;;2052:10;29339:24;;29331:62;;;;-1:-1:-1;;;29331:62:0;;10958:2:1;29331:62:0;;;10940:21:1;10997:2;10977:18;;;10970:30;11036:27;11016:18;;;11009:55;11081:18;;29331:62:0;10756:349:1;29331:62:0;2052:10;29406:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;29406:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;29406:53:0;;;;;;;;;;29475:48;;6230:41:1;;;29406:42:0;;2052:10;29475:48;;6203:18:1;29475:48:0;;;;;;;29204:327;;:::o;30586:365::-;30775:41;2052:10;30808:7;30775:18;:41::i;:::-;30753:140;;;;-1:-1:-1;;;30753:140:0;;;;;;;:::i;:::-;30904:39;30918:4;30924:2;30928:7;30937:5;30904:13;:39::i;:::-;30586:365;;;;:::o;53861:523::-;3221:6;;-1:-1:-1;;;;;3221:6:0;2052:10;3368:23;3360:68;;;;-1:-1:-1;;;3360:68:0;;;;;;;:::i;:::-;53960:1:::1;53941:15;:20;;;;53933:53;;;;-1:-1:-1::0;;;53933:53:0::1;;;;;;;:::i;:::-;54024:2;54005:15;:21;;;;53997:49;;;::::0;-1:-1:-1;;;53997:49:0;;19489:2:1;53997:49:0::1;::::0;::::1;19471:21:1::0;19528:2;19508:18;;;19501:30;-1:-1:-1;;;19547:18:1;;;19540:45;19602:18;;53997:49:0::1;19287:339:1::0;53997:49:0::1;48606:4;54098:13;40754:10:::0;:17;;40666:113;54098:13:::1;54080:31;::::0;::::1;::::0;::::1;;:::i;:::-;54079:46;;54057:118;;;;-1:-1:-1::0;;;54057:118:0::1;;;;;;;:::i;:::-;54193:7;54188:189;54210:15;54206:19;;:1;:19;;;54188:189;;;54247:21;:9;969:19:::0;;987:1;969:19;;;880:127;54247:21:::1;54283:17;54303:19;:9;850:14:::0;;758:114;54303:19:::1;54283:39;;54337:28;54343:10;54355:9;54337:5;:28::i;:::-;-1:-1:-1::0;54227:3:0;::::1;::::0;::::1;:::i;:::-;;;;54188:189;;49496:158:::0;3221:6;;-1:-1:-1;;;;;3221:6:0;2052:10;3368:23;3360:68;;;;-1:-1:-1;;;3360:68:0;;;;;;;:::i;:::-;49606:19:::1;:40:::0;49496:158::o;55287:291::-;55398:7;-1:-1:-1;;;;;55445:19:0;;55423:103;;;;-1:-1:-1;;;55423:103:0;;15292:2:1;55423:103:0;;;15274:21:1;15331:2;15311:18;;;15304:30;15370:34;15350:18;;;15343:62;-1:-1:-1;;;15421:18:1;;;15414:32;15463:19;;55423:103:0;15090:398:1;55423:103:0;-1:-1:-1;;;;;;55544:26:0;;;;;:19;:26;;;;;;;55287:291::o;54392:196::-;54519:13;54557:23;54572:7;54557:14;:23::i;55586:327::-;55659:19;;55640:15;:38;;55632:83;;;;-1:-1:-1;;;55632:83:0;;9423:2:1;55632:83:0;;;9405:21:1;;;9442:18;;;9435:30;9501:34;9481:18;;;9474:62;9553:18;;55632:83:0;9221:356:1;55632:83:0;55771:10;55794:1;56017:30;;;:22;:30;;;;;;55748:48;55726:116;;;;-1:-1:-1;;;55726:116:0;;17617:2:1;55726:116:0;;;17599:21:1;17656:2;17636:18;;;17629:30;-1:-1:-1;;;17675:18:1;;;17668:48;17733:18;;55726:116:0;17415:342:1;55726:116:0;55876:10;55853:34;;;;:22;:34;;;;;55890:15;55853:52;;55586:327::o;49662:174::-;3221:6;;-1:-1:-1;;;;;3221:6:0;2052:10;3368:23;3360:68;;;;-1:-1:-1;;;3360:68:0;;;;;;;:::i;:::-;49780:23:::1;:48:::0;49662:174::o;4048:229::-;3221:6;;-1:-1:-1;;;;;3221:6:0;2052:10;3368:23;3360:68;;;;-1:-1:-1;;;3360:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4151:22:0;::::1;4129:110;;;::::0;-1:-1:-1;;;4129:110:0;;8659:2:1;4129:110:0::1;::::0;::::1;8641:21:1::0;8698:2;8678:18;;;8671:30;8737:34;8717:18;;;8710:62;-1:-1:-1;;;8788:18:1;;;8781:36;8834:19;;4129:110:0::1;8457:402:1::0;4129:110:0::1;4250:19;4260:8;4250:9;:19::i;50660:113::-:0;3221:6;;-1:-1:-1;;;;;3221:6:0;2052:10;3368:23;3360:68;;;;-1:-1:-1;;;3360:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50737:20:0::1;50760:5;50737:20:::0;;;:12:::1;:20;::::0;;;;:28;;-1:-1:-1;;50737:28:0::1;::::0;;50660:113::o;56760:345::-;56817:7;56837:12;48780:4;56866:13;40754:10;:17;;40666:113;56866:13;56854:25;;48606:4;56854:25;:::i;:::-;56853:38;;56884:6;56853:38;:::i;:::-;56852:68;;;;:::i;:::-;56837:83;-1:-1:-1;56931:16:0;56950:30;48839:3;56973:6;56950:30;:::i;:::-;56931:49;-1:-1:-1;56991:15:0;57021:26;57043:4;48839:3;57021:26;:::i;:::-;57009:39;;:8;:39;:::i;:::-;56991:57;;57076:21;57086:10;57076:9;:21::i;:::-;57066:31;;:7;:31;:::i;:::-;57059:38;;;;;56760:345;:::o;39863:300::-;40010:4;-1:-1:-1;;;;;;40052:50:0;;-1:-1:-1;;;40052:50:0;;:103;;;40119:36;40143:11;40119:23;:36::i;36621:174::-;36696:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;36696:29:0;-1:-1:-1;;;;;36696:29:0;;;;;;;;:24;;36750:23;36696:24;36750:14;:23::i;:::-;-1:-1:-1;;;;;36741:46:0;;;;;;;;;;;36621:174;;:::o;32792:452::-;32921:4;32587:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32587:16:0;32943:110;;;;-1:-1:-1;;;32943:110:0;;11312:2:1;32943:110:0;;;11294:21:1;11351:2;11331:18;;;11324:30;11390:34;11370:18;;;11363:62;-1:-1:-1;;;11441:18:1;;;11434:42;11493:19;;32943:110:0;11110:408:1;32943:110:0;33064:13;33080:23;33095:7;33080:14;:23::i;:::-;33064:39;;33133:5;-1:-1:-1;;;;;33122:16:0;:7;-1:-1:-1;;;;;33122:16:0;;:64;;;;33179:7;-1:-1:-1;;;;;33155:31:0;:20;33167:7;33155:11;:20::i;:::-;-1:-1:-1;;;;;33155:31:0;;33122:64;:113;;;-1:-1:-1;;;;;;29773:25:0;;;29744:4;29773:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;33203:32;33114:122;32792:452;-1:-1:-1;;;;32792:452:0:o;35888:615::-;36061:4;-1:-1:-1;;;;;36034:31:0;:23;36049:7;36034:14;:23::i;:::-;-1:-1:-1;;;;;36034:31:0;;36012:122;;;;-1:-1:-1;;;36012:122:0;;15695:2:1;36012:122:0;;;15677:21:1;15734:2;15714:18;;;15707:30;15773:34;15753:18;;;15746:62;-1:-1:-1;;;15824:18:1;;;15817:39;15873:19;;36012:122:0;15493:405:1;36012:122:0;-1:-1:-1;;;;;36153:16:0;;36145:65;;;;-1:-1:-1;;;36145:65:0;;10553:2:1;36145:65:0;;;10535:21:1;10592:2;10572:18;;;10565:30;10631:34;10611:18;;;10604:62;-1:-1:-1;;;10682:18:1;;;10675:34;10726:19;;36145:65:0;10351:400:1;36145:65:0;36223:39;36244:4;36250:2;36254:7;36223:20;:39::i;:::-;36327:29;36344:1;36348:7;36327:8;:29::i;:::-;-1:-1:-1;;;;;36369:15:0;;;;;;:9;:15;;;;;:20;;36388:1;;36369:15;:20;;36388:1;;36369:20;:::i;:::-;;;;-1:-1:-1;;;;;;;36400:13:0;;;;;;:9;:13;;;;;:18;;36417:1;;36400:13;:18;;36417:1;;36400:18;:::i;:::-;;;;-1:-1:-1;;36429:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;36429:21:0;-1:-1:-1;;;;;36429:21:0;;;;;;;;;36468:27;;36429:16;;36468:27;;;;;;;35888:615;;;:::o;53582:271::-;53665:7;53660:186;53682:15;53678:19;;:1;:19;;;53660:186;;;53719:21;:9;969:19;;987:1;969:19;;;880:127;53719:21;53755:17;53775:19;:9;850:14;;758:114;53775:19;53755:39;;53809:25;53815:7;53824:9;53809:5;:25::i;:::-;-1:-1:-1;53699:3:0;;;;:::i;:::-;;;;53660:186;;4285:173;4360:6;;;-1:-1:-1;;;;;4377:17:0;;;-1:-1:-1;;;;;;4377:17:0;;;;;;;4410:40;;4360:6;;;4377:17;4360:6;;4410:40;;4341:16;;4410:40;4330:128;4285:173;:::o;31833:352::-;31990:28;32000:4;32006:2;32010:7;31990:9;:28::i;:::-;32051:48;32074:4;32080:2;32084:7;32093:5;32051:22;:48::i;:::-;32029:148;;;;-1:-1:-1;;;32029:148:0;;;;;;;:::i;34580:382::-;-1:-1:-1;;;;;34660:16:0;;34652:61;;;;-1:-1:-1;;;34652:61:0;;13319:2:1;34652:61:0;;;13301:21:1;;;13338:18;;;13331:30;13397:34;13377:18;;;13370:62;13449:18;;34652:61:0;13117:356:1;34652:61:0;32563:4;32587:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32587:16:0;:30;34724:58;;;;-1:-1:-1;;;34724:58:0;;9066:2:1;34724:58:0;;;9048:21:1;9105:2;9085:18;;;9078:30;9144;9124:18;;;9117:58;9192:18;;34724:58:0;8864:352:1;34724:58:0;34795:45;34824:1;34828:2;34832:7;34795:20;:45::i;:::-;-1:-1:-1;;;;;34853:13:0;;;;;;:9;:13;;;;;:18;;34870:1;;34853:13;:18;;34870:1;;34853:18;:::i;:::-;;;;-1:-1:-1;;34882:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34882:21:0;-1:-1:-1;;;;;34882:21:0;;;;;;;;34921:33;;34882:16;;;34921:33;;34882:16;;34921:33;34580:382;;:::o;46618:766::-;32563:4;32587:16;;;:7;:16;;;;;;46736:13;;-1:-1:-1;;;;;32587:16:0;46767:115;;;;-1:-1:-1;;;46767:115:0;;13680:2:1;46767:115:0;;;13662:21:1;13719:2;13699:18;;;13692:30;13758:34;13738:18;;;13731:62;-1:-1:-1;;;13809:18:1;;;13802:47;13866:19;;46767:115:0;13478:413:1;46767:115:0;46895:23;46921:19;;;:10;:19;;;;;46895:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46951:18;46972:10;:8;:10::i;:::-;46951:31;;47064:4;47058:18;47080:1;47058:23;47054:72;;;-1:-1:-1;47105:9:0;46618:766;-1:-1:-1;;46618:766:0:o;47054:72::-;47230:23;;:27;47226:108;;47305:4;47311:9;47288:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47274:48;;;;46618:766;;;:::o;47226:108::-;47353:23;47368:7;47353:14;:23::i;25962:355::-;26109:4;-1:-1:-1;;;;;;26151:40:0;;-1:-1:-1;;;26151:40:0;;:105;;-1:-1:-1;;;;;;;26208:48:0;;-1:-1:-1;;;26208:48:0;26151:105;:158;;;-1:-1:-1;;;;;;;;;;6451:40:0;;;26273:36;6292:207;57610:215;57772:45;57799:4;57805:2;57809:7;57772:26;:45::i;37360:984::-;37515:4;-1:-1:-1;;;;;37536:13:0;;9743:20;9791:8;37532:805;;37589:175;;-1:-1:-1;;;37589:175:0;;-1:-1:-1;;;;;37589:36:0;;;;;:175;;2052:10;;37683:4;;37710:7;;37740:5;;37589:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37589:175:0;;;;;;;;-1:-1:-1;;37589:175:0;;;;;;;;;;;;:::i;:::-;;;37568:714;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37951:13:0;;37947:320;;37994:108;;-1:-1:-1;;;37994:108:0;;;;;;;:::i;37947:320::-;38217:6;38211:13;38202:6;38198:2;38194:15;38187:38;37568:714;-1:-1:-1;;;;;;37828:55:0;-1:-1:-1;;;37828:55:0;;-1:-1:-1;37821:62:0;;37532:805;-1:-1:-1;38321:4:0;37360:984;;;;;;:::o;49951:106::-;50003:13;50036;50029:20;;;;;:::i;27475:468::-;32563:4;32587:16;;;:7;:16;;;;;;27593:13;;-1:-1:-1;;;;;32587:16:0;27624:113;;;;-1:-1:-1;;;27624:113:0;;16105:2:1;27624:113:0;;;16087:21:1;16144:2;16124:18;;;16117:30;16183:34;16163:18;;;16156:62;-1:-1:-1;;;16234:18:1;;;16227:45;16289:19;;27624:113:0;15903:411:1;27624:113:0;27750:21;27774:10;:8;:10::i;:::-;27750:34;;27839:1;27821:7;27815:21;:25;:120;;;;;;;;;;;;;;;;;27884:7;27893:18;:7;:16;:18::i;:::-;27867:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27815:120;27795:140;27475:468;-1:-1:-1;;;27475:468:0:o;41789:589::-;-1:-1:-1;;;;;41995:18:0;;41991:187;;42030:40;42062:7;43205:10;:17;;43178:24;;;;:15;:24;;;;;:44;;;43233:24;;;;;;;;;;;;43101:164;42030:40;41991:187;;;42100:2;-1:-1:-1;;;;;42092:10:0;:4;-1:-1:-1;;;;;42092:10:0;;42088:90;;42119:47;42152:4;42158:7;42119:32;:47::i;:::-;-1:-1:-1;;;;;42192:16:0;;42188:183;;42225:45;42262:7;42225:36;:45::i;42188:183::-;42298:4;-1:-1:-1;;;;;42292:10:0;:2;-1:-1:-1;;;;;42292:10:0;;42288:83;;42319:40;42347:2;42351:7;42319:27;:40::i;6813:723::-;6869:13;7090:10;7086:53;;-1:-1:-1;;7117:10:0;;;;;;;;;;;;-1:-1:-1;;;7117:10:0;;;;;6813:723::o;7086:53::-;7164:5;7149:12;7205:78;7212:9;;7205:78;;7238:8;;;;:::i;:::-;;-1:-1:-1;7261:10:0;;-1:-1:-1;7269:2:0;7261:10;;:::i;:::-;;;7205:78;;;7293:19;7325:6;7315:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7315:17:0;;7293:39;;7343:154;7350:10;;7343:154;;7377:11;7387:1;7377:11;;:::i;:::-;;-1:-1:-1;7446:10:0;7454:2;7446:5;:10;:::i;:::-;7433:24;;:2;:24;:::i;:::-;7420:39;;7403:6;7410;7403:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;7403:56:0;;;;;;;;-1:-1:-1;7474:11:0;7483:2;7474:11;;:::i;:::-;;;7343:154;;43892:1002;44172:22;44222:1;44197:22;44214:4;44197:16;:22::i;:::-;:26;;;;:::i;:::-;44234:18;44255:26;;;:17;:26;;;;;;44172:51;;-1:-1:-1;44388:28:0;;;44384:328;;-1:-1:-1;;;;;44455:18:0;;44433:19;44455:18;;;:12;:18;;;;;;;;:34;;;;;;;;;44506:30;;;;;;:44;;;44623:30;;:17;:30;;;;;:43;;;44384:328;-1:-1:-1;44808:26:0;;;;:17;:26;;;;;;;;44801:33;;;-1:-1:-1;;;;;44852:18:0;;;;;:12;:18;;;;;:34;;;;;;;44845:41;43892:1002::o;45189:1079::-;45467:10;:17;45442:22;;45467:21;;45487:1;;45467:21;:::i;:::-;45499:18;45520:24;;;:15;:24;;;;;;45893:10;:26;;45442:46;;-1:-1:-1;45520:24:0;;45442:46;;45893:26;;;;;;:::i;:::-;;;;;;;;;45871:48;;45957:11;45932:10;45943;45932:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;46037:28;;;:15;:28;;;;;;;:41;;;46209:24;;;;;46202:31;46244:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;45260:1008;;;45189:1079;:::o;42679:221::-;42764:14;42781:20;42798:2;42781:16;:20::i;:::-;-1:-1:-1;;;;;42812:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;42857:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;42679:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:156::-;894:20;;954:4;943:16;;933:27;;923:55;;974:1;971;964:12;989:186;1048:6;1101:2;1089:9;1080:7;1076:23;1072:32;1069:52;;;1117:1;1114;1107:12;1069:52;1140:29;1159:9;1140:29;:::i;1180:260::-;1248:6;1256;1309:2;1297:9;1288:7;1284:23;1280:32;1277:52;;;1325:1;1322;1315:12;1277:52;1348:29;1367:9;1348:29;:::i;:::-;1338:39;;1396:38;1430:2;1419:9;1415:18;1396:38;:::i;:::-;1386:48;;1180:260;;;;;:::o;1445:328::-;1522:6;1530;1538;1591:2;1579:9;1570:7;1566:23;1562:32;1559:52;;;1607:1;1604;1597:12;1559:52;1630:29;1649:9;1630:29;:::i;:::-;1620:39;;1678:38;1712:2;1701:9;1697:18;1678:38;:::i;:::-;1668:48;;1763:2;1752:9;1748:18;1735:32;1725:42;;1445:328;;;;;:::o;1778:666::-;1873:6;1881;1889;1897;1950:3;1938:9;1929:7;1925:23;1921:33;1918:53;;;1967:1;1964;1957:12;1918:53;1990:29;2009:9;1990:29;:::i;:::-;1980:39;;2038:38;2072:2;2061:9;2057:18;2038:38;:::i;:::-;2028:48;;2123:2;2112:9;2108:18;2095:32;2085:42;;2178:2;2167:9;2163:18;2150:32;2205:18;2197:6;2194:30;2191:50;;;2237:1;2234;2227:12;2191:50;2260:22;;2313:4;2305:13;;2301:27;-1:-1:-1;2291:55:1;;2342:1;2339;2332:12;2291:55;2365:73;2430:7;2425:2;2412:16;2407:2;2403;2399:11;2365:73;:::i;:::-;2355:83;;;1778:666;;;;;;;:::o;2449:347::-;2514:6;2522;2575:2;2563:9;2554:7;2550:23;2546:32;2543:52;;;2591:1;2588;2581:12;2543:52;2614:29;2633:9;2614:29;:::i;:::-;2604:39;;2693:2;2682:9;2678:18;2665:32;2740:5;2733:13;2726:21;2719:5;2716:32;2706:60;;2762:1;2759;2752:12;2706:60;2785:5;2775:15;;;2449:347;;;;;:::o;2801:254::-;2869:6;2877;2930:2;2918:9;2909:7;2905:23;2901:32;2898:52;;;2946:1;2943;2936:12;2898:52;2969:29;2988:9;2969:29;:::i;:::-;2959:39;3045:2;3030:18;;;;3017:32;;-1:-1:-1;;;2801:254:1:o;3060:256::-;3126:6;3134;3187:2;3175:9;3166:7;3162:23;3158:32;3155:52;;;3203:1;3200;3193:12;3155:52;3226:29;3245:9;3226:29;:::i;:::-;3216:39;;3274:36;3306:2;3295:9;3291:18;3274:36;:::i;3321:245::-;3379:6;3432:2;3420:9;3411:7;3407:23;3403:32;3400:52;;;3448:1;3445;3438:12;3400:52;3487:9;3474:23;3506:30;3530:5;3506:30;:::i;3571:249::-;3640:6;3693:2;3681:9;3672:7;3668:23;3664:32;3661:52;;;3709:1;3706;3699:12;3661:52;3741:9;3735:16;3760:30;3784:5;3760:30;:::i;3825:450::-;3894:6;3947:2;3935:9;3926:7;3922:23;3918:32;3915:52;;;3963:1;3960;3953:12;3915:52;4003:9;3990:23;4036:18;4028:6;4025:30;4022:50;;;4068:1;4065;4058:12;4022:50;4091:22;;4144:4;4136:13;;4132:27;-1:-1:-1;4122:55:1;;4173:1;4170;4163:12;4122:55;4196:73;4261:7;4256:2;4243:16;4238:2;4234;4230:11;4196:73;:::i;4280:180::-;4339:6;4392:2;4380:9;4371:7;4367:23;4363:32;4360:52;;;4408:1;4405;4398:12;4360:52;-1:-1:-1;4431:23:1;;4280:180;-1:-1:-1;4280:180:1:o;4465:182::-;4522:6;4575:2;4563:9;4554:7;4550:23;4546:32;4543:52;;;4591:1;4588;4581:12;4543:52;4614:27;4631:9;4614:27;:::i;4652:257::-;4693:3;4731:5;4725:12;4758:6;4753:3;4746:19;4774:63;4830:6;4823:4;4818:3;4814:14;4807:4;4800:5;4796:16;4774:63;:::i;:::-;4891:2;4870:15;-1:-1:-1;;4866:29:1;4857:39;;;;4898:4;4853:50;;4652:257;-1:-1:-1;;4652:257:1:o;4914:470::-;5093:3;5131:6;5125:13;5147:53;5193:6;5188:3;5181:4;5173:6;5169:17;5147:53;:::i;:::-;5263:13;;5222:16;;;;5285:57;5263:13;5222:16;5319:4;5307:17;;5285:57;:::i;:::-;5358:20;;4914:470;-1:-1:-1;;;;4914:470:1:o;5597:488::-;-1:-1:-1;;;;;5866:15:1;;;5848:34;;5918:15;;5913:2;5898:18;;5891:43;5965:2;5950:18;;5943:34;;;6013:3;6008:2;5993:18;;5986:31;;;5791:4;;6034:45;;6059:19;;6051:6;6034:45;:::i;:::-;6026:53;5597:488;-1:-1:-1;;;;;;5597:488:1:o;6282:219::-;6431:2;6420:9;6413:21;6394:4;6451:44;6491:2;6480:9;6476:18;6468:6;6451:44;:::i;7331:414::-;7533:2;7515:21;;;7572:2;7552:18;;;7545:30;7611:34;7606:2;7591:18;;7584:62;-1:-1:-1;;;7677:2:1;7662:18;;7655:48;7735:3;7720:19;;7331:414::o;9935:411::-;10137:2;10119:21;;;10176:2;10156:18;;;10149:30;10215:34;10210:2;10195:18;;10188:62;-1:-1:-1;;;10281:2:1;10266:18;;10259:45;10336:3;10321:19;;9935:411::o;14729:356::-;14931:2;14913:21;;;14950:18;;;14943:30;15009:34;15004:2;14989:18;;14982:62;15076:2;15061:18;;14729:356::o;17064:346::-;17266:2;17248:21;;;17305:2;17285:18;;;17278:30;-1:-1:-1;;;17339:2:1;17324:18;;17317:52;17401:2;17386:18;;17064:346::o;17762:344::-;17964:2;17946:21;;;18003:2;17983:18;;;17976:30;-1:-1:-1;;;18037:2:1;18022:18;;18015:50;18097:2;18082:18;;17762:344::o;18456:413::-;18658:2;18640:21;;;18697:2;18677:18;;;18670:30;18736:34;18731:2;18716:18;;18709:62;-1:-1:-1;;;18802:2:1;18787:18;;18780:47;18859:3;18844:19;;18456:413::o;20211:128::-;20251:3;20282:1;20278:6;20275:1;20272:13;20269:39;;;20288:18;;:::i;:::-;-1:-1:-1;20324:9:1;;20211:128::o;20344:120::-;20384:1;20410;20400:35;;20415:18;;:::i;:::-;-1:-1:-1;20449:9:1;;20344:120::o;20469:422::-;20558:1;20601:5;20558:1;20615:270;20636:7;20626:8;20623:21;20615:270;;;20695:4;20691:1;20687:6;20683:17;20677:4;20674:27;20671:53;;;20704:18;;:::i;:::-;20754:7;20744:8;20740:22;20737:55;;;20774:16;;;;20737:55;20853:22;;;;20813:15;;;;20615:270;;;20619:3;20469:422;;;;;:::o;20896:131::-;20956:5;20985:36;21012:8;21006:4;21081:5;21111:8;21101:80;;-1:-1:-1;21152:1:1;21166:5;;21101:80;21200:4;21190:76;;-1:-1:-1;21237:1:1;21251:5;;21190:76;21282:4;21300:1;21295:59;;;;21368:1;21363:130;;;;21275:218;;21295:59;21325:1;21316:10;;21339:5;;;21363:130;21400:3;21390:8;21387:17;21384:43;;;21407:18;;:::i;:::-;-1:-1:-1;;21463:1:1;21449:16;;21478:5;;21275:218;;21577:2;21567:8;21564:16;21558:3;21552:4;21549:13;21545:36;21539:2;21529:8;21526:16;21521:2;21515:4;21512:12;21508:35;21505:77;21502:159;;;-1:-1:-1;21614:19:1;;;21646:5;;21502:159;21693:34;21718:8;21712:4;21693:34;:::i;:::-;21763:6;21759:1;21755:6;21751:19;21742:7;21739:32;21736:58;;;21774:18;;:::i;:::-;21812:20;;21032:806;-1:-1:-1;;;21032:806:1:o;21843:168::-;21883:7;21949:1;21945;21941:6;21937:14;21934:1;21931:21;21926:1;21919:9;21912:17;21908:45;21905:71;;;21956:18;;:::i;:::-;-1:-1:-1;21996:9:1;;21843:168::o;22016:270::-;22055:7;22087:18;22132:2;22129:1;22125:10;22162:2;22159:1;22155:10;22218:3;22214:2;22210:12;22205:3;22202:21;22195:3;22188:11;22181:19;22177:47;22174:73;;;22227:18;;:::i;:::-;22267:13;;22016:270;-1:-1:-1;;;;22016:270:1:o;22291:125::-;22331:4;22359:1;22356;22353:8;22350:34;;;22364:18;;:::i;:::-;-1:-1:-1;22401:9:1;;22291:125::o;22421:195::-;22459:4;22496;22493:1;22489:12;22528:4;22525:1;22521:12;22553:3;22548;22545:12;22542:38;;;22560:18;;:::i;:::-;22597:13;;;22421:195;-1:-1:-1;;;22421:195:1:o;22621:258::-;22693:1;22703:113;22717:6;22714:1;22711:13;22703:113;;;22793:11;;;22787:18;22774:11;;;22767:39;22739:2;22732:10;22703:113;;;22834:6;22831:1;22828:13;22825:48;;;-1:-1:-1;;22869:1:1;22851:16;;22844:27;22621:258::o;22884:380::-;22963:1;22959:12;;;;23006;;;23027:61;;23081:4;23073:6;23069:17;23059:27;;23027:61;23134:2;23126:6;23123:14;23103:18;23100:38;23097:161;;;23180:10;23175:3;23171:20;23168:1;23161:31;23215:4;23212:1;23205:15;23243:4;23240:1;23233:15;23097:161;;22884:380;;;:::o;23269:135::-;23308:3;-1:-1:-1;;23329:17:1;;23326:43;;;23349:18;;:::i;:::-;-1:-1:-1;23396:1:1;23385:13;;23269:135::o;23409:175::-;23446:3;23490:4;23483:5;23479:16;23519:4;23510:7;23507:17;23504:43;;;23527:18;;:::i;:::-;23576:1;23563:15;;23409:175;-1:-1:-1;;23409:175:1:o;23589:112::-;23621:1;23647;23637:35;;23652:18;;:::i;:::-;-1:-1:-1;23686:9:1;;23589:112::o;23706:127::-;23767:10;23762:3;23758:20;23755:1;23748:31;23798:4;23795:1;23788:15;23822:4;23819:1;23812:15;23838:127;23899:10;23894:3;23890:20;23887:1;23880:31;23930:4;23927:1;23920:15;23954:4;23951:1;23944:15;23970:127;24031:10;24026:3;24022:20;24019:1;24012:31;24062:4;24059:1;24052:15;24086:4;24083:1;24076:15;24102:127;24163:10;24158:3;24154:20;24151:1;24144:31;24194:4;24191:1;24184:15;24218:4;24215:1;24208:15;24234:127;24295:10;24290:3;24286:20;24283:1;24276:31;24326:4;24323:1;24316:15;24350:4;24347:1;24340:15;24366:131;-1:-1:-1;;;;;;24440:32:1;;24430:43;;24420:71;;24487:1;24484;24477:12

Swarm Source

ipfs://73d0410a5d44c607e55b5b7ae20c407c6f47b50e3dca02c6700a525f802e41f6
Loading...
Loading
Loading...
Loading
[ 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.