ETH Price: $2,607.40 (+0.16%)
Gas: 3 Gwei

Etheria Wrapper v0pt9 2015-10-19 (EW09)
 

Overview

TokenID

488

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
EtheriaWrapper0pt9

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-29
*/

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (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/ERC721.sol


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (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);

    /**
     * @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: contracts/EtheriaWrapper_v0pt9.sol

// Solidity 0.8.7-e28d00a7 optimization 200 (default)

pragma solidity ^0.8.6;







interface Etheria {
    function getOwner(uint8 col, uint8 row) external view returns(address);
    function getOfferers(uint8 col, uint8 row) external view returns (address[] memory);
    function getOffers(uint8 col, uint8 row) external view returns (uint[] memory);  
    function setName(uint8 col, uint8 row, string memory _n) external;
    function setStatus(uint8 col, uint8 row, string memory _s) external payable;
    function makeOffer(uint8 col, uint8 row) external payable;
    function rejectOffer(uint8 col, uint8 row, uint8 index) external;
    function acceptOffer(uint8 col, uint8 row, uint8 index) external;
}

contract EtheriaWrapper0pt9 is Ownable, ERC721 {

    address public _etheriaAddress;
    Etheria public _etheria;

    mapping (uint256 => address) public wrapInitializers;

    constructor() payable ERC721("Etheria Wrapper v0pt9 2015-10-19", "EW09") {
		_etheriaAddress = 0xe468D26721b703D224d05563cB64746A7A40E1F4;
		_etheria = Etheria(_etheriaAddress);
        _baseTokenURI = "https://etheria.world/metadata/v0pt9/";
		_baseTokenExtension = ".json";
    }
   
    receive() external payable
    {
        // Only accept from Etheria contract
        require(_msgSender() == _etheriaAddress, "EW09: ETH sender isn't Etheria contract");
    }
    
    event WrapStarted(address indexed addr, uint256 indexed _locationID);
    event WrapFinished(address indexed addr, uint256 indexed _locationID);
    event Unwrapped(address indexed addr, uint256 indexed _locationID);
    event NameSet(address indexed addr, uint256 indexed _locationID, string name);
    event StatusSet(address indexed addr, uint256 indexed _locationID, string status);
    event OfferRejected(address indexed addr, uint256 indexed _locationID, uint offer, address offerer);
    event OfferRetracted(address indexed addr, uint256 indexed _locationID); // offerer is always address(this) and amount always 0.01 ETH

    function _getIndex(uint8 col, uint8 row) internal pure returns (uint256) {
        require(col <= uint8(32) && row <= uint8(32), "EW09: Invalid col and/or row. Valid range is 0-32"); // uint8 prevents sub-0 automatically
        return (uint256(col) * uint256(33)) + uint256(row);
    }

    // ***** Why are v0.9 and v1.0 wrappable while v1.1 and v1.2 are not? (as of March 2022) *****
    //
    // Etheria was developed long before any NFT exchanges existed. As such, in versions v0.9 and 
    // v1.0, I added internal exchange logic (hereinafter the "offer system") to facilitate trading before abandoning
    // it in favor of a simple "setOwner" function in v1.1 and v1.2.
    // 
    // While this "offer system" was really poorly designed and clunky (the result of a manic episode of moving fast
    // and "testing in production"), it does actually work and work reliably if the proper precautions are taken.
    // 
    // What's more, this "offer system" used msg.sender (v0.9 and v1.0) instead of tx.origin (v1.1 and v1.2) which
    // which means v0.9 and v1.0 tiles are ownable by smart contracts... i.e. they are WRAPPABLE
    //
    // Wrappability means that this terrible "offer system" will be entirely bypassed after wrapping is complete
    // because it's the WRAPPER that is traded, not the base token. The base token is owned by the wrapper smart contract 
    // until unwrap time when the base token is transferred to the new owner.

    // ***** How the "offer system" works in v0.9 and v1.0 ***** (don't use this except to wrap/unwrap)
    //
    // Each v0.9 and v1.0 tile has two arrays: offers[] and offerers[] which can be up to 10 items long.
    // When a new offer comes in, the ETH is stored in the contract and the offers[] and offerers[] arrays are expanded
    // by 1 item to store the bid.
    //
    // The tile owner can then rejectOffer(col, row, offerIndex) or acceptOffer(col, row, offerIndex) to transfer
    // the tile to the successful bidder. 
    
    // ***** How to wrap *****
    //
    // 0. Start with the tile owned by your normal Ethereum account (not a smart contract) and make sure there are no 
    //      unwanted offers in the offer system. Call rejectOffer(col, row) until the arrays are completely empty.
    // 1. Call the wrapper contract's "makeOfferViaWrapper(col,row)" along with 0.01 ETH to force the wrapper to make 
    //      an offer on the base token. Only the tile owner can do this. The wrapper will save the owner's address.
    // 1b. Check the base token's offerer and offerers arrays. They should be 1 item long each, containing 0.01 and the
    //      address of the *wrapper*. Also check wrapInitializer with getWrapInitializer(col,row)
    // 2. Now call acceptOffer(col,row) for your tile on the base contract. Ownership is transferred to the wrapper 
    //      which already has a record of your ownership.
    // 3. Call finishWrap() from previous owner to complete the process.

    // ***** How to unwrap ***** (Note: you probably shouldn't)
    //
    // 0. Start with the tile owned by the wrapper. Call rejectOfferViaWrapper(col, row) to clear out offer arrays.
    // 1. Call makeOffer(col,row) with 0.01 ETH from the destination account. Check the base token's offerer and offerers arrays. 
    //      They should be 1 item long each, containing 0.01 and the address of the destination account.
    // 2. Now call acceptOfferViaWrapper(col,row) for your tile to unwrap the tile to the desired destination.

    // -----------------------------------------------------------------------------------------------------------------

    // External convenience function to let the user check who, if anyone, is the wrapInitializer for this col,row
    //
    function getWrapInitializer(uint8 col, uint8 row) external view returns (address) {
        uint256 _locationID = _getIndex(col, row);
        return wrapInitializers[_locationID];
    }

    // WRAP STEP(S) 0:
    // Reject all standing offers on the base tile you directly own.

    // WRAP STEP 1: 
    // Start the wrapping process by placing an offer on the target tile from the wrapper contract
    // Pre-requisites: 
    //      msg.sender must own the base tile (automatically excludes water, guarantees 721 does not exist)
    //      offer/ers arrays must be empty (all standing offers rejected)
    //      incoming value must be exactly 0.01 ETH
    //              
    function makeOfferViaWrapper(uint8 col, uint8 row) external payable {
        uint256 _locationID = _getIndex(col, row);
        require(_etheria.getOwner(col,row) == msg.sender, "EW09: You must be the tile owner to start the wrapping process.");
        require(_etheria.getOffers(col,row).length == 0, "EW09: The offer/ers arrays for this tile must be empty. Reject all offers.");
        require(msg.value == 10000000000000000, "EW09: You must supply exactly 0.01 ETH to this function.");        
        _etheria.makeOffer{value: msg.value}(col,row);
        // these two are redundant, but w/e
        require(_etheria.getOfferers(col,row)[0] == address(this), "EW09: The offerer in position 0 should be this wrapper address.");
        require(_etheria.getOffers(col,row)[0] == 10000000000000000, "EW09: The offer in position 0 should be 0.01 ETH.");
        wrapInitializers[_locationID] = msg.sender; // doesn't matter if a value already exists in this array
        emit WrapStarted(msg.sender, _locationID);
    }
    // post state: 
    //      Wrapper has placed a 0.01 ETH offer in position 0 of the specified tile that msg.sender owns, 
    //      Wrapper has recorded msg.sender as the wrapInitializer for the specified tile
    //      WrapStarted event fired

    // WRAP STEP 2: 
    // Call etheria.acceptOffer on the offer this wrapper made on the base tile to give the wrapper ownership (in position 0 only!)
    // post state:
    //      Wrapper now owns the tile, the previous owner (paid 0.01 ETH) is still recorded as the wrapInitializer for it. 721 not yet issued.
    //      0.009 and 0.001 ETH have been sent to the base tile owner and Etheria contract creator, respectively, after the "sale"
    //      base tile offer/ers arrays cleared out and refunded, if necessary
    //      Note: There is no event for the offer acceptance on the base tile
    //      Note: You *must* complete the wrapping process in step 3, even if you have changed your mind or want to unwrap.
    //              The wrapper now technically owns the tile and you can't do anything with it until you finishWrap() first.

    // WRAP STEP 3:
    // Finishes the wrapping process by minting the 721 token
    // Pre-requisites:
    //      caller must be the wrapInitializer for this tile
    //      tile must be owned by the wrapper
    //
    function finishWrap(uint8 col, uint8 row) external {
        uint256 _locationID = _getIndex(col, row);
        require(wrapInitializers[_locationID] == msg.sender, "EW09: You are not the wrapInitializer for this tile. Call makeOfferViaWrapper first.");
        require(_etheria.getOwner(col,row) == address(this), "EW09: Tile is not yet owned by this wrapper. Call etheria.acceptOffer to give the wrapper ownership, then finishWrap to complete.");
        _mint(msg.sender, _locationID); // automatically checks to see if token doesn't yet exist
        require(_exists(_locationID), "EW09: 721 was not created as it should have been. Reverting.");
        delete wrapInitializers[_locationID]; // done minting, remove from wrapInitializers array
        require(wrapInitializers[_locationID] == address(0), "EW09: wrapInitializer was not reset to 0. Reverting.");
        emit WrapFinished(msg.sender, _locationID);
    }
    //post state:
    //      721 token created and owned by caller
    //      wrapInitializer for this tile reset to 0
    //      WrapFinished event fired

    // UNWRAP STEP(S) 0 (if necessary):
    // rejectOfferViaWrapper enables the 721-ownerOf (you) to clear out standing offers on the base tile via the wrapper
    //      (since the wrapper technically owns the base tile). W/o this, the tile's 10 offer slots could be DoS-ed with bogus offers
    //      Note: This always rejects the 0 index offer to enforce the condition that our legit unwrapping offer sit
    //      in position 0, the only position where we can guarantee no frontrunning/switcharoo issues
    // Pre-requisites:
    //      The 721 exists for the col,row
    //      There is 1+ offer(s) on the base tile
    //      You own the 721
    //      The wrapper owns the base tile
    //
    function rejectOfferViaWrapper(uint8 col, uint8 row) external { 
        uint256 _locationID = _getIndex(col, row);
        require(_exists(_locationID), "EW09: That 721 does not exist.");
        uint8 offersLength = uint8(_etheria.getOffers(col,row).length); // can't be more than 10
        require(offersLength > 0, "EW09: The offer/ers arrays for this tile must not be empty.");
        address owner = ERC721.ownerOf(_locationID);
        require(owner == msg.sender, "EW09: You must be the 721-ownerOf the tile.");
        require(_etheria.getOwner(col,row) == address(this), "EW09: The wrapper must be the owner of the base tile.");
        address offerer = _etheria.getOfferers(col,row)[0]; // record offerer and offer for event below
        uint offer = _etheria.getOffers(col,row)[0];
        _etheria.rejectOffer(col,row,0); // always rejecting offer at index 0, we don't care about the others
        require(_etheria.getOffers(col,row).length == (offersLength-1), "EW09: Offers array must be 1 less than before. It is not. Reverting.");
        emit OfferRejected(msg.sender, _locationID, offer, offerer); // 721 owner rejected an offer on tile x of amount offer by offerer
    }
    //post state:
    //      One less offer in the base tile's offers array
    //      OfferRejected event fired

    // UNWRAP STEP 1:
    // call etheria.makeOffer with 0.01 ETH from the same account that owns the 721 
    //  then make sure it's the offer sitting in position 0. If it isn't, rejectOfferViaWrapper until it is.

    // UNWRAP STEP 2:
    // Accepts the offer in position 0, the only position we can guarantee won't be switcharooed
    // Pre-requisites:
    //      721 must exist
    //      You must own the 721
    //      offer on base tile in position 0 must be 0.01 ETH from the 721-owner
    //  
    function acceptOfferViaWrapper(uint8 col, uint8 row) external {
        uint256 _locationID = _getIndex(col, row);
        require(_exists(_locationID), "EW09: That 721 does not exist.");
        address owner = ERC721.ownerOf(_locationID);
        require(owner == msg.sender, "EW09: You must be the 721-ownerOf the tile.");
        require(_etheria.getOfferers(col,row)[0] == msg.sender, "EW09: You are not the offerer in position 0.");
        require(_etheria.getOffers(col,row)[0] == 10000000000000000, "EW09: The offer in position 0 is not 0.01 ETH as expected.");
        _etheria.acceptOffer(col, row, 0); // 0.001 will be sent to Etheria creator and 0.009 will be sent to this contract
        require(_etheria.getOwner(col,row) == msg.sender, "EW09: You were not made the base tile owner as expected. Reverting.");
        _burn(_locationID);
        require(!_exists(_locationID), "EW09: The 721 was not burned as expected. Reverting.");
        emit Unwrapped(msg.sender, _locationID); // 721 owner unwrapped _locationID
    }
    // post state: 
    //      721 burned, base tile now owned by msg.sender
    //      0.001 sent to Etheria contract creator, 0.009 sent to this wrapper for the "sale" 
    //              Note: This 0.009 ETH is not withdrawable to you due to complexity and gas. Consider it an unwrap fee. :)
    //      Base tile offer/ers arrays cleared out and refunded, if necessary

    // NOTE: retractOfferViaWrapper is absent due to being unnecessary and overly complex. The tile owner can 
    //      always remove any unwanted offers, including any made from this wrapper.
   
    function setNameViaWrapper(uint8 col, uint8 row, string memory _n) external {
        uint256 _locationID = _getIndex(col, row);
        require(_exists(_locationID), "EW09: That 721 does not exist.");
        address owner = ERC721.ownerOf(_locationID);
        require(owner == msg.sender, "EW09: You must be the 721-ownerOf the tile.");
        _etheria.setName(col,row,_n);
        emit NameSet(msg.sender, _locationID, _n); // tile's 721-ownerOf set _locationID's name
    }

    function setStatusViaWrapper(uint8 col, uint8 row, string memory _n) external payable {
        uint256 _locationID = _getIndex(col, row);
        require(_exists(_locationID), "EW09: That 721 does not exist.");
        address owner = ERC721.ownerOf(_locationID);
        require(owner == msg.sender, "EW09: You must be the 721-ownerOf the tile.");
        require(msg.value == 100000000000000000, "EW09: It costs 0.1 ETH to change status."); // 0.1 ETH
        _etheria.setStatus{value: msg.value}(col,row,_n);
        emit StatusSet(msg.sender, _locationID, _n);  // tile's 721-ownerOf set _locationID's status
    }
   
    // In the extremely unlikely event somebody is being stupid and filling all the slots on the tiles AND maliciously 
    // keeping a bot running to continually insert more bogus 0.01 ETH bids into the slots even as the tile owner 
    // rejects them (i.e. a DoS attack meant to prevent un/wrapping), the tile owner can still get their wrapper bid onto 
    // the tile via flashbots or similar (avoiding the mempool): Simply etheria.rejectOffer and wrapper.makeOfferViaWrapper 
    // in back-to-back transactions, then reject offers until the wrapper offer is in slot 0, ready to wrap. (It doesn't 
    // matter if the bot creates 9 more in the remaining slots.) Hence, there is nothing an attacker can do to DoS a tile.

    /**
     * @dev sets base token URI and the token extension...
     */

    string public _baseTokenURI;
    string public _baseTokenExtension; 

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

    function setTokenExtension(string memory __baseTokenExtension) public onlyOwner {
        _baseTokenExtension = __baseTokenExtension;
    }    
     
    function tokenURI(uint256 _tokenId) public view override returns (string memory) {  // complete URI = base +  token + token extension
        return string(abi.encodePacked(_baseTokenURI, Strings.toString(_tokenId), _baseTokenExtension));
    }

    function empty() external onlyOwner
    {
        // Unwrapping leaves 0.009 ETH on this wrapper each time. Allow creator to retrieve, if it ever becomes 
        // worth the effort. No other money should ever rest on this wrapper, only the base Etheria contract.
	    payable(msg.sender).transfer(address(this).balance); 
    }
}

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":"addr","type":"address"},{"indexed":true,"internalType":"uint256","name":"_locationID","type":"uint256"},{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"NameSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":true,"internalType":"uint256","name":"_locationID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"offer","type":"uint256"},{"indexed":false,"internalType":"address","name":"offerer","type":"address"}],"name":"OfferRejected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":true,"internalType":"uint256","name":"_locationID","type":"uint256"}],"name":"OfferRetracted","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":"addr","type":"address"},{"indexed":true,"internalType":"uint256","name":"_locationID","type":"uint256"},{"indexed":false,"internalType":"string","name":"status","type":"string"}],"name":"StatusSet","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":"addr","type":"address"},{"indexed":true,"internalType":"uint256","name":"_locationID","type":"uint256"}],"name":"Unwrapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":true,"internalType":"uint256","name":"_locationID","type":"uint256"}],"name":"WrapFinished","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":true,"internalType":"uint256","name":"_locationID","type":"uint256"}],"name":"WrapStarted","type":"event"},{"inputs":[],"name":"_baseTokenExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_etheria","outputs":[{"internalType":"contract Etheria","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_etheriaAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"col","type":"uint8"},{"internalType":"uint8","name":"row","type":"uint8"}],"name":"acceptOfferViaWrapper","outputs":[],"stateMutability":"nonpayable","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":[],"name":"empty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"col","type":"uint8"},{"internalType":"uint8","name":"row","type":"uint8"}],"name":"finishWrap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"col","type":"uint8"},{"internalType":"uint8","name":"row","type":"uint8"}],"name":"getWrapInitializer","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":[{"internalType":"uint8","name":"col","type":"uint8"},{"internalType":"uint8","name":"row","type":"uint8"}],"name":"makeOfferViaWrapper","outputs":[],"stateMutability":"payable","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":[{"internalType":"uint8","name":"col","type":"uint8"},{"internalType":"uint8","name":"row","type":"uint8"}],"name":"rejectOfferViaWrapper","outputs":[],"stateMutability":"nonpayable","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":"uint8","name":"col","type":"uint8"},{"internalType":"uint8","name":"row","type":"uint8"},{"internalType":"string","name":"_n","type":"string"}],"name":"setNameViaWrapper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"col","type":"uint8"},{"internalType":"uint8","name":"row","type":"uint8"},{"internalType":"string","name":"_n","type":"string"}],"name":"setStatusViaWrapper","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"__baseTokenExtension","type":"string"}],"name":"setTokenExtension","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":"","type":"uint256"}],"name":"wrapInitializers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

