ETH Price: $2,606.99 (+0.26%)
Gas: 1 Gwei

Token

The Open Metaverse (MTVS)
 

Overview

Max Total Supply

134 MTVS

Holders

69

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
jakopo.eth
Balance
1 MTVS
0x99A5A6010e81d3Efa13d5832043E9C3B6c11Ef3d
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:
TheOpenMetaverse

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-22
*/

/**
 *Submitted for verification at Etherscan.io on 2021-08-27
*/

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






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

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

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

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

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

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

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

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

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

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

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

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




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




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









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

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

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

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

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

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

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

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





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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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














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







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





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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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









/**
 * @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 overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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







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

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

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


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


contract TheOpenMetaverse is ERC721Enumerable, ReentrancyGuard, Ownable {

    uint256 private tokenId = 1;
    uint256 private reserveTokenId = 9501;

    string[] private World = [
        "Galaxy",
        "Nebula",
        "Red giant",
        "White dwarf",
        "Pulsar",
        "Black hole",
        "Dark matter",
        "Mercury",
        "Venus",
        "Earth",
        "Mars",
        "Jupiter",
        "Saturn",
        "Uranus",
        "Neptune"
    ];
    
    string[] private Environment = [
        "Coast",
        "Mountain",
        "Sea",
        "Woods",
        "Valley",
        "River",
        "Hill",
        "Field",
        "Suburb",
        "City",
        "Town",
        "Village",
        "Park",
        "Lake",
        "Volcano"
    ];
    
    string[] private Building = [
        "Architecture",
        "Construction",
        "Home",
        "House",
        "Apartment",
        "Duplex",
        "Office",
        "Estate",
        "Garage",
        "Shed",
        "Factory",
        "Shop",
        "Storage",
        "Farm",
        "Hut"
    ];
    
    string[] private Transport = [
        "Car",
        "Train",
        "Bus",
        "Coach",
        "Plane",
        "Boat",
        "Ship",
        "Tram",
        "Taxi",
        "Bike",
        "Moped",
        "Motorbike",
        "Ferry",
        "Helicopter",
        "Monorail",
        "Trolleybus",
        "Rickshaw",
        "Litter"
    ];
    
    string[] private Avatar = [
        "Archetype",
        "Warrior",
        "Fighter",
        "Farmer",
        "Priest",
        "Animal",
        "Beast",
        "Furry",
        "Hentai",
        "VR Avatar",
        "Celebrity",
        "Monk",
        "Entrepreneur",
        "Businessman",
        "Vampire"
    ];
    
    string[] private Skill = [
        "Cooking",
        "Farming",
        "Hunting",
        "Gardening",
        "Drawing",
        "Building",
        "Washing",
        "Driving",
        "Teaching",
        "Consulting",
        "Plastering",
        "Digging",
        "Flying",
        "Playing",
        "Art"
    ];
    
    string[] private Resource = [
        "Data",
        "Dollars",
        "Cryptocurrancy",
        "Land",
        "Gold",
        "Gems",
        "Wind",
        "Sunlight",
        "Hydro",
        "Nuclear",
        "Art",
        "Food",
        "Wood",
        "Steel",
        "Concrete"
    ];
    
    string[] private Element = [
        "Earth",
        "Air",
        "Fire",
        "Water",
        "Space"
    ];
    
    function random(string memory input) internal pure returns (uint256) {
        return uint256(keccak256(abi.encodePacked(input)));
    }
    
    function getWorld(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "World", World);
    }
    
    function getEnvironment(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "Environment", Environment);
    }
    
    function getBuilding(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "Building", Building);
    }
    
    function getTransport(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "Transport", Transport);
    }

    function getAvatar(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "Avatar", Avatar);
    }
    
    function getSkill(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "Skill", Skill);
    }
    
    function getResource(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "Resource", Resource);
    }
    
    function getElement(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "Element", Element);
    }
    
    function pluck(uint256 tokenId, string memory keyPrefix, string[] memory sourceArray) internal view returns (string memory) {
        uint256 rand = random(string(abi.encodePacked(keyPrefix, toString(tokenId))));
        string memory output = sourceArray[rand % sourceArray.length];

        return output;
    }

    function tokenURI(uint256 tokenId) override public view returns (string memory) {
        string[17] memory parts;
        parts[0] = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 350"><style>.base { fill: white; font-family: serif; font-size: 14px; }</style><rect width="100%" height="100%" fill="black" /><text x="10" y="20" class="base">';

        parts[1] = getWorld(tokenId);

        parts[2] = '</text><text x="10" y="40" class="base">';

        parts[3] = getEnvironment(tokenId);

        parts[4] = '</text><text x="10" y="60" class="base">';

        parts[5] = getBuilding(tokenId);

        parts[6] = '</text><text x="10" y="80" class="base">';

        parts[7] = getTransport(tokenId);

        parts[8] = '</text><text x="10" y="100" class="base">';

        parts[9] = getAvatar(tokenId);

        parts[10] = '</text><text x="10" y="120" class="base">';

        parts[11] = getSkill(tokenId);

        parts[12] = '</text><text x="10" y="140" class="base">';

        parts[13] = getResource(tokenId);

        parts[14] = '</text><text x="10" y="160" class="base">';

        parts[15] = getElement(tokenId);

        parts[16] = '</text></svg>';

        string memory output = string(abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6], parts[7], parts[8]));
        output = string(abi.encodePacked(output, parts[9], parts[10], parts[11], parts[12], parts[13], parts[14], parts[15], parts[16]));
        
        string memory traits = string(abi.encodePacked('{"trait_type": "Environment","value": "',parts[3],'"},{"trait_type": "Resource","value": "',parts[13],'"},{"trait_type": "Skill","value": "',parts[11],'"},{"trait_type": "Transport","value": "',parts[7],'"},{"trait_type": "Avatar","value": "',parts[9],'"},{"trait_type": "World","value": "',parts[1],'"},{"trait_type": "Element","value": "',parts[15],'"},{"trait_type": "Building","value": "',parts[5],'"}'));

       string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "Resource #', toString(tokenId), '","description": "The Open Metaverse project consists of 10,000 alphanumeric NFTs of randomised stuff generated and stored on the Ethereum blockchain. The NFTs are free to mint (+ gas) and can be used to build The Open Metaverse.","image": "data:image/svg+xml;base64,', Base64.encode(bytes(output)), '", "traits": [', traits,'] }'))));
       output = string(abi.encodePacked('data:application/json;base64,', json));

        return output;
    }

    function claim() public nonReentrant {
        require(tokenId > 0 && tokenId < 9501, "Token ID invalid");
        _safeMint(_msgSender(), tokenId);
        tokenId++;
    }
    
    function ownerClaim(uint256 quantity) public nonReentrant onlyOwner {
        require(reserveTokenId > 9500 && reserveTokenId < 10001, "Reserved Token ID invalid");
        uint256 finaltokenid = reserveTokenId + quantity;
        for(uint256 i=reserveTokenId; i<finaltokenid; i++){
            _safeMint(owner(), i);
            reserveTokenId++;
        }
    }
    
    function toString(uint256 value) internal pure returns (string memory) {
    // Inspired by OraclizeAPI's implementation - MIT license
    // 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);
    }
    function contractURI() public view returns (string memory) {
        string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "The Open Metaverse", "description": "The Open Metaverse project consists of 10,000 alphanumeric NFTs of randomised stuff generated and stored on the Ethereum blockchain. The NFTs are free to mint (+ gas) and can be used to build The Open Metaverse.", "seller_fee_basis_points": 500, "fee_recipient": "0x54d6b6c93180264285b906f42a3d6330fd0da3a1"}'))));
        json = string(abi.encodePacked('data:application/json;base64,', json));
        return json;
    }

    constructor() ERC721("The Open Metaverse", "MTVS") Ownable() {
        // ownerClaim();
    }
}

/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((len + 2) / 3);

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"uint256","name":"tokenId","type":"uint256"}],"name":"getAvatar","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getBuilding","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getElement","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getEnvironment","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getResource","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSkill","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTransport","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getWorld","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"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":"quantity","type":"uint256"}],"name":"ownerClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"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"}]

60806040526001600c5561251d600d55604051806101e001604052806040518060400160405280600681526020017f47616c617879000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4e6562756c61000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f526564206769616e74000000000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f576869746520647761726600000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f50756c736172000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f426c61636b20686f6c650000000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f4461726b206d617474657200000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4d6572637572790000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f56656e757300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f456172746800000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4d6172730000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4a7570697465720000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f53617475726e000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f5572616e7573000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4e657074756e6500000000000000000000000000000000000000000000000000815250815250600e90600f620003a092919062001cab565b50604051806101e001604052806040518060400160405280600581526020017f436f61737400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f4d6f756e7461696e00000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f536561000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f576f6f647300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f56616c6c6579000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f526976657200000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f48696c6c0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4669656c6400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f537562757262000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f436974790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f546f776e0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f56696c6c6167650000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f5061726b0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4c616b650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f566f6c63616e6f00000000000000000000000000000000000000000000000000815250815250600f90600f6200073292919062001cab565b50604051806101e001604052806040518060400160405280600c81526020017f417263686974656374757265000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f436f6e737472756374696f6e000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f486f6d650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f486f75736500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f41706172746d656e74000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4475706c6578000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4f6666696365000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f457374617465000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f476172616765000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f536865640000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f466163746f72790000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f53686f700000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f53746f726167650000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4661726d0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f4875740000000000000000000000000000000000000000000000000000000000815250815250601090600f62000ac492919062001cab565b506040518061024001604052806040518060400160405280600381526020017f436172000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f547261696e00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f427573000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f436f61636800000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f506c616e6500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f426f61740000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f536869700000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f5472616d0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f546178690000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f42696b650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4d6f70656400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f4d6f746f7262696b65000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f466572727900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f48656c69636f707465720000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f4d6f6e6f7261696c00000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f54726f6c6c65796275730000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f5269636b7368617700000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4c69747465720000000000000000000000000000000000000000000000000000815250815250601190601262000f0792919062001d12565b50604051806101e001604052806040518060400160405280600981526020017f417263686574797065000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f57617272696f720000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f466967687465720000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4661726d6572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f507269657374000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f416e696d616c000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f426561737400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f467572727900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f48656e746169000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f565220417661746172000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f43656c656272697479000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4d6f6e6b0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f456e7472657072656e657572000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f427573696e6573736d616e00000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f56616d7069726500000000000000000000000000000000000000000000000000815250815250601290600f6200129992919062001cab565b50604051806101e001604052806040518060400160405280600781526020017f436f6f6b696e670000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4661726d696e670000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f48756e74696e670000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f47617264656e696e67000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f44726177696e670000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f4275696c64696e6700000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f57617368696e670000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f44726976696e670000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f5465616368696e6700000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f436f6e73756c74696e670000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f506c6173746572696e670000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f44696767696e670000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f466c79696e67000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f506c6179696e670000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f4172740000000000000000000000000000000000000000000000000000000000815250815250601390600f6200162b92919062001cab565b50604051806101e001604052806040518060400160405280600481526020017f446174610000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f446f6c6c6172730000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f43727970746f63757272616e637900000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4c616e640000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f476f6c640000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f47656d730000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f57696e640000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f53756e6c6967687400000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f487964726f00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4e75636c6561720000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f417274000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f466f6f640000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f576f6f640000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f537465656c00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f436f6e6372657465000000000000000000000000000000000000000000000000815250815250601490600f620019bd92919062001cab565b506040518060a001604052806040518060400160405280600581526020017f456172746800000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f416972000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f466972650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f576174657200000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f5370616365000000000000000000000000000000000000000000000000000000815250815250601590600562001b0092919062001d79565b5034801562001b0e57600080fd5b506040518060400160405280601281526020017f546865204f70656e204d657461766572736500000000000000000000000000008152506040518060400160405280600481526020017f4d54565300000000000000000000000000000000000000000000000000000000815250816000908051906020019062001b9392919062001de0565b50806001908051906020019062001bac92919062001de0565b5050506001600a8190555062001bd762001bcb62001bdd60201b60201c565b62001be560201b60201c565b62001f63565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805482825590600052602060002090810192821562001cff579160200282015b8281111562001cfe57825182908051906020019062001ced92919062001de0565b509160200191906001019062001ccc565b5b50905062001d0e919062001e71565b5090565b82805482825590600052602060002090810192821562001d66579160200282015b8281111562001d6557825182908051906020019062001d5492919062001de0565b509160200191906001019062001d33565b5b50905062001d75919062001e71565b5090565b82805482825590600052602060002090810192821562001dcd579160200282015b8281111562001dcc57825182908051906020019062001dbb92919062001de0565b509160200191906001019062001d9a565b5b50905062001ddc919062001e71565b5090565b82805462001dee9062001efe565b90600052602060002090601f01602090048101928262001e12576000855562001e5e565b82601f1062001e2d57805160ff191683800117855562001e5e565b8280016001018555821562001e5e579182015b8281111562001e5d57825182559160200191906001019062001e40565b5b50905062001e6d919062001e99565b5090565b5b8082111562001e95576000818162001e8b919062001eb8565b5060010162001e72565b5090565b5b8082111562001eb457600081600090555060010162001e9a565b5090565b50805462001ec69062001efe565b6000825580601f1062001eda575062001efb565b601f01602090049060005260206000209081019062001efa919062001e99565b5b50565b6000600282049050600182168062001f1757607f821691505b6020821081141562001f2e5762001f2d62001f34565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61568c8062001f736000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80636db4080011610104578063b88d4fde116100a2578063cc08549311610071578063cc085493146105b3578063e8a3d485146105e3578063e985e9c514610601578063f2fde38b14610631576101da565b8063b88d4fde14610507578063bc5de5e014610523578063bd880fae14610553578063c87b56dd14610583576101da565b80638da5cb5b116100de5780638da5cb5b1461047f57806395d89b411461049d5780639dfd8b02146104bb578063a22cb465146104eb576101da565b80636db408001461041557806370a0823114610445578063715018a614610475576101da565b806323b872dd1161017c578063434f48c41161014b578063434f48c41461038f5780634e71d92d146103ab5780634f6ccce7146103b55780636352211e146103e5576101da565b806323b872dd146102f75780632f745c59146103135780633a7d22bc1461034357806342842e0e14610373576101da565b8063095ea7b3116101b8578063095ea7b31461025d5780631328ec9b1461027957806318160ddd146102a95780631e8fca2d146102c7576101da565b806301ffc9a7146101df57806306fdde031461020f578063081812fc1461022d575b600080fd5b6101f960048036038101906101f4919061380b565b61064d565b60405161020691906140b9565b60405180910390f35b6102176106c7565b60405161022491906140d4565b60405180910390f35b61024760048036038101906102429190613865565b610759565b6040516102549190614052565b60405180910390f35b610277600480360381019061027291906137cb565b6107de565b005b610293600480360381019061028e9190613865565b6108f6565b6040516102a091906140d4565b60405180910390f35b6102b1610a10565b6040516102be9190614376565b60405180910390f35b6102e160048036038101906102dc9190613865565b610a1d565b6040516102ee91906140d4565b60405180910390f35b610311600480360381019061030c91906136b5565b610b37565b005b61032d600480360381019061032891906137cb565b610b97565b60405161033a9190614376565b60405180910390f35b61035d60048036038101906103589190613865565b610c3c565b60405161036a91906140d4565b60405180910390f35b61038d600480360381019061038891906136b5565b610d56565b005b6103a960048036038101906103a49190613865565b610d76565b005b6103b3610f00565b005b6103cf60048036038101906103ca9190613865565b610fd7565b6040516103dc9190614376565b60405180910390f35b6103ff60048036038101906103fa9190613865565b611048565b60405161040c9190614052565b60405180910390f35b61042f600480360381019061042a9190613865565b6110fa565b60405161043c91906140d4565b60405180910390f35b61045f600480360381019061045a9190613648565b611214565b60405161046c9190614376565b60405180910390f35b61047d6112cc565b005b610487611354565b6040516104949190614052565b60405180910390f35b6104a561137e565b6040516104b291906140d4565b60405180910390f35b6104d560048036038101906104d09190613865565b611410565b6040516104e291906140d4565b60405180910390f35b6105056004803603810190610500919061378b565b61152a565b005b610521600480360381019061051c9190613708565b6116ab565b005b61053d60048036038101906105389190613865565b61170d565b60405161054a91906140d4565b60405180910390f35b61056d60048036038101906105689190613865565b611827565b60405161057a91906140d4565b60405180910390f35b61059d60048036038101906105989190613865565b611941565b6040516105aa91906140d4565b60405180910390f35b6105cd60048036038101906105c89190613865565b611fcc565b6040516105da91906140d4565b60405180910390f35b6105eb6120e6565b6040516105f891906140d4565b60405180910390f35b61061b60048036038101906106169190613675565b61213b565b60405161062891906140b9565b60405180910390f35b61064b60048036038101906106469190613648565b6121cf565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106c057506106bf826122c7565b5b9050919050565b6060600080546106d6906145f5565b80601f0160208091040260200160405190810160405280929190818152602001828054610702906145f5565b801561074f5780601f106107245761010080835404028352916020019161074f565b820191906000526020600020905b81548152906001019060200180831161073257829003601f168201915b5050505050905090565b6000610764826123a9565b6107a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079a90614256565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107e982611048565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561085a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610851906142f6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610879612415565b73ffffffffffffffffffffffffffffffffffffffff1614806108a857506108a7816108a2612415565b61213b565b5b6108e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108de906141d6565b60405180910390fd5b6108f1838361241d565b505050565b6060610a09826040518060400160405280600681526020017f41766174617200000000000000000000000000000000000000000000000000008152506012805480602002602001604051908101604052809291908181526020016000905b82821015610a00578382906000526020600020018054610973906145f5565b80601f016020809104026020016040519081016040528092919081815260200182805461099f906145f5565b80156109ec5780601f106109c1576101008083540402835291602001916109ec565b820191906000526020600020905b8154815290600101906020018083116109cf57829003601f168201915b505050505081526020019060010190610954565b505050506124d6565b9050919050565b6000600880549050905090565b6060610b30826040518060400160405280600881526020017f5265736f757263650000000000000000000000000000000000000000000000008152506014805480602002602001604051908101604052809291908181526020016000905b82821015610b27578382906000526020600020018054610a9a906145f5565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac6906145f5565b8015610b135780601f10610ae857610100808354040283529160200191610b13565b820191906000526020600020905b815481529060010190602001808311610af657829003601f168201915b505050505081526020019060010190610a7b565b505050506124d6565b9050919050565b610b48610b42612415565b82612545565b610b87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7e90614316565b60405180910390fd5b610b92838383612623565b505050565b6000610ba283611214565b8210610be3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bda906140f6565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6060610d4f826040518060400160405280600781526020017f456c656d656e74000000000000000000000000000000000000000000000000008152506015805480602002602001604051908101604052809291908181526020016000905b82821015610d46578382906000526020600020018054610cb9906145f5565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce5906145f5565b8015610d325780601f10610d0757610100808354040283529160200191610d32565b820191906000526020600020905b815481529060010190602001808311610d1557829003601f168201915b505050505081526020019060010190610c9a565b505050506124d6565b9050919050565b610d71838383604051806020016040528060008152506116ab565b505050565b6002600a541415610dbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db390614356565b60405180910390fd5b6002600a81905550610dcc612415565b73ffffffffffffffffffffffffffffffffffffffff16610dea611354565b73ffffffffffffffffffffffffffffffffffffffff1614610e40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3790614276565b60405180910390fd5b61251c600d54118015610e565750612711600d54105b610e95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8c906142d6565b60405180910390fd5b600081600d54610ea5919061442a565b90506000600d5490505b81811015610ef357610ec8610ec2611354565b8261287f565b600d6000815480929190610edb90614658565b91905055508080610eeb90614658565b915050610eaf565b50506001600a8190555050565b6002600a541415610f46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3d90614356565b60405180910390fd5b6002600a819055506000600c54118015610f63575061251d600c54105b610fa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9990614296565b60405180910390fd5b610fb5610fad612415565b600c5461287f565b600c6000815480929190610fc890614658565b91905055506001600a81905550565b6000610fe1610a10565b8210611022576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101990614336565b60405180910390fd5b600882815481106110365761103561478e565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e890614216565b60405180910390fd5b80915050919050565b606061120d826040518060400160405280600b81526020017f456e7669726f6e6d656e74000000000000000000000000000000000000000000815250600f805480602002602001604051908101604052809291908181526020016000905b82821015611204578382906000526020600020018054611177906145f5565b80601f01602080910402602001604051908101604052809291908181526020018280546111a3906145f5565b80156111f05780601f106111c5576101008083540402835291602001916111f0565b820191906000526020600020905b8154815290600101906020018083116111d357829003601f168201915b505050505081526020019060010190611158565b505050506124d6565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611285576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127c906141f6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112d4612415565b73ffffffffffffffffffffffffffffffffffffffff166112f2611354565b73ffffffffffffffffffffffffffffffffffffffff1614611348576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133f90614276565b60405180910390fd5b611352600061289d565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461138d906145f5565b80601f01602080910402602001604051908101604052809291908181526020018280546113b9906145f5565b80156114065780601f106113db57610100808354040283529160200191611406565b820191906000526020600020905b8154815290600101906020018083116113e957829003601f168201915b5050505050905090565b6060611523826040518060400160405280600881526020017f4275696c64696e670000000000000000000000000000000000000000000000008152506010805480602002602001604051908101604052809291908181526020016000905b8282101561151a57838290600052602060002001805461148d906145f5565b80601f01602080910402602001604051908101604052809291908181526020018280546114b9906145f5565b80156115065780601f106114db57610100808354040283529160200191611506565b820191906000526020600020905b8154815290600101906020018083116114e957829003601f168201915b50505050508152602001906001019061146e565b505050506124d6565b9050919050565b611532612415565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159790614196565b60405180910390fd5b80600560006115ad612415565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661165a612415565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161169f91906140b9565b60405180910390a35050565b6116bc6116b6612415565b83612545565b6116fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f290614316565b60405180910390fd5b61170784848484612963565b50505050565b6060611820826040518060400160405280600981526020017f5472616e73706f727400000000000000000000000000000000000000000000008152506011805480602002602001604051908101604052809291908181526020016000905b8282101561181757838290600052602060002001805461178a906145f5565b80601f01602080910402602001604051908101604052809291908181526020018280546117b6906145f5565b80156118035780601f106117d857610100808354040283529160200191611803565b820191906000526020600020905b8154815290600101906020018083116117e657829003601f168201915b50505050508152602001906001019061176b565b505050506124d6565b9050919050565b606061193a826040518060400160405280600581526020017f536b696c6c0000000000000000000000000000000000000000000000000000008152506013805480602002602001604051908101604052809291908181526020016000905b828210156119315783829060005260206000200180546118a4906145f5565b80601f01602080910402602001604051908101604052809291908181526020018280546118d0906145f5565b801561191d5780601f106118f25761010080835404028352916020019161191d565b820191906000526020600020905b81548152906001019060200180831161190057829003601f168201915b505050505081526020019060010190611885565b505050506124d6565b9050919050565b606061194b613547565b60405180610120016040528060fd81526020016154c960fd9139816000601181106119795761197861478e565b5b602002018190525061198a83611fcc565b8160016011811061199e5761199d61478e565b5b602002018190525060405180606001604052806028815260200161562f60289139816002601181106119d3576119d261478e565b5b60200201819052506119e4836110fa565b816003601181106119f8576119f761478e565b5b60200201819052506040518060600160405280602881526020016153fe6028913981600460118110611a2d57611a2c61478e565b5b6020020181905250611a3e83611410565b81600560118110611a5257611a5161478e565b5b60200201819052506040518060600160405280602881526020016154786028913981600660118110611a8757611a8661478e565b5b6020020181905250611a988361170d565b81600760118110611aac57611aab61478e565b5b60200201819052506040518060600160405280602981526020016154a06029913981600860118110611ae157611ae061478e565b5b6020020181905250611af2836108f6565b81600960118110611b0657611b0561478e565b5b602002018190525060405180606001604052806029815260200161544f6029913981600a60118110611b3b57611b3a61478e565b5b6020020181905250611b4c83611827565b81600b60118110611b6057611b5f61478e565b5b60200201819052506040518060600160405280602981526020016155c66029913981600c60118110611b9557611b9461478e565b5b6020020181905250611ba683610a1d565b81600d60118110611bba57611bb961478e565b5b60200201819052506040518060600160405280602981526020016154266029913981600e60118110611bef57611bee61478e565b5b6020020181905250611c0083610c3c565b81600f60118110611c1457611c1361478e565b5b60200201819052506040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e0000000000000000000000000000000000000081525081601060118110611c6657611c6561478e565b5b6020020181905250600081600060118110611c8457611c8361478e565b5b602002015182600160118110611c9d57611c9c61478e565b5b602002015183600260118110611cb657611cb561478e565b5b602002015184600360118110611ccf57611cce61478e565b5b602002015185600460118110611ce857611ce761478e565b5b602002015186600560118110611d0157611d0061478e565b5b602002015187600660118110611d1a57611d1961478e565b5b602002015188600760118110611d3357611d3261478e565b5b602002015189600860118110611d4c57611d4b61478e565b5b6020020151604051602001611d6999989796959493929190613e6a565b60405160208183030381529060405290508082600960118110611d8f57611d8e61478e565b5b602002015183600a60118110611da857611da761478e565b5b602002015184600b60118110611dc157611dc061478e565b5b602002015185600c60118110611dda57611dd961478e565b5b602002015186600d60118110611df357611df261478e565b5b602002015187600e60118110611e0c57611e0b61478e565b5b602002015188600f60118110611e2557611e2461478e565b5b602002015189601060118110611e3e57611e3d61478e565b5b6020020151604051602001611e5b99989796959493929190613e6a565b6040516020818303038152906040529050600082600360118110611e8257611e8161478e565b5b602002015183600d60118110611e9b57611e9a61478e565b5b602002015184600b60118110611eb457611eb361478e565b5b602002015185600760118110611ecd57611ecc61478e565b5b602002015186600960118110611ee657611ee561478e565b5b602002015187600160118110611eff57611efe61478e565b5b602002015188600f60118110611f1857611f1761478e565b5b602002015189600560118110611f3157611f3061478e565b5b6020020151604051602001611f4d989796959493929190613efe565b60405160208183030381529060405290506000611f9c611f6c876129bf565b611f7585612b20565b84604051602001611f8893929190613fd3565b604051602081830303815290604052612b20565b905080604051602001611faf9190614030565b604051602081830303815290604052925082945050505050919050565b60606120df826040518060400160405280600581526020017f576f726c64000000000000000000000000000000000000000000000000000000815250600e805480602002602001604051908101604052809291908181526020016000905b828210156120d6578382906000526020600020018054612049906145f5565b80601f0160208091040260200160405190810160405280929190818152602001828054612075906145f5565b80156120c25780601f10612097576101008083540402835291602001916120c2565b820191906000526020600020905b8154815290600101906020018083116120a557829003601f168201915b50505050508152602001906001019061202a565b505050506124d6565b9050919050565b606060006121106040516020016120fc90613ee9565b604051602081830303815290604052612b20565b9050806040516020016121239190614030565b60405160208183030381529060405290508091505090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121d7612415565b73ffffffffffffffffffffffffffffffffffffffff166121f5611354565b73ffffffffffffffffffffffffffffffffffffffff161461224b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224290614276565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b290614136565b60405180910390fd5b6122c48161289d565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061239257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806123a257506123a182612cb8565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661249083611048565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6060600061250c846124e7876129bf565b6040516020016124f8929190613e46565b604051602081830303815290604052612d22565b905060008384518361251e91906146a1565b8151811061252f5761252e61478e565b5b6020026020010151905080925050509392505050565b6000612550826123a9565b61258f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612586906141b6565b60405180910390fd5b600061259a83611048565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061260957508373ffffffffffffffffffffffffffffffffffffffff166125f184610759565b73ffffffffffffffffffffffffffffffffffffffff16145b8061261a5750612619818561213b565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661264382611048565b73ffffffffffffffffffffffffffffffffffffffff1614612699576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612690906142b6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612709576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270090614176565b60405180910390fd5b612714838383612d55565b61271f60008261241d565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461276f919061450b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127c6919061442a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612899828260405180602001604052806000815250612e69565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61296e848484612623565b61297a84848484612ec4565b6129b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b090614116565b60405180910390fd5b50505050565b60606000821415612a07576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b1b565b600082905060005b60008214612a39578080612a2290614658565b915050600a82612a329190614480565b9150612a0f565b60008167ffffffffffffffff811115612a5557612a546147bd565b5b6040519080825280601f01601f191660200182016040528015612a875781602001600182028036833780820191505090505b5090505b60008514612b1457600182612aa0919061450b565b9150600a85612aaf91906146a1565b6030612abb919061442a565b60f81b818381518110612ad157612ad061478e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b0d9190614480565b9450612a8b565b8093505050505b919050565b60606000825190506000811415612b495760405180602001604052806000815250915050612cb3565b60006003600283612b5a919061442a565b612b649190614480565b6004612b7091906144b1565b90506000602082612b81919061442a565b67ffffffffffffffff811115612b9a57612b996147bd565b5b6040519080825280601f01601f191660200182016040528015612bcc5781602001600182028036833780820191505090505b50905060006040518060600160405280604081526020016155ef604091399050600181016020830160005b86811015612c705760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050612bf7565b506003860660018114612c8a5760028114612c9a57612ca5565b613d3d60f01b6002830352612ca5565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081604051602001612d359190613e2f565b6040516020818303038152906040528051906020012060001c9050919050565b612d6083838361305b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612da357612d9e81613060565b612de2565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612de157612de083826130a9565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e2557612e2081613216565b612e64565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612e6357612e6282826132e7565b5b5b505050565b612e738383613366565b612e806000848484612ec4565b612ebf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb690614116565b60405180910390fd5b505050565b6000612ee58473ffffffffffffffffffffffffffffffffffffffff16613534565b1561304e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f0e612415565b8786866040518563ffffffff1660e01b8152600401612f30949392919061406d565b602060405180830381600087803b158015612f4a57600080fd5b505af1925050508015612f7b57506040513d601f19601f82011682018060405250810190612f789190613838565b60015b612ffe573d8060008114612fab576040519150601f19603f3d011682016040523d82523d6000602084013e612fb0565b606091505b50600081511415612ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fed90614116565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613053565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016130b684611214565b6130c0919061450b565b90506000600760008481526020019081526020016000205490508181146131a5576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061322a919061450b565b905060006009600084815260200190815260200160002054905060006008838154811061325a5761325961478e565b5b90600052602060002001549050806008838154811061327c5761327b61478e565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806132cb576132ca61475f565b5b6001900381819060005260206000200160009055905550505050565b60006132f283611214565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133cd90614236565b60405180910390fd5b6133df816123a9565b1561341f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341690614156565b60405180910390fd5b61342b60008383612d55565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461347b919061442a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6040518061022001604052806011905b60608152602001906001900390816135575790505090565b600061358261357d846143b6565b614391565b90508281526020810184848401111561359e5761359d6147f1565b5b6135a98482856145b3565b509392505050565b6000813590506135c0816153a1565b92915050565b6000813590506135d5816153b8565b92915050565b6000813590506135ea816153cf565b92915050565b6000815190506135ff816153cf565b92915050565b600082601f83011261361a576136196147ec565b5b813561362a84826020860161356f565b91505092915050565b600081359050613642816153e6565b92915050565b60006020828403121561365e5761365d6147fb565b5b600061366c848285016135b1565b91505092915050565b6000806040838503121561368c5761368b6147fb565b5b600061369a858286016135b1565b92505060206136ab858286016135b1565b9150509250929050565b6000806000606084860312156136ce576136cd6147fb565b5b60006136dc868287016135b1565b93505060206136ed868287016135b1565b92505060406136fe86828701613633565b9150509250925092565b60008060008060808587031215613722576137216147fb565b5b6000613730878288016135b1565b9450506020613741878288016135b1565b935050604061375287828801613633565b925050606085013567ffffffffffffffff811115613773576137726147f6565b5b61377f87828801613605565b91505092959194509250565b600080604083850312156137a2576137a16147fb565b5b60006137b0858286016135b1565b92505060206137c1858286016135c6565b9150509250929050565b600080604083850312156137e2576137e16147fb565b5b60006137f0858286016135b1565b925050602061380185828601613633565b9150509250929050565b600060208284031215613821576138206147fb565b5b600061382f848285016135db565b91505092915050565b60006020828403121561384e5761384d6147fb565b5b600061385c848285016135f0565b91505092915050565b60006020828403121561387b5761387a6147fb565b5b600061388984828501613633565b91505092915050565b61389b8161453f565b82525050565b6138aa81614551565b82525050565b60006138bb826143e7565b6138c581856143fd565b93506138d58185602086016145c2565b6138de81614800565b840191505092915050565b60006138f4826143f2565b6138fe818561440e565b935061390e8185602086016145c2565b61391781614800565b840191505092915050565b600061392d826143f2565b613937818561441f565b93506139478185602086016145c2565b80840191505092915050565b600061396060268361441f565b915061396b82614811565b602682019050919050565b6000613983600e8361441f565b915061398e82614860565b600e82019050919050565b60006139a76101638361441f565b91506139b282614889565b61016382019050919050565b60006139cb602b8361440e565b91506139d682614a58565b604082019050919050565b60006139ee60328361440e565b91506139f982614aa7565b604082019050919050565b6000613a1160278361441f565b9150613a1c82614af6565b602782019050919050565b6000613a3460268361440e565b9150613a3f82614b45565b604082019050919050565b6000613a5760258361441f565b9150613a6282614b94565b602582019050919050565b6000613a7a601c8361440e565b9150613a8582614be3565b602082019050919050565b6000613a9d60248361440e565b9150613aa882614c0c565b604082019050919050565b6000613ac060148361441f565b9150613acb82614c5b565b601482019050919050565b6000613ae360198361440e565b9150613aee82614c84565b602082019050919050565b6000613b0660288361441f565b9150613b1182614cad565b602882019050919050565b6000613b2960038361441f565b9150613b3482614cfc565b600382019050919050565b6000613b4c602c8361440e565b9150613b5782614d25565b604082019050919050565b6000613b6f60248361441f565b9150613b7a82614d74565b602482019050919050565b6000613b9260388361440e565b9150613b9d82614dc3565b604082019050919050565b6000613bb5602a8361440e565b9150613bc082614e12565b604082019050919050565b6000613bd860298361440e565b9150613be382614e61565b604082019050919050565b6000613bfb60028361441f565b9150613c0682614eb0565b600282019050919050565b6000613c1e60208361440e565b9150613c2982614ed9565b602082019050919050565b6000613c41602c8361440e565b9150613c4c82614f02565b604082019050919050565b6000613c6460278361441f565b9150613c6f82614f51565b602782019050919050565b6000613c8760208361440e565b9150613c9282614fa0565b602082019050919050565b6000613caa60108361440e565b9150613cb582614fc9565b602082019050919050565b6000613ccd60298361440e565b9150613cd882614ff2565b604082019050919050565b6000613cf161010b8361441f565b9150613cfc82615041565b61010b82019050919050565b6000613d1560198361440e565b9150613d208261519b565b602082019050919050565b6000613d3860248361441f565b9150613d43826151c4565b602482019050919050565b6000613d5b60218361440e565b9150613d6682615213565b604082019050919050565b6000613d7e601d8361441f565b9150613d8982615262565b601d82019050919050565b6000613da160318361440e565b9150613dac8261528b565b604082019050919050565b6000613dc4602c8361440e565b9150613dcf826152da565b604082019050919050565b6000613de760278361441f565b9150613df282615329565b602782019050919050565b6000613e0a601f8361440e565b9150613e1582615378565b602082019050919050565b613e29816145a9565b82525050565b6000613e3b8284613922565b915081905092915050565b6000613e528285613922565b9150613e5e8284613922565b91508190509392505050565b6000613e76828c613922565b9150613e82828b613922565b9150613e8e828a613922565b9150613e9a8289613922565b9150613ea68288613922565b9150613eb28287613922565b9150613ebe8286613922565b9150613eca8285613922565b9150613ed68284613922565b91508190509a9950505050505050505050565b6000613ef482613999565b9150819050919050565b6000613f0982613a04565b9150613f15828b613922565b9150613f2082613c57565b9150613f2c828a613922565b9150613f3782613b62565b9150613f438289613922565b9150613f4e82613af9565b9150613f5a8288613922565b9150613f6582613a4a565b9150613f718287613922565b9150613f7c82613d2b565b9150613f888286613922565b9150613f9382613953565b9150613f9f8285613922565b9150613faa82613dda565b9150613fb68284613922565b9150613fc182613bee565b91508190509998505050505050505050565b6000613fde82613ab3565b9150613fea8286613922565b9150613ff582613ce3565b91506140018285613922565b915061400c82613976565b91506140188284613922565b915061402382613b1c565b9150819050949350505050565b600061403b82613d71565b91506140478284613922565b915081905092915050565b60006020820190506140676000830184613892565b92915050565b60006080820190506140826000830187613892565b61408f6020830186613892565b61409c6040830185613e20565b81810360608301526140ae81846138b0565b905095945050505050565b60006020820190506140ce60008301846138a1565b92915050565b600060208201905081810360008301526140ee81846138e9565b905092915050565b6000602082019050818103600083015261410f816139be565b9050919050565b6000602082019050818103600083015261412f816139e1565b9050919050565b6000602082019050818103600083015261414f81613a27565b9050919050565b6000602082019050818103600083015261416f81613a6d565b9050919050565b6000602082019050818103600083015261418f81613a90565b9050919050565b600060208201905081810360008301526141af81613ad6565b9050919050565b600060208201905081810360008301526141cf81613b3f565b9050919050565b600060208201905081810360008301526141ef81613b85565b9050919050565b6000602082019050818103600083015261420f81613ba8565b9050919050565b6000602082019050818103600083015261422f81613bcb565b9050919050565b6000602082019050818103600083015261424f81613c11565b9050919050565b6000602082019050818103600083015261426f81613c34565b9050919050565b6000602082019050818103600083015261428f81613c7a565b9050919050565b600060208201905081810360008301526142af81613c9d565b9050919050565b600060208201905081810360008301526142cf81613cc0565b9050919050565b600060208201905081810360008301526142ef81613d08565b9050919050565b6000602082019050818103600083015261430f81613d4e565b9050919050565b6000602082019050818103600083015261432f81613d94565b9050919050565b6000602082019050818103600083015261434f81613db7565b9050919050565b6000602082019050818103600083015261436f81613dfd565b9050919050565b600060208201905061438b6000830184613e20565b92915050565b600061439b6143ac565b90506143a78282614627565b919050565b6000604051905090565b600067ffffffffffffffff8211156143d1576143d06147bd565b5b6143da82614800565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614435826145a9565b9150614440836145a9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614475576144746146d2565b5b828201905092915050565b600061448b826145a9565b9150614496836145a9565b9250826144a6576144a5614701565b5b828204905092915050565b60006144bc826145a9565b91506144c7836145a9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614500576144ff6146d2565b5b828202905092915050565b6000614516826145a9565b9150614521836145a9565b925082821015614534576145336146d2565b5b828203905092915050565b600061454a82614589565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156145e05780820151818401526020810190506145c5565b838111156145ef576000848401525b50505050565b6000600282049050600182168061460d57607f821691505b6020821081141561462157614620614730565b5b50919050565b61463082614800565b810181811067ffffffffffffffff8211171561464f5761464e6147bd565b5b80604052505050565b6000614663826145a9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614696576146956146d2565b5b600182019050919050565b60006146ac826145a9565b91506146b7836145a9565b9250826146c7576146c6614701565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f227d2c7b2274726169745f74797065223a2022456c656d656e74222c2276616c60008201527f7565223a20220000000000000000000000000000000000000000000000000000602082015250565b7f222c2022747261697473223a205b000000000000000000000000000000000000600082015250565b7f7b226e616d65223a2022546865204f70656e204d6574617665727365222c202260008201527f6465736372697074696f6e223a2022546865204f70656e204d6574617665727360208201527f652070726f6a65637420636f6e7369737473206f662031302c30303020616c7060408201527f68616e756d65726963204e465473206f662072616e646f6d697365642073747560608201527f66662067656e65726174656420616e642073746f726564206f6e20746865204560808201527f7468657265756d20626c6f636b636861696e2e20546865204e4654732061726560a08201527f206672656520746f206d696e7420282b206761732920616e642063616e20626560c08201527f207573656420746f206275696c6420546865204f70656e204d6574617665727360e08201527f652e222c202273656c6c65725f6665655f62617369735f706f696e7473223a206101008201527f3530302c20226665655f726563697069656e74223a20223078353464366236636101208201527f39333138303236343238356239303666343261336436333330666430646133616101408201527f31227d000000000000000000000000000000000000000000000000000000000061016082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f7b2274726169745f74797065223a2022456e7669726f6e6d656e74222c22766160008201527f6c7565223a202200000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f227d2c7b2274726169745f74797065223a2022417661746172222c2276616c7560008201527f65223a2022000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f7b226e616d65223a20225265736f757263652023000000000000000000000000600082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f227d2c7b2274726169745f74797065223a20225472616e73706f7274222c227660008201527f616c7565223a2022000000000000000000000000000000000000000000000000602082015250565b7f5d207d0000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f227d2c7b2274726169745f74797065223a2022536b696c6c222c2276616c756560008201527f223a202200000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f227d2c7b2274726169745f74797065223a20225265736f75726365222c22766160008201527f6c7565223a202200000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f546f6b656e20494420696e76616c696400000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f222c226465736372697074696f6e223a2022546865204f70656e204d6574617660008201527f657273652070726f6a65637420636f6e7369737473206f662031302c3030302060208201527f616c7068616e756d65726963204e465473206f662072616e646f6d697365642060408201527f73747566662067656e65726174656420616e642073746f726564206f6e20746860608201527f6520457468657265756d20626c6f636b636861696e2e20546865204e4654732060808201527f617265206672656520746f206d696e7420282b206761732920616e642063616e60a08201527f206265207573656420746f206275696c6420546865204f70656e204d6574617660c08201527f657273652e222c22696d616765223a2022646174613a696d6167652f7376672b60e08201527f786d6c3b6261736536342c00000000000000000000000000000000000000000061010082015250565b7f526573657276656420546f6b656e20494420696e76616c696400000000000000600082015250565b7f227d2c7b2274726169745f74797065223a2022576f726c64222c2276616c756560008201527f223a202200000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f227d2c7b2274726169745f74797065223a20224275696c64696e67222c22766160008201527f6c7565223a202200000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6153aa8161453f565b81146153b557600080fd5b50565b6153c181614551565b81146153cc57600080fd5b50565b6153d88161455d565b81146153e357600080fd5b50565b6153ef816145a9565b81146153fa57600080fd5b5056fe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223136302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223134302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223ea264697066735822122067d3d6bfaadec13bde0f9f8d2c35fb2e3db81b16f5210f07e8a4405b662fe4d364736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101da5760003560e01c80636db4080011610104578063b88d4fde116100a2578063cc08549311610071578063cc085493146105b3578063e8a3d485146105e3578063e985e9c514610601578063f2fde38b14610631576101da565b8063b88d4fde14610507578063bc5de5e014610523578063bd880fae14610553578063c87b56dd14610583576101da565b80638da5cb5b116100de5780638da5cb5b1461047f57806395d89b411461049d5780639dfd8b02146104bb578063a22cb465146104eb576101da565b80636db408001461041557806370a0823114610445578063715018a614610475576101da565b806323b872dd1161017c578063434f48c41161014b578063434f48c41461038f5780634e71d92d146103ab5780634f6ccce7146103b55780636352211e146103e5576101da565b806323b872dd146102f75780632f745c59146103135780633a7d22bc1461034357806342842e0e14610373576101da565b8063095ea7b3116101b8578063095ea7b31461025d5780631328ec9b1461027957806318160ddd146102a95780631e8fca2d146102c7576101da565b806301ffc9a7146101df57806306fdde031461020f578063081812fc1461022d575b600080fd5b6101f960048036038101906101f4919061380b565b61064d565b60405161020691906140b9565b60405180910390f35b6102176106c7565b60405161022491906140d4565b60405180910390f35b61024760048036038101906102429190613865565b610759565b6040516102549190614052565b60405180910390f35b610277600480360381019061027291906137cb565b6107de565b005b610293600480360381019061028e9190613865565b6108f6565b6040516102a091906140d4565b60405180910390f35b6102b1610a10565b6040516102be9190614376565b60405180910390f35b6102e160048036038101906102dc9190613865565b610a1d565b6040516102ee91906140d4565b60405180910390f35b610311600480360381019061030c91906136b5565b610b37565b005b61032d600480360381019061032891906137cb565b610b97565b60405161033a9190614376565b60405180910390f35b61035d60048036038101906103589190613865565b610c3c565b60405161036a91906140d4565b60405180910390f35b61038d600480360381019061038891906136b5565b610d56565b005b6103a960048036038101906103a49190613865565b610d76565b005b6103b3610f00565b005b6103cf60048036038101906103ca9190613865565b610fd7565b6040516103dc9190614376565b60405180910390f35b6103ff60048036038101906103fa9190613865565b611048565b60405161040c9190614052565b60405180910390f35b61042f600480360381019061042a9190613865565b6110fa565b60405161043c91906140d4565b60405180910390f35b61045f600480360381019061045a9190613648565b611214565b60405161046c9190614376565b60405180910390f35b61047d6112cc565b005b610487611354565b6040516104949190614052565b60405180910390f35b6104a561137e565b6040516104b291906140d4565b60405180910390f35b6104d560048036038101906104d09190613865565b611410565b6040516104e291906140d4565b60405180910390f35b6105056004803603810190610500919061378b565b61152a565b005b610521600480360381019061051c9190613708565b6116ab565b005b61053d60048036038101906105389190613865565b61170d565b60405161054a91906140d4565b60405180910390f35b61056d60048036038101906105689190613865565b611827565b60405161057a91906140d4565b60405180910390f35b61059d60048036038101906105989190613865565b611941565b6040516105aa91906140d4565b60405180910390f35b6105cd60048036038101906105c89190613865565b611fcc565b6040516105da91906140d4565b60405180910390f35b6105eb6120e6565b6040516105f891906140d4565b60405180910390f35b61061b60048036038101906106169190613675565b61213b565b60405161062891906140b9565b60405180910390f35b61064b60048036038101906106469190613648565b6121cf565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106c057506106bf826122c7565b5b9050919050565b6060600080546106d6906145f5565b80601f0160208091040260200160405190810160405280929190818152602001828054610702906145f5565b801561074f5780601f106107245761010080835404028352916020019161074f565b820191906000526020600020905b81548152906001019060200180831161073257829003601f168201915b5050505050905090565b6000610764826123a9565b6107a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079a90614256565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107e982611048565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561085a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610851906142f6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610879612415565b73ffffffffffffffffffffffffffffffffffffffff1614806108a857506108a7816108a2612415565b61213b565b5b6108e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108de906141d6565b60405180910390fd5b6108f1838361241d565b505050565b6060610a09826040518060400160405280600681526020017f41766174617200000000000000000000000000000000000000000000000000008152506012805480602002602001604051908101604052809291908181526020016000905b82821015610a00578382906000526020600020018054610973906145f5565b80601f016020809104026020016040519081016040528092919081815260200182805461099f906145f5565b80156109ec5780601f106109c1576101008083540402835291602001916109ec565b820191906000526020600020905b8154815290600101906020018083116109cf57829003601f168201915b505050505081526020019060010190610954565b505050506124d6565b9050919050565b6000600880549050905090565b6060610b30826040518060400160405280600881526020017f5265736f757263650000000000000000000000000000000000000000000000008152506014805480602002602001604051908101604052809291908181526020016000905b82821015610b27578382906000526020600020018054610a9a906145f5565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac6906145f5565b8015610b135780601f10610ae857610100808354040283529160200191610b13565b820191906000526020600020905b815481529060010190602001808311610af657829003601f168201915b505050505081526020019060010190610a7b565b505050506124d6565b9050919050565b610b48610b42612415565b82612545565b610b87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7e90614316565b60405180910390fd5b610b92838383612623565b505050565b6000610ba283611214565b8210610be3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bda906140f6565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6060610d4f826040518060400160405280600781526020017f456c656d656e74000000000000000000000000000000000000000000000000008152506015805480602002602001604051908101604052809291908181526020016000905b82821015610d46578382906000526020600020018054610cb9906145f5565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce5906145f5565b8015610d325780601f10610d0757610100808354040283529160200191610d32565b820191906000526020600020905b815481529060010190602001808311610d1557829003601f168201915b505050505081526020019060010190610c9a565b505050506124d6565b9050919050565b610d71838383604051806020016040528060008152506116ab565b505050565b6002600a541415610dbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db390614356565b60405180910390fd5b6002600a81905550610dcc612415565b73ffffffffffffffffffffffffffffffffffffffff16610dea611354565b73ffffffffffffffffffffffffffffffffffffffff1614610e40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3790614276565b60405180910390fd5b61251c600d54118015610e565750612711600d54105b610e95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8c906142d6565b60405180910390fd5b600081600d54610ea5919061442a565b90506000600d5490505b81811015610ef357610ec8610ec2611354565b8261287f565b600d6000815480929190610edb90614658565b91905055508080610eeb90614658565b915050610eaf565b50506001600a8190555050565b6002600a541415610f46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3d90614356565b60405180910390fd5b6002600a819055506000600c54118015610f63575061251d600c54105b610fa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9990614296565b60405180910390fd5b610fb5610fad612415565b600c5461287f565b600c6000815480929190610fc890614658565b91905055506001600a81905550565b6000610fe1610a10565b8210611022576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101990614336565b60405180910390fd5b600882815481106110365761103561478e565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e890614216565b60405180910390fd5b80915050919050565b606061120d826040518060400160405280600b81526020017f456e7669726f6e6d656e74000000000000000000000000000000000000000000815250600f805480602002602001604051908101604052809291908181526020016000905b82821015611204578382906000526020600020018054611177906145f5565b80601f01602080910402602001604051908101604052809291908181526020018280546111a3906145f5565b80156111f05780601f106111c5576101008083540402835291602001916111f0565b820191906000526020600020905b8154815290600101906020018083116111d357829003601f168201915b505050505081526020019060010190611158565b505050506124d6565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611285576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127c906141f6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112d4612415565b73ffffffffffffffffffffffffffffffffffffffff166112f2611354565b73ffffffffffffffffffffffffffffffffffffffff1614611348576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133f90614276565b60405180910390fd5b611352600061289d565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461138d906145f5565b80601f01602080910402602001604051908101604052809291908181526020018280546113b9906145f5565b80156114065780601f106113db57610100808354040283529160200191611406565b820191906000526020600020905b8154815290600101906020018083116113e957829003601f168201915b5050505050905090565b6060611523826040518060400160405280600881526020017f4275696c64696e670000000000000000000000000000000000000000000000008152506010805480602002602001604051908101604052809291908181526020016000905b8282101561151a57838290600052602060002001805461148d906145f5565b80601f01602080910402602001604051908101604052809291908181526020018280546114b9906145f5565b80156115065780601f106114db57610100808354040283529160200191611506565b820191906000526020600020905b8154815290600101906020018083116114e957829003601f168201915b50505050508152602001906001019061146e565b505050506124d6565b9050919050565b611532612415565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159790614196565b60405180910390fd5b80600560006115ad612415565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661165a612415565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161169f91906140b9565b60405180910390a35050565b6116bc6116b6612415565b83612545565b6116fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f290614316565b60405180910390fd5b61170784848484612963565b50505050565b6060611820826040518060400160405280600981526020017f5472616e73706f727400000000000000000000000000000000000000000000008152506011805480602002602001604051908101604052809291908181526020016000905b8282101561181757838290600052602060002001805461178a906145f5565b80601f01602080910402602001604051908101604052809291908181526020018280546117b6906145f5565b80156118035780601f106117d857610100808354040283529160200191611803565b820191906000526020600020905b8154815290600101906020018083116117e657829003601f168201915b50505050508152602001906001019061176b565b505050506124d6565b9050919050565b606061193a826040518060400160405280600581526020017f536b696c6c0000000000000000000000000000000000000000000000000000008152506013805480602002602001604051908101604052809291908181526020016000905b828210156119315783829060005260206000200180546118a4906145f5565b80601f01602080910402602001604051908101604052809291908181526020018280546118d0906145f5565b801561191d5780601f106118f25761010080835404028352916020019161191d565b820191906000526020600020905b81548152906001019060200180831161190057829003601f168201915b505050505081526020019060010190611885565b505050506124d6565b9050919050565b606061194b613547565b60405180610120016040528060fd81526020016154c960fd9139816000601181106119795761197861478e565b5b602002018190525061198a83611fcc565b8160016011811061199e5761199d61478e565b5b602002018190525060405180606001604052806028815260200161562f60289139816002601181106119d3576119d261478e565b5b60200201819052506119e4836110fa565b816003601181106119f8576119f761478e565b5b60200201819052506040518060600160405280602881526020016153fe6028913981600460118110611a2d57611a2c61478e565b5b6020020181905250611a3e83611410565b81600560118110611a5257611a5161478e565b5b60200201819052506040518060600160405280602881526020016154786028913981600660118110611a8757611a8661478e565b5b6020020181905250611a988361170d565b81600760118110611aac57611aab61478e565b5b60200201819052506040518060600160405280602981526020016154a06029913981600860118110611ae157611ae061478e565b5b6020020181905250611af2836108f6565b81600960118110611b0657611b0561478e565b5b602002018190525060405180606001604052806029815260200161544f6029913981600a60118110611b3b57611b3a61478e565b5b6020020181905250611b4c83611827565b81600b60118110611b6057611b5f61478e565b5b60200201819052506040518060600160405280602981526020016155c66029913981600c60118110611b9557611b9461478e565b5b6020020181905250611ba683610a1d565b81600d60118110611bba57611bb961478e565b5b60200201819052506040518060600160405280602981526020016154266029913981600e60118110611bef57611bee61478e565b5b6020020181905250611c0083610c3c565b81600f60118110611c1457611c1361478e565b5b60200201819052506040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e0000000000000000000000000000000000000081525081601060118110611c6657611c6561478e565b5b6020020181905250600081600060118110611c8457611c8361478e565b5b602002015182600160118110611c9d57611c9c61478e565b5b602002015183600260118110611cb657611cb561478e565b5b602002015184600360118110611ccf57611cce61478e565b5b602002015185600460118110611ce857611ce761478e565b5b602002015186600560118110611d0157611d0061478e565b5b602002015187600660118110611d1a57611d1961478e565b5b602002015188600760118110611d3357611d3261478e565b5b602002015189600860118110611d4c57611d4b61478e565b5b6020020151604051602001611d6999989796959493929190613e6a565b60405160208183030381529060405290508082600960118110611d8f57611d8e61478e565b5b602002015183600a60118110611da857611da761478e565b5b602002015184600b60118110611dc157611dc061478e565b5b602002015185600c60118110611dda57611dd961478e565b5b602002015186600d60118110611df357611df261478e565b5b602002015187600e60118110611e0c57611e0b61478e565b5b602002015188600f60118110611e2557611e2461478e565b5b602002015189601060118110611e3e57611e3d61478e565b5b6020020151604051602001611e5b99989796959493929190613e6a565b6040516020818303038152906040529050600082600360118110611e8257611e8161478e565b5b602002015183600d60118110611e9b57611e9a61478e565b5b602002015184600b60118110611eb457611eb361478e565b5b602002015185600760118110611ecd57611ecc61478e565b5b602002015186600960118110611ee657611ee561478e565b5b602002015187600160118110611eff57611efe61478e565b5b602002015188600f60118110611f1857611f1761478e565b5b602002015189600560118110611f3157611f3061478e565b5b6020020151604051602001611f4d989796959493929190613efe565b60405160208183030381529060405290506000611f9c611f6c876129bf565b611f7585612b20565b84604051602001611f8893929190613fd3565b604051602081830303815290604052612b20565b905080604051602001611faf9190614030565b604051602081830303815290604052925082945050505050919050565b60606120df826040518060400160405280600581526020017f576f726c64000000000000000000000000000000000000000000000000000000815250600e805480602002602001604051908101604052809291908181526020016000905b828210156120d6578382906000526020600020018054612049906145f5565b80601f0160208091040260200160405190810160405280929190818152602001828054612075906145f5565b80156120c25780601f10612097576101008083540402835291602001916120c2565b820191906000526020600020905b8154815290600101906020018083116120a557829003601f168201915b50505050508152602001906001019061202a565b505050506124d6565b9050919050565b606060006121106040516020016120fc90613ee9565b604051602081830303815290604052612b20565b9050806040516020016121239190614030565b60405160208183030381529060405290508091505090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121d7612415565b73ffffffffffffffffffffffffffffffffffffffff166121f5611354565b73ffffffffffffffffffffffffffffffffffffffff161461224b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224290614276565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b290614136565b60405180910390fd5b6122c48161289d565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061239257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806123a257506123a182612cb8565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661249083611048565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6060600061250c846124e7876129bf565b6040516020016124f8929190613e46565b604051602081830303815290604052612d22565b905060008384518361251e91906146a1565b8151811061252f5761252e61478e565b5b6020026020010151905080925050509392505050565b6000612550826123a9565b61258f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612586906141b6565b60405180910390fd5b600061259a83611048565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061260957508373ffffffffffffffffffffffffffffffffffffffff166125f184610759565b73ffffffffffffffffffffffffffffffffffffffff16145b8061261a5750612619818561213b565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661264382611048565b73ffffffffffffffffffffffffffffffffffffffff1614612699576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612690906142b6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612709576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270090614176565b60405180910390fd5b612714838383612d55565b61271f60008261241d565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461276f919061450b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127c6919061442a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612899828260405180602001604052806000815250612e69565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61296e848484612623565b61297a84848484612ec4565b6129b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b090614116565b60405180910390fd5b50505050565b60606000821415612a07576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b1b565b600082905060005b60008214612a39578080612a2290614658565b915050600a82612a329190614480565b9150612a0f565b60008167ffffffffffffffff811115612a5557612a546147bd565b5b6040519080825280601f01601f191660200182016040528015612a875781602001600182028036833780820191505090505b5090505b60008514612b1457600182612aa0919061450b565b9150600a85612aaf91906146a1565b6030612abb919061442a565b60f81b818381518110612ad157612ad061478e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b0d9190614480565b9450612a8b565b8093505050505b919050565b60606000825190506000811415612b495760405180602001604052806000815250915050612cb3565b60006003600283612b5a919061442a565b612b649190614480565b6004612b7091906144b1565b90506000602082612b81919061442a565b67ffffffffffffffff811115612b9a57612b996147bd565b5b6040519080825280601f01601f191660200182016040528015612bcc5781602001600182028036833780820191505090505b50905060006040518060600160405280604081526020016155ef604091399050600181016020830160005b86811015612c705760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050612bf7565b506003860660018114612c8a5760028114612c9a57612ca5565b613d3d60f01b6002830352612ca5565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081604051602001612d359190613e2f565b6040516020818303038152906040528051906020012060001c9050919050565b612d6083838361305b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612da357612d9e81613060565b612de2565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612de157612de083826130a9565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e2557612e2081613216565b612e64565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612e6357612e6282826132e7565b5b5b505050565b612e738383613366565b612e806000848484612ec4565b612ebf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb690614116565b60405180910390fd5b505050565b6000612ee58473ffffffffffffffffffffffffffffffffffffffff16613534565b1561304e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f0e612415565b8786866040518563ffffffff1660e01b8152600401612f30949392919061406d565b602060405180830381600087803b158015612f4a57600080fd5b505af1925050508015612f7b57506040513d601f19601f82011682018060405250810190612f789190613838565b60015b612ffe573d8060008114612fab576040519150601f19603f3d011682016040523d82523d6000602084013e612fb0565b606091505b50600081511415612ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fed90614116565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613053565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016130b684611214565b6130c0919061450b565b90506000600760008481526020019081526020016000205490508181146131a5576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061322a919061450b565b905060006009600084815260200190815260200160002054905060006008838154811061325a5761325961478e565b5b90600052602060002001549050806008838154811061327c5761327b61478e565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806132cb576132ca61475f565b5b6001900381819060005260206000200160009055905550505050565b60006132f283611214565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133cd90614236565b60405180910390fd5b6133df816123a9565b1561341f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341690614156565b60405180910390fd5b61342b60008383612d55565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461347b919061442a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6040518061022001604052806011905b60608152602001906001900390816135575790505090565b600061358261357d846143b6565b614391565b90508281526020810184848401111561359e5761359d6147f1565b5b6135a98482856145b3565b509392505050565b6000813590506135c0816153a1565b92915050565b6000813590506135d5816153b8565b92915050565b6000813590506135ea816153cf565b92915050565b6000815190506135ff816153cf565b92915050565b600082601f83011261361a576136196147ec565b5b813561362a84826020860161356f565b91505092915050565b600081359050613642816153e6565b92915050565b60006020828403121561365e5761365d6147fb565b5b600061366c848285016135b1565b91505092915050565b6000806040838503121561368c5761368b6147fb565b5b600061369a858286016135b1565b92505060206136ab858286016135b1565b9150509250929050565b6000806000606084860312156136ce576136cd6147fb565b5b60006136dc868287016135b1565b93505060206136ed868287016135b1565b92505060406136fe86828701613633565b9150509250925092565b60008060008060808587031215613722576137216147fb565b5b6000613730878288016135b1565b9450506020613741878288016135b1565b935050604061375287828801613633565b925050606085013567ffffffffffffffff811115613773576137726147f6565b5b61377f87828801613605565b91505092959194509250565b600080604083850312156137a2576137a16147fb565b5b60006137b0858286016135b1565b92505060206137c1858286016135c6565b9150509250929050565b600080604083850312156137e2576137e16147fb565b5b60006137f0858286016135b1565b925050602061380185828601613633565b9150509250929050565b600060208284031215613821576138206147fb565b5b600061382f848285016135db565b91505092915050565b60006020828403121561384e5761384d6147fb565b5b600061385c848285016135f0565b91505092915050565b60006020828403121561387b5761387a6147fb565b5b600061388984828501613633565b91505092915050565b61389b8161453f565b82525050565b6138aa81614551565b82525050565b60006138bb826143e7565b6138c581856143fd565b93506138d58185602086016145c2565b6138de81614800565b840191505092915050565b60006138f4826143f2565b6138fe818561440e565b935061390e8185602086016145c2565b61391781614800565b840191505092915050565b600061392d826143f2565b613937818561441f565b93506139478185602086016145c2565b80840191505092915050565b600061396060268361441f565b915061396b82614811565b602682019050919050565b6000613983600e8361441f565b915061398e82614860565b600e82019050919050565b60006139a76101638361441f565b91506139b282614889565b61016382019050919050565b60006139cb602b8361440e565b91506139d682614a58565b604082019050919050565b60006139ee60328361440e565b91506139f982614aa7565b604082019050919050565b6000613a1160278361441f565b9150613a1c82614af6565b602782019050919050565b6000613a3460268361440e565b9150613a3f82614b45565b604082019050919050565b6000613a5760258361441f565b9150613a6282614b94565b602582019050919050565b6000613a7a601c8361440e565b9150613a8582614be3565b602082019050919050565b6000613a9d60248361440e565b9150613aa882614c0c565b604082019050919050565b6000613ac060148361441f565b9150613acb82614c5b565b601482019050919050565b6000613ae360198361440e565b9150613aee82614c84565b602082019050919050565b6000613b0660288361441f565b9150613b1182614cad565b602882019050919050565b6000613b2960038361441f565b9150613b3482614cfc565b600382019050919050565b6000613b4c602c8361440e565b9150613b5782614d25565b604082019050919050565b6000613b6f60248361441f565b9150613b7a82614d74565b602482019050919050565b6000613b9260388361440e565b9150613b9d82614dc3565b604082019050919050565b6000613bb5602a8361440e565b9150613bc082614e12565b604082019050919050565b6000613bd860298361440e565b9150613be382614e61565b604082019050919050565b6000613bfb60028361441f565b9150613c0682614eb0565b600282019050919050565b6000613c1e60208361440e565b9150613c2982614ed9565b602082019050919050565b6000613c41602c8361440e565b9150613c4c82614f02565b604082019050919050565b6000613c6460278361441f565b9150613c6f82614f51565b602782019050919050565b6000613c8760208361440e565b9150613c9282614fa0565b602082019050919050565b6000613caa60108361440e565b9150613cb582614fc9565b602082019050919050565b6000613ccd60298361440e565b9150613cd882614ff2565b604082019050919050565b6000613cf161010b8361441f565b9150613cfc82615041565b61010b82019050919050565b6000613d1560198361440e565b9150613d208261519b565b602082019050919050565b6000613d3860248361441f565b9150613d43826151c4565b602482019050919050565b6000613d5b60218361440e565b9150613d6682615213565b604082019050919050565b6000613d7e601d8361441f565b9150613d8982615262565b601d82019050919050565b6000613da160318361440e565b9150613dac8261528b565b604082019050919050565b6000613dc4602c8361440e565b9150613dcf826152da565b604082019050919050565b6000613de760278361441f565b9150613df282615329565b602782019050919050565b6000613e0a601f8361440e565b9150613e1582615378565b602082019050919050565b613e29816145a9565b82525050565b6000613e3b8284613922565b915081905092915050565b6000613e528285613922565b9150613e5e8284613922565b91508190509392505050565b6000613e76828c613922565b9150613e82828b613922565b9150613e8e828a613922565b9150613e9a8289613922565b9150613ea68288613922565b9150613eb28287613922565b9150613ebe8286613922565b9150613eca8285613922565b9150613ed68284613922565b91508190509a9950505050505050505050565b6000613ef482613999565b9150819050919050565b6000613f0982613a04565b9150613f15828b613922565b9150613f2082613c57565b9150613f2c828a613922565b9150613f3782613b62565b9150613f438289613922565b9150613f4e82613af9565b9150613f5a8288613922565b9150613f6582613a4a565b9150613f718287613922565b9150613f7c82613d2b565b9150613f888286613922565b9150613f9382613953565b9150613f9f8285613922565b9150613faa82613dda565b9150613fb68284613922565b9150613fc182613bee565b91508190509998505050505050505050565b6000613fde82613ab3565b9150613fea8286613922565b9150613ff582613ce3565b91506140018285613922565b915061400c82613976565b91506140188284613922565b915061402382613b1c565b9150819050949350505050565b600061403b82613d71565b91506140478284613922565b915081905092915050565b60006020820190506140676000830184613892565b92915050565b60006080820190506140826000830187613892565b61408f6020830186613892565b61409c6040830185613e20565b81810360608301526140ae81846138b0565b905095945050505050565b60006020820190506140ce60008301846138a1565b92915050565b600060208201905081810360008301526140ee81846138e9565b905092915050565b6000602082019050818103600083015261410f816139be565b9050919050565b6000602082019050818103600083015261412f816139e1565b9050919050565b6000602082019050818103600083015261414f81613a27565b9050919050565b6000602082019050818103600083015261416f81613a6d565b9050919050565b6000602082019050818103600083015261418f81613a90565b9050919050565b600060208201905081810360008301526141af81613ad6565b9050919050565b600060208201905081810360008301526141cf81613b3f565b9050919050565b600060208201905081810360008301526141ef81613b85565b9050919050565b6000602082019050818103600083015261420f81613ba8565b9050919050565b6000602082019050818103600083015261422f81613bcb565b9050919050565b6000602082019050818103600083015261424f81613c11565b9050919050565b6000602082019050818103600083015261426f81613c34565b9050919050565b6000602082019050818103600083015261428f81613c7a565b9050919050565b600060208201905081810360008301526142af81613c9d565b9050919050565b600060208201905081810360008301526142cf81613cc0565b9050919050565b600060208201905081810360008301526142ef81613d08565b9050919050565b6000602082019050818103600083015261430f81613d4e565b9050919050565b6000602082019050818103600083015261432f81613d94565b9050919050565b6000602082019050818103600083015261434f81613db7565b9050919050565b6000602082019050818103600083015261436f81613dfd565b9050919050565b600060208201905061438b6000830184613e20565b92915050565b600061439b6143ac565b90506143a78282614627565b919050565b6000604051905090565b600067ffffffffffffffff8211156143d1576143d06147bd565b5b6143da82614800565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614435826145a9565b9150614440836145a9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614475576144746146d2565b5b828201905092915050565b600061448b826145a9565b9150614496836145a9565b9250826144a6576144a5614701565b5b828204905092915050565b60006144bc826145a9565b91506144c7836145a9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614500576144ff6146d2565b5b828202905092915050565b6000614516826145a9565b9150614521836145a9565b925082821015614534576145336146d2565b5b828203905092915050565b600061454a82614589565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156145e05780820151818401526020810190506145c5565b838111156145ef576000848401525b50505050565b6000600282049050600182168061460d57607f821691505b6020821081141561462157614620614730565b5b50919050565b61463082614800565b810181811067ffffffffffffffff8211171561464f5761464e6147bd565b5b80604052505050565b6000614663826145a9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614696576146956146d2565b5b600182019050919050565b60006146ac826145a9565b91506146b7836145a9565b9250826146c7576146c6614701565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f227d2c7b2274726169745f74797065223a2022456c656d656e74222c2276616c60008201527f7565223a20220000000000000000000000000000000000000000000000000000602082015250565b7f222c2022747261697473223a205b000000000000000000000000000000000000600082015250565b7f7b226e616d65223a2022546865204f70656e204d6574617665727365222c202260008201527f6465736372697074696f6e223a2022546865204f70656e204d6574617665727360208201527f652070726f6a65637420636f6e7369737473206f662031302c30303020616c7060408201527f68616e756d65726963204e465473206f662072616e646f6d697365642073747560608201527f66662067656e65726174656420616e642073746f726564206f6e20746865204560808201527f7468657265756d20626c6f636b636861696e2e20546865204e4654732061726560a08201527f206672656520746f206d696e7420282b206761732920616e642063616e20626560c08201527f207573656420746f206275696c6420546865204f70656e204d6574617665727360e08201527f652e222c202273656c6c65725f6665655f62617369735f706f696e7473223a206101008201527f3530302c20226665655f726563697069656e74223a20223078353464366236636101208201527f39333138303236343238356239303666343261336436333330666430646133616101408201527f31227d000000000000000000000000000000000000000000000000000000000061016082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f7b2274726169745f74797065223a2022456e7669726f6e6d656e74222c22766160008201527f6c7565223a202200000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f227d2c7b2274726169745f74797065223a2022417661746172222c2276616c7560008201527f65223a2022000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f7b226e616d65223a20225265736f757263652023000000000000000000000000600082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f227d2c7b2274726169745f74797065223a20225472616e73706f7274222c227660008201527f616c7565223a2022000000000000000000000000000000000000000000000000602082015250565b7f5d207d0000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f227d2c7b2274726169745f74797065223a2022536b696c6c222c2276616c756560008201527f223a202200000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f227d2c7b2274726169745f74797065223a20225265736f75726365222c22766160008201527f6c7565223a202200000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f546f6b656e20494420696e76616c696400000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f222c226465736372697074696f6e223a2022546865204f70656e204d6574617660008201527f657273652070726f6a65637420636f6e7369737473206f662031302c3030302060208201527f616c7068616e756d65726963204e465473206f662072616e646f6d697365642060408201527f73747566662067656e65726174656420616e642073746f726564206f6e20746860608201527f6520457468657265756d20626c6f636b636861696e2e20546865204e4654732060808201527f617265206672656520746f206d696e7420282b206761732920616e642063616e60a08201527f206265207573656420746f206275696c6420546865204f70656e204d6574617660c08201527f657273652e222c22696d616765223a2022646174613a696d6167652f7376672b60e08201527f786d6c3b6261736536342c00000000000000000000000000000000000000000061010082015250565b7f526573657276656420546f6b656e20494420696e76616c696400000000000000600082015250565b7f227d2c7b2274726169745f74797065223a2022576f726c64222c2276616c756560008201527f223a202200000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f227d2c7b2274726169745f74797065223a20224275696c64696e67222c22766160008201527f6c7565223a202200000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6153aa8161453f565b81146153b557600080fd5b50565b6153c181614551565b81146153cc57600080fd5b50565b6153d88161455d565b81146153e357600080fd5b50565b6153ef816145a9565b81146153fa57600080fd5b5056fe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223136302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223134302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223ea264697066735822122067d3d6bfaadec13bde0f9f8d2c35fb2e3db81b16f5210f07e8a4405b662fe4d364736f6c63430008070033

Deployed Bytecode Sourcemap

44571:8956:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38421:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25535:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27094:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26617:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48027:130;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39061:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48308:136;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27984:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38729:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48456:133;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28394:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51711:370;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51522:177;;;:::i;:::-;;39251:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25229:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47575:145;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24959:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9927:94;;;:::i;:::-;;9276:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25704:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47732:136;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27387:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28650:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47880:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48169:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48927:2587;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47436:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52814:607;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27753:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10176:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38421:224;38523:4;38562:35;38547:50;;;:11;:50;;;;:90;;;;38601:36;38625:11;38601:23;:36::i;:::-;38547:90;38540:97;;38421:224;;;:::o;25535:100::-;25589:13;25622:5;25615:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25535:100;:::o;27094:221::-;27170:7;27198:16;27206:7;27198;:16::i;:::-;27190:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27283:15;:24;27299:7;27283:24;;;;;;;;;;;;;;;;;;;;;27276:31;;27094:221;;;:::o;26617:411::-;26698:13;26714:23;26729:7;26714:14;:23::i;:::-;26698:39;;26762:5;26756:11;;:2;:11;;;;26748:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26856:5;26840:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26865:37;26882:5;26889:12;:10;:12::i;:::-;26865:16;:37::i;:::-;26840:62;26818:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;26999:21;27008:2;27012:7;26999:8;:21::i;:::-;26687:341;26617:411;;:::o;48027:130::-;48084:13;48117:32;48123:7;48117:32;;;;;;;;;;;;;;;;;48142:6;48117:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:32::i;:::-;48110:39;;48027:130;;;:::o;39061:113::-;39122:7;39149:10;:17;;;;39142:24;;39061:113;:::o;48308:136::-;48367:13;48400:36;48406:7;48400:36;;;;;;;;;;;;;;;;;48427:8;48400:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:36::i;:::-;48393:43;;48308:136;;;:::o;27984:339::-;28179:41;28198:12;:10;:12::i;:::-;28212:7;28179:18;:41::i;:::-;28171:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28287:28;28297:4;28303:2;28307:7;28287:9;:28::i;:::-;27984:339;;;:::o;38729:256::-;38826:7;38862:23;38879:5;38862:16;:23::i;:::-;38854:5;:31;38846:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;38951:12;:19;38964:5;38951:19;;;;;;;;;;;;;;;:26;38971:5;38951:26;;;;;;;;;;;;38944:33;;38729:256;;;;:::o;48456:133::-;48514:13;48547:34;48553:7;48547:34;;;;;;;;;;;;;;;;;48573:7;48547:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:34::i;:::-;48540:41;;48456:133;;;:::o;28394:185::-;28532:39;28549:4;28555:2;28559:7;28532:39;;;;;;;;;;;;:16;:39::i;:::-;28394:185;;;:::o;51711:370::-;12215:1;12811:7;;:19;;12803:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12215:1;12944:7;:18;;;;9507:12:::1;:10;:12::i;:::-;9496:23;;:7;:5;:7::i;:::-;:23;;;9488:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51815:4:::2;51798:14;;:21;:47;;;;;51840:5;51823:14;;:22;51798:47;51790:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;51886:20;51926:8;51909:14;;:25;;;;:::i;:::-;51886:48;;51949:9;51959:14;;51949:24;;51945:129;51977:12;51975:1;:14;51945:129;;;52010:21;52020:7;:5;:7::i;:::-;52029:1;52010:9;:21::i;:::-;52046:14;;:16;;;;;;;;;:::i;:::-;;;;;;51991:3;;;;;:::i;:::-;;;;51945:129;;;;51779:302;12171:1:::0;13123:7;:22;;;;51711:370;:::o;51522:177::-;12215:1;12811:7;;:19;;12803:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12215:1;12944:7;:18;;;;51588:1:::1;51578:7;;:11;:29;;;;;51603:4;51593:7;;:14;51578:29;51570:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;51639:32;51649:12;:10;:12::i;:::-;51663:7;;51639:9;:32::i;:::-;51682:7;;:9;;;;;;;;;:::i;:::-;;;;;;12171:1:::0;13123:7;:22;;;;51522:177::o;39251:233::-;39326:7;39362:30;:28;:30::i;:::-;39354:5;:38;39346:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;39459:10;39470:5;39459:17;;;;;;;;:::i;:::-;;;;;;;;;;39452:24;;39251:233;;;:::o;25229:239::-;25301:7;25321:13;25337:7;:16;25345:7;25337:16;;;;;;;;;;;;;;;;;;;;;25321:32;;25389:1;25372:19;;:5;:19;;;;25364:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25455:5;25448:12;;;25229:239;;;:::o;47575:145::-;47637:13;47670:42;47676:7;47670:42;;;;;;;;;;;;;;;;;47700:11;47670:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:42::i;:::-;47663:49;;47575:145;;;:::o;24959:208::-;25031:7;25076:1;25059:19;;:5;:19;;;;25051:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25143:9;:16;25153:5;25143:16;;;;;;;;;;;;;;;;25136:23;;24959:208;;;:::o;9927:94::-;9507:12;:10;:12::i;:::-;9496:23;;:7;:5;:7::i;:::-;:23;;;9488:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9992:21:::1;10010:1;9992:9;:21::i;:::-;9927:94::o:0;9276:87::-;9322:7;9349:6;;;;;;;;;;;9342:13;;9276:87;:::o;25704:104::-;25760:13;25793:7;25786:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25704:104;:::o;47732:136::-;47791:13;47824:36;47830:7;47824:36;;;;;;;;;;;;;;;;;47851:8;47824:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:36::i;:::-;47817:43;;47732:136;;;:::o;27387:295::-;27502:12;:10;:12::i;:::-;27490:24;;:8;:24;;;;27482:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;27602:8;27557:18;:32;27576:12;:10;:12::i;:::-;27557:32;;;;;;;;;;;;;;;:42;27590:8;27557:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;27655:8;27626:48;;27641:12;:10;:12::i;:::-;27626:48;;;27665:8;27626:48;;;;;;:::i;:::-;;;;;;;;27387:295;;:::o;28650:328::-;28825:41;28844:12;:10;:12::i;:::-;28858:7;28825:18;:41::i;:::-;28817:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28931:39;28945:4;28951:2;28955:7;28964:5;28931:13;:39::i;:::-;28650:328;;;;:::o;47880:139::-;47940:13;47973:38;47979:7;47973:38;;;;;;;;;;;;;;;;;48001:9;47973:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:38::i;:::-;47966:45;;47880:139;;;:::o;48169:127::-;48225:13;48258:30;48264:7;48258:30;;;;;;;;;;;;;;;;;48282:5;48258:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:30::i;:::-;48251:37;;48169:127;;;:::o;48927:2587::-;48992:13;49018:23;;:::i;:::-;49052:266;;;;;;;;;;;;;;;;;:5;49058:1;49052:8;;;;;;;:::i;:::-;;;;;:266;;;;49342:17;49351:7;49342:8;:17::i;:::-;49331:5;49337:1;49331:8;;;;;;;:::i;:::-;;;;;:28;;;;49372:53;;;;;;;;;;;;;;;;;:5;49378:1;49372:8;;;;;;;:::i;:::-;;;;;:53;;;;49449:23;49464:7;49449:14;:23::i;:::-;49438:5;49444:1;49438:8;;;;;;;:::i;:::-;;;;;:34;;;;49485:53;;;;;;;;;;;;;;;;;:5;49491:1;49485:8;;;;;;;:::i;:::-;;;;;:53;;;;49562:20;49574:7;49562:11;:20::i;:::-;49551:5;49557:1;49551:8;;;;;;;:::i;:::-;;;;;:31;;;;49595:53;;;;;;;;;;;;;;;;;:5;49601:1;49595:8;;;;;;;:::i;:::-;;;;;:53;;;;49672:21;49685:7;49672:12;:21::i;:::-;49661:5;49667:1;49661:8;;;;;;;:::i;:::-;;;;;:32;;;;49706:54;;;;;;;;;;;;;;;;;:5;49712:1;49706:8;;;;;;;:::i;:::-;;;;;:54;;;;49784:18;49794:7;49784:9;:18::i;:::-;49773:5;49779:1;49773:8;;;;;;;:::i;:::-;;;;;:29;;;;49815:55;;;;;;;;;;;;;;;;;:5;49821:2;49815:9;;;;;;;:::i;:::-;;;;;:55;;;;49895:17;49904:7;49895:8;:17::i;:::-;49883:5;49889:2;49883:9;;;;;;;:::i;:::-;;;;;:29;;;;49925:55;;;;;;;;;;;;;;;;;:5;49931:2;49925:9;;;;;;;:::i;:::-;;;;;:55;;;;50005:20;50017:7;50005:11;:20::i;:::-;49993:5;49999:2;49993:9;;;;;;;:::i;:::-;;;;;:32;;;;50038:55;;;;;;;;;;;;;;;;;:5;50044:2;50038:9;;;;;;;:::i;:::-;;;;;:55;;;;50118:19;50129:7;50118:10;:19::i;:::-;50106:5;50112:2;50106:9;;;;;;;:::i;:::-;;;;;:31;;;;50150:27;;;;;;;;;;;;;;;;;:5;50156:2;50150:9;;;;;;;:::i;:::-;;;;;:27;;;;50190:20;50237:5;50243:1;50237:8;;;;;;;:::i;:::-;;;;;;50247:5;50253:1;50247:8;;;;;;;:::i;:::-;;;;;;50257:5;50263:1;50257:8;;;;;;;:::i;:::-;;;;;;50267:5;50273:1;50267:8;;;;;;;:::i;:::-;;;;;;50277:5;50283:1;50277:8;;;;;;;:::i;:::-;;;;;;50287:5;50293:1;50287:8;;;;;;;:::i;:::-;;;;;;50297:5;50303:1;50297:8;;;;;;;:::i;:::-;;;;;;50307:5;50313:1;50307:8;;;;;;;:::i;:::-;;;;;;50317:5;50323:1;50317:8;;;;;;;:::i;:::-;;;;;;50220:106;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50190:137;;50371:6;50379:5;50385:1;50379:8;;;;;;;:::i;:::-;;;;;;50389:5;50395:2;50389:9;;;;;;;:::i;:::-;;;;;;50400:5;50406:2;50400:9;;;;;;;:::i;:::-;;;;;;50411:5;50417:2;50411:9;;;;;;;:::i;:::-;;;;;;50422:5;50428:2;50422:9;;;;;;;:::i;:::-;;;;;;50433:5;50439:2;50433:9;;;;;;;:::i;:::-;;;;;;50444:5;50450:2;50444:9;;;;;;;:::i;:::-;;;;;;50455:5;50461:2;50455:9;;;;;;;:::i;:::-;;;;;;50354:111;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50338:128;;50487:20;50576:5;50582:1;50576:8;;;;;;;:::i;:::-;;;;;;50627:5;50633:2;50627:9;;;;;;;:::i;:::-;;;;;;50676:5;50682:2;50676:9;;;;;;;:::i;:::-;;;;;;50729:5;50735:1;50729:8;;;;;;;:::i;:::-;;;;;;50778:5;50784:1;50778:8;;;;;;;:::i;:::-;;;;;;50826:5;50832:1;50826:8;;;;;;;:::i;:::-;;;;;;50876:5;50882:2;50876:9;;;;;;;:::i;:::-;;;;;;50928:5;50934:1;50928:8;;;;;;;:::i;:::-;;;;;;50517:425;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50487:456;;50955:18;50976:422;51044:17;51053:7;51044:8;:17::i;:::-;51334:28;51354:6;51334:13;:28::i;:::-;51382:6;51003:392;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50976:13;:422::i;:::-;50955:443;;51474:4;51424:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;51408:72;;51500:6;51493:13;;;;;;48927:2587;;;:::o;47436:127::-;47492:13;47525:30;47531:7;47525:30;;;;;;;;;;;;;;;;;47549:5;47525:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:30::i;:::-;47518:37;;47436:127;;;:::o;52814:607::-;52858:13;52884:18;52905:405;52932:375;;;;;;;:::i;:::-;;;;;;;;;;;;;52905:13;:405::i;:::-;52884:426;;53385:4;53335:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;53321:70;;53409:4;53402:11;;;52814:607;:::o;27753:164::-;27850:4;27874:18;:25;27893:5;27874:25;;;;;;;;;;;;;;;:35;27900:8;27874:35;;;;;;;;;;;;;;;;;;;;;;;;;27867:42;;27753:164;;;;:::o;10176:192::-;9507:12;:10;:12::i;:::-;9496:23;;:7;:5;:7::i;:::-;:23;;;9488:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10285:1:::1;10265:22;;:8;:22;;;;10257:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10341:19;10351:8;10341:9;:19::i;:::-;10176:192:::0;:::o;24590:305::-;24692:4;24744:25;24729:40;;;:11;:40;;;;:105;;;;24801:33;24786:48;;;:11;:48;;;;24729:105;:158;;;;24851:36;24875:11;24851:23;:36::i;:::-;24729:158;24709:178;;24590:305;;;:::o;30488:127::-;30553:4;30605:1;30577:30;;:7;:16;30585:7;30577:16;;;;;;;;;;;;;;;;;;;;;:30;;;;30570:37;;30488:127;;;:::o;8136:98::-;8189:7;8216:10;8209:17;;8136:98;:::o;34470:174::-;34572:2;34545:15;:24;34561:7;34545:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34628:7;34624:2;34590:46;;34599:23;34614:7;34599:14;:23::i;:::-;34590:46;;;;;;;;;;;;34470:174;;:::o;48601:318::-;48710:13;48736:12;48751:62;48782:9;48793:17;48802:7;48793:8;:17::i;:::-;48765:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48751:6;:62::i;:::-;48736:77;;48824:20;48847:11;48866;:18;48859:4;:25;;;;:::i;:::-;48847:38;;;;;;;;:::i;:::-;;;;;;;;48824:61;;48905:6;48898:13;;;;48601:318;;;;;:::o;30782:348::-;30875:4;30900:16;30908:7;30900;:16::i;:::-;30892:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30976:13;30992:23;31007:7;30992:14;:23::i;:::-;30976:39;;31045:5;31034:16;;:7;:16;;;:51;;;;31078:7;31054:31;;:20;31066:7;31054:11;:20::i;:::-;:31;;;31034:51;:87;;;;31089:32;31106:5;31113:7;31089:16;:32::i;:::-;31034:87;31026:96;;;30782:348;;;;:::o;33774:578::-;33933:4;33906:31;;:23;33921:7;33906:14;:23::i;:::-;:31;;;33898:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;34016:1;34002:16;;:2;:16;;;;33994:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34072:39;34093:4;34099:2;34103:7;34072:20;:39::i;:::-;34176:29;34193:1;34197:7;34176:8;:29::i;:::-;34237:1;34218:9;:15;34228:4;34218:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34266:1;34249:9;:13;34259:2;34249:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34297:2;34278:7;:16;34286:7;34278:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34336:7;34332:2;34317:27;;34326:4;34317:27;;;;;;;;;;;;33774:578;;;:::o;31472:110::-;31548:26;31558:2;31562:7;31548:26;;;;;;;;;;;;:9;:26::i;:::-;31472:110;;:::o;10376:173::-;10432:16;10451:6;;;;;;;;;;;10432:25;;10477:8;10468:6;;:17;;;;;;;;;;;;;;;;;;10532:8;10501:40;;10522:8;10501:40;;;;;;;;;;;;10421:128;10376:173;:::o;29860:315::-;30017:28;30027:4;30033:2;30037:7;30017:9;:28::i;:::-;30064:48;30087:4;30093:2;30097:7;30106:5;30064:22;:48::i;:::-;30056:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29860:315;;;;:::o;52093:715::-;52149:13;52371:1;52362:5;:10;52358:53;;;52389:10;;;;;;;;;;;;;;;;;;;;;52358:53;52421:12;52436:5;52421:20;;52452:14;52477:78;52492:1;52484:4;:9;52477:78;;52510:8;;;;;:::i;:::-;;;;52541:2;52533:10;;;;;:::i;:::-;;;52477:78;;;52565:19;52597:6;52587:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52565:39;;52615:154;52631:1;52622:5;:10;52615:154;;52659:1;52649:11;;;;;:::i;:::-;;;52726:2;52718:5;:10;;;;:::i;:::-;52705:2;:24;;;;:::i;:::-;52692:39;;52675:6;52682;52675:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;52755:2;52746:11;;;;;:::i;:::-;;;52615:154;;;52793:6;52779:21;;;;;52093:715;;;;:::o;53878:1607::-;53936:13;53962:11;53976:4;:11;53962:25;;54009:1;54002:3;:8;53998:23;;;54012:9;;;;;;;;;;;;;;;;;53998:23;54073:18;54111:1;54106;54100:3;:7;;;;:::i;:::-;54099:13;;;;:::i;:::-;54094:1;:19;;;;:::i;:::-;54073:40;;54171:19;54216:2;54203:10;:15;;;;:::i;:::-;54193:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54171:48;;54232:18;54253:5;;;;;;;;;;;;;;;;;54232:26;;54322:1;54315:5;54311:13;54367:2;54359:6;54355:15;54418:1;54386:777;54441:3;54438:1;54435:10;54386:777;;;54496:1;54493;54489:9;54484:14;;54554:8;54549:1;54543:4;54539:12;54533:19;54529:34;54634:4;54626:5;54622:2;54618:14;54614:25;54604:8;54600:40;54594:47;54673:3;54670:1;54666:11;54659:18;;54764:4;54755;54747:5;54743:2;54739:14;54735:25;54725:8;54721:40;54715:47;54711:58;54706:3;54702:68;54695:75;;54802:3;54799:1;54795:11;54788:18;;54892:4;54883;54875:5;54872:1;54868:13;54864:24;54854:8;54850:39;54844:46;54840:57;54835:3;54831:67;54824:74;;54930:3;54927:1;54923:11;54916:18;;55012:4;55003;54996:5;54992:16;54982:8;54978:31;54972:38;54968:49;54963:3;54959:59;54952:66;;55052:3;55047;55043:13;55036:20;;55094:3;55083:9;55076:22;55146:1;55135:9;55131:17;55118:30;;54465:698;;54386:777;;;54390:44;55195:1;55190:3;55186:11;55216:1;55211:84;;;;55314:1;55309:82;;;;55179:212;;55211:84;55272:6;55267:3;55263:16;55259:1;55248:9;55244:17;55237:43;55211:84;;55309:82;55370:4;55365:3;55361:14;55357:1;55346:9;55342:17;55335:41;55179:212;;55422:10;55414:6;55407:26;54280:1164;;55470:6;55456:21;;;;;;53878:1607;;;;:::o;23197:157::-;23282:4;23321:25;23306:40;;;:11;:40;;;;23299:47;;23197:157;;;:::o;47286:138::-;47346:7;47408:5;47391:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;47381:34;;;;;;47373:43;;47366:50;;47286:138;;;:::o;40097:589::-;40241:45;40268:4;40274:2;40278:7;40241:26;:45::i;:::-;40319:1;40303:18;;:4;:18;;;40299:187;;;40338:40;40370:7;40338:31;:40::i;:::-;40299:187;;;40408:2;40400:10;;:4;:10;;;40396:90;;40427:47;40460:4;40466:7;40427:32;:47::i;:::-;40396:90;40299:187;40514:1;40500:16;;:2;:16;;;40496:183;;;40533:45;40570:7;40533:36;:45::i;:::-;40496:183;;;40606:4;40600:10;;:2;:10;;;40596:83;;40627:40;40655:2;40659:7;40627:27;:40::i;:::-;40596:83;40496:183;40097:589;;;:::o;31809:321::-;31939:18;31945:2;31949:7;31939:5;:18::i;:::-;31990:54;32021:1;32025:2;32029:7;32038:5;31990:22;:54::i;:::-;31968:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;31809:321;;;:::o;35209:803::-;35364:4;35385:15;:2;:13;;;:15::i;:::-;35381:624;;;35437:2;35421:36;;;35458:12;:10;:12::i;:::-;35472:4;35478:7;35487:5;35421:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35417:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35684:1;35667:6;:13;:18;35663:272;;;35710:60;;;;;;;;;;:::i;:::-;;;;;;;;35663:272;35885:6;35879:13;35870:6;35866:2;35862:15;35855:38;35417:533;35554:45;;;35544:55;;;:6;:55;;;;35537:62;;;;;35381:624;35989:4;35982:11;;35209:803;;;;;;;:::o;36584:126::-;;;;:::o;41409:164::-;41513:10;:17;;;;41486:15;:24;41502:7;41486:24;;;;;;;;;;;:44;;;;41541:10;41557:7;41541:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41409:164;:::o;42200:988::-;42466:22;42516:1;42491:22;42508:4;42491:16;:22::i;:::-;:26;;;;:::i;:::-;42466:51;;42528:18;42549:17;:26;42567:7;42549:26;;;;;;;;;;;;42528:47;;42696:14;42682:10;:28;42678:328;;42727:19;42749:12;:18;42762:4;42749:18;;;;;;;;;;;;;;;:34;42768:14;42749:34;;;;;;;;;;;;42727:56;;42833:11;42800:12;:18;42813:4;42800:18;;;;;;;;;;;;;;;:30;42819:10;42800:30;;;;;;;;;;;:44;;;;42950:10;42917:17;:30;42935:11;42917:30;;;;;;;;;;;:43;;;;42712:294;42678:328;43102:17;:26;43120:7;43102:26;;;;;;;;;;;43095:33;;;43146:12;:18;43159:4;43146:18;;;;;;;;;;;;;;;:34;43165:14;43146:34;;;;;;;;;;;43139:41;;;42281:907;;42200:988;;:::o;43483:1079::-;43736:22;43781:1;43761:10;:17;;;;:21;;;;:::i;:::-;43736:46;;43793:18;43814:15;:24;43830:7;43814:24;;;;;;;;;;;;43793:45;;44165:19;44187:10;44198:14;44187:26;;;;;;;;:::i;:::-;;;;;;;;;;44165:48;;44251:11;44226:10;44237;44226:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;44362:10;44331:15;:28;44347:11;44331:28;;;;;;;;;;;:41;;;;44503:15;:24;44519:7;44503:24;;;;;;;;;;;44496:31;;;44538:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;43554:1008;;;43483:1079;:::o;40987:221::-;41072:14;41089:20;41106:2;41089:16;:20::i;:::-;41072:37;;41147:7;41120:12;:16;41133:2;41120:16;;;;;;;;;;;;;;;:24;41137:6;41120:24;;;;;;;;;;;:34;;;;41194:6;41165:17;:26;41183:7;41165:26;;;;;;;;;;;:35;;;;41061:147;40987:221;;:::o;32466:382::-;32560:1;32546:16;;:2;:16;;;;32538:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32619:16;32627:7;32619;:16::i;:::-;32618:17;32610:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32681:45;32710:1;32714:2;32718:7;32681:20;:45::i;:::-;32756:1;32739:9;:13;32749:2;32739:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32787:2;32768:7;:16;32776:7;32768:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32832:7;32828:2;32807:33;;32824:1;32807:33;;;;;;;;;;;;32466:382;;:::o;15369:387::-;15429:4;15637:12;15704:7;15692:20;15684:28;;15747:1;15740:4;:8;15733:15;;;15369:387;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1354:139::-;1400:5;1438:6;1425:20;1416:29;;1454:33;1481:5;1454:33;:::i;:::-;1354:139;;;;:::o;1499:329::-;1558:6;1607:2;1595:9;1586:7;1582:23;1578:32;1575:119;;;1613:79;;:::i;:::-;1575:119;1733:1;1758:53;1803:7;1794:6;1783:9;1779:22;1758:53;:::i;:::-;1748:63;;1704:117;1499:329;;;;:::o;1834:474::-;1902:6;1910;1959:2;1947:9;1938:7;1934:23;1930:32;1927:119;;;1965:79;;:::i;:::-;1927:119;2085:1;2110:53;2155:7;2146:6;2135:9;2131:22;2110:53;:::i;:::-;2100:63;;2056:117;2212:2;2238:53;2283:7;2274:6;2263:9;2259:22;2238:53;:::i;:::-;2228:63;;2183:118;1834:474;;;;;:::o;2314:619::-;2391:6;2399;2407;2456:2;2444:9;2435:7;2431:23;2427:32;2424:119;;;2462:79;;:::i;:::-;2424:119;2582:1;2607:53;2652:7;2643:6;2632:9;2628:22;2607:53;:::i;:::-;2597:63;;2553:117;2709:2;2735:53;2780:7;2771:6;2760:9;2756:22;2735:53;:::i;:::-;2725:63;;2680:118;2837:2;2863:53;2908:7;2899:6;2888:9;2884:22;2863:53;:::i;:::-;2853:63;;2808:118;2314:619;;;;;:::o;2939:943::-;3034:6;3042;3050;3058;3107:3;3095:9;3086:7;3082:23;3078:33;3075:120;;;3114:79;;:::i;:::-;3075:120;3234:1;3259:53;3304:7;3295:6;3284:9;3280:22;3259:53;:::i;:::-;3249:63;;3205:117;3361:2;3387:53;3432:7;3423:6;3412:9;3408:22;3387:53;:::i;:::-;3377:63;;3332:118;3489:2;3515:53;3560:7;3551:6;3540:9;3536:22;3515:53;:::i;:::-;3505:63;;3460:118;3645:2;3634:9;3630:18;3617:32;3676:18;3668:6;3665:30;3662:117;;;3698:79;;:::i;:::-;3662:117;3803:62;3857:7;3848:6;3837:9;3833:22;3803:62;:::i;:::-;3793:72;;3588:287;2939:943;;;;;;;:::o;3888:468::-;3953:6;3961;4010:2;3998:9;3989:7;3985:23;3981:32;3978:119;;;4016:79;;:::i;:::-;3978:119;4136:1;4161:53;4206:7;4197:6;4186:9;4182:22;4161:53;:::i;:::-;4151:63;;4107:117;4263:2;4289:50;4331:7;4322:6;4311:9;4307:22;4289:50;:::i;:::-;4279:60;;4234:115;3888:468;;;;;:::o;4362:474::-;4430:6;4438;4487:2;4475:9;4466:7;4462:23;4458:32;4455:119;;;4493:79;;:::i;:::-;4455:119;4613:1;4638:53;4683:7;4674:6;4663:9;4659:22;4638:53;:::i;:::-;4628:63;;4584:117;4740:2;4766:53;4811:7;4802:6;4791:9;4787:22;4766:53;:::i;:::-;4756:63;;4711:118;4362:474;;;;;:::o;4842:327::-;4900:6;4949:2;4937:9;4928:7;4924:23;4920:32;4917:119;;;4955:79;;:::i;:::-;4917:119;5075:1;5100:52;5144:7;5135:6;5124:9;5120:22;5100:52;:::i;:::-;5090:62;;5046:116;4842:327;;;;:::o;5175:349::-;5244:6;5293:2;5281:9;5272:7;5268:23;5264:32;5261:119;;;5299:79;;:::i;:::-;5261:119;5419:1;5444:63;5499:7;5490:6;5479:9;5475:22;5444:63;:::i;:::-;5434:73;;5390:127;5175:349;;;;:::o;5530:329::-;5589:6;5638:2;5626:9;5617:7;5613:23;5609:32;5606:119;;;5644:79;;:::i;:::-;5606:119;5764:1;5789:53;5834:7;5825:6;5814:9;5810:22;5789:53;:::i;:::-;5779:63;;5735:117;5530:329;;;;:::o;5865:118::-;5952:24;5970:5;5952:24;:::i;:::-;5947:3;5940:37;5865:118;;:::o;5989:109::-;6070:21;6085:5;6070:21;:::i;:::-;6065:3;6058:34;5989:109;;:::o;6104:360::-;6190:3;6218:38;6250:5;6218:38;:::i;:::-;6272:70;6335:6;6330:3;6272:70;:::i;:::-;6265:77;;6351:52;6396:6;6391:3;6384:4;6377:5;6373:16;6351:52;:::i;:::-;6428:29;6450:6;6428:29;:::i;:::-;6423:3;6419:39;6412:46;;6194:270;6104:360;;;;:::o;6470:364::-;6558:3;6586:39;6619:5;6586:39;:::i;:::-;6641:71;6705:6;6700:3;6641:71;:::i;:::-;6634:78;;6721:52;6766:6;6761:3;6754:4;6747:5;6743:16;6721:52;:::i;:::-;6798:29;6820:6;6798:29;:::i;:::-;6793:3;6789:39;6782:46;;6562:272;6470:364;;;;:::o;6840:377::-;6946:3;6974:39;7007:5;6974:39;:::i;:::-;7029:89;7111:6;7106:3;7029:89;:::i;:::-;7022:96;;7127:52;7172:6;7167:3;7160:4;7153:5;7149:16;7127:52;:::i;:::-;7204:6;7199:3;7195:16;7188:23;;6950:267;6840:377;;;;:::o;7223:402::-;7383:3;7404:85;7486:2;7481:3;7404:85;:::i;:::-;7397:92;;7498:93;7587:3;7498:93;:::i;:::-;7616:2;7611:3;7607:12;7600:19;;7223:402;;;:::o;7631:::-;7791:3;7812:85;7894:2;7889:3;7812:85;:::i;:::-;7805:92;;7906:93;7995:3;7906:93;:::i;:::-;8024:2;8019:3;8015:12;8008:19;;7631:402;;;:::o;8039:404::-;8199:3;8220:86;8302:3;8297;8220:86;:::i;:::-;8213:93;;8315;8404:3;8315:93;:::i;:::-;8433:3;8428;8424:13;8417:20;;8039:404;;;:::o;8449:366::-;8591:3;8612:67;8676:2;8671:3;8612:67;:::i;:::-;8605:74;;8688:93;8777:3;8688:93;:::i;:::-;8806:2;8801:3;8797:12;8790:19;;8449:366;;;:::o;8821:::-;8963:3;8984:67;9048:2;9043:3;8984:67;:::i;:::-;8977:74;;9060:93;9149:3;9060:93;:::i;:::-;9178:2;9173:3;9169:12;9162:19;;8821:366;;;:::o;9193:402::-;9353:3;9374:85;9456:2;9451:3;9374:85;:::i;:::-;9367:92;;9468:93;9557:3;9468:93;:::i;:::-;9586:2;9581:3;9577:12;9570:19;;9193:402;;;:::o;9601:366::-;9743:3;9764:67;9828:2;9823:3;9764:67;:::i;:::-;9757:74;;9840:93;9929:3;9840:93;:::i;:::-;9958:2;9953:3;9949:12;9942:19;;9601:366;;;:::o;9973:402::-;10133:3;10154:85;10236:2;10231:3;10154:85;:::i;:::-;10147:92;;10248:93;10337:3;10248:93;:::i;:::-;10366:2;10361:3;10357:12;10350:19;;9973:402;;;:::o;10381:366::-;10523:3;10544:67;10608:2;10603:3;10544:67;:::i;:::-;10537:74;;10620:93;10709:3;10620:93;:::i;:::-;10738:2;10733:3;10729:12;10722:19;;10381:366;;;:::o;10753:::-;10895:3;10916:67;10980:2;10975:3;10916:67;:::i;:::-;10909:74;;10992:93;11081:3;10992:93;:::i;:::-;11110:2;11105:3;11101:12;11094:19;;10753:366;;;:::o;11125:402::-;11285:3;11306:85;11388:2;11383:3;11306:85;:::i;:::-;11299:92;;11400:93;11489:3;11400:93;:::i;:::-;11518:2;11513:3;11509:12;11502:19;;11125:402;;;:::o;11533:366::-;11675:3;11696:67;11760:2;11755:3;11696:67;:::i;:::-;11689:74;;11772:93;11861:3;11772:93;:::i;:::-;11890:2;11885:3;11881:12;11874:19;;11533:366;;;:::o;11905:402::-;12065:3;12086:85;12168:2;12163:3;12086:85;:::i;:::-;12079:92;;12180:93;12269:3;12180:93;:::i;:::-;12298:2;12293:3;12289:12;12282:19;;11905:402;;;:::o;12313:400::-;12473:3;12494:84;12576:1;12571:3;12494:84;:::i;:::-;12487:91;;12587:93;12676:3;12587:93;:::i;:::-;12705:1;12700:3;12696:11;12689:18;;12313:400;;;:::o;12719:366::-;12861:3;12882:67;12946:2;12941:3;12882:67;:::i;:::-;12875:74;;12958:93;13047:3;12958:93;:::i;:::-;13076:2;13071:3;13067:12;13060:19;;12719:366;;;:::o;13091:402::-;13251:3;13272:85;13354:2;13349:3;13272:85;:::i;:::-;13265:92;;13366:93;13455:3;13366:93;:::i;:::-;13484:2;13479:3;13475:12;13468:19;;13091:402;;;:::o;13499:366::-;13641:3;13662:67;13726:2;13721:3;13662:67;:::i;:::-;13655:74;;13738:93;13827:3;13738:93;:::i;:::-;13856:2;13851:3;13847:12;13840:19;;13499:366;;;:::o;13871:::-;14013:3;14034:67;14098:2;14093:3;14034:67;:::i;:::-;14027:74;;14110:93;14199:3;14110:93;:::i;:::-;14228:2;14223:3;14219:12;14212:19;;13871:366;;;:::o;14243:::-;14385:3;14406:67;14470:2;14465:3;14406:67;:::i;:::-;14399:74;;14482:93;14571:3;14482:93;:::i;:::-;14600:2;14595:3;14591:12;14584:19;;14243:366;;;:::o;14615:400::-;14775:3;14796:84;14878:1;14873:3;14796:84;:::i;:::-;14789:91;;14889:93;14978:3;14889:93;:::i;:::-;15007:1;15002:3;14998:11;14991:18;;14615:400;;;:::o;15021:366::-;15163:3;15184:67;15248:2;15243:3;15184:67;:::i;:::-;15177:74;;15260:93;15349:3;15260:93;:::i;:::-;15378:2;15373:3;15369:12;15362:19;;15021:366;;;:::o;15393:::-;15535:3;15556:67;15620:2;15615:3;15556:67;:::i;:::-;15549:74;;15632:93;15721:3;15632:93;:::i;:::-;15750:2;15745:3;15741:12;15734:19;;15393:366;;;:::o;15765:402::-;15925:3;15946:85;16028:2;16023:3;15946:85;:::i;:::-;15939:92;;16040:93;16129:3;16040:93;:::i;:::-;16158:2;16153:3;16149:12;16142:19;;15765:402;;;:::o;16173:366::-;16315:3;16336:67;16400:2;16395:3;16336:67;:::i;:::-;16329:74;;16412:93;16501:3;16412:93;:::i;:::-;16530:2;16525:3;16521:12;16514:19;;16173:366;;;:::o;16545:::-;16687:3;16708:67;16772:2;16767:3;16708:67;:::i;:::-;16701:74;;16784:93;16873:3;16784:93;:::i;:::-;16902:2;16897:3;16893:12;16886:19;;16545:366;;;:::o;16917:::-;17059:3;17080:67;17144:2;17139:3;17080:67;:::i;:::-;17073:74;;17156:93;17245:3;17156:93;:::i;:::-;17274:2;17269:3;17265:12;17258:19;;16917:366;;;:::o;17289:404::-;17449:3;17470:86;17552:3;17547;17470:86;:::i;:::-;17463:93;;17565;17654:3;17565:93;:::i;:::-;17683:3;17678;17674:13;17667:20;;17289:404;;;:::o;17699:366::-;17841:3;17862:67;17926:2;17921:3;17862:67;:::i;:::-;17855:74;;17938:93;18027:3;17938:93;:::i;:::-;18056:2;18051:3;18047:12;18040:19;;17699:366;;;:::o;18071:402::-;18231:3;18252:85;18334:2;18329:3;18252:85;:::i;:::-;18245:92;;18346:93;18435:3;18346:93;:::i;:::-;18464:2;18459:3;18455:12;18448:19;;18071:402;;;:::o;18479:366::-;18621:3;18642:67;18706:2;18701:3;18642:67;:::i;:::-;18635:74;;18718:93;18807:3;18718:93;:::i;:::-;18836:2;18831:3;18827:12;18820:19;;18479:366;;;:::o;18851:402::-;19011:3;19032:85;19114:2;19109:3;19032:85;:::i;:::-;19025:92;;19126:93;19215:3;19126:93;:::i;:::-;19244:2;19239:3;19235:12;19228:19;;18851:402;;;:::o;19259:366::-;19401:3;19422:67;19486:2;19481:3;19422:67;:::i;:::-;19415:74;;19498:93;19587:3;19498:93;:::i;:::-;19616:2;19611:3;19607:12;19600:19;;19259:366;;;:::o;19631:::-;19773:3;19794:67;19858:2;19853:3;19794:67;:::i;:::-;19787:74;;19870:93;19959:3;19870:93;:::i;:::-;19988:2;19983:3;19979:12;19972:19;;19631:366;;;:::o;20003:402::-;20163:3;20184:85;20266:2;20261:3;20184:85;:::i;:::-;20177:92;;20278:93;20367:3;20278:93;:::i;:::-;20396:2;20391:3;20387:12;20380:19;;20003:402;;;:::o;20411:366::-;20553:3;20574:67;20638:2;20633:3;20574:67;:::i;:::-;20567:74;;20650:93;20739:3;20650:93;:::i;:::-;20768:2;20763:3;20759:12;20752:19;;20411:366;;;:::o;20783:118::-;20870:24;20888:5;20870:24;:::i;:::-;20865:3;20858:37;20783:118;;:::o;20907:275::-;21039:3;21061:95;21152:3;21143:6;21061:95;:::i;:::-;21054:102;;21173:3;21166:10;;20907:275;;;;:::o;21188:435::-;21368:3;21390:95;21481:3;21472:6;21390:95;:::i;:::-;21383:102;;21502:95;21593:3;21584:6;21502:95;:::i;:::-;21495:102;;21614:3;21607:10;;21188:435;;;;;:::o;21629:1555::-;22145:3;22167:95;22258:3;22249:6;22167:95;:::i;:::-;22160:102;;22279:95;22370:3;22361:6;22279:95;:::i;:::-;22272:102;;22391:95;22482:3;22473:6;22391:95;:::i;:::-;22384:102;;22503:95;22594:3;22585:6;22503:95;:::i;:::-;22496:102;;22615:95;22706:3;22697:6;22615:95;:::i;:::-;22608:102;;22727:95;22818:3;22809:6;22727:95;:::i;:::-;22720:102;;22839:95;22930:3;22921:6;22839:95;:::i;:::-;22832:102;;22951:95;23042:3;23033:6;22951:95;:::i;:::-;22944:102;;23063:95;23154:3;23145:6;23063:95;:::i;:::-;23056:102;;23175:3;23168:10;;21629:1555;;;;;;;;;;;;:::o;23190:381::-;23375:3;23397:148;23541:3;23397:148;:::i;:::-;23390:155;;23562:3;23555:10;;23190:381;;;:::o;23577:3789::-;24954:3;24976:148;25120:3;24976:148;:::i;:::-;24969:155;;25141:95;25232:3;25223:6;25141:95;:::i;:::-;25134:102;;25253:148;25397:3;25253:148;:::i;:::-;25246:155;;25418:95;25509:3;25500:6;25418:95;:::i;:::-;25411:102;;25530:148;25674:3;25530:148;:::i;:::-;25523:155;;25695:95;25786:3;25777:6;25695:95;:::i;:::-;25688:102;;25807:148;25951:3;25807:148;:::i;:::-;25800:155;;25972:95;26063:3;26054:6;25972:95;:::i;:::-;25965:102;;26084:148;26228:3;26084:148;:::i;:::-;26077:155;;26249:95;26340:3;26331:6;26249:95;:::i;:::-;26242:102;;26361:148;26505:3;26361:148;:::i;:::-;26354:155;;26526:95;26617:3;26608:6;26526:95;:::i;:::-;26519:102;;26638:148;26782:3;26638:148;:::i;:::-;26631:155;;26803:95;26894:3;26885:6;26803:95;:::i;:::-;26796:102;;26915:148;27059:3;26915:148;:::i;:::-;26908:155;;27080:95;27171:3;27162:6;27080:95;:::i;:::-;27073:102;;27192:148;27336:3;27192:148;:::i;:::-;27185:155;;27357:3;27350:10;;23577:3789;;;;;;;;;;;:::o;27372:1659::-;28004:3;28026:148;28170:3;28026:148;:::i;:::-;28019:155;;28191:95;28282:3;28273:6;28191:95;:::i;:::-;28184:102;;28303:148;28447:3;28303:148;:::i;:::-;28296:155;;28468:95;28559:3;28550:6;28468:95;:::i;:::-;28461:102;;28580:148;28724:3;28580:148;:::i;:::-;28573:155;;28745:95;28836:3;28827:6;28745:95;:::i;:::-;28738:102;;28857:148;29001:3;28857:148;:::i;:::-;28850:155;;29022:3;29015:10;;27372:1659;;;;;;:::o;29037:541::-;29270:3;29292:148;29436:3;29292:148;:::i;:::-;29285:155;;29457:95;29548:3;29539:6;29457:95;:::i;:::-;29450:102;;29569:3;29562:10;;29037:541;;;;:::o;29584:222::-;29677:4;29715:2;29704:9;29700:18;29692:26;;29728:71;29796:1;29785:9;29781:17;29772:6;29728:71;:::i;:::-;29584:222;;;;:::o;29812:640::-;30007:4;30045:3;30034:9;30030:19;30022:27;;30059:71;30127:1;30116:9;30112:17;30103:6;30059:71;:::i;:::-;30140:72;30208:2;30197:9;30193:18;30184:6;30140:72;:::i;:::-;30222;30290:2;30279:9;30275:18;30266:6;30222:72;:::i;:::-;30341:9;30335:4;30331:20;30326:2;30315:9;30311:18;30304:48;30369:76;30440:4;30431:6;30369:76;:::i;:::-;30361:84;;29812:640;;;;;;;:::o;30458:210::-;30545:4;30583:2;30572:9;30568:18;30560:26;;30596:65;30658:1;30647:9;30643:17;30634:6;30596:65;:::i;:::-;30458:210;;;;:::o;30674:313::-;30787:4;30825:2;30814:9;30810:18;30802:26;;30874:9;30868:4;30864:20;30860:1;30849:9;30845:17;30838:47;30902:78;30975:4;30966:6;30902:78;:::i;:::-;30894:86;;30674:313;;;;:::o;30993:419::-;31159:4;31197:2;31186:9;31182:18;31174:26;;31246:9;31240:4;31236:20;31232:1;31221:9;31217:17;31210:47;31274:131;31400:4;31274:131;:::i;:::-;31266:139;;30993:419;;;:::o;31418:::-;31584:4;31622:2;31611:9;31607:18;31599:26;;31671:9;31665:4;31661:20;31657:1;31646:9;31642:17;31635:47;31699:131;31825:4;31699:131;:::i;:::-;31691:139;;31418:419;;;:::o;31843:::-;32009:4;32047:2;32036:9;32032:18;32024:26;;32096:9;32090:4;32086:20;32082:1;32071:9;32067:17;32060:47;32124:131;32250:4;32124:131;:::i;:::-;32116:139;;31843:419;;;:::o;32268:::-;32434:4;32472:2;32461:9;32457:18;32449:26;;32521:9;32515:4;32511:20;32507:1;32496:9;32492:17;32485:47;32549:131;32675:4;32549:131;:::i;:::-;32541:139;;32268:419;;;:::o;32693:::-;32859:4;32897:2;32886:9;32882:18;32874:26;;32946:9;32940:4;32936:20;32932:1;32921:9;32917:17;32910:47;32974:131;33100:4;32974:131;:::i;:::-;32966:139;;32693:419;;;:::o;33118:::-;33284:4;33322:2;33311:9;33307:18;33299:26;;33371:9;33365:4;33361:20;33357:1;33346:9;33342:17;33335:47;33399:131;33525:4;33399:131;:::i;:::-;33391:139;;33118:419;;;:::o;33543:::-;33709:4;33747:2;33736:9;33732:18;33724:26;;33796:9;33790:4;33786:20;33782:1;33771:9;33767:17;33760:47;33824:131;33950:4;33824:131;:::i;:::-;33816:139;;33543:419;;;:::o;33968:::-;34134:4;34172:2;34161:9;34157:18;34149:26;;34221:9;34215:4;34211:20;34207:1;34196:9;34192:17;34185:47;34249:131;34375:4;34249:131;:::i;:::-;34241:139;;33968:419;;;:::o;34393:::-;34559:4;34597:2;34586:9;34582:18;34574:26;;34646:9;34640:4;34636:20;34632:1;34621:9;34617:17;34610:47;34674:131;34800:4;34674:131;:::i;:::-;34666:139;;34393:419;;;:::o;34818:::-;34984:4;35022:2;35011:9;35007:18;34999:26;;35071:9;35065:4;35061:20;35057:1;35046:9;35042:17;35035:47;35099:131;35225:4;35099:131;:::i;:::-;35091:139;;34818:419;;;:::o;35243:::-;35409:4;35447:2;35436:9;35432:18;35424:26;;35496:9;35490:4;35486:20;35482:1;35471:9;35467:17;35460:47;35524:131;35650:4;35524:131;:::i;:::-;35516:139;;35243:419;;;:::o;35668:::-;35834:4;35872:2;35861:9;35857:18;35849:26;;35921:9;35915:4;35911:20;35907:1;35896:9;35892:17;35885:47;35949:131;36075:4;35949:131;:::i;:::-;35941:139;;35668:419;;;:::o;36093:::-;36259:4;36297:2;36286:9;36282:18;36274:26;;36346:9;36340:4;36336:20;36332:1;36321:9;36317:17;36310:47;36374:131;36500:4;36374:131;:::i;:::-;36366:139;;36093:419;;;:::o;36518:::-;36684:4;36722:2;36711:9;36707:18;36699:26;;36771:9;36765:4;36761:20;36757:1;36746:9;36742:17;36735:47;36799:131;36925:4;36799:131;:::i;:::-;36791:139;;36518:419;;;:::o;36943:::-;37109:4;37147:2;37136:9;37132:18;37124:26;;37196:9;37190:4;37186:20;37182:1;37171:9;37167:17;37160:47;37224:131;37350:4;37224:131;:::i;:::-;37216:139;;36943:419;;;:::o;37368:::-;37534:4;37572:2;37561:9;37557:18;37549:26;;37621:9;37615:4;37611:20;37607:1;37596:9;37592:17;37585:47;37649:131;37775:4;37649:131;:::i;:::-;37641:139;;37368:419;;;:::o;37793:::-;37959:4;37997:2;37986:9;37982:18;37974:26;;38046:9;38040:4;38036:20;38032:1;38021:9;38017:17;38010:47;38074:131;38200:4;38074:131;:::i;:::-;38066:139;;37793:419;;;:::o;38218:::-;38384:4;38422:2;38411:9;38407:18;38399:26;;38471:9;38465:4;38461:20;38457:1;38446:9;38442:17;38435:47;38499:131;38625:4;38499:131;:::i;:::-;38491:139;;38218:419;;;:::o;38643:::-;38809:4;38847:2;38836:9;38832:18;38824:26;;38896:9;38890:4;38886:20;38882:1;38871:9;38867:17;38860:47;38924:131;39050:4;38924:131;:::i;:::-;38916:139;;38643:419;;;:::o;39068:::-;39234:4;39272:2;39261:9;39257:18;39249:26;;39321:9;39315:4;39311:20;39307:1;39296:9;39292:17;39285:47;39349:131;39475:4;39349:131;:::i;:::-;39341:139;;39068:419;;;:::o;39493:222::-;39586:4;39624:2;39613:9;39609:18;39601:26;;39637:71;39705:1;39694:9;39690:17;39681:6;39637:71;:::i;:::-;39493:222;;;;:::o;39721:129::-;39755:6;39782:20;;:::i;:::-;39772:30;;39811:33;39839:4;39831:6;39811:33;:::i;:::-;39721:129;;;:::o;39856:75::-;39889:6;39922:2;39916:9;39906:19;;39856:75;:::o;39937:307::-;39998:4;40088:18;40080:6;40077:30;40074:56;;;40110:18;;:::i;:::-;40074:56;40148:29;40170:6;40148:29;:::i;:::-;40140:37;;40232:4;40226;40222:15;40214:23;;39937:307;;;:::o;40250:98::-;40301:6;40335:5;40329:12;40319:22;;40250:98;;;:::o;40354:99::-;40406:6;40440:5;40434:12;40424:22;;40354:99;;;:::o;40459:168::-;40542:11;40576:6;40571:3;40564:19;40616:4;40611:3;40607:14;40592:29;;40459:168;;;;:::o;40633:169::-;40717:11;40751:6;40746:3;40739:19;40791:4;40786:3;40782:14;40767:29;;40633:169;;;;:::o;40808:148::-;40910:11;40947:3;40932:18;;40808:148;;;;:::o;40962:305::-;41002:3;41021:20;41039:1;41021:20;:::i;:::-;41016:25;;41055:20;41073:1;41055:20;:::i;:::-;41050:25;;41209:1;41141:66;41137:74;41134:1;41131:81;41128:107;;;41215:18;;:::i;:::-;41128:107;41259:1;41256;41252:9;41245:16;;40962:305;;;;:::o;41273:185::-;41313:1;41330:20;41348:1;41330:20;:::i;:::-;41325:25;;41364:20;41382:1;41364:20;:::i;:::-;41359:25;;41403:1;41393:35;;41408:18;;:::i;:::-;41393:35;41450:1;41447;41443:9;41438:14;;41273:185;;;;:::o;41464:348::-;41504:7;41527:20;41545:1;41527:20;:::i;:::-;41522:25;;41561:20;41579:1;41561:20;:::i;:::-;41556:25;;41749:1;41681:66;41677:74;41674:1;41671:81;41666:1;41659:9;41652:17;41648:105;41645:131;;;41756:18;;:::i;:::-;41645:131;41804:1;41801;41797:9;41786:20;;41464:348;;;;:::o;41818:191::-;41858:4;41878:20;41896:1;41878:20;:::i;:::-;41873:25;;41912:20;41930:1;41912:20;:::i;:::-;41907:25;;41951:1;41948;41945:8;41942:34;;;41956:18;;:::i;:::-;41942:34;42001:1;41998;41994:9;41986:17;;41818:191;;;;:::o;42015:96::-;42052:7;42081:24;42099:5;42081:24;:::i;:::-;42070:35;;42015:96;;;:::o;42117:90::-;42151:7;42194:5;42187:13;42180:21;42169:32;;42117:90;;;:::o;42213:149::-;42249:7;42289:66;42282:5;42278:78;42267:89;;42213:149;;;:::o;42368:126::-;42405:7;42445:42;42438:5;42434:54;42423:65;;42368:126;;;:::o;42500:77::-;42537:7;42566:5;42555:16;;42500:77;;;:::o;42583:154::-;42667:6;42662:3;42657;42644:30;42729:1;42720:6;42715:3;42711:16;42704:27;42583:154;;;:::o;42743:307::-;42811:1;42821:113;42835:6;42832:1;42829:13;42821:113;;;42920:1;42915:3;42911:11;42905:18;42901:1;42896:3;42892:11;42885:39;42857:2;42854:1;42850:10;42845:15;;42821:113;;;42952:6;42949:1;42946:13;42943:101;;;43032:1;43023:6;43018:3;43014:16;43007:27;42943:101;42792:258;42743:307;;;:::o;43056:320::-;43100:6;43137:1;43131:4;43127:12;43117:22;;43184:1;43178:4;43174:12;43205:18;43195:81;;43261:4;43253:6;43249:17;43239:27;;43195:81;43323:2;43315:6;43312:14;43292:18;43289:38;43286:84;;;43342:18;;:::i;:::-;43286:84;43107:269;43056:320;;;:::o;43382:281::-;43465:27;43487:4;43465:27;:::i;:::-;43457:6;43453:40;43595:6;43583:10;43580:22;43559:18;43547:10;43544:34;43541:62;43538:88;;;43606:18;;:::i;:::-;43538:88;43646:10;43642:2;43635:22;43425:238;43382:281;;:::o;43669:233::-;43708:3;43731:24;43749:5;43731:24;:::i;:::-;43722:33;;43777:66;43770:5;43767:77;43764:103;;;43847:18;;:::i;:::-;43764:103;43894:1;43887:5;43883:13;43876:20;;43669:233;;;:::o;43908:176::-;43940:1;43957:20;43975:1;43957:20;:::i;:::-;43952:25;;43991:20;44009:1;43991:20;:::i;:::-;43986:25;;44030:1;44020:35;;44035:18;;:::i;:::-;44020:35;44076:1;44073;44069:9;44064:14;;43908:176;;;;:::o;44090:180::-;44138:77;44135:1;44128:88;44235:4;44232:1;44225:15;44259:4;44256:1;44249:15;44276:180;44324:77;44321:1;44314:88;44421:4;44418:1;44411:15;44445:4;44442:1;44435:15;44462:180;44510:77;44507:1;44500:88;44607:4;44604:1;44597:15;44631:4;44628:1;44621:15;44648:180;44696:77;44693:1;44686:88;44793:4;44790:1;44783:15;44817:4;44814:1;44807:15;44834:180;44882:77;44879:1;44872:88;44979:4;44976:1;44969:15;45003:4;45000:1;44993:15;45020:180;45068:77;45065:1;45058:88;45165:4;45162:1;45155:15;45189:4;45186:1;45179:15;45206:117;45315:1;45312;45305:12;45329:117;45438:1;45435;45428:12;45452:117;45561:1;45558;45551:12;45575:117;45684:1;45681;45674:12;45698:102;45739:6;45790:2;45786:7;45781:2;45774:5;45770:14;45766:28;45756:38;;45698:102;;;:::o;45806:315::-;45946:66;45942:1;45934:6;45930:14;45923:90;46047:66;46042:2;46034:6;46030:15;46023:91;45806:315;:::o;46127:214::-;46267:66;46263:1;46255:6;46251:14;46244:90;46127:214;:::o;46347:1109::-;46487:66;46483:1;46475:6;46471:14;46464:90;46588:66;46583:2;46575:6;46571:15;46564:91;46689:34;46684:2;46676:6;46672:15;46665:59;46758:34;46753:2;46745:6;46741:15;46734:59;46828:34;46822:3;46814:6;46810:16;46803:60;46898:34;46892:3;46884:6;46880:16;46873:60;46968:34;46962:3;46954:6;46950:16;46943:60;47038:34;47032:3;47024:6;47020:16;47013:60;47108:66;47102:3;47094:6;47090:16;47083:92;47210:66;47204:3;47196:6;47192:16;47185:92;47312:34;47306:3;47298:6;47294:16;47287:60;47382:66;47376:3;47368:6;47364:16;47357:92;46347:1109;:::o;47462:230::-;47602:34;47598:1;47590:6;47586:14;47579:58;47671:13;47666:2;47658:6;47654:15;47647:38;47462:230;:::o;47698:237::-;47838:34;47834:1;47826:6;47822:14;47815:58;47907:20;47902:2;47894:6;47890:15;47883:45;47698:237;:::o;47941:315::-;48081:66;48077:1;48069:6;48065:14;48058:90;48182:66;48177:2;48169:6;48165:15;48158:91;47941:315;:::o;48262:225::-;48402:34;48398:1;48390:6;48386:14;48379:58;48471:8;48466:2;48458:6;48454:15;48447:33;48262:225;:::o;48493:315::-;48633:66;48629:1;48621:6;48617:14;48610:90;48734:66;48729:2;48721:6;48717:15;48710:91;48493:315;:::o;48814:178::-;48954:30;48950:1;48942:6;48938:14;48931:54;48814:178;:::o;48998:223::-;49138:34;49134:1;49126:6;49122:14;49115:58;49207:6;49202:2;49194:6;49190:15;49183:31;48998:223;:::o;49227:214::-;49367:66;49363:1;49355:6;49351:14;49344:90;49227:214;:::o;49447:175::-;49587:27;49583:1;49575:6;49571:14;49564:51;49447:175;:::o;49628:315::-;49768:66;49764:1;49756:6;49752:14;49745:90;49869:66;49864:2;49856:6;49852:15;49845:91;49628:315;:::o;49949:145::-;50085:5;50081:1;50073:6;50069:14;50062:29;49949:145;:::o;50096:219::-;50232:34;50228:1;50220:6;50216:14;50209:58;50297:14;50292:2;50284:6;50280:15;50273:39;50096:219;:::o;50317:303::-;50453:66;50449:1;50441:6;50437:14;50430:90;50550:66;50545:2;50537:6;50533:15;50526:91;50317:303;:::o;50622:231::-;50758:34;50754:1;50746:6;50742:14;50735:58;50823:26;50818:2;50810:6;50806:15;50799:51;50622:231;:::o;50855:217::-;50991:34;50987:1;50979:6;50975:14;50968:58;51056:12;51051:2;51043:6;51039:15;51032:37;50855:217;:::o;51074:216::-;51210:34;51206:1;51198:6;51194:14;51187:58;51275:11;51270:2;51262:6;51258:15;51251:36;51074:216;:::o;51292:206::-;51428:66;51424:1;51416:6;51412:14;51405:90;51292:206;:::o;51500:174::-;51636:34;51632:1;51624:6;51620:14;51613:58;51500:174;:::o;51676:219::-;51812:34;51808:1;51800:6;51796:14;51789:58;51877:14;51872:2;51864:6;51860:15;51853:39;51676:219;:::o;51897:303::-;52033:66;52029:1;52021:6;52017:14;52010:90;52130:66;52125:2;52117:6;52113:15;52106:91;51897:303;:::o;52202:174::-;52338:34;52334:1;52326:6;52322:14;52315:58;52202:174;:::o;52378:158::-;52514:18;52510:1;52502:6;52498:14;52491:42;52378:158;:::o;52538:216::-;52674:34;52670:1;52662:6;52658:14;52651:58;52739:11;52734:2;52726:6;52722:15;52715:36;52538:216;:::o;52756:742::-;52892:66;52888:1;52880:6;52876:14;52869:90;52989:34;52984:2;52976:6;52972:15;52965:59;53054:34;53049:2;53041:6;53037:15;53030:59;53119:34;53114:2;53106:6;53102:15;53095:59;53185:34;53179:3;53171:6;53167:16;53160:60;53251:34;53245:3;53237:6;53233:16;53226:60;53317:34;53311:3;53303:6;53299:16;53292:60;53383:66;53377:3;53369:6;53365:16;53358:92;53481:13;53475:3;53467:6;53463:16;53456:39;52756:742;:::o;53500:167::-;53636:27;53632:1;53624:6;53620:14;53613:51;53500:167;:::o;53669:303::-;53805:66;53801:1;53793:6;53789:14;53782:90;53902:66;53897:2;53889:6;53885:15;53878:91;53669:303;:::o;53974:208::-;54110:34;54106:1;54098:6;54094:14;54087:58;54175:3;54170:2;54162:6;54158:15;54151:28;53974:208;:::o;54184:171::-;54320:31;54316:1;54308:6;54304:14;54297:55;54184:171;:::o;54357:224::-;54493:34;54489:1;54481:6;54477:14;54470:58;54558:19;54553:2;54545:6;54541:15;54534:44;54357:224;:::o;54583:219::-;54719:34;54715:1;54707:6;54703:14;54696:58;54784:14;54779:2;54771:6;54767:15;54760:39;54583:219;:::o;54804:303::-;54940:66;54936:1;54928:6;54924:14;54917:90;55037:66;55032:2;55024:6;55020:15;55013:91;54804:303;:::o;55109:173::-;55245:33;55241:1;55233:6;55229:14;55222:57;55109:173;:::o;55284:114::-;55353:24;55371:5;55353:24;:::i;:::-;55346:5;55343:35;55333:63;;55392:1;55389;55382:12;55333:63;55284:114;:::o;55400:108::-;55466:21;55481:5;55466:21;:::i;:::-;55459:5;55456:32;55446:60;;55502:1;55499;55492:12;55446:60;55400:108;:::o;55510:112::-;55578:23;55595:5;55578:23;:::i;:::-;55571:5;55568:34;55558:62;;55616:1;55613;55606:12;55558:62;55510:112;:::o;55624:114::-;55693:24;55711:5;55693:24;:::i;:::-;55686:5;55683:35;55673:63;;55732:1;55729;55722:12;55673:63;55624:114;:::o

Swarm Source

ipfs://67d3d6bfaadec13bde0f9f8d2c35fb2e3db81b16f5210f07e8a4405b662fe4d3
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.