ETH Price: $3,118.22 (+0.65%)
Gas: 6 Gwei

Token

 

Overview

Max Total Supply

1,078

Holders

684

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0xf8882addba14559b698ffc823e471ae53bcc79ec
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:
Holiday_8sian_CNY

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-02-01
*/

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


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

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;


/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
        @dev Handles the receipt of a single ERC1155 token type. This function is
        called at the end of a `safeTransferFrom` after the balance has been updated.
        To accept the transfer, this must return
        `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
        (i.e. 0xf23a6e61, or its own function selector).
        @param operator The address which initiated the transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param id The ID of the token being transferred
        @param value The amount of tokens being transferred
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
    */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
        @dev Handles the receipt of a multiple ERC1155 token types. This function
        is called at the end of a `safeBatchTransferFrom` after the balances have
        been updated. To accept the transfer(s), this must return
        `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
        (i.e. 0xbc197c81, or its own function selector).
        @param operator The address which initiated the batch transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param ids An array containing ids of each token being transferred (order and length must match values array)
        @param values An array containing amounts of each token being transferred (order and length must match ids array)
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
    */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

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


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;







/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: balance query for the zero address");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

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

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);
    }

    /**
     * @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, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Supply.sol)

pragma solidity ^0.8.0;


/**
 * @dev Extension of ERC1155 that adds tracking of total supply per id.
 *
 * Useful for scenarios where Fungible and Non-fungible tokens have to be
 * clearly identified. Note: While a totalSupply of 1 might mean the
 * corresponding is an NFT, there is no guarantees that no other token with the
 * same id are not going to be minted.
 */
abstract contract ERC1155Supply is ERC1155 {
    mapping(uint256 => uint256) private _totalSupply;

    /**
     * @dev Total amount of tokens in with a given id.
     */
    function totalSupply(uint256 id) public view virtual returns (uint256) {
        return _totalSupply[id];
    }

    /**
     * @dev Indicates whether any token exist with a given id, or not.
     */
    function exists(uint256 id) public view virtual returns (bool) {
        return ERC1155Supply.totalSupply(id) > 0;
    }

    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        if (from == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] += amounts[i];
            }
        }

        if (to == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] -= amounts[i];
            }
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;


/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

// File: Holiday_8sian_CNY.sol


/*
 ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄        ▄ 
▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░▌      ▐░▌
▐░█▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀▀▀  ▀▀▀▀█░█▀▀▀▀ ▐░█▀▀▀▀▀▀▀█░▌▐░▌░▌     ▐░▌
▐░▌       ▐░▌▐░▌               ▐░▌     ▐░▌       ▐░▌▐░▌▐░▌    ▐░▌
▐░█▄▄▄▄▄▄▄█░▌▐░█▄▄▄▄▄▄▄▄▄      ▐░▌     ▐░█▄▄▄▄▄▄▄█░▌▐░▌ ▐░▌   ▐░▌
 ▐░░░░░░░░░▌ ▐░░░░░░░░░░░▌     ▐░▌     ▐░░░░░░░░░░░▌▐░▌  ▐░▌  ▐░▌
▐░█▀▀▀▀▀▀▀█░▌ ▀▀▀▀▀▀▀▀▀█░▌     ▐░▌     ▐░█▀▀▀▀▀▀▀█░▌▐░▌   ▐░▌ ▐░▌
▐░▌       ▐░▌          ▐░▌     ▐░▌     ▐░▌       ▐░▌▐░▌    ▐░▌▐░▌
▐░█▄▄▄▄▄▄▄█░▌ ▄▄▄▄▄▄▄▄▄█░▌ ▄▄▄▄█░█▄▄▄▄ ▐░▌       ▐░▌▐░▌     ▐░▐░▌
▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░▌       ▐░▌▐░▌      ▐░░▌
 ▀▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀▀  ▀         ▀  ▀        ▀▀ 
                        By zensein#5412 
*/

pragma solidity ^0.8.0;