602060809081527f45746865726961205772617070657220763070743920323031352d31302d313960a052610100604052600460c0908152634557303960e01b60e0526200004d3362000116565b81516200006290600190602085019062000166565b5080516200007890600290602084019062000166565b50506007805473e468d26721b703d224d05563cb64746a7a40e1f46001600160a01b031991821681179092556008805490911690911790555060408051606081019091526025808252620037b960208301398051620000e091600a9160209091019062000166565b5060408051808201909152600580825264173539b7b760d91b60209092019182526200010f91600b9162000166565b5062000249565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b82805462000174906200020c565b90600052602060002090601f016020900481019282620001985760008555620001e3565b82601f10620001b357805160ff1916838001178555620001e3565b82800160010185558215620001e3579182015b82811115620001e3578251825591602001919060010190620001c6565b50620001f1929150620001f5565b5090565b5b80821115620001f15760008155600101620001f6565b600181811c908216806200022157607f821691505b602082108114156200024357634e487b7160e01b600052602260045260246000fd5b50919050565b61356080620002596000396000f3fe6080604052600436106101dc5760003560e01c8063695d783211610102578063a22cb46511610095578063e985e9c511610064578063e985e9c5146105d6578063ec3408261461061f578063f2a75fe414610634578063f2fde38b1461064957600080fd5b8063a22cb46514610561578063b88d4fde14610581578063c87b56dd146105a1578063cfc86f7b146105c157600080fd5b80637b0cf1ef116100d15780637b0cf1ef146104d85780638da5cb5b146104f857806395d89b411461051657806398caef281461052b57600080fd5b8063695d78321461046257806370a0823114610475578063715018a6146104a357806373292671146104b857600080fd5b80632155abf51161017a5780634abc2fec116101495780634abc2fec146103ef5780635502e1481461040f5780635e0b0092146104225780636352211e1461044257600080fd5b80632155abf51461036f57806323b872dd1461038f57806330176e13146103af57806342842e0e146103cf57600080fd5b8063095ea7b3116101b6578063095ea7b3146102ef5780630cd5188f1461030f578063147c07181461032f5780632067c8e51461034f57600080fd5b806301ffc9a71461026057806306fdde0314610295578063081812fc146102b757600080fd5b3661025b576007546001600160a01b0316336001600160a01b0316146102595760405162461bcd60e51b815260206004820152602760248201527f455730393a204554482073656e6465722069736e2774204574686572696120636044820152661bdb9d1c9858dd60ca1b60648201526084015b60405180910390fd5b005b600080fd5b34801561026c57600080fd5b5061028061027b366004612f4d565b610669565b60405190151581526020015b60405180910390f35b3480156102a157600080fd5b506102aa6106bb565b60405161028c919061319c565b3480156102c357600080fd5b506102d76102d2366004612fbc565b61074d565b6040516001600160a01b03909116815260200161028c565b3480156102fb57600080fd5b5061025961030a366004612def565b6107d5565b34801561031b57600080fd5b5061025961032a366004612fd5565b6108eb565b34801561033b57600080fd5b5061025961034a366004612f87565b610daf565b34801561035b57600080fd5b5061025961036a366004612fd5565b610df0565b34801561037b57600080fd5b506008546102d7906001600160a01b031681565b34801561039b57600080fd5b506102596103aa366004612cfb565b61138b565b3480156103bb57600080fd5b506102596103ca366004612f87565b6113bc565b3480156103db57600080fd5b506102596103ea366004612cfb565b6113f9565b3480156103fb57600080fd5b506102d761040a366004612fd5565b611414565b61025961041d366004613008565b611441565b34801561042e57600080fd5b506007546102d7906001600160a01b031681565b34801561044e57600080fd5b506102d761045d366004612fbc565b6115c2565b610259610470366004612fd5565b611639565b34801561048157600080fd5b50610495610490366004612c88565b611bc6565b60405190815260200161028c565b3480156104af57600080fd5b50610259611c4d565b3480156104c457600080fd5b506102596104d3366004612fd5565b611c83565b3480156104e457600080fd5b506102596104f3366004613008565b611f63565b34801561050457600080fd5b506000546001600160a01b03166102d7565b34801561052257600080fd5b506102aa61206b565b34801561053757600080fd5b506102d7610546366004612fbc565b6009602052600090815260409020546001600160a01b031681565b34801561056d57600080fd5b5061025961057c366004612dbc565b61207a565b34801561058d57600080fd5b5061025961059c366004612d3c565b612085565b3480156105ad57600080fd5b506102aa6105bc366004612fbc565b6120bd565b3480156105cd57600080fd5b506102aa6120f4565b3480156105e257600080fd5b506102806105f1366004612cc2565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561062b57600080fd5b506102aa612182565b34801561064057600080fd5b5061025961218f565b34801561065557600080fd5b50610259610664366004612c88565b6121e8565b60006001600160e01b031982166380ac58cd60e01b148061069a57506001600160e01b03198216635b5e139f60e01b145b806106b557506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600180546106ca9061343d565b80601f01602080910402602001604051908101604052809291908181526020018280546106f69061343d565b80156107435780601f1061071857610100808354040283529160200191610743565b820191906000526020600020905b81548152906001019060200180831161072657829003601f168201915b5050505050905090565b600061075882612280565b6107b95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610250565b506000908152600560205260409020546001600160a01b031690565b60006107e0826115c2565b9050806001600160a01b0316836001600160a01b0316141561084e5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610250565b336001600160a01b038216148061086a575061086a81336105f1565b6108dc5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610250565b6108e6838361229d565b505050565b60006108f7838361230b565b905061090281612280565b61091e5760405162461bcd60e51b8152600401610250906131af565b6000610929826115c2565b90506001600160a01b03811633146109535760405162461bcd60e51b815260040161025090613238565b600854604051636a86455960e01b815260ff80871660048301528516602482015233916001600160a01b031690636a8645599060440160006040518083038186803b1580156109a157600080fd5b505afa1580156109b5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109dd9190810190612e1b565b6000815181106109ef576109ef6134d3565b60200260200101516001600160a01b031614610a625760405162461bcd60e51b815260206004820152602c60248201527f455730393a20596f7520617265206e6f7420746865206f66666572657220696e60448201526b103837b9b4ba34b7b710181760a11b6064820152608401610250565b6008546040516318fb5f8f60e31b815260ff8087166004830152851660248201526001600160a01b039091169063c7dafc789060440160006040518083038186803b158015610ab057600080fd5b505afa158015610ac4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610aec9190810190612ec1565b600081518110610afe57610afe6134d3565b6020026020010151662386f26fc1000014610b815760405162461bcd60e51b815260206004820152603a60248201527f455730393a20546865206f6666657220696e20706f736974696f6e203020697360448201527f206e6f7420302e3031204554482061732065787065637465642e0000000000006064820152608401610250565b6008546040516352ffe50760e11b815260ff808716600483015285166024820152600060448201526001600160a01b039091169063a5ffca0e90606401600060405180830381600087803b158015610bd857600080fd5b505af1158015610bec573d6000803e3d6000fd5b505060085460405163e039e4a160e01b815260ff8089166004830152871660248201523393506001600160a01b03909116915063e039e4a19060440160206040518083038186803b158015610c4057600080fd5b505afa158015610c54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c789190612ca5565b6001600160a01b031614610d005760405162461bcd60e51b815260206004820152604360248201527f455730393a20596f752077657265206e6f74206d61646520746865206261736560448201527f2074696c65206f776e65722061732065787065637465642e205265766572746960648201526237339760e91b608482015260a401610250565b610d09826123b0565b610d1282612280565b15610d7c5760405162461bcd60e51b815260206004820152603460248201527f455730393a205468652037323120776173206e6f74206275726e65642061732060448201527332bc3832b1ba32b217102932bb32b93a34b7339760611b6064820152608401610250565b604051829033907f95ae649bfaaef9def56a52f4fb2d9e8fa5496bb7082930e442c74cc76b03dcb390600090a350505050565b6000546001600160a01b03163314610dd95760405162461bcd60e51b815260040161025090613283565b8051610dec90600b906020840190612b61565b5050565b6000610dfc838361230b565b9050610e0781612280565b610e235760405162461bcd60e51b8152600401610250906131af565b6008546040516318fb5f8f60e31b815260ff8086166004830152841660248201526000916001600160a01b03169063c7dafc789060440160006040518083038186803b158015610e7257600080fd5b505afa158015610e86573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610eae9190810190612ec1565b51905060008160ff1611610f2a5760405162461bcd60e51b815260206004820152603b60248201527f455730393a20546865206f666665722f6572732061727261797320666f72207460448201527f6869732074696c65206d757374206e6f7420626520656d7074792e00000000006064820152608401610250565b6000610f35836115c2565b90506001600160a01b0381163314610f5f5760405162461bcd60e51b815260040161025090613238565b60085460405163e039e4a160e01b815260ff80881660048301528616602482015230916001600160a01b03169063e039e4a19060440160206040518083038186803b158015610fad57600080fd5b505afa158015610fc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe59190612ca5565b6001600160a01b0316146110595760405162461bcd60e51b815260206004820152603560248201527f455730393a205468652077726170706572206d75737420626520746865206f776044820152743732b91037b3103a3432903130b9b2903a34b6329760591b6064820152608401610250565b600854604051636a86455960e01b815260ff8088166004830152861660248201526000916001600160a01b031690636a8645599060440160006040518083038186803b1580156110a857600080fd5b505afa1580156110bc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110e49190810190612e1b565b6000815181106110f6576110f66134d3565b60209081029190910101516008546040516318fb5f8f60e31b815260ff808a166004830152881660248201529192506000916001600160a01b039091169063c7dafc789060440160006040518083038186803b15801561115557600080fd5b505afa158015611169573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111919190810190612ec1565b6000815181106111a3576111a36134d3565b60209081029190910101516008546040516329c4c20760e21b815260ff808b16600483015289166024820152600060448201529192506001600160a01b03169063a713081c90606401600060405180830381600087803b15801561120657600080fd5b505af115801561121a573d6000803e3d6000fd5b5050505060018461122b91906133ee565b6008546040516318fb5f8f60e31b815260ff8a81166004830152898116602483015292909216916001600160a01b039091169063c7dafc789060440160006040518083038186803b15801561127f57600080fd5b505afa158015611293573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112bb9190810190612ec1565b511461133d5760405162461bcd60e51b8152602060048201526044602482018190527f455730393a204f6666657273206172726179206d7573742062652031206c6573908201527f73207468616e206265666f72652e204974206973206e6f742e2052657665727460648201526334b7339760e11b608482015260a401610250565b604080518281526001600160a01b0384166020820152869133917fbd9a5db408777ca146c18dbdaa3fdead0f84637f56abe4f3ba590c2c4d786c2e910160405180910390a350505050505050565b611395338261244b565b6113b15760405162461bcd60e51b8152600401610250906132b8565b6108e6838383612535565b6000546001600160a01b031633146113e65760405162461bcd60e51b815260040161025090613283565b8051610dec90600a906020840190612b61565b6108e683838360405180602001604052806000815250612085565b600080611421848461230b565b6000908152600960205260409020546001600160a01b0316949350505050565b600061144d848461230b565b905061145881612280565b6114745760405162461bcd60e51b8152600401610250906131af565b600061147f826115c2565b90506001600160a01b03811633146114a95760405162461bcd60e51b815260040161025090613238565b3467016345785d8a0000146115115760405162461bcd60e51b815260206004820152602860248201527f455730393a20497420636f73747320302e312045544820746f206368616e67656044820152671039ba30ba3ab99760c11b6064820152608401610250565b600854604051632a1c2a9360e11b81526001600160a01b0390911690635438552690349061154790899089908990600401613309565b6000604051808303818588803b15801561156057600080fd5b505af1158015611574573d6000803e3d6000fd5b505050505081336001600160a01b03167f7ae797a5c5147dcb50947fce8be08662a4e9f5716bcab599a5e2d9894709930b856040516115b3919061319c565b60405180910390a35050505050565b6000818152600360205260408120546001600160a01b0316806106b55760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610250565b6000611645838361230b565b60085460405163e039e4a160e01b815260ff80871660048301528516602482015291925033916001600160a01b039091169063e039e4a19060440160206040518083038186803b15801561169857600080fd5b505afa1580156116ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d09190612ca5565b6001600160a01b03161461174c5760405162461bcd60e51b815260206004820152603f60248201527f455730393a20596f75206d757374206265207468652074696c65206f776e657260448201527f20746f20737461727420746865207772617070696e672070726f636573732e006064820152608401610250565b6008546040516318fb5f8f60e31b815260ff8086166004830152841660248201526001600160a01b039091169063c7dafc789060440160006040518083038186803b15801561179a57600080fd5b505afa1580156117ae573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117d69190810190612ec1565b511561185d5760405162461bcd60e51b815260206004820152604a60248201527f455730393a20546865206f666665722f6572732061727261797320666f72207460448201527f6869732074696c65206d75737420626520656d7074792e2052656a656374206160648201526936361037b33332b9399760b11b608482015260a401610250565b34662386f26fc10000146118d95760405162461bcd60e51b815260206004820152603860248201527f455730393a20596f75206d75737420737570706c792065786163746c7920302e60448201527f30312045544820746f20746869732066756e6374696f6e2e00000000000000006064820152608401610250565b600854604051631899ad4560e21b815260ff8086166004830152841660248201526001600160a01b0390911690636266b5149034906044016000604051808303818588803b15801561192a57600080fd5b505af115801561193e573d6000803e3d6000fd5b5050600854604051636a86455960e01b815260ff8089166004830152871660248201523094506001600160a01b039091169250636a864559915060440160006040518083038186803b15801561199357600080fd5b505afa1580156119a7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119cf9190810190612e1b565b6000815181106119e1576119e16134d3565b60200260200101516001600160a01b031614611a655760405162461bcd60e51b815260206004820152603f60248201527f455730393a20546865206f66666572657220696e20706f736974696f6e20302060448201527f73686f756c642062652074686973207772617070657220616464726573732e006064820152608401610250565b6008546040516318fb5f8f60e31b815260ff8086166004830152841660248201526001600160a01b039091169063c7dafc789060440160006040518083038186803b158015611ab357600080fd5b505afa158015611ac7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611aef9190810190612ec1565b600081518110611b0157611b016134d3565b6020026020010151662386f26fc1000014611b785760405162461bcd60e51b815260206004820152603160248201527f455730393a20546865206f6666657220696e20706f736974696f6e203020736860448201527037bab63210313290181718189022aa241760791b6064820152608401610250565b60008181526009602052604080822080546001600160a01b03191633908117909155905183927fbbbe6b1e878619266ad669ec014b7df730791e7918756261d6d697eadb258ab391a3505050565b60006001600160a01b038216611c315760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610250565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b03163314611c775760405162461bcd60e51b815260040161025090613283565b611c8160006126d1565b565b6000611c8f838361230b565b6000818152600960205260409020549091506001600160a01b03163314611d3b5760405162461bcd60e51b815260206004820152605460248201527f455730393a20596f7520617265206e6f74207468652077726170496e6974696160448201527f6c697a657220666f7220746869732074696c652e2043616c6c206d616b654f666064820152733332b92b34b0abb930b83832b9103334b939ba1760611b608482015260a401610250565b60085460405163e039e4a160e01b815260ff80861660048301528416602482015230916001600160a01b03169063e039e4a19060440160206040518083038186803b158015611d8957600080fd5b505afa158015611d9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc19190612ca5565b6001600160a01b031614611e935760405162461bcd60e51b815260206004820152608160248201527f455730393a2054696c65206973206e6f7420796574206f776e6564206279207460448201527f68697320777261707065722e2043616c6c20657468657269612e61636365707460648201527f4f6666657220746f2067697665207468652077726170706572206f776e65727360848201527f6869702c207468656e2066696e6973685772617020746f20636f6d706c65746560a4820152601760f91b60c482015260e401610250565b611e9d3382612721565b611ea681612280565b611f185760405162461bcd60e51b815260206004820152603c60248201527f455730393a2037323120776173206e6f7420637265617465642061732069742060448201527f73686f756c642068617665206265656e2e20526576657274696e672e000000006064820152608401610250565b60008181526009602052604080822080546001600160a01b031916905551829133917f3cf906ed50bffa98a7d8755ae34ab2349dfd013d68b710b5b30f77ec6c8f7dea9190a3505050565b6000611f6f848461230b565b9050611f7a81612280565b611f965760405162461bcd60e51b8152600401610250906131af565b6000611fa1826115c2565b90506001600160a01b0381163314611fcb5760405162461bcd60e51b815260040161025090613238565b6008546040516393eec1fb60e01b81526001600160a01b03909116906393eec1fb90611fff90889088908890600401613309565b600060405180830381600087803b15801561201957600080fd5b505af115801561202d573d6000803e3d6000fd5b5050505081336001600160a01b03167ff5d76516762cab8f8daa08297b6fcc80c203c570bc87f74ec3e77952d625d94b856040516115b3919061319c565b6060600280546106ca9061343d565b610dec338383612854565b61208f338361244b565b6120ab5760405162461bcd60e51b8152600401610250906132b8565b6120b784848484612923565b50505050565b6060600a6120ca83612956565b600b6040516020016120de9392919061312c565b6040516020818303038152906040529050919050565b600a80546121019061343d565b80601f016020809104026020016040519081016040528092919081815260200182805461212d9061343d565b801561217a5780601f1061214f5761010080835404028352916020019161217a565b820191906000526020600020905b81548152906001019060200180831161215d57829003601f168201915b505050505081565b600b80546121019061343d565b6000546001600160a01b031633146121b95760405162461bcd60e51b815260040161025090613283565b60405133904780156108fc02916000818181858888f193505050501580156121e5573d6000803e3d6000fd5b50565b6000546001600160a01b031633146122125760405162461bcd60e51b815260040161025090613283565b6001600160a01b0381166122775760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610250565b6121e5816126d1565b6000908152600360205260409020546001600160a01b0316151590565b600081815260056020526040902080546001600160a01b0319166001600160a01b03841690811790915581906122d2826115c2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000602060ff8416118015906123255750602060ff831611155b61238b5760405162461bcd60e51b815260206004820152603160248201527f455730393a20496e76616c696420636f6c20616e642f6f7220726f772e2056616044820152703634b2103930b733b29034b9901816999960791b6064820152608401610250565b8160ff1660218460ff1661239f91906133b8565b6123a9919061338c565b9392505050565b60006123bb826115c2565b90506123c860008361229d565b6001600160a01b03811660009081526004602052604081208054600192906123f19084906133d7565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600061245682612280565b6124b75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610250565b60006124c2836115c2565b9050806001600160a01b0316846001600160a01b031614806124fd5750836001600160a01b03166124f28461074d565b6001600160a01b0316145b8061252d57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316612548826115c2565b6001600160a01b0316146125ac5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610250565b6001600160a01b03821661260e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610250565b61261960008261229d565b6001600160a01b03831660009081526004602052604081208054600192906126429084906133d7565b90915550506001600160a01b038216600090815260046020526040812080546001929061267090849061338c565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0382166127775760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610250565b61278081612280565b156127cd5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610250565b6001600160a01b03821660009081526004602052604081208054600192906127f690849061338c565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b816001600160a01b0316836001600160a01b031614156128b65760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610250565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61292e848484612535565b61293a84848484612a54565b6120b75760405162461bcd60e51b8152600401610250906131e6565b60608161297a5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156129a4578061298e81613478565b915061299d9050600a836133a4565b915061297e565b60008167ffffffffffffffff8111156129bf576129bf6134e9565b6040519080825280601f01601f1916602001820160405280156129e9576020820181803683370190505b5090505b841561252d576129fe6001836133d7565b9150612a0b600a86613493565b612a1690603061338c565b60f81b818381518110612a2b57612a2b6134d3565b60200101906001600160f81b031916908160001a905350612a4d600a866133a4565b94506129ed565b60006001600160a01b0384163b15612b5657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612a9890339089908890889060040161315f565b602060405180830381600087803b158015612ab257600080fd5b505af1925050508015612ae2575060408051601f3d908101601f19168201909252612adf91810190612f6a565b60015b612b3c573d808015612b10576040519150601f19603f3d011682016040523d82523d6000602084013e612b15565b606091505b508051612b345760405162461bcd60e51b8152600401610250906131e6565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061252d565b506001949350505050565b828054612b6d9061343d565b90600052602060002090601f016020900481019282612b8f5760008555612bd5565b82601f10612ba857805160ff1916838001178555612bd5565b82800160010185558215612bd5579182015b82811115612bd5578251825591602001919060010190612bba565b50612be1929150612be5565b5090565b5b80821115612be15760008155600101612be6565b600067ffffffffffffffff831115612c1457612c146134e9565b612c27601f8401601f1916602001613337565b9050828152838383011115612c3b57600080fd5b828260208301376000602084830101529392505050565b600082601f830112612c6357600080fd5b6123a983833560208501612bfa565b803560ff81168114612c8357600080fd5b919050565b600060208284031215612c9a57600080fd5b81356123a9816134ff565b600060208284031215612cb757600080fd5b81516123a9816134ff565b60008060408385031215612cd557600080fd5b8235612ce0816134ff565b91506020830135612cf0816134ff565b809150509250929050565b600080600060608486031215612d1057600080fd5b8335612d1b816134ff565b92506020840135612d2b816134ff565b929592945050506040919091013590565b60008060008060808587031215612d5257600080fd5b8435612d5d816134ff565b93506020850135612d6d816134ff565b925060408501359150606085013567ffffffffffffffff811115612d9057600080fd5b8501601f81018713612da157600080fd5b612db087823560208401612bfa565b91505092959194509250565b60008060408385031215612dcf57600080fd5b8235612dda816134ff565b915060208301358015158114612cf057600080fd5b60008060408385031215612e0257600080fd5b8235612e0d816134ff565b946020939093013593505050565b60006020808385031215612e2e57600080fd5b825167ffffffffffffffff811115612e4557600080fd5b8301601f81018513612e5657600080fd5b8051612e69612e6482613368565b613337565b80828252848201915084840188868560051b8701011115612e8957600080fd5b600094505b83851015612eb5578051612ea1816134ff565b835260019490940193918501918501612e8e565b50979650505050505050565b60006020808385031215612ed457600080fd5b825167ffffffffffffffff811115612eeb57600080fd5b8301601f81018513612efc57600080fd5b8051612f0a612e6482613368565b80828252848201915084840188868560051b8701011115612f2a57600080fd5b600094505b83851015612eb5578051835260019490940193918501918501612f2f565b600060208284031215612f5f57600080fd5b81356123a981613514565b600060208284031215612f7c57600080fd5b81516123a981613514565b600060208284031215612f9957600080fd5b813567ffffffffffffffff811115612fb057600080fd5b61252d84828501612c52565b600060208284031215612fce57600080fd5b5035919050565b60008060408385031215612fe857600080fd5b612ff183612c72565b9150612fff60208401612c72565b90509250929050565b60008060006060848603121561301d57600080fd5b61302684612c72565b925061303460208501612c72565b9150604084013567ffffffffffffffff81111561305057600080fd5b61305c86828701612c52565b9150509250925092565b6000815180845261307e816020860160208601613411565b601f01601f19169290920160200192915050565b8054600090600181811c90808316806130ac57607f831692505b60208084108214156130ce57634e487b7160e01b600052602260045260246000fd5b8180156130e257600181146130f357613120565b60ff19861689528489019650613120565b60008881526020902060005b868110156131185781548b8201529085019083016130ff565b505084890196505b50505050505092915050565b60006131388286613092565b8451613148818360208901613411565b61315481830186613092565b979650505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061319290830184613066565b9695505050505050565b6020815260006123a96020830184613066565b6020808252601e908201527f455730393a20546861742037323120646f6573206e6f742065786973742e0000604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602b908201527f455730393a20596f75206d75737420626520746865203732312d6f776e65724f60408201526a33103a3432903a34b6329760a91b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60ff8416815260ff8316602082015260606040820152600061332e6060830184613066565b95945050505050565b604051601f8201601f1916810167ffffffffffffffff81118282101715613360576133606134e9565b604052919050565b600067ffffffffffffffff821115613382576133826134e9565b5060051b60200190565b6000821982111561339f5761339f6134a7565b500190565b6000826133b3576133b36134bd565b500490565b60008160001904831182151516156133d2576133d26134a7565b500290565b6000828210156133e9576133e96134a7565b500390565b600060ff821660ff841680821015613408576134086134a7565b90039392505050565b60005b8381101561342c578181015183820152602001613414565b838111156120b75750506000910152565b600181811c9082168061345157607f821691505b6020821081141561347257634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561348c5761348c6134a7565b5060010190565b6000826134a2576134a26134bd565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146121e557600080fd5b6001600160e01b0319811681146121e557600080fdfea264697066735822122073b7738c14bb331972b84747c510b338d326b97e7b29f9946b9bff8df7e7a8ff64736f6c6343000807003368747470733a2f2f657468657269612e776f726c642f6d657461646174612f76307074392f

