ETH Price: $2,525.36 (+3.07%)

Token

Ecolution OG Badge (ECO)
 

Overview

Max Total Supply

19 ECO

Holders

19

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
colliseum.eth
Balance
1 ECO
0xd454ed303748bb5a433388f9508433ba5d507030
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:
Ecolution

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

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

// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)





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

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

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

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

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

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

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

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

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

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

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

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

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



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

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

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

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

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

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



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

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




// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)




// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol)





// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)



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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)





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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)



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

        return account.code.length > 0;
    }


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




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





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


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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)





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

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


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


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





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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol)



/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}


contract Ecolution is ERC721Enumerable, Ownable 
{
    using Strings for string;

    uint public MAX_TOKENS = 45;
    // uint public PRESALE_LIMIT = 2;

    // uint public constant NUMBER_RESERVED_TOKENS = 2;
    // uint256 public PRICE = 0; // 50000000000000000; //0.05 eth
    uint public perAddressLimit = 1;
    
    // bool public saleIsActive = false;
    // bool public preSaleIsActive = false;
    // bool public whitelist = false;
    // bool public revealed = true;

    // uint public reservedTokensMinted = 0;
    string private _baseTokenURI = "ipfs://QmSKfBT1ZUBssCiYDfEhSx1jBcP8ihRBqknz7ZP4TY6Sfv/";
    // string public notRevealedUri;
    bytes32 root = 0x897d2b905115d0cd918ae44771560cc740f95a4e93514137d51b6de32b2c9c01;
    mapping(address => uint) public addressMintedBalance;

    constructor() ERC721("Ecolution OG Badge", "ECO") {}

    function mintToken(bytes32[] memory proof) external
    {
        require(verify(proof), "Address not whitelisted");
        require(msg.sender == tx.origin, "No transaction from smart contracts!");
        require(totalSupply() + 1 <= MAX_TOKENS, "Purchase would exceed max supply");
        require(addressMintedBalance[msg.sender] + 1 <= perAddressLimit, "Max NFT per address exceeded");
        
        addressMintedBalance[msg.sender]++;
        _safeMint(msg.sender, totalSupply() + 1);

    }

    function setMaxTokens(uint max) public onlyOwner{
        MAX_TOKENS = max;
    }

    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 setRoot(bytes32 _root) external onlyOwner
    {
        root = _root;
    }

    function verify(bytes32[] memory proof) internal view returns (bool) 
    {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        return MerkleProof.verify(proof, root, leaf);
    }
    
    function _beforeTokenTransfer(address from, address to, uint256 tokenId)
        internal
        override(ERC721Enumerable)
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }
    
    function supportsInterface(bytes4 interfaceId) public view
        override(ERC721Enumerable) returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
    
    ////
    //URI management part
    ////
    
    function _setBaseURI(string memory baseURI) internal virtual {
        _baseTokenURI = baseURI;
    }

    function _baseURI() internal view override returns (string memory) {
        return _baseTokenURI;
    }
    
    function setBaseURI(string memory baseURI) external onlyOwner {
        _setBaseURI(baseURI);
    }
  
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

        string memory _tokenURI = super.tokenURI(tokenId);
        return bytes(_tokenURI).length > 0 ? string(abi.encodePacked(_tokenURI, ".json")) : "";
    }
    function kill() external onlyOwner{
        selfdestruct(payable(msg.sender));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"kill","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"perAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"max","type":"uint256"}],"name":"setMaxTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"}]