contract Holiday_8sian_CNY is ERC1155Supply, Ownable {
    using Strings for uint256;
    using ECDSA for bytes32;

    uint256 public immutable MAX_TOKENS = 888;
    uint256 private _currentTokenID = 3;
    uint256 public MAX_PER_TX = 3;
    uint256 public PUBLIC_SALE_PRICE = 0.05 ether;

    string private constant SIG_WORD = "8SIAN_CNY";
    address private SIGNER_ADDRESS = 0x3f22e08Ca09BF365F9Fe3aD69fA4f213444E1062;

    mapping(uint32 => mapping(address => bool)) public buyersList;
    mapping(uint32 => uint256[]) public seasonTokens;
    mapping(uint256 => bool) private nonceList;

    uint32 public currentSeason = 1;
    bool public privateLive;
    bool public publicLive;

    constructor()
        ERC1155(
            "https://gateway.pinata.cloud/ipfs/QmSU8Q9avtMbqMQTQecV6QGoSTik53c3MX4U32ehq6RUk9/{id}.json"
        )
    {}

    function matchAddresSigner(bytes memory signature, uint256 _nonce)
        private
        view
        returns (bool)
    {
        bytes32 hash = keccak256(
            abi.encodePacked(
                "\x19Ethereum Signed Message:\n32",
                keccak256(abi.encodePacked(msg.sender, SIG_WORD, _nonce))
            )
        );
        return SIGNER_ADDRESS == hash.recover(signature);
    }

    function togglePrivateSaleStatus() external onlyOwner {
        privateLive = !privateLive;
    }

    function togglePublicSaleStatus() external onlyOwner {
        publicLive = !publicLive;
    }

    function setPrice(uint256 price) external onlyOwner {
        PUBLIC_SALE_PRICE = price;
    }

    function addSeasonTokens(uint256 amount, bool newSeason)
        external
        onlyOwner
    {
        if (newSeason) {
            currentSeason = currentSeason + 1;
            for (uint256 i = 0; i < amount; i++) {
                seasonTokens[currentSeason].push(_currentTokenID + i);
            }
        }
        _currentTokenID = _currentTokenID + amount;
    }

    function changeSeason(uint32 season) external onlyOwner {
        currentSeason = season;
    }

    function privateMint(bytes memory signature, uint256 id) external {
        require(privateLive, "PRIVATE_SALE_IS_NOT_ACTIVE");
        require(id < _currentTokenID, "ID_DOES_NOT_EXIST");
        require(totalSupply(id) < MAX_TOKENS, "EXCEED_MAX_TOKENS");
        require(
            matchAddresSigner(signature, currentSeason),
            "DIRECT_MINT_DISALLOWED"
        );
        require(!buyersList[currentSeason][msg.sender], "ALREADY_MINTED");

        buyersList[currentSeason][msg.sender] = true;
        _mint(msg.sender, id, 1, "");
    }

    function publicMint(
        bytes memory signature,
        uint256[] calldata ids,
        uint256[] calldata amount,
        uint256 _nonce
    ) external payable {
        require(publicLive, "PUBLIC_SALE_IS_NOT_ACTIVE");
        require(amount.length == ids.length, "INCORRECT_LENGTH");
        require(!nonceList[_nonce], "ERROR_NONCE_USED");
        require(matchAddresSigner(signature, _nonce), "DIRECT_MINT_DISALLOWED");

        uint256 totalAmount;
        for (uint256 j = 0; j < amount.length; j++) {
            totalAmount = amount[j];
        }
        require(
            PUBLIC_SALE_PRICE * totalAmount <= msg.value,
            "INSUFFICIENT_ETH"
        );
        require(totalAmount <= MAX_PER_TX, "MAXIMUM_OF_3");

        for (uint256 i = 0; i < ids.length; i++) {
            require(ids[i] < _currentTokenID, "ID_DOES_NOT_EXIST");
            require(
                totalSupply(ids[i]) + amount[i] <= MAX_TOKENS,
                "EXCEED_MAX_TOKENS"
            );
            nonceList[_nonce] = true;
            _mint(msg.sender, ids[i], amount[i], "");
        }
    }

    function gift(address[] calldata receivers, uint256[] calldata ids)
        external
        onlyOwner
    {
        require(receivers.length == ids.length, "LENGTHS_DO_NOT_MATCH");
        for (uint256 i = 0; i < receivers.length; i++) {
            require(ids[i] < _currentTokenID, "ID_DOES_NOT_EXIST");
            require(totalSupply(ids[i]) < MAX_TOKENS, "EXCEED_MAX_TOKENS");
            // require(!buyersList[currentSeason][receivers[i]], "ADDRESS_MINTED");
            buyersList[currentSeason][receivers[i]] = true;
            _mint(receivers[i], ids[i], 1, "");
        }
    }

    function withdraw() external {
        uint256 currentBalance = address(this).balance;
        payable(0x45EB1D6283C98aCfaEbA07E5dEFe4612B0071d76).transfer(
            (currentBalance * 250) / 1000
        );
        payable(0xb53b491e917Eefe9c4d713870B9a08D630670245).transfer(
            (currentBalance * 150) / 1000
        );
        payable(0xe72441A43Ed985a9E3D43c11a7FcE93Dd282FF03).transfer(
            (currentBalance * 150) / 1000
        );
        payable(0x3329904219aF8Da1B86576C64b68eBe59D28c037).transfer(
            (currentBalance * 100) / 1000
        );
        payable(0x506046F99A9932540fa5938fa4aE3a6Ff20E1f65).transfer(
            (currentBalance * 100) / 1000
        );
        payable(0xf0d78074a1ED1c4CAEce0cECfE81DC9010A77FB9).transfer(
            (currentBalance * 100) / 1000
        );
        payable(0xE9D0BD5520af8c9ad20e12801315117dE9958149).transfer(
            (currentBalance * 50) / 1000
        );
        payable(0x9178bCf3A4C25B9A321EDFE7360fA587f7bD10fd).transfer(
            (currentBalance * 50) / 1000
        );
        payable(0xeD9C842645D9a2Bb66d4EAC77857768071384447).transfer(
            (currentBalance * 50) / 1000
        );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"MAX_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_SALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"newSeason","type":"bool"}],"name":"addSeasonTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"address","name":"","type":"address"}],"name":"buyersList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"season","type":"uint32"}],"name":"changeSeason","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentSeason","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"privateMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"publicLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amount","type":"uint256[]"},{"internalType":"uint256","name":"_nonce","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"seasonTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPrice","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":"togglePrivateSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040526103786080526003600581905560065566b1a2bc2ec50000600755600880546001600160a01b031916733f22e08ca09bf365f9fe3ad69fa4f213444e1062179055600c805463ffffffff191660011790553480156200006257600080fd5b506040518060800160405280605a8152602001620031ce605a913962000088816200009a565b506200009433620000b3565b620001e8565b8051620000af90600290602084019062000105565b5050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200011390620001ab565b90600052602060002090601f01602090048101928262000137576000855562000182565b82601f106200015257805160ff191683800117855562000182565b8280016001018555821562000182579182015b828111156200018257825182559160200191906001019062000165565b506200019092915062000194565b5090565b5b8082111562000190576000815560010162000195565b600181811c90821680620001c057607f821691505b60208210811415620001e257634e487b7160e01b600052602260045260246000fd5b50919050565b608051612fb562000219600039600081816105c101528181610d650152818161143001526115b10152612fb56000f3fe6080604052600436106101cc5760003560e01c8063a22cb465116100f7578063da29c78811610095578063f43a22dc11610064578063f43a22dc14610599578063f47c84c5146105af578063f5586a24146105e3578063fd3d3ad2146105f657600080fd5b8063da29c788146104f0578063e985e9c514610510578063f242432a14610559578063f2fde38b1461057957600080fd5b8063b9ad9fde116100d1578063b9ad9fde14610467578063bcb396211461047c578063bd85b039146104ae578063d8b066c2146104db57600080fd5b8063a22cb46514610404578063b65761ec14610424578063b7f751d81461044457600080fd5b80634f558e791161016f5780637e4788891161013e5780637e4788891461035f5780638da5cb5b1461039a57806391b7f5ed146103c257806397283d2f146103e257600080fd5b80634f558e79146102db578063715018a61461030a5780637705f9b51461031f57806378d18f1f1461033f57600080fd5b80630e89341c116101ab5780630e89341c1461024a5780632eb2c2d6146102775780633ccfd60b146102995780634e1273f4146102ae57600080fd5b8062fdd58e146101d157806301ffc9a71461020457806307e89ec014610234575b600080fd5b3480156101dd57600080fd5b506101f16101ec3660046126eb565b610616565b6040519081526020015b60405180910390f35b34801561021057600080fd5b5061022461021f366004612852565b6106ad565b60405190151581526020016101fb565b34801561024057600080fd5b506101f160075481565b34801561025657600080fd5b5061026a61026536600461296e565b6106ff565b6040516101fb9190612b87565b34801561028357600080fd5b506102976102923660046125b2565b610793565b005b3480156102a557600080fd5b5061029761082a565b3480156102ba57600080fd5b506102ce6102c9366004612781565b610b4f565b6040516101fb9190612b46565b3480156102e757600080fd5b506102246102f636600461296e565b600090815260036020526040902054151590565b34801561031657600080fd5b50610297610c79565b34801561032b57600080fd5b5061029761033a366004612715565b610caf565b34801561034b57600080fd5b5061029761035a366004612987565b610ea4565b34801561036b57600080fd5b5061022461037a3660046129c5565b600960209081526000928352604080842090915290825290205460ff1681565b3480156103a657600080fd5b506004546040516001600160a01b0390911681526020016101fb565b3480156103ce57600080fd5b506102976103dd36600461296e565b610f71565b3480156103ee57600080fd5b50600c5461022490640100000000900460ff1681565b34801561041057600080fd5b5061029761041f3660046126c1565b610fa0565b34801561043057600080fd5b5061029761043f3660046129aa565b610fab565b34801561045057600080fd5b50600c546102249065010000000000900460ff1681565b34801561047357600080fd5b50610297610ff1565b34801561048857600080fd5b50600c546104999063ffffffff1681565b60405163ffffffff90911681526020016101fb565b3480156104ba57600080fd5b506101f16104c936600461296e565b60009081526003602052604090205490565b3480156104e757600080fd5b50610297611040565b3480156104fc57600080fd5b506101f161050b3660046129e1565b61108d565b34801561051c57600080fd5b5061022461052b36600461257f565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561056557600080fd5b5061029761057436600461265c565b6110be565b34801561058557600080fd5b5061029761059436600461255d565b611145565b3480156105a557600080fd5b506101f160065481565b3480156105bb57600080fd5b506101f17f000000000000000000000000000000000000000000000000000000000000000081565b6102976105f136600461288c565b6111e0565b34801561060257600080fd5b50610297610611366004612929565b611525565b60006001600160a01b0383166106875760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b14806106de57506001600160e01b031982166303a24d0760e21b145b806106f957506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606002805461070e90612de8565b80601f016020809104026020016040519081016040528092919081815260200182805461073a90612de8565b80156107875780601f1061075c57610100808354040283529160200191610787565b820191906000526020600020905b81548152906001019060200180831161076a57829003601f168201915b50505050509050919050565b6001600160a01b0385163314806107af57506107af853361052b565b6108165760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161067e565b61082385858585856116f4565b5050505050565b477345eb1d6283c98acfaeba07e5defe4612b0071d766108fc6103e86108518460fa612d82565b61085b9190612d60565b6040518115909202916000818181858888f19350505050158015610883573d6000803e3d6000fd5b5073b53b491e917eefe9c4d713870b9a08d6306702456108fc6103e86108aa846096612d82565b6108b49190612d60565b6040518115909202916000818181858888f193505050501580156108dc573d6000803e3d6000fd5b5073e72441a43ed985a9e3d43c11a7fce93dd282ff036108fc6103e8610903846096612d82565b61090d9190612d60565b6040518115909202916000818181858888f19350505050158015610935573d6000803e3d6000fd5b50733329904219af8da1b86576c64b68ebe59d28c0376108fc6103e861095c846064612d82565b6109669190612d60565b6040518115909202916000818181858888f1935050505015801561098e573d6000803e3d6000fd5b5073506046f99a9932540fa5938fa4ae3a6ff20e1f656108fc6103e86109b5846064612d82565b6109bf9190612d60565b6040518115909202916000818181858888f193505050501580156109e7573d6000803e3d6000fd5b5073f0d78074a1ed1c4caece0cecfe81dc9010a77fb96108fc6103e8610a0e846064612d82565b610a189190612d60565b6040518115909202916000818181858888f19350505050158015610a40573d6000803e3d6000fd5b5073e9d0bd5520af8c9ad20e12801315117de99581496108fc6103e8610a67846032612d82565b610a719190612d60565b6040518115909202916000818181858888f19350505050158015610a99573d6000803e3d6000fd5b50739178bcf3a4c25b9a321edfe7360fa587f7bd10fd6108fc6103e8610ac0846032612d82565b610aca9190612d60565b6040518115909202916000818181858888f19350505050158015610af2573d6000803e3d6000fd5b5073ed9c842645d9a2bb66d4eac778577680713844476108fc6103e8610b19846032612d82565b610b239190612d60565b6040518115909202916000818181858888f19350505050158015610b4b573d6000803e3d6000fd5b5050565b60608151835114610bb45760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b606482015260840161067e565b6000835167ffffffffffffffff811115610bd057610bd0612ead565b604051908082528060200260200182016040528015610bf9578160200160208202803683370190505b50905060005b8451811015610c7157610c44858281518110610c1d57610c1d612e97565b6020026020010151858381518110610c3757610c37612e97565b6020026020010151610616565b828281518110610c5657610c56612e97565b6020908102919091010152610c6a81612e50565b9050610bff565b509392505050565b6004546001600160a01b03163314610ca35760405162461bcd60e51b815260040161067e90612cc7565b610cad60006118df565b565b6004546001600160a01b03163314610cd95760405162461bcd60e51b815260040161067e90612cc7565b828114610d1f5760405162461bcd60e51b81526020600482015260146024820152730988a9c8ea890a6be889ebe9c9ea8be9a82a886960631b604482015260640161067e565b60005b8381101561082357600554838383818110610d3f57610d3f612e97565b9050602002013510610d635760405162461bcd60e51b815260040161067e90612c52565b7f0000000000000000000000000000000000000000000000000000000000000000610db2848484818110610d9957610d99612e97565b9050602002013560009081526003602052604090205490565b10610dcf5760405162461bcd60e51b815260040161067e90612be2565b600c5463ffffffff166000908152600960205260408120600191878785818110610dfb57610dfb612e97565b9050602002016020810190610e10919061255d565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055610e92858583818110610e4d57610e4d612e97565b9050602002016020810190610e62919061255d565b848484818110610e7457610e74612e97565b90506020020135600160405180602001604052806000815250611931565b80610e9c81612e50565b915050610d22565b6004546001600160a01b03163314610ece5760405162461bcd60e51b815260040161067e90612cc7565b8015610f5c57600c54610ee89063ffffffff166001612d38565b600c805463ffffffff191663ffffffff9290921691909117905560005b82811015610f5a57600c5463ffffffff166000908152600a60205260409020600554610f32908390612d20565b8154600181018355600092835260209092209091015580610f5281612e50565b915050610f05565b505b81600554610f6a9190612d20565b6005555050565b6004546001600160a01b03163314610f9b5760405162461bcd60e51b815260040161067e90612cc7565b600755565b610b4b338383611a41565b6004546001600160a01b03163314610fd55760405162461bcd60e51b815260040161067e90612cc7565b600c805463ffffffff191663ffffffff92909216919091179055565b6004546001600160a01b0316331461101b5760405162461bcd60e51b815260040161067e90612cc7565b600c805465ff0000000000198116650100000000009182900460ff1615909102179055565b6004546001600160a01b0316331461106a5760405162461bcd60e51b815260040161067e90612cc7565b600c805464ff000000001981166401000000009182900460ff1615909102179055565b600a60205281600052604060002081815481106110a957600080fd5b90600052602060002001600091509150505481565b6001600160a01b0385163314806110da57506110da853361052b565b6111385760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b606482015260840161067e565b6108238585858585611b22565b6004546001600160a01b0316331461116f5760405162461bcd60e51b815260040161067e90612cc7565b6001600160a01b0381166111d45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161067e565b6111dd816118df565b50565b600c5465010000000000900460ff1661123b5760405162461bcd60e51b815260206004820152601960248201527f5055424c49435f53414c455f49535f4e4f545f41435449564500000000000000604482015260640161067e565b81841461127d5760405162461bcd60e51b815260206004820152601060248201526f0929c869ea4a48a86a8be988a9c8ea8960831b604482015260640161067e565b6000818152600b602052604090205460ff16156112cf5760405162461bcd60e51b815260206004820152601060248201526f11549493d497d393d390d157d554d15160821b604482015260640161067e565b6112d98682611c3f565b61131e5760405162461bcd60e51b81526020600482015260166024820152751112549150d517d352539517d11254d0531313d5d15160521b604482015260640161067e565b6000805b838110156113585784848281811061133c5761133c612e97565b905060200201359150808061135090612e50565b915050611322565b5034816007546113689190612d82565b11156113a95760405162461bcd60e51b815260206004820152601060248201526f0929ca6aa8c8c9286928a9ca8be8aa8960831b604482015260640161067e565b6006548111156113ea5760405162461bcd60e51b815260206004820152600c60248201526b4d4158494d554d5f4f465f3360a01b604482015260640161067e565b60005b8581101561151b5760055487878381811061140a5761140a612e97565b905060200201351061142e5760405162461bcd60e51b815260040161067e90612c52565b7f000000000000000000000000000000000000000000000000000000000000000085858381811061146157611461612e97565b9050602002013561147d898985818110610d9957610d99612e97565b6114879190612d20565b11156114a55760405162461bcd60e51b815260040161067e90612be2565b6000838152600b60205260409020805460ff19166001179055611509338888848181106114d4576114d4612e97565b905060200201358787858181106114ed576114ed612e97565b9050602002013560405180602001604052806000815250611931565b8061151381612e50565b9150506113ed565b5050505050505050565b600c54640100000000900460ff1661157f5760405162461bcd60e51b815260206004820152601a60248201527f505249564154455f53414c455f49535f4e4f545f414354495645000000000000604482015260640161067e565b60055481106115a05760405162461bcd60e51b815260040161067e90612c52565b6000818152600360205260409020547f0000000000000000000000000000000000000000000000000000000000000000116115ed5760405162461bcd60e51b815260040161067e90612be2565b600c5461160190839063ffffffff16611c3f565b6116465760405162461bcd60e51b81526020600482015260166024820152751112549150d517d352539517d11254d0531313d5d15160521b604482015260640161067e565b600c5463ffffffff16600090815260096020908152604080832033845290915290205460ff16156116aa5760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b604482015260640161067e565b600c5463ffffffff16600090815260096020908152604080832033808552908352818420805460ff191660019081179091558251938401909252928252610b4b9291849190611931565b81518351146117565760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b606482015260840161067e565b6001600160a01b03841661177c5760405162461bcd60e51b815260040161067e90612c0d565b3361178b818787878787611cfe565b60005b84518110156118715760008582815181106117ab576117ab612e97565b6020026020010151905060008583815181106117c9576117c9612e97565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156118195760405162461bcd60e51b815260040161067e90612c7d565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611856908490612d20565b925050819055505050508061186a90612e50565b905061178e565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516118c1929190612b59565b60405180910390a46118d7818787878787611e0a565b505050505050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0384166119915760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161067e565b336119b1816000876119a288611f75565b6119ab88611f75565b87611cfe565b6000848152602081815260408083206001600160a01b0389168452909152812080548592906119e1908490612d20565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461082381600087878787611fc0565b816001600160a01b0316836001600160a01b03161415611ab55760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b606482015260840161067e565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038416611b485760405162461bcd60e51b815260040161067e90612c0d565b33611b588187876119a288611f75565b6000848152602081815260408083206001600160a01b038a16845290915290205483811015611b995760405162461bcd60e51b815260040161067e90612c7d565b6000858152602081815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290611bd6908490612d20565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611c36828888888888611fc0565b50505050505050565b6000803360405180604001604052806009815260200168385349414e5f434e5960b81b81525084604051602001611c7893929190612a64565b60408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c0160408051601f1981840301815291905280516020909101209050611ce5818561208a565b6008546001600160a01b03918216911614949350505050565b6001600160a01b038516611d855760005b8351811015611d8357828181518110611d2a57611d2a612e97565b602002602001015160036000868481518110611d4857611d48612e97565b602002602001015181526020019081526020016000206000828254611d6d9190612d20565b90915550611d7c905081612e50565b9050611d0f565b505b6001600160a01b0384166118d75760005b8351811015611c3657828181518110611db157611db1612e97565b602002602001015160036000868481518110611dcf57611dcf612e97565b602002602001015181526020019081526020016000206000828254611df49190612da1565b90915550611e03905081612e50565b9050611d96565b6001600160a01b0384163b156118d75760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611e4e9089908990889088908890600401612aa3565b602060405180830381600087803b158015611e6857600080fd5b505af1925050508015611e98575060408051601f3d908101601f19168201909252611e959181019061286f565b60015b611f4557611ea4612ec3565b806308c379a01415611ede5750611eb9612edf565b80611ec45750611ee0565b8060405162461bcd60e51b815260040161067e9190612b87565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606482015260840161067e565b6001600160e01b0319811663bc197c8160e01b14611c365760405162461bcd60e51b815260040161067e90612b9a565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611faf57611faf612e97565b602090810291909101015292915050565b6001600160a01b0384163b156118d75760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906120049089908990889088908890600401612b01565b602060405180830381600087803b15801561201e57600080fd5b505af192505050801561204e575060408051601f3d908101601f1916820190925261204b9181019061286f565b60015b61205a57611ea4612ec3565b6001600160e01b0319811663f23a6e6160e01b14611c365760405162461bcd60e51b815260040161067e90612b9a565b600080600061209985856120a6565b91509150610c7181612116565b6000808251604114156120dd5760208301516040840151606085015160001a6120d1878285856122d1565b9450945050505061210f565b82516040141561210757602083015160408401516120fc8683836123be565b93509350505061210f565b506000905060025b9250929050565b600081600481111561212a5761212a612e81565b14156121335750565b600181600481111561214757612147612e81565b14156121955760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161067e565b60028160048111156121a9576121a9612e81565b14156121f75760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161067e565b600381600481111561220b5761220b612e81565b14156122645760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161067e565b600481600481111561227857612278612e81565b14156111dd5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161067e565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561230857506000905060036123b5565b8460ff16601b1415801561232057508460ff16601c14155b1561233157506000905060046123b5565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612385573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166123ae576000600192509250506123b5565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b016123df878288856122d1565b935093505050935093915050565b80356001600160a01b038116811461240457600080fd5b919050565b60008083601f84011261241b57600080fd5b50813567ffffffffffffffff81111561243357600080fd5b6020830191508360208260051b850101111561210f57600080fd5b600082601f83011261245f57600080fd5b8135602061246c82612cfc565b6040516124798282612e23565b8381528281019150858301600585901b8701840188101561249957600080fd5b60005b858110156124b85781358452928401929084019060010161249c565b5090979650505050505050565b8035801515811461240457600080fd5b600082601f8301126124e657600080fd5b813567ffffffffffffffff81111561250057612500612ead565b604051612517601f8301601f191660200182612e23565b81815284602083860101111561252c57600080fd5b816020850160208301376000918101602001919091529392505050565b803563ffffffff8116811461240457600080fd5b60006020828403121561256f57600080fd5b612578826123ed565b9392505050565b6000806040838503121561259257600080fd5b61259b836123ed565b91506125a9602084016123ed565b90509250929050565b600080600080600060a086880312156125ca57600080fd5b6125d3866123ed565b94506125e1602087016123ed565b9350604086013567ffffffffffffffff808211156125fe57600080fd5b61260a89838a0161244e565b9450606088013591508082111561262057600080fd5b61262c89838a0161244e565b9350608088013591508082111561264257600080fd5b5061264f888289016124d5565b9150509295509295909350565b600080600080600060a0868803121561267457600080fd5b61267d866123ed565b945061268b602087016123ed565b93506040860135925060608601359150608086013567ffffffffffffffff8111156126b557600080fd5b61264f888289016124d5565b600080604083850312156126d457600080fd5b6126dd836123ed565b91506125a9602084016124c5565b600080604083850312156126fe57600080fd5b612707836123ed565b946020939093013593505050565b6000806000806040858703121561272b57600080fd5b843567ffffffffffffffff8082111561274357600080fd5b61274f88838901612409565b9096509450602087013591508082111561276857600080fd5b5061277587828801612409565b95989497509550505050565b6000806040838503121561279457600080fd5b823567ffffffffffffffff808211156127ac57600080fd5b818501915085601f8301126127c057600080fd5b813560206127cd82612cfc565b6040516127da8282612e23565b8381528281019150858301600585901b870184018b10156127fa57600080fd5b600096505b8487101561282457612810816123ed565b8352600196909601959183019183016127ff565b509650508601359250508082111561283b57600080fd5b506128488582860161244e565b9150509250929050565b60006020828403121561286457600080fd5b813561257881612f69565b60006020828403121561288157600080fd5b815161257881612f69565b600080600080600080608087890312156128a557600080fd5b863567ffffffffffffffff808211156128bd57600080fd5b6128c98a838b016124d5565b975060208901359150808211156128df57600080fd5b6128eb8a838b01612409565b9097509550604089013591508082111561290457600080fd5b5061291189828a01612409565b979a9699509497949695606090950135949350505050565b6000806040838503121561293c57600080fd5b823567ffffffffffffffff81111561295357600080fd5b61295f858286016124d5565b95602094909401359450505050565b60006020828403121561298057600080fd5b5035919050565b6000806040838503121561299a57600080fd5b823591506125a9602084016124c5565b6000602082840312156129bc57600080fd5b61257882612549565b600080604083850312156129d857600080fd5b61259b83612549565b600080604083850312156129f457600080fd5b61270783612549565b600081518084526020808501945080840160005b83811015612a2d57815187529582019590820190600101612a11565b509495945050505050565b60008151808452612a50816020860160208601612db8565b601f01601f19169290920160200192915050565b6bffffffffffffffffffffffff198460601b16815260008351612a8e816014850160208801612db8565b60149201918201929092526034019392505050565b6001600160a01b0386811682528516602082015260a060408201819052600090612acf908301866129fd565b8281036060840152612ae181866129fd565b90508281036080840152612af58185612a38565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612b3b90830184612a38565b979650505050505050565b60208152600061257860208301846129fd565b604081526000612b6c60408301856129fd565b8281036020840152612b7e81856129fd565b95945050505050565b6020815260006125786020830184612a38565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6020808252601190820152704558434545445f4d41585f544f4b454e5360781b604082015260600190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b602080825260119082015270125117d113d154d7d393d517d1561254d5607a1b604082015260600190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600067ffffffffffffffff821115612d1657612d16612ead565b5060051b60200190565b60008219821115612d3357612d33612e6b565b500190565b600063ffffffff808316818516808303821115612d5757612d57612e6b565b01949350505050565b600082612d7d57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612d9c57612d9c612e6b565b500290565b600082821015612db357612db3612e6b565b500390565b60005b83811015612dd3578181015183820152602001612dbb565b83811115612de2576000848401525b50505050565b600181811c90821680612dfc57607f821691505b60208210811415612e1d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff81118282101715612e4957612e49612ead565b6040525050565b6000600019821415612e6457612e64612e6b565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115612edc5760046000803e5060005160e01c5b90565b600060443d1015612eed5790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715612f1d57505050505090565b8285019150815181811115612f355750505050505090565b843d8701016020828501011115612f4f5750505050505090565b612f5e60208286010187612e23565b509095945050505050565b6001600160e01b0319811681146111dd57600080fdfea26469706673582212206574b8f4c744a49a8d04332db51dbbb3d48efdfc0e1510fa88651bfb0a596f2964736f6c6343000807003368747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d53553851396176744d62714d5154516563563651476f5354696b353363334d58345533326568713652556b392f7b69647d2e6a736f6e