Deployed Bytecode

0x6080604052600436106101dc5760003560e01c8063695d783211610102578063a22cb46511610095578063e985e9c511610064578063e985e9c5146105d6578063ec3408261461061f578063f2a75fe414610634578063f2fde38b1461064957600080fd5b8063a22cb46514610561578063b88d4fde14610581578063c87b56dd146105a1578063cfc86f7b146105c157600080fd5b80637b0cf1ef116100d15780637b0cf1ef146104d85780638da5cb5b146104f857806395d89b411461051657806398caef281461052b57600080fd5b8063695d78321461046257806370a0823114610475578063715018a6146104a357806373292671146104b857600080fd5b80632155abf51161017a5780634abc2fec116101495780634abc2fec146103ef5780635502e1481461040f5780635e0b0092146104225780636352211e1461044257600080fd5b80632155abf51461036f57806323b872dd1461038f57806330176e13146103af57806342842e0e146103cf57600080fd5b8063095ea7b3116101b6578063095ea7b3146102ef5780630cd5188f1461030f578063147c07181461032f5780632067c8e51461034f57600080fd5b806301ffc9a71461026057806306fdde0314610295578063081812fc146102b757600080fd5b3661025b576007546001600160a01b0316336001600160a01b0316146102595760405162461bcd60e51b815260206004820152602760248201527f455730393a204554482073656e6465722069736e2774204574686572696120636044820152661bdb9d1c9858dd60ca1b60648201526084015b60405180910390fd5b005b600080fd5b34801561026c57600080fd5b5061028061027b366004612f4d565b610669565b60405190151581526020015b60405180910390f35b3480156102a157600080fd5b506102aa6106bb565b60405161028c919061319c565b3480156102c357600080fd5b506102d76102d2366004612fbc565b61074d565b6040516001600160a01b03909116815260200161028c565b3480156102fb57600080fd5b5061025961030a366004612def565b6107d5565b34801561031b57600080fd5b5061025961032a366004612fd5565b6108eb565b34801561033b57600080fd5b5061025961034a366004612f87565b610daf565b34801561035b57600080fd5b5061025961036a366004612fd5565b610df0565b34801561037b57600080fd5b506008546102d7906001600160a01b031681565b34801561039b57600080fd5b506102596103aa366004612cfb565b61138b565b3480156103bb57600080fd5b506102596103ca366004612f87565b6113bc565b3480156103db57600080fd5b506102596103ea366004612cfb565b6113f9565b3480156103fb57600080fd5b506102d761040a366004612fd5565b611414565b61025961041d366004613008565b611441565b34801561042e57600080fd5b506007546102d7906001600160a01b031681565b34801561044e57600080fd5b506102d761045d366004612fbc565b6115c2565b610259610470366004612fd5565b611639565b34801561048157600080fd5b50610495610490366004612c88565b611bc6565b60405190815260200161028c565b3480156104af57600080fd5b50610259611c4d565b3480156104c457600080fd5b506102596104d3366004612fd5565b611c83565b3480156104e457600080fd5b506102596104f3366004613008565b611f63565b34801561050457600080fd5b506000546001600160a01b03166102d7565b34801561052257600080fd5b506102aa61206b565b34801561053757600080fd5b506102d7610546366004612fbc565b6009602052600090815260409020546001600160a01b031681565b34801561056d57600080fd5b5061025961057c366004612dbc565b61207a565b34801561058d57600080fd5b5061025961059c366004612d3c565b612085565b3480156105ad57600080fd5b506102aa6105bc366004612fbc565b6120bd565b3480156105cd57600080fd5b506102aa6120f4565b3480156105e257600080fd5b506102806105f1366004612cc2565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561062b57600080fd5b506102aa612182565b34801561064057600080fd5b5061025961218f565b34801561065557600080fd5b50610259610664366004612c88565b6121e8565b60006001600160e01b031982166380ac58cd60e01b148061069a57506001600160e01b03198216635b5e139f60e01b145b806106b557506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600180546106ca9061343d565b80601f01602080910402602001604051908101604052809291908181526020018280546106f69061343d565b80156107435780601f1061071857610100808354040283529160200191610743565b820191906000526020600020905b81548152906001019060200180831161072657829003601f168201915b5050505050905090565b600061075882612280565b6107b95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610250565b506000908152600560205260409020546001600160a01b031690565b60006107e0826115c2565b9050806001600160a01b0316836001600160a01b0316141561084e5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610250565b336001600160a01b038216148061086a575061086a81336105f1565b6108dc5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610250565b6108e6838361229d565b505050565b60006108f7838361230b565b905061090281612280565b61091e5760405162461bcd60e51b8152600401610250906131af565b6000610929826115c2565b90506001600160a01b03811633146109535760405162461bcd60e51b815260040161025090613238565b600854604051636a86455960e01b815260ff80871660048301528516602482015233916001600160a01b031690636a8645599060440160006040518083038186803b1580156109a157600080fd5b505afa1580156109b5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109dd9190810190612e1b565b6000815181106109ef576109ef6134d3565b60200260200101516001600160a01b031614610a625760405162461bcd60e51b815260206004820152602c60248201527f455730393a20596f7520617265206e6f7420746865206f66666572657220696e60448201526b103837b9b4ba34b7b710181760a11b6064820152608401610250565b6008546040516318fb5f8f60e31b815260ff8087166004830152851660248201526001600160a01b039091169063c7dafc789060440160006040518083038186803b158015610ab057600080fd5b505afa158015610ac4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610aec9190810190612ec1565b600081518110610afe57610afe6134d3565b6020026020010151662386f26fc1000014610b815760405162461bcd60e51b815260206004820152603a60248201527f455730393a20546865206f6666657220696e20706f736974696f6e203020697360448201527f206e6f7420302e3031204554482061732065787065637465642e0000000000006064820152608401610250565b6008546040516352ffe50760e11b815260ff808716600483015285166024820152600060448201526001600160a01b039091169063a5ffca0e90606401600060405180830381600087803b158015610bd857600080fd5b505af1158015610bec573d6000803e3d6000fd5b505060085460405163e039e4a160e01b815260ff8089166004830152871660248201523393506001600160a01b03909116915063e039e4a19060440160206040518083038186803b158015610c4057600080fd5b505afa158015610c54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c789190612ca5565b6001600160a01b031614610d005760405162461bcd60e51b815260206004820152604360248201527f455730393a20596f752077657265206e6f74206d61646520746865206261736560448201527f2074696c65206f776e65722061732065787065637465642e205265766572746960648201526237339760e91b608482015260a401610250565b610d09826123b0565b610d1282612280565b15610d7c5760405162461bcd60e51b815260206004820152603460248201527f455730393a205468652037323120776173206e6f74206275726e65642061732060448201527332bc3832b1ba32b217102932bb32b93a34b7339760611b6064820152608401610250565b604051829033907f95ae649bfaaef9def56a52f4fb2d9e8fa5496bb7082930e442c74cc76b03dcb390600090a350505050565b6000546001600160a01b03163314610dd95760405162461bcd60e51b815260040161025090613283565b8051610dec90600b906020840190612b61565b5050565b6000610dfc838361230b565b9050610e0781612280565b610e235760405162461bcd60e51b8152600401610250906131af565b6008546040516318fb5f8f60e31b815260ff8086166004830152841660248201526000916001600160a01b03169063c7dafc789060440160006040518083038186803b158015610e7257600080fd5b505afa158015610e86573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610eae9190810190612ec1565b51905060008160ff1611610f2a5760405162461bcd60e51b815260206004820152603b60248201527f455730393a20546865206f666665722f6572732061727261797320666f72207460448201527f6869732074696c65206d757374206e6f7420626520656d7074792e00000000006064820152608401610250565b6000610f35836115c2565b90506001600160a01b0381163314610f5f5760405162461bcd60e51b815260040161025090613238565b60085460405163e039e4a160e01b815260ff80881660048301528616602482015230916001600160a01b03169063e039e4a19060440160206040518083038186803b158015610fad57600080fd5b505afa158015610fc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe59190612ca5565b6001600160a01b0316146110595760405162461bcd60e51b815260206004820152603560248201527f455730393a205468652077726170706572206d75737420626520746865206f776044820152743732b91037b3103a3432903130b9b2903a34b6329760591b6064820152608401610250565b600854604051636a86455960e01b815260ff8088166004830152861660248201526000916001600160a01b031690636a8645599060440160006040518083038186803b1580156110a857600080fd5b505afa1580156110bc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110e49190810190612e1b565b6000815181106110f6576110f66134d3565b60209081029190910101516008546040516318fb5f8f60e31b815260ff808a166004830152881660248201529192506000916001600160a01b039091169063c7dafc789060440160006040518083038186803b15801561115557600080fd5b505afa158015611169573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111919190810190612ec1565b6000815181106111a3576111a36134d3565b60209081029190910101516008546040516329c4c20760e21b815260ff808b16600483015289166024820152600060448201529192506001600160a01b03169063a713081c90606401600060405180830381600087803b15801561120657600080fd5b505af115801561121a573d6000803e3d6000fd5b5050505060018461122b91906133ee565b6008546040516318fb5f8f60e31b815260ff8a81166004830152898116602483015292909216916001600160a01b039091169063c7dafc789060440160006040518083038186803b15801561127f57600080fd5b505afa158015611293573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112bb9190810190612ec1565b511461133d5760405162461bcd60e51b8152602060048201526044602482018190527f455730393a204f6666657273206172726179206d7573742062652031206c6573908201527f73207468616e206265666f72652e204974206973206e6f742e2052657665727460648201526334b7339760e11b608482015260a401610250565b604080518281526001600160a01b0384166020820152869133917fbd9a5db408777ca146c18dbdaa3fdead0f84637f56abe4f3ba590c2c4d786c2e910160405180910390a350505050505050565b611395338261244b565b6113b15760405162461bcd60e51b8152600401610250906132b8565b6108e6838383612535565b6000546001600160a01b031633146113e65760405162461bcd60e51b815260040161025090613283565b8051610dec90600a906020840190612b61565b6108e683838360405180602001604052806000815250612085565b600080611421848461230b565b6000908152600960205260409020546001600160a01b0316949350505050565b600061144d848461230b565b905061145881612280565b6114745760405162461bcd60e51b8152600401610250906131af565b600061147f826115c2565b90506001600160a01b03811633146114a95760405162461bcd60e51b815260040161025090613238565b3467016345785d8a0000146115115760405162461bcd60e51b815260206004820152602860248201527f455730393a20497420636f73747320302e312045544820746f206368616e67656044820152671039ba30ba3ab99760c11b6064820152608401610250565b600854604051632a1c2a9360e11b81526001600160a01b0390911690635438552690349061154790899089908990600401613309565b6000604051808303818588803b15801561156057600080fd5b505af1158015611574573d6000803e3d6000fd5b505050505081336001600160a01b03167f7ae797a5c5147dcb50947fce8be08662a4e9f5716bcab599a5e2d9894709930b856040516115b3919061319c565b60405180910390a35050505050565b6000818152600360205260408120546001600160a01b0316806106b55760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610250565b6000611645838361230b565b60085460405163e039e4a160e01b815260ff80871660048301528516602482015291925033916001600160a01b039091169063e039e4a19060440160206040518083038186803b15801561169857600080fd5b505afa1580156116ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d09190612ca5565b6001600160a01b03161461174c5760405162461bcd60e51b815260206004820152603f60248201527f455730393a20596f75206d757374206265207468652074696c65206f776e657260448201527f20746f20737461727420746865207772617070696e672070726f636573732e006064820152608401610250565b6008546040516318fb5f8f60e31b815260ff8086166004830152841660248201526001600160a01b039091169063c7dafc789060440160006040518083038186803b15801561179a57600080fd5b505afa1580156117ae573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117d69190810190612ec1565b511561185d5760405162461bcd60e51b815260206004820152604a60248201527f455730393a20546865206f666665722f6572732061727261797320666f72207460448201527f6869732074696c65206d75737420626520656d7074792e2052656a656374206160648201526936361037b33332b9399760b11b608482015260a401610250565b34662386f26fc10000146118d95760405162461bcd60e51b815260206004820152603860248201527f455730393a20596f75206d75737420737570706c792065786163746c7920302e60448201527f30312045544820746f20746869732066756e6374696f6e2e00000000000000006064820152608401610250565b600854604051631899ad4560e21b815260ff8086166004830152841660248201526001600160a01b0390911690636266b5149034906044016000604051808303818588803b15801561192a57600080fd5b505af115801561193e573d6000803e3d6000fd5b5050600854604051636a86455960e01b815260ff8089166004830152871660248201523094506001600160a01b039091169250636a864559915060440160006040518083038186803b15801561199357600080fd5b505afa1580156119a7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119cf9190810190612e1b565b6000815181106119e1576119e16134d3565b60200260200101516001600160a01b031614611a655760405162461bcd60e51b815260206004820152603f60248201527f455730393a20546865206f66666572657220696e20706f736974696f6e20302060448201527f73686f756c642062652074686973207772617070657220616464726573732e006064820152608401610250565b6008546040516318fb5f8f60e31b815260ff8086166004830152841660248201526001600160a01b039091169063c7dafc789060440160006040518083038186803b158015611ab357600080fd5b505afa158015611ac7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611aef9190810190612ec1565b600081518110611b0157611b016134d3565b6020026020010151662386f26fc1000014611b785760405162461bcd60e51b815260206004820152603160248201527f455730393a20546865206f6666657220696e20706f736974696f6e203020736860448201527037bab63210313290181718189022aa241760791b6064820152608401610250565b60008181526009602052604080822080546001600160a01b03191633908117909155905183927fbbbe6b1e878619266ad669ec014b7df730791e7918756261d6d697eadb258ab391a3505050565b60006001600160a01b038216611c315760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610250565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b03163314611c775760405162461bcd60e51b815260040161025090613283565b611c8160006126d1565b565b6000611c8f838361230b565b6000818152600960205260409020549091506001600160a01b03163314611d3b5760405162461bcd60e51b815260206004820152605460248201527f455730393a20596f7520617265206e6f74207468652077726170496e6974696160448201527f6c697a657220666f7220746869732074696c652e2043616c6c206d616b654f666064820152733332b92b34b0abb930b83832b9103334b939ba1760611b608482015260a401610250565b60085460405163e039e4a160e01b815260ff80861660048301528416602482015230916001600160a01b03169063e039e4a19060440160206040518083038186803b158015611d8957600080fd5b505afa158015611d9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc19190612ca5565b6001600160a01b031614611e935760405162461bcd60e51b815260206004820152608160248201527f455730393a2054696c65206973206e6f7420796574206f776e6564206279207460448201527f68697320777261707065722e2043616c6c20657468657269612e61636365707460648201527f4f6666657220746f2067697665207468652077726170706572206f776e65727360848201527f6869702c207468656e2066696e6973685772617020746f20636f6d706c65746560a4820152601760f91b60c482015260e401610250565b611e9d3382612721565b611ea681612280565b611f185760405162461bcd60e51b815260206004820152603c60248201527f455730393a2037323120776173206e6f7420637265617465642061732069742060448201527f73686f756c642068617665206265656e2e20526576657274696e672e000000006064820152608401610250565b60008181526009602052604080822080546001600160a01b031916905551829133917f3cf906ed50bffa98a7d8755ae34ab2349dfd013d68b710b5b30f77ec6c8f7dea9190a3505050565b6000611f6f848461230b565b9050611f7a81612280565b611f965760405162461bcd60e51b8152600401610250906131af565b6000611fa1826115c2565b90506001600160a01b0381163314611fcb5760405162461bcd60e51b815260040161025090613238565b6008546040516393eec1fb60e01b81526001600160a01b03909116906393eec1fb90611fff90889088908890600401613309565b600060405180830381600087803b15801561201957600080fd5b505af115801561202d573d6000803e3d6000fd5b5050505081336001600160a01b03167ff5d76516762cab8f8daa08297b6fcc80c203c570bc87f74ec3e77952d625d94b856040516115b3919061319c565b6060600280546106ca9061343d565b610dec338383612854565b61208f338361244b565b6120ab5760405162461bcd60e51b8152600401610250906132b8565b6120b784848484612923565b50505050565b6060600a6120ca83612956565b600b6040516020016120de9392919061312c565b6040516020818303038152906040529050919050565b600a80546121019061343d565b80601f016020809104026020016040519081016040528092919081815260200182805461212d9061343d565b801561217a5780601f1061214f5761010080835404028352916020019161217a565b820191906000526020600020905b81548152906001019060200180831161215d57829003601f168201915b505050505081565b600b80546121019061343d565b6000546001600160a01b031633146121b95760405162461bcd60e51b815260040161025090613283565b60405133904780156108fc02916000818181858888f193505050501580156121e5573d6000803e3d6000fd5b50565b6000546001600160a01b031633146122125760405162461bcd60e51b815260040161025090613283565b6001600160a01b0381166122775760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610250565b6121e5816126d1565b6000908152600360205260409020546001600160a01b0316151590565b600081815260056020526040902080546001600160a01b0319166001600160a01b03841690811790915581906122d2826115c2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000602060ff8416118015906123255750602060ff831611155b61238b5760405162461bcd60e51b815260206004820152603160248201527f455730393a20496e76616c696420636f6c20616e642f6f7220726f772e2056616044820152703634b2103930b733b29034b9901816999960791b6064820152608401610250565b8160ff1660218460ff1661239f91906133b8565b6123a9919061338c565b9392505050565b60006123bb826115c2565b90506123c860008361229d565b6001600160a01b03811660009081526004602052604081208054600192906123f19084906133d7565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600061245682612280565b6124b75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610250565b60006124c2836115c2565b9050806001600160a01b0316846001600160a01b031614806124fd5750836001600160a01b03166124f28461074d565b6001600160a01b0316145b8061252d57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316612548826115c2565b6001600160a01b0316146125ac5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610250565b6001600160a01b03821661260e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610250565b61261960008261229d565b6001600160a01b03831660009081526004602052604081208054600192906126429084906133d7565b90915550506001600160a01b038216600090815260046020526040812080546001929061267090849061338c565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0382166127775760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610250565b61278081612280565b156127cd5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610250565b6001600160a01b03821660009081526004602052604081208054600192906127f690849061338c565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b816001600160a01b0316836001600160a01b031614156128b65760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610250565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61292e848484612535565b61293a84848484612a54565b6120b75760405162461bcd60e51b8152600401610250906131e6565b60608161297a5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156129a4578061298e81613478565b915061299d9050600a836133a4565b915061297e565b60008167ffffffffffffffff8111156129bf576129bf6134e9565b6040519080825280601f01601f1916602001820160405280156129e9576020820181803683370190505b5090505b841561252d576129fe6001836133d7565b9150612a0b600a86613493565b612a1690603061338c565b60f81b818381518110612a2b57612a2b6134d3565b60200101906001600160f81b031916908160001a905350612a4d600a866133a4565b94506129ed565b60006001600160a01b0384163b15612b5657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612a9890339089908890889060040161315f565b602060405180830381600087803b158015612ab257600080fd5b505af1925050508015612ae2575060408051601f3d908101601f19168201909252612adf91810190612f6a565b60015b612b3c573d808015612b10576040519150601f19603f3d011682016040523d82523d6000602084013e612b15565b606091505b508051612b345760405162461bcd60e51b8152600401610250906131e6565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061252d565b506001949350505050565b828054612b6d9061343d565b90600052602060002090601f016020900481019282612b8f5760008555612bd5565b82601f10612ba857805160ff1916838001178555612bd5565b82800160010185558215612bd5579182015b82811115612bd5578251825591602001919060010190612bba565b50612be1929150612be5565b5090565b5b80821115612be15760008155600101612be6565b600067ffffffffffffffff831115612c1457612c146134e9565b612c27601f8401601f1916602001613337565b9050828152838383011115612c3b57600080fd5b828260208301376000602084830101529392505050565b600082601f830112612c6357600080fd5b6123a983833560208501612bfa565b803560ff81168114612c8357600080fd5b919050565b600060208284031215612c9a57600080fd5b81356123a9816134ff565b600060208284031215612cb757600080fd5b81516123a9816134ff565b60008060408385031215612cd557600080fd5b8235612ce0816134ff565b91506020830135612cf0816134ff565b809150509250929050565b600080600060608486031215612d1057600080fd5b8335612d1b816134ff565b92506020840135612d2b816134ff565b929592945050506040919091013590565b60008060008060808587031215612d5257600080fd5b8435612d5d816134ff565b93506020850135612d6d816134ff565b925060408501359150606085013567ffffffffffffffff811115612d9057600080fd5b8501601f81018713612da157600080fd5b612db087823560208401612bfa565b91505092959194509250565b60008060408385031215612dcf57600080fd5b8235612dda816134ff565b915060208301358015158114612cf057600080fd5b60008060408385031215612e0257600080fd5b8235612e0d816134ff565b946020939093013593505050565b60006020808385031215612e2e57600080fd5b825167ffffffffffffffff811115612e4557600080fd5b8301601f81018513612e5657600080fd5b8051612e69612e6482613368565b613337565b80828252848201915084840188868560051b8701011115612e8957600080fd5b600094505b83851015612eb5578051612ea1816134ff565b835260019490940193918501918501612e8e565b50979650505050505050565b60006020808385031215612ed457600080fd5b825167ffffffffffffffff811115612eeb57600080fd5b8301601f81018513612efc57600080fd5b8051612f0a612e6482613368565b80828252848201915084840188868560051b8701011115612f2a57600080fd5b600094505b83851015612eb5578051835260019490940193918501918501612f2f565b600060208284031215612f5f57600080fd5b81356123a981613514565b600060208284031215612f7c57600080fd5b81516123a981613514565b600060208284031215612f9957600080fd5b813567ffffffffffffffff811115612fb057600080fd5b61252d84828501612c52565b600060208284031215612fce57600080fd5b5035919050565b60008060408385031215612fe857600080fd5b612ff183612c72565b9150612fff60208401612c72565b90509250929050565b60008060006060848603121561301d57600080fd5b61302684612c72565b925061303460208501612c72565b9150604084013567ffffffffffffffff81111561305057600080fd5b61305c86828701612c52565b9150509250925092565b6000815180845261307e816020860160208601613411565b601f01601f19169290920160200192915050565b8054600090600181811c90808316806130ac57607f831692505b60208084108214156130ce57634e487b7160e01b600052602260045260246000fd5b8180156130e257600181146130f357613120565b60ff19861689528489019650613120565b60008881526020902060005b868110156131185781548b8201529085019083016130ff565b505084890196505b50505050505092915050565b60006131388286613092565b8451613148818360208901613411565b61315481830186613092565b979650505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061319290830184613066565b9695505050505050565b6020815260006123a96020830184613066565b6020808252601e908201527f455730393a20546861742037323120646f6573206e6f742065786973742e0000604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602b908201527f455730393a20596f75206d75737420626520746865203732312d6f776e65724f60408201526a33103a3432903a34b6329760a91b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60ff8416815260ff8316602082015260606040820152600061332e6060830184613066565b95945050505050565b604051601f8201601f1916810167ffffffffffffffff81118282101715613360576133606134e9565b604052919050565b600067ffffffffffffffff821115613382576133826134e9565b5060051b60200190565b6000821982111561339f5761339f6134a7565b500190565b6000826133b3576133b36134bd565b500490565b60008160001904831182151516156133d2576133d26134a7565b500290565b6000828210156133e9576133e96134a7565b500390565b600060ff821660ff841680821015613408576134086134a7565b90039392505050565b60005b8381101561342c578181015183820152602001613414565b838111156120b75750506000910152565b600181811c9082168061345157607f821691505b6020821081141561347257634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561348c5761348c6134a7565b5060010190565b6000826134a2576134a26134bd565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146121e557600080fd5b6001600160e01b0319811681146121e557600080fdfea264697066735822122073b7738c14bb331972b84747c510b338d326b97e7b29f9946b9bff8df7e7a8ff64736f6c63430008070033

