ETH Price: $3,111.30 (+0.74%)
Gas: 3 Gwei

Token

Sins Finance Nodes (SNode)
 

Overview

Max Total Supply

1,664 SNode

Holders

721

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 SNode
0xb20c69078d7890992911f7ab33962537a8dd41e1
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:
SinsNode

Compiler Version
v0.8.9+commit.e5eed63a

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-14
*/

// SPDX-License-Identifier: MIT

// Developed by @crypt0xa
// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol
pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol
pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        external
        view
        returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol
pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/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/token/ERC721/extensions/IERC721Metadata.sol

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/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/token/ERC721/ERC721.sol
pragma solidity ^0.8.0;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

pragma solidity ^0.8.0;

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            index < ERC721.balanceOf(owner),
            "ERC721Enumerable: owner index out of bounds"
        );
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            index < ERC721Enumerable.totalSupply(),
            "ERC721Enumerable: global index out of bounds"
        );
        return _allTokens[index];
    }

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId)
        private
    {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: @openzeppelin/contracts/access/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() {
        _setOwner(_msgSender());
    }

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

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

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

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

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

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

interface IRewardPool {
    function addNodeInfo(uint _nftId, uint _nodeType, address _owner) external returns (bool);
    function updateNodeOwner(uint _nftId, address _owner) external returns (bool);
    function claimReward(uint _nftId) external returns (bool);
}

interface IERC20 {
  /**
   * @dev Returns the amount of tokens in existence.
   */
  function totalSupply() external view returns (uint256);

  /**
   * @dev Returns the amount of tokens owned by `account`.
   */
  function balanceOf(address account) external view returns (uint256);

  /**
   * @dev Moves `amount` tokens from the caller's account to `recipient`.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * Emits a {Transfer} event.
   */
  function transfer(address recipient, uint256 amount) external returns (bool);

  /**
   * @dev Returns the remaining number of tokens that `spender` will be
   * allowed to spend on behalf of `owner` through {transferFrom}. This is
   * zero by default.
   *
   * This value changes when {approve} or {transferFrom} are called.
   */
  function allowance(address owner, address spender) external view returns (uint256);

  /**
   * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * IMPORTANT: Beware that changing an allowance with this method brings the risk
   * that someone may use both the old and the new allowance by unfortunate
   * transaction ordering. One possible solution to mitigate this race
   * condition is to first reduce the spender's allowance to 0 and set the
   * desired value afterwards:
   * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
   *
   * Emits an {Approval} event.
   */
  function approve(address spender, uint256 amount) external returns (bool);

  /**
   * @dev Moves `amount` tokens from `sender` to `recipient` using the
   * allowance mechanism. `amount` is then deducted from the caller's
   * allowance.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * Emits a {Transfer} event.
   */
  function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

  /**
   * @dev Emitted when `value` tokens are moved from one account (`from`) to
   * another (`to`).
   *
   * Note that `value` may be zero.
   */
  event Transfer(address indexed from, address indexed to, uint256 value);

  /**
   * @dev Emitted when the allowance of a `spender` for an `owner` is set by
   * a call to {approve}. `value` is the new allowance.
   */
  event Approval(address indexed owner, address indexed spender, uint256 value);
}


pragma solidity ^0.8.7;


contract ControlledAccess is Ownable {
    
    
   /* 
    * @dev Requires msg.sender to have valid access message.
    * @param _v ECDSA signature parameter v.
    * @param _r ECDSA signature parameters r.
    * @param _s ECDSA signature parameters s.
    */
    modifier onlyValidAccess(uint8 _v, bytes32 _r, bytes32 _s) 
    {
        require( isValidAccessMessage(msg.sender,_v,_r,_s), "Not valid Message");
        _;
    }
 
    /* 
    * @dev Verifies if message was signed by owner to give access to _add for this contract.
    *      Assumes Geth signature prefix.
    * @param _add Address of agent with access
    * @param _v ECDSA signature parameter v.
    * @param _r ECDSA signature parameters r.
    * @param _s ECDSA signature parameters s.
    * @return Validity of access message for a given address.
    */
    function isValidAccessMessage(
        address _add,
        uint8 _v, 
        bytes32 _r, 
        bytes32 _s

        ) 
        public view returns (bool)

    {
        bytes32 msgHash = keccak256(abi.encodePacked(address(this), _add));

        bytes memory prefix = "\x19Ethereum Signed Message:\n32";
        bytes32 prefixedHash = keccak256(abi.encodePacked(prefix, msgHash));
                
        address _recovered = ecrecover(prefixedHash, _v, _r, _s);
        if (owner() == _recovered)
            {
                return true;
            }
            return false;
    }
}



pragma solidity >=0.7.0 <0.9.0;

contract SinsNode is ERC721Enumerable, Ownable, ControlledAccess{
    using Strings for uint256;
    bool public autosell = false;
    string baseURI;
    string public baseExtension = ".json";
    uint256 public maxSupply = 10000000;
    uint256 public timeDeployed;
    uint256 public allowMintingAfter = 0;
    address public Sins;
    bool public isPaused = false;
    address public rewardPool;
    mapping(uint256 => uint) public nodeType;
    IUniswapV2Router02 public uniswapV2Router;
    // tax in 1e4 (10000 = 100%)
    uint256 public tax;
    uint256[5] public mintPrices=[0,0,0,0,0];

    constructor(
        string memory _name,
        string memory _symbol,
        string memory _initBaseURI,
        uint256 _revealTime,
        address _sinsAddress
    ) ERC721(_name, _symbol) {
        if (_revealTime > block.timestamp) {
            allowMintingAfter = _revealTime;
        }
        Sins = _sinsAddress;
        timeDeployed = block.timestamp;
        setBaseURI(_initBaseURI);
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        uniswapV2Router = _uniswapV2Router;
        

    }

    receive() external payable {

  	}

    function toggleAutoSell() public  onlyOwner {
        autosell = !autosell;
    }

    function updateMintPrices(uint256[5] memory _prices) public onlyOwner{
        mintPrices = _prices;
    }

    function setRewardPool(address _rewardPool) public onlyOwner{
        rewardPool = _rewardPool;
    }

    function updateTax(uint256 _tax) public onlyOwner{
        tax = _tax;
    }

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

    function updateSinsAddress( address _sinsAddress) public onlyOwner{
        Sins = _sinsAddress;
    }

    // public
    function mint(uint _type) public payable {
        require(
            block.timestamp >= allowMintingAfter,
            "Minting now allowed yet"
        );
        require(_type>0 && _type<=5, "Invalid node type");

        uint256 supply = totalSupply();
        nodeType[supply+1] = _type;
        
        require(!isPaused);
        require(supply + 1 <= maxSupply);
        uint256 price = mintPrices[_type-1];
        uint256 _tax = (price*tax)/10000;

        if (msg.sender != owner()) {
            require(IERC20(Sins).transferFrom(msg.sender, address(this), price), "Not enough funds");
            IERC20(Sins).approve(address(uniswapV2Router), _tax);
            if (autosell) {
                swapTokensForEth(_tax);
            }
            IERC20(Sins).transfer(rewardPool, price-_tax);
        }
        _safeMint(msg.sender, supply + 1);
    }

       
    function walletOfOwner(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for (uint256 i; i < ownerTokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIds;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

        string memory currentBaseURI = _baseURI();
        return
            bytes(currentBaseURI).length > 0
                ? string(
                    abi.encodePacked(
                        currentBaseURI,
                        nodeType[tokenId].toString(),
                        baseExtension
                    )
                )
                : "";
    }

    function getSecondsUntilMinting() public view returns (uint256) {
        if (block.timestamp < allowMintingAfter) {
            return (allowMintingAfter) - block.timestamp;
        } else {
            return 0;
        }
    }


    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    function setBaseExtension(string memory _newBaseExtension)
        public
        onlyOwner
    {
        baseExtension = _newBaseExtension;
    }

    function setIsPaused(bool _state) public onlyOwner {
        isPaused = _state;
    }

    function swapTokensForEth(uint256 tokenAmount) private {

        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = Sins;
        path[1] = uniswapV2Router.WETH();

        IERC20(Sins).approve(address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
        
    }

    function sell(uint256 tokenAmount) public onlyOwner {

        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = Sins;
        path[1] = uniswapV2Router.WETH();

        IERC20(Sins).approve(address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
        
    }


    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);
        if (from == address(0)) {
            IRewardPool(rewardPool).addNodeInfo(tokenId, nodeType[tokenId], to);        
        } else if (from != to) {
            IRewardPool(rewardPool).claimReward(tokenId);        
            IRewardPool(rewardPool).updateNodeOwner(tokenId, to);
        }
    }

    function claimRewards( address _owner) public {
        uint256[] memory tokens = walletOfOwner(_owner);
        for (uint256 i; i < tokens.length; i++) {
            IRewardPool(rewardPool).claimReward(tokens[i]);
        }
    }


    function withdraw() public payable onlyOwner {
        (bool success, ) = payable(msg.sender).call{
            value: address(this).balance
        }("");
        require(success);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"uint256","name":"_revealTime","type":"uint256"},{"internalType":"address","name":"_sinsAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"Sins","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowMintingAfter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autosell","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSecondsUntilMinting","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"isValidAccessMessage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_type","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintPrices","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nodeType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"sell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setIsPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardPool","type":"address"}],"name":"setRewardPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeDeployed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleAutoSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[5]","name":"_prices","type":"uint256[5]"}],"name":"updateMintPrices","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinsAddress","type":"address"}],"name":"updateSinsAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tax","type":"uint256"}],"name":"updateTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]

600a805460ff60a01b1916905560c06040526005608081905264173539b7b760d91b60a09081526200003591600c919062000240565b5062989680600d556000600f8190556010805460ff60a01b191690556040805160a081018252828152602081018390529081018290526060810182905260808101919091526200008a906015906005620002cf565b503480156200009857600080fd5b506040516200352538038062003525833981016040819052620000bb91620003e9565b845185908590620000d490600090602085019062000240565b508051620000ea90600190602084019062000240565b50505062000107620001016200017260201b60201c565b62000176565b428211156200011657600f8290555b601080546001600160a01b0319166001600160a01b03831617905542600e556200014083620001c8565b5050601380546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d17905550620004e5915050565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a546001600160a01b03163314620002275760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b80516200023c90600b90602084019062000240565b5050565b8280546200024e90620004a8565b90600052602060002090601f016020900481019282620002725760008555620002bd565b82601f106200028d57805160ff1916838001178555620002bd565b82800160010185558215620002bd579182015b82811115620002bd578251825591602001919060010190620002a0565b50620002cb92915062000305565b5090565b8260058101928215620002bd579160200282015b82811115620002bd578251829060ff16905591602001919060010190620002e3565b5b80821115620002cb576000815560010162000306565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200034457600080fd5b81516001600160401b03808211156200036157620003616200031c565b604051601f8301601f19908116603f011681019082821181831017156200038c576200038c6200031c565b81604052838152602092508683858801011115620003a957600080fd5b600091505b83821015620003cd5785820183015181830184015290820190620003ae565b83821115620003df5760008385830101525b9695505050505050565b600080600080600060a086880312156200040257600080fd5b85516001600160401b03808211156200041a57600080fd5b6200042889838a0162000332565b965060208801519150808211156200043f57600080fd5b6200044d89838a0162000332565b955060408801519150808211156200046457600080fd5b50620004738882890162000332565b60608801516080890151919550935090506001600160a01b03811681146200049a57600080fd5b809150509295509295909350565b600181811c90821680620004bd57607f821691505b60208210811415620004df57634e487b7160e01b600052602260045260246000fd5b50919050565b61303080620004f56000396000f3fe6080604052600436106102815760003560e01c8063715018a61161014f578063b88d4fde116100c1578063e4849b321161007a578063e4849b3214610752578063e985e9c514610772578063ef5cfb8c146107bb578063f2fde38b146107db578063fa1f7b0c146107fb578063ffdcc2fa1461081b57600080fd5b8063b88d4fde146106a7578063c6682862146106c7578063c87b56dd146106dc578063cca0feb6146106fc578063d5abeb011461071c578063da3ef23f1461073257600080fd5b806399c8d5561161011357806399c8d556146106085780639fc8da1f1461061e578063a0712d681461063e578063a22cb46514610651578063a75052cb14610671578063b187bd261461068657600080fd5b8063715018a61461058a57806378238c371461059f578063872bdcdb146105bf5780638da5cb5b146105d557806395d89b41146105f357600080fd5b80632f745c59116101f357806355f804b3116101ac57806355f804b3146104d55780636187b33e146104f55780636352211e1461051557806366666aa9146105355780636677ef011461055557806370a082311461056a57600080fd5b80632f745c591461042057806332624114146104405780633ccfd60b1461046057806342842e0e14610468578063438b6300146104885780634f6ccce7146104b557600080fd5b80631694505e116102455780631694505e1461035e57806318160ddd1461037e57806319188c351461039d5780631c794b84146103b357806323b872dd146103e0578063240976bf1461040057600080fd5b806301ffc9a71461028d57806306fdde03146102c257806307848523146102e4578063081812fc14610306578063095ea7b31461033e57600080fd5b3661028857005b600080fd5b34801561029957600080fd5b506102ad6102a83660046127de565b61083c565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102d7610867565b6040516102b99190612853565b3480156102f057600080fd5b506103046102ff36600461287b565b6108f9565b005b34801561031257600080fd5b50610326610321366004612898565b61094e565b6040516001600160a01b0390911681526020016102b9565b34801561034a57600080fd5b506103046103593660046128b1565b6109e3565b34801561036a57600080fd5b50601354610326906001600160a01b031681565b34801561038a57600080fd5b506008545b6040519081526020016102b9565b3480156103a957600080fd5b5061038f600e5481565b3480156103bf57600080fd5b5061038f6103ce366004612898565b60126020526000908152604090205481565b3480156103ec57600080fd5b506103046103fb3660046128dd565b610af9565b34801561040c57600080fd5b5061030461041b36600461292c565b610b2a565b34801561042c57600080fd5b5061038f61043b3660046128b1565b610b72565b34801561044c57600080fd5b506102ad61045b366004612949565b610c08565b610304610d53565b34801561047457600080fd5b506103046104833660046128dd565b610dd5565b34801561049457600080fd5b506104a86104a336600461287b565b610df0565b6040516102b99190612995565b3480156104c157600080fd5b5061038f6104d0366004612898565b610e92565b3480156104e157600080fd5b506103046104f0366004612a65565b610f25565b34801561050157600080fd5b5061038f610510366004612898565b610f66565b34801561052157600080fd5b50610326610530366004612898565b610f7d565b34801561054157600080fd5b50601154610326906001600160a01b031681565b34801561056157600080fd5b50610304610ff4565b34801561057657600080fd5b5061038f61058536600461287b565b61103f565b34801561059657600080fd5b506103046110c6565b3480156105ab57600080fd5b506103046105ba36600461287b565b6110fc565b3480156105cb57600080fd5b5061038f600f5481565b3480156105e157600080fd5b50600a546001600160a01b0316610326565b3480156105ff57600080fd5b506102d7611148565b34801561061457600080fd5b5061038f60145481565b34801561062a57600080fd5b50601054610326906001600160a01b031681565b61030461064c366004612898565b611157565b34801561065d57600080fd5b5061030461066c366004612aae565b6114ee565b34801561067d57600080fd5b5061038f6115b3565b34801561069257600080fd5b506010546102ad90600160a01b900460ff1681565b3480156106b357600080fd5b506103046106c2366004612ae7565b6115d8565b3480156106d357600080fd5b506102d761160a565b3480156106e857600080fd5b506102d76106f7366004612898565b611698565b34801561070857600080fd5b50610304610717366004612898565b611786565b34801561072857600080fd5b5061038f600d5481565b34801561073e57600080fd5b5061030461074d366004612a65565b6117b5565b34801561075e57600080fd5b5061030461076d366004612898565b6117f2565b34801561077e57600080fd5b506102ad61078d366004612b67565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107c757600080fd5b506103046107d636600461287b565b611a02565b3480156107e757600080fd5b506103046107f636600461287b565b611acf565b34801561080757600080fd5b50610304610816366004612b95565b611b67565b34801561082757600080fd5b50600a546102ad90600160a01b900460ff1681565b60006001600160e01b0319821663780e9d6360e01b1480610861575061086182611b9e565b92915050565b60606000805461087690612c13565b80601f01602080910402602001604051908101604052809291908181526020018280546108a290612c13565b80156108ef5780601f106108c4576101008083540402835291602001916108ef565b820191906000526020600020905b8154815290600101906020018083116108d257829003601f168201915b5050505050905090565b600a546001600160a01b0316331461092c5760405162461bcd60e51b815260040161092390612c4e565b60405180910390fd5b601080546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600260205260408120546001600160a01b03166109c75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610923565b506000908152600460205260409020546001600160a01b031690565b60006109ee82610f7d565b9050806001600160a01b0316836001600160a01b03161415610a5c5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610923565b336001600160a01b0382161480610a785750610a78813361078d565b610aea5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610923565b610af48383611bee565b505050565b610b033382611c5c565b610b1f5760405162461bcd60e51b815260040161092390612c83565b610af4838383611d4f565b600a546001600160a01b03163314610b545760405162461bcd60e51b815260040161092390612c4e565b60108054911515600160a01b0260ff60a01b19909216919091179055565b6000610b7d8361103f565b8210610bdf5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610923565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6040516bffffffffffffffffffffffff1930606090811b8216602084015286901b166034820152600090819060480160408051601f1981840301815282825280516020918201208383018352601c84527f19457468657265756d205369676e6564204d6573736167653a0a333200000000848301529151919350600091610c93918491869101612cd4565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff8b169284019290925260608301899052608083018890529092509060019060a0016020604051602081039080840390855afa158015610cfe573d6000803e3d6000fd5b505050602060405103519050806001600160a01b0316610d26600a546001600160a01b031690565b6001600160a01b03161415610d42576001945050505050610d4b565b60009450505050505b949350505050565b600a546001600160a01b03163314610d7d5760405162461bcd60e51b815260040161092390612c4e565b604051600090339047908381818185875af1925050503d8060008114610dbf576040519150601f19603f3d011682016040523d82523d6000602084013e610dc4565b606091505b5050905080610dd257600080fd5b50565b610af4838383604051806020016040528060008152506115d8565b60606000610dfd8361103f565b905060008167ffffffffffffffff811115610e1a57610e1a6129d9565b604051908082528060200260200182016040528015610e43578160200160208202803683370190505b50905060005b82811015610e8a57610e5b8582610b72565b828281518110610e6d57610e6d612cf6565b602090810291909101015280610e8281612d22565b915050610e49565b509392505050565b6000610e9d60085490565b8210610f005760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610923565b60088281548110610f1357610f13612cf6565b90600052602060002001549050919050565b600a546001600160a01b03163314610f4f5760405162461bcd60e51b815260040161092390612c4e565b8051610f6290600b906020840190612702565b5050565b60158160058110610f7657600080fd5b0154905081565b6000818152600260205260408120546001600160a01b0316806108615760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610923565b600a546001600160a01b0316331461101e5760405162461bcd60e51b815260040161092390612c4e565b600a805460ff60a01b198116600160a01b9182900460ff1615909102179055565b60006001600160a01b0382166110aa5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610923565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146110f05760405162461bcd60e51b815260040161092390612c4e565b6110fa6000611efa565b565b600a546001600160a01b031633146111265760405162461bcd60e51b815260040161092390612c4e565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b60606001805461087690612c13565b600f544210156111a95760405162461bcd60e51b815260206004820152601760248201527f4d696e74696e67206e6f7720616c6c6f776564207965740000000000000000006044820152606401610923565b6000811180156111ba575060058111155b6111fa5760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964206e6f6465207479706560781b6044820152606401610923565b600061120560085490565b90508160126000611217846001612d3d565b8152602081019190915260400160002055601054600160a01b900460ff161561123f57600080fd5b600d5461124d826001612d3d565b111561125857600080fd5b60006015611267600185612d55565b6005811061127757611277612cf6565b0154905060006127106014548361128e9190612d6c565b6112989190612da1565b90506112ac600a546001600160a01b031690565b6001600160a01b0316336001600160a01b0316146114d4576010546040516323b872dd60e01b8152336004820152306024820152604481018490526001600160a01b03909116906323b872dd90606401602060405180830381600087803b15801561131657600080fd5b505af115801561132a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134e9190612db5565b61138d5760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f7567682066756e647360801b6044820152606401610923565b60105460135460405163095ea7b360e01b81526001600160a01b0391821660048201526024810184905291169063095ea7b390604401602060405180830381600087803b1580156113dd57600080fd5b505af11580156113f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114159190612db5565b50600a54600160a01b900460ff1615611431576114318161181c565b6010546011546001600160a01b039182169163a9059cbb91166114548486612d55565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561149a57600080fd5b505af11580156114ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d29190612db5565b505b6114e8336114e3856001612d3d565b611f4c565b50505050565b6001600160a01b0382163314156115475760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610923565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000600f544210156115d25742600f546115cd9190612d55565b905090565b50600090565b6115e23383611c5c565b6115fe5760405162461bcd60e51b815260040161092390612c83565b6114e884848484611f66565b600c805461161790612c13565b80601f016020809104026020016040519081016040528092919081815260200182805461164390612c13565b80156116905780601f1061166557610100808354040283529160200191611690565b820191906000526020600020905b81548152906001019060200180831161167357829003601f168201915b505050505081565b6000818152600260205260409020546060906001600160a01b03166117175760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610923565b6000611721611f99565b90506000815111611741576040518060200160405280600081525061177f565b600083815260126020526040902054819061175b90611fa8565b600c60405160200161176f93929190612dd2565b6040516020818303038152906040525b9392505050565b600a546001600160a01b031633146117b05760405162461bcd60e51b815260040161092390612c4e565b601455565b600a546001600160a01b031633146117df5760405162461bcd60e51b815260040161092390612c4e565b8051610f6290600c906020840190612702565b600a546001600160a01b0316331461181c5760405162461bcd60e51b815260040161092390612c4e565b604080516002808252606082018352600092602083019080368337505060105482519293506001600160a01b03169183915060009061185d5761185d612cf6565b6001600160a01b03928316602091820292909201810191909152601354604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156118b157600080fd5b505afa1580156118c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e99190612e96565b816001815181106118fc576118fc612cf6565b6001600160a01b03928316602091820292909201015260105460135460405163095ea7b360e01b815290831660048201526024810185905291169063095ea7b390604401602060405180830381600087803b15801561195a57600080fd5b505af115801561196e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119929190612db5565b5060135460405163791ac94760e01b81526001600160a01b039091169063791ac947906119cc908590600090869030904290600401612eb3565b600060405180830381600087803b1580156119e657600080fd5b505af11580156119fa573d6000803e3d6000fd5b505050505050565b6000611a0d82610df0565b905060005b8151811015610af45760115482516001600160a01b039091169063ae169a5090849084908110611a4457611a44612cf6565b60200260200101516040518263ffffffff1660e01b8152600401611a6a91815260200190565b602060405180830381600087803b158015611a8457600080fd5b505af1158015611a98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611abc9190612db5565b5080611ac781612d22565b915050611a12565b600a546001600160a01b03163314611af95760405162461bcd60e51b815260040161092390612c4e565b6001600160a01b038116611b5e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610923565b610dd281611efa565b600a546001600160a01b03163314611b915760405162461bcd60e51b815260040161092390612c4e565b610f626015826005612786565b60006001600160e01b031982166380ac58cd60e01b1480611bcf57506001600160e01b03198216635b5e139f60e01b145b8061086157506301ffc9a760e01b6001600160e01b0319831614610861565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611c2382610f7d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611cd55760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610923565b6000611ce083610f7d565b9050806001600160a01b0316846001600160a01b03161480611d1b5750836001600160a01b0316611d108461094e565b6001600160a01b0316145b80610d4b57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16610d4b565b826001600160a01b0316611d6282610f7d565b6001600160a01b031614611dca5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610923565b6001600160a01b038216611e2c5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610923565b611e378383836120a6565b611e42600082611bee565b6001600160a01b0383166000908152600360205260408120805460019290611e6b908490612d55565b90915550506001600160a01b0382166000908152600360205260408120805460019290611e99908490612d3d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610f6282826040518060200160405280600081525061222f565b611f71848484611d4f565b611f7d84848484612262565b6114e85760405162461bcd60e51b815260040161092390612f24565b6060600b805461087690612c13565b606081611fcc5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ff65780611fe081612d22565b9150611fef9050600a83612da1565b9150611fd0565b60008167ffffffffffffffff811115612011576120116129d9565b6040519080825280601f01601f19166020018201604052801561203b576020820181803683370190505b5090505b8415610d4b57612050600183612d55565b915061205d600a86612f76565b612068906030612d3d565b60f81b81838151811061207d5761207d612cf6565b60200101906001600160f81b031916908160001a90535061209f600a86612da1565b945061203f565b6120b183838361236c565b6001600160a01b03831661215e5760115460008281526012602052604090819020549051638b9b466760e01b81526004810184905260248101919091526001600160a01b03848116604483015290911690638b9b4667906064015b602060405180830381600087803b15801561212657600080fd5b505af115801561213a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e89190612db5565b816001600160a01b0316836001600160a01b031614610af457601154604051630ae169a560e41b8152600481018390526001600160a01b039091169063ae169a5090602401602060405180830381600087803b1580156121bd57600080fd5b505af11580156121d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f59190612db5565b50601154604051634bba4a8360e11b8152600481018390526001600160a01b0384811660248301529091169063977495069060440161210c565b6122398383612424565b6122466000848484612262565b610af45760405162461bcd60e51b815260040161092390612f24565b60006001600160a01b0384163b1561236457604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906122a6903390899088908890600401612f8a565b602060405180830381600087803b1580156122c057600080fd5b505af19250505080156122f0575060408051601f3d908101601f191682019092526122ed91810190612fc7565b60015b61234a573d80801561231e576040519150601f19603f3d011682016040523d82523d6000602084013e612323565b606091505b5080516123425760405162461bcd60e51b815260040161092390612f24565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610d4b565b506001610d4b565b6001600160a01b0383166123c7576123c281600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6123ea565b816001600160a01b0316836001600160a01b0316146123ea576123ea8382612572565b6001600160a01b03821661240157610af48161260f565b826001600160a01b0316826001600160a01b031614610af457610af482826126be565b6001600160a01b03821661247a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610923565b6000818152600260205260409020546001600160a01b0316156124df5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610923565b6124eb600083836120a6565b6001600160a01b0382166000908152600360205260408120805460019290612514908490612d3d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000600161257f8461103f565b6125899190612d55565b6000838152600760205260409020549091508082146125dc576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061262190600190612d55565b6000838152600960205260408120546008805493945090928490811061264957612649612cf6565b90600052602060002001549050806008838154811061266a5761266a612cf6565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806126a2576126a2612fe4565b6001900381819060005260206000200160009055905550505050565b60006126c98361103f565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461270e90612c13565b90600052602060002090601f0160209004810192826127305760008555612776565b82601f1061274957805160ff1916838001178555612776565b82800160010185558215612776579182015b8281111561277657825182559160200191906001019061275b565b506127829291506127b3565b5090565b8260058101928215612776579160200282018281111561277657825182559160200191906001019061275b565b5b8082111561278257600081556001016127b4565b6001600160e01b031981168114610dd257600080fd5b6000602082840312156127f057600080fd5b813561177f816127c8565b60005b838110156128165781810151838201526020016127fe565b838111156114e85750506000910152565b6000815180845261283f8160208601602086016127fb565b601f01601f19169290920160200192915050565b60208152600061177f6020830184612827565b6001600160a01b0381168114610dd257600080fd5b60006020828403121561288d57600080fd5b813561177f81612866565b6000602082840312156128aa57600080fd5b5035919050565b600080604083850312156128c457600080fd5b82356128cf81612866565b946020939093013593505050565b6000806000606084860312156128f257600080fd5b83356128fd81612866565b9250602084013561290d81612866565b929592945050506040919091013590565b8015158114610dd257600080fd5b60006020828403121561293e57600080fd5b813561177f8161291e565b6000806000806080858703121561295f57600080fd5b843561296a81612866565b9350602085013560ff8116811461298057600080fd5b93969395505050506040820135916060013590565b6020808252825182820181905260009190848201906040850190845b818110156129cd578351835292840192918401916001016129b1565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612a0a57612a0a6129d9565b604051601f8501601f19908116603f01168101908282118183101715612a3257612a326129d9565b81604052809350858152868686011115612a4b57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612a7757600080fd5b813567ffffffffffffffff811115612a8e57600080fd5b8201601f81018413612a9f57600080fd5b610d4b848235602084016129ef565b60008060408385031215612ac157600080fd5b8235612acc81612866565b91506020830135612adc8161291e565b809150509250929050565b60008060008060808587031215612afd57600080fd5b8435612b0881612866565b93506020850135612b1881612866565b925060408501359150606085013567ffffffffffffffff811115612b3b57600080fd5b8501601f81018713612b4c57600080fd5b612b5b878235602084016129ef565b91505092959194509250565b60008060408385031215612b7a57600080fd5b8235612b8581612866565b91506020830135612adc81612866565b600060a08284031215612ba757600080fd5b82601f830112612bb657600080fd5b60405160a0810181811067ffffffffffffffff82111715612bd957612bd96129d9565b6040528060a0840185811115612bee57600080fd5b845b81811015612c08578035835260209283019201612bf0565b509195945050505050565b600181811c90821680612c2757607f821691505b60208210811415612c4857634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008351612ce68184602088016127fb565b9190910191825250602001919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415612d3657612d36612d0c565b5060010190565b60008219821115612d5057612d50612d0c565b500190565b600082821015612d6757612d67612d0c565b500390565b6000816000190483118215151615612d8657612d86612d0c565b500290565b634e487b7160e01b600052601260045260246000fd5b600082612db057612db0612d8b565b500490565b600060208284031215612dc757600080fd5b815161177f8161291e565b600084516020612de58285838a016127fb565b855191840191612df88184848a016127fb565b8554920191600090600181811c9080831680612e1557607f831692505b858310811415612e3357634e487b7160e01b85526022600452602485fd5b808015612e475760018114612e5857612e85565b60ff19851688528388019550612e85565b60008b81526020902060005b85811015612e7d5781548a820152908401908801612e64565b505083880195505b50939b9a5050505050505050505050565b600060208284031215612ea857600080fd5b815161177f81612866565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612f035784516001600160a01b031683529383019391830191600101612ede565b50506001600160a01b03969096166060850152505050608001529392505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600082612f8557612f85612d8b565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612fbd90830184612827565b9695505050505050565b600060208284031215612fd957600080fd5b815161177f816127c8565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220927796867210104bcbfa4132b602fa4aa84894ad951f8a4330e1a64925d4ffce64736f6c6343000809003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000620aae16000000000000000000000000b33440566865f4433e28f90f61f0a8ec334b761e000000000000000000000000000000000000000000000000000000000000001253696e732046696e616e6365204e6f64657300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005534e6f64650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d616754647a56664658704d44374e4d646257326258635341674834503652436e4d464d5768354e4b7537466e2f00000000000000000000

Deployed Bytecode

0x6080604052600436106102815760003560e01c8063715018a61161014f578063b88d4fde116100c1578063e4849b321161007a578063e4849b3214610752578063e985e9c514610772578063ef5cfb8c146107bb578063f2fde38b146107db578063fa1f7b0c146107fb578063ffdcc2fa1461081b57600080fd5b8063b88d4fde146106a7578063c6682862146106c7578063c87b56dd146106dc578063cca0feb6146106fc578063d5abeb011461071c578063da3ef23f1461073257600080fd5b806399c8d5561161011357806399c8d556146106085780639fc8da1f1461061e578063a0712d681461063e578063a22cb46514610651578063a75052cb14610671578063b187bd261461068657600080fd5b8063715018a61461058a57806378238c371461059f578063872bdcdb146105bf5780638da5cb5b146105d557806395d89b41146105f357600080fd5b80632f745c59116101f357806355f804b3116101ac57806355f804b3146104d55780636187b33e146104f55780636352211e1461051557806366666aa9146105355780636677ef011461055557806370a082311461056a57600080fd5b80632f745c591461042057806332624114146104405780633ccfd60b1461046057806342842e0e14610468578063438b6300146104885780634f6ccce7146104b557600080fd5b80631694505e116102455780631694505e1461035e57806318160ddd1461037e57806319188c351461039d5780631c794b84146103b357806323b872dd146103e0578063240976bf1461040057600080fd5b806301ffc9a71461028d57806306fdde03146102c257806307848523146102e4578063081812fc14610306578063095ea7b31461033e57600080fd5b3661028857005b600080fd5b34801561029957600080fd5b506102ad6102a83660046127de565b61083c565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102d7610867565b6040516102b99190612853565b3480156102f057600080fd5b506103046102ff36600461287b565b6108f9565b005b34801561031257600080fd5b50610326610321366004612898565b61094e565b6040516001600160a01b0390911681526020016102b9565b34801561034a57600080fd5b506103046103593660046128b1565b6109e3565b34801561036a57600080fd5b50601354610326906001600160a01b031681565b34801561038a57600080fd5b506008545b6040519081526020016102b9565b3480156103a957600080fd5b5061038f600e5481565b3480156103bf57600080fd5b5061038f6103ce366004612898565b60126020526000908152604090205481565b3480156103ec57600080fd5b506103046103fb3660046128dd565b610af9565b34801561040c57600080fd5b5061030461041b36600461292c565b610b2a565b34801561042c57600080fd5b5061038f61043b3660046128b1565b610b72565b34801561044c57600080fd5b506102ad61045b366004612949565b610c08565b610304610d53565b34801561047457600080fd5b506103046104833660046128dd565b610dd5565b34801561049457600080fd5b506104a86104a336600461287b565b610df0565b6040516102b99190612995565b3480156104c157600080fd5b5061038f6104d0366004612898565b610e92565b3480156104e157600080fd5b506103046104f0366004612a65565b610f25565b34801561050157600080fd5b5061038f610510366004612898565b610f66565b34801561052157600080fd5b50610326610530366004612898565b610f7d565b34801561054157600080fd5b50601154610326906001600160a01b031681565b34801561056157600080fd5b50610304610ff4565b34801561057657600080fd5b5061038f61058536600461287b565b61103f565b34801561059657600080fd5b506103046110c6565b3480156105ab57600080fd5b506103046105ba36600461287b565b6110fc565b3480156105cb57600080fd5b5061038f600f5481565b3480156105e157600080fd5b50600a546001600160a01b0316610326565b3480156105ff57600080fd5b506102d7611148565b34801561061457600080fd5b5061038f60145481565b34801561062a57600080fd5b50601054610326906001600160a01b031681565b61030461064c366004612898565b611157565b34801561065d57600080fd5b5061030461066c366004612aae565b6114ee565b34801561067d57600080fd5b5061038f6115b3565b34801561069257600080fd5b506010546102ad90600160a01b900460ff1681565b3480156106b357600080fd5b506103046106c2366004612ae7565b6115d8565b3480156106d357600080fd5b506102d761160a565b3480156106e857600080fd5b506102d76106f7366004612898565b611698565b34801561070857600080fd5b50610304610717366004612898565b611786565b34801561072857600080fd5b5061038f600d5481565b34801561073e57600080fd5b5061030461074d366004612a65565b6117b5565b34801561075e57600080fd5b5061030461076d366004612898565b6117f2565b34801561077e57600080fd5b506102ad61078d366004612b67565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107c757600080fd5b506103046107d636600461287b565b611a02565b3480156107e757600080fd5b506103046107f636600461287b565b611acf565b34801561080757600080fd5b50610304610816366004612b95565b611b67565b34801561082757600080fd5b50600a546102ad90600160a01b900460ff1681565b60006001600160e01b0319821663780e9d6360e01b1480610861575061086182611b9e565b92915050565b60606000805461087690612c13565b80601f01602080910402602001604051908101604052809291908181526020018280546108a290612c13565b80156108ef5780601f106108c4576101008083540402835291602001916108ef565b820191906000526020600020905b8154815290600101906020018083116108d257829003601f168201915b5050505050905090565b600a546001600160a01b0316331461092c5760405162461bcd60e51b815260040161092390612c4e565b60405180910390fd5b601080546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600260205260408120546001600160a01b03166109c75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610923565b506000908152600460205260409020546001600160a01b031690565b60006109ee82610f7d565b9050806001600160a01b0316836001600160a01b03161415610a5c5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610923565b336001600160a01b0382161480610a785750610a78813361078d565b610aea5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610923565b610af48383611bee565b505050565b610b033382611c5c565b610b1f5760405162461bcd60e51b815260040161092390612c83565b610af4838383611d4f565b600a546001600160a01b03163314610b545760405162461bcd60e51b815260040161092390612c4e565b60108054911515600160a01b0260ff60a01b19909216919091179055565b6000610b7d8361103f565b8210610bdf5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610923565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6040516bffffffffffffffffffffffff1930606090811b8216602084015286901b166034820152600090819060480160408051601f1981840301815282825280516020918201208383018352601c84527f19457468657265756d205369676e6564204d6573736167653a0a333200000000848301529151919350600091610c93918491869101612cd4565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff8b169284019290925260608301899052608083018890529092509060019060a0016020604051602081039080840390855afa158015610cfe573d6000803e3d6000fd5b505050602060405103519050806001600160a01b0316610d26600a546001600160a01b031690565b6001600160a01b03161415610d42576001945050505050610d4b565b60009450505050505b949350505050565b600a546001600160a01b03163314610d7d5760405162461bcd60e51b815260040161092390612c4e565b604051600090339047908381818185875af1925050503d8060008114610dbf576040519150601f19603f3d011682016040523d82523d6000602084013e610dc4565b606091505b5050905080610dd257600080fd5b50565b610af4838383604051806020016040528060008152506115d8565b60606000610dfd8361103f565b905060008167ffffffffffffffff811115610e1a57610e1a6129d9565b604051908082528060200260200182016040528015610e43578160200160208202803683370190505b50905060005b82811015610e8a57610e5b8582610b72565b828281518110610e6d57610e6d612cf6565b602090810291909101015280610e8281612d22565b915050610e49565b509392505050565b6000610e9d60085490565b8210610f005760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610923565b60088281548110610f1357610f13612cf6565b90600052602060002001549050919050565b600a546001600160a01b03163314610f4f5760405162461bcd60e51b815260040161092390612c4e565b8051610f6290600b906020840190612702565b5050565b60158160058110610f7657600080fd5b0154905081565b6000818152600260205260408120546001600160a01b0316806108615760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610923565b600a546001600160a01b0316331461101e5760405162461bcd60e51b815260040161092390612c4e565b600a805460ff60a01b198116600160a01b9182900460ff1615909102179055565b60006001600160a01b0382166110aa5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610923565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146110f05760405162461bcd60e51b815260040161092390612c4e565b6110fa6000611efa565b565b600a546001600160a01b031633146111265760405162461bcd60e51b815260040161092390612c4e565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b60606001805461087690612c13565b600f544210156111a95760405162461bcd60e51b815260206004820152601760248201527f4d696e74696e67206e6f7720616c6c6f776564207965740000000000000000006044820152606401610923565b6000811180156111ba575060058111155b6111fa5760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964206e6f6465207479706560781b6044820152606401610923565b600061120560085490565b90508160126000611217846001612d3d565b8152602081019190915260400160002055601054600160a01b900460ff161561123f57600080fd5b600d5461124d826001612d3d565b111561125857600080fd5b60006015611267600185612d55565b6005811061127757611277612cf6565b0154905060006127106014548361128e9190612d6c565b6112989190612da1565b90506112ac600a546001600160a01b031690565b6001600160a01b0316336001600160a01b0316146114d4576010546040516323b872dd60e01b8152336004820152306024820152604481018490526001600160a01b03909116906323b872dd90606401602060405180830381600087803b15801561131657600080fd5b505af115801561132a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134e9190612db5565b61138d5760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f7567682066756e647360801b6044820152606401610923565b60105460135460405163095ea7b360e01b81526001600160a01b0391821660048201526024810184905291169063095ea7b390604401602060405180830381600087803b1580156113dd57600080fd5b505af11580156113f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114159190612db5565b50600a54600160a01b900460ff1615611431576114318161181c565b6010546011546001600160a01b039182169163a9059cbb91166114548486612d55565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561149a57600080fd5b505af11580156114ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d29190612db5565b505b6114e8336114e3856001612d3d565b611f4c565b50505050565b6001600160a01b0382163314156115475760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610923565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000600f544210156115d25742600f546115cd9190612d55565b905090565b50600090565b6115e23383611c5c565b6115fe5760405162461bcd60e51b815260040161092390612c83565b6114e884848484611f66565b600c805461161790612c13565b80601f016020809104026020016040519081016040528092919081815260200182805461164390612c13565b80156116905780601f1061166557610100808354040283529160200191611690565b820191906000526020600020905b81548152906001019060200180831161167357829003601f168201915b505050505081565b6000818152600260205260409020546060906001600160a01b03166117175760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610923565b6000611721611f99565b90506000815111611741576040518060200160405280600081525061177f565b600083815260126020526040902054819061175b90611fa8565b600c60405160200161176f93929190612dd2565b6040516020818303038152906040525b9392505050565b600a546001600160a01b031633146117b05760405162461bcd60e51b815260040161092390612c4e565b601455565b600a546001600160a01b031633146117df5760405162461bcd60e51b815260040161092390612c4e565b8051610f6290600c906020840190612702565b600a546001600160a01b0316331461181c5760405162461bcd60e51b815260040161092390612c4e565b604080516002808252606082018352600092602083019080368337505060105482519293506001600160a01b03169183915060009061185d5761185d612cf6565b6001600160a01b03928316602091820292909201810191909152601354604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156118b157600080fd5b505afa1580156118c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e99190612e96565b816001815181106118fc576118fc612cf6565b6001600160a01b03928316602091820292909201015260105460135460405163095ea7b360e01b815290831660048201526024810185905291169063095ea7b390604401602060405180830381600087803b15801561195a57600080fd5b505af115801561196e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119929190612db5565b5060135460405163791ac94760e01b81526001600160a01b039091169063791ac947906119cc908590600090869030904290600401612eb3565b600060405180830381600087803b1580156119e657600080fd5b505af11580156119fa573d6000803e3d6000fd5b505050505050565b6000611a0d82610df0565b905060005b8151811015610af45760115482516001600160a01b039091169063ae169a5090849084908110611a4457611a44612cf6565b60200260200101516040518263ffffffff1660e01b8152600401611a6a91815260200190565b602060405180830381600087803b158015611a8457600080fd5b505af1158015611a98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611abc9190612db5565b5080611ac781612d22565b915050611a12565b600a546001600160a01b03163314611af95760405162461bcd60e51b815260040161092390612c4e565b6001600160a01b038116611b5e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610923565b610dd281611efa565b600a546001600160a01b03163314611b915760405162461bcd60e51b815260040161092390612c4e565b610f626015826005612786565b60006001600160e01b031982166380ac58cd60e01b1480611bcf57506001600160e01b03198216635b5e139f60e01b145b8061086157506301ffc9a760e01b6001600160e01b0319831614610861565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611c2382610f7d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611cd55760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610923565b6000611ce083610f7d565b9050806001600160a01b0316846001600160a01b03161480611d1b5750836001600160a01b0316611d108461094e565b6001600160a01b0316145b80610d4b57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16610d4b565b826001600160a01b0316611d6282610f7d565b6001600160a01b031614611dca5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610923565b6001600160a01b038216611e2c5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610923565b611e378383836120a6565b611e42600082611bee565b6001600160a01b0383166000908152600360205260408120805460019290611e6b908490612d55565b90915550506001600160a01b0382166000908152600360205260408120805460019290611e99908490612d3d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610f6282826040518060200160405280600081525061222f565b611f71848484611d4f565b611f7d84848484612262565b6114e85760405162461bcd60e51b815260040161092390612f24565b6060600b805461087690612c13565b606081611fcc5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ff65780611fe081612d22565b9150611fef9050600a83612da1565b9150611fd0565b60008167ffffffffffffffff811115612011576120116129d9565b6040519080825280601f01601f19166020018201604052801561203b576020820181803683370190505b5090505b8415610d4b57612050600183612d55565b915061205d600a86612f76565b612068906030612d3d565b60f81b81838151811061207d5761207d612cf6565b60200101906001600160f81b031916908160001a90535061209f600a86612da1565b945061203f565b6120b183838361236c565b6001600160a01b03831661215e5760115460008281526012602052604090819020549051638b9b466760e01b81526004810184905260248101919091526001600160a01b03848116604483015290911690638b9b4667906064015b602060405180830381600087803b15801561212657600080fd5b505af115801561213a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e89190612db5565b816001600160a01b0316836001600160a01b031614610af457601154604051630ae169a560e41b8152600481018390526001600160a01b039091169063ae169a5090602401602060405180830381600087803b1580156121bd57600080fd5b505af11580156121d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f59190612db5565b50601154604051634bba4a8360e11b8152600481018390526001600160a01b0384811660248301529091169063977495069060440161210c565b6122398383612424565b6122466000848484612262565b610af45760405162461bcd60e51b815260040161092390612f24565b60006001600160a01b0384163b1561236457604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906122a6903390899088908890600401612f8a565b602060405180830381600087803b1580156122c057600080fd5b505af19250505080156122f0575060408051601f3d908101601f191682019092526122ed91810190612fc7565b60015b61234a573d80801561231e576040519150601f19603f3d011682016040523d82523d6000602084013e612323565b606091505b5080516123425760405162461bcd60e51b815260040161092390612f24565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610d4b565b506001610d4b565b6001600160a01b0383166123c7576123c281600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6123ea565b816001600160a01b0316836001600160a01b0316146123ea576123ea8382612572565b6001600160a01b03821661240157610af48161260f565b826001600160a01b0316826001600160a01b031614610af457610af482826126be565b6001600160a01b03821661247a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610923565b6000818152600260205260409020546001600160a01b0316156124df5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610923565b6124eb600083836120a6565b6001600160a01b0382166000908152600360205260408120805460019290612514908490612d3d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000600161257f8461103f565b6125899190612d55565b6000838152600760205260409020549091508082146125dc576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061262190600190612d55565b6000838152600960205260408120546008805493945090928490811061264957612649612cf6565b90600052602060002001549050806008838154811061266a5761266a612cf6565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806126a2576126a2612fe4565b6001900381819060005260206000200160009055905550505050565b60006126c98361103f565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461270e90612c13565b90600052602060002090601f0160209004810192826127305760008555612776565b82601f1061274957805160ff1916838001178555612776565b82800160010185558215612776579182015b8281111561277657825182559160200191906001019061275b565b506127829291506127b3565b5090565b8260058101928215612776579160200282018281111561277657825182559160200191906001019061275b565b5b8082111561278257600081556001016127b4565b6001600160e01b031981168114610dd257600080fd5b6000602082840312156127f057600080fd5b813561177f816127c8565b60005b838110156128165781810151838201526020016127fe565b838111156114e85750506000910152565b6000815180845261283f8160208601602086016127fb565b601f01601f19169290920160200192915050565b60208152600061177f6020830184612827565b6001600160a01b0381168114610dd257600080fd5b60006020828403121561288d57600080fd5b813561177f81612866565b6000602082840312156128aa57600080fd5b5035919050565b600080604083850312156128c457600080fd5b82356128cf81612866565b946020939093013593505050565b6000806000606084860312156128f257600080fd5b83356128fd81612866565b9250602084013561290d81612866565b929592945050506040919091013590565b8015158114610dd257600080fd5b60006020828403121561293e57600080fd5b813561177f8161291e565b6000806000806080858703121561295f57600080fd5b843561296a81612866565b9350602085013560ff8116811461298057600080fd5b93969395505050506040820135916060013590565b6020808252825182820181905260009190848201906040850190845b818110156129cd578351835292840192918401916001016129b1565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612a0a57612a0a6129d9565b604051601f8501601f19908116603f01168101908282118183101715612a3257612a326129d9565b81604052809350858152868686011115612a4b57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612a7757600080fd5b813567ffffffffffffffff811115612a8e57600080fd5b8201601f81018413612a9f57600080fd5b610d4b848235602084016129ef565b60008060408385031215612ac157600080fd5b8235612acc81612866565b91506020830135612adc8161291e565b809150509250929050565b60008060008060808587031215612afd57600080fd5b8435612b0881612866565b93506020850135612b1881612866565b925060408501359150606085013567ffffffffffffffff811115612b3b57600080fd5b8501601f81018713612b4c57600080fd5b612b5b878235602084016129ef565b91505092959194509250565b60008060408385031215612b7a57600080fd5b8235612b8581612866565b91506020830135612adc81612866565b600060a08284031215612ba757600080fd5b82601f830112612bb657600080fd5b60405160a0810181811067ffffffffffffffff82111715612bd957612bd96129d9565b6040528060a0840185811115612bee57600080fd5b845b81811015612c08578035835260209283019201612bf0565b509195945050505050565b600181811c90821680612c2757607f821691505b60208210811415612c4857634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008351612ce68184602088016127fb565b9190910191825250602001919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415612d3657612d36612d0c565b5060010190565b60008219821115612d5057612d50612d0c565b500190565b600082821015612d6757612d67612d0c565b500390565b6000816000190483118215151615612d8657612d86612d0c565b500290565b634e487b7160e01b600052601260045260246000fd5b600082612db057612db0612d8b565b500490565b600060208284031215612dc757600080fd5b815161177f8161291e565b600084516020612de58285838a016127fb565b855191840191612df88184848a016127fb565b8554920191600090600181811c9080831680612e1557607f831692505b858310811415612e3357634e487b7160e01b85526022600452602485fd5b808015612e475760018114612e5857612e85565b60ff19851688528388019550612e85565b60008b81526020902060005b85811015612e7d5781548a820152908401908801612e64565b505083880195505b50939b9a5050505050505050505050565b600060208284031215612ea857600080fd5b815161177f81612866565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612f035784516001600160a01b031683529383019391830191600101612ede565b50506001600160a01b03969096166060850152505050608001529392505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600082612f8557612f85612d8b565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612fbd90830184612827565b9695505050505050565b600060208284031215612fd957600080fd5b815161177f816127c8565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220927796867210104bcbfa4132b602fa4aa84894ad951f8a4330e1a64925d4ffce64736f6c63430008090033

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000620aae16000000000000000000000000b33440566865f4433e28f90f61f0a8ec334b761e000000000000000000000000000000000000000000000000000000000000001253696e732046696e616e6365204e6f64657300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005534e6f64650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d616754647a56664658704d44374e4d646257326258635341674834503652436e4d464d5768354e4b7537466e2f00000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Sins Finance Nodes
Arg [1] : _symbol (string): SNode
Arg [2] : _initBaseURI (string): ipfs://QmagTdzVfFXpMD7NMdbW2bXcSAgH4P6RCnMFMWh5NKu7Fn/
Arg [3] : _revealTime (uint256): 1644867094
Arg [4] : _sinsAddress (address): 0xB33440566865F4433e28f90f61f0A8ec334B761E

-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 00000000000000000000000000000000000000000000000000000000620aae16
Arg [4] : 000000000000000000000000b33440566865f4433e28f90f61f0a8ec334b761e
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [6] : 53696e732046696e616e6365204e6f6465730000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [8] : 534e6f6465000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [10] : 697066733a2f2f516d616754647a56664658704d44374e4d6462573262586353
Arg [11] : 41674834503652436e4d464d5768354e4b7537466e2f00000000000000000000


Deployed Bytecode Sourcemap

54303:6639:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36361:300;;;;;;;;;;-1:-1:-1;36361:300:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;36361:300:0;;;;;;;;23525:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;56097:104::-;;;;;;;;;;-1:-1:-1;56097:104:0;;;;;:::i;:::-;;:::i;:::-;;25218:308;;;;;;;;;;-1:-1:-1;25218:308:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2080:32:1;;;2062:51;;2050:2;2035:18;25218:308:0;1916:203:1;24741:411:0;;;;;;;;;;-1:-1:-1;24741:411:0;;;;;:::i;:::-;;:::i;54765:41::-;;;;;;;;;;-1:-1:-1;54765:41:0;;;;-1:-1:-1;;;;;54765:41:0;;;37164:113;;;;;;;;;;-1:-1:-1;37252:10:0;:17;37164:113;;;2825:25:1;;;2813:2;2798:18;37164:113:0;2679:177:1;54548:27:0;;;;;;;;;;;;;;;;54718:40;;;;;;;;;;-1:-1:-1;54718:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;26277:376;;;;;;;;;;-1:-1:-1;26277:376:0;;;;;:::i;:::-;;:::i;58705:87::-;;;;;;;;;;-1:-1:-1;58705:87:0;;;;;:::i;:::-;;:::i;36745:343::-;;;;;;;;;;-1:-1:-1;36745:343:0;;;;;:::i;:::-;;:::i;53644:613::-;;;;;;;;;;-1:-1:-1;53644:613:0;;;;;:::i;:::-;;:::i;60747:192::-;;;:::i;26724:185::-;;;;;;;;;;-1:-1:-1;26724:185:0;;;;;:::i;:::-;;:::i;57131:390::-;;;;;;;;;;-1:-1:-1;57131:390:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;37354:320::-;;;;;;;;;;-1:-1:-1;37354:320:0;;;;;:::i;:::-;;:::i;58434:104::-;;;;;;;;;;-1:-1:-1;58434:104:0;;;;;:::i;:::-;;:::i;54872:40::-;;;;;;;;;;-1:-1:-1;54872:40:0;;;;;:::i;:::-;;:::i;23132:326::-;;;;;;;;;;-1:-1:-1;23132:326:0;;;;;:::i;:::-;;:::i;54686:25::-;;;;;;;;;;-1:-1:-1;54686:25:0;;;;-1:-1:-1;;;;;54686:25:0;;;55560:83;;;;;;;;;;;;;:::i;22775:295::-;;;;;;;;;;-1:-1:-1;22775:295:0;;;;;:::i;:::-;;:::i;44439:94::-;;;;;;;;;;;;;:::i;55767:103::-;;;;;;;;;;-1:-1:-1;55767:103:0;;;;;:::i;:::-;;:::i;54582:36::-;;;;;;;;;;;;;;;;43788:87;;;;;;;;;;-1:-1:-1;43861:6:0;;-1:-1:-1;;;;;43861:6:0;43788:87;;23694:104;;;;;;;;;;;;;:::i;54847:18::-;;;;;;;;;;;;;;;;54625:19;;;;;;;;;;-1:-1:-1;54625:19:0;;;;-1:-1:-1;;;;;54625:19:0;;;56224:890;;;;;;:::i;:::-;;:::i;25598:327::-;;;;;;;;;;-1:-1:-1;25598:327:0;;;;;:::i;:::-;;:::i;58189:235::-;;;;;;;;;;;;;:::i;54651:28::-;;;;;;;;;;-1:-1:-1;54651:28:0;;;;-1:-1:-1;;;54651:28:0;;;;;;26980:365;;;;;;;;;;-1:-1:-1;26980:365:0;;;;;:::i;:::-;;:::i;54462:37::-;;;;;;;;;;;;;:::i;57529:652::-;;;;;;;;;;-1:-1:-1;57529:652:0;;;;;:::i;:::-;;:::i;55878:78::-;;;;;;;;;;-1:-1:-1;55878:78:0;;;;;:::i;:::-;;:::i;54506:35::-;;;;;;;;;;;;;;;;58546:151;;;;;;;;;;-1:-1:-1;58546:151:0;;;;;:::i;:::-;;:::i;59397:586::-;;;;;;;;;;-1:-1:-1;59397:586:0;;;;;:::i;:::-;;:::i;25996:214::-;;;;;;;;;;-1:-1:-1;25996:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;26167:25:0;;;26138:4;26167:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25996:214;60502:235;;;;;;;;;;-1:-1:-1;60502:235:0;;;;;:::i;:::-;;:::i;44688:229::-;;;;;;;;;;-1:-1:-1;44688:229:0;;;;;:::i;:::-;;:::i;55651:108::-;;;;;;;;;;-1:-1:-1;55651:108:0;;;;;:::i;:::-;;:::i;54406:28::-;;;;;;;;;;-1:-1:-1;54406:28:0;;;;-1:-1:-1;;;54406:28:0;;;;;;36361:300;36508:4;-1:-1:-1;;;;;;36550:50:0;;-1:-1:-1;;;36550:50:0;;:103;;;36617:36;36641:11;36617:23;:36::i;:::-;36530:123;36361:300;-1:-1:-1;;36361:300:0:o;23525:100::-;23579:13;23612:5;23605:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23525:100;:::o;56097:104::-;43861:6;;-1:-1:-1;;;;;43861:6:0;20910:10;44008:23;44000:68;;;;-1:-1:-1;;;44000:68:0;;;;;;;:::i;:::-;;;;;;;;;56174:4:::1;:19:::0;;-1:-1:-1;;;;;;56174:19:0::1;-1:-1:-1::0;;;;;56174:19:0;;;::::1;::::0;;;::::1;::::0;;56097:104::o;25218:308::-;25339:7;28981:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28981:16:0;25364:110;;;;-1:-1:-1;;;25364:110:0;;9401:2:1;25364:110:0;;;9383:21:1;9440:2;9420:18;;;9413:30;9479:34;9459:18;;;9452:62;-1:-1:-1;;;9530:18:1;;;9523:42;9582:19;;25364:110:0;9199:408:1;25364:110:0;-1:-1:-1;25494:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25494:24:0;;25218:308::o;24741:411::-;24822:13;24838:23;24853:7;24838:14;:23::i;:::-;24822:39;;24886:5;-1:-1:-1;;;;;24880:11:0;:2;-1:-1:-1;;;;;24880:11:0;;;24872:57;;;;-1:-1:-1;;;24872:57:0;;9814:2:1;24872:57:0;;;9796:21:1;9853:2;9833:18;;;9826:30;9892:34;9872:18;;;9865:62;-1:-1:-1;;;9943:18:1;;;9936:31;9984:19;;24872:57:0;9612:397:1;24872:57:0;20910:10;-1:-1:-1;;;;;24964:21:0;;;;:62;;-1:-1:-1;24989:37:0;25006:5;20910:10;25996:214;:::i;24989:37::-;24942:168;;;;-1:-1:-1;;;24942:168:0;;10216:2:1;24942:168:0;;;10198:21:1;10255:2;10235:18;;;10228:30;10294:34;10274:18;;;10267:62;10365:26;10345:18;;;10338:54;10409:19;;24942:168:0;10014:420:1;24942:168:0;25123:21;25132:2;25136:7;25123:8;:21::i;:::-;24811:341;24741:411;;:::o;26277:376::-;26486:41;20910:10;26519:7;26486:18;:41::i;:::-;26464:140;;;;-1:-1:-1;;;26464:140:0;;;;;;;:::i;:::-;26617:28;26627:4;26633:2;26637:7;26617:9;:28::i;58705:87::-;43861:6;;-1:-1:-1;;;;;43861:6:0;20910:10;44008:23;44000:68;;;;-1:-1:-1;;;44000:68:0;;;;;;;:::i;:::-;58767:8:::1;:17:::0;;;::::1;;-1:-1:-1::0;;;58767:17:0::1;-1:-1:-1::0;;;;58767:17:0;;::::1;::::0;;;::::1;::::0;;58705:87::o;36745:343::-;36887:7;36942:23;36959:5;36942:16;:23::i;:::-;36934:5;:31;36912:124;;;;-1:-1:-1;;;36912:124:0;;11059:2:1;36912:124:0;;;11041:21:1;11098:2;11078:18;;;11071:30;11137:34;11117:18;;;11110:62;-1:-1:-1;;;11188:18:1;;;11181:41;11239:19;;36912:124:0;10857:407:1;36912:124:0;-1:-1:-1;;;;;;37054:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;36745:343::o;53644:613::-;53856:37;;-1:-1:-1;;53881:4:0;11496:2:1;11492:15;;;11488:24;;53856:37:0;;;11476::1;11547:15;;;11543:24;11529:12;;;11522:46;53804:4:0;;;;11584:12:1;;53856:37:0;;;-1:-1:-1;;53856:37:0;;;;;;;;;53846:48;;53856:37;53846:48;;;;53907:56;;;;;;;;;;;;;54007:33;;53846:48;;-1:-1:-1;53907:19:0;;54007:33;;53856:37;;53846:48;;54007:33;;:::i;:::-;;;;-1:-1:-1;;54007:33:0;;;;;;;;;53997:44;;54007:33;53997:44;;;;54070:18;54091:35;;;;;;;;;12209:25:1;;;12282:4;12270:17;;12250:18;;;12243:45;;;;12304:18;;;12297:34;;;12347:18;;;12340:34;;;53997:44:0;;-1:-1:-1;54070:18:0;54091:35;;12181:19:1;;54091:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54070:56;;54152:10;-1:-1:-1;;;;;54141:21:0;:7;43861:6;;-1:-1:-1;;;;;43861:6:0;;43788:87;54141:7;-1:-1:-1;;;;;54141:21:0;;54137:86;;;54203:4;54196:11;;;;;;;;54137:86;54244:5;54237:12;;;;;;53644:613;;;;;;;:::o;60747:192::-;43861:6;;-1:-1:-1;;;;;43861:6:0;20910:10;44008:23;44000:68;;;;-1:-1:-1;;;44000:68:0;;;;;;;:::i;:::-;60822:82:::1;::::0;60804:12:::1;::::0;60830:10:::1;::::0;60868:21:::1;::::0;60804:12;60822:82;60804:12;60822:82;60868:21;60830:10;60822:82:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60803:101;;;60923:7;60915:16;;;::::0;::::1;;60792:147;60747:192::o:0;26724:185::-;26862:39;26879:4;26885:2;26889:7;26862:39;;;;;;;;;;;;:16;:39::i;57131:390::-;57218:16;57252:23;57278:17;57288:6;57278:9;:17::i;:::-;57252:43;;57306:25;57348:15;57334:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57334:30:0;;57306:58;;57380:9;57375:113;57395:15;57391:1;:19;57375:113;;;57446:30;57466:6;57474:1;57446:19;:30::i;:::-;57432:8;57441:1;57432:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;57412:3;;;;:::i;:::-;;;;57375:113;;;-1:-1:-1;57505:8:0;57131:390;-1:-1:-1;;;57131:390:0:o;37354:320::-;37474:7;37529:30;37252:10;:17;;37164:113;37529:30;37521:5;:38;37499:132;;;;-1:-1:-1;;;37499:132:0;;13201:2:1;37499:132:0;;;13183:21:1;13240:2;13220:18;;;13213:30;13279:34;13259:18;;;13252:62;-1:-1:-1;;;13330:18:1;;;13323:42;13382:19;;37499:132:0;12999:408:1;37499:132:0;37649:10;37660:5;37649:17;;;;;;;;:::i;:::-;;;;;;;;;37642:24;;37354:320;;;:::o;58434:104::-;43861:6;;-1:-1:-1;;;;;43861:6:0;20910:10;44008:23;44000:68;;;;-1:-1:-1;;;44000:68:0;;;;;;;:::i;:::-;58509:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;58434:104:::0;:::o;54872:40::-;;;;;;;;;;;;;;;-1:-1:-1;54872:40:0;:::o;23132:326::-;23249:7;23290:16;;;:7;:16;;;;;;-1:-1:-1;;;;;23290:16:0;23339:19;23317:110;;;;-1:-1:-1;;;23317:110:0;;13614:2:1;23317:110:0;;;13596:21:1;13653:2;13633:18;;;13626:30;13692:34;13672:18;;;13665:62;-1:-1:-1;;;13743:18:1;;;13736:39;13792:19;;23317:110:0;13412:405:1;55560:83:0;43861:6;;-1:-1:-1;;;;;43861:6:0;20910:10;44008:23;44000:68;;;;-1:-1:-1;;;44000:68:0;;;;;;;:::i;:::-;55627:8:::1;::::0;;-1:-1:-1;;;;55615:20:0;::::1;-1:-1:-1::0;;;55627:8:0;;;::::1;;;55626:9;55615:20:::0;;::::1;;::::0;;55560:83::o;22775:295::-;22892:7;-1:-1:-1;;;;;22939:19:0;;22917:111;;;;-1:-1:-1;;;22917:111:0;;14024:2:1;22917:111:0;;;14006:21:1;14063:2;14043:18;;;14036:30;14102:34;14082:18;;;14075:62;-1:-1:-1;;;14153:18:1;;;14146:40;14203:19;;22917:111:0;13822:406:1;22917:111:0;-1:-1:-1;;;;;;23046:16:0;;;;;:9;:16;;;;;;;22775:295::o;44439:94::-;43861:6;;-1:-1:-1;;;;;43861:6:0;20910:10;44008:23;44000:68;;;;-1:-1:-1;;;44000:68:0;;;;;;;:::i;:::-;44504:21:::1;44522:1;44504:9;:21::i;:::-;44439:94::o:0;55767:103::-;43861:6;;-1:-1:-1;;;;;43861:6:0;20910:10;44008:23;44000:68;;;;-1:-1:-1;;;44000:68:0;;;;;;;:::i;:::-;55838:10:::1;:24:::0;;-1:-1:-1;;;;;;55838:24:0::1;-1:-1:-1::0;;;;;55838:24:0;;;::::1;::::0;;;::::1;::::0;;55767:103::o;23694:104::-;23750:13;23783:7;23776:14;;;;;:::i;56224:890::-;56317:17;;56298:15;:36;;56276:109;;;;-1:-1:-1;;;56276:109:0;;14435:2:1;56276:109:0;;;14417:21:1;14474:2;14454:18;;;14447:30;14513:25;14493:18;;;14486:53;14556:18;;56276:109:0;14233:347:1;56276:109:0;56410:1;56404:5;:7;:19;;;;;56422:1;56415:5;:8;;56404:19;56396:49;;;;-1:-1:-1;;;56396:49:0;;14787:2:1;56396:49:0;;;14769:21:1;14826:2;14806:18;;;14799:30;-1:-1:-1;;;14845:18:1;;;14838:47;14902:18;;56396:49:0;14585:341:1;56396:49:0;56458:14;56475:13;37252:10;:17;;37164:113;56475:13;56458:30;-1:-1:-1;56520:5:0;56499:8;:18;56508:8;56458:30;56515:1;56508:8;:::i;:::-;56499:18;;;;;;;;;;;-1:-1:-1;56499:18:0;:26;56555:8;;-1:-1:-1;;;56555:8:0;;;;56554:9;56546:18;;;;;;56597:9;;56583:10;:6;56592:1;56583:10;:::i;:::-;:23;;56575:32;;;;;;56618:13;56634:10;56645:7;56651:1;56645:5;:7;:::i;:::-;56634:19;;;;;;;:::i;:::-;;;56618:35;;56664:12;56691:5;56686:3;;56680:5;:9;;;;:::i;:::-;56679:17;;;;:::i;:::-;56664:32;;56727:7;43861:6;;-1:-1:-1;;;;;43861:6:0;;43788:87;56727:7;-1:-1:-1;;;;;56713:21:0;:10;-1:-1:-1;;;;;56713:21:0;;56709:354;;56766:4;;56759:59;;-1:-1:-1;;;56759:59:0;;56785:10;56759:59;;;15864:34:1;56805:4:0;15914:18:1;;;15907:43;15966:18;;;15959:34;;;-1:-1:-1;;;;;56766:4:0;;;;56759:25;;15799:18:1;;56759:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56751:88;;;;-1:-1:-1;;;56751:88:0;;16456:2:1;56751:88:0;;;16438:21:1;16495:2;16475:18;;;16468:30;-1:-1:-1;;;16514:18:1;;;16507:46;16570:18;;56751:88:0;16254:340:1;56751:88:0;56861:4;;56883:15;;56854:52;;-1:-1:-1;;;56854:52:0;;-1:-1:-1;;;;;56883:15:0;;;56854:52;;;16773:51:1;16840:18;;;16833:34;;;56861:4:0;;;56854:20;;16746:18:1;;56854:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;56925:8:0;;-1:-1:-1;;;56925:8:0;;;;56921:71;;;56954:22;56971:4;56954:16;:22::i;:::-;57013:4;;57028:10;;-1:-1:-1;;;;;57013:4:0;;;;57006:21;;57028:10;57040;57046:4;57040:5;:10;:::i;:::-;57006:45;;-1:-1:-1;;;;;;57006:45:0;;;;;;;-1:-1:-1;;;;;16791:32:1;;;57006:45:0;;;16773:51:1;16840:18;;;16833:34;16746:18;;57006:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;56709:354;57073:33;57083:10;57095;:6;57104:1;57095:10;:::i;:::-;57073:9;:33::i;:::-;56265:849;;;56224:890;:::o;25598:327::-;-1:-1:-1;;;;;25733:24:0;;20910:10;25733:24;;25725:62;;;;-1:-1:-1;;;25725:62:0;;17080:2:1;25725:62:0;;;17062:21:1;17119:2;17099:18;;;17092:30;17158:27;17138:18;;;17131:55;17203:18;;25725:62:0;16878:349:1;25725:62:0;20910:10;25800:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;25800:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;25800:53:0;;;;;;;;;;25869:48;;540:41:1;;;25800:42:0;;20910:10;25869:48;;513:18:1;25869:48:0;;;;;;;25598:327;;:::o;58189:235::-;58244:7;58286:17;;58268:15;:35;58264:153;;;58349:15;58328:17;;58327:37;;;;:::i;:::-;58320:44;;58189:235;:::o;58264:153::-;-1:-1:-1;58404:1:0;;58189:235::o;26980:365::-;27169:41;20910:10;27202:7;27169:18;:41::i;:::-;27147:140;;;;-1:-1:-1;;;27147:140:0;;;;;;;:::i;:::-;27298:39;27312:4;27318:2;27322:7;27331:5;27298:13;:39::i;54462:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;57529:652::-;28957:4;28981:16;;;:7;:16;;;;;;57647:13;;-1:-1:-1;;;;;28981:16:0;57678:113;;;;-1:-1:-1;;;57678:113:0;;17434:2:1;57678:113:0;;;17416:21:1;17473:2;17453:18;;;17446:30;17512:34;17492:18;;;17485:62;-1:-1:-1;;;17563:18:1;;;17556:45;17618:19;;57678:113:0;17232:411:1;57678:113:0;57804:28;57835:10;:8;:10::i;:::-;57804:41;;57907:1;57882:14;57876:28;:32;:297;;;;;;;;;;;;;;;;;58041:17;;;;:8;:17;;;;;;58000:14;;58041:28;;:26;:28::i;:::-;58096:13;57957:175;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57876:297;57856:317;57529:652;-1:-1:-1;;;57529:652:0:o;55878:78::-;43861:6;;-1:-1:-1;;;;;43861:6:0;20910:10;44008:23;44000:68;;;;-1:-1:-1;;;44000:68:0;;;;;;;:::i;:::-;55938:3:::1;:10:::0;55878:78::o;58546:151::-;43861:6;;-1:-1:-1;;;;;43861:6:0;20910:10;44008:23;44000:68;;;;-1:-1:-1;;;44000:68:0;;;;;;;:::i;:::-;58656:33;;::::1;::::0;:13:::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;59397:586::-:0;43861:6;;-1:-1:-1;;;;;43861:6:0;20910:10;44008:23;44000:68;;;;-1:-1:-1;;;44000:68:0;;;;;;;:::i;:::-;59546:16:::1;::::0;;59560:1:::1;59546:16:::0;;;;;::::1;::::0;;59522:21:::1;::::0;59546:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;59583:4:0::1;::::0;59573:7;;;;-1:-1:-1;;;;;;59583:4:0::1;::::0;59573:7;;-1:-1:-1;59583:4:0::1;::::0;59573:7:::1;;;;:::i;:::-;-1:-1:-1::0;;;;;59573:14:0;;::::1;:7;::::0;;::::1;::::0;;;;;;:14;;;;59608:15:::1;::::0;:22:::1;::::0;;-1:-1:-1;;;59608:22:0;;;;:15;;;::::1;::::0;:20:::1;::::0;:22:::1;::::0;;::::1;::::0;59573:7;;59608:22;;;;;:15;:22;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59598:4;59603:1;59598:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;59598:32:0;;::::1;:7;::::0;;::::1;::::0;;;;;:32;59650:4:::1;::::0;59672:15:::1;::::0;59643:59:::1;::::0;-1:-1:-1;;;59643:59:0;;59672:15;;::::1;59643:59;::::0;::::1;16773:51:1::0;16840:18;;;16833:34;;;59650:4:0;::::1;::::0;59643:20:::1;::::0;16746:18:1;;59643:59:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;59741:15:0::1;::::0;:224:::1;::::0;-1:-1:-1;;;59741:224:0;;-1:-1:-1;;;;;59741:15:0;;::::1;::::0;:66:::1;::::0;:224:::1;::::0;59822:11;;59741:15:::1;::::0;59892:4;;59919::::1;::::0;59939:15:::1;::::0;59741:224:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;59449:534;59397:586:::0;:::o;60502:235::-;60559:23;60585:21;60599:6;60585:13;:21::i;:::-;60559:47;;60622:9;60617:113;60637:6;:13;60633:1;:17;60617:113;;;60684:10;;60708:9;;-1:-1:-1;;;;;60684:10:0;;;;60672:35;;60708:6;;60715:1;;60708:9;;;;;;:::i;:::-;;;;;;;60672:46;;;;;;;;;;;;;2825:25:1;;2813:2;2798:18;;2679:177;60672:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;60652:3:0;;;;:::i;:::-;;;;60617:113;;44688:229;43861:6;;-1:-1:-1;;;;;43861:6:0;20910:10;44008:23;44000:68;;;;-1:-1:-1;;;44000:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44791:22:0;::::1;44769:110;;;::::0;-1:-1:-1;;;44769:110:0;;20749:2:1;44769:110:0::1;::::0;::::1;20731:21:1::0;20788:2;20768:18;;;20761:30;20827:34;20807:18;;;20800:62;-1:-1:-1;;;20878:18:1;;;20871:36;20924:19;;44769:110:0::1;20547:402:1::0;44769:110:0::1;44890:19;44900:8;44890:9;:19::i;55651:108::-:0;43861:6;;-1:-1:-1;;;;;43861:6:0;20910:10;44008:23;44000:68;;;;-1:-1:-1;;;44000:68:0;;;;;;;:::i;:::-;55731:20:::1;:10;55744:7:::0;55731:20:::1;;:::i;22356:355::-:0;22503:4;-1:-1:-1;;;;;;22545:40:0;;-1:-1:-1;;;22545:40:0;;:105;;-1:-1:-1;;;;;;;22602:48:0;;-1:-1:-1;;;22602:48:0;22545:105;:158;;;-1:-1:-1;;;;;;;;;;7813:40:0;;;22667:36;7654:207;33015:174;33090:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;33090:29:0;-1:-1:-1;;;;;33090:29:0;;;;;;;;:24;;33144:23;33090:24;33144:14;:23::i;:::-;-1:-1:-1;;;;;33135:46:0;;;;;;;;;;;33015:174;;:::o;29186:452::-;29315:4;28981:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28981:16:0;29337:110;;;;-1:-1:-1;;;29337:110:0;;21156:2:1;29337:110:0;;;21138:21:1;21195:2;21175:18;;;21168:30;21234:34;21214:18;;;21207:62;-1:-1:-1;;;21285:18:1;;;21278:42;21337:19;;29337:110:0;20954:408:1;29337:110:0;29458:13;29474:23;29489:7;29474:14;:23::i;:::-;29458:39;;29527:5;-1:-1:-1;;;;;29516:16:0;:7;-1:-1:-1;;;;;29516:16:0;;:64;;;;29573:7;-1:-1:-1;;;;;29549:31:0;:20;29561:7;29549:11;:20::i;:::-;-1:-1:-1;;;;;29549:31:0;;29516:64;:113;;;-1:-1:-1;;;;;;26167:25:0;;;26138:4;26167:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;29597:32;25996:214;32282:615;32455:4;-1:-1:-1;;;;;32428:31:0;:23;32443:7;32428:14;:23::i;:::-;-1:-1:-1;;;;;32428:31:0;;32406:122;;;;-1:-1:-1;;;32406:122:0;;21569:2:1;32406:122:0;;;21551:21:1;21608:2;21588:18;;;21581:30;21647:34;21627:18;;;21620:62;-1:-1:-1;;;21698:18:1;;;21691:39;21747:19;;32406:122:0;21367:405:1;32406:122:0;-1:-1:-1;;;;;32547:16:0;;32539:65;;;;-1:-1:-1;;;32539:65:0;;21979:2:1;32539:65:0;;;21961:21:1;22018:2;21998:18;;;21991:30;22057:34;22037:18;;;22030:62;-1:-1:-1;;;22108:18:1;;;22101:34;22152:19;;32539:65:0;21777:400:1;32539:65:0;32617:39;32638:4;32644:2;32648:7;32617:20;:39::i;:::-;32721:29;32738:1;32742:7;32721:8;:29::i;:::-;-1:-1:-1;;;;;32763:15:0;;;;;;:9;:15;;;;;:20;;32782:1;;32763:15;:20;;32782:1;;32763:20;:::i;:::-;;;;-1:-1:-1;;;;;;;32794:13:0;;;;;;:9;:13;;;;;:18;;32811:1;;32794:13;:18;;32811:1;;32794:18;:::i;:::-;;;;-1:-1:-1;;32823:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32823:21:0;-1:-1:-1;;;;;32823:21:0;;;;;;;;;32862:27;;32823:16;;32862:27;;;;;;;32282:615;;;:::o;44925:173::-;45000:6;;;-1:-1:-1;;;;;45017:17:0;;;-1:-1:-1;;;;;;45017:17:0;;;;;;;45050:40;;45000:6;;;45017:17;45000:6;;45050:40;;44981:16;;45050:40;44970:128;44925:173;:::o;29980:110::-;30056:26;30066:2;30070:7;30056:26;;;;;;;;;;;;:9;:26::i;28227:352::-;28384:28;28394:4;28400:2;28404:7;28384:9;:28::i;:::-;28445:48;28468:4;28474:2;28478:7;28487:5;28445:22;:48::i;:::-;28423:148;;;;-1:-1:-1;;;28423:148:0;;;;;;;:::i;55981:108::-;56041:13;56074:7;56067:14;;;;;:::i;8175:723::-;8231:13;8452:10;8448:53;;-1:-1:-1;;8479:10:0;;;;;;;;;;;;-1:-1:-1;;;8479:10:0;;;;;8175:723::o;8448:53::-;8526:5;8511:12;8567:78;8574:9;;8567:78;;8600:8;;;;:::i;:::-;;-1:-1:-1;8623:10:0;;-1:-1:-1;8631:2:0;8623:10;;:::i;:::-;;;8567:78;;;8655:19;8687:6;8677:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8677:17:0;;8655:39;;8705:154;8712:10;;8705:154;;8739:11;8749:1;8739:11;;:::i;:::-;;-1:-1:-1;8808:10:0;8816:2;8808:5;:10;:::i;:::-;8795:24;;:2;:24;:::i;:::-;8782:39;;8765:6;8772;8765:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;8765:56:0;;;;;;;;-1:-1:-1;8836:11:0;8845:2;8836:11;;:::i;:::-;;;8705:154;;59993:501;60137:45;60164:4;60170:2;60174:7;60137:26;:45::i;:::-;-1:-1:-1;;;;;60197:18:0;;60193:294;;60244:10;;;60277:17;;;:8;:17;;;;;;;;60232:67;;-1:-1:-1;;;60232:67:0;;;;;22920:25:1;;;22961:18;;;22954:34;;;;-1:-1:-1;;;;;23024:32:1;;;23004:18;;;22997:60;60244:10:0;;;;60232:35;;22893:18:1;;60232:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;60193:294::-;60337:2;-1:-1:-1;;;;;60329:10:0;:4;-1:-1:-1;;;;;60329:10:0;;60325:162;;60368:10;;60356:44;;-1:-1:-1;;;60356:44:0;;;;;2825:25:1;;;-1:-1:-1;;;;;60368:10:0;;;;60356:35;;2798:18:1;;60356:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;60435:10:0;;60423:52;;-1:-1:-1;;;60423:52:0;;;;;23242:25:1;;;-1:-1:-1;;;;;23303:32:1;;;23283:18;;;23276:60;60435:10:0;;;;60423:39;;23215:18:1;;60423:52:0;23068:274:1;30317:321:0;30447:18;30453:2;30457:7;30447:5;:18::i;:::-;30498:54;30529:1;30533:2;30537:7;30546:5;30498:22;:54::i;:::-;30476:154;;;;-1:-1:-1;;;30476:154:0;;;;;;;:::i;33754:980::-;33909:4;-1:-1:-1;;;;;33930:13:0;;11051:20;11099:8;33926:801;;33983:175;;-1:-1:-1;;;33983:175:0;;-1:-1:-1;;;;;33983:36:0;;;;;:175;;20910:10;;34077:4;;34104:7;;34134:5;;33983:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33983:175:0;;;;;;;;-1:-1:-1;;33983:175:0;;;;;;;;;;;;:::i;:::-;;;33962:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34341:13:0;;34337:320;;34384:108;;-1:-1:-1;;;34384:108:0;;;;;;;:::i;34337:320::-;34607:6;34601:13;34592:6;34588:2;34584:15;34577:38;33962:710;-1:-1:-1;;;;;;34222:51:0;-1:-1:-1;;;34222:51:0;;-1:-1:-1;34215:58:0;;33926:801;-1:-1:-1;34711:4:0;34704:11;;38287:589;-1:-1:-1;;;;;38493:18:0;;38489:187;;38528:40;38560:7;39703:10;:17;;39676:24;;;;:15;:24;;;;;:44;;;39731:24;;;;;;;;;;;;39599:164;38528:40;38489:187;;;38598:2;-1:-1:-1;;;;;38590:10:0;:4;-1:-1:-1;;;;;38590:10:0;;38586:90;;38617:47;38650:4;38656:7;38617:32;:47::i;:::-;-1:-1:-1;;;;;38690:16:0;;38686:183;;38723:45;38760:7;38723:36;:45::i;38686:183::-;38796:4;-1:-1:-1;;;;;38790:10:0;:2;-1:-1:-1;;;;;38790:10:0;;38786:83;;38817:40;38845:2;38849:7;38817:27;:40::i;30974:382::-;-1:-1:-1;;;;;31054:16:0;;31046:61;;;;-1:-1:-1;;;31046:61:0;;24297:2:1;31046:61:0;;;24279:21:1;;;24316:18;;;24309:30;24375:34;24355:18;;;24348:62;24427:18;;31046:61:0;24095:356:1;31046:61:0;28957:4;28981:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28981:16:0;:30;31118:58;;;;-1:-1:-1;;;31118:58:0;;24658:2:1;31118:58:0;;;24640:21:1;24697:2;24677:18;;;24670:30;24736;24716:18;;;24709:58;24784:18;;31118:58:0;24456:352:1;31118:58:0;31189:45;31218:1;31222:2;31226:7;31189:20;:45::i;:::-;-1:-1:-1;;;;;31247:13:0;;;;;;:9;:13;;;;;:18;;31264:1;;31247:13;:18;;31264:1;;31247:18;:::i;:::-;;;;-1:-1:-1;;31276:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31276:21:0;-1:-1:-1;;;;;31276:21:0;;;;;;;;31315:33;;31276:16;;;31315:33;;31276:16;;31315:33;30974:382;;:::o;40390:1002::-;40670:22;40720:1;40695:22;40712:4;40695:16;:22::i;:::-;:26;;;;:::i;:::-;40732:18;40753:26;;;:17;:26;;;;;;40670:51;;-1:-1:-1;40886:28:0;;;40882:328;;-1:-1:-1;;;;;40953:18:0;;40931:19;40953:18;;;:12;:18;;;;;;;;:34;;;;;;;;;41004:30;;;;;;:44;;;41121:30;;:17;:30;;;;;:43;;;40882:328;-1:-1:-1;41306:26:0;;;;:17;:26;;;;;;;;41299:33;;;-1:-1:-1;;;;;41350:18:0;;;;;:12;:18;;;;;:34;;;;;;;41343:41;40390:1002::o;41687:1079::-;41965:10;:17;41940:22;;41965:21;;41985:1;;41965:21;:::i;:::-;41997:18;42018:24;;;:15;:24;;;;;;42391:10;:26;;41940:46;;-1:-1:-1;42018:24:0;;41940:46;;42391:26;;;;;;:::i;:::-;;;;;;;;;42369:48;;42455:11;42430:10;42441;42430:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;42535:28;;;:15;:28;;;;;;;:41;;;42707:24;;;;;42700:31;42742:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;41758:1008;;;41687:1079;:::o;39177:221::-;39262:14;39279:20;39296:2;39279:16;:20::i;:::-;-1:-1:-1;;;;;39310:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;39355:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;39177:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:131::-;-1:-1:-1;;;;;1418:31:1;;1408:42;;1398:70;;1464:1;1461;1454:12;1479:247;1538:6;1591:2;1579:9;1570:7;1566:23;1562:32;1559:52;;;1607:1;1604;1597:12;1559:52;1646:9;1633:23;1665:31;1690:5;1665:31;:::i;1731:180::-;1790:6;1843:2;1831:9;1822:7;1818:23;1814:32;1811:52;;;1859:1;1856;1849:12;1811:52;-1:-1:-1;1882:23:1;;1731:180;-1:-1:-1;1731:180:1:o;2124:315::-;2192:6;2200;2253:2;2241:9;2232:7;2228:23;2224:32;2221:52;;;2269:1;2266;2259:12;2221:52;2308:9;2295:23;2327:31;2352:5;2327:31;:::i;:::-;2377:5;2429:2;2414:18;;;;2401:32;;-1:-1:-1;;;2124:315:1:o;2861:456::-;2938:6;2946;2954;3007:2;2995:9;2986:7;2982:23;2978:32;2975:52;;;3023:1;3020;3013:12;2975:52;3062:9;3049:23;3081:31;3106:5;3081:31;:::i;:::-;3131:5;-1:-1:-1;3188:2:1;3173:18;;3160:32;3201:33;3160:32;3201:33;:::i;:::-;2861:456;;3253:7;;-1:-1:-1;;;3307:2:1;3292:18;;;;3279:32;;2861:456::o;3322:118::-;3408:5;3401:13;3394:21;3387:5;3384:32;3374:60;;3430:1;3427;3420:12;3445:241;3501:6;3554:2;3542:9;3533:7;3529:23;3525:32;3522:52;;;3570:1;3567;3560:12;3522:52;3609:9;3596:23;3628:28;3650:5;3628:28;:::i;3691:549::-;3775:6;3783;3791;3799;3852:3;3840:9;3831:7;3827:23;3823:33;3820:53;;;3869:1;3866;3859:12;3820:53;3908:9;3895:23;3927:31;3952:5;3927:31;:::i;:::-;3977:5;-1:-1:-1;4034:2:1;4019:18;;4006:32;4082:4;4069:18;;4057:31;;4047:59;;4102:1;4099;4092:12;4047:59;3691:549;;4125:7;;-1:-1:-1;;;;4179:2:1;4164:18;;4151:32;;4230:2;4215:18;4202:32;;3691:549::o;4245:632::-;4416:2;4468:21;;;4538:13;;4441:18;;;4560:22;;;4387:4;;4416:2;4639:15;;;;4613:2;4598:18;;;4387:4;4682:169;4696:6;4693:1;4690:13;4682:169;;;4757:13;;4745:26;;4826:15;;;;4791:12;;;;4718:1;4711:9;4682:169;;;-1:-1:-1;4868:3:1;;4245:632;-1:-1:-1;;;;;;4245:632:1:o;4882:127::-;4943:10;4938:3;4934:20;4931:1;4924:31;4974:4;4971:1;4964:15;4998:4;4995:1;4988:15;5014:632;5079:5;5109:18;5150:2;5142:6;5139:14;5136:40;;;5156:18;;:::i;:::-;5231:2;5225:9;5199:2;5285:15;;-1:-1:-1;;5281:24:1;;;5307:2;5277:33;5273:42;5261:55;;;5331:18;;;5351:22;;;5328:46;5325:72;;;5377:18;;:::i;:::-;5417:10;5413:2;5406:22;5446:6;5437:15;;5476:6;5468;5461:22;5516:3;5507:6;5502:3;5498:16;5495:25;5492:45;;;5533:1;5530;5523:12;5492:45;5583:6;5578:3;5571:4;5563:6;5559:17;5546:44;5638:1;5631:4;5622:6;5614;5610:19;5606:30;5599:41;;;;5014:632;;;;;:::o;5651:451::-;5720:6;5773:2;5761:9;5752:7;5748:23;5744:32;5741:52;;;5789:1;5786;5779:12;5741:52;5829:9;5816:23;5862:18;5854:6;5851:30;5848:50;;;5894:1;5891;5884:12;5848:50;5917:22;;5970:4;5962:13;;5958:27;-1:-1:-1;5948:55:1;;5999:1;5996;5989:12;5948:55;6022:74;6088:7;6083:2;6070:16;6065:2;6061;6057:11;6022:74;:::i;6107:382::-;6172:6;6180;6233:2;6221:9;6212:7;6208:23;6204:32;6201:52;;;6249:1;6246;6239:12;6201:52;6288:9;6275:23;6307:31;6332:5;6307:31;:::i;:::-;6357:5;-1:-1:-1;6414:2:1;6399:18;;6386:32;6427:30;6386:32;6427:30;:::i;:::-;6476:7;6466:17;;;6107:382;;;;;:::o;6494:795::-;6589:6;6597;6605;6613;6666:3;6654:9;6645:7;6641:23;6637:33;6634:53;;;6683:1;6680;6673:12;6634:53;6722:9;6709:23;6741:31;6766:5;6741:31;:::i;:::-;6791:5;-1:-1:-1;6848:2:1;6833:18;;6820:32;6861:33;6820:32;6861:33;:::i;:::-;6913:7;-1:-1:-1;6967:2:1;6952:18;;6939:32;;-1:-1:-1;7022:2:1;7007:18;;6994:32;7049:18;7038:30;;7035:50;;;7081:1;7078;7071:12;7035:50;7104:22;;7157:4;7149:13;;7145:27;-1:-1:-1;7135:55:1;;7186:1;7183;7176:12;7135:55;7209:74;7275:7;7270:2;7257:16;7252:2;7248;7244:11;7209:74;:::i;:::-;7199:84;;;6494:795;;;;;;;:::o;7294:388::-;7362:6;7370;7423:2;7411:9;7402:7;7398:23;7394:32;7391:52;;;7439:1;7436;7429:12;7391:52;7478:9;7465:23;7497:31;7522:5;7497:31;:::i;:::-;7547:5;-1:-1:-1;7604:2:1;7589:18;;7576:32;7617:33;7576:32;7617:33;:::i;7687:761::-;7769:6;7822:3;7810:9;7801:7;7797:23;7793:33;7790:53;;;7839:1;7836;7829:12;7790:53;7888:7;7881:4;7870:9;7866:20;7862:34;7852:62;;7910:1;7907;7900:12;7852:62;7943:2;7937:9;7985:3;7977:6;7973:16;8055:6;8043:10;8040:22;8019:18;8007:10;8004:34;8001:62;7998:88;;;8066:18;;:::i;:::-;8102:2;8095:22;8137:6;8181:3;8166:19;;8197;;;8194:39;;;8229:1;8226;8219:12;8194:39;8253:9;8271:146;8287:6;8282:3;8279:15;8271:146;;;8355:17;;8343:30;;8402:4;8393:14;;;;8304;8271:146;;;-1:-1:-1;8436:6:1;;7687:761;-1:-1:-1;;;;;7687:761:1:o;8453:380::-;8532:1;8528:12;;;;8575;;;8596:61;;8650:4;8642:6;8638:17;8628:27;;8596:61;8703:2;8695:6;8692:14;8672:18;8669:38;8666:161;;;8749:10;8744:3;8740:20;8737:1;8730:31;8784:4;8781:1;8774:15;8812:4;8809:1;8802:15;8666:161;;8453:380;;;:::o;8838:356::-;9040:2;9022:21;;;9059:18;;;9052:30;9118:34;9113:2;9098:18;;9091:62;9185:2;9170:18;;8838:356::o;10439:413::-;10641:2;10623:21;;;10680:2;10660:18;;;10653:30;10719:34;10714:2;10699:18;;10692:62;-1:-1:-1;;;10785:2:1;10770:18;;10763:47;10842:3;10827:19;;10439:413::o;11607:370::-;11764:3;11802:6;11796:13;11818:53;11864:6;11859:3;11852:4;11844:6;11840:17;11818:53;:::i;:::-;11893:16;;;;11918:21;;;-1:-1:-1;11966:4:1;11955:16;;11607:370;-1:-1:-1;11607:370:1:o;12595:127::-;12656:10;12651:3;12647:20;12644:1;12637:31;12687:4;12684:1;12677:15;12711:4;12708:1;12701:15;12727:127;12788:10;12783:3;12779:20;12776:1;12769:31;12819:4;12816:1;12809:15;12843:4;12840:1;12833:15;12859:135;12898:3;-1:-1:-1;;12919:17:1;;12916:43;;;12939:18;;:::i;:::-;-1:-1:-1;12986:1:1;12975:13;;12859:135::o;14931:128::-;14971:3;15002:1;14998:6;14995:1;14992:13;14989:39;;;15008:18;;:::i;:::-;-1:-1:-1;15044:9:1;;14931:128::o;15064:125::-;15104:4;15132:1;15129;15126:8;15123:34;;;15137:18;;:::i;:::-;-1:-1:-1;15174:9:1;;15064:125::o;15194:168::-;15234:7;15300:1;15296;15292:6;15288:14;15285:1;15282:21;15277:1;15270:9;15263:17;15259:45;15256:71;;;15307:18;;:::i;:::-;-1:-1:-1;15347:9:1;;15194:168::o;15367:127::-;15428:10;15423:3;15419:20;15416:1;15409:31;15459:4;15456:1;15449:15;15483:4;15480:1;15473:15;15499:120;15539:1;15565;15555:35;;15570:18;;:::i;:::-;-1:-1:-1;15604:9:1;;15499:120::o;16004:245::-;16071:6;16124:2;16112:9;16103:7;16099:23;16095:32;16092:52;;;16140:1;16137;16130:12;16092:52;16172:9;16166:16;16191:28;16213:5;16191:28;:::i;17774:1527::-;17998:3;18036:6;18030:13;18062:4;18075:51;18119:6;18114:3;18109:2;18101:6;18097:15;18075:51;:::i;:::-;18189:13;;18148:16;;;;18211:55;18189:13;18148:16;18233:15;;;18211:55;:::i;:::-;18355:13;;18288:20;;;18328:1;;18415;18437:18;;;;18490;;;;18517:93;;18595:4;18585:8;18581:19;18569:31;;18517:93;18658:2;18648:8;18645:16;18625:18;18622:40;18619:167;;;-1:-1:-1;;;18685:33:1;;18741:4;18738:1;18731:15;18771:4;18692:3;18759:17;18619:167;18802:18;18829:110;;;;18953:1;18948:328;;;;18795:481;;18829:110;-1:-1:-1;;18864:24:1;;18850:39;;18909:20;;;;-1:-1:-1;18829:110:1;;18948:328;17721:1;17714:14;;;17758:4;17745:18;;19043:1;19057:169;19071:8;19068:1;19065:15;19057:169;;;19153:14;;19138:13;;;19131:37;19196:16;;;;19088:10;;19057:169;;;19061:3;;19257:8;19250:5;19246:20;19239:27;;18795:481;-1:-1:-1;19292:3:1;;17774:1527;-1:-1:-1;;;;;;;;;;;17774:1527:1:o;19306:251::-;19376:6;19429:2;19417:9;19408:7;19404:23;19400:32;19397:52;;;19445:1;19442;19435:12;19397:52;19477:9;19471:16;19496:31;19521:5;19496:31;:::i;19562:980::-;19824:4;19872:3;19861:9;19857:19;19903:6;19892:9;19885:25;19929:2;19967:6;19962:2;19951:9;19947:18;19940:34;20010:3;20005:2;19994:9;19990:18;19983:31;20034:6;20069;20063:13;20100:6;20092;20085:22;20138:3;20127:9;20123:19;20116:26;;20177:2;20169:6;20165:15;20151:29;;20198:1;20208:195;20222:6;20219:1;20216:13;20208:195;;;20287:13;;-1:-1:-1;;;;;20283:39:1;20271:52;;20378:15;;;;20343:12;;;;20319:1;20237:9;20208:195;;;-1:-1:-1;;;;;;;20459:32:1;;;;20454:2;20439:18;;20432:60;-1:-1:-1;;;20523:3:1;20508:19;20501:35;20420:3;19562:980;-1:-1:-1;;;19562:980:1:o;22182:414::-;22384:2;22366:21;;;22423:2;22403:18;;;22396:30;22462:34;22457:2;22442:18;;22435:62;-1:-1:-1;;;22528:2:1;22513:18;;22506:48;22586:3;22571:19;;22182:414::o;22601:112::-;22633:1;22659;22649:35;;22664:18;;:::i;:::-;-1:-1:-1;22698:9:1;;22601:112::o;23347:489::-;-1:-1:-1;;;;;23616:15:1;;;23598:34;;23668:15;;23663:2;23648:18;;23641:43;23715:2;23700:18;;23693:34;;;23763:3;23758:2;23743:18;;23736:31;;;23541:4;;23784:46;;23810:19;;23802:6;23784:46;:::i;:::-;23776:54;23347:489;-1:-1:-1;;;;;;23347:489:1:o;23841:249::-;23910:6;23963:2;23951:9;23942:7;23938:23;23934:32;23931:52;;;23979:1;23976;23969:12;23931:52;24011:9;24005:16;24030:30;24054:5;24030:30;:::i;24813:127::-;24874:10;24869:3;24865:20;24862:1;24855:31;24905:4;24902:1;24895:15;24929:4;24926:1;24919:15

Swarm Source

ipfs://927796867210104bcbfa4132b602fa4aa84894ad951f8a4330e1a64925d4ffce
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.