Deployed Bytecode

0x6080604052600436106101cc5760003560e01c8063a22cb465116100f7578063da29c78811610095578063f43a22dc11610064578063f43a22dc14610599578063f47c84c5146105af578063f5586a24146105e3578063fd3d3ad2146105f657600080fd5b8063da29c788146104f0578063e985e9c514610510578063f242432a14610559578063f2fde38b1461057957600080fd5b8063b9ad9fde116100d1578063b9ad9fde14610467578063bcb396211461047c578063bd85b039146104ae578063d8b066c2146104db57600080fd5b8063a22cb46514610404578063b65761ec14610424578063b7f751d81461044457600080fd5b80634f558e791161016f5780637e4788891161013e5780637e4788891461035f5780638da5cb5b1461039a57806391b7f5ed146103c257806397283d2f146103e257600080fd5b80634f558e79146102db578063715018a61461030a5780637705f9b51461031f57806378d18f1f1461033f57600080fd5b80630e89341c116101ab5780630e89341c1461024a5780632eb2c2d6146102775780633ccfd60b146102995780634e1273f4146102ae57600080fd5b8062fdd58e146101d157806301ffc9a71461020457806307e89ec014610234575b600080fd5b3480156101dd57600080fd5b506101f16101ec3660046126eb565b610616565b6040519081526020015b60405180910390f35b34801561021057600080fd5b5061022461021f366004612852565b6106ad565b60405190151581526020016101fb565b34801561024057600080fd5b506101f160075481565b34801561025657600080fd5b5061026a61026536600461296e565b6106ff565b6040516101fb9190612b87565b34801561028357600080fd5b506102976102923660046125b2565b610793565b005b3480156102a557600080fd5b5061029761082a565b3480156102ba57600080fd5b506102ce6102c9366004612781565b610b4f565b6040516101fb9190612b46565b3480156102e757600080fd5b506102246102f636600461296e565b600090815260036020526040902054151590565b34801561031657600080fd5b50610297610c79565b34801561032b57600080fd5b5061029761033a366004612715565b610caf565b34801561034b57600080fd5b5061029761035a366004612987565b610ea4565b34801561036b57600080fd5b5061022461037a3660046129c5565b600960209081526000928352604080842090915290825290205460ff1681565b3480156103a657600080fd5b506004546040516001600160a01b0390911681526020016101fb565b3480156103ce57600080fd5b506102976103dd36600461296e565b610f71565b3480156103ee57600080fd5b50600c5461022490640100000000900460ff1681565b34801561041057600080fd5b5061029761041f3660046126c1565b610fa0565b34801561043057600080fd5b5061029761043f3660046129aa565b610fab565b34801561045057600080fd5b50600c546102249065010000000000900460ff1681565b34801561047357600080fd5b50610297610ff1565b34801561048857600080fd5b50600c546104999063ffffffff1681565b60405163ffffffff90911681526020016101fb565b3480156104ba57600080fd5b506101f16104c936600461296e565b60009081526003602052604090205490565b3480156104e757600080fd5b50610297611040565b3480156104fc57600080fd5b506101f161050b3660046129e1565b61108d565b34801561051c57600080fd5b5061022461052b36600461257f565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561056557600080fd5b5061029761057436600461265c565b6110be565b34801561058557600080fd5b5061029761059436600461255d565b611145565b3480156105a557600080fd5b506101f160065481565b3480156105bb57600080fd5b506101f17f000000000000000000000000000000000000000000000000000000000000037881565b6102976105f136600461288c565b6111e0565b34801561060257600080fd5b50610297610611366004612929565b611525565b60006001600160a01b0383166106875760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b14806106de57506001600160e01b031982166303a24d0760e21b145b806106f957506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606002805461070e90612de8565b80601f016020809104026020016040519081016040528092919081815260200182805461073a90612de8565b80156107875780601f1061075c57610100808354040283529160200191610787565b820191906000526020600020905b81548152906001019060200180831161076a57829003601f168201915b50505050509050919050565b6001600160a01b0385163314806107af57506107af853361052b565b6108165760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161067e565b61082385858585856116f4565b5050505050565b477345eb1d6283c98acfaeba07e5defe4612b0071d766108fc6103e86108518460fa612d82565b61085b9190612d60565b6040518115909202916000818181858888f19350505050158015610883573d6000803e3d6000fd5b5073b53b491e917eefe9c4d713870b9a08d6306702456108fc6103e86108aa846096612d82565b6108b49190612d60565b6040518115909202916000818181858888f193505050501580156108dc573d6000803e3d6000fd5b5073e72441a43ed985a9e3d43c11a7fce93dd282ff036108fc6103e8610903846096612d82565b61090d9190612d60565b6040518115909202916000818181858888f19350505050158015610935573d6000803e3d6000fd5b50733329904219af8da1b86576c64b68ebe59d28c0376108fc6103e861095c846064612d82565b6109669190612d60565b6040518115909202916000818181858888f1935050505015801561098e573d6000803e3d6000fd5b5073506046f99a9932540fa5938fa4ae3a6ff20e1f656108fc6103e86109b5846064612d82565b6109bf9190612d60565b6040518115909202916000818181858888f193505050501580156109e7573d6000803e3d6000fd5b5073f0d78074a1ed1c4caece0cecfe81dc9010a77fb96108fc6103e8610a0e846064612d82565b610a189190612d60565b6040518115909202916000818181858888f19350505050158015610a40573d6000803e3d6000fd5b5073e9d0bd5520af8c9ad20e12801315117de99581496108fc6103e8610a67846032612d82565b610a719190612d60565b6040518115909202916000818181858888f19350505050158015610a99573d6000803e3d6000fd5b50739178bcf3a4c25b9a321edfe7360fa587f7bd10fd6108fc6103e8610ac0846032612d82565b610aca9190612d60565b6040518115909202916000818181858888f19350505050158015610af2573d6000803e3d6000fd5b5073ed9c842645d9a2bb66d4eac778577680713844476108fc6103e8610b19846032612d82565b610b239190612d60565b6040518115909202916000818181858888f19350505050158015610b4b573d6000803e3d6000fd5b5050565b60608151835114610bb45760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b606482015260840161067e565b6000835167ffffffffffffffff811115610bd057610bd0612ead565b604051908082528060200260200182016040528015610bf9578160200160208202803683370190505b50905060005b8451811015610c7157610c44858281518110610c1d57610c1d612e97565b6020026020010151858381518110610c3757610c37612e97565b6020026020010151610616565b828281518110610c5657610c56612e97565b6020908102919091010152610c6a81612e50565b9050610bff565b509392505050565b6004546001600160a01b03163314610ca35760405162461bcd60e51b815260040161067e90612cc7565b610cad60006118df565b565b6004546001600160a01b03163314610cd95760405162461bcd60e51b815260040161067e90612cc7565b828114610d1f5760405162461bcd60e51b81526020600482015260146024820152730988a9c8ea890a6be889ebe9c9ea8be9a82a886960631b604482015260640161067e565b60005b8381101561082357600554838383818110610d3f57610d3f612e97565b9050602002013510610d635760405162461bcd60e51b815260040161067e90612c52565b7f0000000000000000000000000000000000000000000000000000000000000378610db2848484818110610d9957610d99612e97565b9050602002013560009081526003602052604090205490565b10610dcf5760405162461bcd60e51b815260040161067e90612be2565b600c5463ffffffff166000908152600960205260408120600191878785818110610dfb57610dfb612e97565b9050602002016020810190610e10919061255d565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055610e92858583818110610e4d57610e4d612e97565b9050602002016020810190610e62919061255d565b848484818110610e7457610e74612e97565b90506020020135600160405180602001604052806000815250611931565b80610e9c81612e50565b915050610d22565b6004546001600160a01b03163314610ece5760405162461bcd60e51b815260040161067e90612cc7565b8015610f5c57600c54610ee89063ffffffff166001612d38565b600c805463ffffffff191663ffffffff9290921691909117905560005b82811015610f5a57600c5463ffffffff166000908152600a60205260409020600554610f32908390612d20565b8154600181018355600092835260209092209091015580610f5281612e50565b915050610f05565b505b81600554610f6a9190612d20565b6005555050565b6004546001600160a01b03163314610f9b5760405162461bcd60e51b815260040161067e90612cc7565b600755565b610b4b338383611a41565b6004546001600160a01b03163314610fd55760405162461bcd60e51b815260040161067e90612cc7565b600c805463ffffffff191663ffffffff92909216919091179055565b6004546001600160a01b0316331461101b5760405162461bcd60e51b815260040161067e90612cc7565b600c805465ff0000000000198116650100000000009182900460ff1615909102179055565b6004546001600160a01b0316331461106a5760405162461bcd60e51b815260040161067e90612cc7565b600c805464ff000000001981166401000000009182900460ff1615909102179055565b600a60205281600052604060002081815481106110a957600080fd5b90600052602060002001600091509150505481565b6001600160a01b0385163314806110da57506110da853361052b565b6111385760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b606482015260840161067e565b6108238585858585611b22565b6004546001600160a01b0316331461116f5760405162461bcd60e51b815260040161067e90612cc7565b6001600160a01b0381166111d45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161067e565b6111dd816118df565b50565b600c5465010000000000900460ff1661123b5760405162461bcd60e51b815260206004820152601960248201527f5055424c49435f53414c455f49535f4e4f545f41435449564500000000000000604482015260640161067e565b81841461127d5760405162461bcd60e51b815260206004820152601060248201526f0929c869ea4a48a86a8be988a9c8ea8960831b604482015260640161067e565b6000818152600b602052604090205460ff16156112cf5760405162461bcd60e51b815260206004820152601060248201526f11549493d497d393d390d157d554d15160821b604482015260640161067e565b6112d98682611c3f565b61131e5760405162461bcd60e51b81526020600482015260166024820152751112549150d517d352539517d11254d0531313d5d15160521b604482015260640161067e565b6000805b838110156113585784848281811061133c5761133c612e97565b905060200201359150808061135090612e50565b915050611322565b5034816007546113689190612d82565b11156113a95760405162461bcd60e51b815260206004820152601060248201526f0929ca6aa8c8c9286928a9ca8be8aa8960831b604482015260640161067e565b6006548111156113ea5760405162461bcd60e51b815260206004820152600c60248201526b4d4158494d554d5f4f465f3360a01b604482015260640161067e565b60005b8581101561151b5760055487878381811061140a5761140a612e97565b905060200201351061142e5760405162461bcd60e51b815260040161067e90612c52565b7f000000000000000000000000000000000000000000000000000000000000037885858381811061146157611461612e97565b9050602002013561147d898985818110610d9957610d99612e97565b6114879190612d20565b11156114a55760405162461bcd60e51b815260040161067e90612be2565b6000838152600b60205260409020805460ff19166001179055611509338888848181106114d4576114d4612e97565b905060200201358787858181106114ed576114ed612e97565b9050602002013560405180602001604052806000815250611931565b8061151381612e50565b9150506113ed565b5050505050505050565b600c54640100000000900460ff1661157f5760405162461bcd60e51b815260206004820152601a60248201527f505249564154455f53414c455f49535f4e4f545f414354495645000000000000604482015260640161067e565b60055481106115a05760405162461bcd60e51b815260040161067e90612c52565b6000818152600360205260409020547f0000000000000000000000000000000000000000000000000000000000000378116115ed5760405162461bcd60e51b815260040161067e90612be2565b600c5461160190839063ffffffff16611c3f565b6116465760405162461bcd60e51b81526020600482015260166024820152751112549150d517d352539517d11254d0531313d5d15160521b604482015260640161067e565b600c5463ffffffff16600090815260096020908152604080832033845290915290205460ff16156116aa5760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b604482015260640161067e565b600c5463ffffffff16600090815260096020908152604080832033808552908352818420805460ff191660019081179091558251938401909252928252610b4b9291849190611931565b81518351146117565760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b606482015260840161067e565b6001600160a01b03841661177c5760405162461bcd60e51b815260040161067e90612c0d565b3361178b818787878787611cfe565b60005b84518110156118715760008582815181106117ab576117ab612e97565b6020026020010151905060008583815181106117c9576117c9612e97565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156118195760405162461bcd60e51b815260040161067e90612c7d565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611856908490612d20565b925050819055505050508061186a90612e50565b905061178e565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516118c1929190612b59565b60405180910390a46118d7818787878787611e0a565b505050505050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0384166119915760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161067e565b336119b1816000876119a288611f75565b6119ab88611f75565b87611cfe565b6000848152602081815260408083206001600160a01b0389168452909152812080548592906119e1908490612d20565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461082381600087878787611fc0565b816001600160a01b0316836001600160a01b03161415611ab55760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b606482015260840161067e565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038416611b485760405162461bcd60e51b815260040161067e90612c0d565b33611b588187876119a288611f75565b6000848152602081815260408083206001600160a01b038a16845290915290205483811015611b995760405162461bcd60e51b815260040161067e90612c7d565b6000858152602081815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290611bd6908490612d20565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611c36828888888888611fc0565b50505050505050565b6000803360405180604001604052806009815260200168385349414e5f434e5960b81b81525084604051602001611c7893929190612a64565b60408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c0160408051601f1981840301815291905280516020909101209050611ce5818561208a565b6008546001600160a01b03918216911614949350505050565b6001600160a01b038516611d855760005b8351811015611d8357828181518110611d2a57611d2a612e97565b602002602001015160036000868481518110611d4857611d48612e97565b602002602001015181526020019081526020016000206000828254611d6d9190612d20565b90915550611d7c905081612e50565b9050611d0f565b505b6001600160a01b0384166118d75760005b8351811015611c3657828181518110611db157611db1612e97565b602002602001015160036000868481518110611dcf57611dcf612e97565b602002602001015181526020019081526020016000206000828254611df49190612da1565b90915550611e03905081612e50565b9050611d96565b6001600160a01b0384163b156118d75760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611e4e9089908990889088908890600401612aa3565b602060405180830381600087803b158015611e6857600080fd5b505af1925050508015611e98575060408051601f3d908101601f19168201909252611e959181019061286f565b60015b611f4557611ea4612ec3565b806308c379a01415611ede5750611eb9612edf565b80611ec45750611ee0565b8060405162461bcd60e51b815260040161067e9190612b87565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606482015260840161067e565b6001600160e01b0319811663bc197c8160e01b14611c365760405162461bcd60e51b815260040161067e90612b9a565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611faf57611faf612e97565b602090810291909101015292915050565b6001600160a01b0384163b156118d75760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906120049089908990889088908890600401612b01565b602060405180830381600087803b15801561201e57600080fd5b505af192505050801561204e575060408051601f3d908101601f1916820190925261204b9181019061286f565b60015b61205a57611ea4612ec3565b6001600160e01b0319811663f23a6e6160e01b14611c365760405162461bcd60e51b815260040161067e90612b9a565b600080600061209985856120a6565b91509150610c7181612116565b6000808251604114156120dd5760208301516040840151606085015160001a6120d1878285856122d1565b9450945050505061210f565b82516040141561210757602083015160408401516120fc8683836123be565b93509350505061210f565b506000905060025b9250929050565b600081600481111561212a5761212a612e81565b14156121335750565b600181600481111561214757612147612e81565b14156121955760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161067e565b60028160048111156121a9576121a9612e81565b14156121f75760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161067e565b600381600481111561220b5761220b612e81565b14156122645760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161067e565b600481600481111561227857612278612e81565b14156111dd5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161067e565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561230857506000905060036123b5565b8460ff16601b1415801561232057508460ff16601c14155b1561233157506000905060046123b5565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612385573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166123ae576000600192509250506123b5565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b016123df878288856122d1565b935093505050935093915050565b80356001600160a01b038116811461240457600080fd5b919050565b60008083601f84011261241b57600080fd5b50813567ffffffffffffffff81111561243357600080fd5b6020830191508360208260051b850101111561210f57600080fd5b600082601f83011261245f57600080fd5b8135602061246c82612cfc565b6040516124798282612e23565b8381528281019150858301600585901b8701840188101561249957600080fd5b60005b858110156124b85781358452928401929084019060010161249c565b5090979650505050505050565b8035801515811461240457600080fd5b600082601f8301126124e657600080fd5b813567ffffffffffffffff81111561250057612500612ead565b604051612517601f8301601f191660200182612e23565b81815284602083860101111561252c57600080fd5b816020850160208301376000918101602001919091529392505050565b803563ffffffff8116811461240457600080fd5b60006020828403121561256f57600080fd5b612578826123ed565b9392505050565b6000806040838503121561259257600080fd5b61259b836123ed565b91506125a9602084016123ed565b90509250929050565b600080600080600060a086880312156125ca57600080fd5b6125d3866123ed565b94506125e1602087016123ed565b9350604086013567ffffffffffffffff808211156125fe57600080fd5b61260a89838a0161244e565b9450606088013591508082111561262057600080fd5b61262c89838a0161244e565b9350608088013591508082111561264257600080fd5b5061264f888289016124d5565b9150509295509295909350565b600080600080600060a0868803121561267457600080fd5b61267d866123ed565b945061268b602087016123ed565b93506040860135925060608601359150608086013567ffffffffffffffff8111156126b557600080fd5b61264f888289016124d5565b600080604083850312156126d457600080fd5b6126dd836123ed565b91506125a9602084016124c5565b600080604083850312156126fe57600080fd5b612707836123ed565b946020939093013593505050565b6000806000806040858703121561272b57600080fd5b843567ffffffffffffffff8082111561274357600080fd5b61274f88838901612409565b9096509450602087013591508082111561276857600080fd5b5061277587828801612409565b95989497509550505050565b6000806040838503121561279457600080fd5b823567ffffffffffffffff808211156127ac57600080fd5b818501915085601f8301126127c057600080fd5b813560206127cd82612cfc565b6040516127da8282612e23565b8381528281019150858301600585901b870184018b10156127fa57600080fd5b600096505b8487101561282457612810816123ed565b8352600196909601959183019183016127ff565b509650508601359250508082111561283b57600080fd5b506128488582860161244e565b9150509250929050565b60006020828403121561286457600080fd5b813561257881612f69565b60006020828403121561288157600080fd5b815161257881612f69565b600080600080600080608087890312156128a557600080fd5b863567ffffffffffffffff808211156128bd57600080fd5b6128c98a838b016124d5565b975060208901359150808211156128df57600080fd5b6128eb8a838b01612409565b9097509550604089013591508082111561290457600080fd5b5061291189828a01612409565b979a9699509497949695606090950135949350505050565b6000806040838503121561293c57600080fd5b823567ffffffffffffffff81111561295357600080fd5b61295f858286016124d5565b95602094909401359450505050565b60006020828403121561298057600080fd5b5035919050565b6000806040838503121561299a57600080fd5b823591506125a9602084016124c5565b6000602082840312156129bc57600080fd5b61257882612549565b600080604083850312156129d857600080fd5b61259b83612549565b600080604083850312156129f457600080fd5b61270783612549565b600081518084526020808501945080840160005b83811015612a2d57815187529582019590820190600101612a11565b509495945050505050565b60008151808452612a50816020860160208601612db8565b601f01601f19169290920160200192915050565b6bffffffffffffffffffffffff198460601b16815260008351612a8e816014850160208801612db8565b60149201918201929092526034019392505050565b6001600160a01b0386811682528516602082015260a060408201819052600090612acf908301866129fd565b8281036060840152612ae181866129fd565b90508281036080840152612af58185612a38565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612b3b90830184612a38565b979650505050505050565b60208152600061257860208301846129fd565b604081526000612b6c60408301856129fd565b8281036020840152612b7e81856129fd565b95945050505050565b6020815260006125786020830184612a38565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6020808252601190820152704558434545445f4d41585f544f4b454e5360781b604082015260600190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b602080825260119082015270125117d113d154d7d393d517d1561254d5607a1b604082015260600190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600067ffffffffffffffff821115612d1657612d16612ead565b5060051b60200190565b60008219821115612d3357612d33612e6b565b500190565b600063ffffffff808316818516808303821115612d5757612d57612e6b565b01949350505050565b600082612d7d57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612d9c57612d9c612e6b565b500290565b600082821015612db357612db3612e6b565b500390565b60005b83811015612dd3578181015183820152602001612dbb565b83811115612de2576000848401525b50505050565b600181811c90821680612dfc57607f821691505b60208210811415612e1d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff81118282101715612e4957612e49612ead565b6040525050565b6000600019821415612e6457612e64612e6b565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115612edc5760046000803e5060005160e01c5b90565b600060443d1015612eed5790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715612f1d57505050505090565b8285019150815181811115612f355750505050505090565b843d8701016020828501011115612f4f5750505050505090565b612f5e60208286010187612e23565b509095945050505050565b6001600160e01b0319811681146111dd57600080fdfea26469706673582212206574b8f4c744a49a8d04332db51dbbb3d48efdfc0e1510fa88651bfb0a596f2964736f6c63430008070033

