ETH Price: $2,610.72 (-2.67%)
 

Overview

Max Total Supply

169 WSC

Holders

41

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
jiucai21.eth
Balance
2 WSC
0x799535ee2caf1a34147d8b3be1a38d3e7dafdf6a
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:
Token

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
pragma solidity >=0.8.7 <0.9.0;



//import "../../utils/Strings.sol";
/**
 * @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);
    }
}

//import "../../utils/Context.sol";
/**
 * @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;
    }
}


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

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

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

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

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

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

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

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

//import "../../utils/introspection/IERC165.sol";
/**
 * @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);
}

//import "./IERC721.sol";
/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

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



//import "./extensions/IERC721Metadata.sol";
/**
 * @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);
}


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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



//import "../../utils/introspection/ERC165.sol";
/**
 * @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;
    }
}


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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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


//import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}


//import "./Common/IWhiteList.sol";
//--------------------------------------------
// WHITELIST intterface
//--------------------------------------------
interface IWhiteList {
    //--------------------
    // function
    //--------------------
    function check( address target ) external view returns (bool);
}

//--------------------------------------------------------
// Token: WONDER SECRET CLUB
//--------------------------------------------------------
contract Token is Ownable, ERC721, ReentrancyGuard {
    //--------------------------------------------------------
    // constant
    //--------------------------------------------------------
    string constant private TOKEN_NAME = "WONDER SECRET CLUB";
    string constant private TOKEN_SYMBOL = "WSC";

    //-----------------------------------------
    // mainnet
    //-----------------------------------------
    address constant private OWNER_ADDRESS = 0x8ee348062160811cba1c1A51E66c6A73214655F8;
    uint256 constant private MAX_TOKEN = 5555;
    uint256 constant private RESERVED_TOKEN = 120;

    // WONDERLIST SALE
    uint256 constant private WONDERLIST_SALE_PRICE = 59000000000000000;  // 0.059 ETH
    uint256 constant private WONDERLIST_SALE_QUANTITY = 2;

    // WONDERKIDS SALE
    uint256 constant private WONDERKIDS_SALE_PRICE = 59000000000000000;  // 0.059 ETH
    uint256 constant private WONDERKIDS_SALE_QUANTITY = 1;

    // PUBLIC SALE
    uint256 constant private PUBLIC_SALE_PRICE = 69000000000000000;      // 0.069 ETH
    uint256 constant private PUBLIC_SALE_QUANTITY = 1;

    // FINAL SALE
    uint256 constant private FINAL_SALE_PRICE = 69000000000000000;       // 0.069 ETH
    uint256 constant private FINAL_SALE_QUANTITY = 2;

    // enum
    uint256 constant private INFO_SALE_SUSPENDED = 0;
    uint256 constant private INFO_SALE_START = 1;
    uint256 constant private INFO_SALE_END = 2;
    uint256 constant private INFO_SALE_PRICE = 3;
    uint256 constant private INFO_SALE_WHITELISTED = 4;
    uint256 constant private INFO_SALE_MAX_MINT = 5;
    uint256 constant private INFO_SALE_USER_MINTED = 6;
    uint256 constant private INFO_MAX = 7;
    uint256 constant private USER_INFO_SALE = INFO_MAX;
    uint256 constant private USER_INFO_SUPPLY = INFO_MAX + 1;
    uint256 constant private USER_INFO_TOTAL = INFO_MAX + 2;
    uint256 constant private USER_INFO_MAX = INFO_MAX + 3;

    //--------------------------------------------------------
    // storage
    //--------------------------------------------------------
    address private _manager;
    string private _baseUriForHidden;
    string private _baseUriForRevealed;
    uint256 _totalSupply;

    // WONDERLIST SALE
    bool private _WONDERLIST_SALE_isSuspended;
    uint256 private _WONDERLIST_SALE_start;
    uint256 private _WONDERLIST_SALE_end;
    IWhiteList[] private _WONDERLIST_SALE_arrWhiteList;
    mapping( address => uint256 ) private _WONDERLIST_SALE_mapMinted;

    // WONDERKIDS SALE
    bool private _WONDERKIDS_SALE_isSuspended;
    uint256 private _WONDERKIDS_SALE_start;
    uint256 private _WONDERKIDS_SALE_end;
    IWhiteList[] private _WONDERKIDS_SALE_arrWhiteList;
    mapping( address => uint256 ) private _WONDERKIDS_SALE_mapMinted;

    // PUBLIC SALE
    bool private _PUBLIC_SALE_isSuspended;
    uint256 private _PUBLIC_SALE_start;
    uint256 private _PUBLIC_SALE_end;
    IWhiteList[] private _PUBLIC_SALE_arrWhiteList;
    mapping( address => uint256 ) private _PUBLIC_SALE_mapMinted;

    // FINAL SALE
    bool private _FINAL_SALE_isSuspended;
    uint256 private _FINAL_SALE_start;
    uint256 private _FINAL_SALE_end;
    mapping( address => uint256 ) private _FINAL_SALE_mapMinted;

    //--------------------------------------------------------
    // [modifier] onlyOwnerOrManager
    //--------------------------------------------------------
    modifier onlyOwnerOrManager() {
        require( msg.sender == owner() || msg.sender == manager(), "caller is not the owner neither manager" );
        _;
    }

    //--------------------------------------------------------
    // constructor
    //--------------------------------------------------------
    constructor() Ownable() ERC721( TOKEN_NAME, TOKEN_SYMBOL ) {
        transferOwnership( OWNER_ADDRESS );
        _manager = msg.sender;

        //-----------------------
        // mainnet
        //-----------------------
        _baseUriForHidden = "ipfs://QmZkJocmGRFCef9t2q2MGUQ4Z7kNH9KPASwEeD2kx11URw/";

        //=======================
        // WONDERLIST SALE
        //=======================
        _WONDERLIST_SALE_start = 1655110800;    // 2022-06-13 09:00:00(UTC)
        _WONDERLIST_SALE_end = 1655132400;      // 2022-06-13 15:00:00(UTC)
        _WONDERLIST_SALE_arrWhiteList.push( IWhiteList(0x6452EBc37A790d8A5614bB3E30cf544eB5555796) );

        //+++++++++++++++++++++++
        // WONDER KIDS SALE
        //+++++++++++++++++++++++
        _WONDERKIDS_SALE_start = 1655110800;    // 2022-06-13 09:00:00(UTC)
        _WONDERKIDS_SALE_end = 1655132400;      // 2022-06-13 15:00:00(UTC)
        _WONDERKIDS_SALE_arrWhiteList.push( IWhiteList(0x582b680e1b1c8aCAA9442E80b12CD0efAf1f3bd1) );
        _WONDERKIDS_SALE_arrWhiteList.push( IWhiteList(0x632ae52C10159fDb8f191F778f1aE9cA2ABFEeb3) );
        _WONDERKIDS_SALE_arrWhiteList.push( IWhiteList(0x7e72b15Cd97F08F7aE7a32C06Cca732eeb08C98c) );
        _WONDERKIDS_SALE_arrWhiteList.push( IWhiteList(0x06Dccb6EE7a900759CE426ef713120508f9C5036) );
        _WONDERKIDS_SALE_arrWhiteList.push( IWhiteList(0xe1bAD705EC6710800B3fe507c66a20cbd895Fe8E) );
        _WONDERKIDS_SALE_arrWhiteList.push( IWhiteList(0x6B9cC7A4c3e7A4eB56f29D3B3556FeB9318D1446) );
        _WONDERKIDS_SALE_arrWhiteList.push( IWhiteList(0x174fF1E0136a1bd578D8e27f6C430963b342F59F) );
        _WONDERKIDS_SALE_arrWhiteList.push( IWhiteList(0xD94e994c032fa5132f070D899703c19E686cFE3a) );
        _WONDERKIDS_SALE_arrWhiteList.push( IWhiteList(0x9be8f83f81291aacdB12f37a80A464d7Bfe4B8A1) );

        //***********************
        // PUBLIC SALE
        //***********************
        _PUBLIC_SALE_start = 1655132400;        // 2022-06-13 15:00:00(UTC)
        _PUBLIC_SALE_end = 1655154000;          // 2022-06-13 21:00:00(UTC)
        _PUBLIC_SALE_arrWhiteList.push( IWhiteList(0x2821Dbf2685fCda10C64907637aF56c7f92C4dd6) );
        _PUBLIC_SALE_arrWhiteList.push( IWhiteList(0x55E25eb0DbB1AA8a9b47e44fD27438B827D4A986) );
        _PUBLIC_SALE_arrWhiteList.push( IWhiteList(0x62a2CC3889d65666A669533fE8f92a323FE2c9A8) );
        _PUBLIC_SALE_arrWhiteList.push( IWhiteList(0x904f99D3646660096752e0Bc2fd5458962788F7B) );
        _PUBLIC_SALE_arrWhiteList.push( IWhiteList(0x8336f23513c25c52775DB44624BA5B731C8BAE18) );

        //~~~~~~~~~~~~~~~~~~~~~~~
        // FINAL SALE
        //~~~~~~~~~~~~~~~~~~~~~~~
        _FINAL_SALE_start = 1655154000;         // 2022-06-13 21:00:00
        _FINAL_SALE_end = 0;                    // no period
    }

    //--------------------------------------------------------
    // [public] manager
    //--------------------------------------------------------
    function manager() public view returns (address) {
        return( _manager );
    }

    //--------------------------------------------------------
    // [external/onlyOwner] setManager
    //--------------------------------------------------------
    function setManager( address target ) external onlyOwner {
        _manager = target;
    }

    //--------------------------------------------------------
    // [external] baseUriForHidden
    //--------------------------------------------------------
    function baseUriForHidden() external view returns (string memory) {
        return( _baseUriForHidden );
    }

    //--------------------------------------------------------
    // [external/onlyOwnerOrManager] setBaseUriForHidden
    //--------------------------------------------------------
    function setBaseUriForHidden( string calldata uri ) external onlyOwnerOrManager {
        _baseUriForHidden = uri;
    }

    //--------------------------------------------------------
    // [external] baseUriForRevealed
    //--------------------------------------------------------
    function baseUriForRevealed() external view returns (string memory) {
        return( _baseUriForRevealed );
    }

    //--------------------------------------------------------
    // [external/onlyOwnerOrManager] setBaseUriForRevealed
    //--------------------------------------------------------
    function setBaseUriForRevealed( string calldata uri ) external onlyOwnerOrManager {
        _baseUriForRevealed = uri;
    }

    //--------------------------------------------------------
    // [external] totalSupply
    //--------------------------------------------------------
    function totalSupply() external view returns (uint256) {
        return( _totalSupply );
    }

    //--------------------------------------------------------
    // [public/override] tokenURI
    //--------------------------------------------------------
    function tokenURI( uint256 tokenId ) public view override returns (string memory) {
        require( _exists( tokenId ), "nonexistent token" );

        if( bytes(_baseUriForRevealed).length > 0 ){
            return( string( abi.encodePacked( _baseUriForRevealed, Strings.toString( tokenId ) ) ) );            
        }

        return( string( abi.encodePacked( _baseUriForHidden, Strings.toString( tokenId ) ) ) );
    }

    //========================================================
    // [public] getInfo - WONDERLIST SALE
    //========================================================
    function WONDERLIST_SALE_getInfo( address target ) public view returns (uint256[INFO_MAX] memory) {
        uint256[INFO_MAX] memory arrRet;

        if( _WONDERLIST_SALE_isSuspended ){ arrRet[INFO_SALE_SUSPENDED] = 1; }
        arrRet[INFO_SALE_START] = _WONDERLIST_SALE_start;
        arrRet[INFO_SALE_END] = _WONDERLIST_SALE_end;
        arrRet[INFO_SALE_PRICE] = WONDERLIST_SALE_PRICE;
        if( _checkWhitelist( _WONDERLIST_SALE_arrWhiteList, target) ){ arrRet[INFO_SALE_WHITELISTED] = 1; }
        arrRet[INFO_SALE_MAX_MINT] = WONDERLIST_SALE_QUANTITY;
        arrRet[INFO_SALE_USER_MINTED] = _WONDERLIST_SALE_mapMinted[target];

        return( arrRet );
    }

    //========================================================
    // [external/onlyOwnerOrManager] write - WONDERLIST SALE
    //========================================================
    // isSuspended
    function WONDERLIST_SALE_suspend( bool flag ) external onlyOwnerOrManager {
        _WONDERLIST_SALE_isSuspended = flag;
    }

    // start-end
    function WONDERLIST_SALE_setStartEnd( uint256 start, uint256 end ) external onlyOwnerOrManager{
        _WONDERLIST_SALE_start = start;
        _WONDERLIST_SALE_end = end;
    }

    // whitelist
    function WONDERLIST_SALE_setWhiteList( address[] calldata lists ) external onlyOwnerOrManager {
        delete _WONDERLIST_SALE_arrWhiteList;

        for( uint256 i=0; i<lists.length; i++ ){
            require( lists[i] != address(0), "WONDERLIST SALE: invalid list"  );
            _WONDERLIST_SALE_arrWhiteList.push( IWhiteList(lists[i]) );
        }
    }

    //========================================================
    // [external/payable] mint - WONDERLIST SALE
    //========================================================
    function WONDERLIST_SALE_mint( uint256 num ) external payable nonReentrant {
        uint256[INFO_MAX] memory arrInfo = WONDERLIST_SALE_getInfo( msg.sender );

        require( arrInfo[INFO_SALE_SUSPENDED] == 0, "WONDERLIST SALE: suspended" );
        require( arrInfo[INFO_SALE_START] == 0 || arrInfo[INFO_SALE_START] <= block.timestamp, "WONDERLIST SALE: not opend" );
        require( arrInfo[INFO_SALE_END] == 0 || arrInfo[INFO_SALE_END] > block.timestamp, "WONDERLIST SALE: finished" );
        require( arrInfo[INFO_SALE_WHITELISTED] == 1, "WONDERLIST SALE: not whitelisted" );
        require( arrInfo[INFO_SALE_MAX_MINT] >= (arrInfo[INFO_SALE_USER_MINTED]+num), "WONDERLIST SALE: reached the limit" );

        _checkPayment( msg.sender, arrInfo[INFO_SALE_PRICE]*num, msg.value );

        _mintTokens( msg.sender, num );
        _WONDERLIST_SALE_mapMinted[msg.sender] += num;
    }

    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    // [public] getInfo - WONDERKIDS SALE
    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    function WONDERKIDS_SALE_getInfo( address target ) public view returns (uint256[INFO_MAX] memory) {
        uint256[INFO_MAX] memory arrRet;

        if( _WONDERKIDS_SALE_isSuspended ){ arrRet[INFO_SALE_SUSPENDED] = 1; }
        arrRet[INFO_SALE_START] = _WONDERKIDS_SALE_start;
        arrRet[INFO_SALE_END] = _WONDERKIDS_SALE_end;
        arrRet[INFO_SALE_PRICE] = WONDERKIDS_SALE_PRICE;
        if( _checkWhitelist( _WONDERKIDS_SALE_arrWhiteList, target) ){ arrRet[INFO_SALE_WHITELISTED] = 1; }
        arrRet[INFO_SALE_MAX_MINT] = WONDERKIDS_SALE_QUANTITY;
        arrRet[INFO_SALE_USER_MINTED] = _WONDERKIDS_SALE_mapMinted[target];

        return( arrRet );
    }

    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    // [external/onlyOwnerOrManager] write - WONDERKIDS SALE
    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    // isSuspended
    function WONDERKIDS_SALE_suspend( bool flag ) external onlyOwnerOrManager {
        _WONDERKIDS_SALE_isSuspended = flag;
    }

    // start-end
    function WONDERKIDS_SALE_setStartEnd( uint256 start, uint256 end ) external onlyOwnerOrManager{
        _WONDERKIDS_SALE_start = start;
        _WONDERKIDS_SALE_end = end;
    }

    // whitelist
    function WONDERKIDS_SALE_setWhiteList( address[] calldata lists ) external onlyOwnerOrManager {
        delete _WONDERKIDS_SALE_arrWhiteList;

        for( uint256 i=0; i<lists.length; i++ ){
            require( lists[i] != address(0), "WONDERKIDS SALE: invalid list"  );
            _WONDERKIDS_SALE_arrWhiteList.push( IWhiteList(lists[i]) );
        }
    }

    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    // [external/payable] mint - WONDERKIDS SALE
    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    function WONDERKIDS_SALE_mint( uint256 num ) external payable nonReentrant {
        uint256[INFO_MAX] memory arrInfo = WONDERKIDS_SALE_getInfo( msg.sender );

        require( arrInfo[INFO_SALE_SUSPENDED] == 0, "WONDERKIDS SALE: suspended" );
        require( arrInfo[INFO_SALE_START] == 0 || arrInfo[INFO_SALE_START] <= block.timestamp, "WONDERKIDS SALE: not opend" );
        require( arrInfo[INFO_SALE_END] == 0 || arrInfo[INFO_SALE_END] > block.timestamp, "WONDERKIDS SALE: finished" );
        require( arrInfo[INFO_SALE_WHITELISTED] == 1, "WONDERKIDS SALE: not whitelisted" );
        require( arrInfo[INFO_SALE_MAX_MINT] >= (arrInfo[INFO_SALE_USER_MINTED]+num), "WONDERKIDS SALE: reached the limit" );

        _checkPayment( msg.sender, arrInfo[INFO_SALE_PRICE]*num, msg.value );

        _mintTokens( msg.sender, num );
        _WONDERKIDS_SALE_mapMinted[msg.sender] += num;
    }

    //********************************************************
    // [public] getInfo - PUBLIC SALE
    //********************************************************
    function PUBLIC_SALE_getInfo( address target ) public view returns (uint256[INFO_MAX] memory) {
        uint256[INFO_MAX] memory arrRet;

        if( _PUBLIC_SALE_isSuspended ){ arrRet[INFO_SALE_SUSPENDED] = 1; }
        arrRet[INFO_SALE_START] = _PUBLIC_SALE_start;
        arrRet[INFO_SALE_END] = _PUBLIC_SALE_end;
        arrRet[INFO_SALE_PRICE] = PUBLIC_SALE_PRICE;
        if( _checkWhitelist( _PUBLIC_SALE_arrWhiteList, target) ){ arrRet[INFO_SALE_WHITELISTED] = 1; }
        arrRet[INFO_SALE_MAX_MINT] = PUBLIC_SALE_QUANTITY;
        arrRet[INFO_SALE_USER_MINTED] = _PUBLIC_SALE_mapMinted[target];

        return( arrRet );
    }

    //********************************************************
    // [external/onlyOwnerOrManager] write - PUBLIC SALE
    //********************************************************
    // isSuspended
    function PUBLIC_SALE_suspend( bool flag ) external onlyOwnerOrManager {
        _PUBLIC_SALE_isSuspended = flag;
    }

    // start-end
    function PUBLIC_SALE_setStartEnd( uint256 start, uint256 end ) external onlyOwnerOrManager{
        _PUBLIC_SALE_start = start;
        _PUBLIC_SALE_end = end;
    }

    // whitelist
    function PUBLIC_SALE_setWhiteList( address[] calldata lists ) external onlyOwnerOrManager {
        delete _PUBLIC_SALE_arrWhiteList;

        for( uint256 i=0; i<lists.length; i++ ){
            require( lists[i] != address(0), "PUBLIC SALE: invalid list"  );
            _PUBLIC_SALE_arrWhiteList.push( IWhiteList(lists[i]) );
        }
    }

    //********************************************************
    // [external/payable] mint - PUBLIC SALE
    //********************************************************
    function PUBLIC_SALE_mint( uint256 num ) external payable nonReentrant {
        uint256[INFO_MAX] memory arrInfo = PUBLIC_SALE_getInfo( msg.sender );

        require( arrInfo[INFO_SALE_SUSPENDED] == 0, "PUBLIC SALE: suspended" );
        require( arrInfo[INFO_SALE_START] == 0 || arrInfo[INFO_SALE_START] <= block.timestamp, "PUBLIC SALE: not opend" );
        require( arrInfo[INFO_SALE_END] == 0 || arrInfo[INFO_SALE_END] > block.timestamp, "PUBLIC SALE: finished" );
        require( arrInfo[INFO_SALE_WHITELISTED] == 1, "PUBLIC SALE: not whitelisted" );
        require( arrInfo[INFO_SALE_MAX_MINT] >= (arrInfo[INFO_SALE_USER_MINTED]+num), "PUBLIC SALE: reached the limit" );

        _checkPayment( msg.sender, arrInfo[INFO_SALE_PRICE]*num, msg.value );

        _mintTokens( msg.sender, num );
        _PUBLIC_SALE_mapMinted[msg.sender] += num;
    }

    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // [public] getInfo - FINAL SALE
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    function FINAL_SALE_getInfo( address target ) public view returns (uint256[INFO_MAX] memory) {
        uint256[INFO_MAX] memory arrRet;

        if( _FINAL_SALE_isSuspended ){ arrRet[INFO_SALE_SUSPENDED] = 1; }
        arrRet[INFO_SALE_START] = _FINAL_SALE_start;
        arrRet[INFO_SALE_END] = _FINAL_SALE_end;
        arrRet[INFO_SALE_PRICE] = FINAL_SALE_PRICE;
        arrRet[INFO_SALE_WHITELISTED] = 1;
        arrRet[INFO_SALE_MAX_MINT] = FINAL_SALE_QUANTITY;
        arrRet[INFO_SALE_USER_MINTED] = _FINAL_SALE_mapMinted[target];

        return( arrRet );
    }

    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // [external/onlyOwnerOrManager] write - FINAL SALE
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // isSuspended
    function FINAL_SALE_suspend( bool flag ) external onlyOwnerOrManager {
        _FINAL_SALE_isSuspended = flag;
    }

    // start-end
    function FINAL_SALE_setStartEnd( uint256 start, uint256 end ) external onlyOwnerOrManager{
        _FINAL_SALE_start = start;
        _FINAL_SALE_end = end;
    }

    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // [external/payable] mint - FINAL SALE
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    function FINAL_SALE_mint( uint256 num ) external payable nonReentrant {
        uint256[INFO_MAX] memory arrInfo = FINAL_SALE_getInfo( msg.sender );

        require( arrInfo[INFO_SALE_SUSPENDED] == 0, "FINAL SALE: suspended" );
        require( arrInfo[INFO_SALE_START] == 0 || arrInfo[INFO_SALE_START] <= block.timestamp, "FINAL SALE: not opend" );
        require( arrInfo[INFO_SALE_END] == 0 || arrInfo[INFO_SALE_END] > block.timestamp, "FINAL SALE: finished" );
        require( arrInfo[INFO_SALE_MAX_MINT] >= (arrInfo[INFO_SALE_USER_MINTED]+num), "FINAL SALE: reached the limit" );

        _checkPayment( msg.sender, arrInfo[INFO_SALE_PRICE]*num, msg.value );

        _mintTokens( msg.sender, num );
        _FINAL_SALE_mapMinted[msg.sender] += num;
    }

    //--------------------------------------------------------
    // [internal] _checkWhitelist
    //--------------------------------------------------------
    function _checkWhitelist( IWhiteList[] storage lists, address target ) internal view returns (bool) {
        for( uint256 i=0; i<lists.length; i++ ){
            if( lists[i].check(target) ){
                return( true);
            }
        }

        return( false );        
    }

    //--------------------------------------------------------
    // [internal] _checkPayment
    //--------------------------------------------------------
    function _checkPayment( address msgSender, uint256 price, uint256 payment ) internal {
        require( price <= payment, "insufficient value" );

        // refund if overpaymented
        if( price < payment ){
            uint256 change = payment - price;
            address payable target = payable( msgSender );
            target.transfer( change );
        }
    }

    //--------------------------------------------------------
    // [internal] _mintTokens
    //--------------------------------------------------------
    function _mintTokens( address to, uint256 num ) internal {
        require( to != address(0), "invalid to" );
        require( _totalSupply >= RESERVED_TOKEN, "reservation not finished" );
        require( (_totalSupply+num) <= MAX_TOKEN, "exceeded the supply range" );

        for( uint256 i=0; i<num; i++ ){
            _mint( to, _totalSupply+(i+1) );
        }
        _totalSupply += num;
    }

    //--------------------------------------------------------
    // [external/onlyOwnerOrManager] reserveTokens
    //--------------------------------------------------------
    function reserveTokens( uint256 num ) external onlyOwnerOrManager {
        require( (_totalSupply+num) <= RESERVED_TOKEN, "exceeded the reservation range" );

        for( uint256 i=0; i<num; i++ ){
            _mint( owner(), _totalSupply+(i+1) );
        }
        _totalSupply += num;
    }

    //--------------------------------------------------------
    // [external] getUserInfo
    //--------------------------------------------------------
    function getUserInfo( address target ) external view returns (uint256[USER_INFO_MAX] memory){
        uint256[USER_INFO_MAX] memory userInfo;
        uint256[INFO_MAX] memory info;

        // WONDERLIST
        if( _checkWhitelist( _WONDERLIST_SALE_arrWhiteList, target ) && (_WONDERLIST_SALE_end == 0 || _WONDERLIST_SALE_end > block.timestamp) ){
            userInfo[USER_INFO_SALE] = 1;
            info = WONDERLIST_SALE_getInfo( target );
        }
        // WONDERKIDS
        else if( _checkWhitelist( _WONDERKIDS_SALE_arrWhiteList, target ) && (_WONDERKIDS_SALE_end == 0 || _WONDERKIDS_SALE_end > block.timestamp) ){
            userInfo[USER_INFO_SALE] = 2;
            info = WONDERKIDS_SALE_getInfo( target );
        }
        // PUBLIC
        else if( _checkWhitelist( _PUBLIC_SALE_arrWhiteList, target ) && (_PUBLIC_SALE_end == 0 || _PUBLIC_SALE_end > block.timestamp) ){
            userInfo[USER_INFO_SALE] = 3;
            info = PUBLIC_SALE_getInfo( target );
        }
        // FINAL
        else{
            userInfo[USER_INFO_SALE] = 4;
            info = FINAL_SALE_getInfo( target );
        }

        for( uint256 i=0; i<INFO_MAX; i++ ){
            userInfo[i] = info[i];
        }

        userInfo[USER_INFO_SUPPLY] = _totalSupply;
        userInfo[USER_INFO_TOTAL] = MAX_TOKEN;

        return( userInfo );
    }

    //--------------------------------------------------------
    // [external] checkBalance
    //--------------------------------------------------------
    function checkBalance() external view returns (uint256) {
        return( address(this).balance );
    }

    //--------------------------------------------------------
    // [external/onlyOwnerOrManager] withdraw
    //--------------------------------------------------------
    function withdraw( uint256 amount ) external onlyOwnerOrManager nonReentrant {
        require( amount <= address(this).balance, "insufficient balance" );

        address payable target = payable( owner() );
        target.transfer( amount );
    }

}

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"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"FINAL_SALE_getInfo","outputs":[{"internalType":"uint256[7]","name":"","type":"uint256[7]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"FINAL_SALE_mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"FINAL_SALE_setStartEnd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"flag","type":"bool"}],"name":"FINAL_SALE_suspend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"PUBLIC_SALE_getInfo","outputs":[{"internalType":"uint256[7]","name":"","type":"uint256[7]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"PUBLIC_SALE_mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"PUBLIC_SALE_setStartEnd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"lists","type":"address[]"}],"name":"PUBLIC_SALE_setWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"flag","type":"bool"}],"name":"PUBLIC_SALE_suspend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"WONDERKIDS_SALE_getInfo","outputs":[{"internalType":"uint256[7]","name":"","type":"uint256[7]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"WONDERKIDS_SALE_mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"WONDERKIDS_SALE_setStartEnd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"lists","type":"address[]"}],"name":"WONDERKIDS_SALE_setWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"flag","type":"bool"}],"name":"WONDERKIDS_SALE_suspend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"WONDERLIST_SALE_getInfo","outputs":[{"internalType":"uint256[7]","name":"","type":"uint256[7]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"WONDERLIST_SALE_mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"WONDERLIST_SALE_setStartEnd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"lists","type":"address[]"}],"name":"WONDERLIST_SALE_setWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"flag","type":"bool"}],"name":"WONDERLIST_SALE_suspend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseUriForHidden","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseUriForRevealed","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"getUserInfo","outputs":[{"internalType":"uint256[10]","name":"","type":"uint256[10]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"reserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseUriForHidden","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseUriForRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"setManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604051806040016040528060128152602001712ba7a72222a91029a2a1a922aa1021a62aa160711b8152506040518060400160405280600381526020016257534360e81b815250620000736200006d620003f260201b60201c565b620003f6565b8151620000889060019060208501906200051b565b5080516200009e9060029060208401906200051b565b5050600160075550620000c5738ee348062160811cba1c1a51e66c6a73214655f862000446565b600880546001600160a01b031916331790556040805160608101909152603680825262003c466020830139805162000106916009916020909101906200051b565b506362a6fc90600d8190556362a750f0600e819055600f805460018181019092557f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8020180546001600160a01b0319908116736452ebc37a790d8a5614bb3e30cf544eb55557961790915560129390935560138290556014805480830182557fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec9081018054861673582b680e1b1c8acaa9442e80b12cd0efaf1f3bd11790558154808401835581018054861673632ae52c10159fdb8f191f778f1ae9ca2abfeeb317905581548084018355810180548616737e72b15cd97f08f7ae7a32c06cca732eeb08c98c179055815480840183558101805486167306dccb6ee7a900759ce426ef713120508f9c50361790558154808401835581018054861673e1bad705ec6710800b3fe507c66a20cbd895fe8e17905581548084018355810180548616736b9cc7a4c3e7a4eb56f29d3b3556feb9318d14461790558154808401835581018054861673174ff1e0136a1bd578d8e27f6c430963b342f59f1790558154808401835581018054861673d94e994c032fa5132f070d899703c19e686cfe3a17905581548084019092550180548416739be8f83f81291aacdb12f37a80a464d7bfe4b8a11790556017919091556362a7a550601881905560198054808401825560008281527f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c969591820180548716732821dbf2685fcda10c64907637af56c7f92c4dd6179055825480860184558201805487167355e25eb0dbb1aa8a9b47e44fd27438b827d4a986179055825480860184558201805487167362a2cc3889d65666a669533fe8f92a323fe2c9a81790558254808601845582018054871673904f99d3646660096752e0bc2fd5458962788f7b1790558254948501909255929092018054909316738336f23513c25c52775db44624ba5b731c8bae1817909255601c91909155601d55620005fe565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000546001600160a01b03163314620004a65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6001600160a01b0381166200050d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016200049d565b6200051881620003f6565b50565b8280546200052990620005c1565b90600052602060002090601f0160209004810192826200054d576000855562000598565b82601f106200056857805160ff191683800117855562000598565b8280016001018555821562000598579182015b82811115620005985782518255916020019190600101906200057b565b50620005a6929150620005aa565b5090565b5b80821115620005a65760008155600101620005ab565b600181811c90821680620005d657607f821691505b60208210811415620005f857634e487b7160e01b600052602260045260246000fd5b50919050565b613638806200060e6000396000f3fe60806040526004361061027d5760003560e01c80636386c1c71161014f578063c0ca970f116100c1578063e22572661161007a578063e22572661461075b578063e3c61b021461077b578063e985e9c51461079b578063f2fde38b146107bb578063f34e1ea1146107db578063ff4b629e146107fb57600080fd5b8063c0ca970f146106a8578063c71daccb146106c8578063c87b56dd146106db578063d031370b146106fb578063d0ebdbe71461071b578063de3bc79f1461073b57600080fd5b806395d89b411161011357806395d89b411461060b578063a04e5f7f14610620578063a22cb46514610635578063a3df2a0114610655578063ac1349a114610668578063b88d4fde1461068857600080fd5b80636386c1c71461056b57806370a0823114610598578063715018a6146105b8578063808312bc146105cd5780638da5cb5b146105ed57600080fd5b80632e431810116101f35780634a213d2a116101ac5780634a213d2a146104c3578063502ece24146104e357806352c0295f146105035780635d8ceea9146105185780635e59da6b146105385780636352211e1461054b57600080fd5b80632e4318101461041257806336e517dd146104255780633abe69b2146104525780633b3538421461047257806342842e0e14610485578063481c6a75146104a557600080fd5b8063138cfadc11610245578063138cfadc1461035357806318160ddd146103735780631c58eec51461039257806323b872dd146103b2578063279b8b5a146103d25780632e1a7d4d146103f257600080fd5b806301ffc9a71461028257806306fdde03146102b7578063081812fc146102d9578063095ea7b3146103115780630ff4231014610333575b600080fd5b34801561028e57600080fd5b506102a261029d3660046130ca565b61081b565b60405190151581526020015b60405180910390f35b3480156102c357600080fd5b506102cc61086d565b6040516102ae9190613325565b3480156102e557600080fd5b506102f96102f4366004613164565b6108ff565b6040516001600160a01b0390911681526020016102ae565b34801561031d57600080fd5b5061033161032c366004612ff1565b610999565b005b34801561033f57600080fd5b5061033161034e36600461301b565b610aaf565b34801561035f57600080fd5b5061033161036e36600461317d565b610bf2565b34801561037f57600080fd5b50600b545b6040519081526020016102ae565b34801561039e57600080fd5b506103316103ad36600461317d565b610c3c565b3480156103be57600080fd5b506103316103cd366004612ea2565b610c86565b3480156103de57600080fd5b506103316103ed36600461301b565b610cb7565b3480156103fe57600080fd5b5061033161040d366004613164565b610dfa565b610331610420366004613164565b610eee565b34801561043157600080fd5b50610445610440366004612e4d565b61114b565b6040516102ae91906132fd565b34801561045e57600080fd5b5061044561046d366004612e4d565b6111c4565b610331610480366004613164565b611241565b34801561049157600080fd5b506103316104a0366004612ea2565b611407565b3480156104b157600080fd5b506008546001600160a01b03166102f9565b3480156104cf57600080fd5b506103316104de36600461317d565b611422565b3480156104ef57600080fd5b506103316104fe36600461317d565b61146c565b34801561050f57600080fd5b506102cc6114b6565b34801561052457600080fd5b50610331610533366004613104565b6114c5565b610331610546366004613164565b611510565b34801561055757600080fd5b506102f9610566366004613164565b61172d565b34801561057757600080fd5b5061058b610586366004612e4d565b6117a4565b6040516102ae91906132cb565b3480156105a457600080fd5b506103846105b3366004612e4d565b611919565b3480156105c457600080fd5b506103316119a0565b3480156105d957600080fd5b506103316105e8366004613090565b6119d6565b3480156105f957600080fd5b506000546001600160a01b03166102f9565b34801561061757600080fd5b506102cc611a28565b34801561062c57600080fd5b506102cc611a37565b34801561064157600080fd5b50610331610650366004612fba565b611a46565b610331610663366004613164565b611a55565b34801561067457600080fd5b50610331610683366004613104565b611c93565b34801561069457600080fd5b506103316106a3366004612ede565b611cde565b3480156106b457600080fd5b506103316106c336600461301b565b611d16565b3480156106d457600080fd5b5047610384565b3480156106e757600080fd5b506102cc6106f6366004613164565b611e59565b34801561070757600080fd5b50610331610716366004613164565b611f08565b34801561072757600080fd5b50610331610736366004612e4d565b61200f565b34801561074757600080fd5b50610331610756366004613090565b61205b565b34801561076757600080fd5b50610445610776366004612e4d565b6120ad565b34801561078757600080fd5b50610331610796366004613090565b61212a565b3480156107a757600080fd5b506102a26107b6366004612e6f565b61217c565b3480156107c757600080fd5b506103316107d6366004612e4d565b6121aa565b3480156107e757600080fd5b506103316107f6366004613090565b612245565b34801561080757600080fd5b50610445610816366004612e4d565b612297565b60006001600160e01b031982166380ac58cd60e01b148061084c57506001600160e01b03198216635b5e139f60e01b145b8061086757506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606001805461087c9061351c565b80601f01602080910402602001604051908101604052809291908181526020018280546108a89061351c565b80156108f55780601f106108ca576101008083540402835291602001916108f5565b820191906000526020600020905b8154815290600101906020018083116108d857829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b031661097d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60006109a48261172d565b9050806001600160a01b0316836001600160a01b03161415610a125760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610974565b336001600160a01b0382161480610a2e5750610a2e813361217c565b610aa05760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610974565b610aaa8383612314565b505050565b6000546001600160a01b0316331480610ad257506008546001600160a01b031633145b610aee5760405162461bcd60e51b815260040161097490613410565b610afa600f6000612d3d565b60005b81811015610aaa576000838383818110610b1957610b196135b2565b9050602002016020810190610b2e9190612e4d565b6001600160a01b03161415610b855760405162461bcd60e51b815260206004820152601d60248201527f574f4e4445524c4953542053414c453a20696e76616c6964206c6973740000006044820152606401610974565b600f838383818110610b9957610b996135b2565b9050602002016020810190610bae9190612e4d565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b0390921691909117905580610bea81613557565b915050610afd565b6000546001600160a01b0316331480610c1557506008546001600160a01b031633145b610c315760405162461bcd60e51b815260040161097490613410565b601c91909155601d55565b6000546001600160a01b0316331480610c5f57506008546001600160a01b031633145b610c7b5760405162461bcd60e51b815260040161097490613410565b601791909155601855565b610c903382612382565b610cac5760405162461bcd60e51b8152600401610974906133bf565b610aaa838383612459565b6000546001600160a01b0316331480610cda57506008546001600160a01b031633145b610cf65760405162461bcd60e51b815260040161097490613410565b610d0260146000612d3d565b60005b81811015610aaa576000838383818110610d2157610d216135b2565b9050602002016020810190610d369190612e4d565b6001600160a01b03161415610d8d5760405162461bcd60e51b815260206004820152601d60248201527f574f4e4445524b4944532053414c453a20696e76616c6964206c6973740000006044820152606401610974565b6014838383818110610da157610da16135b2565b9050602002016020810190610db69190612e4d565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b0390921691909117905580610df281613557565b915050610d05565b6000546001600160a01b0316331480610e1d57506008546001600160a01b031633145b610e395760405162461bcd60e51b815260040161097490613410565b60026007541415610e5c5760405162461bcd60e51b815260040161097490613457565b600260075547811115610ea85760405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b6044820152606401610974565b600080546040516001600160a01b039091169182916108fc85150291859190818181858888f19350505050158015610ee4573d6000803e3d6000fd5b5050600160075550565b60026007541415610f115760405162461bcd60e51b815260040161097490613457565b60026007556000610f21336111c4565b805190915015610f735760405162461bcd60e51b815260206004820152601a60248201527f574f4e4445524c4953542053414c453a2073757370656e6465640000000000006044820152606401610974565b60208101511580610f88575060208101514210155b610fd45760405162461bcd60e51b815260206004820152601a60248201527f574f4e4445524c4953542053414c453a206e6f74206f70656e640000000000006044820152606401610974565b60408101511580610fe85750604081015142105b6110345760405162461bcd60e51b815260206004820152601960248201527f574f4e4445524c4953542053414c453a2066696e6973686564000000000000006044820152606401610974565b60808101516001146110885760405162461bcd60e51b815260206004820181905260248201527f574f4e4445524c4953542053414c453a206e6f742077686974656c69737465646044820152606401610974565b60c081015161109890839061348e565b60a082015110156110f65760405162461bcd60e51b815260206004820152602260248201527f574f4e4445524c4953542053414c453a207265616368656420746865206c696d6044820152611a5d60f21b6064820152608401610974565b61111433838360035b602002015161110e91906134ba565b346125f5565b61111e3383612691565b336000908152601060205260408120805484929061113d90849061348e565b909155505060016007555050565b611153612d5b565b61115b612d5b565b601b5460ff161561116b57600181525b601c54602080830191909152601d5460408084019190915266f5232269808000606084015260016080840152600260a08401526001600160a01b0385166000908152601e9092529020548160065b602002015292915050565b6111cc612d5b565b6111d4612d5b565b600c5460ff16156111e457600181525b600d546020820152600e54604082015266d19c2ff9bf8000606082015261120c600f846127ce565b1561121957600160808201525b600260a08201526001600160a01b0383166000908152601060205260409020548160066111b9565b600260075414156112645760405162461bcd60e51b815260040161097490613457565b600260075560006112743361114b565b8051909150156112be5760405162461bcd60e51b815260206004820152601560248201527411925390530814d053114e881cdd5cdc195b991959605a1b6044820152606401610974565b602081015115806112d3575060208101514210155b6113175760405162461bcd60e51b815260206004820152601560248201527411925390530814d053114e881b9bdd081bdc195b99605a1b6044820152606401610974565b6040810151158061132b5750604081015142105b61136e5760405162461bcd60e51b815260206004820152601460248201527311925390530814d053114e88199a5b9a5cda195960621b6044820152606401610974565b60c081015161137e90839061348e565b60a082015110156113d15760405162461bcd60e51b815260206004820152601d60248201527f46494e414c2053414c453a207265616368656420746865206c696d69740000006044820152606401610974565b6113de33838360036110ff565b6113e83383612691565b336000908152601e60205260408120805484929061113d90849061348e565b610aaa83838360405180602001604052806000815250611cde565b6000546001600160a01b031633148061144557506008546001600160a01b031633145b6114615760405162461bcd60e51b815260040161097490613410565b600d91909155600e55565b6000546001600160a01b031633148061148f57506008546001600160a01b031633145b6114ab5760405162461bcd60e51b815260040161097490613410565b601291909155601355565b60606009805461087c9061351c565b6000546001600160a01b03163314806114e857506008546001600160a01b031633145b6115045760405162461bcd60e51b815260040161097490613410565b610aaa600a8383612d79565b600260075414156115335760405162461bcd60e51b815260040161097490613457565b6002600755600061154333612297565b80519091501561158e5760405162461bcd60e51b8152602060048201526016602482015275141550931250c814d053114e881cdd5cdc195b99195960521b6044820152606401610974565b602081015115806115a3575060208101514210155b6115e85760405162461bcd60e51b8152602060048201526016602482015275141550931250c814d053114e881b9bdd081bdc195b9960521b6044820152606401610974565b604081015115806115fc5750604081015142105b6116405760405162461bcd60e51b8152602060048201526015602482015274141550931250c814d053114e88199a5b9a5cda1959605a1b6044820152606401610974565b60808101516001146116945760405162461bcd60e51b815260206004820152601c60248201527f5055424c49432053414c453a206e6f742077686974656c6973746564000000006044820152606401610974565b60c08101516116a490839061348e565b60a082015110156116f75760405162461bcd60e51b815260206004820152601e60248201527f5055424c49432053414c453a207265616368656420746865206c696d697400006044820152606401610974565b61170433838360036110ff565b61170e3383612691565b336000908152601a60205260408120805484929061113d90849061348e565b6000818152600360205260408120546001600160a01b0316806108675760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610974565b6117ac612dfd565b6117b4612dfd565b6117bc612d5b565b6117c7600f856127ce565b80156117de5750600e5415806117de575042600e54115b156117fa57600160e08301526117f3846111c4565b905061187b565b6118056014856127ce565b801561181c5750601354158061181c575042601354115b1561183157600260e08301526117f3846120ad565b61183c6019856127ce565b801561185357506018541580611853575042601854115b1561186857600360e08301526117f384612297565b600460e08301526118788461114b565b90505b60005b60078110156118c757818160078110611899576118996135b2565b60200201518382600a81106118b0576118b06135b2565b6020020152806118bf81613557565b91505061187e565b50600b54826118d86007600161348e565b600a81106118e8576118e86135b2565b60200201526115b3826118fd6007600261348e565b600a811061190d5761190d6135b2565b60200201525092915050565b60006001600160a01b0382166119845760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610974565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b031633146119ca5760405162461bcd60e51b81526004016109749061338a565b6119d4600061289e565b565b6000546001600160a01b03163314806119f957506008546001600160a01b031633145b611a155760405162461bcd60e51b815260040161097490613410565b601b805460ff1916911515919091179055565b60606002805461087c9061351c565b6060600a805461087c9061351c565b611a513383836128ee565b5050565b60026007541415611a785760405162461bcd60e51b815260040161097490613457565b60026007556000611a88336120ad565b805190915015611ada5760405162461bcd60e51b815260206004820152601a60248201527f574f4e4445524b4944532053414c453a2073757370656e6465640000000000006044820152606401610974565b60208101511580611aef575060208101514210155b611b3b5760405162461bcd60e51b815260206004820152601a60248201527f574f4e4445524b4944532053414c453a206e6f74206f70656e640000000000006044820152606401610974565b60408101511580611b4f5750604081015142105b611b9b5760405162461bcd60e51b815260206004820152601960248201527f574f4e4445524b4944532053414c453a2066696e6973686564000000000000006044820152606401610974565b6080810151600114611bef5760405162461bcd60e51b815260206004820181905260248201527f574f4e4445524b4944532053414c453a206e6f742077686974656c69737465646044820152606401610974565b60c0810151611bff90839061348e565b60a08201511015611c5d5760405162461bcd60e51b815260206004820152602260248201527f574f4e4445524b4944532053414c453a207265616368656420746865206c696d6044820152611a5d60f21b6064820152608401610974565b611c6a33838360036110ff565b611c743383612691565b336000908152601560205260408120805484929061113d90849061348e565b6000546001600160a01b0316331480611cb657506008546001600160a01b031633145b611cd25760405162461bcd60e51b815260040161097490613410565b610aaa60098383612d79565b611ce83383612382565b611d045760405162461bcd60e51b8152600401610974906133bf565b611d10848484846129bd565b50505050565b6000546001600160a01b0316331480611d3957506008546001600160a01b031633145b611d555760405162461bcd60e51b815260040161097490613410565b611d6160196000612d3d565b60005b81811015610aaa576000838383818110611d8057611d806135b2565b9050602002016020810190611d959190612e4d565b6001600160a01b03161415611dec5760405162461bcd60e51b815260206004820152601960248201527f5055424c49432053414c453a20696e76616c6964206c697374000000000000006044820152606401610974565b6019838383818110611e0057611e006135b2565b9050602002016020810190611e159190612e4d565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b0390921691909117905580611e5181613557565b915050611d64565b6000818152600360205260409020546060906001600160a01b0316611eb45760405162461bcd60e51b81526020600482015260116024820152703737b732bc34b9ba32b73a103a37b5b2b760791b6044820152606401610974565b6000600a8054611ec39061351c565b90501115611efd57600a611ed6836129f0565b604051602001611ee79291906131e7565b6040516020818303038152906040529050919050565b6009611ed6836129f0565b6000546001600160a01b0316331480611f2b57506008546001600160a01b031633145b611f475760405162461bcd60e51b815260040161097490613410565b607881600b54611f57919061348e565b1115611fa55760405162461bcd60e51b815260206004820152601e60248201527f657863656564656420746865207265736572766174696f6e2072616e676500006044820152606401610974565b60005b81811015611ff457611fe2611fc56000546001600160a01b031690565b611fd083600161348e565b600b54611fdd919061348e565b612aee565b80611fec81613557565b915050611fa8565b5080600b6000828254612007919061348e565b909155505050565b6000546001600160a01b031633146120395760405162461bcd60e51b81526004016109749061338a565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633148061207e57506008546001600160a01b031633145b61209a5760405162461bcd60e51b815260040161097490613410565b600c805460ff1916911515919091179055565b6120b5612d5b565b6120bd612d5b565b60115460ff16156120cd57600181525b6012546020820152601354604082015266d19c2ff9bf800060608201526120f56014846127ce565b1561210257600160808201525b600160a08201526001600160a01b0383166000908152601560205260409020548160066111b9565b6000546001600160a01b031633148061214d57506008546001600160a01b031633145b6121695760405162461bcd60e51b815260040161097490613410565b6011805460ff1916911515919091179055565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6000546001600160a01b031633146121d45760405162461bcd60e51b81526004016109749061338a565b6001600160a01b0381166122395760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610974565b6122428161289e565b50565b6000546001600160a01b031633148061226857506008546001600160a01b031633145b6122845760405162461bcd60e51b815260040161097490613410565b6016805460ff1916911515919091179055565b61229f612d5b565b6122a7612d5b565b60165460ff16156122b757600181525b6017546020820152601854604082015266f523226980800060608201526122df6019846127ce565b156122ec57600160808201525b600160a08201526001600160a01b0383166000908152601a60205260409020548160066111b9565b600081815260056020526040902080546001600160a01b0319166001600160a01b03841690811790915581906123498261172d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b03166123fb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610974565b60006124068361172d565b9050806001600160a01b0316846001600160a01b0316148061242d575061242d818561217c565b806124515750836001600160a01b0316612446846108ff565b6001600160a01b0316145b949350505050565b826001600160a01b031661246c8261172d565b6001600160a01b0316146124d05760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610974565b6001600160a01b0382166125325760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610974565b61253d600082612314565b6001600160a01b03831660009081526004602052604081208054600192906125669084906134d9565b90915550506001600160a01b038216600090815260046020526040812080546001929061259490849061348e565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b8082111561263a5760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742076616c756560701b6044820152606401610974565b80821015610aaa57600061264e83836134d9565b60405190915084906001600160a01b0382169083156108fc029084906000818181858888f19350505050158015612689573d6000803e3d6000fd5b505050505050565b6001600160a01b0382166126d45760405162461bcd60e51b815260206004820152600a602482015269696e76616c696420746f60b01b6044820152606401610974565b6078600b5410156127275760405162461bcd60e51b815260206004820152601860248201527f7265736572766174696f6e206e6f742066696e697368656400000000000000006044820152606401610974565b6115b381600b54612738919061348e565b11156127865760405162461bcd60e51b815260206004820152601960248201527f65786365656465642074686520737570706c792072616e6765000000000000006044820152606401610974565b60005b818110156127b2576127a083611fd083600161348e565b806127aa81613557565b915050612789565b5080600b60008282546127c5919061348e565b90915550505050565b6000805b8354811015612894578381815481106127ed576127ed6135b2565b600091825260209091200154604051631846d2f560e31b81526001600160a01b0385811660048301529091169063c23697a89060240160206040518083038186803b15801561283b57600080fd5b505afa15801561284f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287391906130ad565b15612882576001915050610867565b8061288c81613557565b9150506127d2565b5060009392505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b031614156129505760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610974565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6129c8848484612459565b6129d484848484612c30565b611d105760405162461bcd60e51b815260040161097490613338565b606081612a145750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612a3e5780612a2881613557565b9150612a379050600a836134a6565b9150612a18565b60008167ffffffffffffffff811115612a5957612a596135c8565b6040519080825280601f01601f191660200182016040528015612a83576020820181803683370190505b5090505b841561245157612a986001836134d9565b9150612aa5600a86613572565b612ab090603061348e565b60f81b818381518110612ac557612ac56135b2565b60200101906001600160f81b031916908160001a905350612ae7600a866134a6565b9450612a87565b6001600160a01b038216612b445760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610974565b6000818152600360205260409020546001600160a01b031615612ba95760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610974565b6001600160a01b0382166000908152600460205260408120805460019290612bd290849061348e565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b15612d3257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612c7490339089908890889060040161328e565b602060405180830381600087803b158015612c8e57600080fd5b505af1925050508015612cbe575060408051601f3d908101601f19168201909252612cbb918101906130e7565b60015b612d18573d808015612cec576040519150601f19603f3d011682016040523d82523d6000602084013e612cf1565b606091505b508051612d105760405162461bcd60e51b815260040161097490613338565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612451565b506001949350505050565b50805460008255906000526020600020908101906122429190612e1c565b6040518060e001604052806007906020820280368337509192915050565b828054612d859061351c565b90600052602060002090601f016020900481019282612da75760008555612ded565b82601f10612dc05782800160ff19823516178555612ded565b82800160010185558215612ded579182015b82811115612ded578235825591602001919060010190612dd2565b50612df9929150612e1c565b5090565b604051806101400160405280600a906020820280368337509192915050565b5b80821115612df95760008155600101612e1d565b80356001600160a01b0381168114612e4857600080fd5b919050565b600060208284031215612e5f57600080fd5b612e6882612e31565b9392505050565b60008060408385031215612e8257600080fd5b612e8b83612e31565b9150612e9960208401612e31565b90509250929050565b600080600060608486031215612eb757600080fd5b612ec084612e31565b9250612ece60208501612e31565b9150604084013590509250925092565b60008060008060808587031215612ef457600080fd5b612efd85612e31565b9350612f0b60208601612e31565b925060408501359150606085013567ffffffffffffffff80821115612f2f57600080fd5b818701915087601f830112612f4357600080fd5b813581811115612f5557612f556135c8565b604051601f8201601f19908116603f01168101908382118183101715612f7d57612f7d6135c8565b816040528281528a6020848701011115612f9657600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215612fcd57600080fd5b612fd683612e31565b91506020830135612fe6816135de565b809150509250929050565b6000806040838503121561300457600080fd5b61300d83612e31565b946020939093013593505050565b6000806020838503121561302e57600080fd5b823567ffffffffffffffff8082111561304657600080fd5b818501915085601f83011261305a57600080fd5b81358181111561306957600080fd5b8660208260051b850101111561307e57600080fd5b60209290920196919550909350505050565b6000602082840312156130a257600080fd5b8135612e68816135de565b6000602082840312156130bf57600080fd5b8151612e68816135de565b6000602082840312156130dc57600080fd5b8135612e68816135ec565b6000602082840312156130f957600080fd5b8151612e68816135ec565b6000806020838503121561311757600080fd5b823567ffffffffffffffff8082111561312f57600080fd5b818501915085601f83011261314357600080fd5b81358181111561315257600080fd5b86602082850101111561307e57600080fd5b60006020828403121561317657600080fd5b5035919050565b6000806040838503121561319057600080fd5b50508035926020909101359150565b600081518084526131b78160208601602086016134f0565b601f01601f19169290920160200192915050565b600081516131dd8185602086016134f0565b9290920192915050565b600080845481600182811c91508083168061320357607f831692505b602080841082141561322357634e487b7160e01b86526022600452602486fd5b818015613237576001811461324857613275565b60ff19861689528489019650613275565b60008b81526020902060005b8681101561326d5781548b820152908501908301613254565b505084890196505b50505050505061328581856131cb565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906132c19083018461319f565b9695505050505050565b6101408101818360005b600a8110156132f45781518352602092830192909101906001016132d5565b50505092915050565b60e08101818360005b60078110156132f4578151835260209283019290910190600101613306565b602081526000612e68602083018461319f565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526027908201527f63616c6c6572206973206e6f7420746865206f776e6572206e6569746865722060408201526636b0b730b3b2b960c91b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600082198211156134a1576134a1613586565b500190565b6000826134b5576134b561359c565b500490565b60008160001904831182151516156134d4576134d4613586565b500290565b6000828210156134eb576134eb613586565b500390565b60005b8381101561350b5781810151838201526020016134f3565b83811115611d105750506000910152565b600181811c9082168061353057607f821691505b6020821081141561355157634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561356b5761356b613586565b5060010190565b6000826135815761358161359c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b801515811461224257600080fd5b6001600160e01b03198116811461224257600080fdfea2646970667358221220a29e41f7c5e30596474dfcc55fd6fe1914ef83da1c44c7ef38aa0b966530843f64736f6c63430008070033697066733a2f2f516d5a6b4a6f636d47524643656639743271324d475551345a376b4e48394b50415377456544326b7831315552772f

Deployed Bytecode

0x60806040526004361061027d5760003560e01c80636386c1c71161014f578063c0ca970f116100c1578063e22572661161007a578063e22572661461075b578063e3c61b021461077b578063e985e9c51461079b578063f2fde38b146107bb578063f34e1ea1146107db578063ff4b629e146107fb57600080fd5b8063c0ca970f146106a8578063c71daccb146106c8578063c87b56dd146106db578063d031370b146106fb578063d0ebdbe71461071b578063de3bc79f1461073b57600080fd5b806395d89b411161011357806395d89b411461060b578063a04e5f7f14610620578063a22cb46514610635578063a3df2a0114610655578063ac1349a114610668578063b88d4fde1461068857600080fd5b80636386c1c71461056b57806370a0823114610598578063715018a6146105b8578063808312bc146105cd5780638da5cb5b146105ed57600080fd5b80632e431810116101f35780634a213d2a116101ac5780634a213d2a146104c3578063502ece24146104e357806352c0295f146105035780635d8ceea9146105185780635e59da6b146105385780636352211e1461054b57600080fd5b80632e4318101461041257806336e517dd146104255780633abe69b2146104525780633b3538421461047257806342842e0e14610485578063481c6a75146104a557600080fd5b8063138cfadc11610245578063138cfadc1461035357806318160ddd146103735780631c58eec51461039257806323b872dd146103b2578063279b8b5a146103d25780632e1a7d4d146103f257600080fd5b806301ffc9a71461028257806306fdde03146102b7578063081812fc146102d9578063095ea7b3146103115780630ff4231014610333575b600080fd5b34801561028e57600080fd5b506102a261029d3660046130ca565b61081b565b60405190151581526020015b60405180910390f35b3480156102c357600080fd5b506102cc61086d565b6040516102ae9190613325565b3480156102e557600080fd5b506102f96102f4366004613164565b6108ff565b6040516001600160a01b0390911681526020016102ae565b34801561031d57600080fd5b5061033161032c366004612ff1565b610999565b005b34801561033f57600080fd5b5061033161034e36600461301b565b610aaf565b34801561035f57600080fd5b5061033161036e36600461317d565b610bf2565b34801561037f57600080fd5b50600b545b6040519081526020016102ae565b34801561039e57600080fd5b506103316103ad36600461317d565b610c3c565b3480156103be57600080fd5b506103316103cd366004612ea2565b610c86565b3480156103de57600080fd5b506103316103ed36600461301b565b610cb7565b3480156103fe57600080fd5b5061033161040d366004613164565b610dfa565b610331610420366004613164565b610eee565b34801561043157600080fd5b50610445610440366004612e4d565b61114b565b6040516102ae91906132fd565b34801561045e57600080fd5b5061044561046d366004612e4d565b6111c4565b610331610480366004613164565b611241565b34801561049157600080fd5b506103316104a0366004612ea2565b611407565b3480156104b157600080fd5b506008546001600160a01b03166102f9565b3480156104cf57600080fd5b506103316104de36600461317d565b611422565b3480156104ef57600080fd5b506103316104fe36600461317d565b61146c565b34801561050f57600080fd5b506102cc6114b6565b34801561052457600080fd5b50610331610533366004613104565b6114c5565b610331610546366004613164565b611510565b34801561055757600080fd5b506102f9610566366004613164565b61172d565b34801561057757600080fd5b5061058b610586366004612e4d565b6117a4565b6040516102ae91906132cb565b3480156105a457600080fd5b506103846105b3366004612e4d565b611919565b3480156105c457600080fd5b506103316119a0565b3480156105d957600080fd5b506103316105e8366004613090565b6119d6565b3480156105f957600080fd5b506000546001600160a01b03166102f9565b34801561061757600080fd5b506102cc611a28565b34801561062c57600080fd5b506102cc611a37565b34801561064157600080fd5b50610331610650366004612fba565b611a46565b610331610663366004613164565b611a55565b34801561067457600080fd5b50610331610683366004613104565b611c93565b34801561069457600080fd5b506103316106a3366004612ede565b611cde565b3480156106b457600080fd5b506103316106c336600461301b565b611d16565b3480156106d457600080fd5b5047610384565b3480156106e757600080fd5b506102cc6106f6366004613164565b611e59565b34801561070757600080fd5b50610331610716366004613164565b611f08565b34801561072757600080fd5b50610331610736366004612e4d565b61200f565b34801561074757600080fd5b50610331610756366004613090565b61205b565b34801561076757600080fd5b50610445610776366004612e4d565b6120ad565b34801561078757600080fd5b50610331610796366004613090565b61212a565b3480156107a757600080fd5b506102a26107b6366004612e6f565b61217c565b3480156107c757600080fd5b506103316107d6366004612e4d565b6121aa565b3480156107e757600080fd5b506103316107f6366004613090565b612245565b34801561080757600080fd5b50610445610816366004612e4d565b612297565b60006001600160e01b031982166380ac58cd60e01b148061084c57506001600160e01b03198216635b5e139f60e01b145b8061086757506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606001805461087c9061351c565b80601f01602080910402602001604051908101604052809291908181526020018280546108a89061351c565b80156108f55780601f106108ca576101008083540402835291602001916108f5565b820191906000526020600020905b8154815290600101906020018083116108d857829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b031661097d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60006109a48261172d565b9050806001600160a01b0316836001600160a01b03161415610a125760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610974565b336001600160a01b0382161480610a2e5750610a2e813361217c565b610aa05760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610974565b610aaa8383612314565b505050565b6000546001600160a01b0316331480610ad257506008546001600160a01b031633145b610aee5760405162461bcd60e51b815260040161097490613410565b610afa600f6000612d3d565b60005b81811015610aaa576000838383818110610b1957610b196135b2565b9050602002016020810190610b2e9190612e4d565b6001600160a01b03161415610b855760405162461bcd60e51b815260206004820152601d60248201527f574f4e4445524c4953542053414c453a20696e76616c6964206c6973740000006044820152606401610974565b600f838383818110610b9957610b996135b2565b9050602002016020810190610bae9190612e4d565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b0390921691909117905580610bea81613557565b915050610afd565b6000546001600160a01b0316331480610c1557506008546001600160a01b031633145b610c315760405162461bcd60e51b815260040161097490613410565b601c91909155601d55565b6000546001600160a01b0316331480610c5f57506008546001600160a01b031633145b610c7b5760405162461bcd60e51b815260040161097490613410565b601791909155601855565b610c903382612382565b610cac5760405162461bcd60e51b8152600401610974906133bf565b610aaa838383612459565b6000546001600160a01b0316331480610cda57506008546001600160a01b031633145b610cf65760405162461bcd60e51b815260040161097490613410565b610d0260146000612d3d565b60005b81811015610aaa576000838383818110610d2157610d216135b2565b9050602002016020810190610d369190612e4d565b6001600160a01b03161415610d8d5760405162461bcd60e51b815260206004820152601d60248201527f574f4e4445524b4944532053414c453a20696e76616c6964206c6973740000006044820152606401610974565b6014838383818110610da157610da16135b2565b9050602002016020810190610db69190612e4d565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b0390921691909117905580610df281613557565b915050610d05565b6000546001600160a01b0316331480610e1d57506008546001600160a01b031633145b610e395760405162461bcd60e51b815260040161097490613410565b60026007541415610e5c5760405162461bcd60e51b815260040161097490613457565b600260075547811115610ea85760405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b6044820152606401610974565b600080546040516001600160a01b039091169182916108fc85150291859190818181858888f19350505050158015610ee4573d6000803e3d6000fd5b5050600160075550565b60026007541415610f115760405162461bcd60e51b815260040161097490613457565b60026007556000610f21336111c4565b805190915015610f735760405162461bcd60e51b815260206004820152601a60248201527f574f4e4445524c4953542053414c453a2073757370656e6465640000000000006044820152606401610974565b60208101511580610f88575060208101514210155b610fd45760405162461bcd60e51b815260206004820152601a60248201527f574f4e4445524c4953542053414c453a206e6f74206f70656e640000000000006044820152606401610974565b60408101511580610fe85750604081015142105b6110345760405162461bcd60e51b815260206004820152601960248201527f574f4e4445524c4953542053414c453a2066696e6973686564000000000000006044820152606401610974565b60808101516001146110885760405162461bcd60e51b815260206004820181905260248201527f574f4e4445524c4953542053414c453a206e6f742077686974656c69737465646044820152606401610974565b60c081015161109890839061348e565b60a082015110156110f65760405162461bcd60e51b815260206004820152602260248201527f574f4e4445524c4953542053414c453a207265616368656420746865206c696d6044820152611a5d60f21b6064820152608401610974565b61111433838360035b602002015161110e91906134ba565b346125f5565b61111e3383612691565b336000908152601060205260408120805484929061113d90849061348e565b909155505060016007555050565b611153612d5b565b61115b612d5b565b601b5460ff161561116b57600181525b601c54602080830191909152601d5460408084019190915266f5232269808000606084015260016080840152600260a08401526001600160a01b0385166000908152601e9092529020548160065b602002015292915050565b6111cc612d5b565b6111d4612d5b565b600c5460ff16156111e457600181525b600d546020820152600e54604082015266d19c2ff9bf8000606082015261120c600f846127ce565b1561121957600160808201525b600260a08201526001600160a01b0383166000908152601060205260409020548160066111b9565b600260075414156112645760405162461bcd60e51b815260040161097490613457565b600260075560006112743361114b565b8051909150156112be5760405162461bcd60e51b815260206004820152601560248201527411925390530814d053114e881cdd5cdc195b991959605a1b6044820152606401610974565b602081015115806112d3575060208101514210155b6113175760405162461bcd60e51b815260206004820152601560248201527411925390530814d053114e881b9bdd081bdc195b99605a1b6044820152606401610974565b6040810151158061132b5750604081015142105b61136e5760405162461bcd60e51b815260206004820152601460248201527311925390530814d053114e88199a5b9a5cda195960621b6044820152606401610974565b60c081015161137e90839061348e565b60a082015110156113d15760405162461bcd60e51b815260206004820152601d60248201527f46494e414c2053414c453a207265616368656420746865206c696d69740000006044820152606401610974565b6113de33838360036110ff565b6113e83383612691565b336000908152601e60205260408120805484929061113d90849061348e565b610aaa83838360405180602001604052806000815250611cde565b6000546001600160a01b031633148061144557506008546001600160a01b031633145b6114615760405162461bcd60e51b815260040161097490613410565b600d91909155600e55565b6000546001600160a01b031633148061148f57506008546001600160a01b031633145b6114ab5760405162461bcd60e51b815260040161097490613410565b601291909155601355565b60606009805461087c9061351c565b6000546001600160a01b03163314806114e857506008546001600160a01b031633145b6115045760405162461bcd60e51b815260040161097490613410565b610aaa600a8383612d79565b600260075414156115335760405162461bcd60e51b815260040161097490613457565b6002600755600061154333612297565b80519091501561158e5760405162461bcd60e51b8152602060048201526016602482015275141550931250c814d053114e881cdd5cdc195b99195960521b6044820152606401610974565b602081015115806115a3575060208101514210155b6115e85760405162461bcd60e51b8152602060048201526016602482015275141550931250c814d053114e881b9bdd081bdc195b9960521b6044820152606401610974565b604081015115806115fc5750604081015142105b6116405760405162461bcd60e51b8152602060048201526015602482015274141550931250c814d053114e88199a5b9a5cda1959605a1b6044820152606401610974565b60808101516001146116945760405162461bcd60e51b815260206004820152601c60248201527f5055424c49432053414c453a206e6f742077686974656c6973746564000000006044820152606401610974565b60c08101516116a490839061348e565b60a082015110156116f75760405162461bcd60e51b815260206004820152601e60248201527f5055424c49432053414c453a207265616368656420746865206c696d697400006044820152606401610974565b61170433838360036110ff565b61170e3383612691565b336000908152601a60205260408120805484929061113d90849061348e565b6000818152600360205260408120546001600160a01b0316806108675760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610974565b6117ac612dfd565b6117b4612dfd565b6117bc612d5b565b6117c7600f856127ce565b80156117de5750600e5415806117de575042600e54115b156117fa57600160e08301526117f3846111c4565b905061187b565b6118056014856127ce565b801561181c5750601354158061181c575042601354115b1561183157600260e08301526117f3846120ad565b61183c6019856127ce565b801561185357506018541580611853575042601854115b1561186857600360e08301526117f384612297565b600460e08301526118788461114b565b90505b60005b60078110156118c757818160078110611899576118996135b2565b60200201518382600a81106118b0576118b06135b2565b6020020152806118bf81613557565b91505061187e565b50600b54826118d86007600161348e565b600a81106118e8576118e86135b2565b60200201526115b3826118fd6007600261348e565b600a811061190d5761190d6135b2565b60200201525092915050565b60006001600160a01b0382166119845760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610974565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b031633146119ca5760405162461bcd60e51b81526004016109749061338a565b6119d4600061289e565b565b6000546001600160a01b03163314806119f957506008546001600160a01b031633145b611a155760405162461bcd60e51b815260040161097490613410565b601b805460ff1916911515919091179055565b60606002805461087c9061351c565b6060600a805461087c9061351c565b611a513383836128ee565b5050565b60026007541415611a785760405162461bcd60e51b815260040161097490613457565b60026007556000611a88336120ad565b805190915015611ada5760405162461bcd60e51b815260206004820152601a60248201527f574f4e4445524b4944532053414c453a2073757370656e6465640000000000006044820152606401610974565b60208101511580611aef575060208101514210155b611b3b5760405162461bcd60e51b815260206004820152601a60248201527f574f4e4445524b4944532053414c453a206e6f74206f70656e640000000000006044820152606401610974565b60408101511580611b4f5750604081015142105b611b9b5760405162461bcd60e51b815260206004820152601960248201527f574f4e4445524b4944532053414c453a2066696e6973686564000000000000006044820152606401610974565b6080810151600114611bef5760405162461bcd60e51b815260206004820181905260248201527f574f4e4445524b4944532053414c453a206e6f742077686974656c69737465646044820152606401610974565b60c0810151611bff90839061348e565b60a08201511015611c5d5760405162461bcd60e51b815260206004820152602260248201527f574f4e4445524b4944532053414c453a207265616368656420746865206c696d6044820152611a5d60f21b6064820152608401610974565b611c6a33838360036110ff565b611c743383612691565b336000908152601560205260408120805484929061113d90849061348e565b6000546001600160a01b0316331480611cb657506008546001600160a01b031633145b611cd25760405162461bcd60e51b815260040161097490613410565b610aaa60098383612d79565b611ce83383612382565b611d045760405162461bcd60e51b8152600401610974906133bf565b611d10848484846129bd565b50505050565b6000546001600160a01b0316331480611d3957506008546001600160a01b031633145b611d555760405162461bcd60e51b815260040161097490613410565b611d6160196000612d3d565b60005b81811015610aaa576000838383818110611d8057611d806135b2565b9050602002016020810190611d959190612e4d565b6001600160a01b03161415611dec5760405162461bcd60e51b815260206004820152601960248201527f5055424c49432053414c453a20696e76616c6964206c697374000000000000006044820152606401610974565b6019838383818110611e0057611e006135b2565b9050602002016020810190611e159190612e4d565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b0390921691909117905580611e5181613557565b915050611d64565b6000818152600360205260409020546060906001600160a01b0316611eb45760405162461bcd60e51b81526020600482015260116024820152703737b732bc34b9ba32b73a103a37b5b2b760791b6044820152606401610974565b6000600a8054611ec39061351c565b90501115611efd57600a611ed6836129f0565b604051602001611ee79291906131e7565b6040516020818303038152906040529050919050565b6009611ed6836129f0565b6000546001600160a01b0316331480611f2b57506008546001600160a01b031633145b611f475760405162461bcd60e51b815260040161097490613410565b607881600b54611f57919061348e565b1115611fa55760405162461bcd60e51b815260206004820152601e60248201527f657863656564656420746865207265736572766174696f6e2072616e676500006044820152606401610974565b60005b81811015611ff457611fe2611fc56000546001600160a01b031690565b611fd083600161348e565b600b54611fdd919061348e565b612aee565b80611fec81613557565b915050611fa8565b5080600b6000828254612007919061348e565b909155505050565b6000546001600160a01b031633146120395760405162461bcd60e51b81526004016109749061338a565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633148061207e57506008546001600160a01b031633145b61209a5760405162461bcd60e51b815260040161097490613410565b600c805460ff1916911515919091179055565b6120b5612d5b565b6120bd612d5b565b60115460ff16156120cd57600181525b6012546020820152601354604082015266d19c2ff9bf800060608201526120f56014846127ce565b1561210257600160808201525b600160a08201526001600160a01b0383166000908152601560205260409020548160066111b9565b6000546001600160a01b031633148061214d57506008546001600160a01b031633145b6121695760405162461bcd60e51b815260040161097490613410565b6011805460ff1916911515919091179055565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6000546001600160a01b031633146121d45760405162461bcd60e51b81526004016109749061338a565b6001600160a01b0381166122395760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610974565b6122428161289e565b50565b6000546001600160a01b031633148061226857506008546001600160a01b031633145b6122845760405162461bcd60e51b815260040161097490613410565b6016805460ff1916911515919091179055565b61229f612d5b565b6122a7612d5b565b60165460ff16156122b757600181525b6017546020820152601854604082015266f523226980800060608201526122df6019846127ce565b156122ec57600160808201525b600160a08201526001600160a01b0383166000908152601a60205260409020548160066111b9565b600081815260056020526040902080546001600160a01b0319166001600160a01b03841690811790915581906123498261172d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b03166123fb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610974565b60006124068361172d565b9050806001600160a01b0316846001600160a01b0316148061242d575061242d818561217c565b806124515750836001600160a01b0316612446846108ff565b6001600160a01b0316145b949350505050565b826001600160a01b031661246c8261172d565b6001600160a01b0316146124d05760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610974565b6001600160a01b0382166125325760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610974565b61253d600082612314565b6001600160a01b03831660009081526004602052604081208054600192906125669084906134d9565b90915550506001600160a01b038216600090815260046020526040812080546001929061259490849061348e565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b8082111561263a5760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742076616c756560701b6044820152606401610974565b80821015610aaa57600061264e83836134d9565b60405190915084906001600160a01b0382169083156108fc029084906000818181858888f19350505050158015612689573d6000803e3d6000fd5b505050505050565b6001600160a01b0382166126d45760405162461bcd60e51b815260206004820152600a602482015269696e76616c696420746f60b01b6044820152606401610974565b6078600b5410156127275760405162461bcd60e51b815260206004820152601860248201527f7265736572766174696f6e206e6f742066696e697368656400000000000000006044820152606401610974565b6115b381600b54612738919061348e565b11156127865760405162461bcd60e51b815260206004820152601960248201527f65786365656465642074686520737570706c792072616e6765000000000000006044820152606401610974565b60005b818110156127b2576127a083611fd083600161348e565b806127aa81613557565b915050612789565b5080600b60008282546127c5919061348e565b90915550505050565b6000805b8354811015612894578381815481106127ed576127ed6135b2565b600091825260209091200154604051631846d2f560e31b81526001600160a01b0385811660048301529091169063c23697a89060240160206040518083038186803b15801561283b57600080fd5b505afa15801561284f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287391906130ad565b15612882576001915050610867565b8061288c81613557565b9150506127d2565b5060009392505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b031614156129505760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610974565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6129c8848484612459565b6129d484848484612c30565b611d105760405162461bcd60e51b815260040161097490613338565b606081612a145750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612a3e5780612a2881613557565b9150612a379050600a836134a6565b9150612a18565b60008167ffffffffffffffff811115612a5957612a596135c8565b6040519080825280601f01601f191660200182016040528015612a83576020820181803683370190505b5090505b841561245157612a986001836134d9565b9150612aa5600a86613572565b612ab090603061348e565b60f81b818381518110612ac557612ac56135b2565b60200101906001600160f81b031916908160001a905350612ae7600a866134a6565b9450612a87565b6001600160a01b038216612b445760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610974565b6000818152600360205260409020546001600160a01b031615612ba95760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610974565b6001600160a01b0382166000908152600460205260408120805460019290612bd290849061348e565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b15612d3257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612c7490339089908890889060040161328e565b602060405180830381600087803b158015612c8e57600080fd5b505af1925050508015612cbe575060408051601f3d908101601f19168201909252612cbb918101906130e7565b60015b612d18573d808015612cec576040519150601f19603f3d011682016040523d82523d6000602084013e612cf1565b606091505b508051612d105760405162461bcd60e51b815260040161097490613338565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612451565b506001949350505050565b50805460008255906000526020600020908101906122429190612e1c565b6040518060e001604052806007906020820280368337509192915050565b828054612d859061351c565b90600052602060002090601f016020900481019282612da75760008555612ded565b82601f10612dc05782800160ff19823516178555612ded565b82800160010185558215612ded579182015b82811115612ded578235825591602001919060010190612dd2565b50612df9929150612e1c565b5090565b604051806101400160405280600a906020820280368337509192915050565b5b80821115612df95760008155600101612e1d565b80356001600160a01b0381168114612e4857600080fd5b919050565b600060208284031215612e5f57600080fd5b612e6882612e31565b9392505050565b60008060408385031215612e8257600080fd5b612e8b83612e31565b9150612e9960208401612e31565b90509250929050565b600080600060608486031215612eb757600080fd5b612ec084612e31565b9250612ece60208501612e31565b9150604084013590509250925092565b60008060008060808587031215612ef457600080fd5b612efd85612e31565b9350612f0b60208601612e31565b925060408501359150606085013567ffffffffffffffff80821115612f2f57600080fd5b818701915087601f830112612f4357600080fd5b813581811115612f5557612f556135c8565b604051601f8201601f19908116603f01168101908382118183101715612f7d57612f7d6135c8565b816040528281528a6020848701011115612f9657600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215612fcd57600080fd5b612fd683612e31565b91506020830135612fe6816135de565b809150509250929050565b6000806040838503121561300457600080fd5b61300d83612e31565b946020939093013593505050565b6000806020838503121561302e57600080fd5b823567ffffffffffffffff8082111561304657600080fd5b818501915085601f83011261305a57600080fd5b81358181111561306957600080fd5b8660208260051b850101111561307e57600080fd5b60209290920196919550909350505050565b6000602082840312156130a257600080fd5b8135612e68816135de565b6000602082840312156130bf57600080fd5b8151612e68816135de565b6000602082840312156130dc57600080fd5b8135612e68816135ec565b6000602082840312156130f957600080fd5b8151612e68816135ec565b6000806020838503121561311757600080fd5b823567ffffffffffffffff8082111561312f57600080fd5b818501915085601f83011261314357600080fd5b81358181111561315257600080fd5b86602082850101111561307e57600080fd5b60006020828403121561317657600080fd5b5035919050565b6000806040838503121561319057600080fd5b50508035926020909101359150565b600081518084526131b78160208601602086016134f0565b601f01601f19169290920160200192915050565b600081516131dd8185602086016134f0565b9290920192915050565b600080845481600182811c91508083168061320357607f831692505b602080841082141561322357634e487b7160e01b86526022600452602486fd5b818015613237576001811461324857613275565b60ff19861689528489019650613275565b60008b81526020902060005b8681101561326d5781548b820152908501908301613254565b505084890196505b50505050505061328581856131cb565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906132c19083018461319f565b9695505050505050565b6101408101818360005b600a8110156132f45781518352602092830192909101906001016132d5565b50505092915050565b60e08101818360005b60078110156132f4578151835260209283019290910190600101613306565b602081526000612e68602083018461319f565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526027908201527f63616c6c6572206973206e6f7420746865206f776e6572206e6569746865722060408201526636b0b730b3b2b960c91b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600082198211156134a1576134a1613586565b500190565b6000826134b5576134b561359c565b500490565b60008160001904831182151516156134d4576134d4613586565b500290565b6000828210156134eb576134eb613586565b500390565b60005b8381101561350b5781810151838201526020016134f3565b83811115611d105750506000910152565b600181811c9082168061353057607f821691505b6020821081141561355157634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561356b5761356b613586565b5060010190565b6000826135815761358161359c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b801515811461224257600080fd5b6001600160e01b03198116811461224257600080fdfea2646970667358221220a29e41f7c5e30596474dfcc55fd6fe1914ef83da1c44c7ef38aa0b966530843f64736f6c63430008070033

Deployed Bytecode Sourcemap

39234:24375:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22973:305;;;;;;;;;;-1:-1:-1;22973:305:0;;;;;:::i;:::-;;:::i;:::-;;;8857:14:1;;8850:22;8832:41;;8820:2;8805:18;22973:305:0;;;;;;;;23918:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;25478:221::-;;;;;;;;;;-1:-1:-1;25478:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7153:32:1;;;7135:51;;7123:2;7108:18;25478:221:0;6989:203:1;25001:411:0;;;;;;;;;;-1:-1:-1;25001:411:0;;;;;:::i;:::-;;:::i;:::-;;49900:367;;;;;;;;;;-1:-1:-1;49900:367:0;;;;;:::i;:::-;;:::i;58144:165::-;;;;;;;;;;-1:-1:-1;58144:165:0;;;;;:::i;:::-;;:::i;47763:96::-;;;;;;;;;;-1:-1:-1;47837:12:0;;47763:96;;;26332:25:1;;;26320:2;26305:18;47763:96:0;26186:177:1;55434:168:0;;;;;;;;;;-1:-1:-1;55434:168:0;;;;;:::i;:::-;;:::i;26228:339::-;;;;;;;;;;-1:-1:-1;26228:339:0;;;;;:::i;:::-;;:::i;52794:367::-;;;;;;;;;;-1:-1:-1;52794:367:0;;;;;:::i;:::-;;:::i;63350:254::-;;;;;;;;;;-1:-1:-1;63350:254:0;;;;;:::i;:::-;;:::i;50453:903::-;;;;;;:::i;:::-;;:::i;57206:581::-;;;;;;;;;;-1:-1:-1;57206:581:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;48641:681::-;;;;;;;;;;-1:-1:-1;48641:681:0;;;;;:::i;:::-;;:::i;58490:775::-;;;;;;:::i;:::-;;:::i;26638:185::-;;;;;;;;;;-1:-1:-1;26638:185:0;;;;;:::i;:::-;;:::i;46029:86::-;;;;;;;;;;-1:-1:-1;46097:8:0;;-1:-1:-1;;;;;46097:8:0;46029:86;;49694:180;;;;;;;;;;-1:-1:-1;49694:180:0;;;;;:::i;:::-;;:::i;52588:::-;;;;;;;;;;-1:-1:-1;52588:180:0;;;;;:::i;:::-;;:::i;46556:112::-;;;;;;;;;;;;;:::i;47470:126::-;;;;;;;;;;-1:-1:-1;47470:126:0;;;;;:::i;:::-;;:::i;56161:871::-;;;;;;:::i;:::-;;:::i;23612:239::-;;;;;;;;;;-1:-1:-1;23612:239:0;;;;;:::i;:::-;;:::i;61513:1380::-;;;;;;;;;;-1:-1:-1;61513:1380:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;23342:208::-;;;;;;;;;;-1:-1:-1;23342:208:0;;;;;:::i;:::-;;:::i;4513:103::-;;;;;;;;;;;;;:::i;58000:118::-;;;;;;;;;;-1:-1:-1;58000:118:0;;;;;:::i;:::-;;:::i;3862:87::-;;;;;;;;;;-1:-1:-1;3908:7:0;3935:6;-1:-1:-1;;;;;3935:6:0;3862:87;;24087:104;;;;;;;;;;;;;:::i;47158:116::-;;;;;;;;;;;;;:::i;25771:155::-;;;;;;;;;;-1:-1:-1;25771:155:0;;;;;:::i;:::-;;:::i;53347:903::-;;;;;;:::i;:::-;;:::i;46862:122::-;;;;;;;;;;-1:-1:-1;46862:122:0;;;;;:::i;:::-;;:::i;26894:328::-;;;;;;;;;;-1:-1:-1;26894:328:0;;;;;:::i;:::-;;:::i;55628:351::-;;;;;;;;;;-1:-1:-1;55628:351:0;;;;;:::i;:::-;;:::i;63061:106::-;;;;;;;;;;-1:-1:-1;63136:21:0;63061:106;;48030:432;;;;;;;;;;-1:-1:-1;48030:432:0;;;;;:::i;:::-;;:::i;61045:301::-;;;;;;;;;;-1:-1:-1;61045:301:0;;;;;:::i;:::-;;:::i;46291:93::-;;;;;;;;;;-1:-1:-1;46291:93:0;;;;;:::i;:::-;;:::i;49540:128::-;;;;;;;;;;-1:-1:-1;49540:128:0;;;;;:::i;:::-;;:::i;51535:681::-;;;;;;;;;;-1:-1:-1;51535:681:0;;;;;:::i;:::-;;:::i;52434:128::-;;;;;;;;;;-1:-1:-1;52434:128:0;;;;;:::i;:::-;;:::i;25997:164::-;;;;;;;;;;-1:-1:-1;25997:164:0;;;;;:::i;:::-;;:::i;4771:201::-;;;;;;;;;;-1:-1:-1;4771:201:0;;;;;:::i;:::-;;:::i;55288:120::-;;;;;;;;;;-1:-1:-1;55288:120:0;;;;;:::i;:::-;;:::i;54425:649::-;;;;;;;;;;-1:-1:-1;54425:649:0;;;;;:::i;:::-;;:::i;22973:305::-;23075:4;-1:-1:-1;;;;;;23112:40:0;;-1:-1:-1;;;23112:40:0;;:105;;-1:-1:-1;;;;;;;23169:48:0;;-1:-1:-1;;;23169:48:0;23112:105;:158;;;-1:-1:-1;;;;;;;;;;21689:40:0;;;23234:36;23092:178;22973:305;-1:-1:-1;;22973:305:0:o;23918:100::-;23972:13;24005:5;23998:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23918:100;:::o;25478:221::-;25554:7;28821:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28821:16:0;25574:73;;;;-1:-1:-1;;;25574:73:0;;19082:2:1;25574:73:0;;;19064:21:1;19121:2;19101:18;;;19094:30;19160:34;19140:18;;;19133:62;-1:-1:-1;;;19211:18:1;;;19204:42;19263:19;;25574:73:0;;;;;;;;;-1:-1:-1;25667:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25667:24:0;;25478:221::o;25001:411::-;25082:13;25098:23;25113:7;25098:14;:23::i;:::-;25082:39;;25146:5;-1:-1:-1;;;;;25140:11:0;:2;-1:-1:-1;;;;;25140:11:0;;;25132:57;;;;-1:-1:-1;;;25132:57:0;;21971:2:1;25132:57:0;;;21953:21:1;22010:2;21990:18;;;21983:30;22049:34;22029:18;;;22022:62;-1:-1:-1;;;22100:18:1;;;22093:31;22141:19;;25132:57:0;21769:397:1;25132:57:0;2751:10;-1:-1:-1;;;;;25224:21:0;;;;:62;;-1:-1:-1;25249:37:0;25266:5;2751:10;25997:164;:::i;25249:37::-;25202:168;;;;-1:-1:-1;;;25202:168:0;;16050:2:1;25202:168:0;;;16032:21:1;16089:2;16069:18;;;16062:30;16128:34;16108:18;;;16101:62;16199:26;16179:18;;;16172:54;16243:19;;25202:168:0;15848:420:1;25202:168:0;25383:21;25392:2;25396:7;25383:8;:21::i;:::-;25071:341;25001:411;;:::o;49900:367::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;42763:10;:21;;:48;;-1:-1:-1;46097:8:0;;-1:-1:-1;;;;;46097:8:0;42788:10;:23;42763:48;42754:102;;;;-1:-1:-1;;;42754:102:0;;;;;;;:::i;:::-;50005:36:::1;50012:29;;50005:36;:::i;:::-;50059:9;50054:206;50072:14:::0;;::::1;50054:206;;;50137:1;50117:5:::0;;50123:1;50117:8;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;50117:22:0::1;;;50108:67;;;::::0;-1:-1:-1;;;50108:67:0;;25670:2:1;50108:67:0::1;::::0;::::1;25652:21:1::0;25709:2;25689:18;;;25682:30;25748:31;25728:18;;;25721:59;25797:18;;50108:67:0::1;25468:353:1::0;50108:67:0::1;50190:29;50237:5;;50243:1;50237:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;50190:58:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;50190:58:0;;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;;50190:58:0::1;-1:-1:-1::0;;;;;50190:58:0;;::::1;::::0;;;::::1;::::0;;50088:3;::::1;::::0;::::1;:::i;:::-;;;;50054:206;;58144:165:::0;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;42763:10;:21;;:48;;-1:-1:-1;46097:8:0;;-1:-1:-1;;;;;46097:8:0;42788:10;:23;42763:48;42754:102;;;;-1:-1:-1;;;42754:102:0;;;;;;;:::i;:::-;58244:17:::1;:25:::0;;;;58280:15:::1;:21:::0;58144:165::o;55434:168::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;42763:10;:21;;:48;;-1:-1:-1;46097:8:0;;-1:-1:-1;;;;;46097:8:0;42788:10;:23;42763:48;42754:102;;;;-1:-1:-1;;;42754:102:0;;;;;;;:::i;:::-;55535:18:::1;:26:::0;;;;55572:16:::1;:22:::0;55434:168::o;26228:339::-;26423:41;2751:10;26456:7;26423:18;:41::i;:::-;26415:103;;;;-1:-1:-1;;;26415:103:0;;;;;;;:::i;:::-;26531:28;26541:4;26547:2;26551:7;26531:9;:28::i;52794:367::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;42763:10;:21;;:48;;-1:-1:-1;46097:8:0;;-1:-1:-1;;;;;46097:8:0;42788:10;:23;42763:48;42754:102;;;;-1:-1:-1;;;42754:102:0;;;;;;;:::i;:::-;52899:36:::1;52906:29;;52899:36;:::i;:::-;52953:9;52948:206;52966:14:::0;;::::1;52948:206;;;53031:1;53011:5:::0;;53017:1;53011:8;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;53011:22:0::1;;;53002:67;;;::::0;-1:-1:-1;;;53002:67:0;;20551:2:1;53002:67:0::1;::::0;::::1;20533:21:1::0;20590:2;20570:18;;;20563:30;20629:31;20609:18;;;20602:59;20678:18;;53002:67:0::1;20349:353:1::0;53002:67:0::1;53084:29;53131:5;;53137:1;53131:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;53084:58:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;53084:58:0;;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;;53084:58:0::1;-1:-1:-1::0;;;;;53084:58:0;;::::1;::::0;;;::::1;::::0;;52982:3;::::1;::::0;::::1;:::i;:::-;;;;52948:206;;63350:254:::0;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;42763:10;:21;;:48;;-1:-1:-1;46097:8:0;;-1:-1:-1;;;;;46097:8:0;42788:10;:23;42763:48;42754:102;;;;-1:-1:-1;;;42754:102:0;;;;;;;:::i;:::-;37807:1:::1;38405:7;;:19;;38397:63;;;;-1:-1:-1::0;;;38397:63:0::1;;;;;;;:::i;:::-;37807:1;38538:7;:18:::0;63457:21:::2;63447:31:::0;::::2;;63438:66;;;::::0;-1:-1:-1;;;63438:66:0;;20202:2:1;63438:66:0::2;::::0;::::2;20184:21:1::0;20241:2;20221:18;;;20214:30;-1:-1:-1;;;20260:18:1;;;20253:50;20320:18;;63438:66:0::2;20000:344:1::0;63438:66:0::2;63517:22;3935:6:::0;;63571:25:::2;::::0;-1:-1:-1;;;;;3935:6:0;;;;;;63571:25:::2;::::0;::::2;;::::0;;;;;63517:22;63571:25;;3935:6;63571:25;::::2;;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;37763:1:0::1;38717:7;:22:::0;-1:-1:-1;63350:254:0:o;50453:903::-;37807:1;38405:7;;:19;;38397:63;;;;-1:-1:-1;;;38397:63:0;;;;;;;:::i;:::-;37807:1;38538:7;:18;50539:32:::1;50574:37;50599:10;50574:23;:37::i;:::-;50633:28:::0;;50539:72;;-1:-1:-1;50633:33:0;50624:74:::1;;;::::0;-1:-1:-1;;;50624:74:0;;10376:2:1;50624:74:0::1;::::0;::::1;10358:21:1::0;10415:2;10395:18;;;10388:30;10454:28;10434:18;;;10427:56;10500:18;;50624:74:0::1;10174:350:1::0;50624:74:0::1;50718:24;::::0;::::1;::::0;:29;;:76:::1;;-1:-1:-1::0;50751:24:0::1;::::0;::::1;::::0;50779:15:::1;-1:-1:-1::0;50751:43:0::1;50718:76;50709:117;;;::::0;-1:-1:-1;;;50709:117:0;;22373:2:1;50709:117:0::1;::::0;::::1;22355:21:1::0;22412:2;22392:18;;;22385:30;22451:28;22431:18;;;22424:56;22497:18;;50709:117:0::1;22171:350:1::0;50709:117:0::1;50846:22:::0;;::::1;::::0;:27;;:71:::1;;-1:-1:-1::0;50877:22:0;;::::1;::::0;50902:15:::1;-1:-1:-1::0;50846:71:0::1;50837:111;;;::::0;-1:-1:-1;;;50837:111:0;;12681:2:1;50837:111:0::1;::::0;::::1;12663:21:1::0;12720:2;12700:18;;;12693:30;12759:27;12739:18;;;12732:55;12804:18;;50837:111:0::1;12479:349:1::0;50837:111:0::1;50968:30:::0;;::::1;::::0;51002:1:::1;50968:35;50959:82;;;::::0;-1:-1:-1;;;50959:82:0;;11963:2:1;50959:82:0::1;::::0;::::1;11945:21:1::0;;;11982:18;;;11975:30;12041:34;12021:18;;;12014:62;12093:18;;50959:82:0::1;11761:356:1::0;50959:82:0::1;51093:30:::0;;::::1;::::0;:34:::1;::::0;51124:3;;51093:34:::1;:::i;:::-;51061:27:::0;;::::1;::::0;:67:::1;;51052:116;;;::::0;-1:-1:-1;;;51052:116:0;;14492:2:1;51052:116:0::1;::::0;::::1;14474:21:1::0;14531:2;14511:18;;;14504:30;14570:34;14550:18;;;14543:62;-1:-1:-1;;;14621:18:1;;;14614:32;14663:19;;51052:116:0::1;14290:398:1::0;51052:116:0::1;51181:68;51196:10;51233:3:::0;51208:7;40745:1:::1;51208:24;;;;;:28;;;;:::i;:::-;51238:9;51181:13;:68::i;:::-;51262:30;51275:10;51287:3;51262:11;:30::i;:::-;51330:10;51303:38;::::0;;;:26:::1;:38;::::0;;;;:45;;51345:3;;51303:38;:45:::1;::::0;51345:3;;51303:45:::1;:::i;:::-;::::0;;;-1:-1:-1;;37763:1:0;38717:7;:22;-1:-1:-1;;50453:903:0:o;57206:581::-;57273:24;;:::i;:::-;57310:31;;:::i;:::-;57358:23;;;;57354:65;;;57415:1;57385:31;;57354:65;57455:17;;57429:23;;;;:43;;;;57507:15;;57483:21;;;;:39;;;;40434:17;57533:23;;;:42;40645:1;57586:29;;;:33;40694:1;57630:26;;;:48;-1:-1:-1;;;;;57721:29:0;;-1:-1:-1;57721:29:0;;;:21;:29;;;;;;57429:6;40913:1;57689:29;;;;:61;57771:6;57206:581;-1:-1:-1;;57206:581:0:o;48641:681::-;48713:24;;:::i;:::-;48750:31;;:::i;:::-;48798:28;;;;48794:70;;;48860:1;48830:31;;48794:70;48900:22;;48874:23;;;:48;48957:20;;48933:21;;;:44;39933:17;48988:23;;;:47;49050:55;49067:29;49098:6;49050:15;:55::i;:::-;49046:99;;;49141:1;49109:29;;;:33;49046:99;40023:1;49155:26;;;:53;-1:-1:-1;;;;;49251:34:0;;;;;;:26;49155;49251:34;;;;;49155:6;40913:1;49219:29;;58490:775;37807:1;38405:7;;:19;;38397:63;;;;-1:-1:-1;;;38397:63:0;;;;;;;:::i;:::-;37807:1;38538:7;:18;58571:32:::1;58606;58626:10;58606:18;:32::i;:::-;58660:28:::0;;58571:67;;-1:-1:-1;58660:33:0;58651:69:::1;;;::::0;-1:-1:-1;;;58651:69:0;;22728:2:1;58651:69:0::1;::::0;::::1;22710:21:1::0;22767:2;22747:18;;;22740:30;-1:-1:-1;;;22786:18:1;;;22779:51;22847:18;;58651:69:0::1;22526:345:1::0;58651:69:0::1;58740:24;::::0;::::1;::::0;:29;;:76:::1;;-1:-1:-1::0;58773:24:0::1;::::0;::::1;::::0;58801:15:::1;-1:-1:-1::0;58773:43:0::1;58740:76;58731:112;;;::::0;-1:-1:-1;;;58731:112:0;;21264:2:1;58731:112:0::1;::::0;::::1;21246:21:1::0;21303:2;21283:18;;;21276:30;-1:-1:-1;;;21322:18:1;;;21315:51;21383:18;;58731:112:0::1;21062:345:1::0;58731:112:0::1;58863:22:::0;;::::1;::::0;:27;;:71:::1;;-1:-1:-1::0;58894:22:0;;::::1;::::0;58919:15:::1;-1:-1:-1::0;58863:71:0::1;58854:106;;;::::0;-1:-1:-1;;;58854:106:0;;24259:2:1;58854:106:0::1;::::0;::::1;24241:21:1::0;24298:2;24278:18;;;24271:30;-1:-1:-1;;;24317:18:1;;;24310:50;24377:18;;58854:106:0::1;24057:344:1::0;58854:106:0::1;59012:30:::0;;::::1;::::0;:34:::1;::::0;59043:3;;59012:34:::1;:::i;:::-;58980:27:::0;;::::1;::::0;:67:::1;;58971:111;;;::::0;-1:-1:-1;;;58971:111:0;;18363:2:1;58971:111:0::1;::::0;::::1;18345:21:1::0;18402:2;18382:18;;;18375:30;18441:31;18421:18;;;18414:59;18490:18;;58971:111:0::1;18161:353:1::0;58971:111:0::1;59095:68;59110:10;59147:3:::0;59122:7;40745:1:::1;59122:24;::::0;59095:68:::1;59176:30;59189:10;59201:3;59176:11;:30::i;:::-;59239:10;59217:33;::::0;;;:21:::1;:33;::::0;;;;:40;;59254:3;;59217:33;:40:::1;::::0;59254:3;;59217:40:::1;:::i;26638:185::-:0;26776:39;26793:4;26799:2;26803:7;26776:39;;;;;;;;;;;;:16;:39::i;49694:180::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;42763:10;:21;;:48;;-1:-1:-1;46097:8:0;;-1:-1:-1;;;;;46097:8:0;42788:10;:23;42763:48;42754:102;;;;-1:-1:-1;;;42754:102:0;;;;;;;:::i;:::-;49799:22:::1;:30:::0;;;;49840:20:::1;:26:::0;49694:180::o;52588:::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;42763:10;:21;;:48;;-1:-1:-1;46097:8:0;;-1:-1:-1;;;;;46097:8:0;42788:10;:23;42763:48;42754:102;;;;-1:-1:-1;;;42754:102:0;;;;;;;:::i;:::-;52693:22:::1;:30:::0;;;;52734:20:::1;:26:::0;52588:180::o;46556:112::-;46607:13;46641:17;46633:27;;;;;:::i;47470:126::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;42763:10;:21;;:48;;-1:-1:-1;46097:8:0;;-1:-1:-1;;;;;46097:8:0;42788:10;:23;42763:48;42754:102;;;;-1:-1:-1;;;42754:102:0;;;;;;;:::i;:::-;47563:25:::1;:19;47585:3:::0;;47563:25:::1;:::i;56161:871::-:0;37807:1;38405:7;;:19;;38397:63;;;;-1:-1:-1;;;38397:63:0;;;;;;;:::i;:::-;37807:1;38538:7;:18;56243:32:::1;56278:33;56299:10;56278:19;:33::i;:::-;56333:28:::0;;56243:68;;-1:-1:-1;56333:33:0;56324:70:::1;;;::::0;-1:-1:-1;;;56324:70:0;;14141:2:1;56324:70:0::1;::::0;::::1;14123:21:1::0;14180:2;14160:18;;;14153:30;-1:-1:-1;;;14199:18:1;;;14192:52;14261:18;;56324:70:0::1;13939:346:1::0;56324:70:0::1;56414:24;::::0;::::1;::::0;:29;;:76:::1;;-1:-1:-1::0;56447:24:0::1;::::0;::::1;::::0;56475:15:::1;-1:-1:-1::0;56447:43:0::1;56414:76;56405:113;;;::::0;-1:-1:-1;;;56405:113:0;;9664:2:1;56405:113:0::1;::::0;::::1;9646:21:1::0;9703:2;9683:18;;;9676:30;-1:-1:-1;;;9722:18:1;;;9715:52;9784:18;;56405:113:0::1;9462:346:1::0;56405:113:0::1;56538:22:::0;;::::1;::::0;:27;;:71:::1;;-1:-1:-1::0;56569:22:0;;::::1;::::0;56594:15:::1;-1:-1:-1::0;56538:71:0::1;56529:107;;;::::0;-1:-1:-1;;;56529:107:0;;25320:2:1;56529:107:0::1;::::0;::::1;25302:21:1::0;25359:2;25339:18;;;25332:30;-1:-1:-1;;;25378:18:1;;;25371:51;25439:18;;56529:107:0::1;25118:345:1::0;56529:107:0::1;56656:30:::0;;::::1;::::0;56690:1:::1;56656:35;56647:78;;;::::0;-1:-1:-1;;;56647:78:0;;21614:2:1;56647:78:0::1;::::0;::::1;21596:21:1::0;21653:2;21633:18;;;21626:30;21692;21672:18;;;21665:58;21740:18;;56647:78:0::1;21412:352:1::0;56647:78:0::1;56777:30:::0;;::::1;::::0;:34:::1;::::0;56808:3;;56777:34:::1;:::i;:::-;56745:27:::0;;::::1;::::0;:67:::1;;56736:112;;;::::0;-1:-1:-1;;;56736:112:0;;24608:2:1;56736:112:0::1;::::0;::::1;24590:21:1::0;24647:2;24627:18;;;24620:30;24686:32;24666:18;;;24659:60;24736:18;;56736:112:0::1;24406:354:1::0;56736:112:0::1;56861:68;56876:10;56913:3:::0;56888:7;40745:1:::1;56888:24;::::0;56861:68:::1;56942:30;56955:10;56967:3;56942:11;:30::i;:::-;57006:10;56983:34;::::0;;;:22:::1;:34;::::0;;;;:41;;57021:3;;56983:34;:41:::1;::::0;57021:3;;56983:41:::1;:::i;23612:239::-:0;23684:7;23720:16;;;:7;:16;;;;;;-1:-1:-1;;;;;23720:16:0;23755:19;23747:73;;;;-1:-1:-1;;;23747:73:0;;17953:2:1;23747:73:0;;;17935:21:1;17992:2;17972:18;;;17965:30;18031:34;18011:18;;;18004:62;-1:-1:-1;;;18082:18:1;;;18075:39;18131:19;;23747:73:0;17751:405:1;61513:1380:0;61575:29;;:::i;:::-;61616:38;;:::i;:::-;61665:29;;:::i;:::-;61734:56;61751:29;61782:6;61734:15;:56::i;:::-;:129;;;;-1:-1:-1;61795:20:0;;:25;;:67;;;61847:15;61824:20;;:38;61795:67;61730:928;;;61907:1;61880:24;;;:28;61930:33;61955:6;61930:23;:33::i;:::-;61923:40;;61730:928;;;62017:56;62034:29;62065:6;62017:15;:56::i;:::-;:129;;;;-1:-1:-1;62078:20:0;;:25;;:67;;;62130:15;62107:20;;:38;62078:67;62013:645;;;62190:1;62163:24;;;:28;62213:33;62238:6;62213:23;:33::i;62013:645::-;62296:52;62313:25;62340:6;62296:15;:52::i;:::-;:117;;;;-1:-1:-1;62353:16:0;;:21;;:59;;;62397:15;62378:16;;:34;62353:59;62292:366;;;62457:1;62430:24;;;:28;62480:29;62501:6;62480:19;:29::i;62292:366::-;62595:1;62568:24;;;:28;62618;62638:6;62618:18;:28::i;:::-;62611:35;;62292:366;62675:9;62670:83;40957:1;62688;:10;62670:83;;;62734:4;62739:1;62734:7;;;;;;;:::i;:::-;;;;;62720:8;62729:1;62720:11;;;;;;;:::i;:::-;;;;:21;62700:3;;;;:::i;:::-;;;;62670:83;;;-1:-1:-1;62794:12:0;;62765:8;41066:12;40957:1;41077;41066:12;:::i;:::-;62765:26;;;;;;;:::i;:::-;;;;:41;39795:4;62817:8;41128:12;40957:1;41139;41128:12;:::i;:::-;62817:25;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;62875:8:0;61513:1380;-1:-1:-1;;61513:1380:0:o;23342:208::-;23414:7;-1:-1:-1;;;;;23442:19:0;;23434:74;;;;-1:-1:-1;;;23434:74:0;;17542:2:1;23434:74:0;;;17524:21:1;17581:2;17561:18;;;17554:30;17620:34;17600:18;;;17593:62;-1:-1:-1;;;17671:18:1;;;17664:40;17721:19;;23434:74:0;17340:406:1;23434:74:0;-1:-1:-1;;;;;;23526:16:0;;;;;:9;:16;;;;;;;23342:208::o;4513:103::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;2751:10;4082:23;4074:68;;;;-1:-1:-1;;;4074:68:0;;;;;;;:::i;:::-;4578:30:::1;4605:1;4578:18;:30::i;:::-;4513:103::o:0;58000:118::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;42763:10;:21;;:48;;-1:-1:-1;46097:8:0;;-1:-1:-1;;;;;46097:8:0;42788:10;:23;42763:48;42754:102;;;;-1:-1:-1;;;42754:102:0;;;;;;;:::i;:::-;58080:23:::1;:30:::0;;-1:-1:-1;;58080:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;58000:118::o;24087:104::-;24143:13;24176:7;24169:14;;;;;:::i;47158:116::-;47211:13;47245:19;47237:29;;;;;:::i;25771:155::-;25866:52;2751:10;25899:8;25909;25866:18;:52::i;:::-;25771:155;;:::o;53347:903::-;37807:1;38405:7;;:19;;38397:63;;;;-1:-1:-1;;;38397:63:0;;;;;;;:::i;:::-;37807:1;38538:7;:18;53433:32:::1;53468:37;53493:10;53468:23;:37::i;:::-;53527:28:::0;;53433:72;;-1:-1:-1;53527:33:0;53518:74:::1;;;::::0;-1:-1:-1;;;53518:74:0;;23078:2:1;53518:74:0::1;::::0;::::1;23060:21:1::0;23117:2;23097:18;;;23090:30;23156:28;23136:18;;;23129:56;23202:18;;53518:74:0::1;22876:350:1::0;53518:74:0::1;53612:24;::::0;::::1;::::0;:29;;:76:::1;;-1:-1:-1::0;53645:24:0::1;::::0;::::1;::::0;53673:15:::1;-1:-1:-1::0;53645:43:0::1;53612:76;53603:117;;;::::0;-1:-1:-1;;;53603:117:0;;20909:2:1;53603:117:0::1;::::0;::::1;20891:21:1::0;20948:2;20928:18;;;20921:30;20987:28;20967:18;;;20960:56;21033:18;;53603:117:0::1;20707:350:1::0;53603:117:0::1;53740:22:::0;;::::1;::::0;:27;;:71:::1;;-1:-1:-1::0;53771:22:0;;::::1;::::0;53796:15:::1;-1:-1:-1::0;53740:71:0::1;53731:111;;;::::0;-1:-1:-1;;;53731:111:0;;17188:2:1;53731:111:0::1;::::0;::::1;17170:21:1::0;17227:2;17207:18;;;17200:30;17266:27;17246:18;;;17239:55;17311:18;;53731:111:0::1;16986:349:1::0;53731:111:0::1;53862:30:::0;;::::1;::::0;53896:1:::1;53862:35;53853:82;;;::::0;-1:-1:-1;;;53853:82:0;;10015:2:1;53853:82:0::1;::::0;::::1;9997:21:1::0;;;10034:18;;;10027:30;10093:34;10073:18;;;10066:62;10145:18;;53853:82:0::1;9813:356:1::0;53853:82:0::1;53987:30:::0;;::::1;::::0;:34:::1;::::0;54018:3;;53987:34:::1;:::i;:::-;53955:27:::0;;::::1;::::0;:67:::1;;53946:116;;;::::0;-1:-1:-1;;;53946:116:0;;15647:2:1;53946:116:0::1;::::0;::::1;15629:21:1::0;15686:2;15666:18;;;15659:30;15725:34;15705:18;;;15698:62;-1:-1:-1;;;15776:18:1;;;15769:32;15818:19;;53946:116:0::1;15445:398:1::0;53946:116:0::1;54075:68;54090:10;54127:3:::0;54102:7;40745:1:::1;54102:24;::::0;54075:68:::1;54156:30;54169:10;54181:3;54156:11;:30::i;:::-;54224:10;54197:38;::::0;;;:26:::1;:38;::::0;;;;:45;;54239:3;;54197:38;:45:::1;::::0;54239:3;;54197:45:::1;:::i;46862:122::-:0;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;42763:10;:21;;:48;;-1:-1:-1;46097:8:0;;-1:-1:-1;;;;;46097:8:0;42788:10;:23;42763:48;42754:102;;;;-1:-1:-1;;;42754:102:0;;;;;;;:::i;:::-;46953:23:::1;:17;46973:3:::0;;46953:23:::1;:::i;26894:328::-:0;27069:41;2751:10;27102:7;27069:18;:41::i;:::-;27061:103;;;;-1:-1:-1;;;27061:103:0;;;;;;;:::i;:::-;27175:39;27189:4;27195:2;27199:7;27208:5;27175:13;:39::i;:::-;26894:328;;;;:::o;55628:351::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;42763:10;:21;;:48;;-1:-1:-1;46097:8:0;;-1:-1:-1;;;;;46097:8:0;42788:10;:23;42763:48;42754:102;;;;-1:-1:-1;;;42754:102:0;;;;;;;:::i;:::-;55729:32:::1;55736:25;;55729:32;:::i;:::-;55779:9;55774:198;55792:14:::0;;::::1;55774:198;;;55857:1;55837:5:::0;;55843:1;55837:8;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;55837:22:0::1;;;55828:63;;;::::0;-1:-1:-1;;;55828:63:0;;16475:2:1;55828:63:0::1;::::0;::::1;16457:21:1::0;16514:2;16494:18;;;16487:30;16553:27;16533:18;;;16526:55;16598:18;;55828:63:0::1;16273:349:1::0;55828:63:0::1;55906:25;55949:5;;55955:1;55949:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;55906:54:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;55906:54:0;;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;;55906:54:0::1;-1:-1:-1::0;;;;;55906:54:0;;::::1;::::0;;;::::1;::::0;;55808:3;::::1;::::0;::::1;:::i;:::-;;;;55774:198;;48030:432:::0;28797:4;28821:16;;;:7;:16;;;;;;48097:13;;-1:-1:-1;;;;;28821:16:0;48123:50;;;;-1:-1:-1;;;48123:50:0;;19495:2:1;48123:50:0;;;19477:21:1;19534:2;19514:18;;;19507:30;-1:-1:-1;;;19553:18:1;;;19546:47;19610:18;;48123:50:0;19293:341:1;48123:50:0;48226:1;48196:19;48190:33;;;;;:::i;:::-;;;:37;48186:170;;;48278:19;48299:27;48317:7;48299:16;:27::i;:::-;48260:68;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48244:88;;48030:432;;;:::o;48186:170::-;48402:17;48421:27;48439:7;48421:16;:27::i;61045:301::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;42763:10;:21;;:48;;-1:-1:-1;46097:8:0;;-1:-1:-1;;;;;46097:8:0;42788:10;:23;42763:48;42754:102;;;;-1:-1:-1;;;42754:102:0;;;;;;;:::i;:::-;39848:3:::1;61145;61132:12;;:16;;;;:::i;:::-;61131:36;;61122:81;;;::::0;-1:-1:-1;;;61122:81:0;;16829:2:1;61122:81:0::1;::::0;::::1;16811:21:1::0;16868:2;16848:18;;;16841:30;16907:32;16887:18;;;16880:60;16957:18;;61122:81:0::1;16627:354:1::0;61122:81:0::1;61221:9;61216:93;61236:3;61234:1;:5;61216:93;;;61261:36;61268:7;3908::::0;3935:6;-1:-1:-1;;;;;3935:6:0;;3862:87;61268:7:::1;61291:3;:1:::0;61293::::1;61291:3;:::i;:::-;61277:12;;:18;;;;:::i;:::-;61261:5;:36::i;:::-;61241:3:::0;::::1;::::0;::::1;:::i;:::-;;;;61216:93;;;;61335:3;61319:12;;:19;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;61045:301:0:o;46291:93::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;2751:10;4082:23;4074:68;;;;-1:-1:-1;;;4074:68:0;;;;;;;:::i;:::-;46359:8:::1;:17:::0;;-1:-1:-1;;;;;;46359:17:0::1;-1:-1:-1::0;;;;;46359:17:0;;;::::1;::::0;;;::::1;::::0;;46291:93::o;49540:128::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;42763:10;:21;;:48;;-1:-1:-1;46097:8:0;;-1:-1:-1;;;;;46097:8:0;42788:10;:23;42763:48;42754:102;;;;-1:-1:-1;;;42754:102:0;;;;;;;:::i;:::-;49625:28:::1;:35:::0;;-1:-1:-1;;49625:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;49540:128::o;51535:681::-;51607:24;;:::i;:::-;51644:31;;:::i;:::-;51692:28;;;;51688:70;;;51754:1;51724:31;;51688:70;51794:22;;51768:23;;;:48;51851:20;;51827:21;;;:44;40106:17;51882:23;;;:47;51944:55;51961:29;51992:6;51944:15;:55::i;:::-;51940:99;;;52035:1;52003:29;;;:33;51940:99;40196:1;52049:26;;;:53;-1:-1:-1;;;;;52145:34:0;;;;;;:26;52049;52145:34;;;;;52049:6;40913:1;52113:29;;52434:128;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;42763:10;:21;;:48;;-1:-1:-1;46097:8:0;;-1:-1:-1;;;;;46097:8:0;42788:10;:23;42763:48;42754:102;;;;-1:-1:-1;;;42754:102:0;;;;;;;:::i;:::-;52519:28:::1;:35:::0;;-1:-1:-1;;52519:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;52434:128::o;25997:164::-;-1:-1:-1;;;;;26118:25:0;;;26094:4;26118:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25997:164::o;4771:201::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;2751:10;4082:23;4074:68;;;;-1:-1:-1;;;4074:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4860:22:0;::::1;4852:73;;;::::0;-1:-1:-1;;;4852:73:0;;11150:2:1;4852:73:0::1;::::0;::::1;11132:21:1::0;11189:2;11169:18;;;11162:30;11228:34;11208:18;;;11201:62;-1:-1:-1;;;11279:18:1;;;11272:36;11325:19;;4852:73:0::1;10948:402:1::0;4852:73:0::1;4936:28;4955:8;4936:18;:28::i;:::-;4771:201:::0;:::o;55288:120::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;42763:10;:21;;:48;;-1:-1:-1;46097:8:0;;-1:-1:-1;;;;;46097:8:0;42788:10;:23;42763:48;42754:102;;;;-1:-1:-1;;;42754:102:0;;;;;;;:::i;:::-;55369:24:::1;:31:::0;;-1:-1:-1;;55369:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;55288:120::o;54425:649::-;54493:24;;:::i;:::-;54530:31;;:::i;:::-;54578:24;;;;54574:66;;;54636:1;54606:31;;54574:66;54676:18;;54650:23;;;:44;54729:16;;54705:21;;;:40;40271:17;54756:23;;;:43;54814:51;54831:25;54858:6;54814:15;:51::i;:::-;54810:95;;;54901:1;54869:29;;;:33;54810:95;40361:1;54915:26;;;:49;-1:-1:-1;;;;;55007:30:0;;;;;;:22;54915:26;55007:30;;;;;54915:6;40913:1;54975:29;;32878:174;32953:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32953:29:0;-1:-1:-1;;;;;32953:29:0;;;;;;;;:24;;33007:23;32953:24;33007:14;:23::i;:::-;-1:-1:-1;;;;;32998:46:0;;;;;;;;;;;32878:174;;:::o;29026:348::-;29119:4;28821:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28821:16:0;29136:73;;;;-1:-1:-1;;;29136:73:0;;15234:2:1;29136:73:0;;;15216:21:1;15273:2;15253:18;;;15246:30;15312:34;15292:18;;;15285:62;-1:-1:-1;;;15363:18:1;;;15356:42;15415:19;;29136:73:0;15032:408:1;29136:73:0;29220:13;29236:23;29251:7;29236:14;:23::i;:::-;29220:39;;29289:5;-1:-1:-1;;;;;29278:16:0;:7;-1:-1:-1;;;;;29278:16:0;;:52;;;;29298:32;29315:5;29322:7;29298:16;:32::i;:::-;29278:87;;;;29358:7;-1:-1:-1;;;;;29334:31:0;:20;29346:7;29334:11;:20::i;:::-;-1:-1:-1;;;;;29334:31:0;;29278:87;29270:96;29026:348;-1:-1:-1;;;;29026:348:0:o;32135:625::-;32294:4;-1:-1:-1;;;;;32267:31:0;:23;32282:7;32267:14;:23::i;:::-;-1:-1:-1;;;;;32267:31:0;;32259:81;;;;-1:-1:-1;;;32259:81:0;;11557:2:1;32259:81:0;;;11539:21:1;11596:2;11576:18;;;11569:30;11635:34;11615:18;;;11608:62;-1:-1:-1;;;11686:18:1;;;11679:35;11731:19;;32259:81:0;11355:401:1;32259:81:0;-1:-1:-1;;;;;32359:16:0;;32351:65;;;;-1:-1:-1;;;32351:65:0;;13382:2:1;32351:65:0;;;13364:21:1;13421:2;13401:18;;;13394:30;13460:34;13440:18;;;13433:62;-1:-1:-1;;;13511:18:1;;;13504:34;13555:19;;32351:65:0;13180:400:1;32351:65:0;32533:29;32550:1;32554:7;32533:8;:29::i;:::-;-1:-1:-1;;;;;32575:15:0;;;;;;:9;:15;;;;;:20;;32594:1;;32575:15;:20;;32594:1;;32575:20;:::i;:::-;;;;-1:-1:-1;;;;;;;32606:13:0;;;;;;:9;:13;;;;;:18;;32623:1;;32606:13;:18;;32623:1;;32606:18;:::i;:::-;;;;-1:-1:-1;;32635:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32635:21:0;-1:-1:-1;;;;;32635:21:0;;;;;;;;;32674:27;;32635:16;;32674:27;;;;;;;25071:341;25001:411;;:::o;59900:381::-;60014:7;60005:5;:16;;59996:49;;;;-1:-1:-1;;;59996:49:0;;13035:2:1;59996:49:0;;;13017:21:1;13074:2;13054:18;;;13047:30;-1:-1:-1;;;13093:18:1;;;13086:48;13151:18;;59996:49:0;12833:342:1;59996:49:0;60106:7;60098:5;:15;60094:180;;;60130:14;60147:15;60157:5;60147:7;:15;:::i;:::-;60237:25;;60130:32;;-1:-1:-1;60211:9:0;;-1:-1:-1;;;;;60237:15:0;;;:25;;;;;60130:32;;60177:22;60237:25;60177:22;60237:25;60130:32;60237:15;:25;;;;;;;;;;;;;;;;;;;;;60115:159;;59900:381;;;:::o;60448:409::-;-1:-1:-1;;;;;60525:16:0;;60516:41;;;;-1:-1:-1;;;60516:41:0;;14895:2:1;60516:41:0;;;14877:21:1;14934:2;14914:18;;;14907:30;-1:-1:-1;;;14953:18:1;;;14946:40;15003:18;;60516:41:0;14693:334:1;60516:41:0;39848:3;60577:12;;:30;;60568:69;;;;-1:-1:-1;;;60568:69:0;;24967:2:1;60568:69:0;;;24949:21:1;25006:2;24986:18;;;24979:30;25045:26;25025:18;;;25018:54;25089:18;;60568:69:0;24765:348:1;60568:69:0;39795:4;60671:3;60658:12;;:16;;;;:::i;:::-;60657:31;;60648:71;;;;-1:-1:-1;;;60648:71:0;;9310:2:1;60648:71:0;;;9292:21:1;9349:2;9329:18;;;9322:30;9388:27;9368:18;;;9361:55;9433:18;;60648:71:0;9108:349:1;60648:71:0;60737:9;60732:88;60752:3;60750:1;:5;60732:88;;;60777:31;60784:2;60802:3;:1;60804;60802:3;:::i;60777:31::-;60757:3;;;;:::i;:::-;;;;60732:88;;;;60846:3;60830:12;;:19;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;60448:409:0:o;59436:295::-;59530:4;;59547:141;59567:12;;59565:14;;59547:141;;;59605:5;59611:1;59605:8;;;;;;;;:::i;:::-;;;;;;;;;;;:22;;-1:-1:-1;;;59605:22:0;;-1:-1:-1;;;;;7153:32:1;;;59605:22:0;;;7135:51:1;59605:8:0;;;;:14;;7108:18:1;;59605:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59601:76;;;59656:4;59648:13;;;;;59601:76;59581:3;;;;:::i;:::-;;;;59547:141;;;-1:-1:-1;59708:5:0;;59436:295;-1:-1:-1;;;59436:295:0:o;5132:191::-;5206:16;5225:6;;-1:-1:-1;;;;;5242:17:0;;;-1:-1:-1;;;;;;5242:17:0;;;;;;5275:40;;5225:6;;;;;;;5275:40;;5206:16;5275:40;5195:128;5132:191;:::o;33194:315::-;33349:8;-1:-1:-1;;;;;33340:17:0;:5;-1:-1:-1;;;;;33340:17:0;;;33332:55;;;;-1:-1:-1;;;33332:55:0;;13787:2:1;33332:55:0;;;13769:21:1;13826:2;13806:18;;;13799:30;13865:27;13845:18;;;13838:55;13910:18;;33332:55:0;13585:349:1;33332:55:0;-1:-1:-1;;;;;33398:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;33398:46:0;;;;;;;;;;33460:41;;8832::1;;;33460::0;;8805:18:1;33460:41:0;;;;;;;33194:315;;;:::o;28104:::-;28261:28;28271:4;28277:2;28281:7;28261:9;:28::i;:::-;28308:48;28331:4;28337:2;28341:7;28350:5;28308:22;:48::i;:::-;28300:111;;;;-1:-1:-1;;;28300:111:0;;;;;;;:::i;335:723::-;391:13;612:10;608:53;;-1:-1:-1;;639:10:0;;;;;;;;;;;;-1:-1:-1;;;639:10:0;;;;;335:723::o;608:53::-;686:5;671:12;727:78;734:9;;727:78;;760:8;;;;:::i;:::-;;-1:-1:-1;783:10:0;;-1:-1:-1;791:2:0;783:10;;:::i;:::-;;;727:78;;;815:19;847:6;837:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;837:17:0;;815:39;;865:154;872:10;;865:154;;899:11;909:1;899:11;;:::i;:::-;;-1:-1:-1;968:10:0;976:2;968:5;:10;:::i;:::-;955:24;;:2;:24;:::i;:::-;942:39;;925:6;932;925:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;925:56:0;;;;;;;;-1:-1:-1;996:11:0;1005:2;996:11;;:::i;:::-;;;865:154;;30710:439;-1:-1:-1;;;;;30790:16:0;;30782:61;;;;-1:-1:-1;;;30782:61:0;;18721:2:1;30782:61:0;;;18703:21:1;;;18740:18;;;18733:30;18799:34;18779:18;;;18772:62;18851:18;;30782:61:0;18519:356:1;30782:61:0;28797:4;28821:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28821:16:0;:30;30854:58;;;;-1:-1:-1;;;30854:58:0;;12324:2:1;30854:58:0;;;12306:21:1;12363:2;12343:18;;;12336:30;12402;12382:18;;;12375:58;12450:18;;30854:58:0;12122:352:1;30854:58:0;-1:-1:-1;;;;;30983:13:0;;;;;;:9;:13;;;;;:18;;31000:1;;30983:13;:18;;31000:1;;30983:18;:::i;:::-;;;;-1:-1:-1;;31012:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31012:21:0;-1:-1:-1;;;;;31012:21:0;;;;;;;;31051:33;;31012:16;;;31051:33;;31012:16;;31051:33;25771:155;;:::o;34074:799::-;34229:4;-1:-1:-1;;;;;34250:13:0;;13853:19;:23;34246:620;;34286:72;;-1:-1:-1;;;34286:72:0;;-1:-1:-1;;;;;34286:36:0;;;;;:72;;2751:10;;34337:4;;34343:7;;34352:5;;34286:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34286:72:0;;;;;;;;-1:-1:-1;;34286:72:0;;;;;;;;;;;;:::i;:::-;;;34282:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34528:13:0;;34524:272;;34571:60;;-1:-1:-1;;;34571:60:0;;;;;;;:::i;34524:272::-;34746:6;34740:13;34731:6;34727:2;34723:15;34716:38;34282:529;-1:-1:-1;;;;;;34409:51:0;-1:-1:-1;;;34409:51:0;;-1:-1:-1;34402:58:0;;34246:620;-1:-1:-1;34850:4:0;34074:799;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;:::-;333:39;192:186;-1:-1:-1;;;192:186:1:o;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:52;;;528:1;525;518:12;480:52;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;383:260;;;;;:::o;648:328::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:52;;;810:1;807;800:12;762:52;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;966:2;955:9;951:18;938:32;928:42;;648:328;;;;;:::o;981:1138::-;1076:6;1084;1092;1100;1153:3;1141:9;1132:7;1128:23;1124:33;1121:53;;;1170:1;1167;1160:12;1121:53;1193:29;1212:9;1193:29;:::i;:::-;1183:39;;1241:38;1275:2;1264:9;1260:18;1241:38;:::i;:::-;1231:48;;1326:2;1315:9;1311:18;1298:32;1288:42;;1381:2;1370:9;1366:18;1353:32;1404:18;1445:2;1437:6;1434:14;1431:34;;;1461:1;1458;1451:12;1431:34;1499:6;1488:9;1484:22;1474:32;;1544:7;1537:4;1533:2;1529:13;1525:27;1515:55;;1566:1;1563;1556:12;1515:55;1602:2;1589:16;1624:2;1620;1617:10;1614:36;;;1630:18;;:::i;:::-;1705:2;1699:9;1673:2;1759:13;;-1:-1:-1;;1755:22:1;;;1779:2;1751:31;1747:40;1735:53;;;1803:18;;;1823:22;;;1800:46;1797:72;;;1849:18;;:::i;:::-;1889:10;1885:2;1878:22;1924:2;1916:6;1909:18;1964:7;1959:2;1954;1950;1946:11;1942:20;1939:33;1936:53;;;1985:1;1982;1975:12;1936:53;2041:2;2036;2032;2028:11;2023:2;2015:6;2011:15;1998:46;2086:1;2081:2;2076;2068:6;2064:15;2060:24;2053:35;2107:6;2097:16;;;;;;;981:1138;;;;;;;:::o;2124:315::-;2189:6;2197;2250:2;2238:9;2229:7;2225:23;2221:32;2218:52;;;2266:1;2263;2256:12;2218:52;2289:29;2308:9;2289:29;:::i;:::-;2279:39;;2368:2;2357:9;2353:18;2340:32;2381:28;2403:5;2381:28;:::i;:::-;2428:5;2418:15;;;2124:315;;;;;:::o;2444:254::-;2512:6;2520;2573:2;2561:9;2552:7;2548:23;2544:32;2541:52;;;2589:1;2586;2579:12;2541:52;2612:29;2631:9;2612:29;:::i;:::-;2602:39;2688:2;2673:18;;;;2660:32;;-1:-1:-1;;;2444:254:1:o;2703:615::-;2789:6;2797;2850:2;2838:9;2829:7;2825:23;2821:32;2818:52;;;2866:1;2863;2856:12;2818:52;2906:9;2893:23;2935:18;2976:2;2968:6;2965:14;2962:34;;;2992:1;2989;2982:12;2962:34;3030:6;3019:9;3015:22;3005:32;;3075:7;3068:4;3064:2;3060:13;3056:27;3046:55;;3097:1;3094;3087:12;3046:55;3137:2;3124:16;3163:2;3155:6;3152:14;3149:34;;;3179:1;3176;3169:12;3149:34;3232:7;3227:2;3217:6;3214:1;3210:14;3206:2;3202:23;3198:32;3195:45;3192:65;;;3253:1;3250;3243:12;3192:65;3284:2;3276:11;;;;;3306:6;;-1:-1:-1;2703:615:1;;-1:-1:-1;;;;2703:615:1:o;3323:241::-;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:28;3528:5;3506:28;:::i;3569:245::-;3636:6;3689:2;3677:9;3668:7;3664:23;3660:32;3657:52;;;3705:1;3702;3695:12;3657:52;3737:9;3731:16;3756:28;3778:5;3756:28;:::i;3819:245::-;3877:6;3930:2;3918:9;3909:7;3905:23;3901:32;3898:52;;;3946:1;3943;3936:12;3898:52;3985:9;3972:23;4004:30;4028:5;4004:30;:::i;4069:249::-;4138:6;4191:2;4179:9;4170:7;4166:23;4162:32;4159:52;;;4207:1;4204;4197:12;4159:52;4239:9;4233:16;4258:30;4282:5;4258:30;:::i;4323:592::-;4394:6;4402;4455:2;4443:9;4434:7;4430:23;4426:32;4423:52;;;4471:1;4468;4461:12;4423:52;4511:9;4498:23;4540:18;4581:2;4573:6;4570:14;4567:34;;;4597:1;4594;4587:12;4567:34;4635:6;4624:9;4620:22;4610:32;;4680:7;4673:4;4669:2;4665:13;4661:27;4651:55;;4702:1;4699;4692:12;4651:55;4742:2;4729:16;4768:2;4760:6;4757:14;4754:34;;;4784:1;4781;4774:12;4754:34;4829:7;4824:2;4815:6;4811:2;4807:15;4803:24;4800:37;4797:57;;;4850:1;4847;4840:12;4920:180;4979:6;5032:2;5020:9;5011:7;5007:23;5003:32;5000:52;;;5048:1;5045;5038:12;5000:52;-1:-1:-1;5071:23:1;;4920:180;-1:-1:-1;4920:180:1:o;5105:248::-;5173:6;5181;5234:2;5222:9;5213:7;5209:23;5205:32;5202:52;;;5250:1;5247;5240:12;5202:52;-1:-1:-1;;5273:23:1;;;5343:2;5328:18;;;5315:32;;-1:-1:-1;5105:248:1:o;5358:257::-;5399:3;5437:5;5431:12;5464:6;5459:3;5452:19;5480:63;5536:6;5529:4;5524:3;5520:14;5513:4;5506:5;5502:16;5480:63;:::i;:::-;5597:2;5576:15;-1:-1:-1;;5572:29:1;5563:39;;;;5604:4;5559:50;;5358:257;-1:-1:-1;;5358:257:1:o;5620:185::-;5662:3;5700:5;5694:12;5715:52;5760:6;5755:3;5748:4;5741:5;5737:16;5715:52;:::i;:::-;5783:16;;;;;5620:185;-1:-1:-1;;5620:185:1:o;5810:1174::-;5986:3;6015:1;6048:6;6042:13;6078:3;6100:1;6128:9;6124:2;6120:18;6110:28;;6188:2;6177:9;6173:18;6210;6200:61;;6254:4;6246:6;6242:17;6232:27;;6200:61;6280:2;6328;6320:6;6317:14;6297:18;6294:38;6291:165;;;-1:-1:-1;;;6355:33:1;;6411:4;6408:1;6401:15;6441:4;6362:3;6429:17;6291:165;6472:18;6499:104;;;;6617:1;6612:320;;;;6465:467;;6499:104;-1:-1:-1;;6532:24:1;;6520:37;;6577:16;;;;-1:-1:-1;6499:104:1;;6612:320;26441:1;26434:14;;;26478:4;26465:18;;6707:1;6721:165;6735:6;6732:1;6729:13;6721:165;;;6813:14;;6800:11;;;6793:35;6856:16;;;;6750:10;;6721:165;;;6725:3;;6915:6;6910:3;6906:16;6899:23;;6465:467;;;;;;;6948:30;6974:3;6966:6;6948:30;:::i;:::-;6941:37;5810:1174;-1:-1:-1;;;;;5810:1174:1:o;7197:488::-;-1:-1:-1;;;;;7466:15:1;;;7448:34;;7518:15;;7513:2;7498:18;;7491:43;7565:2;7550:18;;7543:34;;;7613:3;7608:2;7593:18;;7586:31;;;7391:4;;7634:45;;7659:19;;7651:6;7634:45;:::i;:::-;7626:53;7197:488;-1:-1:-1;;;;;;7197:488:1:o;7690:497::-;7872:3;7857:19;;7861:9;7953:6;7830:4;7987:194;8001:4;7998:1;7995:11;7987:194;;;8060:13;;8048:26;;8097:4;8121:12;;;;8156:15;;;;8021:1;8014:9;7987:194;;;7991:3;;;7690:497;;;;:::o;8192:495::-;8372:3;8357:19;;8361:9;8453:6;8330:4;8487:194;8501:4;8498:1;8495:11;8487:194;;;8560:13;;8548:26;;8597:4;8621:12;;;;8656:15;;;;8521:1;8514:9;8487:194;;8884:219;9033:2;9022:9;9015:21;8996:4;9053:44;9093:2;9082:9;9078:18;9070:6;9053:44;:::i;10529:414::-;10731:2;10713:21;;;10770:2;10750:18;;;10743:30;10809:34;10804:2;10789:18;;10782:62;-1:-1:-1;;;10875:2:1;10860:18;;10853:48;10933:3;10918:19;;10529:414::o;19639:356::-;19841:2;19823:21;;;19860:18;;;19853:30;19919:34;19914:2;19899:18;;19892:62;19986:2;19971:18;;19639:356::o;23231:413::-;23433:2;23415:21;;;23472:2;23452:18;;;23445:30;23511:34;23506:2;23491:18;;23484:62;-1:-1:-1;;;23577:2:1;23562:18;;23555:47;23634:3;23619:19;;23231:413::o;23649:403::-;23851:2;23833:21;;;23890:2;23870:18;;;23863:30;23929:34;23924:2;23909:18;;23902:62;-1:-1:-1;;;23995:2:1;23980:18;;23973:37;24042:3;24027:19;;23649:403::o;25826:355::-;26028:2;26010:21;;;26067:2;26047:18;;;26040:30;26106:33;26101:2;26086:18;;26079:61;26172:2;26157:18;;25826:355::o;26494:128::-;26534:3;26565:1;26561:6;26558:1;26555:13;26552:39;;;26571:18;;:::i;:::-;-1:-1:-1;26607:9:1;;26494:128::o;26627:120::-;26667:1;26693;26683:35;;26698:18;;:::i;:::-;-1:-1:-1;26732:9:1;;26627:120::o;26752:168::-;26792:7;26858:1;26854;26850:6;26846:14;26843:1;26840:21;26835:1;26828:9;26821:17;26817:45;26814:71;;;26865:18;;:::i;:::-;-1:-1:-1;26905:9:1;;26752:168::o;26925:125::-;26965:4;26993:1;26990;26987:8;26984:34;;;26998:18;;:::i;:::-;-1:-1:-1;27035:9:1;;26925:125::o;27055:258::-;27127:1;27137:113;27151:6;27148:1;27145:13;27137:113;;;27227:11;;;27221:18;27208:11;;;27201:39;27173:2;27166:10;27137:113;;;27268:6;27265:1;27262:13;27259:48;;;-1:-1:-1;;27303:1:1;27285:16;;27278:27;27055:258::o;27318:380::-;27397:1;27393:12;;;;27440;;;27461:61;;27515:4;27507:6;27503:17;27493:27;;27461:61;27568:2;27560:6;27557:14;27537:18;27534:38;27531:161;;;27614:10;27609:3;27605:20;27602:1;27595:31;27649:4;27646:1;27639:15;27677:4;27674:1;27667:15;27531:161;;27318:380;;;:::o;27703:135::-;27742:3;-1:-1:-1;;27763:17:1;;27760:43;;;27783:18;;:::i;:::-;-1:-1:-1;27830:1:1;27819:13;;27703:135::o;27843:112::-;27875:1;27901;27891:35;;27906:18;;:::i;:::-;-1:-1:-1;27940:9:1;;27843:112::o;27960:127::-;28021:10;28016:3;28012:20;28009:1;28002:31;28052:4;28049:1;28042:15;28076:4;28073:1;28066:15;28092:127;28153:10;28148:3;28144:20;28141:1;28134:31;28184:4;28181:1;28174:15;28208:4;28205:1;28198:15;28224:127;28285:10;28280:3;28276:20;28273:1;28266:31;28316:4;28313:1;28306:15;28340:4;28337:1;28330:15;28356:127;28417:10;28412:3;28408:20;28405:1;28398:31;28448:4;28445:1;28438:15;28472:4;28469:1;28462:15;28488:118;28574:5;28567:13;28560:21;28553:5;28550:32;28540:60;;28596:1;28593;28586:12;28611:131;-1:-1:-1;;;;;;28685:32:1;;28675:43;;28665:71;;28732:1;28729;28722:12

Swarm Source

ipfs://a29e41f7c5e30596474dfcc55fd6fe1914ef83da1c44c7ef38aa0b966530843f
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.