ETH Price: $3,233.72 (+2.55%)
Gas: 2 Gwei

Token

Wrapped Waifus (WWFU)
 

Overview

Max Total Supply

0 WWFU

Holders

235

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
0 WWFU
0xAda6Cbd477311409DF392F869c21f384A2d9D1ff
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The original Waifu NFT project from early 2018. This project was launched and then forgotten - until a recent rediscovery! You can claim waifus in different batches from the presale contract, then craft two waifus together to create new ones!

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
WaifuWrapper

Compiler Version
v0.8.3+commit.8d00100c

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-04-05
*/

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

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

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

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

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



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

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



pragma solidity ^0.8.0;

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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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



pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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



pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

}

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



pragma solidity ^0.8.0;


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

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



pragma solidity ^0.8.0;









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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. 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 || ERC721.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 || ERC721.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 {
                    // solhint-disable-next-line no-inline-assembly
                    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` 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 { }
}

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



pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: contracts/WaifuWrapper.sol

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.0;




interface WaifuContract {

    event Transfer(address indexed _from, address indexed _to, uint256 _tokenId);
    event Approval(address indexed _owner, address indexed _approved, uint256 _tokenId);

    // Known functions
    function approve(address _to, uint256 _tokenId) external;
    function buy(uint256) external payable;
    function bid(uint256) external payable;
    function isTransferDisabled(uint256) external view returns (bool);
    function artworkIdToTransferApproved(uint256 _tokenId) external view returns (address);
    function ownerOf(uint256 _tokenId) external view returns (address);
    function transfer(address _to, uint256 _tokenId) external;
    // transferFrom needs send() from the artworkIdToTransferApproved() address, not owner
    function transferFrom(address _from, address _to, uint256 _tokenId) external;
}

contract WaifuWrapper is Ownable, ERC721 {

    event Wrapped(address indexed owner, uint indexed _tokenId);
    event Unwrapped(address indexed owner, uint indexed _tokenId);

    address public _waifuAddress = 0x36697e362Ee7E9CA977b7550B3e4f955fc5BF27d;
    string public _baseTokenURI;

    constructor() payable ERC721("Wrapped Waifus", "WWFU") {
    }

    /**
     * @dev Transfers a waifu from the contract and assigns a wrapped token to msg.sender
     */
    function wrap(uint _tokenId) public payable {

        WaifuContract(_waifuAddress).transferFrom(msg.sender, address(this), _tokenId);
        _mint(msg.sender, _tokenId);
        Wrapped(msg.sender, _tokenId);
    }

    /**
     * @dev Burns the wrapped token and transfers the underlying waifu to the owner
     **/
    function unwrap(uint256 _tokenId) public {
        require(_isApprovedOrOwner(msg.sender, _tokenId));
        _burn(_tokenId);
        WaifuContract(_waifuAddress).transfer(msg.sender, _tokenId);
        Unwrapped(msg.sender, _tokenId);
    }

    /**
     * @dev Returns a URI for a given token ID's metadata
     */
    function tokenURI(uint256 _tokenId) public view override returns (string memory) {
        return string(abi.encodePacked(_baseTokenURI, Strings.toString(_tokenId)));
    }

    function setBaseTokenURI(string memory __baseTokenURI) public onlyOwner {
        _baseTokenURI = __baseTokenURI;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Unwrapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Wrapped","type":"event"},{"inputs":[],"name":"_baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_waifuAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"__baseTokenURI","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"unwrap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"wrap","outputs":[],"stateMutability":"payable","type":"function"}]

60806040527336697e362ee7e9ca977b7550b3e4f955fc5bf27d600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280600e81526020017f57726170706564205761696675730000000000000000000000000000000000008152506040518060400160405280600481526020017f57574655000000000000000000000000000000000000000000000000000000008152506000620000d7620001af60201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35081600190805190602001906200018d929190620001b7565b508060029080519060200190620001a6929190620001b7565b505050620002cc565b600033905090565b828054620001c59062000267565b90600052602060002090601f016020900481019282620001e9576000855562000235565b82601f106200020457805160ff191683800117855562000235565b8280016001018555821562000235579182015b828111156200023457825182559160200191906001019062000217565b5b50905062000244919062000248565b5090565b5b808211156200026357600081600090555060010162000249565b5090565b600060028204905060018216806200028057607f821691505b602082108114156200029757620002966200029d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61320c80620002dc6000396000f3fe60806040526004361061012a5760003560e01c80638da5cb5b116100ab578063c87b56dd1161006f578063c87b56dd146103dc578063cfc86f7b14610419578063de0e9a3e14610444578063e985e9c51461046d578063ea598cb0146104aa578063f2fde38b146104c65761012a565b80638da5cb5b1461030957806395d89b4114610334578063a22cb4651461035f578063b88d4fde14610388578063b94eaf6a146103b15761012a565b806330176e13116100f257806330176e131461022657806342842e0e1461024f5780636352211e1461027857806370a08231146102b5578063715018a6146102f25761012a565b806301ffc9a71461012f57806306fdde031461016c578063081812fc14610197578063095ea7b3146101d457806323b872dd146101fd575b600080fd5b34801561013b57600080fd5b506101566004803603810190610151919061223c565b6104ef565b604051610163919061273f565b60405180910390f35b34801561017857600080fd5b506101816105d1565b60405161018e919061275a565b60405180910390f35b3480156101a357600080fd5b506101be60048036038101906101b991906122cf565b610663565b6040516101cb9190612678565b60405180910390f35b3480156101e057600080fd5b506101fb60048036038101906101f69190612200565b6106e8565b005b34801561020957600080fd5b50610224600480360381019061021f91906120fa565b610800565b005b34801561023257600080fd5b5061024d6004803603810190610248919061228e565b610860565b005b34801561025b57600080fd5b50610276600480360381019061027191906120fa565b6108f6565b005b34801561028457600080fd5b5061029f600480360381019061029a91906122cf565b610916565b6040516102ac9190612678565b60405180910390f35b3480156102c157600080fd5b506102dc60048036038101906102d79190612095565b6109c8565b6040516102e9919061295c565b60405180910390f35b3480156102fe57600080fd5b50610307610a80565b005b34801561031557600080fd5b5061031e610bba565b60405161032b9190612678565b60405180910390f35b34801561034057600080fd5b50610349610be3565b604051610356919061275a565b60405180910390f35b34801561036b57600080fd5b50610386600480360381019061038191906121c4565b610c75565b005b34801561039457600080fd5b506103af60048036038101906103aa9190612149565b610df6565b005b3480156103bd57600080fd5b506103c6610e58565b6040516103d39190612678565b60405180910390f35b3480156103e857600080fd5b5061040360048036038101906103fe91906122cf565b610e7e565b604051610410919061275a565b60405180910390f35b34801561042557600080fd5b5061042e610eb2565b60405161043b919061275a565b60405180910390f35b34801561045057600080fd5b5061046b600480360381019061046691906122cf565b610f40565b005b34801561047957600080fd5b50610494600480360381019061048f91906120be565b611032565b6040516104a1919061273f565b60405180910390f35b6104c460048036038101906104bf91906122cf565b6110c6565b005b3480156104d257600080fd5b506104ed60048036038101906104e89190612095565b6111a8565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105ba57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105ca57506105c982611351565b5b9050919050565b6060600180546105e090612bc7565b80601f016020809104026020016040519081016040528092919081815260200182805461060c90612bc7565b80156106595780601f1061062e57610100808354040283529160200191610659565b820191906000526020600020905b81548152906001019060200180831161063c57829003601f168201915b5050505050905090565b600061066e826113bb565b6106ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a4906128bc565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106f382610916565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610764576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075b9061291c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610783611427565b73ffffffffffffffffffffffffffffffffffffffff1614806107b257506107b1816107ac611427565b611032565b5b6107f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e89061283c565b60405180910390fd5b6107fb838361142f565b505050565b61081161080b611427565b826114e8565b610850576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108479061293c565b60405180910390fd5b61085b8383836115c6565b505050565b610868611427565b73ffffffffffffffffffffffffffffffffffffffff16610886610bba565b73ffffffffffffffffffffffffffffffffffffffff16146108dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d3906128dc565b60405180910390fd5b80600890805190602001906108f2929190611eb9565b5050565b61091183838360405180602001604052806000815250610df6565b505050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156109bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b69061287c565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a309061285c565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a88611427565b73ffffffffffffffffffffffffffffffffffffffff16610aa6610bba565b73ffffffffffffffffffffffffffffffffffffffff1614610afc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af3906128dc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054610bf290612bc7565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1e90612bc7565b8015610c6b5780601f10610c4057610100808354040283529160200191610c6b565b820191906000526020600020905b815481529060010190602001808311610c4e57829003601f168201915b5050505050905090565b610c7d611427565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce2906127fc565b60405180910390fd5b8060066000610cf8611427565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610da5611427565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610dea919061273f565b60405180910390a35050565b610e07610e01611427565b836114e8565b610e46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3d9061293c565b60405180910390fd5b610e5284848484611822565b50505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606008610e8b8361187e565b604051602001610e9c929190612654565b6040516020818303038152906040529050919050565b60088054610ebf90612bc7565b80601f0160208091040260200160405190810160405280929190818152602001828054610eeb90612bc7565b8015610f385780601f10610f0d57610100808354040283529160200191610f38565b820191906000526020600020905b815481529060010190602001808311610f1b57829003601f168201915b505050505081565b610f4a33826114e8565b610f5357600080fd5b610f5c81611a2b565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610fb9929190612716565b600060405180830381600087803b158015610fd357600080fd5b505af1158015610fe7573d6000803e3d6000fd5b50505050803373ffffffffffffffffffffffffffffffffffffffff167f95ae649bfaaef9def56a52f4fb2d9e8fa5496bb7082930e442c74cc76b03dcb360405160405180910390a350565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b815260040161112593929190612693565b600060405180830381600087803b15801561113f57600080fd5b505af1158015611153573d6000803e3d6000fd5b505050506111613382611b3c565b803373ffffffffffffffffffffffffffffffffffffffff167f4700c1726b4198077cd40320a32c45265a1910521eb0ef713dd1d8412413d7fc60405160405180910390a350565b6111b0611427565b73ffffffffffffffffffffffffffffffffffffffff166111ce610bba565b73ffffffffffffffffffffffffffffffffffffffff1614611224576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121b906128dc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128b9061279c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166114a283610916565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006114f3826113bb565b611532576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115299061281c565b60405180910390fd5b600061153d83610916565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806115ac57508373ffffffffffffffffffffffffffffffffffffffff1661159484610663565b73ffffffffffffffffffffffffffffffffffffffff16145b806115bd57506115bc8185611032565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166115e682610916565b73ffffffffffffffffffffffffffffffffffffffff161461163c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611633906128fc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a3906127dc565b60405180910390fd5b6116b7838383611d0a565b6116c260008261142f565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117129190612add565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117699190612a56565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61182d8484846115c6565b61183984848484611d0f565b611878576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186f9061277c565b60405180910390fd5b50505050565b606060008214156118c6576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611a26565b600082905060005b600082146118f85780806118e190612c2a565b915050600a826118f19190612aac565b91506118ce565b60008167ffffffffffffffff81111561193a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561196c5781602001600182028036833780820191505090505b5090505b60008514611a1f576001826119859190612add565b9150600a856119949190612c73565b60306119a09190612a56565b60f81b8183815181106119dc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611a189190612aac565b9450611970565b8093505050505b919050565b6000611a3682610916565b9050611a4481600084611d0a565b611a4f60008361142f565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a9f9190612add565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba39061289c565b60405180910390fd5b611bb5816113bb565b15611bf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bec906127bc565b60405180910390fd5b611c0160008383611d0a565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c519190612a56565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6000611d308473ffffffffffffffffffffffffffffffffffffffff16611ea6565b15611e99578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611d59611427565b8786866040518563ffffffff1660e01b8152600401611d7b94939291906126ca565b602060405180830381600087803b158015611d9557600080fd5b505af1925050508015611dc657506040513d601f19601f82011682018060405250810190611dc39190612265565b60015b611e49573d8060008114611df6576040519150601f19603f3d011682016040523d82523d6000602084013e611dfb565b606091505b50600081511415611e41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e389061277c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611e9e565b600190505b949350505050565b600080823b905060008111915050919050565b828054611ec590612bc7565b90600052602060002090601f016020900481019282611ee75760008555611f2e565b82601f10611f0057805160ff1916838001178555611f2e565b82800160010185558215611f2e579182015b82811115611f2d578251825591602001919060010190611f12565b5b509050611f3b9190611f3f565b5090565b5b80821115611f58576000816000905550600101611f40565b5090565b6000611f6f611f6a8461299c565b612977565b905082815260208101848484011115611f8757600080fd5b611f92848285612b85565b509392505050565b6000611fad611fa8846129cd565b612977565b905082815260208101848484011115611fc557600080fd5b611fd0848285612b85565b509392505050565b600081359050611fe78161317a565b92915050565b600081359050611ffc81613191565b92915050565b600081359050612011816131a8565b92915050565b600081519050612026816131a8565b92915050565b600082601f83011261203d57600080fd5b813561204d848260208601611f5c565b91505092915050565b600082601f83011261206757600080fd5b8135612077848260208601611f9a565b91505092915050565b60008135905061208f816131bf565b92915050565b6000602082840312156120a757600080fd5b60006120b584828501611fd8565b91505092915050565b600080604083850312156120d157600080fd5b60006120df85828601611fd8565b92505060206120f085828601611fd8565b9150509250929050565b60008060006060848603121561210f57600080fd5b600061211d86828701611fd8565b935050602061212e86828701611fd8565b925050604061213f86828701612080565b9150509250925092565b6000806000806080858703121561215f57600080fd5b600061216d87828801611fd8565b945050602061217e87828801611fd8565b935050604061218f87828801612080565b925050606085013567ffffffffffffffff8111156121ac57600080fd5b6121b88782880161202c565b91505092959194509250565b600080604083850312156121d757600080fd5b60006121e585828601611fd8565b92505060206121f685828601611fed565b9150509250929050565b6000806040838503121561221357600080fd5b600061222185828601611fd8565b925050602061223285828601612080565b9150509250929050565b60006020828403121561224e57600080fd5b600061225c84828501612002565b91505092915050565b60006020828403121561227757600080fd5b600061228584828501612017565b91505092915050565b6000602082840312156122a057600080fd5b600082013567ffffffffffffffff8111156122ba57600080fd5b6122c684828501612056565b91505092915050565b6000602082840312156122e157600080fd5b60006122ef84828501612080565b91505092915050565b61230181612b11565b82525050565b61231081612b23565b82525050565b600061232182612a13565b61232b8185612a29565b935061233b818560208601612b94565b61234481612d60565b840191505092915050565b600061235a82612a1e565b6123648185612a3a565b9350612374818560208601612b94565b61237d81612d60565b840191505092915050565b600061239382612a1e565b61239d8185612a4b565b93506123ad818560208601612b94565b80840191505092915050565b600081546123c681612bc7565b6123d08186612a4b565b945060018216600081146123eb57600181146123fc5761242f565b60ff1983168652818601935061242f565b612405856129fe565b60005b8381101561242757815481890152600182019150602081019050612408565b838801955050505b50505092915050565b6000612445603283612a3a565b915061245082612d71565b604082019050919050565b6000612468602683612a3a565b915061247382612dc0565b604082019050919050565b600061248b601c83612a3a565b915061249682612e0f565b602082019050919050565b60006124ae602483612a3a565b91506124b982612e38565b604082019050919050565b60006124d1601983612a3a565b91506124dc82612e87565b602082019050919050565b60006124f4602c83612a3a565b91506124ff82612eb0565b604082019050919050565b6000612517603883612a3a565b915061252282612eff565b604082019050919050565b600061253a602a83612a3a565b915061254582612f4e565b604082019050919050565b600061255d602983612a3a565b915061256882612f9d565b604082019050919050565b6000612580602083612a3a565b915061258b82612fec565b602082019050919050565b60006125a3602c83612a3a565b91506125ae82613015565b604082019050919050565b60006125c6602083612a3a565b91506125d182613064565b602082019050919050565b60006125e9602983612a3a565b91506125f48261308d565b604082019050919050565b600061260c602183612a3a565b9150612617826130dc565b604082019050919050565b600061262f603183612a3a565b915061263a8261312b565b604082019050919050565b61264e81612b7b565b82525050565b600061266082856123b9565b915061266c8284612388565b91508190509392505050565b600060208201905061268d60008301846122f8565b92915050565b60006060820190506126a860008301866122f8565b6126b560208301856122f8565b6126c26040830184612645565b949350505050565b60006080820190506126df60008301876122f8565b6126ec60208301866122f8565b6126f96040830185612645565b818103606083015261270b8184612316565b905095945050505050565b600060408201905061272b60008301856122f8565b6127386020830184612645565b9392505050565b60006020820190506127546000830184612307565b92915050565b60006020820190508181036000830152612774818461234f565b905092915050565b6000602082019050818103600083015261279581612438565b9050919050565b600060208201905081810360008301526127b58161245b565b9050919050565b600060208201905081810360008301526127d58161247e565b9050919050565b600060208201905081810360008301526127f5816124a1565b9050919050565b60006020820190508181036000830152612815816124c4565b9050919050565b60006020820190508181036000830152612835816124e7565b9050919050565b600060208201905081810360008301526128558161250a565b9050919050565b600060208201905081810360008301526128758161252d565b9050919050565b6000602082019050818103600083015261289581612550565b9050919050565b600060208201905081810360008301526128b581612573565b9050919050565b600060208201905081810360008301526128d581612596565b9050919050565b600060208201905081810360008301526128f5816125b9565b9050919050565b60006020820190508181036000830152612915816125dc565b9050919050565b60006020820190508181036000830152612935816125ff565b9050919050565b6000602082019050818103600083015261295581612622565b9050919050565b60006020820190506129716000830184612645565b92915050565b6000612981612992565b905061298d8282612bf9565b919050565b6000604051905090565b600067ffffffffffffffff8211156129b7576129b6612d31565b5b6129c082612d60565b9050602081019050919050565b600067ffffffffffffffff8211156129e8576129e7612d31565b5b6129f182612d60565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612a6182612b7b565b9150612a6c83612b7b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612aa157612aa0612ca4565b5b828201905092915050565b6000612ab782612b7b565b9150612ac283612b7b565b925082612ad257612ad1612cd3565b5b828204905092915050565b6000612ae882612b7b565b9150612af383612b7b565b925082821015612b0657612b05612ca4565b5b828203905092915050565b6000612b1c82612b5b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612bb2578082015181840152602081019050612b97565b83811115612bc1576000848401525b50505050565b60006002820490506001821680612bdf57607f821691505b60208210811415612bf357612bf2612d02565b5b50919050565b612c0282612d60565b810181811067ffffffffffffffff82111715612c2157612c20612d31565b5b80604052505050565b6000612c3582612b7b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612c6857612c67612ca4565b5b600182019050919050565b6000612c7e82612b7b565b9150612c8983612b7b565b925082612c9957612c98612cd3565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b61318381612b11565b811461318e57600080fd5b50565b61319a81612b23565b81146131a557600080fd5b50565b6131b181612b2f565b81146131bc57600080fd5b50565b6131c881612b7b565b81146131d357600080fd5b5056fea26469706673582212200984721d533f95bf8ee9dd3a3938dcc61bd49f1408e1685e30eb310e292c6ae564736f6c63430008030033

Deployed Bytecode

0x60806040526004361061012a5760003560e01c80638da5cb5b116100ab578063c87b56dd1161006f578063c87b56dd146103dc578063cfc86f7b14610419578063de0e9a3e14610444578063e985e9c51461046d578063ea598cb0146104aa578063f2fde38b146104c65761012a565b80638da5cb5b1461030957806395d89b4114610334578063a22cb4651461035f578063b88d4fde14610388578063b94eaf6a146103b15761012a565b806330176e13116100f257806330176e131461022657806342842e0e1461024f5780636352211e1461027857806370a08231146102b5578063715018a6146102f25761012a565b806301ffc9a71461012f57806306fdde031461016c578063081812fc14610197578063095ea7b3146101d457806323b872dd146101fd575b600080fd5b34801561013b57600080fd5b506101566004803603810190610151919061223c565b6104ef565b604051610163919061273f565b60405180910390f35b34801561017857600080fd5b506101816105d1565b60405161018e919061275a565b60405180910390f35b3480156101a357600080fd5b506101be60048036038101906101b991906122cf565b610663565b6040516101cb9190612678565b60405180910390f35b3480156101e057600080fd5b506101fb60048036038101906101f69190612200565b6106e8565b005b34801561020957600080fd5b50610224600480360381019061021f91906120fa565b610800565b005b34801561023257600080fd5b5061024d6004803603810190610248919061228e565b610860565b005b34801561025b57600080fd5b50610276600480360381019061027191906120fa565b6108f6565b005b34801561028457600080fd5b5061029f600480360381019061029a91906122cf565b610916565b6040516102ac9190612678565b60405180910390f35b3480156102c157600080fd5b506102dc60048036038101906102d79190612095565b6109c8565b6040516102e9919061295c565b60405180910390f35b3480156102fe57600080fd5b50610307610a80565b005b34801561031557600080fd5b5061031e610bba565b60405161032b9190612678565b60405180910390f35b34801561034057600080fd5b50610349610be3565b604051610356919061275a565b60405180910390f35b34801561036b57600080fd5b50610386600480360381019061038191906121c4565b610c75565b005b34801561039457600080fd5b506103af60048036038101906103aa9190612149565b610df6565b005b3480156103bd57600080fd5b506103c6610e58565b6040516103d39190612678565b60405180910390f35b3480156103e857600080fd5b5061040360048036038101906103fe91906122cf565b610e7e565b604051610410919061275a565b60405180910390f35b34801561042557600080fd5b5061042e610eb2565b60405161043b919061275a565b60405180910390f35b34801561045057600080fd5b5061046b600480360381019061046691906122cf565b610f40565b005b34801561047957600080fd5b50610494600480360381019061048f91906120be565b611032565b6040516104a1919061273f565b60405180910390f35b6104c460048036038101906104bf91906122cf565b6110c6565b005b3480156104d257600080fd5b506104ed60048036038101906104e89190612095565b6111a8565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105ba57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105ca57506105c982611351565b5b9050919050565b6060600180546105e090612bc7565b80601f016020809104026020016040519081016040528092919081815260200182805461060c90612bc7565b80156106595780601f1061062e57610100808354040283529160200191610659565b820191906000526020600020905b81548152906001019060200180831161063c57829003601f168201915b5050505050905090565b600061066e826113bb565b6106ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a4906128bc565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106f382610916565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610764576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075b9061291c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610783611427565b73ffffffffffffffffffffffffffffffffffffffff1614806107b257506107b1816107ac611427565b611032565b5b6107f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e89061283c565b60405180910390fd5b6107fb838361142f565b505050565b61081161080b611427565b826114e8565b610850576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108479061293c565b60405180910390fd5b61085b8383836115c6565b505050565b610868611427565b73ffffffffffffffffffffffffffffffffffffffff16610886610bba565b73ffffffffffffffffffffffffffffffffffffffff16146108dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d3906128dc565b60405180910390fd5b80600890805190602001906108f2929190611eb9565b5050565b61091183838360405180602001604052806000815250610df6565b505050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156109bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b69061287c565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a309061285c565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a88611427565b73ffffffffffffffffffffffffffffffffffffffff16610aa6610bba565b73ffffffffffffffffffffffffffffffffffffffff1614610afc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af3906128dc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054610bf290612bc7565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1e90612bc7565b8015610c6b5780601f10610c4057610100808354040283529160200191610c6b565b820191906000526020600020905b815481529060010190602001808311610c4e57829003601f168201915b5050505050905090565b610c7d611427565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce2906127fc565b60405180910390fd5b8060066000610cf8611427565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610da5611427565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610dea919061273f565b60405180910390a35050565b610e07610e01611427565b836114e8565b610e46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3d9061293c565b60405180910390fd5b610e5284848484611822565b50505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606008610e8b8361187e565b604051602001610e9c929190612654565b6040516020818303038152906040529050919050565b60088054610ebf90612bc7565b80601f0160208091040260200160405190810160405280929190818152602001828054610eeb90612bc7565b8015610f385780601f10610f0d57610100808354040283529160200191610f38565b820191906000526020600020905b815481529060010190602001808311610f1b57829003601f168201915b505050505081565b610f4a33826114e8565b610f5357600080fd5b610f5c81611a2b565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610fb9929190612716565b600060405180830381600087803b158015610fd357600080fd5b505af1158015610fe7573d6000803e3d6000fd5b50505050803373ffffffffffffffffffffffffffffffffffffffff167f95ae649bfaaef9def56a52f4fb2d9e8fa5496bb7082930e442c74cc76b03dcb360405160405180910390a350565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b815260040161112593929190612693565b600060405180830381600087803b15801561113f57600080fd5b505af1158015611153573d6000803e3d6000fd5b505050506111613382611b3c565b803373ffffffffffffffffffffffffffffffffffffffff167f4700c1726b4198077cd40320a32c45265a1910521eb0ef713dd1d8412413d7fc60405160405180910390a350565b6111b0611427565b73ffffffffffffffffffffffffffffffffffffffff166111ce610bba565b73ffffffffffffffffffffffffffffffffffffffff1614611224576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121b906128dc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128b9061279c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166114a283610916565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006114f3826113bb565b611532576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115299061281c565b60405180910390fd5b600061153d83610916565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806115ac57508373ffffffffffffffffffffffffffffffffffffffff1661159484610663565b73ffffffffffffffffffffffffffffffffffffffff16145b806115bd57506115bc8185611032565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166115e682610916565b73ffffffffffffffffffffffffffffffffffffffff161461163c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611633906128fc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a3906127dc565b60405180910390fd5b6116b7838383611d0a565b6116c260008261142f565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117129190612add565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117699190612a56565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61182d8484846115c6565b61183984848484611d0f565b611878576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186f9061277c565b60405180910390fd5b50505050565b606060008214156118c6576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611a26565b600082905060005b600082146118f85780806118e190612c2a565b915050600a826118f19190612aac565b91506118ce565b60008167ffffffffffffffff81111561193a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561196c5781602001600182028036833780820191505090505b5090505b60008514611a1f576001826119859190612add565b9150600a856119949190612c73565b60306119a09190612a56565b60f81b8183815181106119dc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611a189190612aac565b9450611970565b8093505050505b919050565b6000611a3682610916565b9050611a4481600084611d0a565b611a4f60008361142f565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a9f9190612add565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba39061289c565b60405180910390fd5b611bb5816113bb565b15611bf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bec906127bc565b60405180910390fd5b611c0160008383611d0a565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c519190612a56565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6000611d308473ffffffffffffffffffffffffffffffffffffffff16611ea6565b15611e99578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611d59611427565b8786866040518563ffffffff1660e01b8152600401611d7b94939291906126ca565b602060405180830381600087803b158015611d9557600080fd5b505af1925050508015611dc657506040513d601f19601f82011682018060405250810190611dc39190612265565b60015b611e49573d8060008114611df6576040519150601f19603f3d011682016040523d82523d6000602084013e611dfb565b606091505b50600081511415611e41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e389061277c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611e9e565b600190505b949350505050565b600080823b905060008111915050919050565b828054611ec590612bc7565b90600052602060002090601f016020900481019282611ee75760008555611f2e565b82601f10611f0057805160ff1916838001178555611f2e565b82800160010185558215611f2e579182015b82811115611f2d578251825591602001919060010190611f12565b5b509050611f3b9190611f3f565b5090565b5b80821115611f58576000816000905550600101611f40565b5090565b6000611f6f611f6a8461299c565b612977565b905082815260208101848484011115611f8757600080fd5b611f92848285612b85565b509392505050565b6000611fad611fa8846129cd565b612977565b905082815260208101848484011115611fc557600080fd5b611fd0848285612b85565b509392505050565b600081359050611fe78161317a565b92915050565b600081359050611ffc81613191565b92915050565b600081359050612011816131a8565b92915050565b600081519050612026816131a8565b92915050565b600082601f83011261203d57600080fd5b813561204d848260208601611f5c565b91505092915050565b600082601f83011261206757600080fd5b8135612077848260208601611f9a565b91505092915050565b60008135905061208f816131bf565b92915050565b6000602082840312156120a757600080fd5b60006120b584828501611fd8565b91505092915050565b600080604083850312156120d157600080fd5b60006120df85828601611fd8565b92505060206120f085828601611fd8565b9150509250929050565b60008060006060848603121561210f57600080fd5b600061211d86828701611fd8565b935050602061212e86828701611fd8565b925050604061213f86828701612080565b9150509250925092565b6000806000806080858703121561215f57600080fd5b600061216d87828801611fd8565b945050602061217e87828801611fd8565b935050604061218f87828801612080565b925050606085013567ffffffffffffffff8111156121ac57600080fd5b6121b88782880161202c565b91505092959194509250565b600080604083850312156121d757600080fd5b60006121e585828601611fd8565b92505060206121f685828601611fed565b9150509250929050565b6000806040838503121561221357600080fd5b600061222185828601611fd8565b925050602061223285828601612080565b9150509250929050565b60006020828403121561224e57600080fd5b600061225c84828501612002565b91505092915050565b60006020828403121561227757600080fd5b600061228584828501612017565b91505092915050565b6000602082840312156122a057600080fd5b600082013567ffffffffffffffff8111156122ba57600080fd5b6122c684828501612056565b91505092915050565b6000602082840312156122e157600080fd5b60006122ef84828501612080565b91505092915050565b61230181612b11565b82525050565b61231081612b23565b82525050565b600061232182612a13565b61232b8185612a29565b935061233b818560208601612b94565b61234481612d60565b840191505092915050565b600061235a82612a1e565b6123648185612a3a565b9350612374818560208601612b94565b61237d81612d60565b840191505092915050565b600061239382612a1e565b61239d8185612a4b565b93506123ad818560208601612b94565b80840191505092915050565b600081546123c681612bc7565b6123d08186612a4b565b945060018216600081146123eb57600181146123fc5761242f565b60ff1983168652818601935061242f565b612405856129fe565b60005b8381101561242757815481890152600182019150602081019050612408565b838801955050505b50505092915050565b6000612445603283612a3a565b915061245082612d71565b604082019050919050565b6000612468602683612a3a565b915061247382612dc0565b604082019050919050565b600061248b601c83612a3a565b915061249682612e0f565b602082019050919050565b60006124ae602483612a3a565b91506124b982612e38565b604082019050919050565b60006124d1601983612a3a565b91506124dc82612e87565b602082019050919050565b60006124f4602c83612a3a565b91506124ff82612eb0565b604082019050919050565b6000612517603883612a3a565b915061252282612eff565b604082019050919050565b600061253a602a83612a3a565b915061254582612f4e565b604082019050919050565b600061255d602983612a3a565b915061256882612f9d565b604082019050919050565b6000612580602083612a3a565b915061258b82612fec565b602082019050919050565b60006125a3602c83612a3a565b91506125ae82613015565b604082019050919050565b60006125c6602083612a3a565b91506125d182613064565b602082019050919050565b60006125e9602983612a3a565b91506125f48261308d565b604082019050919050565b600061260c602183612a3a565b9150612617826130dc565b604082019050919050565b600061262f603183612a3a565b915061263a8261312b565b604082019050919050565b61264e81612b7b565b82525050565b600061266082856123b9565b915061266c8284612388565b91508190509392505050565b600060208201905061268d60008301846122f8565b92915050565b60006060820190506126a860008301866122f8565b6126b560208301856122f8565b6126c26040830184612645565b949350505050565b60006080820190506126df60008301876122f8565b6126ec60208301866122f8565b6126f96040830185612645565b818103606083015261270b8184612316565b905095945050505050565b600060408201905061272b60008301856122f8565b6127386020830184612645565b9392505050565b60006020820190506127546000830184612307565b92915050565b60006020820190508181036000830152612774818461234f565b905092915050565b6000602082019050818103600083015261279581612438565b9050919050565b600060208201905081810360008301526127b58161245b565b9050919050565b600060208201905081810360008301526127d58161247e565b9050919050565b600060208201905081810360008301526127f5816124a1565b9050919050565b60006020820190508181036000830152612815816124c4565b9050919050565b60006020820190508181036000830152612835816124e7565b9050919050565b600060208201905081810360008301526128558161250a565b9050919050565b600060208201905081810360008301526128758161252d565b9050919050565b6000602082019050818103600083015261289581612550565b9050919050565b600060208201905081810360008301526128b581612573565b9050919050565b600060208201905081810360008301526128d581612596565b9050919050565b600060208201905081810360008301526128f5816125b9565b9050919050565b60006020820190508181036000830152612915816125dc565b9050919050565b60006020820190508181036000830152612935816125ff565b9050919050565b6000602082019050818103600083015261295581612622565b9050919050565b60006020820190506129716000830184612645565b92915050565b6000612981612992565b905061298d8282612bf9565b919050565b6000604051905090565b600067ffffffffffffffff8211156129b7576129b6612d31565b5b6129c082612d60565b9050602081019050919050565b600067ffffffffffffffff8211156129e8576129e7612d31565b5b6129f182612d60565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612a6182612b7b565b9150612a6c83612b7b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612aa157612aa0612ca4565b5b828201905092915050565b6000612ab782612b7b565b9150612ac283612b7b565b925082612ad257612ad1612cd3565b5b828204905092915050565b6000612ae882612b7b565b9150612af383612b7b565b925082821015612b0657612b05612ca4565b5b828203905092915050565b6000612b1c82612b5b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612bb2578082015181840152602081019050612b97565b83811115612bc1576000848401525b50505050565b60006002820490506001821680612bdf57607f821691505b60208210811415612bf357612bf2612d02565b5b50919050565b612c0282612d60565b810181811067ffffffffffffffff82111715612c2157612c20612d31565b5b80604052505050565b6000612c3582612b7b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612c6857612c67612ca4565b5b600182019050919050565b6000612c7e82612b7b565b9150612c8983612b7b565b925082612c9957612c98612cd3565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b61318381612b11565b811461318e57600080fd5b50565b61319a81612b23565b81146131a557600080fd5b50565b6131b181612b2f565b81146131bc57600080fd5b50565b6131c881612b7b565b81146131d357600080fd5b5056fea26469706673582212200984721d533f95bf8ee9dd3a3938dcc61bd49f1408e1685e30eb310e292c6ae564736f6c63430008030033

Deployed Bytecode Sourcemap

36652:1453:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21561:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22493:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23960:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23490:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24850:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37981:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25226:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22187:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21917:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35124:148;;;;;;;;;;;;;:::i;:::-;;34473:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22662:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24253:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25448:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36838:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37799:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36918:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37467:247;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24619:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37134:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35427:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21561:292;21663:4;21702:25;21687:40;;;:11;:40;;;;:105;;;;21759:33;21744:48;;;:11;:48;;;;21687:105;:158;;;;21809:36;21833:11;21809:23;:36::i;:::-;21687:158;21680:165;;21561:292;;;:::o;22493:100::-;22547:13;22580:5;22573:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22493:100;:::o;23960:221::-;24036:7;24064:16;24072:7;24064;:16::i;:::-;24056:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24149:15;:24;24165:7;24149:24;;;;;;;;;;;;;;;;;;;;;24142:31;;23960:221;;;:::o;23490:404::-;23571:13;23587:23;23602:7;23587:14;:23::i;:::-;23571:39;;23635:5;23629:11;;:2;:11;;;;23621:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23715:5;23699:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;23724:44;23748:5;23755:12;:10;:12::i;:::-;23724:23;:44::i;:::-;23699:69;23691:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;23865:21;23874:2;23878:7;23865:8;:21::i;:::-;23490:404;;;:::o;24850:305::-;25011:41;25030:12;:10;:12::i;:::-;25044:7;25011:18;:41::i;:::-;25003:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25119:28;25129:4;25135:2;25139:7;25119:9;:28::i;:::-;24850:305;;;:::o;37981:121::-;34704:12;:10;:12::i;:::-;34693:23;;:7;:5;:7::i;:::-;:23;;;34685:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38080:14:::1;38064:13;:30;;;;;;;;;;;;:::i;:::-;;37981:121:::0;:::o;25226:151::-;25330:39;25347:4;25353:2;25357:7;25330:39;;;;;;;;;;;;:16;:39::i;:::-;25226:151;;;:::o;22187:239::-;22259:7;22279:13;22295:7;:16;22303:7;22295:16;;;;;;;;;;;;;;;;;;;;;22279:32;;22347:1;22330:19;;:5;:19;;;;22322:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22413:5;22406:12;;;22187:239;;;:::o;21917:208::-;21989:7;22034:1;22017:19;;:5;:19;;;;22009:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;22101:9;:16;22111:5;22101:16;;;;;;;;;;;;;;;;22094:23;;21917:208;;;:::o;35124:148::-;34704:12;:10;:12::i;:::-;34693:23;;:7;:5;:7::i;:::-;:23;;;34685:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35231:1:::1;35194:40;;35215:6;::::0;::::1;;;;;;;;35194:40;;;;;;;;;;;;35262:1;35245:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;35124:148::o:0;34473:87::-;34519:7;34546:6;;;;;;;;;;;34539:13;;34473:87;:::o;22662:104::-;22718:13;22751:7;22744:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22662:104;:::o;24253:295::-;24368:12;:10;:12::i;:::-;24356:24;;:8;:24;;;;24348:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;24468:8;24423:18;:32;24442:12;:10;:12::i;:::-;24423:32;;;;;;;;;;;;;;;:42;24456:8;24423:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;24521:8;24492:48;;24507:12;:10;:12::i;:::-;24492:48;;;24531:8;24492:48;;;;;;:::i;:::-;;;;;;;;24253:295;;:::o;25448:285::-;25580:41;25599:12;:10;:12::i;:::-;25613:7;25580:18;:41::i;:::-;25572:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25686:39;25700:4;25706:2;25710:7;25719:5;25686:13;:39::i;:::-;25448:285;;;;:::o;36838:73::-;;;;;;;;;;;;;:::o;37799:174::-;37865:13;37922;37937:26;37954:8;37937:16;:26::i;:::-;37905:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37891:74;;37799:174;;;:::o;36918:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37467:247::-;37527:40;37546:10;37558:8;37527:18;:40::i;:::-;37519:49;;;;;;37579:15;37585:8;37579:5;:15::i;:::-;37619:13;;;;;;;;;;;37605:37;;;37643:10;37655:8;37605:59;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37697:8;37685:10;37675:31;;;;;;;;;;;;37467:247;:::o;24619:164::-;24716:4;24740:18;:25;24759:5;24740:25;;;;;;;;;;;;;;;:35;24766:8;24740:35;;;;;;;;;;;;;;;;;;;;;;;;;24733:42;;24619:164;;;;:::o;37134:221::-;37205:13;;;;;;;;;;;37191:41;;;37233:10;37253:4;37260:8;37191:78;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37280:27;37286:10;37298:8;37280:5;:27::i;:::-;37338:8;37326:10;37318:29;;;;;;;;;;;;37134:221;:::o;35427:244::-;34704:12;:10;:12::i;:::-;34693:23;;:7;:5;:7::i;:::-;:23;;;34685:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35536:1:::1;35516:22;;:8;:22;;;;35508:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35626:8;35597:38;;35618:6;::::0;::::1;;;;;;;;35597:38;;;;;;;;;;;;35655:8;35646:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;35427:244:::0;:::o;20057:157::-;20142:4;20181:25;20166:40;;;:11;:40;;;;20159:47;;20057:157;;;:::o;27200:127::-;27265:4;27317:1;27289:30;;:7;:16;27297:7;27289:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27282:37;;27200:127;;;:::o;16847:98::-;16900:7;16927:10;16920:17;;16847:98;:::o;31084:174::-;31186:2;31159:15;:24;31175:7;31159:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31242:7;31238:2;31204:46;;31213:23;31228:7;31213:14;:23::i;:::-;31204:46;;;;;;;;;;;;31084:174;;:::o;27494:355::-;27587:4;27612:16;27620:7;27612;:16::i;:::-;27604:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27688:13;27704:23;27719:7;27704:14;:23::i;:::-;27688:39;;27757:5;27746:16;;:7;:16;;;:51;;;;27790:7;27766:31;;:20;27778:7;27766:11;:20::i;:::-;:31;;;27746:51;:94;;;;27801:39;27825:5;27832:7;27801:23;:39::i;:::-;27746:94;27738:103;;;27494:355;;;;:::o;30422:544::-;30547:4;30520:31;;:23;30535:7;30520:14;:23::i;:::-;:31;;;30512:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30630:1;30616:16;;:2;:16;;;;30608:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30686:39;30707:4;30713:2;30717:7;30686:20;:39::i;:::-;30790:29;30807:1;30811:7;30790:8;:29::i;:::-;30851:1;30832:9;:15;30842:4;30832:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30880:1;30863:9;:13;30873:2;30863:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30911:2;30892:7;:16;30900:7;30892:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30950:7;30946:2;30931:27;;30940:4;30931:27;;;;;;;;;;;;30422:544;;;:::o;26615:272::-;26729:28;26739:4;26745:2;26749:7;26729:9;:28::i;:::-;26776:48;26799:4;26805:2;26809:7;26818:5;26776:22;:48::i;:::-;26768:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26615:272;;;;:::o;17502:723::-;17558:13;17788:1;17779:5;:10;17775:53;;;17806:10;;;;;;;;;;;;;;;;;;;;;17775:53;17838:12;17853:5;17838:20;;17869:14;17894:78;17909:1;17901:4;:9;17894:78;;17927:8;;;;;:::i;:::-;;;;17958:2;17950:10;;;;;:::i;:::-;;;17894:78;;;17982:19;18014:6;18004:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17982:39;;18032:154;18048:1;18039:5;:10;18032:154;;18076:1;18066:11;;;;;:::i;:::-;;;18143:2;18135:5;:10;;;;:::i;:::-;18122:2;:24;;;;:::i;:::-;18109:39;;18092:6;18099;18092:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;18172:2;18163:11;;;;;:::i;:::-;;;18032:154;;;18210:6;18196:21;;;;;17502:723;;;;:::o;29725:360::-;29785:13;29801:23;29816:7;29801:14;:23::i;:::-;29785:39;;29837:48;29858:5;29873:1;29877:7;29837:20;:48::i;:::-;29926:29;29943:1;29947:7;29926:8;:29::i;:::-;29988:1;29968:9;:16;29978:5;29968:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;30007:7;:16;30015:7;30007:16;;;;;;;;;;;;30000:23;;;;;;;;;;;30069:7;30065:1;30041:36;;30050:5;30041:36;;;;;;;;;;;;29725:360;;:::o;29114:382::-;29208:1;29194:16;;:2;:16;;;;29186:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29267:16;29275:7;29267;:16::i;:::-;29266:17;29258:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29329:45;29358:1;29362:2;29366:7;29329:20;:45::i;:::-;29404:1;29387:9;:13;29397:2;29387:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29435:2;29416:7;:16;29424:7;29416:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29480:7;29476:2;29455:33;;29472:1;29455:33;;;;;;;;;;;;29114:382;;:::o;33279:93::-;;;;:::o;31823:843::-;31944:4;31970:15;:2;:13;;;:15::i;:::-;31966:693;;;32022:2;32006:36;;;32043:12;:10;:12::i;:::-;32057:4;32063:7;32072:5;32006:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32002:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32269:1;32252:6;:13;:18;32248:341;;;32295:60;;;;;;;;;;:::i;:::-;;;;;;;;32248:341;32539:6;32533:13;32524:6;32520:2;32516:15;32509:38;32002:602;32139:45;;;32129:55;;;:6;:55;;;;32122:62;;;;;31966:693;32643:4;32636:11;;31823:843;;;;;;;:::o;8964:422::-;9024:4;9232:12;9343:7;9331:20;9323:28;;9377:1;9370:4;:8;9363:15;;;8964:422;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;;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:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:262::-;;2117:2;2105:9;2096:7;2092:23;2088:32;2085:2;;;2133:1;2130;2123:12;2085:2;2176:1;2201:53;2246:7;2237:6;2226:9;2222:22;2201:53;:::i;:::-;2191:63;;2147:117;2075:196;;;;:::o;2277:407::-;;;2402:2;2390:9;2381:7;2377:23;2373:32;2370:2;;;2418:1;2415;2408:12;2370:2;2461:1;2486:53;2531:7;2522:6;2511:9;2507:22;2486:53;:::i;:::-;2476:63;;2432:117;2588:2;2614:53;2659:7;2650:6;2639:9;2635:22;2614:53;:::i;:::-;2604:63;;2559:118;2360:324;;;;;:::o;2690:552::-;;;;2832:2;2820:9;2811:7;2807:23;2803:32;2800:2;;;2848:1;2845;2838:12;2800:2;2891:1;2916:53;2961:7;2952:6;2941:9;2937:22;2916:53;:::i;:::-;2906:63;;2862:117;3018:2;3044:53;3089:7;3080:6;3069:9;3065:22;3044:53;:::i;:::-;3034:63;;2989:118;3146:2;3172:53;3217:7;3208:6;3197:9;3193:22;3172:53;:::i;:::-;3162:63;;3117:118;2790:452;;;;;:::o;3248:809::-;;;;;3416:3;3404:9;3395:7;3391:23;3387:33;3384:2;;;3433:1;3430;3423:12;3384:2;3476:1;3501:53;3546:7;3537:6;3526:9;3522:22;3501:53;:::i;:::-;3491:63;;3447:117;3603:2;3629:53;3674:7;3665:6;3654:9;3650:22;3629:53;:::i;:::-;3619:63;;3574:118;3731:2;3757:53;3802:7;3793:6;3782:9;3778:22;3757:53;:::i;:::-;3747:63;;3702:118;3887:2;3876:9;3872:18;3859:32;3918:18;3910:6;3907:30;3904:2;;;3950:1;3947;3940:12;3904:2;3978:62;4032:7;4023:6;4012:9;4008:22;3978:62;:::i;:::-;3968:72;;3830:220;3374:683;;;;;;;:::o;4063:401::-;;;4185:2;4173:9;4164:7;4160:23;4156:32;4153:2;;;4201:1;4198;4191:12;4153:2;4244:1;4269:53;4314:7;4305:6;4294:9;4290:22;4269:53;:::i;:::-;4259:63;;4215:117;4371:2;4397:50;4439:7;4430:6;4419:9;4415:22;4397:50;:::i;:::-;4387:60;;4342:115;4143:321;;;;;:::o;4470:407::-;;;4595:2;4583:9;4574:7;4570:23;4566:32;4563:2;;;4611:1;4608;4601:12;4563:2;4654:1;4679:53;4724:7;4715:6;4704:9;4700:22;4679:53;:::i;:::-;4669:63;;4625:117;4781:2;4807:53;4852:7;4843:6;4832:9;4828:22;4807:53;:::i;:::-;4797:63;;4752:118;4553:324;;;;;:::o;4883:260::-;;4990:2;4978:9;4969:7;4965:23;4961:32;4958:2;;;5006:1;5003;4996:12;4958:2;5049:1;5074:52;5118:7;5109:6;5098:9;5094:22;5074:52;:::i;:::-;5064:62;;5020:116;4948:195;;;;:::o;5149:282::-;;5267:2;5255:9;5246:7;5242:23;5238:32;5235:2;;;5283:1;5280;5273:12;5235:2;5326:1;5351:63;5406:7;5397:6;5386:9;5382:22;5351:63;:::i;:::-;5341:73;;5297:127;5225:206;;;;:::o;5437:375::-;;5555:2;5543:9;5534:7;5530:23;5526:32;5523:2;;;5571:1;5568;5561:12;5523:2;5642:1;5631:9;5627:17;5614:31;5672:18;5664:6;5661:30;5658:2;;;5704:1;5701;5694:12;5658:2;5732:63;5787:7;5778:6;5767:9;5763:22;5732:63;:::i;:::-;5722:73;;5585:220;5513:299;;;;:::o;5818:262::-;;5926:2;5914:9;5905:7;5901:23;5897:32;5894:2;;;5942:1;5939;5932:12;5894:2;5985:1;6010:53;6055:7;6046:6;6035:9;6031:22;6010:53;:::i;:::-;6000:63;;5956:117;5884:196;;;;:::o;6086:118::-;6173:24;6191:5;6173:24;:::i;:::-;6168:3;6161:37;6151:53;;:::o;6210:109::-;6291:21;6306:5;6291:21;:::i;:::-;6286:3;6279:34;6269:50;;:::o;6325:360::-;;6439:38;6471:5;6439:38;:::i;:::-;6493:70;6556:6;6551:3;6493:70;:::i;:::-;6486:77;;6572:52;6617:6;6612:3;6605:4;6598:5;6594:16;6572:52;:::i;:::-;6649:29;6671:6;6649:29;:::i;:::-;6644:3;6640:39;6633:46;;6415:270;;;;;:::o;6691:364::-;;6807:39;6840:5;6807:39;:::i;:::-;6862:71;6926:6;6921:3;6862:71;:::i;:::-;6855:78;;6942:52;6987:6;6982:3;6975:4;6968:5;6964:16;6942:52;:::i;:::-;7019:29;7041:6;7019:29;:::i;:::-;7014:3;7010:39;7003:46;;6783:272;;;;;:::o;7061:377::-;;7195:39;7228:5;7195:39;:::i;:::-;7250:89;7332:6;7327:3;7250:89;:::i;:::-;7243:96;;7348:52;7393:6;7388:3;7381:4;7374:5;7370:16;7348:52;:::i;:::-;7425:6;7420:3;7416:16;7409:23;;7171:267;;;;;:::o;7468:845::-;;7608:5;7602:12;7637:36;7663:9;7637:36;:::i;:::-;7689:89;7771:6;7766:3;7689:89;:::i;:::-;7682:96;;7809:1;7798:9;7794:17;7825:1;7820:137;;;;7971:1;7966:341;;;;7787:520;;7820:137;7904:4;7900:9;7889;7885:25;7880:3;7873:38;7940:6;7935:3;7931:16;7924:23;;7820:137;;7966:341;8033:38;8065:5;8033:38;:::i;:::-;8093:1;8107:154;8121:6;8118:1;8115:13;8107:154;;;8195:7;8189:14;8185:1;8180:3;8176:11;8169:35;8245:1;8236:7;8232:15;8221:26;;8143:4;8140:1;8136:12;8131:17;;8107:154;;;8290:6;8285:3;8281:16;8274:23;;7973:334;;7787:520;;7575:738;;;;;;:::o;8319:366::-;;8482:67;8546:2;8541:3;8482:67;:::i;:::-;8475:74;;8558:93;8647:3;8558:93;:::i;:::-;8676:2;8671:3;8667:12;8660:19;;8465:220;;;:::o;8691:366::-;;8854:67;8918:2;8913:3;8854:67;:::i;:::-;8847:74;;8930:93;9019:3;8930:93;:::i;:::-;9048:2;9043:3;9039:12;9032:19;;8837:220;;;:::o;9063:366::-;;9226:67;9290:2;9285:3;9226:67;:::i;:::-;9219:74;;9302:93;9391:3;9302:93;:::i;:::-;9420:2;9415:3;9411:12;9404:19;;9209:220;;;:::o;9435:366::-;;9598:67;9662:2;9657:3;9598:67;:::i;:::-;9591:74;;9674:93;9763:3;9674:93;:::i;:::-;9792:2;9787:3;9783:12;9776:19;;9581:220;;;:::o;9807:366::-;;9970:67;10034:2;10029:3;9970:67;:::i;:::-;9963:74;;10046:93;10135:3;10046:93;:::i;:::-;10164:2;10159:3;10155:12;10148:19;;9953:220;;;:::o;10179:366::-;;10342:67;10406:2;10401:3;10342:67;:::i;:::-;10335:74;;10418:93;10507:3;10418:93;:::i;:::-;10536:2;10531:3;10527:12;10520:19;;10325:220;;;:::o;10551:366::-;;10714:67;10778:2;10773:3;10714:67;:::i;:::-;10707:74;;10790:93;10879:3;10790:93;:::i;:::-;10908:2;10903:3;10899:12;10892:19;;10697:220;;;:::o;10923:366::-;;11086:67;11150:2;11145:3;11086:67;:::i;:::-;11079:74;;11162:93;11251:3;11162:93;:::i;:::-;11280:2;11275:3;11271:12;11264:19;;11069:220;;;:::o;11295:366::-;;11458:67;11522:2;11517:3;11458:67;:::i;:::-;11451:74;;11534:93;11623:3;11534:93;:::i;:::-;11652:2;11647:3;11643:12;11636:19;;11441:220;;;:::o;11667:366::-;;11830:67;11894:2;11889:3;11830:67;:::i;:::-;11823:74;;11906:93;11995:3;11906:93;:::i;:::-;12024:2;12019:3;12015:12;12008:19;;11813:220;;;:::o;12039:366::-;;12202:67;12266:2;12261:3;12202:67;:::i;:::-;12195:74;;12278:93;12367:3;12278:93;:::i;:::-;12396:2;12391:3;12387:12;12380:19;;12185:220;;;:::o;12411:366::-;;12574:67;12638:2;12633:3;12574:67;:::i;:::-;12567:74;;12650:93;12739:3;12650:93;:::i;:::-;12768:2;12763:3;12759:12;12752:19;;12557:220;;;:::o;12783:366::-;;12946:67;13010:2;13005:3;12946:67;:::i;:::-;12939:74;;13022:93;13111:3;13022:93;:::i;:::-;13140:2;13135:3;13131:12;13124:19;;12929:220;;;:::o;13155:366::-;;13318:67;13382:2;13377:3;13318:67;:::i;:::-;13311:74;;13394:93;13483:3;13394:93;:::i;:::-;13512:2;13507:3;13503:12;13496:19;;13301:220;;;:::o;13527:366::-;;13690:67;13754:2;13749:3;13690:67;:::i;:::-;13683:74;;13766:93;13855:3;13766:93;:::i;:::-;13884:2;13879:3;13875:12;13868:19;;13673:220;;;:::o;13899:118::-;13986:24;14004:5;13986:24;:::i;:::-;13981:3;13974:37;13964:53;;:::o;14023:429::-;;14222:92;14310:3;14301:6;14222:92;:::i;:::-;14215:99;;14331:95;14422:3;14413:6;14331:95;:::i;:::-;14324:102;;14443:3;14436:10;;14204:248;;;;;:::o;14458:222::-;;14589:2;14578:9;14574:18;14566:26;;14602:71;14670:1;14659:9;14655:17;14646:6;14602:71;:::i;:::-;14556:124;;;;:::o;14686:442::-;;14873:2;14862:9;14858:18;14850:26;;14886:71;14954:1;14943:9;14939:17;14930:6;14886:71;:::i;:::-;14967:72;15035:2;15024:9;15020:18;15011:6;14967:72;:::i;:::-;15049;15117:2;15106:9;15102:18;15093:6;15049:72;:::i;:::-;14840:288;;;;;;:::o;15134:640::-;;15367:3;15356:9;15352:19;15344:27;;15381:71;15449:1;15438:9;15434:17;15425:6;15381:71;:::i;:::-;15462:72;15530:2;15519:9;15515:18;15506:6;15462:72;:::i;:::-;15544;15612:2;15601:9;15597:18;15588:6;15544:72;:::i;:::-;15663:9;15657:4;15653:20;15648:2;15637:9;15633:18;15626:48;15691:76;15762:4;15753:6;15691:76;:::i;:::-;15683:84;;15334:440;;;;;;;:::o;15780:332::-;;15939:2;15928:9;15924:18;15916:26;;15952:71;16020:1;16009:9;16005:17;15996:6;15952:71;:::i;:::-;16033:72;16101:2;16090:9;16086:18;16077:6;16033:72;:::i;:::-;15906:206;;;;;:::o;16118:210::-;;16243:2;16232:9;16228:18;16220:26;;16256:65;16318:1;16307:9;16303:17;16294:6;16256:65;:::i;:::-;16210:118;;;;:::o;16334:313::-;;16485:2;16474:9;16470:18;16462:26;;16534:9;16528:4;16524:20;16520:1;16509:9;16505:17;16498:47;16562:78;16635:4;16626:6;16562:78;:::i;:::-;16554:86;;16452:195;;;;:::o;16653:419::-;;16857:2;16846:9;16842:18;16834:26;;16906:9;16900:4;16896:20;16892:1;16881:9;16877:17;16870:47;16934:131;17060:4;16934:131;:::i;:::-;16926:139;;16824:248;;;:::o;17078:419::-;;17282:2;17271:9;17267:18;17259:26;;17331:9;17325:4;17321:20;17317:1;17306:9;17302:17;17295:47;17359:131;17485:4;17359:131;:::i;:::-;17351:139;;17249:248;;;:::o;17503:419::-;;17707:2;17696:9;17692:18;17684:26;;17756:9;17750:4;17746:20;17742:1;17731:9;17727:17;17720:47;17784:131;17910:4;17784:131;:::i;:::-;17776:139;;17674:248;;;:::o;17928:419::-;;18132:2;18121:9;18117:18;18109:26;;18181:9;18175:4;18171:20;18167:1;18156:9;18152:17;18145:47;18209:131;18335:4;18209:131;:::i;:::-;18201:139;;18099:248;;;:::o;18353:419::-;;18557:2;18546:9;18542:18;18534:26;;18606:9;18600:4;18596:20;18592:1;18581:9;18577:17;18570:47;18634:131;18760:4;18634:131;:::i;:::-;18626:139;;18524:248;;;:::o;18778:419::-;;18982:2;18971:9;18967:18;18959:26;;19031:9;19025:4;19021:20;19017:1;19006:9;19002:17;18995:47;19059:131;19185:4;19059:131;:::i;:::-;19051:139;;18949:248;;;:::o;19203:419::-;;19407:2;19396:9;19392:18;19384:26;;19456:9;19450:4;19446:20;19442:1;19431:9;19427:17;19420:47;19484:131;19610:4;19484:131;:::i;:::-;19476:139;;19374:248;;;:::o;19628:419::-;;19832:2;19821:9;19817:18;19809:26;;19881:9;19875:4;19871:20;19867:1;19856:9;19852:17;19845:47;19909:131;20035:4;19909:131;:::i;:::-;19901:139;;19799:248;;;:::o;20053:419::-;;20257:2;20246:9;20242:18;20234:26;;20306:9;20300:4;20296:20;20292:1;20281:9;20277:17;20270:47;20334:131;20460:4;20334:131;:::i;:::-;20326:139;;20224:248;;;:::o;20478:419::-;;20682:2;20671:9;20667:18;20659:26;;20731:9;20725:4;20721:20;20717:1;20706:9;20702:17;20695:47;20759:131;20885:4;20759:131;:::i;:::-;20751:139;;20649:248;;;:::o;20903:419::-;;21107:2;21096:9;21092:18;21084:26;;21156:9;21150:4;21146:20;21142:1;21131:9;21127:17;21120:47;21184:131;21310:4;21184:131;:::i;:::-;21176:139;;21074:248;;;:::o;21328:419::-;;21532:2;21521:9;21517:18;21509:26;;21581:9;21575:4;21571:20;21567:1;21556:9;21552:17;21545:47;21609:131;21735:4;21609:131;:::i;:::-;21601:139;;21499:248;;;:::o;21753:419::-;;21957:2;21946:9;21942:18;21934:26;;22006:9;22000:4;21996:20;21992:1;21981:9;21977:17;21970:47;22034:131;22160:4;22034:131;:::i;:::-;22026:139;;21924:248;;;:::o;22178:419::-;;22382:2;22371:9;22367:18;22359:26;;22431:9;22425:4;22421:20;22417:1;22406:9;22402:17;22395:47;22459:131;22585:4;22459:131;:::i;:::-;22451:139;;22349:248;;;:::o;22603:419::-;;22807:2;22796:9;22792:18;22784:26;;22856:9;22850:4;22846:20;22842:1;22831:9;22827:17;22820:47;22884:131;23010:4;22884:131;:::i;:::-;22876:139;;22774:248;;;:::o;23028:222::-;;23159:2;23148:9;23144:18;23136:26;;23172:71;23240:1;23229:9;23225:17;23216:6;23172:71;:::i;:::-;23126:124;;;;:::o;23256:129::-;;23317:20;;:::i;:::-;23307:30;;23346:33;23374:4;23366:6;23346:33;:::i;:::-;23297:88;;;:::o;23391:75::-;;23457:2;23451:9;23441:19;;23431:35;:::o;23472:307::-;;23623:18;23615:6;23612:30;23609:2;;;23645:18;;:::i;:::-;23609:2;23683:29;23705:6;23683:29;:::i;:::-;23675:37;;23767:4;23761;23757:15;23749:23;;23538:241;;;:::o;23785:308::-;;23937:18;23929:6;23926:30;23923:2;;;23959:18;;:::i;:::-;23923:2;23997:29;24019:6;23997:29;:::i;:::-;23989:37;;24081:4;24075;24071:15;24063:23;;23852:241;;;:::o;24099:141::-;;24171:3;24163:11;;24194:3;24191:1;24184:14;24228:4;24225:1;24215:18;24207:26;;24153:87;;;:::o;24246:98::-;;24331:5;24325:12;24315:22;;24304:40;;;:::o;24350:99::-;;24436:5;24430:12;24420:22;;24409:40;;;:::o;24455:168::-;;24572:6;24567:3;24560:19;24612:4;24607:3;24603:14;24588:29;;24550:73;;;;:::o;24629:169::-;;24747:6;24742:3;24735:19;24787:4;24782:3;24778:14;24763:29;;24725:73;;;;:::o;24804:148::-;;24943:3;24928:18;;24918:34;;;;:::o;24958:305::-;;25017:20;25035:1;25017:20;:::i;:::-;25012:25;;25051:20;25069:1;25051:20;:::i;:::-;25046:25;;25205:1;25137:66;25133:74;25130:1;25127:81;25124:2;;;25211:18;;:::i;:::-;25124:2;25255:1;25252;25248:9;25241:16;;25002:261;;;;:::o;25269:185::-;;25326:20;25344:1;25326:20;:::i;:::-;25321:25;;25360:20;25378:1;25360:20;:::i;:::-;25355:25;;25399:1;25389:2;;25404:18;;:::i;:::-;25389:2;25446:1;25443;25439:9;25434:14;;25311:143;;;;:::o;25460:191::-;;25520:20;25538:1;25520:20;:::i;:::-;25515:25;;25554:20;25572:1;25554:20;:::i;:::-;25549:25;;25593:1;25590;25587:8;25584:2;;;25598:18;;:::i;:::-;25584:2;25643:1;25640;25636:9;25628:17;;25505:146;;;;:::o;25657:96::-;;25723:24;25741:5;25723:24;:::i;:::-;25712:35;;25702:51;;;:::o;25759:90::-;;25836:5;25829:13;25822:21;25811:32;;25801:48;;;:::o;25855:149::-;;25931:66;25924:5;25920:78;25909:89;;25899:105;;;:::o;26010:126::-;;26087:42;26080:5;26076:54;26065:65;;26055:81;;;:::o;26142:77::-;;26208:5;26197:16;;26187:32;;;:::o;26225:154::-;26309:6;26304:3;26299;26286:30;26371:1;26362:6;26357:3;26353:16;26346:27;26276:103;;;:::o;26385:307::-;26453:1;26463:113;26477:6;26474:1;26471:13;26463:113;;;26562:1;26557:3;26553:11;26547:18;26543:1;26538:3;26534:11;26527:39;26499:2;26496:1;26492:10;26487:15;;26463:113;;;26594:6;26591:1;26588:13;26585:2;;;26674:1;26665:6;26660:3;26656:16;26649:27;26585:2;26434:258;;;;:::o;26698:320::-;;26779:1;26773:4;26769:12;26759:22;;26826:1;26820:4;26816:12;26847:18;26837:2;;26903:4;26895:6;26891:17;26881:27;;26837:2;26965;26957:6;26954:14;26934:18;26931:38;26928:2;;;26984:18;;:::i;:::-;26928:2;26749:269;;;;:::o;27024:281::-;27107:27;27129:4;27107:27;:::i;:::-;27099:6;27095:40;27237:6;27225:10;27222:22;27201:18;27189:10;27186:34;27183:62;27180:2;;;27248:18;;:::i;:::-;27180:2;27288:10;27284:2;27277:22;27067:238;;;:::o;27311:233::-;;27373:24;27391:5;27373:24;:::i;:::-;27364:33;;27419:66;27412:5;27409:77;27406:2;;;27489:18;;:::i;:::-;27406:2;27536:1;27529:5;27525:13;27518:20;;27354:190;;;:::o;27550:176::-;;27599:20;27617:1;27599:20;:::i;:::-;27594:25;;27633:20;27651:1;27633:20;:::i;:::-;27628:25;;27672:1;27662:2;;27677:18;;:::i;:::-;27662:2;27718:1;27715;27711:9;27706:14;;27584:142;;;;:::o;27732:180::-;27780:77;27777:1;27770:88;27877:4;27874:1;27867:15;27901:4;27898:1;27891:15;27918:180;27966:77;27963:1;27956:88;28063:4;28060:1;28053:15;28087:4;28084:1;28077:15;28104:180;28152:77;28149:1;28142:88;28249:4;28246:1;28239:15;28273:4;28270:1;28263:15;28290:180;28338:77;28335:1;28328:88;28435:4;28432:1;28425:15;28459:4;28456:1;28449:15;28476:102;;28568:2;28564:7;28559:2;28552:5;28548:14;28544:28;28534:38;;28524:54;;;:::o;28584:237::-;28724:34;28720:1;28712:6;28708:14;28701:58;28793:20;28788:2;28780:6;28776:15;28769:45;28690:131;:::o;28827:225::-;28967:34;28963:1;28955:6;28951:14;28944:58;29036:8;29031:2;29023:6;29019:15;29012:33;28933:119;:::o;29058:178::-;29198:30;29194:1;29186:6;29182:14;29175:54;29164:72;:::o;29242:223::-;29382:34;29378:1;29370:6;29366:14;29359:58;29451:6;29446:2;29438:6;29434:15;29427:31;29348:117;:::o;29471:175::-;29611:27;29607:1;29599:6;29595:14;29588:51;29577:69;:::o;29652:231::-;29792:34;29788:1;29780:6;29776:14;29769:58;29861:14;29856:2;29848:6;29844:15;29837:39;29758:125;:::o;29889:243::-;30029:34;30025:1;30017:6;30013:14;30006:58;30098:26;30093:2;30085:6;30081:15;30074:51;29995:137;:::o;30138:229::-;30278:34;30274:1;30266:6;30262:14;30255:58;30347:12;30342:2;30334:6;30330:15;30323:37;30244:123;:::o;30373:228::-;30513:34;30509:1;30501:6;30497:14;30490:58;30582:11;30577:2;30569:6;30565:15;30558:36;30479:122;:::o;30607:182::-;30747:34;30743:1;30735:6;30731:14;30724:58;30713:76;:::o;30795:231::-;30935:34;30931:1;30923:6;30919:14;30912:58;31004:14;30999:2;30991:6;30987:15;30980:39;30901:125;:::o;31032:182::-;31172:34;31168:1;31160:6;31156:14;31149:58;31138:76;:::o;31220:228::-;31360:34;31356:1;31348:6;31344:14;31337:58;31429:11;31424:2;31416:6;31412:15;31405:36;31326:122;:::o;31454:220::-;31594:34;31590:1;31582:6;31578:14;31571:58;31663:3;31658:2;31650:6;31646:15;31639:28;31560:114;:::o;31680:236::-;31820:34;31816:1;31808:6;31804:14;31797:58;31889:19;31884:2;31876:6;31872:15;31865:44;31786:130;:::o;31922:122::-;31995:24;32013:5;31995:24;:::i;:::-;31988:5;31985:35;31975:2;;32034:1;32031;32024:12;31975:2;31965:79;:::o;32050:116::-;32120:21;32135:5;32120:21;:::i;:::-;32113:5;32110:32;32100:2;;32156:1;32153;32146:12;32100:2;32090:76;:::o;32172:120::-;32244:23;32261:5;32244:23;:::i;:::-;32237:5;32234:34;32224:2;;32282:1;32279;32272:12;32224:2;32214:78;:::o;32298:122::-;32371:24;32389:5;32371:24;:::i;:::-;32364:5;32361:35;32351:2;;32410:1;32407;32400:12;32351:2;32341:79;:::o

Swarm Source

ipfs://0984721d533f95bf8ee9dd3a3938dcc61bd49f1408e1685e30eb310e292c6ae5
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.