Deployed Bytecode Sourcemap

51838:5660:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22978:231;;;;;;;;;;-1:-1:-1;22978:231:0;;;;;:::i;:::-;;:::i;:::-;;;25326:25:1;;;25314:2;25299:18;22978:231:0;;;;;;;;22001:310;;;;;;;;;;-1:-1:-1;22001:310:0;;;;;:::i;:::-;;:::i;:::-;;;13900:14:1;;13893:22;13875:41;;13863:2;13848:18;22001:310:0;13735:187:1;52088:45:0;;;;;;;;;;;;;;;;22722:105;;;;;;;;;;-1:-1:-1;22722:105:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;24917:442::-;;;;;;;;;;-1:-1:-1;24917:442:0;;;;;:::i;:::-;;:::i;:::-;;56270:1225;;;;;;;;;;;;;:::i;23375:524::-;;;;;;;;;;-1:-1:-1;23375:524:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;37417:122::-;;;;;;;;;;-1:-1:-1;37417:122:0;;;;;:::i;:::-;37474:4;37295:16;;;:12;:16;;;;;;-1:-1:-1;;;37417:122:0;2606:103;;;;;;;;;;;;;:::i;55660:602::-;;;;;;;;;;-1:-1:-1;55660:602:0;;;;;:::i;:::-;;:::i;53454:384::-;;;;;;;;;;-1:-1:-1;53454:384:0;;;;;:::i;:::-;;:::i;52279:61::-;;;;;;;;;;-1:-1:-1;52279:61:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;1955:87;;;;;;;;;;-1:-1:-1;2028:6:0;;1955:87;;-1:-1:-1;;;;;2028:6:0;;;11541:51:1;;11529:2;11514:18;1955:87:0;11395:203:1;53350:96:0;;;;;;;;;;-1:-1:-1;53350:96:0;;;;;:::i;:::-;;:::i;52491:23::-;;;;;;;;;;-1:-1:-1;52491:23:0;;;;;;;;;;;23972:155;;;;;;;;;;-1:-1:-1;23972:155:0;;;;;:::i;:::-;;:::i;53846:97::-;;;;;;;;;;-1:-1:-1;53846:97:0;;;;;:::i;:::-;;:::i;52521:22::-;;;;;;;;;;-1:-1:-1;52521:22:0;;;;;;;;;;;53246:96;;;;;;;;;;;;;:::i;52453:31::-;;;;;;;;;;-1:-1:-1;52453:31:0;;;;;;;;;;;25789:10:1;25777:23;;;25759:42;;25747:2;25732:18;52453:31:0;25615:192:1;37206:113:0;;;;;;;;;;-1:-1:-1;37206:113:0;;;;;:::i;:::-;37268:7;37295:16;;;:12;:16;;;;;;;37206:113;53139:99;;;;;;;;;;;;;:::i;52347:48::-;;;;;;;;;;-1:-1:-1;52347:48:0;;;;;:::i;:::-;;:::i;24199:168::-;;;;;;;;;;-1:-1:-1;24199:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;24322:27:0;;;24298:4;24322:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;24199:168;24439:401;;;;;;;;;;-1:-1:-1;24439:401:0;;;;;:::i;:::-;;:::i;2864:201::-;;;;;;;;;;-1:-1:-1;2864:201:0;;;;;:::i;:::-;;:::i;52052:29::-;;;;;;;;;;;;;;;;51962:41;;;;;;;;;;;;;;;54522:1130;;;;;;:::i;:::-;;:::i;53951:563::-;;;;;;;;;;-1:-1:-1;53951:563:0;;;;;:::i;:::-;;:::i;22978:231::-;23064:7;-1:-1:-1;;;;;23092:21:0;;23084:77;;;;-1:-1:-1;;;23084:77:0;;17004:2:1;23084:77:0;;;16986:21:1;17043:2;17023:18;;;17016:30;17082:34;17062:18;;;17055:62;-1:-1:-1;;;17133:18:1;;;17126:41;17184:19;;23084:77:0;;;;;;;;;-1:-1:-1;23179:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;23179:22:0;;;;;;;;;;;;22978:231::o;22001:310::-;22103:4;-1:-1:-1;;;;;;22140:41:0;;-1:-1:-1;;;22140:41:0;;:110;;-1:-1:-1;;;;;;;22198:52:0;;-1:-1:-1;;;22198:52:0;22140:110;:163;;;-1:-1:-1;;;;;;;;;;13465:40:0;;;22267:36;22120:183;22001:310;-1:-1:-1;;22001:310:0:o;22722:105::-;22782:13;22815:4;22808:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22722:105;;;:::o;24917:442::-;-1:-1:-1;;;;;25150:20:0;;759:10;25150:20;;:60;;-1:-1:-1;25174:36:0;25191:4;759:10;24199:168;:::i;25174:36::-;25128:160;;;;-1:-1:-1;;;25128:160:0;;19743:2:1;25128:160:0;;;19725:21:1;19782:2;19762:18;;;19755:30;19821:34;19801:18;;;19794:62;-1:-1:-1;;;19872:18:1;;;19865:48;19930:19;;25128:160:0;19541:414:1;25128:160:0;25299:52;25322:4;25328:2;25332:3;25337:7;25346:4;25299:22;:52::i;:::-;24917:442;;;;;:::o;56270:1225::-;56335:21;56375:42;56367:115;56467:4;56443:20;56335:21;56460:3;56443:20;:::i;:::-;56442:29;;;;:::i;:::-;56367:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56501:42:0;56493:115;56593:4;56569:20;:14;56586:3;56569:20;:::i;:::-;56568:29;;;;:::i;:::-;56493:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56627:42:0;56619:115;56719:4;56695:20;:14;56712:3;56695:20;:::i;:::-;56694:29;;;;:::i;:::-;56619:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56753:42:0;56745:115;56845:4;56821:20;:14;56838:3;56821:20;:::i;:::-;56820:29;;;;:::i;:::-;56745:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56879:42:0;56871:115;56971:4;56947:20;:14;56964:3;56947:20;:::i;:::-;56946:29;;;;:::i;:::-;56871:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57005:42:0;56997:115;57097:4;57073:20;:14;57090:3;57073:20;:::i;:::-;57072:29;;;;:::i;:::-;56997:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57131:42:0;57123:114;57222:4;57199:19;:14;57216:2;57199:19;:::i;:::-;57198:28;;;;:::i;:::-;57123:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57256:42:0;57248:114;57347:4;57324:19;:14;57341:2;57324:19;:::i;:::-;57323:28;;;;:::i;:::-;57248:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57381:42:0;57373:114;57472:4;57449:19;:14;57466:2;57449:19;:::i;:::-;57448:28;;;;:::i;:::-;57373:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56299:1196;56270:1225::o;23375:524::-;23531:16;23592:3;:10;23573:8;:15;:29;23565:83;;;;-1:-1:-1;;;23565:83:0;;23124:2:1;23565:83:0;;;23106:21:1;23163:2;23143:18;;;23136:30;23202:34;23182:18;;;23175:62;-1:-1:-1;;;23253:18:1;;;23246:39;23302:19;;23565:83:0;22922:405:1;23565:83:0;23661:30;23708:8;:15;23694:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23694:30:0;;23661:63;;23742:9;23737:122;23761:8;:15;23757:1;:19;23737:122;;;23817:30;23827:8;23836:1;23827:11;;;;;;;;:::i;:::-;;;;;;;23840:3;23844:1;23840:6;;;;;;;;:::i;:::-;;;;;;;23817:9;:30::i;:::-;23798:13;23812:1;23798:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;23778:3;;;:::i;:::-;;;23737:122;;;-1:-1:-1;23878:13:0;23375:524;-1:-1:-1;;;23375:524:0:o;2606:103::-;2028:6;;-1:-1:-1;;;;;2028:6:0;759:10;2175:23;2167:68;;;;-1:-1:-1;;;2167:68:0;;;;;;;:::i;:::-;2671:30:::1;2698:1;2671:18;:30::i;:::-;2606:103::o:0;55660:602::-;2028:6;;-1:-1:-1;;;;;2028:6:0;759:10;2175:23;2167:68;;;;-1:-1:-1;;;2167:68:0;;;;;;;:::i;:::-;55789:30;;::::1;55781:63;;;::::0;-1:-1:-1;;;55781:63:0;;24688:2:1;55781:63:0::1;::::0;::::1;24670:21:1::0;24727:2;24707:18;;;24700:30;-1:-1:-1;;;24746:18:1;;;24739:50;24806:18;;55781:63:0::1;24486:344:1::0;55781:63:0::1;55860:9;55855:400;55875:20:::0;;::::1;55855:400;;;55934:15;;55925:3;;55929:1;55925:6;;;;;;;:::i;:::-;;;;;;;:24;55917:54;;;;-1:-1:-1::0;;;55917:54:0::1;;;;;;;:::i;:::-;56016:10;55994:19;56006:3;;56010:1;56006:6;;;;;;;:::i;:::-;;;;;;;37268:7:::0;37295:16;;;:12;:16;;;;;;;37206:113;55994:19:::1;:32;55986:62;;;;-1:-1:-1::0;;;55986:62:0::1;;;;;;;:::i;:::-;56159:13;::::0;::::1;;56148:25;::::0;;;:10:::1;:25;::::0;;;;56190:4:::1;::::0;56174:9;;56184:1;56174:12;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;56148:39:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;56148:39:0;:46;;-1:-1:-1;;56148:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;56209:34:::1;56215:9:::0;;56225:1;56215:12;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;56229:3;;56233:1;56229:6;;;;;;;:::i;:::-;;;;;;;56237:1;56209:34;;;;;;;;;;;::::0;:5:::1;:34::i;:::-;55897:3:::0;::::1;::::0;::::1;:::i;:::-;;;;55855:400;;53454:384:::0;2028:6;;-1:-1:-1;;;;;2028:6:0;759:10;2175:23;2167:68;;;;-1:-1:-1;;;2167:68:0;;;;;;;:::i;:::-;53568:9:::1;53564:214;;;53610:13;::::0;:17:::1;::::0;:13:::1;;::::0;:17:::1;:::i;:::-;53594:13;:33:::0;;-1:-1:-1;;53594:33:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;53642:125:0::1;53666:6;53662:1;:10;53642:125;;;53711:13;::::0;::::1;;53698:27;::::0;;;:12:::1;:27;::::0;;;;53731:15:::1;::::0;:19:::1;::::0;53749:1;;53731:19:::1;:::i;:::-;53698:53:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;53698:53:0;;;::::1;::::0;;;;;::::1;::::0;53674:3;::::1;::::0;::::1;:::i;:::-;;;;53642:125;;;;53564:214;53824:6;53806:15;;:24;;;;:::i;:::-;53788:15;:42:::0;-1:-1:-1;;53454:384:0:o;53350:96::-;2028:6;;-1:-1:-1;;;;;2028:6:0;759:10;2175:23;2167:68;;;;-1:-1:-1;;;2167:68:0;;;;;;;:::i;:::-;53413:17:::1;:25:::0;53350:96::o;23972:155::-;24067:52;759:10;24100:8;24110;24067:18;:52::i;53846:97::-;2028:6;;-1:-1:-1;;;;;2028:6:0;759:10;2175:23;2167:68;;;;-1:-1:-1;;;2167:68:0;;;;;;;:::i;:::-;53913:13:::1;:22:::0;;-1:-1:-1;;53913:22:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;53846:97::o;53246:96::-;2028:6;;-1:-1:-1;;;;;2028:6:0;759:10;2175:23;2167:68;;;;-1:-1:-1;;;2167:68:0;;;;;;;:::i;:::-;53324:10:::1;::::0;;-1:-1:-1;;53310:24:0;::::1;53324:10:::0;;;;::::1;;;53323:11;53310:24:::0;;::::1;;::::0;;53246:96::o;53139:99::-;2028:6;;-1:-1:-1;;;;;2028:6:0;759:10;2175:23;2167:68;;;;-1:-1:-1;;;2167:68:0;;;;;;;:::i;:::-;53219:11:::1;::::0;;-1:-1:-1;;53204:26:0;::::1;53219:11:::0;;;;::::1;;;53218:12;53204:26:::0;;::::1;;::::0;;53139:99::o;52347:48::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24439:401::-;-1:-1:-1;;;;;24647:20:0;;759:10;24647:20;;:60;;-1:-1:-1;24671:36:0;24688:4;759:10;24199:168;:::i;24671:36::-;24625:151;;;;-1:-1:-1;;;24625:151:0;;18178:2:1;24625:151:0;;;18160:21:1;18217:2;18197:18;;;18190:30;18256:34;18236:18;;;18229:62;-1:-1:-1;;;18307:18:1;;;18300:39;18356:19;;24625:151:0;17976:405:1;24625:151:0;24787:45;24805:4;24811:2;24815;24819:6;24827:4;24787:17;:45::i;2864:201::-;2028:6;;-1:-1:-1;;;;;2028:6:0;759:10;2175:23;2167:68;;;;-1:-1:-1;;;2167:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2953:22:0;::::1;2945:73;;;::::0;-1:-1:-1;;;2945:73:0;;17416:2:1;2945:73:0::1;::::0;::::1;17398:21:1::0;17455:2;17435:18;;;17428:30;17494:34;17474:18;;;17467:62;-1:-1:-1;;;17545:18:1;;;17538:36;17591:19;;2945:73:0::1;17214:402:1::0;2945:73:0::1;3029:28;3048:8;3029:18;:28::i;:::-;2864:201:::0;:::o;54522:1130::-;54712:10;;;;;;;54704:48;;;;-1:-1:-1;;;54704:48:0;;16290:2:1;54704:48:0;;;16272:21:1;16329:2;16309:18;;;16302:30;16368:27;16348:18;;;16341:55;16413:18;;54704:48:0;16088:349:1;54704:48:0;54771:27;;;54763:56;;;;-1:-1:-1;;;54763:56:0;;22028:2:1;54763:56:0;;;22010:21:1;22067:2;22047:18;;;22040:30;-1:-1:-1;;;22086:18:1;;;22079:46;22142:18;;54763:56:0;21826:340:1;54763:56:0;54839:17;;;;:9;:17;;;;;;;;54838:18;54830:47;;;;-1:-1:-1;;;54830:47:0;;20162:2:1;54830:47:0;;;20144:21:1;20201:2;20181:18;;;20174:30;-1:-1:-1;;;20220:18:1;;;20213:46;20276:18;;54830:47:0;19960:340:1;54830:47:0;54896:36;54914:9;54925:6;54896:17;:36::i;:::-;54888:71;;;;-1:-1:-1;;;54888:71:0;;15939:2:1;54888:71:0;;;15921:21:1;15978:2;15958:18;;;15951:30;-1:-1:-1;;;15997:18:1;;;15990:52;16059:18;;54888:71:0;15737:346:1;54888:71:0;54972:19;;55002:94;55022:17;;;55002:94;;;55075:6;;55082:1;55075:9;;;;;;;:::i;:::-;;;;;;;55061:23;;55041:3;;;;;:::i;:::-;;;;55002:94;;;;55163:9;55148:11;55128:17;;:31;;;;:::i;:::-;:44;;55106:110;;;;-1:-1:-1;;;55106:110:0;;25037:2:1;55106:110:0;;;25019:21:1;25076:2;25056:18;;;25049:30;-1:-1:-1;;;25095:18:1;;;25088:46;25151:18;;55106:110:0;24835:340:1;55106:110:0;55250:10;;55235:11;:25;;55227:50;;;;-1:-1:-1;;;55227:50:0;;22373:2:1;55227:50:0;;;22355:21:1;22412:2;22392:18;;;22385:30;-1:-1:-1;;;22431:18:1;;;22424:42;22483:18;;55227:50:0;22171:336:1;55227:50:0;55295:9;55290:355;55310:14;;;55290:355;;;55363:15;;55354:3;;55358:1;55354:6;;;;;;;:::i;:::-;;;;;;;:24;55346:54;;;;-1:-1:-1;;;55346:54:0;;;;;;;:::i;:::-;55476:10;55463:6;;55470:1;55463:9;;;;;;;:::i;:::-;;;;;;;55441:19;55453:3;;55457:1;55453:6;;;;;;;:::i;55441:19::-;:31;;;;:::i;:::-;:45;;55415:124;;;;-1:-1:-1;;;55415:124:0;;;;;;;:::i;:::-;55554:17;;;;:9;:17;;;;;:24;;-1:-1:-1;;55554:24:0;55574:4;55554:24;;;55593:40;55599:10;55611:3;;55615:1;55611:6;;;;;;;:::i;:::-;;;;;;;55619;;55626:1;55619:9;;;;;;;:::i;:::-;;;;;;;55593:40;;;;;;;;;;;;:5;:40::i;:::-;55326:3;;;;:::i;:::-;;;;55290:355;;;;54693:959;54522:1130;;;;;;:::o;53951:563::-;54036:11;;;;;;;54028:50;;;;-1:-1:-1;;;54028:50:0;;17823:2:1;54028:50:0;;;17805:21:1;17862:2;17842:18;;;17835:30;17901:28;17881:18;;;17874:56;17947:18;;54028:50:0;17621:350:1;54028:50:0;54102:15;;54097:2;:20;54089:50;;;;-1:-1:-1;;;54089:50:0;;;;;;;:::i;:::-;37268:7;37295:16;;;:12;:16;;;;;;54176:10;-1:-1:-1;54150:58:0;;;;-1:-1:-1;;;54150:58:0;;;;;;;:::i;:::-;54270:13;;54241:43;;54259:9;;54270:13;;54241:17;:43::i;:::-;54219:115;;;;-1:-1:-1;;;54219:115:0;;15939:2:1;54219:115:0;;;15921:21:1;15978:2;15958:18;;;15951:30;-1:-1:-1;;;15997:18:1;;;15990:52;16059:18;;54219:115:0;15737:346:1;54219:115:0;54365:13;;;;54354:25;;;;:10;:25;;;;;;;;54380:10;54354:37;;;;;;;;;;54353:38;54345:65;;;;-1:-1:-1;;;54345:65:0;;23534:2:1;54345:65:0;;;23516:21:1;23573:2;23553:18;;;23546:30;-1:-1:-1;;;23592:18:1;;;23585:44;23646:18;;54345:65:0;23332:338:1;54345:65:0;54434:13;;;;54423:25;;;;:10;:25;;;;;;;;54449:10;54423:37;;;;;;;;;:44;;-1:-1:-1;;54423:44:0;54463:4;54423:44;;;;;;54478:28;;;;;;;;;;;;;54449:10;54496:2;;54463:4;54478:5;:28::i;27001:1074::-;27228:7;:14;27214:3;:10;:28;27206:81;;;;-1:-1:-1;;;27206:81:0;;23877:2:1;27206:81:0;;;23859:21:1;23916:2;23896:18;;;23889:30;23955:34;23935:18;;;23928:62;-1:-1:-1;;;24006:18:1;;;23999:38;24054:19;;27206:81:0;23675:404:1;27206:81:0;-1:-1:-1;;;;;27306:16:0;;27298:66;;;;-1:-1:-1;;;27298:66:0;;;;;;;:::i;:::-;759:10;27421:60;759:10;27452:4;27458:2;27462:3;27467:7;27476:4;27421:20;:60::i;:::-;27499:9;27494:421;27518:3;:10;27514:1;:14;27494:421;;;27550:10;27563:3;27567:1;27563:6;;;;;;;;:::i;:::-;;;;;;;27550:19;;27584:14;27601:7;27609:1;27601:10;;;;;;;;:::i;:::-;;;;;;;;;;;;27628:19;27650:13;;;;;;;;;;-1:-1:-1;;;;;27650:19:0;;;;;;;;;;;;27601:10;;-1:-1:-1;27692:21:0;;;;27684:76;;;;-1:-1:-1;;;27684:76:0;;;;;;;:::i;:::-;27804:9;:13;;;;;;;;;;;-1:-1:-1;;;;;27804:19:0;;;;;;;;;;27826:20;;;27804:42;;27876:17;;;;;;;:27;;27826:20;;27804:9;27876:27;;27826:20;;27876:27;:::i;:::-;;;;;;;;27535:380;;;27530:3;;;;:::i;:::-;;;27494:421;;;;27962:2;-1:-1:-1;;;;;27932:47:0;27956:4;-1:-1:-1;;;;;27932:47:0;27946:8;-1:-1:-1;;;;;27932:47:0;;27966:3;27971:7;27932:47;;;;;;;:::i;:::-;;;;;;;;27992:75;28028:8;28038:4;28044:2;28048:3;28053:7;28062:4;27992:35;:75::i;:::-;27195:880;27001:1074;;;;;:::o;3225:191::-;3318:6;;;-1:-1:-1;;;;;3335:17:0;;;-1:-1:-1;;;;;;3335:17:0;;;;;;;3368:40;;3318:6;;;3335:17;3318:6;;3368:40;;3299:16;;3368:40;3288:128;3225:191;:::o;29393:569::-;-1:-1:-1;;;;;29546:16:0;;29538:62;;;;-1:-1:-1;;;29538:62:0;;24286:2:1;29538:62:0;;;24268:21:1;24325:2;24305:18;;;24298:30;24364:34;24344:18;;;24337:62;-1:-1:-1;;;24415:18:1;;;24408:31;24456:19;;29538:62:0;24084:397:1;29538:62:0;759:10;29657:102;759:10;29613:16;29700:2;29704:21;29722:2;29704:17;:21::i;:::-;29727:25;29745:6;29727:17;:25::i;:::-;29754:4;29657:20;:102::i;:::-;29772:9;:13;;;;;;;;;;;-1:-1:-1;;;;;29772:17:0;;;;;;;;;:27;;29793:6;;29772:9;:27;;29793:6;;29772:27;:::i;:::-;;;;-1:-1:-1;;29815:52:0;;;25536:25:1;;;25592:2;25577:18;;25570:34;;;-1:-1:-1;;;;;29815:52:0;;;;29848:1;;29815:52;;;;;;25509:18:1;29815:52:0;;;;;;;29880:74;29911:8;29929:1;29933:2;29937;29941:6;29949:4;29880:30;:74::i;33187:331::-;33342:8;-1:-1:-1;;;;;33333:17:0;:5;-1:-1:-1;;;;;33333:17:0;;;33325:71;;;;-1:-1:-1;;;33325:71:0;;22714:2:1;33325:71:0;;;22696:21:1;22753:2;22733:18;;;22726:30;22792:34;22772:18;;;22765:62;-1:-1:-1;;;22843:18:1;;;22836:39;22892:19;;33325:71:0;22512:405:1;33325:71:0;-1:-1:-1;;;;;33407:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;33407:46:0;;;;;;;;;;33469:41;;13875::1;;;33469::0;;13848:18:1;33469:41:0;;;;;;;33187:331;;;:::o;25823:820::-;-1:-1:-1;;;;;26011:16:0;;26003:66;;;;-1:-1:-1;;;26003:66:0;;;;;;;:::i;:::-;759:10;26126:96;759:10;26157:4;26163:2;26167:21;26185:2;26167:17;:21::i;26126:96::-;26235:19;26257:13;;;;;;;;;;;-1:-1:-1;;;;;26257:19:0;;;;;;;;;;26295:21;;;;26287:76;;;;-1:-1:-1;;;26287:76:0;;;;;;;:::i;:::-;26399:9;:13;;;;;;;;;;;-1:-1:-1;;;;;26399:19:0;;;;;;;;;;26421:20;;;26399:42;;26463:17;;;;;;;:27;;26421:20;;26399:9;26463:27;;26421:20;;26463:27;:::i;:::-;;;;-1:-1:-1;;26508:46:0;;;25536:25:1;;;25592:2;25577:18;;25570:34;;;-1:-1:-1;;;;;26508:46:0;;;;;;;;;;;;;;25509:18:1;26508:46:0;;;;;;;26567:68;26598:8;26608:4;26614:2;26618;26622:6;26630:4;26567:30;:68::i;:::-;25992:651;;25823:820;;;;;:::o;52716:415::-;52832:4;52854:12;53008:10;53020:8;;;;;;;;;;;;;-1:-1:-1;;;53020:8:0;;;53030:6;52991:46;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;52991:46:0;;;;;;;;;;52981:57;;52991:46;52981:57;;;;11252:66:1;52893:160:0;;;11240:79:1;;;;11335:12;;;11328:28;11372:12;;52893:160:0;;;-1:-1:-1;;52893:160:0;;;;;;;;;52869:195;;52893:160;52869:195;;;;;-1:-1:-1;53100:23:0;52869:195;53113:9;53100:12;:23::i;:::-;53082:14;;-1:-1:-1;;;;;53082:41:0;;;:14;;:41;;52716:415;-1:-1:-1;;;;52716:415:0:o;37614:655::-;-1:-1:-1;;;;;37936:18:0;;37932:160;;37976:9;37971:110;37995:3;:10;37991:1;:14;37971:110;;;38055:7;38063:1;38055:10;;;;;;;;:::i;:::-;;;;;;;38031:12;:20;38044:3;38048:1;38044:6;;;;;;;;:::i;:::-;;;;;;;38031:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;38007:3:0;;-1:-1:-1;38007:3:0;;:::i;:::-;;;37971:110;;;;37932:160;-1:-1:-1;;;;;38108:16:0;;38104:158;;38146:9;38141:110;38165:3;:10;38161:1;:14;38141:110;;;38225:7;38233:1;38225:10;;;;;;;;:::i;:::-;;;;;;;38201:12;:20;38214:3;38218:1;38214:6;;;;;;;;:::i;:::-;;;;;;;38201:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;38177:3:0;;-1:-1:-1;38177:3:0;;:::i;:::-;;;38141:110;;35455:813;-1:-1:-1;;;;;35695:13:0;;4566:20;4614:8;35691:570;;35731:79;;-1:-1:-1;;;35731:79:0;;-1:-1:-1;;;;;35731:43:0;;;;;:79;;35775:8;;35785:4;;35791:3;;35796:7;;35805:4;;35731:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35731:79:0;;;;;;;;-1:-1:-1;;35731:79:0;;;;;;;;;;;;:::i;:::-;;;35727:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;36123:6;36116:14;;-1:-1:-1;;;36116:14:0;;;;;;;;:::i;35727:523::-;;;36172:62;;-1:-1:-1;;;36172:62:0;;15109:2:1;36172:62:0;;;15091:21:1;15148:2;15128:18;;;15121:30;15187:34;15167:18;;;15160:62;-1:-1:-1;;;15238:18:1;;;15231:50;15298:19;;36172:62:0;14907:416:1;35727:523:0;-1:-1:-1;;;;;;35892:60:0;;-1:-1:-1;;;35892:60:0;35888:159;;35977:50;;-1:-1:-1;;;35977:50:0;;;;;;;:::i;36276:198::-;36396:16;;;36410:1;36396:16;;;;;;;;;36342;;36371:22;;36396:16;;;;;;;;;;;;-1:-1:-1;36396:16:0;36371:41;;36434:7;36423:5;36429:1;36423:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;36461:5;36276:198;-1:-1:-1;;36276:198:0:o;34703:744::-;-1:-1:-1;;;;;34918:13:0;;4566:20;4614:8;34914:526;;34954:72;;-1:-1:-1;;;34954:72:0;;-1:-1:-1;;;;;34954:38:0;;;;;:72;;34993:8;;35003:4;;35009:2;;35013:6;;35021:4;;34954:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34954:72:0;;;;;;;;-1:-1:-1;;34954:72:0;;;;;;;;;;;;:::i;:::-;;;34950:479;;;;:::i;:::-;-1:-1:-1;;;;;;35076:55:0;;-1:-1:-1;;;35076:55:0;35072:154;;35156:50;;-1:-1:-1;;;35156:50:0;;;;;;;:::i;44802:231::-;44880:7;44901:17;44920:18;44942:27;44953:4;44959:9;44942:10;:27::i;:::-;44900:69;;;;44980:18;44992:5;44980:11;:18::i;42692:1308::-;42773:7;42782:12;43007:9;:16;43027:2;43007:22;43003:990;;;43303:4;43288:20;;43282:27;43353:4;43338:20;;43332:27;43411:4;43396:20;;43390:27;43046:9;43382:36;43454:25;43465:4;43382:36;43282:27;43332;43454:10;:25::i;:::-;43447:32;;;;;;;;;43003:990;43501:9;:16;43521:2;43501:22;43497:496;;;43776:4;43761:20;;43755:27;43827:4;43812:20;;43806:27;43869:23;43880:4;43755:27;43806;43869:10;:23::i;:::-;43862:30;;;;;;;;43497:496;-1:-1:-1;43941:1:0;;-1:-1:-1;43945:35:0;43497:496;42692:1308;;;;;:::o;40963:643::-;41041:20;41032:5;:29;;;;;;;;:::i;:::-;;41028:571;;;40963:643;:::o;41028:571::-;41139:29;41130:5;:38;;;;;;;;:::i;:::-;;41126:473;;;41185:34;;-1:-1:-1;;;41185:34:0;;14756:2:1;41185:34:0;;;14738:21:1;14795:2;14775:18;;;14768:30;14834:26;14814:18;;;14807:54;14878:18;;41185:34:0;14554:348:1;41126:473:0;41250:35;41241:5;:44;;;;;;;;:::i;:::-;;41237:362;;;41302:41;;-1:-1:-1;;;41302:41:0;;16644:2:1;41302:41:0;;;16626:21:1;16683:2;16663:18;;;16656:30;16722:33;16702:18;;;16695:61;16773:18;;41302:41:0;16442:355:1;41237:362:0;41374:30;41365:5;:39;;;;;;;;:::i;:::-;;41361:238;;;41421:44;;-1:-1:-1;;;41421:44:0;;18588:2:1;41421:44:0;;;18570:21:1;18627:2;18607:18;;;18600:30;18666:34;18646:18;;;18639:62;-1:-1:-1;;;18717:18:1;;;18710:32;18759:19;;41421:44:0;18386:398:1;41361:238:0;41496:30;41487:5;:39;;;;;;;;:::i;:::-;;41483:116;;;41543:44;;-1:-1:-1;;;41543:44:0;;20853:2:1;41543:44:0;;;20835:21:1;20892:2;20872:18;;;20865:30;20931:34;20911:18;;;20904:62;-1:-1:-1;;;20982:18:1;;;20975:32;21024:19;;41543:44:0;20651:398:1;46301:1632:0;46432:7;;47366:66;47353:79;;47349:163;;;-1:-1:-1;47465:1:0;;-1:-1:-1;47469:30:0;47449:51;;47349:163;47526:1;:7;;47531:2;47526:7;;:18;;;;;47537:1;:7;;47542:2;47537:7;;47526:18;47522:102;;;-1:-1:-1;47577:1:0;;-1:-1:-1;47581:30:0;47561:51;;47522:102;47738:24;;;47721:14;47738:24;;;;;;;;;14154:25:1;;;14227:4;14215:17;;14195:18;;;14188:45;;;;14249:18;;;14242:34;;;14292:18;;;14285:34;;;47738:24:0;;14126:19:1;;47738:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;47738:24:0;;-1:-1:-1;;47738:24:0;;;-1:-1:-1;;;;;;;47777:20:0;;47773:103;;47830:1;47834:29;47814:50;;;;;;;47773:103;47896:6;-1:-1:-1;47904:20:0;;-1:-1:-1;46301:1632:0;;;;;;;;:::o;45296:391::-;45410:7;;-1:-1:-1;;;;;45511:75:0;;45613:3;45609:12;;;45623:2;45605:21;45654:25;45665:4;45605:21;45674:1;45511:75;45654:10;:25::i;:::-;45647:32;;;;;;45296:391;;;;;;:::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:367::-;255:8;265:6;319:3;312:4;304:6;300:17;296:27;286:55;;337:1;334;327:12;286:55;-1:-1:-1;360:20:1;;403:18;392:30;;389:50;;;435:1;432;425:12;389:50;472:4;464:6;460:17;448:29;;532:3;525:4;515:6;512:1;508:14;500:6;496:27;492:38;489:47;486:67;;;549:1;546;539:12;564:735;618:5;671:3;664:4;656:6;652:17;648:27;638:55;;689:1;686;679:12;638:55;725:6;712:20;751:4;774:43;814:2;774:43;:::i;:::-;846:2;840:9;858:31;886:2;878:6;858:31;:::i;:::-;924:18;;;958:15;;;;-1:-1:-1;993:15:1;;;1043:1;1039:10;;;1027:23;;1023:32;;1020:41;-1:-1:-1;1017:61:1;;;1074:1;1071;1064:12;1017:61;1096:1;1106:163;1120:2;1117:1;1114:9;1106:163;;;1177:17;;1165:30;;1215:12;;;;1247;;;;1138:1;1131:9;1106:163;;;-1:-1:-1;1287:6:1;;564:735;-1:-1:-1;;;;;;;564:735:1:o;1304:160::-;1369:20;;1425:13;;1418:21;1408:32;;1398:60;;1454:1;1451;1444:12;1469:555;1511:5;1564:3;1557:4;1549:6;1545:17;1541:27;1531:55;;1582:1;1579;1572:12;1531:55;1618:6;1605:20;1644:18;1640:2;1637:26;1634:52;;;1666:18;;:::i;:::-;1715:2;1709:9;1727:67;1782:2;1763:13;;-1:-1:-1;;1759:27:1;1788:4;1755:38;1709:9;1727:67;:::i;:::-;1818:2;1810:6;1803:18;1864:3;1857:4;1852:2;1844:6;1840:15;1836:26;1833:35;1830:55;;;1881:1;1878;1871:12;1830:55;1945:2;1938:4;1930:6;1926:17;1919:4;1911:6;1907:17;1894:54;1992:1;1968:15;;;1985:4;1964:26;1957:37;;;;1972:6;1469:555;-1:-1:-1;;;1469:555:1:o;2029:163::-;2096:20;;2156:10;2145:22;;2135:33;;2125:61;;2182:1;2179;2172:12;2197:186;2256:6;2309:2;2297:9;2288:7;2284:23;2280:32;2277:52;;;2325:1;2322;2315:12;2277:52;2348:29;2367:9;2348:29;:::i;:::-;2338:39;2197:186;-1:-1:-1;;;2197:186:1:o;2388:260::-;2456:6;2464;2517:2;2505:9;2496:7;2492:23;2488:32;2485:52;;;2533:1;2530;2523:12;2485:52;2556:29;2575:9;2556:29;:::i;:::-;2546:39;;2604:38;2638:2;2627:9;2623:18;2604:38;:::i;:::-;2594:48;;2388:260;;;;;:::o;2653:943::-;2807:6;2815;2823;2831;2839;2892:3;2880:9;2871:7;2867:23;2863:33;2860:53;;;2909:1;2906;2899:12;2860:53;2932:29;2951:9;2932:29;:::i;:::-;2922:39;;2980:38;3014:2;3003:9;2999:18;2980:38;:::i;:::-;2970:48;;3069:2;3058:9;3054:18;3041:32;3092:18;3133:2;3125:6;3122:14;3119:34;;;3149:1;3146;3139:12;3119:34;3172:61;3225:7;3216:6;3205:9;3201:22;3172:61;:::i;:::-;3162:71;;3286:2;3275:9;3271:18;3258:32;3242:48;;3315:2;3305:8;3302:16;3299:36;;;3331:1;3328;3321:12;3299:36;3354:63;3409:7;3398:8;3387:9;3383:24;3354:63;:::i;:::-;3344:73;;3470:3;3459:9;3455:19;3442:33;3426:49;;3500:2;3490:8;3487:16;3484:36;;;3516:1;3513;3506:12;3484:36;;3539:51;3582:7;3571:8;3560:9;3556:24;3539:51;:::i;:::-;3529:61;;;2653:943;;;;;;;;:::o;3601:606::-;3705:6;3713;3721;3729;3737;3790:3;3778:9;3769:7;3765:23;3761:33;3758:53;;;3807:1;3804;3797:12;3758:53;3830:29;3849:9;3830:29;:::i;:::-;3820:39;;3878:38;3912:2;3901:9;3897:18;3878:38;:::i;:::-;3868:48;;3963:2;3952:9;3948:18;3935:32;3925:42;;4014:2;4003:9;3999:18;3986:32;3976:42;;4069:3;4058:9;4054:19;4041:33;4097:18;4089:6;4086:30;4083:50;;;4129:1;4126;4119:12;4083:50;4152:49;4193:7;4184:6;4173:9;4169:22;4152:49;:::i;4212:254::-;4277:6;4285;4338:2;4326:9;4317:7;4313:23;4309:32;4306:52;;;4354:1;4351;4344:12;4306:52;4377:29;4396:9;4377:29;:::i;:::-;4367:39;;4425:35;4456:2;4445:9;4441:18;4425:35;:::i;4471:254::-;4539:6;4547;4600:2;4588:9;4579:7;4575:23;4571:32;4568:52;;;4616:1;4613;4606:12;4568:52;4639:29;4658:9;4639:29;:::i;:::-;4629:39;4715:2;4700:18;;;;4687:32;;-1:-1:-1;;;4471:254:1:o;4730:773::-;4852:6;4860;4868;4876;4929:2;4917:9;4908:7;4904:23;4900:32;4897:52;;;4945:1;4942;4935:12;4897:52;4985:9;4972:23;5014:18;5055:2;5047:6;5044:14;5041:34;;;5071:1;5068;5061:12;5041:34;5110:70;5172:7;5163:6;5152:9;5148:22;5110:70;:::i;:::-;5199:8;;-1:-1:-1;5084:96:1;-1:-1:-1;5287:2:1;5272:18;;5259:32;;-1:-1:-1;5303:16:1;;;5300:36;;;5332:1;5329;5322:12;5300:36;;5371:72;5435:7;5424:8;5413:9;5409:24;5371:72;:::i;:::-;4730:773;;;;-1:-1:-1;5462:8:1;-1:-1:-1;;;;4730:773:1:o;5508:1219::-;5626:6;5634;5687:2;5675:9;5666:7;5662:23;5658:32;5655:52;;;5703:1;5700;5693:12;5655:52;5743:9;5730:23;5772:18;5813:2;5805:6;5802:14;5799:34;;;5829:1;5826;5819:12;5799:34;5867:6;5856:9;5852:22;5842:32;;5912:7;5905:4;5901:2;5897:13;5893:27;5883:55;;5934:1;5931;5924:12;5883:55;5970:2;5957:16;5992:4;6015:43;6055:2;6015:43;:::i;:::-;6087:2;6081:9;6099:31;6127:2;6119:6;6099:31;:::i;:::-;6165:18;;;6199:15;;;;-1:-1:-1;6234:11:1;;;6276:1;6272:10;;;6264:19;;6260:28;;6257:41;-1:-1:-1;6254:61:1;;;6311:1;6308;6301:12;6254:61;6333:1;6324:10;;6343:169;6357:2;6354:1;6351:9;6343:169;;;6414:23;6433:3;6414:23;:::i;:::-;6402:36;;6375:1;6368:9;;;;;6458:12;;;;6490;;6343:169;;;-1:-1:-1;6531:6:1;-1:-1:-1;;6575:18:1;;6562:32;;-1:-1:-1;;6606:16:1;;;6603:36;;;6635:1;6632;6625:12;6603:36;;6658:63;6713:7;6702:8;6691:9;6687:24;6658:63;:::i;:::-;6648:73;;;5508:1219;;;;;:::o;6732:245::-;6790:6;6843:2;6831:9;6822:7;6818:23;6814:32;6811:52;;;6859:1;6856;6849:12;6811:52;6898:9;6885:23;6917:30;6941:5;6917:30;:::i;6982:249::-;7051:6;7104:2;7092:9;7083:7;7079:23;7075:32;7072:52;;;7120:1;7117;7110:12;7072:52;7152:9;7146:16;7171:30;7195:5;7171:30;:::i;7236:1040::-;7385:6;7393;7401;7409;7417;7425;7478:3;7466:9;7457:7;7453:23;7449:33;7446:53;;;7495:1;7492;7485:12;7446:53;7535:9;7522:23;7564:18;7605:2;7597:6;7594:14;7591:34;;;7621:1;7618;7611:12;7591:34;7644:49;7685:7;7676:6;7665:9;7661:22;7644:49;:::i;:::-;7634:59;;7746:2;7735:9;7731:18;7718:32;7702:48;;7775:2;7765:8;7762:16;7759:36;;;7791:1;7788;7781:12;7759:36;7830:72;7894:7;7883:8;7872:9;7868:24;7830:72;:::i;:::-;7921:8;;-1:-1:-1;7804:98:1;-1:-1:-1;8009:2:1;7994:18;;7981:32;;-1:-1:-1;8025:16:1;;;8022:36;;;8054:1;8051;8044:12;8022:36;;8093:72;8157:7;8146:8;8135:9;8131:24;8093:72;:::i;:::-;7236:1040;;;;-1:-1:-1;7236:1040:1;;;;;8266:2;8251:18;;;8238:32;;7236:1040;-1:-1:-1;;;;7236:1040:1:o;8281:388::-;8358:6;8366;8419:2;8407:9;8398:7;8394:23;8390:32;8387:52;;;8435:1;8432;8425:12;8387:52;8475:9;8462:23;8508:18;8500:6;8497:30;8494:50;;;8540:1;8537;8530:12;8494:50;8563:49;8604:7;8595:6;8584:9;8580:22;8563:49;:::i;:::-;8553:59;8659:2;8644:18;;;;8631:32;;-1:-1:-1;;;;8281:388:1:o;8674:180::-;8733:6;8786:2;8774:9;8765:7;8761:23;8757:32;8754:52;;;8802:1;8799;8792:12;8754:52;-1:-1:-1;8825:23:1;;8674:180;-1:-1:-1;8674:180:1:o;8859:248::-;8924:6;8932;8985:2;8973:9;8964:7;8960:23;8956:32;8953:52;;;9001:1;8998;8991:12;8953:52;9037:9;9024:23;9014:33;;9066:35;9097:2;9086:9;9082:18;9066:35;:::i;9112:184::-;9170:6;9223:2;9211:9;9202:7;9198:23;9194:32;9191:52;;;9239:1;9236;9229:12;9191:52;9262:28;9280:9;9262:28;:::i;9301:258::-;9368:6;9376;9429:2;9417:9;9408:7;9404:23;9400:32;9397:52;;;9445:1;9442;9435:12;9397:52;9468:28;9486:9;9468:28;:::i;9564:252::-;9631:6;9639;9692:2;9680:9;9671:7;9667:23;9663:32;9660:52;;;9708:1;9705;9698:12;9660:52;9731:28;9749:9;9731:28;:::i;9821:435::-;9874:3;9912:5;9906:12;9939:6;9934:3;9927:19;9965:4;9994:2;9989:3;9985:12;9978:19;;10031:2;10024:5;10020:14;10052:1;10062:169;10076:6;10073:1;10070:13;10062:169;;;10137:13;;10125:26;;10171:12;;;;10206:15;;;;10098:1;10091:9;10062:169;;;-1:-1:-1;10247:3:1;;9821:435;-1:-1:-1;;;;;9821:435:1:o;10261:257::-;10302:3;10340:5;10334:12;10367:6;10362:3;10355:19;10383:63;10439:6;10432:4;10427:3;10423:14;10416:4;10409:5;10405:16;10383:63;:::i;:::-;10500:2;10479:15;-1:-1:-1;;10475:29:1;10466:39;;;;10507:4;10462:50;;10261:257;-1:-1:-1;;10261:257:1:o;10523:482::-;10765:26;10761:31;10752:6;10748:2;10744:15;10740:53;10735:3;10728:66;10710:3;10823:6;10817:13;10839:62;10894:6;10889:2;10884:3;10880:12;10873:4;10865:6;10861:17;10839:62;:::i;:::-;10960:2;10920:16;;10952:11;;;10945:27;;;;10996:2;10988:11;;10523:482;-1:-1:-1;;;10523:482:1:o;11603:826::-;-1:-1:-1;;;;;12000:15:1;;;11982:34;;12052:15;;12047:2;12032:18;;12025:43;11962:3;12099:2;12084:18;;12077:31;;;11925:4;;12131:57;;12168:19;;12160:6;12131:57;:::i;:::-;12236:9;12228:6;12224:22;12219:2;12208:9;12204:18;12197:50;12270:44;12307:6;12299;12270:44;:::i;:::-;12256:58;;12363:9;12355:6;12351:22;12345:3;12334:9;12330:19;12323:51;12391:32;12416:6;12408;12391:32;:::i;:::-;12383:40;11603:826;-1:-1:-1;;;;;;;;11603:826:1:o;12434:560::-;-1:-1:-1;;;;;12731:15:1;;;12713:34;;12783:15;;12778:2;12763:18;;12756:43;12830:2;12815:18;;12808:34;;;12873:2;12858:18;;12851:34;;;12693:3;12916;12901:19;;12894:32;;;12656:4;;12943:45;;12968:19;;12960:6;12943:45;:::i;:::-;12935:53;12434:560;-1:-1:-1;;;;;;;12434:560:1:o;12999:261::-;13178:2;13167:9;13160:21;13141:4;13198:56;13250:2;13239:9;13235:18;13227:6;13198:56;:::i;13265:465::-;13522:2;13511:9;13504:21;13485:4;13548:56;13600:2;13589:9;13585:18;13577:6;13548:56;:::i;:::-;13652:9;13644:6;13640:22;13635:2;13624:9;13620:18;13613:50;13680:44;13717:6;13709;13680:44;:::i;:::-;13672:52;13265:465;-1:-1:-1;;;;;13265:465:1:o;14330:219::-;14479:2;14468:9;14461:21;14442:4;14499:44;14539:2;14528:9;14524:18;14516:6;14499:44;:::i;15328:404::-;15530:2;15512:21;;;15569:2;15549:18;;;15542:30;15608:34;15603:2;15588:18;;15581:62;-1:-1:-1;;;15674:2:1;15659:18;;15652:38;15722:3;15707:19;;15328:404::o;18789:341::-;18991:2;18973:21;;;19030:2;19010:18;;;19003:30;-1:-1:-1;;;19064:2:1;19049:18;;19042:47;19121:2;19106:18;;18789:341::o;19135:401::-;19337:2;19319:21;;;19376:2;19356:18;;;19349:30;19415:34;19410:2;19395:18;;19388:62;-1:-1:-1;;;19481:2:1;19466:18;;19459:35;19526:3;19511:19;;19135:401::o;20305:341::-;20507:2;20489:21;;;20546:2;20526:18;;;20519:30;-1:-1:-1;;;20580:2:1;20565:18;;20558:47;20637:2;20622:18;;20305:341::o;21054:406::-;21256:2;21238:21;;;21295:2;21275:18;;;21268:30;21334:34;21329:2;21314:18;;21307:62;-1:-1:-1;;;21400:2:1;21385:18;;21378:40;21450:3;21435:19;;21054:406::o;21465:356::-;21667:2;21649:21;;;21686:18;;;21679:30;21745:34;21740:2;21725:18;;21718:62;21812:2;21797:18;;21465:356::o;25812:183::-;25872:4;25905:18;25897:6;25894:30;25891:56;;;25927:18;;:::i;:::-;-1:-1:-1;25972:1:1;25968:14;25984:4;25964:25;;25812:183::o;26000:128::-;26040:3;26071:1;26067:6;26064:1;26061:13;26058:39;;;26077:18;;:::i;:::-;-1:-1:-1;26113:9:1;;26000:128::o;26133:228::-;26172:3;26200:10;26237:2;26234:1;26230:10;26267:2;26264:1;26260:10;26298:3;26294:2;26290:12;26285:3;26282:21;26279:47;;;26306:18;;:::i;:::-;26342:13;;26133:228;-1:-1:-1;;;;26133:228:1:o;26366:217::-;26406:1;26432;26422:132;;26476:10;26471:3;26467:20;26464:1;26457:31;26511:4;26508:1;26501:15;26539:4;26536:1;26529:15;26422:132;-1:-1:-1;26568:9:1;;26366:217::o;26588:168::-;26628:7;26694:1;26690;26686:6;26682:14;26679:1;26676:21;26671:1;26664:9;26657:17;26653:45;26650:71;;;26701:18;;:::i;:::-;-1:-1:-1;26741:9:1;;26588:168::o;26761:125::-;26801:4;26829:1;26826;26823:8;26820:34;;;26834:18;;:::i;:::-;-1:-1:-1;26871:9:1;;26761:125::o;26891:258::-;26963:1;26973:113;26987:6;26984:1;26981:13;26973:113;;;27063:11;;;27057:18;27044:11;;;27037:39;27009:2;27002:10;26973:113;;;27104:6;27101:1;27098:13;27095:48;;;27139:1;27130:6;27125:3;27121:16;27114:27;27095:48;;26891:258;;;:::o;27154:380::-;27233:1;27229:12;;;;27276;;;27297:61;;27351:4;27343:6;27339:17;27329:27;;27297:61;27404:2;27396:6;27393:14;27373:18;27370:38;27367:161;;;27450:10;27445:3;27441:20;27438:1;27431:31;27485:4;27482:1;27475:15;27513:4;27510:1;27503:15;27367:161;;27154:380;;;:::o;27539:249::-;27649:2;27630:13;;-1:-1:-1;;27626:27:1;27614:40;;27684:18;27669:34;;27705:22;;;27666:62;27663:88;;;27731:18;;:::i;:::-;27767:2;27760:22;-1:-1:-1;;27539:249:1:o;27793:135::-;27832:3;-1:-1:-1;;27853:17:1;;27850:43;;;27873:18;;:::i;:::-;-1:-1:-1;27920:1:1;27909:13;;27793:135::o;27933:127::-;27994:10;27989:3;27985:20;27982:1;27975:31;28025:4;28022:1;28015:15;28049:4;28046:1;28039:15;28065:127;28126:10;28121:3;28117:20;28114:1;28107:31;28157:4;28154:1;28147:15;28181:4;28178:1;28171:15;28197:127;28258:10;28253:3;28249:20;28246:1;28239:31;28289:4;28286:1;28279:15;28313:4;28310:1;28303:15;28329:127;28390:10;28385:3;28381:20;28378:1;28371:31;28421:4;28418:1;28411:15;28445:4;28442:1;28435:15;28461:179;28496:3;28538:1;28520:16;28517:23;28514:120;;;28584:1;28581;28578;28563:23;-1:-1:-1;28621:1:1;28615:8;28610:3;28606:18;28514:120;28461:179;:::o;28645:671::-;28684:3;28726:4;28708:16;28705:26;28702:39;;;28645:671;:::o;28702:39::-;28768:2;28762:9;-1:-1:-1;;28833:16:1;28829:25;;28826:1;28762:9;28805:50;28884:4;28878:11;28908:16;28943:18;29014:2;29007:4;28999:6;28995:17;28992:25;28987:2;28979:6;28976:14;28973:45;28970:58;;;29021:5;;;;;28645:671;:::o;28970:58::-;29058:6;29052:4;29048:17;29037:28;;29094:3;29088:10;29121:2;29113:6;29110:14;29107:27;;;29127:5;;;;;;28645:671;:::o;29107:27::-;29211:2;29192:16;29186:4;29182:27;29178:36;29171:4;29162:6;29157:3;29153:16;29149:27;29146:69;29143:82;;;29218:5;;;;;;28645:671;:::o;29143:82::-;29234:57;29285:4;29276:6;29268;29264:19;29260:30;29254:4;29234:57;:::i;:::-;-1:-1:-1;29307:3:1;;28645:671;-1:-1:-1;;;;;28645:671:1:o;29321:131::-;-1:-1:-1;;;;;;29395:32:1;;29385:43;;29375:71;;29442:1;29439;29432:12

Swarm Source

ipfs://6574b8f4c744a49a8d04332db51dbbb3d48efdfc0e1510fa88651bfb0a596f29
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.