6080604052602d600b556001600c556040518060600160405280603681526020016200454c60369139600d90805190602001906200003f92919062000209565b507f897d2b905115d0cd918ae44771560cc740f95a4e93514137d51b6de32b2c9c0160001b600e553480156200007457600080fd5b506040518060400160405280601281526020017f45636f6c7574696f6e204f4720426164676500000000000000000000000000008152506040518060400160405280600381526020017f45434f00000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000f992919062000209565b5080600190805190602001906200011292919062000209565b50505062000135620001296200013b60201b60201c565b6200014360201b60201c565b6200031e565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200021790620002e8565b90600052602060002090601f0160209004810192826200023b576000855562000287565b82601f106200025657805160ff191683800117855562000287565b8280016001018555821562000287579182015b828111156200028657825182559160200191906001019062000269565b5b5090506200029691906200029a565b5090565b5b80821115620002b55760008160009055506001016200029b565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200030157607f821691505b60208210811415620003185762000317620002b9565b5b50919050565b61421e806200032e6000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80636007eeed116100f9578063b88d4fde11610097578063dab5f34011610071578063dab5f34014610503578063e985e9c51461051f578063f2fde38b1461054f578063f47c84c51461056b576101c4565b8063b88d4fde1461049b578063c87b56dd146104b7578063cb5a2c65146104e7576101c4565b8063715018a6116100d3578063715018a6146104395780638da5cb5b1461044357806395d89b4114610461578063a22cb4651461047f576101c4565b80636007eeed146103bb5780636352211e146103d957806370a0823114610409576101c4565b806323b872dd1161016657806342842e0e1161014057806342842e0e14610323578063438b63001461033f5780634f6ccce71461036f57806355f804b31461039f576101c4565b806323b872dd146102cd5780632f745c59146102e957806341c0e1b514610319576101c4565b8063095ea7b3116101a2578063095ea7b31461024757806311e776fe1461026357806318160ddd1461027f57806318cae2691461029d576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063081812fc14610217575b600080fd5b6101e360048036038101906101de919061296b565b610589565b6040516101f091906129b3565b60405180910390f35b61020161059b565b60405161020e9190612a67565b60405180910390f35b610231600480360381019061022c9190612abf565b61062d565b60405161023e9190612b2d565b60405180910390f35b610261600480360381019061025c9190612b74565b6106b2565b005b61027d60048036038101906102789190612abf565b6107ca565b005b610287610850565b6040516102949190612bc3565b60405180910390f35b6102b760048036038101906102b29190612bde565b61085d565b6040516102c49190612bc3565b60405180910390f35b6102e760048036038101906102e29190612c0b565b610875565b005b61030360048036038101906102fe9190612b74565b6108d5565b6040516103109190612bc3565b60405180910390f35b61032161097a565b005b61033d60048036038101906103389190612c0b565b610a0f565b005b61035960048036038101906103549190612bde565b610a2f565b6040516103669190612d1c565b60405180910390f35b61038960048036038101906103849190612abf565b610add565b6040516103969190612bc3565b60405180910390f35b6103b960048036038101906103b49190612e73565b610b4e565b005b6103c3610bd6565b6040516103d09190612bc3565b60405180910390f35b6103f360048036038101906103ee9190612abf565b610bdc565b6040516104009190612b2d565b60405180910390f35b610423600480360381019061041e9190612bde565b610c8e565b6040516104309190612bc3565b60405180910390f35b610441610d46565b005b61044b610dce565b6040516104589190612b2d565b60405180910390f35b610469610df8565b6040516104769190612a67565b60405180910390f35b61049960048036038101906104949190612ee8565b610e8a565b005b6104b560048036038101906104b09190612fc9565b610ea0565b005b6104d160048036038101906104cc9190612abf565b610f02565b6040516104de9190612a67565b60405180910390f35b61050160048036038101906104fc919061314a565b610fa0565b005b61051d60048036038101906105189190613193565b6111b3565b005b610539600480360381019061053491906131c0565b611239565b60405161054691906129b3565b60405180910390f35b61056960048036038101906105649190612bde565b6112cd565b005b6105736113c5565b6040516105809190612bc3565b60405180910390f35b6000610594826113cb565b9050919050565b6060600080546105aa9061322f565b80601f01602080910402602001604051908101604052809291908181526020018280546105d69061322f565b80156106235780601f106105f857610100808354040283529160200191610623565b820191906000526020600020905b81548152906001019060200180831161060657829003601f168201915b5050505050905090565b600061063882611445565b610677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066e906132d3565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106bd82610bdc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561072e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072590613365565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661074d6114b1565b73ffffffffffffffffffffffffffffffffffffffff16148061077c575061077b816107766114b1565b611239565b5b6107bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b2906133f7565b60405180910390fd5b6107c583836114b9565b505050565b6107d26114b1565b73ffffffffffffffffffffffffffffffffffffffff166107f0610dce565b73ffffffffffffffffffffffffffffffffffffffff1614610846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083d90613463565b60405180910390fd5b80600b8190555050565b6000600880549050905090565b600f6020528060005260406000206000915090505481565b6108866108806114b1565b82611572565b6108c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108bc906134f5565b60405180910390fd5b6108d0838383611650565b505050565b60006108e083610c8e565b8210610921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091890613587565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6109826114b1565b73ffffffffffffffffffffffffffffffffffffffff166109a0610dce565b73ffffffffffffffffffffffffffffffffffffffff16146109f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ed90613463565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16ff5b610a2a83838360405180602001604052806000815250610ea0565b505050565b60606000610a3c83610c8e565b905060008167ffffffffffffffff811115610a5a57610a59612d48565b5b604051908082528060200260200182016040528015610a885781602001602082028036833780820191505090505b50905060005b82811015610ad257610aa085826108d5565b828281518110610ab357610ab26135a7565b5b6020026020010181815250508080610aca90613605565b915050610a8e565b508092505050919050565b6000610ae7610850565b8210610b28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1f906136c0565b60405180910390fd5b60088281548110610b3c57610b3b6135a7565b5b90600052602060002001549050919050565b610b566114b1565b73ffffffffffffffffffffffffffffffffffffffff16610b74610dce565b73ffffffffffffffffffffffffffffffffffffffff1614610bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc190613463565b60405180910390fd5b610bd3816118b7565b50565b600c5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7c90613752565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610cff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf6906137e4565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d4e6114b1565b73ffffffffffffffffffffffffffffffffffffffff16610d6c610dce565b73ffffffffffffffffffffffffffffffffffffffff1614610dc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db990613463565b60405180910390fd5b610dcc60006118d1565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610e079061322f565b80601f0160208091040260200160405190810160405280929190818152602001828054610e339061322f565b8015610e805780601f10610e5557610100808354040283529160200191610e80565b820191906000526020600020905b815481529060010190602001808311610e6357829003601f168201915b5050505050905090565b610e9c610e956114b1565b8383611997565b5050565b610eb1610eab6114b1565b83611572565b610ef0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee7906134f5565b60405180910390fd5b610efc84848484611b04565b50505050565b6060610f0d82611445565b610f4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4390613876565b60405180910390fd5b6000610f5783611b60565b90506000815111610f775760405180602001604052806000815250610f98565b80604051602001610f88919061391e565b6040516020818303038152906040525b915050919050565b610fa981611c07565b610fe8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdf9061398c565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611056576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104d90613a1e565b60405180910390fd5b600b546001611063610850565b61106d9190613a3e565b11156110ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a590613ae0565b60405180910390fd5b600c546001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110fd9190613a3e565b111561113e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113590613b4c565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061118e90613605565b91905055506111b03360016111a1610850565b6111ab9190613a3e565b611c48565b50565b6111bb6114b1565b73ffffffffffffffffffffffffffffffffffffffff166111d9610dce565b73ffffffffffffffffffffffffffffffffffffffff161461122f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122690613463565b60405180910390fd5b80600e8190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6112d56114b1565b73ffffffffffffffffffffffffffffffffffffffff166112f3610dce565b73ffffffffffffffffffffffffffffffffffffffff1614611349576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134090613463565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b090613bde565b60405180910390fd5b6113c2816118d1565b50565b600b5481565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061143e575061143d82611c66565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661152c83610bdc565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061157d82611445565b6115bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b390613c70565b60405180910390fd5b60006115c783610bdc565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061160957506116088185611239565b5b8061164757508373ffffffffffffffffffffffffffffffffffffffff1661162f8461062d565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661167082610bdc565b73ffffffffffffffffffffffffffffffffffffffff16146116c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bd90613d02565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172d90613d94565b60405180910390fd5b611741838383611d48565b61174c6000826114b9565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461179c9190613db4565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117f39190613a3e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46118b2838383611d58565b505050565b80600d90805190602001906118cd92919061285c565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611a06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fd90613e34565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611af791906129b3565b60405180910390a3505050565b611b0f848484611650565b611b1b84848484611d5d565b611b5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5190613ec6565b60405180910390fd5b50505050565b6060611b6b82611445565b611baa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba190613876565b60405180910390fd5b6000611bb4611ee5565b90506000815111611bd45760405180602001604052806000815250611bff565b80611bde84611f77565b604051602001611bef929190613ee6565b6040516020818303038152906040525b915050919050565b60008033604051602001611c1b9190613f52565b604051602081830303815290604052805190602001209050611c4083600e54836120d8565b915050919050565b611c628282604051806020016040528060008152506120ef565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d3157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d415750611d408261214a565b5b9050919050565b611d538383836121b4565b505050565b505050565b6000611d7e8473ffffffffffffffffffffffffffffffffffffffff166122c8565b15611ed8578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611da76114b1565b8786866040518563ffffffff1660e01b8152600401611dc99493929190613fc2565b6020604051808303816000875af1925050508015611e0557506040513d601f19601f82011682018060405250810190611e029190614023565b60015b611e88573d8060008114611e35576040519150601f19603f3d011682016040523d82523d6000602084013e611e3a565b606091505b50600081511415611e80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7790613ec6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611edd565b600190505b949350505050565b6060600d8054611ef49061322f565b80601f0160208091040260200160405190810160405280929190818152602001828054611f209061322f565b8015611f6d5780601f10611f4257610100808354040283529160200191611f6d565b820191906000526020600020905b815481529060010190602001808311611f5057829003601f168201915b5050505050905090565b60606000821415611fbf576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506120d3565b600082905060005b60008214611ff1578080611fda90613605565b915050600a82611fea919061407f565b9150611fc7565b60008167ffffffffffffffff81111561200d5761200c612d48565b5b6040519080825280601f01601f19166020018201604052801561203f5781602001600182028036833780820191505090505b5090505b600085146120cc576001826120589190613db4565b9150600a8561206791906140b0565b60306120739190613a3e565b60f81b818381518110612089576120886135a7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120c5919061407f565b9450612043565b8093505050505b919050565b6000826120e585846122eb565b1490509392505050565b6120f98383612360565b6121066000848484611d5d565b612145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213c90613ec6565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6121bf83838361253a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612202576121fd8161253f565b612241565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146122405761223f8382612588565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122845761227f816126f5565b6122c3565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146122c2576122c182826127c6565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008082905060005b8451811015612355576000858281518110612312576123116135a7565b5b602002602001015190508083116123345761232d8382612845565b9250612341565b61233e8184612845565b92505b50808061234d90613605565b9150506122f4565b508091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c79061412d565b60405180910390fd5b6123d981611445565b15612419576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241090614199565b60405180910390fd5b61242560008383611d48565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124759190613a3e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461253660008383611d58565b5050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161259584610c8e565b61259f9190613db4565b9050600060076000848152602001908152602001600020549050818114612684576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506127099190613db4565b9050600060096000848152602001908152602001600020549050600060088381548110612739576127386135a7565b5b90600052602060002001549050806008838154811061275b5761275a6135a7565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806127aa576127a96141b9565b5b6001900381819060005260206000200160009055905550505050565b60006127d183610c8e565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600082600052816020526040600020905092915050565b8280546128689061322f565b90600052602060002090601f01602090048101928261288a57600085556128d1565b82601f106128a357805160ff19168380011785556128d1565b828001600101855582156128d1579182015b828111156128d05782518255916020019190600101906128b5565b5b5090506128de91906128e2565b5090565b5b808211156128fb5760008160009055506001016128e3565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61294881612913565b811461295357600080fd5b50565b6000813590506129658161293f565b92915050565b60006020828403121561298157612980612909565b5b600061298f84828501612956565b91505092915050565b60008115159050919050565b6129ad81612998565b82525050565b60006020820190506129c860008301846129a4565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612a085780820151818401526020810190506129ed565b83811115612a17576000848401525b50505050565b6000601f19601f8301169050919050565b6000612a39826129ce565b612a4381856129d9565b9350612a538185602086016129ea565b612a5c81612a1d565b840191505092915050565b60006020820190508181036000830152612a818184612a2e565b905092915050565b6000819050919050565b612a9c81612a89565b8114612aa757600080fd5b50565b600081359050612ab981612a93565b92915050565b600060208284031215612ad557612ad4612909565b5b6000612ae384828501612aaa565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612b1782612aec565b9050919050565b612b2781612b0c565b82525050565b6000602082019050612b426000830184612b1e565b92915050565b612b5181612b0c565b8114612b5c57600080fd5b50565b600081359050612b6e81612b48565b92915050565b60008060408385031215612b8b57612b8a612909565b5b6000612b9985828601612b5f565b9250506020612baa85828601612aaa565b9150509250929050565b612bbd81612a89565b82525050565b6000602082019050612bd86000830184612bb4565b92915050565b600060208284031215612bf457612bf3612909565b5b6000612c0284828501612b5f565b91505092915050565b600080600060608486031215612c2457612c23612909565b5b6000612c3286828701612b5f565b9350506020612c4386828701612b5f565b9250506040612c5486828701612aaa565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612c9381612a89565b82525050565b6000612ca58383612c8a565b60208301905092915050565b6000602082019050919050565b6000612cc982612c5e565b612cd38185612c69565b9350612cde83612c7a565b8060005b83811015612d0f578151612cf68882612c99565b9750612d0183612cb1565b925050600181019050612ce2565b5085935050505092915050565b60006020820190508181036000830152612d368184612cbe565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612d8082612a1d565b810181811067ffffffffffffffff82111715612d9f57612d9e612d48565b5b80604052505050565b6000612db26128ff565b9050612dbe8282612d77565b919050565b600067ffffffffffffffff821115612dde57612ddd612d48565b5b612de782612a1d565b9050602081019050919050565b82818337600083830152505050565b6000612e16612e1184612dc3565b612da8565b905082815260208101848484011115612e3257612e31612d43565b5b612e3d848285612df4565b509392505050565b600082601f830112612e5a57612e59612d3e565b5b8135612e6a848260208601612e03565b91505092915050565b600060208284031215612e8957612e88612909565b5b600082013567ffffffffffffffff811115612ea757612ea661290e565b5b612eb384828501612e45565b91505092915050565b612ec581612998565b8114612ed057600080fd5b50565b600081359050612ee281612ebc565b92915050565b60008060408385031215612eff57612efe612909565b5b6000612f0d85828601612b5f565b9250506020612f1e85828601612ed3565b9150509250929050565b600067ffffffffffffffff821115612f4357612f42612d48565b5b612f4c82612a1d565b9050602081019050919050565b6000612f6c612f6784612f28565b612da8565b905082815260208101848484011115612f8857612f87612d43565b5b612f93848285612df4565b509392505050565b600082601f830112612fb057612faf612d3e565b5b8135612fc0848260208601612f59565b91505092915050565b60008060008060808587031215612fe357612fe2612909565b5b6000612ff187828801612b5f565b945050602061300287828801612b5f565b935050604061301387828801612aaa565b925050606085013567ffffffffffffffff8111156130345761303361290e565b5b61304087828801612f9b565b91505092959194509250565b600067ffffffffffffffff82111561306757613066612d48565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b6130908161307d565b811461309b57600080fd5b50565b6000813590506130ad81613087565b92915050565b60006130c66130c18461304c565b612da8565b905080838252602082019050602084028301858111156130e9576130e8613078565b5b835b8181101561311257806130fe888261309e565b8452602084019350506020810190506130eb565b5050509392505050565b600082601f83011261313157613130612d3e565b5b81356131418482602086016130b3565b91505092915050565b6000602082840312156131605761315f612909565b5b600082013567ffffffffffffffff81111561317e5761317d61290e565b5b61318a8482850161311c565b91505092915050565b6000602082840312156131a9576131a8612909565b5b60006131b78482850161309e565b91505092915050565b600080604083850312156131d7576131d6612909565b5b60006131e585828601612b5f565b92505060206131f685828601612b5f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061324757607f821691505b6020821081141561325b5761325a613200565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006132bd602c836129d9565b91506132c882613261565b604082019050919050565b600060208201905081810360008301526132ec816132b0565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061334f6021836129d9565b915061335a826132f3565b604082019050919050565b6000602082019050818103600083015261337e81613342565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006133e16038836129d9565b91506133ec82613385565b604082019050919050565b60006020820190508181036000830152613410816133d4565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061344d6020836129d9565b915061345882613417565b602082019050919050565b6000602082019050818103600083015261347c81613440565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006134df6031836129d9565b91506134ea82613483565b604082019050919050565b6000602082019050818103600083015261350e816134d2565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613571602b836129d9565b915061357c82613515565b604082019050919050565b600060208201905081810360008301526135a081613564565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061361082612a89565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613643576136426135d6565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006136aa602c836129d9565b91506136b58261364e565b604082019050919050565b600060208201905081810360008301526136d98161369d565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061373c6029836129d9565b9150613747826136e0565b604082019050919050565b6000602082019050818103600083015261376b8161372f565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006137ce602a836129d9565b91506137d982613772565b604082019050919050565b600060208201905081810360008301526137fd816137c1565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613860602f836129d9565b915061386b82613804565b604082019050919050565b6000602082019050818103600083015261388f81613853565b9050919050565b600081905092915050565b60006138ac826129ce565b6138b68185613896565b93506138c68185602086016129ea565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613908600583613896565b9150613913826138d2565b600582019050919050565b600061392a82846138a1565b9150613935826138fb565b915081905092915050565b7f41646472657373206e6f742077686974656c6973746564000000000000000000600082015250565b60006139766017836129d9565b915061398182613940565b602082019050919050565b600060208201905081810360008301526139a581613969565b9050919050565b7f4e6f207472616e73616374696f6e2066726f6d20736d61727420636f6e74726160008201527f6374732100000000000000000000000000000000000000000000000000000000602082015250565b6000613a086024836129d9565b9150613a13826139ac565b604082019050919050565b60006020820190508181036000830152613a37816139fb565b9050919050565b6000613a4982612a89565b9150613a5483612a89565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a8957613a886135d6565b5b828201905092915050565b7f507572636861736520776f756c6420657863656564206d617820737570706c79600082015250565b6000613aca6020836129d9565b9150613ad582613a94565b602082019050919050565b60006020820190508181036000830152613af981613abd565b9050919050565b7f4d6178204e465420706572206164647265737320657863656564656400000000600082015250565b6000613b36601c836129d9565b9150613b4182613b00565b602082019050919050565b60006020820190508181036000830152613b6581613b29565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613bc86026836129d9565b9150613bd382613b6c565b604082019050919050565b60006020820190508181036000830152613bf781613bbb565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613c5a602c836129d9565b9150613c6582613bfe565b604082019050919050565b60006020820190508181036000830152613c8981613c4d565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613cec6025836129d9565b9150613cf782613c90565b604082019050919050565b60006020820190508181036000830152613d1b81613cdf565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613d7e6024836129d9565b9150613d8982613d22565b604082019050919050565b60006020820190508181036000830152613dad81613d71565b9050919050565b6000613dbf82612a89565b9150613dca83612a89565b925082821015613ddd57613ddc6135d6565b5b828203905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613e1e6019836129d9565b9150613e2982613de8565b602082019050919050565b60006020820190508181036000830152613e4d81613e11565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613eb06032836129d9565b9150613ebb82613e54565b604082019050919050565b60006020820190508181036000830152613edf81613ea3565b9050919050565b6000613ef282856138a1565b9150613efe82846138a1565b91508190509392505050565b60008160601b9050919050565b6000613f2282613f0a565b9050919050565b6000613f3482613f17565b9050919050565b613f4c613f4782612b0c565b613f29565b82525050565b6000613f5e8284613f3b565b60148201915081905092915050565b600081519050919050565b600082825260208201905092915050565b6000613f9482613f6d565b613f9e8185613f78565b9350613fae8185602086016129ea565b613fb781612a1d565b840191505092915050565b6000608082019050613fd76000830187612b1e565b613fe46020830186612b1e565b613ff16040830185612bb4565b81810360608301526140038184613f89565b905095945050505050565b60008151905061401d8161293f565b92915050565b60006020828403121561403957614038612909565b5b60006140478482850161400e565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061408a82612a89565b915061409583612a89565b9250826140a5576140a4614050565b5b828204905092915050565b60006140bb82612a89565b91506140c683612a89565b9250826140d6576140d5614050565b5b828206905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006141176020836129d9565b9150614122826140e1565b602082019050919050565b600060208201905081810360008301526141468161410a565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614183601c836129d9565b915061418e8261414d565b602082019050919050565b600060208201905081810360008301526141b281614176565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220048ab52dc0cf9379185180ab73f35d8e05235b1794775ba93439814e39debd9164736f6c634300080b0033697066733a2f2f516d534b664254315a55427373436959446645685378316a4263503869685242716b6e7a375a50345459365366762f

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101c45760003560e01c80636007eeed116100f9578063b88d4fde11610097578063dab5f34011610071578063dab5f34014610503578063e985e9c51461051f578063f2fde38b1461054f578063f47c84c51461056b576101c4565b8063b88d4fde1461049b578063c87b56dd146104b7578063cb5a2c65146104e7576101c4565b8063715018a6116100d3578063715018a6146104395780638da5cb5b1461044357806395d89b4114610461578063a22cb4651461047f576101c4565b80636007eeed146103bb5780636352211e146103d957806370a0823114610409576101c4565b806323b872dd1161016657806342842e0e1161014057806342842e0e14610323578063438b63001461033f5780634f6ccce71461036f57806355f804b31461039f576101c4565b806323b872dd146102cd5780632f745c59146102e957806341c0e1b514610319576101c4565b8063095ea7b3116101a2578063095ea7b31461024757806311e776fe1461026357806318160ddd1461027f57806318cae2691461029d576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063081812fc14610217575b600080fd5b6101e360048036038101906101de919061296b565b610589565b6040516101f091906129b3565b60405180910390f35b61020161059b565b60405161020e9190612a67565b60405180910390f35b610231600480360381019061022c9190612abf565b61062d565b60405161023e9190612b2d565b60405180910390f35b610261600480360381019061025c9190612b74565b6106b2565b005b61027d60048036038101906102789190612abf565b6107ca565b005b610287610850565b6040516102949190612bc3565b60405180910390f35b6102b760048036038101906102b29190612bde565b61085d565b6040516102c49190612bc3565b60405180910390f35b6102e760048036038101906102e29190612c0b565b610875565b005b61030360048036038101906102fe9190612b74565b6108d5565b6040516103109190612bc3565b60405180910390f35b61032161097a565b005b61033d60048036038101906103389190612c0b565b610a0f565b005b61035960048036038101906103549190612bde565b610a2f565b6040516103669190612d1c565b60405180910390f35b61038960048036038101906103849190612abf565b610add565b6040516103969190612bc3565b60405180910390f35b6103b960048036038101906103b49190612e73565b610b4e565b005b6103c3610bd6565b6040516103d09190612bc3565b60405180910390f35b6103f360048036038101906103ee9190612abf565b610bdc565b6040516104009190612b2d565b60405180910390f35b610423600480360381019061041e9190612bde565b610c8e565b6040516104309190612bc3565b60405180910390f35b610441610d46565b005b61044b610dce565b6040516104589190612b2d565b60405180910390f35b610469610df8565b6040516104769190612a67565b60405180910390f35b61049960048036038101906104949190612ee8565b610e8a565b005b6104b560048036038101906104b09190612fc9565b610ea0565b005b6104d160048036038101906104cc9190612abf565b610f02565b6040516104de9190612a67565b60405180910390f35b61050160048036038101906104fc919061314a565b610fa0565b005b61051d60048036038101906105189190613193565b6111b3565b005b610539600480360381019061053491906131c0565b611239565b60405161054691906129b3565b60405180910390f35b61056960048036038101906105649190612bde565b6112cd565b005b6105736113c5565b6040516105809190612bc3565b60405180910390f35b6000610594826113cb565b9050919050565b6060600080546105aa9061322f565b80601f01602080910402602001604051908101604052809291908181526020018280546105d69061322f565b80156106235780601f106105f857610100808354040283529160200191610623565b820191906000526020600020905b81548152906001019060200180831161060657829003601f168201915b5050505050905090565b600061063882611445565b610677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066e906132d3565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106bd82610bdc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561072e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072590613365565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661074d6114b1565b73ffffffffffffffffffffffffffffffffffffffff16148061077c575061077b816107766114b1565b611239565b5b6107bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b2906133f7565b60405180910390fd5b6107c583836114b9565b505050565b6107d26114b1565b73ffffffffffffffffffffffffffffffffffffffff166107f0610dce565b73ffffffffffffffffffffffffffffffffffffffff1614610846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083d90613463565b60405180910390fd5b80600b8190555050565b6000600880549050905090565b600f6020528060005260406000206000915090505481565b6108866108806114b1565b82611572565b6108c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108bc906134f5565b60405180910390fd5b6108d0838383611650565b505050565b60006108e083610c8e565b8210610921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091890613587565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6109826114b1565b73ffffffffffffffffffffffffffffffffffffffff166109a0610dce565b73ffffffffffffffffffffffffffffffffffffffff16146109f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ed90613463565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16ff5b610a2a83838360405180602001604052806000815250610ea0565b505050565b60606000610a3c83610c8e565b905060008167ffffffffffffffff811115610a5a57610a59612d48565b5b604051908082528060200260200182016040528015610a885781602001602082028036833780820191505090505b50905060005b82811015610ad257610aa085826108d5565b828281518110610ab357610ab26135a7565b5b6020026020010181815250508080610aca90613605565b915050610a8e565b508092505050919050565b6000610ae7610850565b8210610b28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1f906136c0565b60405180910390fd5b60088281548110610b3c57610b3b6135a7565b5b90600052602060002001549050919050565b610b566114b1565b73ffffffffffffffffffffffffffffffffffffffff16610b74610dce565b73ffffffffffffffffffffffffffffffffffffffff1614610bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc190613463565b60405180910390fd5b610bd3816118b7565b50565b600c5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7c90613752565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610cff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf6906137e4565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d4e6114b1565b73ffffffffffffffffffffffffffffffffffffffff16610d6c610dce565b73ffffffffffffffffffffffffffffffffffffffff1614610dc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db990613463565b60405180910390fd5b610dcc60006118d1565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610e079061322f565b80601f0160208091040260200160405190810160405280929190818152602001828054610e339061322f565b8015610e805780601f10610e5557610100808354040283529160200191610e80565b820191906000526020600020905b815481529060010190602001808311610e6357829003601f168201915b5050505050905090565b610e9c610e956114b1565b8383611997565b5050565b610eb1610eab6114b1565b83611572565b610ef0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee7906134f5565b60405180910390fd5b610efc84848484611b04565b50505050565b6060610f0d82611445565b610f4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4390613876565b60405180910390fd5b6000610f5783611b60565b90506000815111610f775760405180602001604052806000815250610f98565b80604051602001610f88919061391e565b6040516020818303038152906040525b915050919050565b610fa981611c07565b610fe8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdf9061398c565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611056576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104d90613a1e565b60405180910390fd5b600b546001611063610850565b61106d9190613a3e565b11156110ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a590613ae0565b60405180910390fd5b600c546001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110fd9190613a3e565b111561113e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113590613b4c565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061118e90613605565b91905055506111b03360016111a1610850565b6111ab9190613a3e565b611c48565b50565b6111bb6114b1565b73ffffffffffffffffffffffffffffffffffffffff166111d9610dce565b73ffffffffffffffffffffffffffffffffffffffff161461122f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122690613463565b60405180910390fd5b80600e8190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6112d56114b1565b73ffffffffffffffffffffffffffffffffffffffff166112f3610dce565b73ffffffffffffffffffffffffffffffffffffffff1614611349576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134090613463565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b090613bde565b60405180910390fd5b6113c2816118d1565b50565b600b5481565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061143e575061143d82611c66565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661152c83610bdc565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061157d82611445565b6115bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b390613c70565b60405180910390fd5b60006115c783610bdc565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061160957506116088185611239565b5b8061164757508373ffffffffffffffffffffffffffffffffffffffff1661162f8461062d565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661167082610bdc565b73ffffffffffffffffffffffffffffffffffffffff16146116c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bd90613d02565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172d90613d94565b60405180910390fd5b611741838383611d48565b61174c6000826114b9565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461179c9190613db4565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117f39190613a3e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46118b2838383611d58565b505050565b80600d90805190602001906118cd92919061285c565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611a06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fd90613e34565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611af791906129b3565b60405180910390a3505050565b611b0f848484611650565b611b1b84848484611d5d565b611b5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5190613ec6565b60405180910390fd5b50505050565b6060611b6b82611445565b611baa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba190613876565b60405180910390fd5b6000611bb4611ee5565b90506000815111611bd45760405180602001604052806000815250611bff565b80611bde84611f77565b604051602001611bef929190613ee6565b6040516020818303038152906040525b915050919050565b60008033604051602001611c1b9190613f52565b604051602081830303815290604052805190602001209050611c4083600e54836120d8565b915050919050565b611c628282604051806020016040528060008152506120ef565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d3157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d415750611d408261214a565b5b9050919050565b611d538383836121b4565b505050565b505050565b6000611d7e8473ffffffffffffffffffffffffffffffffffffffff166122c8565b15611ed8578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611da76114b1565b8786866040518563ffffffff1660e01b8152600401611dc99493929190613fc2565b6020604051808303816000875af1925050508015611e0557506040513d601f19601f82011682018060405250810190611e029190614023565b60015b611e88573d8060008114611e35576040519150601f19603f3d011682016040523d82523d6000602084013e611e3a565b606091505b50600081511415611e80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7790613ec6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611edd565b600190505b949350505050565b6060600d8054611ef49061322f565b80601f0160208091040260200160405190810160405280929190818152602001828054611f209061322f565b8015611f6d5780601f10611f4257610100808354040283529160200191611f6d565b820191906000526020600020905b815481529060010190602001808311611f5057829003601f168201915b5050505050905090565b60606000821415611fbf576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506120d3565b600082905060005b60008214611ff1578080611fda90613605565b915050600a82611fea919061407f565b9150611fc7565b60008167ffffffffffffffff81111561200d5761200c612d48565b5b6040519080825280601f01601f19166020018201604052801561203f5781602001600182028036833780820191505090505b5090505b600085146120cc576001826120589190613db4565b9150600a8561206791906140b0565b60306120739190613a3e565b60f81b818381518110612089576120886135a7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120c5919061407f565b9450612043565b8093505050505b919050565b6000826120e585846122eb565b1490509392505050565b6120f98383612360565b6121066000848484611d5d565b612145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213c90613ec6565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6121bf83838361253a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612202576121fd8161253f565b612241565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146122405761223f8382612588565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122845761227f816126f5565b6122c3565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146122c2576122c182826127c6565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008082905060005b8451811015612355576000858281518110612312576123116135a7565b5b602002602001015190508083116123345761232d8382612845565b9250612341565b61233e8184612845565b92505b50808061234d90613605565b9150506122f4565b508091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c79061412d565b60405180910390fd5b6123d981611445565b15612419576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241090614199565b60405180910390fd5b61242560008383611d48565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124759190613a3e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461253660008383611d58565b5050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161259584610c8e565b61259f9190613db4565b9050600060076000848152602001908152602001600020549050818114612684576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506127099190613db4565b9050600060096000848152602001908152602001600020549050600060088381548110612739576127386135a7565b5b90600052602060002001549050806008838154811061275b5761275a6135a7565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806127aa576127a96141b9565b5b6001900381819060005260206000200160009055905550505050565b60006127d183610c8e565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600082600052816020526040600020905092915050565b8280546128689061322f565b90600052602060002090601f01602090048101928261288a57600085556128d1565b82601f106128a357805160ff19168380011785556128d1565b828001600101855582156128d1579182015b828111156128d05782518255916020019190600101906128b5565b5b5090506128de91906128e2565b5090565b5b808211156128fb5760008160009055506001016128e3565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61294881612913565b811461295357600080fd5b50565b6000813590506129658161293f565b92915050565b60006020828403121561298157612980612909565b5b600061298f84828501612956565b91505092915050565b60008115159050919050565b6129ad81612998565b82525050565b60006020820190506129c860008301846129a4565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612a085780820151818401526020810190506129ed565b83811115612a17576000848401525b50505050565b6000601f19601f8301169050919050565b6000612a39826129ce565b612a4381856129d9565b9350612a538185602086016129ea565b612a5c81612a1d565b840191505092915050565b60006020820190508181036000830152612a818184612a2e565b905092915050565b6000819050919050565b612a9c81612a89565b8114612aa757600080fd5b50565b600081359050612ab981612a93565b92915050565b600060208284031215612ad557612ad4612909565b5b6000612ae384828501612aaa565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612b1782612aec565b9050919050565b612b2781612b0c565b82525050565b6000602082019050612b426000830184612b1e565b92915050565b612b5181612b0c565b8114612b5c57600080fd5b50565b600081359050612b6e81612b48565b92915050565b60008060408385031215612b8b57612b8a612909565b5b6000612b9985828601612b5f565b9250506020612baa85828601612aaa565b9150509250929050565b612bbd81612a89565b82525050565b6000602082019050612bd86000830184612bb4565b92915050565b600060208284031215612bf457612bf3612909565b5b6000612c0284828501612b5f565b91505092915050565b600080600060608486031215612c2457612c23612909565b5b6000612c3286828701612b5f565b9350506020612c4386828701612b5f565b9250506040612c5486828701612aaa565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612c9381612a89565b82525050565b6000612ca58383612c8a565b60208301905092915050565b6000602082019050919050565b6000612cc982612c5e565b612cd38185612c69565b9350612cde83612c7a565b8060005b83811015612d0f578151612cf68882612c99565b9750612d0183612cb1565b925050600181019050612ce2565b5085935050505092915050565b60006020820190508181036000830152612d368184612cbe565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612d8082612a1d565b810181811067ffffffffffffffff82111715612d9f57612d9e612d48565b5b80604052505050565b6000612db26128ff565b9050612dbe8282612d77565b919050565b600067ffffffffffffffff821115612dde57612ddd612d48565b5b612de782612a1d565b9050602081019050919050565b82818337600083830152505050565b6000612e16612e1184612dc3565b612da8565b905082815260208101848484011115612e3257612e31612d43565b5b612e3d848285612df4565b509392505050565b600082601f830112612e5a57612e59612d3e565b5b8135612e6a848260208601612e03565b91505092915050565b600060208284031215612e8957612e88612909565b5b600082013567ffffffffffffffff811115612ea757612ea661290e565b5b612eb384828501612e45565b91505092915050565b612ec581612998565b8114612ed057600080fd5b50565b600081359050612ee281612ebc565b92915050565b60008060408385031215612eff57612efe612909565b5b6000612f0d85828601612b5f565b9250506020612f1e85828601612ed3565b9150509250929050565b600067ffffffffffffffff821115612f4357612f42612d48565b5b612f4c82612a1d565b9050602081019050919050565b6000612f6c612f6784612f28565b612da8565b905082815260208101848484011115612f8857612f87612d43565b5b612f93848285612df4565b509392505050565b600082601f830112612fb057612faf612d3e565b5b8135612fc0848260208601612f59565b91505092915050565b60008060008060808587031215612fe357612fe2612909565b5b6000612ff187828801612b5f565b945050602061300287828801612b5f565b935050604061301387828801612aaa565b925050606085013567ffffffffffffffff8111156130345761303361290e565b5b61304087828801612f9b565b91505092959194509250565b600067ffffffffffffffff82111561306757613066612d48565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b6130908161307d565b811461309b57600080fd5b50565b6000813590506130ad81613087565b92915050565b60006130c66130c18461304c565b612da8565b905080838252602082019050602084028301858111156130e9576130e8613078565b5b835b8181101561311257806130fe888261309e565b8452602084019350506020810190506130eb565b5050509392505050565b600082601f83011261313157613130612d3e565b5b81356131418482602086016130b3565b91505092915050565b6000602082840312156131605761315f612909565b5b600082013567ffffffffffffffff81111561317e5761317d61290e565b5b61318a8482850161311c565b91505092915050565b6000602082840312156131a9576131a8612909565b5b60006131b78482850161309e565b91505092915050565b600080604083850312156131d7576131d6612909565b5b60006131e585828601612b5f565b92505060206131f685828601612b5f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061324757607f821691505b6020821081141561325b5761325a613200565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006132bd602c836129d9565b91506132c882613261565b604082019050919050565b600060208201905081810360008301526132ec816132b0565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061334f6021836129d9565b915061335a826132f3565b604082019050919050565b6000602082019050818103600083015261337e81613342565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006133e16038836129d9565b91506133ec82613385565b604082019050919050565b60006020820190508181036000830152613410816133d4565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061344d6020836129d9565b915061345882613417565b602082019050919050565b6000602082019050818103600083015261347c81613440565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006134df6031836129d9565b91506134ea82613483565b604082019050919050565b6000602082019050818103600083015261350e816134d2565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613571602b836129d9565b915061357c82613515565b604082019050919050565b600060208201905081810360008301526135a081613564565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061361082612a89565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613643576136426135d6565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006136aa602c836129d9565b91506136b58261364e565b604082019050919050565b600060208201905081810360008301526136d98161369d565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061373c6029836129d9565b9150613747826136e0565b604082019050919050565b6000602082019050818103600083015261376b8161372f565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006137ce602a836129d9565b91506137d982613772565b604082019050919050565b600060208201905081810360008301526137fd816137c1565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613860602f836129d9565b915061386b82613804565b604082019050919050565b6000602082019050818103600083015261388f81613853565b9050919050565b600081905092915050565b60006138ac826129ce565b6138b68185613896565b93506138c68185602086016129ea565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613908600583613896565b9150613913826138d2565b600582019050919050565b600061392a82846138a1565b9150613935826138fb565b915081905092915050565b7f41646472657373206e6f742077686974656c6973746564000000000000000000600082015250565b60006139766017836129d9565b915061398182613940565b602082019050919050565b600060208201905081810360008301526139a581613969565b9050919050565b7f4e6f207472616e73616374696f6e2066726f6d20736d61727420636f6e74726160008201527f6374732100000000000000000000000000000000000000000000000000000000602082015250565b6000613a086024836129d9565b9150613a13826139ac565b604082019050919050565b60006020820190508181036000830152613a37816139fb565b9050919050565b6000613a4982612a89565b9150613a5483612a89565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a8957613a886135d6565b5b828201905092915050565b7f507572636861736520776f756c6420657863656564206d617820737570706c79600082015250565b6000613aca6020836129d9565b9150613ad582613a94565b602082019050919050565b60006020820190508181036000830152613af981613abd565b9050919050565b7f4d6178204e465420706572206164647265737320657863656564656400000000600082015250565b6000613b36601c836129d9565b9150613b4182613b00565b602082019050919050565b60006020820190508181036000830152613b6581613b29565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613bc86026836129d9565b9150613bd382613b6c565b604082019050919050565b60006020820190508181036000830152613bf781613bbb565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613c5a602c836129d9565b9150613c6582613bfe565b604082019050919050565b60006020820190508181036000830152613c8981613c4d565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613cec6025836129d9565b9150613cf782613c90565b604082019050919050565b60006020820190508181036000830152613d1b81613cdf565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613d7e6024836129d9565b9150613d8982613d22565b604082019050919050565b60006020820190508181036000830152613dad81613d71565b9050919050565b6000613dbf82612a89565b9150613dca83612a89565b925082821015613ddd57613ddc6135d6565b5b828203905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613e1e6019836129d9565b9150613e2982613de8565b602082019050919050565b60006020820190508181036000830152613e4d81613e11565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613eb06032836129d9565b9150613ebb82613e54565b604082019050919050565b60006020820190508181036000830152613edf81613ea3565b9050919050565b6000613ef282856138a1565b9150613efe82846138a1565b91508190509392505050565b60008160601b9050919050565b6000613f2282613f0a565b9050919050565b6000613f3482613f17565b9050919050565b613f4c613f4782612b0c565b613f29565b82525050565b6000613f5e8284613f3b565b60148201915081905092915050565b600081519050919050565b600082825260208201905092915050565b6000613f9482613f6d565b613f9e8185613f78565b9350613fae8185602086016129ea565b613fb781612a1d565b840191505092915050565b6000608082019050613fd76000830187612b1e565b613fe46020830186612b1e565b613ff16040830185612bb4565b81810360608301526140038184613f89565b905095945050505050565b60008151905061401d8161293f565b92915050565b60006020828403121561403957614038612909565b5b60006140478482850161400e565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061408a82612a89565b915061409583612a89565b9250826140a5576140a4614050565b5b828204905092915050565b60006140bb82612a89565b91506140c683612a89565b9250826140d6576140d5614050565b5b828206905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006141176020836129d9565b9150614122826140e1565b602082019050919050565b600060208201905081810360008301526141468161410a565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614183601c836129d9565b915061418e8261414d565b602082019050919050565b600060208201905081810360008301526141b281614176565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220048ab52dc0cf9379185180ab73f35d8e05235b1794775ba93439814e39debd9164736f6c634300080b0033