Deployed Bytecode Sourcemap

39086:16436:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39682:15;;-1:-1:-1;;;;;39682:15:0;2883:10;-1:-1:-1;;;;;39666:31:0;;39658:83;;;;-1:-1:-1;;;39658:83:0;;23663:2:1;39658:83:0;;;23645:21:1;23702:2;23682:18;;;23675:30;23741:34;23721:18;;;23714:62;-1:-1:-1;;;23792:18:1;;;23785:37;23839:19;;39658:83:0;;;;;;;;;39086:16436;;;;;24109:305;;;;;;;;;;-1:-1:-1;24109:305:0;;;;;:::i;:::-;;:::i;:::-;;;9890:14:1;;9883:22;9865:41;;9853:2;9838:18;24109:305:0;;;;;;;;25054:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;26613:221::-;;;;;;;;;;-1:-1:-1;26613:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9188:32:1;;;9170:51;;9158:2;9143:18;26613:221:0;9024:203:1;26136:411:0;;;;;;;;;;-1:-1:-1;26136:411:0;;;;;:::i;:::-;;:::i;50977:1050::-;;;;;;;;;;-1:-1:-1;50977:1050:0;;;;;:::i;:::-;;:::i;54773:141::-;;;;;;;;;;-1:-1:-1;54773:141:0;;;;;:::i;:::-;;:::i;49123:1208::-;;;;;;;;;;-1:-1:-1;49123:1208:0;;;;;:::i;:::-;;:::i;39179:23::-;;;;;;;;;;-1:-1:-1;39179:23:0;;;;-1:-1:-1;;;;;39179:23:0;;;27363:339;;;;;;;;;;-1:-1:-1;27363:339:0;;;;;:::i;:::-;;:::i;54644:121::-;;;;;;;;;;-1:-1:-1;54644:121:0;;;;;:::i;:::-;;:::i;27773:185::-;;;;;;;;;;-1:-1:-1;27773:185:0;;;;;:::i;:::-;;:::i;44216:189::-;;;;;;;;;;-1:-1:-1;44216:189:0;;;;;:::i;:::-;;:::i;53113:627::-;;;;;;:::i;:::-;;:::i;39142:30::-;;;;;;;;;;-1:-1:-1;39142:30:0;;;;-1:-1:-1;;;;;39142:30:0;;;24748:239;;;;;;;;;;-1:-1:-1;24748:239:0;;;;;:::i;:::-;;:::i;44915:1034::-;;;;;;:::i;:::-;;:::i;24478:208::-;;;;;;;;;;-1:-1:-1;24478:208:0;;;;;:::i;:::-;;:::i;:::-;;;25695:25:1;;;25683:2;25668:18;24478:208:0;25549:177:1;4730:103:0;;;;;;;;;;;;;:::i;47302:932::-;;;;;;;;;;-1:-1:-1;47302:932:0;;;;;:::i;:::-;;:::i;52619:486::-;;;;;;;;;;-1:-1:-1;52619:486:0;;;;;:::i;:::-;;:::i;4079:87::-;;;;;;;;;;-1:-1:-1;4125:7:0;4152:6;-1:-1:-1;;;;;4152:6:0;4079:87;;25223:104;;;;;;;;;;;;;:::i;39211:52::-;;;;;;;;;;-1:-1:-1;39211:52:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;39211:52:0;;;26906:155;;;;;;;;;;-1:-1:-1;26906:155:0;;;;;:::i;:::-;;:::i;28029:328::-;;;;;;;;;;-1:-1:-1;28029:328:0;;;;;:::i;:::-;;:::i;54931:246::-;;;;;;;;;;-1:-1:-1;54931:246:0;;;;;:::i;:::-;;:::i;54567:27::-;;;;;;;;;;;;;:::i;27132:164::-;;;;;;;;;;-1:-1:-1;27132:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;27253:25:0;;;27229:4;27253:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;27132:164;54601:33;;;;;;;;;;;;;:::i;55185:334::-;;;;;;;;;;;;;:::i;4988:201::-;;;;;;;;;;-1:-1:-1;4988:201:0;;;;;:::i;:::-;;:::i;24109:305::-;24211:4;-1:-1:-1;;;;;;24248:40:0;;-1:-1:-1;;;24248:40:0;;:105;;-1:-1:-1;;;;;;;24305:48:0;;-1:-1:-1;;;24305:48:0;24248:105;:158;;;-1:-1:-1;;;;;;;;;;16972:40:0;;;24370:36;24228:178;24109:305;-1:-1:-1;;24109:305:0:o;25054:100::-;25108:13;25141:5;25134:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25054:100;:::o;26613:221::-;26689:7;26717:16;26725:7;26717;:16::i;:::-;26709:73;;;;-1:-1:-1;;;26709:73:0;;22476:2:1;26709:73:0;;;22458:21:1;22515:2;22495:18;;;22488:30;22554:34;22534:18;;;22527:62;-1:-1:-1;;;22605:18:1;;;22598:42;22657:19;;26709:73:0;22274:408:1;26709:73:0;-1:-1:-1;26802:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;26802:24:0;;26613:221::o;26136:411::-;26217:13;26233:23;26248:7;26233:14;:23::i;:::-;26217:39;;26281:5;-1:-1:-1;;;;;26275:11:0;:2;-1:-1:-1;;;;;26275:11:0;;;26267:57;;;;-1:-1:-1;;;26267:57:0;;24071:2:1;26267:57:0;;;24053:21:1;24110:2;24090:18;;;24083:30;24149:34;24129:18;;;24122:62;-1:-1:-1;;;24200:18:1;;;24193:31;24241:19;;26267:57:0;23869:397:1;26267:57:0;2883:10;-1:-1:-1;;;;;26359:21:0;;;;:62;;-1:-1:-1;26384:37:0;26401:5;2883:10;27132:164;:::i;26384:37::-;26337:168;;;;-1:-1:-1;;;26337:168:0;;19539:2:1;26337:168:0;;;19521:21:1;19578:2;19558:18;;;19551:30;19617:34;19597:18;;;19590:62;19688:26;19668:18;;;19661:54;19732:19;;26337:168:0;19337:420:1;26337:168:0;26518:21;26527:2;26531:7;26518:8;:21::i;:::-;26206:341;26136:411;;:::o;50977:1050::-;51050:19;51072;51082:3;51087;51072:9;:19::i;:::-;51050:41;;51110:20;51118:11;51110:7;:20::i;:::-;51102:63;;;;-1:-1:-1;;;51102:63:0;;;;;;;:::i;:::-;51176:13;51192:27;51207:11;51192:14;:27::i;:::-;51176:43;-1:-1:-1;;;;;;51238:19:0;;51247:10;51238:19;51230:75;;;;-1:-1:-1;;;51230:75:0;;;;;;;:::i;:::-;51324:8;;:29;;-1:-1:-1;;;51324:29:0;;26206:4:1;26194:17;;;51324:29:0;;;26176:36:1;26248:17;;26228:18;;;26221:45;51360:10:0;;-1:-1:-1;;;;;51324:8:0;;:20;;26149:18:1;;51324:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51324:29:0;;;;;;;;;;;;:::i;:::-;51354:1;51324:32;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;51324:46:0;;51316:103;;;;-1:-1:-1;;;51316:103:0;;23250:2:1;51316:103:0;;;23232:21:1;23289:2;23269:18;;;23262:30;23328:34;23308:18;;;23301:62;-1:-1:-1;;;23379:18:1;;;23372:42;23431:19;;51316:103:0;23048:408:1;51316:103:0;51438:8;;:27;;-1:-1:-1;;;51438:27:0;;26206:4:1;26194:17;;;51438:27:0;;;26176:36:1;26248:17;;26228:18;;;26221:45;-1:-1:-1;;;;;51438:8:0;;;;:18;;26149::1;;51438:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51438:27:0;;;;;;;;;;;;:::i;:::-;51466:1;51438:30;;;;;;;;:::i;:::-;;;;;;;51472:17;51438:51;51430:122;;;;-1:-1:-1;;;51430:122:0;;16175:2:1;51430:122:0;;;16157:21:1;16214:2;16194:18;;;16187:30;16253:34;16233:18;;;16226:62;16324:28;16304:18;;;16297:56;16370:19;;51430:122:0;15973:422:1;51430:122:0;51563:8;;:33;;-1:-1:-1;;;51563:33:0;;26507:4:1;26495:17;;;51563:33:0;;;26477:36:1;26549:17;;26529:18;;;26522:45;51563:8:0;26583:18:1;;;26576:45;-1:-1:-1;;;;;51563:8:0;;;;:20;;26450:18:1;;51563:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51696:8:0;;:26;;-1:-1:-1;;;51696:26:0;;26206:4:1;26194:17;;;51696:26:0;;;26176:36:1;26248:17;;26228:18;;;26221:45;51726:10:0;;-1:-1:-1;;;;;;51696:8:0;;;;-1:-1:-1;51696:17:0;;26149:18:1;;51696:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;51696:40:0;;51688:120;;;;-1:-1:-1;;;51688:120:0;;21207:2:1;51688:120:0;;;21189:21:1;21246:2;21226:18;;;21219:30;21285:34;21265:18;;;21258:62;21356:34;21336:18;;;21329:62;-1:-1:-1;;;21407:19:1;;;21400:34;21451:19;;51688:120:0;21005:471:1;51688:120:0;51819:18;51825:11;51819:5;:18::i;:::-;51857:20;51865:11;51857:7;:20::i;:::-;51856:21;51848:86;;;;-1:-1:-1;;;51848:86:0;;14172:2:1;51848:86:0;;;14154:21:1;14211:2;14191:18;;;14184:30;14250:34;14230:18;;;14223:62;-1:-1:-1;;;14301:18:1;;;14294:50;14361:19;;51848:86:0;13970:416:1;51848:86:0;51950:34;;51972:11;;51960:10;;51950:34;;;;;51039:988;;50977:1050;;:::o;54773:141::-;4125:7;4152:6;-1:-1:-1;;;;;4152:6:0;2883:10;4299:23;4291:68;;;;-1:-1:-1;;;4291:68:0;;;;;;;:::i;:::-;54864:42;;::::1;::::0;:19:::1;::::0;:42:::1;::::0;::::1;::::0;::::1;:::i;:::-;;54773:141:::0;:::o;49123:1208::-;49197:19;49219;49229:3;49234;49219:9;:19::i;:::-;49197:41;;49257:20;49265:11;49257:7;:20::i;:::-;49249:63;;;;-1:-1:-1;;;49249:63:0;;;;;;;:::i;:::-;49350:8;;:27;;-1:-1:-1;;;49350:27:0;;26206:4:1;26194:17;;;49350:27:0;;;26176:36:1;26248:17;;26228:18;;;26221:45;49323:18:0;;-1:-1:-1;;;;;49350:8:0;;:18;;26149::1;;49350:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49350:27:0;;;;;;;;;;;;:::i;:::-;:34;49323:62;;49444:1;49429:12;:16;;;49421:88;;;;-1:-1:-1;;;49421:88:0;;24473:2:1;49421:88:0;;;24455:21:1;24512:2;24492:18;;;24485:30;24551:34;24531:18;;;24524:62;24622:29;24602:18;;;24595:57;24669:19;;49421:88:0;24271:423:1;49421:88:0;49520:13;49536:27;49551:11;49536:14;:27::i;:::-;49520:43;-1:-1:-1;;;;;;49582:19:0;;49591:10;49582:19;49574:75;;;;-1:-1:-1;;;49574:75:0;;;;;;;:::i;:::-;49668:8;;:26;;-1:-1:-1;;;49668:26:0;;26206:4:1;26194:17;;;49668:26:0;;;26176:36:1;26248:17;;26228:18;;;26221:45;49706:4:0;;-1:-1:-1;;;;;49668:8:0;;:17;;26149:18:1;;49668:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;49668:43:0;;49660:109;;;;-1:-1:-1;;;49660:109:0;;20785:2:1;49660:109:0;;;20767:21:1;20824:2;20804:18;;;20797:30;20863:34;20843:18;;;20836:62;-1:-1:-1;;;20914:18:1;;;20907:51;20975:19;;49660:109:0;20583:417:1;49660:109:0;49798:8;;:29;;-1:-1:-1;;;49798:29:0;;26206:4:1;26194:17;;;49798:29:0;;;26176:36:1;26248:17;;26228:18;;;26221:45;49780:15:0;;-1:-1:-1;;;;;49798:8:0;;:20;;26149:18:1;;49798:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49798:29:0;;;;;;;;;;;;:::i;:::-;49828:1;49798:32;;;;;;;;:::i;:::-;;;;;;;;;;;49898:8;;:27;;-1:-1:-1;;;49898:27:0;;26206:4:1;26194:17;;;49898:27:0;;;26176:36:1;26248:17;;26228:18;;;26221:45;49798:32:0;;-1:-1:-1;49885:10:0;;-1:-1:-1;;;;;49898:8:0;;;;:18;;26149::1;;49898:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49898:27:0;;;;;;;;;;;;:::i;:::-;49926:1;49898:30;;;;;;;;:::i;:::-;;;;;;;;;;;49939:8;;:31;;-1:-1:-1;;;49939:31:0;;26507:4:1;26495:17;;;49939:31:0;;;26477:36:1;26549:17;;26529:18;;;26522:45;49939:8:0;26583:18:1;;;26576:45;49898:30:0;;-1:-1:-1;;;;;;49939:8:0;;:20;;26450:18:1;;49939:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50110:1;50097:12;:14;;;;:::i;:::-;50058:8;;:27;;-1:-1:-1;;;50058:27:0;;:54;26194:17:1;;;50058:27:0;;;26176:36:1;26248:17;;;26228:18;;;26221:45;50058:54:0;;;;;-1:-1:-1;;;;;50058:8:0;;;;:18;;26149::1;;50058:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;50058:27:0;;;;;;;;;;;;:::i;:::-;:34;:54;50050:135;;;;-1:-1:-1;;;50050:135:0;;11397:2:1;50050:135:0;;;11379:21:1;11436:2;11416:18;;;11409:30;;;11475:34;11455:18;;;11448:62;11546:34;11526:18;;;11519:62;-1:-1:-1;;;11597:19:1;;;11590:35;11642:19;;50050:135:0;11195:472:1;50050:135:0;50201:54;;;25905:25:1;;;-1:-1:-1;;;;;25966:32:1;;25961:2;25946:18;;25939:60;50227:11:0;;50215:10;;50201:54;;25878:18:1;50201:54:0;;;;;;;49185:1146;;;;;49123:1208;;:::o;27363:339::-;27558:41;2883:10;27591:7;27558:18;:41::i;:::-;27550:103;;;;-1:-1:-1;;;27550:103:0;;;;;;;:::i;:::-;27666:28;27676:4;27682:2;27686:7;27666:9;:28::i;54644:121::-;4125:7;4152:6;-1:-1:-1;;;;;4152:6:0;2883:10;4299:23;4291:68;;;;-1:-1:-1;;;4291:68:0;;;;;;;:::i;:::-;54727:30;;::::1;::::0;:13:::1;::::0;:30:::1;::::0;::::1;::::0;::::1;:::i;27773:185::-:0;27911:39;27928:4;27934:2;27938:7;27911:39;;;;;;;;;;;;:16;:39::i;44216:189::-;44289:7;44309:19;44331;44341:3;44346;44331:9;:19::i;:::-;44368:29;;;;:16;:29;;;;;;-1:-1:-1;;;;;44368:29:0;;44216:189;-1:-1:-1;;;;44216:189:0:o;53113:627::-;53210:19;53232;53242:3;53247;53232:9;:19::i;:::-;53210:41;;53270:20;53278:11;53270:7;:20::i;:::-;53262:63;;;;-1:-1:-1;;;53262:63:0;;;;;;;:::i;:::-;53336:13;53352:27;53367:11;53352:14;:27::i;:::-;53336:43;-1:-1:-1;;;;;;53398:19:0;;53407:10;53398:19;53390:75;;;;-1:-1:-1;;;53390:75:0;;;;;;;:::i;:::-;53484:9;53497:18;53484:31;53476:84;;;;-1:-1:-1;;;53476:84:0;;10567:2:1;53476:84:0;;;10549:21:1;10606:2;10586:18;;;10579:30;10645:34;10625:18;;;10618:62;-1:-1:-1;;;10696:18:1;;;10689:38;10744:19;;53476:84:0;10365:404:1;53476:84:0;53582:8;;:48;;-1:-1:-1;;;53582:48:0;;-1:-1:-1;;;;;53582:8:0;;;;:18;;53608:9;;53582:48;;53619:3;;53623;;53627:2;;53582:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53668:11;53656:10;-1:-1:-1;;;;;53646:38:0;;53681:2;53646:38;;;;;;:::i;:::-;;;;;;;;53199:541;;53113:627;;;:::o;24748:239::-;24820:7;24856:16;;;:7;:16;;;;;;-1:-1:-1;;;;;24856:16:0;24891:19;24883:73;;;;-1:-1:-1;;;24883:73:0;;20375:2:1;24883:73:0;;;20357:21:1;20414:2;20394:18;;;20387:30;20453:34;20433:18;;;20426:62;-1:-1:-1;;;20504:18:1;;;20497:39;20553:19;;24883:73:0;20173:405:1;44915:1034:0;44994:19;45016;45026:3;45031;45016:9;:19::i;:::-;45054:8;;:26;;-1:-1:-1;;;45054:26:0;;26206:4:1;26194:17;;;45054:26:0;;;26176:36:1;26248:17;;26228:18;;;26221:45;44994:41:0;;-1:-1:-1;45084:10:0;;-1:-1:-1;;;;;45054:8:0;;;;:17;;26149:18:1;;45054:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;45054:40:0;;45046:116;;;;-1:-1:-1;;;45046:116:0;;25319:2:1;45046:116:0;;;25301:21:1;25358:2;25338:18;;;25331:30;25397:34;25377:18;;;25370:62;25468:33;25448:18;;;25441:61;25519:19;;45046:116:0;25117:427:1;45046:116:0;45181:8;;:27;;-1:-1:-1;;;45181:27:0;;26206:4:1;26194:17;;;45181:27:0;;;26176:36:1;26248:17;;26228:18;;;26221:45;-1:-1:-1;;;;;45181:8:0;;;;:18;;26149::1;;45181:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45181:27:0;;;;;;;;;;;;:::i;:::-;:34;:39;45173:126;;;;-1:-1:-1;;;45173:126:0;;13271:2:1;45173:126:0;;;13253:21:1;13310:2;13290:18;;;13283:30;13349:34;13329:18;;;13322:62;13420:34;13400:18;;;13393:62;-1:-1:-1;;;13471:19:1;;;13464:41;13522:19;;45173:126:0;13069:478:1;45173:126:0;45318:9;45331:17;45318:30;45310:99;;;;-1:-1:-1;;;45310:99:0;;17361:2:1;45310:99:0;;;17343:21:1;17400:2;17380:18;;;17373:30;17439:34;17419:18;;;17412:62;17510:26;17490:18;;;17483:54;17554:19;;45310:99:0;17159:420:1;45310:99:0;45428:8;;:45;;-1:-1:-1;;;45428:45:0;;26206:4:1;26194:17;;;45428:45:0;;;26176:36:1;26248:17;;26228:18;;;26221:45;-1:-1:-1;;;;;45428:8:0;;;;:18;;45454:9;;26149:18:1;;45428:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45537:8:0;;:29;;-1:-1:-1;;;45537:29:0;;26206:4:1;26194:17;;;45537:29:0;;;26176:36:1;26248:17;;26228:18;;;26221:45;45581:4:0;;-1:-1:-1;;;;;;45537:8:0;;;;-1:-1:-1;45537:20:0;;-1:-1:-1;26149:18:1;;45537:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45537:29:0;;;;;;;;;;;;:::i;:::-;45567:1;45537:32;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;45537:49:0;;45529:125;;;;-1:-1:-1;;;45529:125:0;;22044:2:1;45529:125:0;;;22026:21:1;22083:2;22063:18;;;22056:30;22122:34;22102:18;;;22095:62;22193:33;22173:18;;;22166:61;22244:19;;45529:125:0;21842:427:1;45529:125:0;45673:8;;:27;;-1:-1:-1;;;45673:27:0;;26206:4:1;26194:17;;;45673:27:0;;;26176:36:1;26248:17;;26228:18;;;26221:45;-1:-1:-1;;;;;45673:8:0;;;;:18;;26149::1;;45673:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45673:27:0;;;;;;;;;;;;:::i;:::-;45701:1;45673:30;;;;;;;;:::i;:::-;;;;;;;45707:17;45673:51;45665:113;;;;-1:-1:-1;;;45665:113:0;;13754:2:1;45665:113:0;;;13736:21:1;13793:2;13773:18;;;13766:30;13832:34;13812:18;;;13805:62;-1:-1:-1;;;13883:18:1;;;13876:47;13940:19;;45665:113:0;13552:413:1;45665:113:0;45789:29;;;;:16;:29;;;;;;:42;;-1:-1:-1;;;;;;45789:42:0;45821:10;45789:42;;;;;;45905:36;;45806:11;;45905:36;;;44983:966;44915:1034;;:::o;24478:208::-;24550:7;-1:-1:-1;;;;;24578:19:0;;24570:74;;;;-1:-1:-1;;;24570:74:0;;19964:2:1;24570:74:0;;;19946:21:1;20003:2;19983:18;;;19976:30;20042:34;20022:18;;;20015:62;-1:-1:-1;;;20093:18:1;;;20086:40;20143:19;;24570:74:0;19762:406:1;24570:74:0;-1:-1:-1;;;;;;24662:16:0;;;;;:9;:16;;;;;;;24478:208::o;4730:103::-;4125:7;4152:6;-1:-1:-1;;;;;4152:6:0;2883:10;4299:23;4291:68;;;;-1:-1:-1;;;4291:68:0;;;;;;;:::i;:::-;4795:30:::1;4822:1;4795:18;:30::i;:::-;4730:103::o:0;47302:932::-;47364:19;47386;47396:3;47401;47386:9;:19::i;:::-;47424:29;;;;:16;:29;;;;;;47364:41;;-1:-1:-1;;;;;;47424:29:0;47457:10;47424:43;47416:140;;;;-1:-1:-1;;;47416:140:0;;19046:2:1;47416:140:0;;;19028:21:1;19085:2;19065:18;;;19058:30;19124:34;19104:18;;;19097:62;19195:34;19175:18;;;19168:62;-1:-1:-1;;;19246:19:1;;;19239:51;19307:19;;47416:140:0;18844:488:1;47416:140:0;47575:8;;:26;;-1:-1:-1;;;47575:26:0;;26206:4:1;26194:17;;;47575:26:0;;;26176:36:1;26248:17;;26228:18;;;26221:45;47613:4:0;;-1:-1:-1;;;;;47575:8:0;;:17;;26149:18:1;;47575:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;47575:43:0;;47567:185;;;;-1:-1:-1;;;47567:185:0;;11874:2:1;47567:185:0;;;11856:21:1;11913:3;11893:18;;;11886:31;11953:34;11933:18;;;11926:62;12024:34;12004:18;;;11997:62;12096:34;12075:19;;;12068:63;12168:34;12147:19;;;12140:63;-1:-1:-1;;;12219:19:1;;;12212:32;12261:19;;47567:185:0;11672:614:1;47567:185:0;47763:30;47769:10;47781:11;47763:5;:30::i;:::-;47870:20;47878:11;47870:7;:20::i;:::-;47862:93;;;;-1:-1:-1;;;47862:93:0;;18204:2:1;47862:93:0;;;18186:21:1;18243:2;18223:18;;;18216:30;18282:34;18262:18;;;18255:62;18353:30;18333:18;;;18326:58;18401:19;;47862:93:0;18002:424:1;47862:93:0;47973:29;;;;:16;:29;;;;;;47966:36;;-1:-1:-1;;;;;;47966:36:0;;;48189:37;47973:29;;48202:10;;48189:37;;47973:29;48189:37;47353:881;47302:932;;:::o;52619:486::-;52706:19;52728;52738:3;52743;52728:9;:19::i;:::-;52706:41;;52766:20;52774:11;52766:7;:20::i;:::-;52758:63;;;;-1:-1:-1;;;52758:63:0;;;;;;;:::i;:::-;52832:13;52848:27;52863:11;52848:14;:27::i;:::-;52832:43;-1:-1:-1;;;;;;52894:19:0;;52903:10;52894:19;52886:75;;;;-1:-1:-1;;;52886:75:0;;;;;;;:::i;:::-;52972:8;;:28;;-1:-1:-1;;;52972:28:0;;-1:-1:-1;;;;;52972:8:0;;;;:16;;:28;;52989:3;;52993;;52997:2;;52972:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53036:11;53024:10;-1:-1:-1;;;;;53016:36:0;;53049:2;53016:36;;;;;;:::i;25223:104::-;25279:13;25312:7;25305:14;;;;;:::i;26906:155::-;27001:52;2883:10;27034:8;27044;27001:18;:52::i;28029:328::-;28204:41;2883:10;28237:7;28204:18;:41::i;:::-;28196:103;;;;-1:-1:-1;;;28196:103:0;;;;;;;:::i;:::-;28310:39;28324:4;28330:2;28334:7;28343:5;28310:13;:39::i;:::-;28029:328;;;;:::o;54931:246::-;54997:13;55105;55120:26;55137:8;55120:16;:26::i;:::-;55148:19;55088:80;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55074:95;;54931:246;;;:::o;54567:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54601:33::-;;;;;;;:::i;55185:334::-;4125:7;4152:6;-1:-1:-1;;;;;4152:6:0;2883:10;4299:23;4291:68;;;;-1:-1:-1;;;4291:68:0;;;;;;;:::i;:::-;55459:51:::1;::::0;55467:10:::1;::::0;55488:21:::1;55459:51:::0;::::1;;;::::0;::::1;::::0;;;55488:21;55467:10;55459:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;55185:334::o:0;4988:201::-;4125:7;4152:6;-1:-1:-1;;;;;4152:6:0;2883:10;4299:23;4291:68;;;;-1:-1:-1;;;4291:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5077:22:0;::::1;5069:73;;;::::0;-1:-1:-1;;;5069:73:0;;14593:2:1;5069:73:0::1;::::0;::::1;14575:21:1::0;14632:2;14612:18;;;14605:30;14671:34;14651:18;;;14644:62;-1:-1:-1;;;14722:18:1;;;14715:36;14768:19;;5069:73:0::1;14391:402:1::0;5069:73:0::1;5153:28;5172:8;5153:18;:28::i;29867:127::-:0;29932:4;29956:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29956:16:0;:30;;;29867:127::o;34013:174::-;34088:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;34088:29:0;-1:-1:-1;;;;;34088:29:0;;;;;;;;:24;;34142:23;34088:24;34142:14;:23::i;:::-;-1:-1:-1;;;;;34133:46:0;;;;;;;;;;;34013:174;;:::o;40405:289::-;40469:7;40510:2;40497:16;;;;;;;:36;;-1:-1:-1;40530:2:0;40517:16;;;;;40497:36;40489:98;;;;-1:-1:-1;;;40489:98:0;;17786:2:1;40489:98:0;;;17768:21:1;17825:2;17805:18;;;17798:30;17864:34;17844:18;;;17837:62;-1:-1:-1;;;17915:18:1;;;17908:47;17972:19;;40489:98:0;17584:413:1;40489:98:0;40682:3;40674:12;;40667:2;40652:3;40644:12;;:26;;;;:::i;:::-;40643:43;;;;:::i;:::-;40636:50;40405:289;-1:-1:-1;;;40405:289:0:o;32513:420::-;32573:13;32589:23;32604:7;32589:14;:23::i;:::-;32573:39;;32714:29;32731:1;32735:7;32714:8;:29::i;:::-;-1:-1:-1;;;;;32756:16:0;;;;;;:9;:16;;;;;:21;;32776:1;;32756:16;:21;;32776:1;;32756:21;:::i;:::-;;;;-1:-1:-1;;32795:16:0;;;;:7;:16;;;;;;32788:23;;-1:-1:-1;;;;;;32788:23:0;;;32829:36;32803:7;;32795:16;-1:-1:-1;;;;;32829:36:0;;;;;32795:16;;32829:36;54864:42:::1;54773:141:::0;:::o;30161:348::-;30254:4;30279:16;30287:7;30279;:16::i;:::-;30271:73;;;;-1:-1:-1;;;30271:73:0;;18633:2:1;30271:73:0;;;18615:21:1;18672:2;18652:18;;;18645:30;18711:34;18691:18;;;18684:62;-1:-1:-1;;;18762:18:1;;;18755:42;18814:19;;30271:73:0;18431:408:1;30271:73:0;30355:13;30371:23;30386:7;30371:14;:23::i;:::-;30355:39;;30424:5;-1:-1:-1;;;;;30413:16:0;:7;-1:-1:-1;;;;;30413:16:0;;:51;;;;30457:7;-1:-1:-1;;;;;30433:31:0;:20;30445:7;30433:11;:20::i;:::-;-1:-1:-1;;;;;30433:31:0;;30413:51;:87;;;-1:-1:-1;;;;;;27253:25:0;;;27229:4;27253:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;30468:32;30405:96;30161:348;-1:-1:-1;;;;30161:348:0:o;33270:625::-;33429:4;-1:-1:-1;;;;;33402:31:0;:23;33417:7;33402:14;:23::i;:::-;-1:-1:-1;;;;;33402:31:0;;33394:81;;;;-1:-1:-1;;;33394:81:0;;15412:2:1;33394:81:0;;;15394:21:1;15451:2;15431:18;;;15424:30;15490:34;15470:18;;;15463:62;-1:-1:-1;;;15541:18:1;;;15534:35;15586:19;;33394:81:0;15210:401:1;33394:81:0;-1:-1:-1;;;;;33494:16:0;;33486:65;;;;-1:-1:-1;;;33486:65:0;;16602:2:1;33486:65:0;;;16584:21:1;16641:2;16621:18;;;16614:30;16680:34;16660:18;;;16653:62;-1:-1:-1;;;16731:18:1;;;16724:34;16775:19;;33486:65:0;16400:400:1;33486:65:0;33668:29;33685:1;33689:7;33668:8;:29::i;:::-;-1:-1:-1;;;;;33710:15:0;;;;;;:9;:15;;;;;:20;;33729:1;;33710:15;:20;;33729:1;;33710:20;:::i;:::-;;;;-1:-1:-1;;;;;;;33741:13:0;;;;;;:9;:13;;;;;:18;;33758:1;;33741:13;:18;;33758:1;;33741:18;:::i;:::-;;;;-1:-1:-1;;33770:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;33770:21:0;-1:-1:-1;;;;;33770:21:0;;;;;;;;;33809:27;;33770:16;;33809:27;;;;;;;26206:341;26136:411;;:::o;5349:191::-;5423:16;5442:6;;-1:-1:-1;;;;;5459:17:0;;;-1:-1:-1;;;;;;5459:17:0;;;;;;5492:40;;5442:6;;;;;;;5492:40;;5423:16;5492:40;5412:128;5349:191;:::o;31845:439::-;-1:-1:-1;;;;;31925:16:0;;31917:61;;;;-1:-1:-1;;;31917:61:0;;21683:2:1;31917:61:0;;;21665:21:1;;;21702:18;;;21695:30;21761:34;21741:18;;;21734:62;21813:18;;31917:61:0;21481:356:1;31917:61:0;31998:16;32006:7;31998;:16::i;:::-;31997:17;31989:58;;;;-1:-1:-1;;;31989:58:0;;15818:2:1;31989:58:0;;;15800:21:1;15857:2;15837:18;;;15830:30;15896;15876:18;;;15869:58;15944:18;;31989:58:0;15616:352:1;31989:58:0;-1:-1:-1;;;;;32118:13:0;;;;;;:9;:13;;;;;:18;;32135:1;;32118:13;:18;;32135:1;;32118:18;:::i;:::-;;;;-1:-1:-1;;32147:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32147:21:0;-1:-1:-1;;;;;32147:21:0;;;;;;;;32186:33;;32147:16;;;32186:33;;32147:16;;32186:33;54864:42:::1;54773:141:::0;:::o;34329:315::-;34484:8;-1:-1:-1;;;;;34475:17:0;:5;-1:-1:-1;;;;;34475:17:0;;;34467:55;;;;-1:-1:-1;;;34467:55:0;;17007:2:1;34467:55:0;;;16989:21:1;17046:2;17026:18;;;17019:30;17085:27;17065:18;;;17058:55;17130:18;;34467:55:0;16805:349:1;34467:55:0;-1:-1:-1;;;;;34533:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;34533:46:0;;;;;;;;;;34595:41;;9865::1;;;34595::0;;9838:18:1;34595:41:0;;;;;;;34329:315;;;:::o;29239:::-;29396:28;29406:4;29412:2;29416:7;29396:9;:28::i;:::-;29443:48;29466:4;29472:2;29476:7;29485:5;29443:22;:48::i;:::-;29435:111;;;;-1:-1:-1;;;29435:111:0;;;;;;;:::i;365:723::-;421:13;642:10;638:53;;-1:-1:-1;;669:10:0;;;;;;;;;;;;-1:-1:-1;;;669:10:0;;;;;365:723::o;638:53::-;716:5;701:12;757:78;764:9;;757:78;;790:8;;;;:::i;:::-;;-1:-1:-1;813:10:0;;-1:-1:-1;821:2:0;813:10;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;867:17:0;;845:39;;895:154;902:10;;895:154;;929:11;939:1;929:11;;:::i;:::-;;-1:-1:-1;998:10:0;1006:2;998:5;:10;:::i;:::-;985:24;;:2;:24;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;955:56:0;;;;;;;;-1:-1:-1;1026:11:0;1035:2;1026:11;;:::i;:::-;;;895:154;;35209:799;35364:4;-1:-1:-1;;;;;35385:13:0;;7075:19;:23;35381:620;;35421:72;;-1:-1:-1;;;35421:72:0;;-1:-1:-1;;;;;35421:36:0;;;;;:72;;2883:10;;35472:4;;35478:7;;35487:5;;35421:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35421:72:0;;;;;;;;-1:-1:-1;;35421:72:0;;;;;;;;;;;;:::i;:::-;;;35417:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35663:13:0;;35659:272;;35706:60;;-1:-1:-1;;;35706:60:0;;;;;;;:::i;35659:272::-;35881:6;35875:13;35866:6;35862:2;35858:15;35851:38;35417:529;-1:-1:-1;;;;;;35544:51:0;-1:-1:-1;;;35544:51:0;;-1:-1:-1;35537:58:0;;35381:620;-1:-1:-1;35985:4:0;35209:799;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:221::-;468:5;521:3;514:4;506:6;502:17;498:27;488:55;;539:1;536;529:12;488:55;561:79;636:3;627:6;614:20;607:4;599:6;595:17;561:79;:::i;651:156::-;717:20;;777:4;766:16;;756:27;;746:55;;797:1;794;787:12;746:55;651:156;;;:::o;812:247::-;871:6;924:2;912:9;903:7;899:23;895:32;892:52;;;940:1;937;930:12;892:52;979:9;966:23;998:31;1023:5;998:31;:::i;1064:251::-;1134:6;1187:2;1175:9;1166:7;1162:23;1158:32;1155:52;;;1203:1;1200;1193:12;1155:52;1235:9;1229:16;1254:31;1279:5;1254:31;:::i;1320:388::-;1388:6;1396;1449:2;1437:9;1428:7;1424:23;1420:32;1417:52;;;1465:1;1462;1455:12;1417:52;1504:9;1491:23;1523:31;1548:5;1523:31;:::i;:::-;1573:5;-1:-1:-1;1630:2:1;1615:18;;1602:32;1643:33;1602:32;1643:33;:::i;:::-;1695:7;1685:17;;;1320:388;;;;;:::o;1713:456::-;1790:6;1798;1806;1859:2;1847:9;1838:7;1834:23;1830:32;1827:52;;;1875:1;1872;1865:12;1827:52;1914:9;1901:23;1933:31;1958:5;1933:31;:::i;:::-;1983:5;-1:-1:-1;2040:2:1;2025:18;;2012:32;2053:33;2012:32;2053:33;:::i;:::-;1713:456;;2105:7;;-1:-1:-1;;;2159:2:1;2144:18;;;;2131:32;;1713:456::o;2174:794::-;2269:6;2277;2285;2293;2346:3;2334:9;2325:7;2321:23;2317:33;2314:53;;;2363:1;2360;2353:12;2314:53;2402:9;2389:23;2421:31;2446:5;2421:31;:::i;:::-;2471:5;-1:-1:-1;2528:2:1;2513:18;;2500:32;2541:33;2500:32;2541:33;:::i;:::-;2593:7;-1:-1:-1;2647:2:1;2632:18;;2619:32;;-1:-1:-1;2702:2:1;2687:18;;2674:32;2729:18;2718:30;;2715:50;;;2761:1;2758;2751:12;2715:50;2784:22;;2837:4;2829:13;;2825:27;-1:-1:-1;2815:55:1;;2866:1;2863;2856:12;2815:55;2889:73;2954:7;2949:2;2936:16;2931:2;2927;2923:11;2889:73;:::i;:::-;2879:83;;;2174:794;;;;;;;:::o;2973:416::-;3038:6;3046;3099:2;3087:9;3078:7;3074:23;3070:32;3067:52;;;3115:1;3112;3105:12;3067:52;3154:9;3141:23;3173:31;3198:5;3173:31;:::i;:::-;3223:5;-1:-1:-1;3280:2:1;3265:18;;3252:32;3322:15;;3315:23;3303:36;;3293:64;;3353:1;3350;3343:12;3394:315;3462:6;3470;3523:2;3511:9;3502:7;3498:23;3494:32;3491:52;;;3539:1;3536;3529:12;3491:52;3578:9;3565:23;3597:31;3622:5;3597:31;:::i;:::-;3647:5;3699:2;3684:18;;;;3671:32;;-1:-1:-1;;;3394:315:1:o;3714:967::-;3809:6;3840:2;3883;3871:9;3862:7;3858:23;3854:32;3851:52;;;3899:1;3896;3889:12;3851:52;3932:9;3926:16;3965:18;3957:6;3954:30;3951:50;;;3997:1;3994;3987:12;3951:50;4020:22;;4073:4;4065:13;;4061:27;-1:-1:-1;4051:55:1;;4102:1;4099;4092:12;4051:55;4131:2;4125:9;4154:60;4170:43;4210:2;4170:43;:::i;:::-;4154:60;:::i;:::-;4236:3;4260:2;4255:3;4248:15;4288:2;4283:3;4279:12;4272:19;;4319:2;4315;4311:11;4367:7;4362:2;4356;4353:1;4349:10;4345:2;4341:19;4337:28;4334:41;4331:61;;;4388:1;4385;4378:12;4331:61;4410:1;4401:10;;4420:231;4434:2;4431:1;4428:9;4420:231;;;4498:3;4492:10;4515:31;4540:5;4515:31;:::i;:::-;4559:18;;4452:1;4445:9;;;;;4597:12;;;;4629;;4420:231;;;-1:-1:-1;4670:5:1;3714:967;-1:-1:-1;;;;;;;3714:967:1:o;4686:892::-;4781:6;4812:2;4855;4843:9;4834:7;4830:23;4826:32;4823:52;;;4871:1;4868;4861:12;4823:52;4904:9;4898:16;4937:18;4929:6;4926:30;4923:50;;;4969:1;4966;4959:12;4923:50;4992:22;;5045:4;5037:13;;5033:27;-1:-1:-1;5023:55:1;;5074:1;5071;5064:12;5023:55;5103:2;5097:9;5126:60;5142:43;5182:2;5142:43;:::i;5126:60::-;5208:3;5232:2;5227:3;5220:15;5260:2;5255:3;5251:12;5244:19;;5291:2;5287;5283:11;5339:7;5334:2;5328;5325:1;5321:10;5317:2;5313:19;5309:28;5306:41;5303:61;;;5360:1;5357;5350:12;5303:61;5382:1;5373:10;;5392:156;5406:2;5403:1;5400:9;5392:156;;;5463:10;;5451:23;;5424:1;5417:9;;;;;5494:12;;;;5526;;5392:156;;5583:245;5641:6;5694:2;5682:9;5673:7;5669:23;5665:32;5662:52;;;5710:1;5707;5700:12;5662:52;5749:9;5736:23;5768:30;5792:5;5768:30;:::i;5833:249::-;5902:6;5955:2;5943:9;5934:7;5930:23;5926:32;5923:52;;;5971:1;5968;5961:12;5923:52;6003:9;5997:16;6022:30;6046:5;6022:30;:::i;6087:322::-;6156:6;6209:2;6197:9;6188:7;6184:23;6180:32;6177:52;;;6225:1;6222;6215:12;6177:52;6265:9;6252:23;6298:18;6290:6;6287:30;6284:50;;;6330:1;6327;6320:12;6284:50;6353;6395:7;6386:6;6375:9;6371:22;6353:50;:::i;6414:180::-;6473:6;6526:2;6514:9;6505:7;6501:23;6497:32;6494:52;;;6542:1;6539;6532:12;6494:52;-1:-1:-1;6565:23:1;;6414:180;-1:-1:-1;6414:180:1:o;6599:252::-;6663:6;6671;6724:2;6712:9;6703:7;6699:23;6695:32;6692:52;;;6740:1;6737;6730:12;6692:52;6763:27;6780:9;6763:27;:::i;:::-;6753:37;;6809:36;6841:2;6830:9;6826:18;6809:36;:::i;:::-;6799:46;;6599:252;;;;;:::o;6856:462::-;6939:6;6947;6955;7008:2;6996:9;6987:7;6983:23;6979:32;6976:52;;;7024:1;7021;7014:12;6976:52;7047:27;7064:9;7047:27;:::i;:::-;7037:37;;7093:36;7125:2;7114:9;7110:18;7093:36;:::i;:::-;7083:46;;7180:2;7169:9;7165:18;7152:32;7207:18;7199:6;7196:30;7193:50;;;7239:1;7236;7229:12;7193:50;7262;7304:7;7295:6;7284:9;7280:22;7262:50;:::i;:::-;7252:60;;;6856:462;;;;;:::o;7323:257::-;7364:3;7402:5;7396:12;7429:6;7424:3;7417:19;7445:63;7501:6;7494:4;7489:3;7485:14;7478:4;7471:5;7467:16;7445:63;:::i;:::-;7562:2;7541:15;-1:-1:-1;;7537:29:1;7528:39;;;;7569:4;7524:50;;7323:257;-1:-1:-1;;7323:257:1:o;7585:973::-;7670:12;;7635:3;;7725:1;7745:18;;;;7798;;;;7825:61;;7879:4;7871:6;7867:17;7857:27;;7825:61;7905:2;7953;7945:6;7942:14;7922:18;7919:38;7916:161;;;7999:10;7994:3;7990:20;7987:1;7980:31;8034:4;8031:1;8024:15;8062:4;8059:1;8052:15;7916:161;8093:18;8120:104;;;;8238:1;8233:319;;;;8086:466;;8120:104;-1:-1:-1;;8153:24:1;;8141:37;;8198:16;;;;-1:-1:-1;8120:104:1;;8233:319;27553:1;27546:14;;;27590:4;27577:18;;8327:1;8341:165;8355:6;8352:1;8349:13;8341:165;;;8433:14;;8420:11;;;8413:35;8476:16;;;;8370:10;;8341:165;;;8345:3;;8535:6;8530:3;8526:16;8519:23;;8086:466;;;;;;;7585:973;;;;:::o;8563:456::-;8784:3;8812:38;8846:3;8838:6;8812:38;:::i;:::-;8879:6;8873:13;8895:52;8940:6;8936:2;8929:4;8921:6;8917:17;8895:52;:::i;:::-;8963:50;9005:6;9001:2;8997:15;8989:6;8963:50;:::i;:::-;8956:57;8563:456;-1:-1:-1;;;;;;;8563:456:1:o;9232:488::-;-1:-1:-1;;;;;9501:15:1;;;9483:34;;9553:15;;9548:2;9533:18;;9526:43;9600:2;9585:18;;9578:34;;;9648:3;9643:2;9628:18;;9621:31;;;9426:4;;9669:45;;9694:19;;9686:6;9669:45;:::i;:::-;9661:53;9232:488;-1:-1:-1;;;;;;9232:488:1:o;10141:219::-;10290:2;10279:9;10272:21;10253:4;10310:44;10350:2;10339:9;10335:18;10327:6;10310:44;:::i;12291:354::-;12493:2;12475:21;;;12532:2;12512:18;;;12505:30;12571:32;12566:2;12551:18;;12544:60;12636:2;12621:18;;12291:354::o;12650:414::-;12852:2;12834:21;;;12891:2;12871:18;;;12864:30;12930:34;12925:2;12910:18;;12903:62;-1:-1:-1;;;12996:2:1;12981:18;;12974:48;13054:3;13039:19;;12650:414::o;14798:407::-;15000:2;14982:21;;;15039:2;15019:18;;;15012:30;15078:34;15073:2;15058:18;;15051:62;-1:-1:-1;;;15144:2:1;15129:18;;15122:41;15195:3;15180:19;;14798:407::o;22687:356::-;22889:2;22871:21;;;22908:18;;;22901:30;22967:34;22962:2;22947:18;;22940:62;23034:2;23019:18;;22687:356::o;24699:413::-;24901:2;24883:21;;;24940:2;24920:18;;;24913:30;24979:34;24974:2;24959:18;;24952:62;-1:-1:-1;;;25045:2:1;25030:18;;25023:47;25102:3;25087:19;;24699:413::o;26632:375::-;26841:4;26833:6;26829:17;26818:9;26811:36;26895:4;26887:6;26883:17;26878:2;26867:9;26863:18;26856:45;26937:2;26932;26921:9;26917:18;26910:30;26792:4;26957:44;26997:2;26986:9;26982:18;26974:6;26957:44;:::i;:::-;26949:52;26632:375;-1:-1:-1;;;;;26632:375:1:o;27012:275::-;27083:2;27077:9;27148:2;27129:13;;-1:-1:-1;;27125:27:1;27113:40;;27183:18;27168:34;;27204:22;;;27165:62;27162:88;;;27230:18;;:::i;:::-;27266:2;27259:22;27012:275;;-1:-1:-1;27012:275:1:o;27292:183::-;27352:4;27385:18;27377:6;27374:30;27371:56;;;27407:18;;:::i;:::-;-1:-1:-1;27452:1:1;27448:14;27464:4;27444:25;;27292:183::o;27606:128::-;27646:3;27677:1;27673:6;27670:1;27667:13;27664:39;;;27683:18;;:::i;:::-;-1:-1:-1;27719:9:1;;27606:128::o;27739:120::-;27779:1;27805;27795:35;;27810:18;;:::i;:::-;-1:-1:-1;27844:9:1;;27739:120::o;27864:168::-;27904:7;27970:1;27966;27962:6;27958:14;27955:1;27952:21;27947:1;27940:9;27933:17;27929:45;27926:71;;;27977:18;;:::i;:::-;-1:-1:-1;28017:9:1;;27864:168::o;28037:125::-;28077:4;28105:1;28102;28099:8;28096:34;;;28110:18;;:::i;:::-;-1:-1:-1;28147:9:1;;28037:125::o;28167:195::-;28205:4;28242;28239:1;28235:12;28274:4;28271:1;28267:12;28299:3;28294;28291:12;28288:38;;;28306:18;;:::i;:::-;28343:13;;;28167:195;-1:-1:-1;;;28167:195:1:o;28367:258::-;28439:1;28449:113;28463:6;28460:1;28457:13;28449:113;;;28539:11;;;28533:18;28520:11;;;28513:39;28485:2;28478:10;28449:113;;;28580:6;28577:1;28574:13;28571:48;;;-1:-1:-1;;28615:1:1;28597:16;;28590:27;28367:258::o;28630:380::-;28709:1;28705:12;;;;28752;;;28773:61;;28827:4;28819:6;28815:17;28805:27;;28773:61;28880:2;28872:6;28869:14;28849:18;28846:38;28843:161;;;28926:10;28921:3;28917:20;28914:1;28907:31;28961:4;28958:1;28951:15;28989:4;28986:1;28979:15;28843:161;;28630:380;;;:::o;29015:135::-;29054:3;-1:-1:-1;;29075:17:1;;29072:43;;;29095:18;;:::i;:::-;-1:-1:-1;29142:1:1;29131:13;;29015:135::o;29155:112::-;29187:1;29213;29203:35;;29218:18;;:::i;:::-;-1:-1:-1;29252:9:1;;29155:112::o;29272:127::-;29333:10;29328:3;29324:20;29321:1;29314:31;29364:4;29361:1;29354:15;29388:4;29385:1;29378:15;29404:127;29465:10;29460:3;29456:20;29453:1;29446:31;29496:4;29493:1;29486:15;29520:4;29517:1;29510:15;29536:127;29597:10;29592:3;29588:20;29585:1;29578:31;29628:4;29625:1;29618:15;29652:4;29649:1;29642:15;29668:127;29729:10;29724:3;29720:20;29717:1;29710:31;29760:4;29757:1;29750:15;29784:4;29781:1;29774:15;29800:131;-1:-1:-1;;;;;29875:31:1;;29865:42;;29855:70;;29921:1;29918;29911:12;29936:131;-1:-1:-1;;;;;;30010:32:1;;30000:43;;29990:71;;30057:1;30054;30047:12

Swarm Source

ipfs://73b7738c14bb331972b84747c510b338d326b97e7b29f9946b9bff8df7e7a8ff
Loading...
Loading
Loading...
Loading
[ 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.