Deployed Bytecode Sourcemap

45799:3458:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48196:177;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20611:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22171:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21694:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47202:83;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35244:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46563:52;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22921:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34912:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49168:86;;;:::i;:::-;;23331:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47293:375;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35434:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48667:101;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46088:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20305:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20035:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42389:103;;;:::i;:::-;;41738:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20780:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22464:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23587:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48778:384;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46684:510;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47678:87;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22690:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42647:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45889:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48196:177;48300:4;48329:36;48353:11;48329:23;:36::i;:::-;48322:43;;48196:177;;;:::o;20611:100::-;20665:13;20698:5;20691:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20611:100;:::o;22171:221::-;22247:7;22275:16;22283:7;22275;:16::i;:::-;22267:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22360:15;:24;22376:7;22360:24;;;;;;;;;;;;;;;;;;;;;22353:31;;22171:221;;;:::o;21694:411::-;21775:13;21791:23;21806:7;21791:14;:23::i;:::-;21775:39;;21839:5;21833:11;;:2;:11;;;;21825:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;21933:5;21917:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;21942:37;21959:5;21966:12;:10;:12::i;:::-;21942:16;:37::i;:::-;21917:62;21895:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;22076:21;22085:2;22089:7;22076:8;:21::i;:::-;21764:341;21694:411;;:::o;47202:83::-;41969:12;:10;:12::i;:::-;41958:23;;:7;:5;:7::i;:::-;:23;;;41950:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47274:3:::1;47261:10;:16;;;;47202:83:::0;:::o;35244:113::-;35305:7;35332:10;:17;;;;35325:24;;35244:113;:::o;46563:52::-;;;;;;;;;;;;;;;;;:::o;22921:339::-;23116:41;23135:12;:10;:12::i;:::-;23149:7;23116:18;:41::i;:::-;23108:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23224:28;23234:4;23240:2;23244:7;23224:9;:28::i;:::-;22921:339;;;:::o;34912:256::-;35009:7;35045:23;35062:5;35045:16;:23::i;:::-;35037:5;:31;35029:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35134:12;:19;35147:5;35134:19;;;;;;;;;;;;;;;:26;35154:5;35134:26;;;;;;;;;;;;35127:33;;34912:256;;;;:::o;49168:86::-;41969:12;:10;:12::i;:::-;41958:23;;:7;:5;:7::i;:::-;:23;;;41950:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49234:10:::1;49213:33;;;23331:185:::0;23469:39;23486:4;23492:2;23496:7;23469:39;;;;;;;;;;;;:16;:39::i;:::-;23331:185;;;:::o;47293:375::-;47353:16;47387:23;47413:17;47423:6;47413:9;:17::i;:::-;47387:43;;47441:25;47483:15;47469:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47441:58;;47525:9;47520:113;47540:15;47536:1;:19;47520:113;;;47591:30;47611:6;47619:1;47591:19;:30::i;:::-;47577:8;47586:1;47577:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;47557:3;;;;;:::i;:::-;;;;47520:113;;;;47652:8;47645:15;;;;47293:375;;;:::o;35434:233::-;35509:7;35545:30;:28;:30::i;:::-;35537:5;:38;35529:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35642:10;35653:5;35642:17;;;;;;;;:::i;:::-;;;;;;;;;;35635:24;;35434:233;;;:::o;48667:101::-;41969:12;:10;:12::i;:::-;41958:23;;:7;:5;:7::i;:::-;:23;;;41950:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48740:20:::1;48752:7;48740:11;:20::i;:::-;48667:101:::0;:::o;46088:31::-;;;;:::o;20305:239::-;20377:7;20397:13;20413:7;:16;20421:7;20413:16;;;;;;;;;;;;;;;;;;;;;20397:32;;20465:1;20448:19;;:5;:19;;;;20440:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20531:5;20524:12;;;20305:239;;;:::o;20035:208::-;20107:7;20152:1;20135:19;;:5;:19;;;;20127:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20219:9;:16;20229:5;20219:16;;;;;;;;;;;;;;;;20212:23;;20035:208;;;:::o;42389:103::-;41969:12;:10;:12::i;:::-;41958:23;;:7;:5;:7::i;:::-;:23;;;41950:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42454:30:::1;42481:1;42454:18;:30::i;:::-;42389:103::o:0;41738:87::-;41784:7;41811:6;;;;;;;;;;;41804:13;;41738:87;:::o;20780:104::-;20836:13;20869:7;20862:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20780:104;:::o;22464:155::-;22559:52;22578:12;:10;:12::i;:::-;22592:8;22602;22559:18;:52::i;:::-;22464:155;;:::o;23587:328::-;23762:41;23781:12;:10;:12::i;:::-;23795:7;23762:18;:41::i;:::-;23754:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23868:39;23882:4;23888:2;23892:7;23901:5;23868:13;:39::i;:::-;23587:328;;;;:::o;48778:384::-;48851:13;48904:16;48912:7;48904;:16::i;:::-;48882:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;49008:23;49034;49049:7;49034:14;:23::i;:::-;49008:49;;49101:1;49081:9;49075:23;:27;:79;;;;;;;;;;;;;;;;;49129:9;49112:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;49075:79;49068:86;;;48778:384;;;:::o;46684:510::-;46760:13;46767:5;46760:6;:13::i;:::-;46752:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;46834:9;46820:23;;:10;:23;;;46812:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;46924:10;;46919:1;46903:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:31;;46895:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;47030:15;;47025:1;46990:20;:32;47011:10;46990:32;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:55;;46982:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;47099:20;:32;47120:10;47099:32;;;;;;;;;;;;;;;;:34;;;;;;;;;:::i;:::-;;;;;;47144:40;47154:10;47182:1;47166:13;:11;:13::i;:::-;:17;;;;:::i;:::-;47144:9;:40::i;:::-;46684:510;:::o;47678:87::-;41969:12;:10;:12::i;:::-;41958:23;;:7;:5;:7::i;:::-;:23;;;41950:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47752:5:::1;47745:4;:12;;;;47678:87:::0;:::o;22690:164::-;22787:4;22811:18;:25;22830:5;22811:25;;;;;;;;;;;;;;;:35;22837:8;22811:35;;;;;;;;;;;;;;;;;;;;;;;;;22804:42;;22690:164;;;;:::o;42647:201::-;41969:12;:10;:12::i;:::-;41958:23;;:7;:5;:7::i;:::-;:23;;;41950:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42756:1:::1;42736:22;;:8;:22;;;;42728:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42812:28;42831:8;42812:18;:28::i;:::-;42647:201:::0;:::o;45889:27::-;;;;:::o;34604:224::-;34706:4;34745:35;34730:50;;;:11;:50;;;;:90;;;;34784:36;34808:11;34784:23;:36::i;:::-;34730:90;34723:97;;34604:224;;;:::o;25425:127::-;25490:4;25542:1;25514:30;;:7;:16;25522:7;25514:16;;;;;;;;;;;;;;;;;;;;;:30;;;;25507:37;;25425:127;;;:::o;8250:98::-;8303:7;8330:10;8323:17;;8250:98;:::o;29601:174::-;29703:2;29676:15;:24;29692:7;29676:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;29759:7;29755:2;29721:46;;29730:23;29745:7;29730:14;:23::i;:::-;29721:46;;;;;;;;;;;;29601:174;;:::o;25719:348::-;25812:4;25837:16;25845:7;25837;:16::i;:::-;25829:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25913:13;25929:23;25944:7;25929:14;:23::i;:::-;25913:39;;25982:5;25971:16;;:7;:16;;;:52;;;;25991:32;26008:5;26015:7;25991:16;:32::i;:::-;25971:52;:87;;;;26051:7;26027:31;;:20;26039:7;26027:11;:20::i;:::-;:31;;;25971:87;25963:96;;;25719:348;;;;:::o;28858:625::-;29017:4;28990:31;;:23;29005:7;28990:14;:23::i;:::-;:31;;;28982:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;29096:1;29082:16;;:2;:16;;;;29074:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29152:39;29173:4;29179:2;29183:7;29152:20;:39::i;:::-;29256:29;29273:1;29277:7;29256:8;:29::i;:::-;29317:1;29298:9;:15;29308:4;29298:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29346:1;29329:9;:13;29339:2;29329:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29377:2;29358:7;:16;29366:7;29358:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29416:7;29412:2;29397:27;;29406:4;29397:27;;;;;;;;;;;;29437:38;29457:4;29463:2;29467:7;29437:19;:38::i;:::-;28858:625;;;:::o;48438:103::-;48526:7;48510:13;:23;;;;;;;;;;;;:::i;:::-;;48438:103;:::o;43008:191::-;43082:16;43101:6;;;;;;;;;;;43082:25;;43127:8;43118:6;;:17;;;;;;;;;;;;;;;;;;43182:8;43151:40;;43172:8;43151:40;;;;;;;;;;;;43071:128;43008:191;:::o;29917:315::-;30072:8;30063:17;;:5;:17;;;;30055:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;30159:8;30121:18;:25;30140:5;30121:25;;;;;;;;;;;;;;;:35;30147:8;30121:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;30205:8;30183:41;;30198:5;30183:41;;;30215:8;30183:41;;;;;;:::i;:::-;;;;;;;;29917:315;;;:::o;24797:::-;24954:28;24964:4;24970:2;24974:7;24954:9;:28::i;:::-;25001:48;25024:4;25030:2;25034:7;25043:5;25001:22;:48::i;:::-;24993:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;24797:315;;;;:::o;20955:334::-;21028:13;21062:16;21070:7;21062;:16::i;:::-;21054:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;21143:21;21167:10;:8;:10::i;:::-;21143:34;;21219:1;21201:7;21195:21;:25;:86;;;;;;;;;;;;;;;;;21247:7;21256:18;:7;:16;:18::i;:::-;21230:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21195:86;21188:93;;;20955:334;;;:::o;47773:203::-;47836:4;47859:12;47901:10;47884:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;47874:39;;;;;;47859:54;;47931:37;47950:5;47957:4;;47963;47931:18;:37::i;:::-;47924:44;;;47773:203;;;:::o;26409:110::-;26485:26;26495:2;26499:7;26485:26;;;;;;;;;;;;:9;:26::i;:::-;26409:110;;:::o;19666:305::-;19768:4;19820:25;19805:40;;;:11;:40;;;;:105;;;;19877:33;19862:48;;;:11;:48;;;;19805:105;:158;;;;19927:36;19951:11;19927:23;:36::i;:::-;19805:158;19785:178;;19666:305;;;:::o;47988:196::-;48131:45;48158:4;48164:2;48168:7;48131:26;:45::i;:::-;47988:196;;;:::o;32679:125::-;;;;:::o;30797:799::-;30952:4;30973:15;:2;:13;;;:15::i;:::-;30969:620;;;31025:2;31009:36;;;31046:12;:10;:12::i;:::-;31060:4;31066:7;31075:5;31009:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31005:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31268:1;31251:6;:13;:18;31247:272;;;31294:60;;;;;;;;;;:::i;:::-;;;;;;;;31247:272;31469:6;31463:13;31454:6;31450:2;31446:15;31439:38;31005:529;31142:41;;;31132:51;;;:6;:51;;;;31125:58;;;;;30969:620;31573:4;31566:11;;30797:799;;;;;;;:::o;48549:106::-;48601:13;48634;48627:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48549:106;:::o;5891:723::-;5947:13;6177:1;6168:5;:10;6164:53;;;6195:10;;;;;;;;;;;;;;;;;;;;;6164:53;6227:12;6242:5;6227:20;;6258:14;6283:78;6298:1;6290:4;:9;6283:78;;6316:8;;;;;:::i;:::-;;;;6347:2;6339:10;;;;;:::i;:::-;;;6283:78;;;6371:19;6403:6;6393:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6371:39;;6421:154;6437:1;6428:5;:10;6421:154;;6465:1;6455:11;;;;;:::i;:::-;;;6532:2;6524:5;:10;;;;:::i;:::-;6511:2;:24;;;;:::i;:::-;6498:39;;6481:6;6488;6481:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;6561:2;6552:11;;;;;:::i;:::-;;;6421:154;;;6599:6;6585:21;;;;;5891:723;;;;:::o;44332:190::-;44457:4;44510;44481:25;44494:5;44501:4;44481:12;:25::i;:::-;:33;44474:40;;44332:190;;;;;:::o;26746:321::-;26876:18;26882:2;26886:7;26876:5;:18::i;:::-;26927:54;26958:1;26962:2;26966:7;26975:5;26927:22;:54::i;:::-;26905:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;26746:321;;;:::o;18273:157::-;18358:4;18397:25;18382:40;;;:11;:40;;;;18375:47;;18273:157;;;:::o;36280:589::-;36424:45;36451:4;36457:2;36461:7;36424:26;:45::i;:::-;36502:1;36486:18;;:4;:18;;;36482:187;;;36521:40;36553:7;36521:31;:40::i;:::-;36482:187;;;36591:2;36583:10;;:4;:10;;;36579:90;;36610:47;36643:4;36649:7;36610:32;:47::i;:::-;36579:90;36482:187;36697:1;36683:16;;:2;:16;;;36679:183;;;36716:45;36753:7;36716:36;:45::i;:::-;36679:183;;;36789:4;36783:10;;:2;:10;;;36779:83;;36810:40;36838:2;36842:7;36810:27;:40::i;:::-;36779:83;36679:183;36280:589;;;:::o;11472:326::-;11532:4;11789:1;11767:7;:19;;;:23;11760:30;;11472:326;;;:::o;44883:675::-;44966:7;44986:20;45009:4;44986:27;;45029:9;45024:497;45048:5;:12;45044:1;:16;45024:497;;;45082:20;45105:5;45111:1;45105:8;;;;;;;;:::i;:::-;;;;;;;;45082:31;;45148:12;45132;:28;45128:382;;45275:42;45290:12;45304;45275:14;:42::i;:::-;45260:57;;45128:382;;;45452:42;45467:12;45481;45452:14;:42::i;:::-;45437:57;;45128:382;45067:454;45062:3;;;;;:::i;:::-;;;;45024:497;;;;45538:12;45531:19;;;44883:675;;;;:::o;27403:439::-;27497:1;27483:16;;:2;:16;;;;27475:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;27556:16;27564:7;27556;:16::i;:::-;27555:17;27547:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;27618:45;27647:1;27651:2;27655:7;27618:20;:45::i;:::-;27693:1;27676:9;:13;27686:2;27676:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;27724:2;27705:7;:16;27713:7;27705:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;27769:7;27765:2;27744:33;;27761:1;27744:33;;;;;;;;;;;;27790:44;27818:1;27822:2;27826:7;27790:19;:44::i;:::-;27403:439;;:::o;32168:126::-;;;;:::o;37592:164::-;37696:10;:17;;;;37669:15;:24;37685:7;37669:24;;;;;;;;;;;:44;;;;37724:10;37740:7;37724:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37592:164;:::o;38383:988::-;38649:22;38699:1;38674:22;38691:4;38674:16;:22::i;:::-;:26;;;;:::i;:::-;38649:51;;38711:18;38732:17;:26;38750:7;38732:26;;;;;;;;;;;;38711:47;;38879:14;38865:10;:28;38861:328;;38910:19;38932:12;:18;38945:4;38932:18;;;;;;;;;;;;;;;:34;38951:14;38932:34;;;;;;;;;;;;38910:56;;39016:11;38983:12;:18;38996:4;38983:18;;;;;;;;;;;;;;;:30;39002:10;38983:30;;;;;;;;;;;:44;;;;39133:10;39100:17;:30;39118:11;39100:30;;;;;;;;;;;:43;;;;38895:294;38861:328;39285:17;:26;39303:7;39285:26;;;;;;;;;;;39278:33;;;39329:12;:18;39342:4;39329:18;;;;;;;;;;;;;;;:34;39348:14;39329:34;;;;;;;;;;;39322:41;;;38464:907;;38383:988;;:::o;39666:1079::-;39919:22;39964:1;39944:10;:17;;;;:21;;;;:::i;:::-;39919:46;;39976:18;39997:15;:24;40013:7;39997:24;;;;;;;;;;;;39976:45;;40348:19;40370:10;40381:14;40370:26;;;;;;;;:::i;:::-;;;;;;;;;;40348:48;;40434:11;40409:10;40420;40409:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;40545:10;40514:15;:28;40530:11;40514:28;;;;;;;;;;;:41;;;;40686:15;:24;40702:7;40686:24;;;;;;;;;;;40679:31;;;40721:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39737:1008;;;39666:1079;:::o;37170:221::-;37255:14;37272:20;37289:2;37272:16;:20::i;:::-;37255:37;;37330:7;37303:12;:16;37316:2;37303:16;;;;;;;;;;;;;;;:24;37320:6;37303:24;;;;;;;;;;;:34;;;;37377:6;37348:17;:26;37366:7;37348:26;;;;;;;;;;;:35;;;;37244:147;37170:221;;:::o;45566:224::-;45634:13;45697:1;45691:4;45684:15;45726:1;45720:4;45713:15;45767:4;45761;45751:21;45742:30;;45566:224;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:329::-;5349:6;5398:2;5386:9;5377:7;5373:23;5369:32;5366:119;;;5404:79;;:::i;:::-;5366:119;5524:1;5549:53;5594:7;5585:6;5574:9;5570:22;5549:53;:::i;:::-;5539:63;;5495:117;5290:329;;;;:::o;5625:619::-;5702:6;5710;5718;5767:2;5755:9;5746:7;5742:23;5738:32;5735:119;;;5773:79;;:::i;:::-;5735:119;5893:1;5918:53;5963:7;5954:6;5943:9;5939:22;5918:53;:::i;:::-;5908:63;;5864:117;6020:2;6046:53;6091:7;6082:6;6071:9;6067:22;6046:53;:::i;:::-;6036:63;;5991:118;6148:2;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6119:118;5625:619;;;;;:::o;6250:114::-;6317:6;6351:5;6345:12;6335:22;;6250:114;;;:::o;6370:184::-;6469:11;6503:6;6498:3;6491:19;6543:4;6538:3;6534:14;6519:29;;6370:184;;;;:::o;6560:132::-;6627:4;6650:3;6642:11;;6680:4;6675:3;6671:14;6663:22;;6560:132;;;:::o;6698:108::-;6775:24;6793:5;6775:24;:::i;:::-;6770:3;6763:37;6698:108;;:::o;6812:179::-;6881:10;6902:46;6944:3;6936:6;6902:46;:::i;:::-;6980:4;6975:3;6971:14;6957:28;;6812:179;;;;:::o;6997:113::-;7067:4;7099;7094:3;7090:14;7082:22;;6997:113;;;:::o;7146:732::-;7265:3;7294:54;7342:5;7294:54;:::i;:::-;7364:86;7443:6;7438:3;7364:86;:::i;:::-;7357:93;;7474:56;7524:5;7474:56;:::i;:::-;7553:7;7584:1;7569:284;7594:6;7591:1;7588:13;7569:284;;;7670:6;7664:13;7697:63;7756:3;7741:13;7697:63;:::i;:::-;7690:70;;7783:60;7836:6;7783:60;:::i;:::-;7773:70;;7629:224;7616:1;7613;7609:9;7604:14;;7569:284;;;7573:14;7869:3;7862:10;;7270:608;;;7146:732;;;;:::o;7884:373::-;8027:4;8065:2;8054:9;8050:18;8042:26;;8114:9;8108:4;8104:20;8100:1;8089:9;8085:17;8078:47;8142:108;8245:4;8236:6;8142:108;:::i;:::-;8134:116;;7884:373;;;;:::o;8263:117::-;8372:1;8369;8362:12;8386:117;8495:1;8492;8485:12;8509:180;8557:77;8554:1;8547:88;8654:4;8651:1;8644:15;8678:4;8675:1;8668:15;8695:281;8778:27;8800:4;8778:27;:::i;:::-;8770:6;8766:40;8908:6;8896:10;8893:22;8872:18;8860:10;8857:34;8854:62;8851:88;;;8919:18;;:::i;:::-;8851:88;8959:10;8955:2;8948:22;8738:238;8695:281;;:::o;8982:129::-;9016:6;9043:20;;:::i;:::-;9033:30;;9072:33;9100:4;9092:6;9072:33;:::i;:::-;8982:129;;;:::o;9117:308::-;9179:4;9269:18;9261:6;9258:30;9255:56;;;9291:18;;:::i;:::-;9255:56;9329:29;9351:6;9329:29;:::i;:::-;9321:37;;9413:4;9407;9403:15;9395:23;;9117:308;;;:::o;9431:154::-;9515:6;9510:3;9505;9492:30;9577:1;9568:6;9563:3;9559:16;9552:27;9431:154;;;:::o;9591:412::-;9669:5;9694:66;9710:49;9752:6;9710:49;:::i;:::-;9694:66;:::i;:::-;9685:75;;9783:6;9776:5;9769:21;9821:4;9814:5;9810:16;9859:3;9850:6;9845:3;9841:16;9838:25;9835:112;;;9866:79;;:::i;:::-;9835:112;9956:41;9990:6;9985:3;9980;9956:41;:::i;:::-;9675:328;9591:412;;;;;:::o;10023:340::-;10079:5;10128:3;10121:4;10113:6;10109:17;10105:27;10095:122;;10136:79;;:::i;:::-;10095:122;10253:6;10240:20;10278:79;10353:3;10345:6;10338:4;10330:6;10326:17;10278:79;:::i;:::-;10269:88;;10085:278;10023:340;;;;:::o;10369:509::-;10438:6;10487:2;10475:9;10466:7;10462:23;10458:32;10455:119;;;10493:79;;:::i;:::-;10455:119;10641:1;10630:9;10626:17;10613:31;10671:18;10663:6;10660:30;10657:117;;;10693:79;;:::i;:::-;10657:117;10798:63;10853:7;10844:6;10833:9;10829:22;10798:63;:::i;:::-;10788:73;;10584:287;10369:509;;;;:::o;10884:116::-;10954:21;10969:5;10954:21;:::i;:::-;10947:5;10944:32;10934:60;;10990:1;10987;10980:12;10934:60;10884:116;:::o;11006:133::-;11049:5;11087:6;11074:20;11065:29;;11103:30;11127:5;11103:30;:::i;:::-;11006:133;;;;:::o;11145:468::-;11210:6;11218;11267:2;11255:9;11246:7;11242:23;11238:32;11235:119;;;11273:79;;:::i;:::-;11235:119;11393:1;11418:53;11463:7;11454:6;11443:9;11439:22;11418:53;:::i;:::-;11408:63;;11364:117;11520:2;11546:50;11588:7;11579:6;11568:9;11564:22;11546:50;:::i;:::-;11536:60;;11491:115;11145:468;;;;;:::o;11619:307::-;11680:4;11770:18;11762:6;11759:30;11756:56;;;11792:18;;:::i;:::-;11756:56;11830:29;11852:6;11830:29;:::i;:::-;11822:37;;11914:4;11908;11904:15;11896:23;;11619:307;;;:::o;11932:410::-;12009:5;12034:65;12050:48;12091:6;12050:48;:::i;:::-;12034:65;:::i;:::-;12025:74;;12122:6;12115:5;12108:21;12160:4;12153:5;12149:16;12198:3;12189:6;12184:3;12180:16;12177:25;12174:112;;;12205:79;;:::i;:::-;12174:112;12295:41;12329:6;12324:3;12319;12295:41;:::i;:::-;12015:327;11932:410;;;;;:::o;12361:338::-;12416:5;12465:3;12458:4;12450:6;12446:17;12442:27;12432:122;;12473:79;;:::i;:::-;12432:122;12590:6;12577:20;12615:78;12689:3;12681:6;12674:4;12666:6;12662:17;12615:78;:::i;:::-;12606:87;;12422:277;12361:338;;;;:::o;12705:943::-;12800:6;12808;12816;12824;12873:3;12861:9;12852:7;12848:23;12844:33;12841:120;;;12880:79;;:::i;:::-;12841:120;13000:1;13025:53;13070:7;13061:6;13050:9;13046:22;13025:53;:::i;:::-;13015:63;;12971:117;13127:2;13153:53;13198:7;13189:6;13178:9;13174:22;13153:53;:::i;:::-;13143:63;;13098:118;13255:2;13281:53;13326:7;13317:6;13306:9;13302:22;13281:53;:::i;:::-;13271:63;;13226:118;13411:2;13400:9;13396:18;13383:32;13442:18;13434:6;13431:30;13428:117;;;13464:79;;:::i;:::-;13428:117;13569:62;13623:7;13614:6;13603:9;13599:22;13569:62;:::i;:::-;13559:72;;13354:287;12705:943;;;;;;;:::o;13654:311::-;13731:4;13821:18;13813:6;13810:30;13807:56;;;13843:18;;:::i;:::-;13807:56;13893:4;13885:6;13881:17;13873:25;;13953:4;13947;13943:15;13935:23;;13654:311;;;:::o;13971:117::-;14080:1;14077;14070:12;14094:77;14131:7;14160:5;14149:16;;14094:77;;;:::o;14177:122::-;14250:24;14268:5;14250:24;:::i;:::-;14243:5;14240:35;14230:63;;14289:1;14286;14279:12;14230:63;14177:122;:::o;14305:139::-;14351:5;14389:6;14376:20;14367:29;;14405:33;14432:5;14405:33;:::i;:::-;14305:139;;;;:::o;14467:710::-;14563:5;14588:81;14604:64;14661:6;14604:64;:::i;:::-;14588:81;:::i;:::-;14579:90;;14689:5;14718:6;14711:5;14704:21;14752:4;14745:5;14741:16;14734:23;;14805:4;14797:6;14793:17;14785:6;14781:30;14834:3;14826:6;14823:15;14820:122;;;14853:79;;:::i;:::-;14820:122;14968:6;14951:220;14985:6;14980:3;14977:15;14951:220;;;15060:3;15089:37;15122:3;15110:10;15089:37;:::i;:::-;15084:3;15077:50;15156:4;15151:3;15147:14;15140:21;;15027:144;15011:4;15006:3;15002:14;14995:21;;14951:220;;;14955:21;14569:608;;14467:710;;;;;:::o;15200:370::-;15271:5;15320:3;15313:4;15305:6;15301:17;15297:27;15287:122;;15328:79;;:::i;:::-;15287:122;15445:6;15432:20;15470:94;15560:3;15552:6;15545:4;15537:6;15533:17;15470:94;:::i;:::-;15461:103;;15277:293;15200:370;;;;:::o;15576:539::-;15660:6;15709:2;15697:9;15688:7;15684:23;15680:32;15677:119;;;15715:79;;:::i;:::-;15677:119;15863:1;15852:9;15848:17;15835:31;15893:18;15885:6;15882:30;15879:117;;;15915:79;;:::i;:::-;15879:117;16020:78;16090:7;16081:6;16070:9;16066:22;16020:78;:::i;:::-;16010:88;;15806:302;15576:539;;;;:::o;16121:329::-;16180:6;16229:2;16217:9;16208:7;16204:23;16200:32;16197:119;;;16235:79;;:::i;:::-;16197:119;16355:1;16380:53;16425:7;16416:6;16405:9;16401:22;16380:53;:::i;:::-;16370:63;;16326:117;16121:329;;;;:::o;16456:474::-;16524:6;16532;16581:2;16569:9;16560:7;16556:23;16552:32;16549:119;;;16587:79;;:::i;:::-;16549:119;16707:1;16732:53;16777:7;16768:6;16757:9;16753:22;16732:53;:::i;:::-;16722:63;;16678:117;16834:2;16860:53;16905:7;16896:6;16885:9;16881:22;16860:53;:::i;:::-;16850:63;;16805:118;16456:474;;;;;:::o;16936:180::-;16984:77;16981:1;16974:88;17081:4;17078:1;17071:15;17105:4;17102:1;17095:15;17122:320;17166:6;17203:1;17197:4;17193:12;17183:22;;17250:1;17244:4;17240:12;17271:18;17261:81;;17327:4;17319:6;17315:17;17305:27;;17261:81;17389:2;17381:6;17378:14;17358:18;17355:38;17352:84;;;17408:18;;:::i;:::-;17352:84;17173:269;17122:320;;;:::o;17448:231::-;17588:34;17584:1;17576:6;17572:14;17565:58;17657:14;17652:2;17644:6;17640:15;17633:39;17448:231;:::o;17685:366::-;17827:3;17848:67;17912:2;17907:3;17848:67;:::i;:::-;17841:74;;17924:93;18013:3;17924:93;:::i;:::-;18042:2;18037:3;18033:12;18026:19;;17685:366;;;:::o;18057:419::-;18223:4;18261:2;18250:9;18246:18;18238:26;;18310:9;18304:4;18300:20;18296:1;18285:9;18281:17;18274:47;18338:131;18464:4;18338:131;:::i;:::-;18330:139;;18057:419;;;:::o;18482:220::-;18622:34;18618:1;18610:6;18606:14;18599:58;18691:3;18686:2;18678:6;18674:15;18667:28;18482:220;:::o;18708:366::-;18850:3;18871:67;18935:2;18930:3;18871:67;:::i;:::-;18864:74;;18947:93;19036:3;18947:93;:::i;:::-;19065:2;19060:3;19056:12;19049:19;;18708:366;;;:::o;19080:419::-;19246:4;19284:2;19273:9;19269:18;19261:26;;19333:9;19327:4;19323:20;19319:1;19308:9;19304:17;19297:47;19361:131;19487:4;19361:131;:::i;:::-;19353:139;;19080:419;;;:::o;19505:243::-;19645:34;19641:1;19633:6;19629:14;19622:58;19714:26;19709:2;19701:6;19697:15;19690:51;19505:243;:::o;19754:366::-;19896:3;19917:67;19981:2;19976:3;19917:67;:::i;:::-;19910:74;;19993:93;20082:3;19993:93;:::i;:::-;20111:2;20106:3;20102:12;20095:19;;19754:366;;;:::o;20126:419::-;20292:4;20330:2;20319:9;20315:18;20307:26;;20379:9;20373:4;20369:20;20365:1;20354:9;20350:17;20343:47;20407:131;20533:4;20407:131;:::i;:::-;20399:139;;20126:419;;;:::o;20551:182::-;20691:34;20687:1;20679:6;20675:14;20668:58;20551:182;:::o;20739:366::-;20881:3;20902:67;20966:2;20961:3;20902:67;:::i;:::-;20895:74;;20978:93;21067:3;20978:93;:::i;:::-;21096:2;21091:3;21087:12;21080:19;;20739:366;;;:::o;21111:419::-;21277:4;21315:2;21304:9;21300:18;21292:26;;21364:9;21358:4;21354:20;21350:1;21339:9;21335:17;21328:47;21392:131;21518:4;21392:131;:::i;:::-;21384:139;;21111:419;;;:::o;21536:236::-;21676:34;21672:1;21664:6;21660:14;21653:58;21745:19;21740:2;21732:6;21728:15;21721:44;21536:236;:::o;21778:366::-;21920:3;21941:67;22005:2;22000:3;21941:67;:::i;:::-;21934:74;;22017:93;22106:3;22017:93;:::i;:::-;22135:2;22130:3;22126:12;22119:19;;21778:366;;;:::o;22150:419::-;22316:4;22354:2;22343:9;22339:18;22331:26;;22403:9;22397:4;22393:20;22389:1;22378:9;22374:17;22367:47;22431:131;22557:4;22431:131;:::i;:::-;22423:139;;22150:419;;;:::o;22575:230::-;22715:34;22711:1;22703:6;22699:14;22692:58;22784:13;22779:2;22771:6;22767:15;22760:38;22575:230;:::o;22811:366::-;22953:3;22974:67;23038:2;23033:3;22974:67;:::i;:::-;22967:74;;23050:93;23139:3;23050:93;:::i;:::-;23168:2;23163:3;23159:12;23152:19;;22811:366;;;:::o;23183:419::-;23349:4;23387:2;23376:9;23372:18;23364:26;;23436:9;23430:4;23426:20;23422:1;23411:9;23407:17;23400:47;23464:131;23590:4;23464:131;:::i;:::-;23456:139;;23183:419;;;:::o;23608:180::-;23656:77;23653:1;23646:88;23753:4;23750:1;23743:15;23777:4;23774:1;23767:15;23794:180;23842:77;23839:1;23832:88;23939:4;23936:1;23929:15;23963:4;23960:1;23953:15;23980:233;24019:3;24042:24;24060:5;24042:24;:::i;:::-;24033:33;;24088:66;24081:5;24078:77;24075:103;;;24158:18;;:::i;:::-;24075:103;24205:1;24198:5;24194:13;24187:20;;23980:233;;;:::o;24219:231::-;24359:34;24355:1;24347:6;24343:14;24336:58;24428:14;24423:2;24415:6;24411:15;24404:39;24219:231;:::o;24456:366::-;24598:3;24619:67;24683:2;24678:3;24619:67;:::i;:::-;24612:74;;24695:93;24784:3;24695:93;:::i;:::-;24813:2;24808:3;24804:12;24797:19;;24456:366;;;:::o;24828:419::-;24994:4;25032:2;25021:9;25017:18;25009:26;;25081:9;25075:4;25071:20;25067:1;25056:9;25052:17;25045:47;25109:131;25235:4;25109:131;:::i;:::-;25101:139;;24828:419;;;:::o;25253:228::-;25393:34;25389:1;25381:6;25377:14;25370:58;25462:11;25457:2;25449:6;25445:15;25438:36;25253:228;:::o;25487:366::-;25629:3;25650:67;25714:2;25709:3;25650:67;:::i;:::-;25643:74;;25726:93;25815:3;25726:93;:::i;:::-;25844:2;25839:3;25835:12;25828:19;;25487:366;;;:::o;25859:419::-;26025:4;26063:2;26052:9;26048:18;26040:26;;26112:9;26106:4;26102:20;26098:1;26087:9;26083:17;26076:47;26140:131;26266:4;26140:131;:::i;:::-;26132:139;;25859:419;;;:::o;26284:229::-;26424:34;26420:1;26412:6;26408:14;26401:58;26493:12;26488:2;26480:6;26476:15;26469:37;26284:229;:::o;26519:366::-;26661:3;26682:67;26746:2;26741:3;26682:67;:::i;:::-;26675:74;;26758:93;26847:3;26758:93;:::i;:::-;26876:2;26871:3;26867:12;26860:19;;26519:366;;;:::o;26891:419::-;27057:4;27095:2;27084:9;27080:18;27072:26;;27144:9;27138:4;27134:20;27130:1;27119:9;27115:17;27108:47;27172:131;27298:4;27172:131;:::i;:::-;27164:139;;26891:419;;;:::o;27316:234::-;27456:34;27452:1;27444:6;27440:14;27433:58;27525:17;27520:2;27512:6;27508:15;27501:42;27316:234;:::o;27556:366::-;27698:3;27719:67;27783:2;27778:3;27719:67;:::i;:::-;27712:74;;27795:93;27884:3;27795:93;:::i;:::-;27913:2;27908:3;27904:12;27897:19;;27556:366;;;:::o;27928:419::-;28094:4;28132:2;28121:9;28117:18;28109:26;;28181:9;28175:4;28171:20;28167:1;28156:9;28152:17;28145:47;28209:131;28335:4;28209:131;:::i;:::-;28201:139;;27928:419;;;:::o;28353:148::-;28455:11;28492:3;28477:18;;28353:148;;;;:::o;28507:377::-;28613:3;28641:39;28674:5;28641:39;:::i;:::-;28696:89;28778:6;28773:3;28696:89;:::i;:::-;28689:96;;28794:52;28839:6;28834:3;28827:4;28820:5;28816:16;28794:52;:::i;:::-;28871:6;28866:3;28862:16;28855:23;;28617:267;28507:377;;;;:::o;28890:155::-;29030:7;29026:1;29018:6;29014:14;29007:31;28890:155;:::o;29051:400::-;29211:3;29232:84;29314:1;29309:3;29232:84;:::i;:::-;29225:91;;29325:93;29414:3;29325:93;:::i;:::-;29443:1;29438:3;29434:11;29427:18;;29051:400;;;:::o;29457:541::-;29690:3;29712:95;29803:3;29794:6;29712:95;:::i;:::-;29705:102;;29824:148;29968:3;29824:148;:::i;:::-;29817:155;;29989:3;29982:10;;29457:541;;;;:::o;30004:173::-;30144:25;30140:1;30132:6;30128:14;30121:49;30004:173;:::o;30183:366::-;30325:3;30346:67;30410:2;30405:3;30346:67;:::i;:::-;30339:74;;30422:93;30511:3;30422:93;:::i;:::-;30540:2;30535:3;30531:12;30524:19;;30183:366;;;:::o;30555:419::-;30721:4;30759:2;30748:9;30744:18;30736:26;;30808:9;30802:4;30798:20;30794:1;30783:9;30779:17;30772:47;30836:131;30962:4;30836:131;:::i;:::-;30828:139;;30555:419;;;:::o;30980:223::-;31120:34;31116:1;31108:6;31104:14;31097:58;31189:6;31184:2;31176:6;31172:15;31165:31;30980:223;:::o;31209:366::-;31351:3;31372:67;31436:2;31431:3;31372:67;:::i;:::-;31365:74;;31448:93;31537:3;31448:93;:::i;:::-;31566:2;31561:3;31557:12;31550:19;;31209:366;;;:::o;31581:419::-;31747:4;31785:2;31774:9;31770:18;31762:26;;31834:9;31828:4;31824:20;31820:1;31809:9;31805:17;31798:47;31862:131;31988:4;31862:131;:::i;:::-;31854:139;;31581:419;;;:::o;32006:305::-;32046:3;32065:20;32083:1;32065:20;:::i;:::-;32060:25;;32099:20;32117:1;32099:20;:::i;:::-;32094:25;;32253:1;32185:66;32181:74;32178:1;32175:81;32172:107;;;32259:18;;:::i;:::-;32172:107;32303:1;32300;32296:9;32289:16;;32006:305;;;;:::o;32317:182::-;32457:34;32453:1;32445:6;32441:14;32434:58;32317:182;:::o;32505:366::-;32647:3;32668:67;32732:2;32727:3;32668:67;:::i;:::-;32661:74;;32744:93;32833:3;32744:93;:::i;:::-;32862:2;32857:3;32853:12;32846:19;;32505:366;;;:::o;32877:419::-;33043:4;33081:2;33070:9;33066:18;33058:26;;33130:9;33124:4;33120:20;33116:1;33105:9;33101:17;33094:47;33158:131;33284:4;33158:131;:::i;:::-;33150:139;;32877:419;;;:::o;33302:178::-;33442:30;33438:1;33430:6;33426:14;33419:54;33302:178;:::o;33486:366::-;33628:3;33649:67;33713:2;33708:3;33649:67;:::i;:::-;33642:74;;33725:93;33814:3;33725:93;:::i;:::-;33843:2;33838:3;33834:12;33827:19;;33486:366;;;:::o;33858:419::-;34024:4;34062:2;34051:9;34047:18;34039:26;;34111:9;34105:4;34101:20;34097:1;34086:9;34082:17;34075:47;34139:131;34265:4;34139:131;:::i;:::-;34131:139;;33858:419;;;:::o;34283:225::-;34423:34;34419:1;34411:6;34407:14;34400:58;34492:8;34487:2;34479:6;34475:15;34468:33;34283:225;:::o;34514:366::-;34656:3;34677:67;34741:2;34736:3;34677:67;:::i;:::-;34670:74;;34753:93;34842:3;34753:93;:::i;:::-;34871:2;34866:3;34862:12;34855:19;;34514:366;;;:::o;34886:419::-;35052:4;35090:2;35079:9;35075:18;35067:26;;35139:9;35133:4;35129:20;35125:1;35114:9;35110:17;35103:47;35167:131;35293:4;35167:131;:::i;:::-;35159:139;;34886:419;;;:::o;35311:231::-;35451:34;35447:1;35439:6;35435:14;35428:58;35520:14;35515:2;35507:6;35503:15;35496:39;35311:231;:::o;35548:366::-;35690:3;35711:67;35775:2;35770:3;35711:67;:::i;:::-;35704:74;;35787:93;35876:3;35787:93;:::i;:::-;35905:2;35900:3;35896:12;35889:19;;35548:366;;;:::o;35920:419::-;36086:4;36124:2;36113:9;36109:18;36101:26;;36173:9;36167:4;36163:20;36159:1;36148:9;36144:17;36137:47;36201:131;36327:4;36201:131;:::i;:::-;36193:139;;35920:419;;;:::o;36345:224::-;36485:34;36481:1;36473:6;36469:14;36462:58;36554:7;36549:2;36541:6;36537:15;36530:32;36345:224;:::o;36575:366::-;36717:3;36738:67;36802:2;36797:3;36738:67;:::i;:::-;36731:74;;36814:93;36903:3;36814:93;:::i;:::-;36932:2;36927:3;36923:12;36916:19;;36575:366;;;:::o;36947:419::-;37113:4;37151:2;37140:9;37136:18;37128:26;;37200:9;37194:4;37190:20;37186:1;37175:9;37171:17;37164:47;37228:131;37354:4;37228:131;:::i;:::-;37220:139;;36947:419;;;:::o;37372:223::-;37512:34;37508:1;37500:6;37496:14;37489:58;37581:6;37576:2;37568:6;37564:15;37557:31;37372:223;:::o;37601:366::-;37743:3;37764:67;37828:2;37823:3;37764:67;:::i;:::-;37757:74;;37840:93;37929:3;37840:93;:::i;:::-;37958:2;37953:3;37949:12;37942:19;;37601:366;;;:::o;37973:419::-;38139:4;38177:2;38166:9;38162:18;38154:26;;38226:9;38220:4;38216:20;38212:1;38201:9;38197:17;38190:47;38254:131;38380:4;38254:131;:::i;:::-;38246:139;;37973:419;;;:::o;38398:191::-;38438:4;38458:20;38476:1;38458:20;:::i;:::-;38453:25;;38492:20;38510:1;38492:20;:::i;:::-;38487:25;;38531:1;38528;38525:8;38522:34;;;38536:18;;:::i;:::-;38522:34;38581:1;38578;38574:9;38566:17;;38398:191;;;;:::o;38595:175::-;38735:27;38731:1;38723:6;38719:14;38712:51;38595:175;:::o;38776:366::-;38918:3;38939:67;39003:2;38998:3;38939:67;:::i;:::-;38932:74;;39015:93;39104:3;39015:93;:::i;:::-;39133:2;39128:3;39124:12;39117:19;;38776:366;;;:::o;39148:419::-;39314:4;39352:2;39341:9;39337:18;39329:26;;39401:9;39395:4;39391:20;39387:1;39376:9;39372:17;39365:47;39429:131;39555:4;39429:131;:::i;:::-;39421:139;;39148:419;;;:::o;39573:237::-;39713:34;39709:1;39701:6;39697:14;39690:58;39782:20;39777:2;39769:6;39765:15;39758:45;39573:237;:::o;39816:366::-;39958:3;39979:67;40043:2;40038:3;39979:67;:::i;:::-;39972:74;;40055:93;40144:3;40055:93;:::i;:::-;40173:2;40168:3;40164:12;40157:19;;39816:366;;;:::o;40188:419::-;40354:4;40392:2;40381:9;40377:18;40369:26;;40441:9;40435:4;40431:20;40427:1;40416:9;40412:17;40405:47;40469:131;40595:4;40469:131;:::i;:::-;40461:139;;40188:419;;;:::o;40613:435::-;40793:3;40815:95;40906:3;40897:6;40815:95;:::i;:::-;40808:102;;40927:95;41018:3;41009:6;40927:95;:::i;:::-;40920:102;;41039:3;41032:10;;40613:435;;;;;:::o;41054:94::-;41087:8;41135:5;41131:2;41127:14;41106:35;;41054:94;;;:::o;41154:::-;41193:7;41222:20;41236:5;41222:20;:::i;:::-;41211:31;;41154:94;;;:::o;41254:100::-;41293:7;41322:26;41342:5;41322:26;:::i;:::-;41311:37;;41254:100;;;:::o;41360:157::-;41465:45;41485:24;41503:5;41485:24;:::i;:::-;41465:45;:::i;:::-;41460:3;41453:58;41360:157;;:::o;41523:256::-;41635:3;41650:75;41721:3;41712:6;41650:75;:::i;:::-;41750:2;41745:3;41741:12;41734:19;;41770:3;41763:10;;41523:256;;;;:::o;41785:98::-;41836:6;41870:5;41864:12;41854:22;;41785:98;;;:::o;41889:168::-;41972:11;42006:6;42001:3;41994:19;42046:4;42041:3;42037:14;42022:29;;41889:168;;;;:::o;42063:360::-;42149:3;42177:38;42209:5;42177:38;:::i;:::-;42231:70;42294:6;42289:3;42231:70;:::i;:::-;42224:77;;42310:52;42355:6;42350:3;42343:4;42336:5;42332:16;42310:52;:::i;:::-;42387:29;42409:6;42387:29;:::i;:::-;42382:3;42378:39;42371:46;;42153:270;42063:360;;;;:::o;42429:640::-;42624:4;42662:3;42651:9;42647:19;42639:27;;42676:71;42744:1;42733:9;42729:17;42720:6;42676:71;:::i;:::-;42757:72;42825:2;42814:9;42810:18;42801:6;42757:72;:::i;:::-;42839;42907:2;42896:9;42892:18;42883:6;42839:72;:::i;:::-;42958:9;42952:4;42948:20;42943:2;42932:9;42928:18;42921:48;42986:76;43057:4;43048:6;42986:76;:::i;:::-;42978:84;;42429:640;;;;;;;:::o;43075:141::-;43131:5;43162:6;43156:13;43147:22;;43178:32;43204:5;43178:32;:::i;:::-;43075:141;;;;:::o;43222:349::-;43291:6;43340:2;43328:9;43319:7;43315:23;43311:32;43308:119;;;43346:79;;:::i;:::-;43308:119;43466:1;43491:63;43546:7;43537:6;43526:9;43522:22;43491:63;:::i;:::-;43481:73;;43437:127;43222:349;;;;:::o;43577:180::-;43625:77;43622:1;43615:88;43722:4;43719:1;43712:15;43746:4;43743:1;43736:15;43763:185;43803:1;43820:20;43838:1;43820:20;:::i;:::-;43815:25;;43854:20;43872:1;43854:20;:::i;:::-;43849:25;;43893:1;43883:35;;43898:18;;:::i;:::-;43883:35;43940:1;43937;43933:9;43928:14;;43763:185;;;;:::o;43954:176::-;43986:1;44003:20;44021:1;44003:20;:::i;:::-;43998:25;;44037:20;44055:1;44037:20;:::i;:::-;44032:25;;44076:1;44066:35;;44081:18;;:::i;:::-;44066:35;44122:1;44119;44115:9;44110:14;;43954:176;;;;:::o;44136:182::-;44276:34;44272:1;44264:6;44260:14;44253:58;44136:182;:::o;44324:366::-;44466:3;44487:67;44551:2;44546:3;44487:67;:::i;:::-;44480:74;;44563:93;44652:3;44563:93;:::i;:::-;44681:2;44676:3;44672:12;44665:19;;44324:366;;;:::o;44696:419::-;44862:4;44900:2;44889:9;44885:18;44877:26;;44949:9;44943:4;44939:20;44935:1;44924:9;44920:17;44913:47;44977:131;45103:4;44977:131;:::i;:::-;44969:139;;44696:419;;;:::o;45121:178::-;45261:30;45257:1;45249:6;45245:14;45238:54;45121:178;:::o;45305:366::-;45447:3;45468:67;45532:2;45527:3;45468:67;:::i;:::-;45461:74;;45544:93;45633:3;45544:93;:::i;:::-;45662:2;45657:3;45653:12;45646:19;;45305:366;;;:::o;45677:419::-;45843:4;45881:2;45870:9;45866:18;45858:26;;45930:9;45924:4;45920:20;45916:1;45905:9;45901:17;45894:47;45958:131;46084:4;45958:131;:::i;:::-;45950:139;;45677:419;;;:::o;46102:180::-;46150:77;46147:1;46140:88;46247:4;46244:1;46237:15;46271:4;46268:1;46261:15

Swarm Source

ipfs://048ab52dc0cf9379185180ab73f35d8e05235b1794775ba93439814e39debd91
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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