ETH Price: $2,083.06 (-14.97%)

Token

The Crypto Towers (TCT)
 

Overview

Max Total Supply

8 TCT

Holders

2

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
7 TCT
0xd02c1739e3f126d33e8dcabe288a69e3bc070061
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:
TheCryptoTowers

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-08-01
*/

// SPDX-License-Identifier: MIT
// File: @openzeppelin/[email protected]/utils/Counters.sol


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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: @openzeppelin/[email protected]/utils/Strings.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

// File: @openzeppelin/[email protected]/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/[email protected]/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.7.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
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/[email protected]/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts (last updated v4.6.0) (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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/[email protected]/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/[email protected]/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/[email protected]/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.7.0) (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`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

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

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

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

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

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

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

// File: @openzeppelin/[email protected]/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: @openzeppelin/[email protected]/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/[email protected]/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v4.7.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: address zero is not a valid owner");
        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: invalid token ID");
        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) {
        _requireMinted(tokenId);

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

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

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

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        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: caller is not token 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: caller is not token 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) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {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 an {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 Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @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 {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` 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/[email protected]/token/ERC721/extensions/ERC721URIStorage.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721URIStorage.sol)

pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @dev See {ERC721-_burn}. This override additionally checks to see if a
     * token-specific URI was set for the token, and if so, it deletes the token URI from
     * the storage mapping.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

// File: @openzeppelin/[email protected]/token/ERC721/extensions/ERC721Enumerable.sol


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

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contract-e741b85c3b.sol


pragma solidity ^0.8.4;





contract TheCryptoTowers is ERC721, ERC721Enumerable, ERC721URIStorage {
    using Counters for Counters.Counter;

    Counters.Counter private _tokenIdCounter;
    uint256 MAX_SUPPLY = 10000;

    constructor() ERC721("The Crypto Towers", "TCT") {}

    function safeMint(address to, string memory uri) public {
        uint256 tokenId = _tokenIdCounter.current();
        require(tokenId <= MAX_SUPPLY, "I'm sorry all NFTs have been minted");
        _tokenIdCounter.increment();
        _safeMint(to, tokenId);
        _setTokenURI(tokenId, uri);
    }

    // The following functions are overrides required by Solidity.

    function _beforeTokenTransfer(address from, address to, uint256 tokenId)
        internal
        override(ERC721, ERC721Enumerable)
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"uri","type":"string"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052612710600c553480156200001757600080fd5b506040518060400160405280601181526020017f5468652043727970746f20546f776572730000000000000000000000000000008152506040518060400160405280600381526020017f544354000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200009c929190620000be565b508060019080519060200190620000b5929190620000be565b505050620001d3565b828054620000cc906200016e565b90600052602060002090601f016020900481019282620000f057600085556200013c565b82601f106200010b57805160ff19168380011785556200013c565b828001600101855582156200013c579182015b828111156200013b5782518255916020019190600101906200011e565b5b5090506200014b91906200014f565b5090565b5b808211156200016a57600081600090555060010162000150565b5090565b600060028204905060018216806200018757607f821691505b602082108114156200019e576200019d620001a4565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6131ec80620001e36000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c80634f6ccce7116100a2578063a22cb46511610071578063a22cb465146102de578063b88d4fde146102fa578063c87b56dd14610316578063d204c45e14610346578063e985e9c5146103625761010b565b80634f6ccce7146102305780636352211e1461026057806370a082311461029057806395d89b41146102c05761010b565b806318160ddd116100de57806318160ddd146101aa57806323b872dd146101c85780632f745c59146101e457806342842e0e146102145761010b565b806301ffc9a71461011057806306fdde0314610140578063081812fc1461015e578063095ea7b31461018e575b600080fd5b61012a60048036038101906101259190612351565b610392565b6040516101379190612734565b60405180910390f35b6101486103a4565b604051610155919061274f565b60405180910390f35b610178600480360381019061017391906123a3565b610436565b60405161018591906126cd565b60405180910390f35b6101a860048036038101906101a39190612315565b61047c565b005b6101b2610594565b6040516101bf9190612951565b60405180910390f35b6101e260048036038101906101dd91906121bb565b6105a1565b005b6101fe60048036038101906101f99190612315565b610601565b60405161020b9190612951565b60405180910390f35b61022e600480360381019061022991906121bb565b6106a6565b005b61024a600480360381019061024591906123a3565b6106c6565b6040516102579190612951565b60405180910390f35b61027a600480360381019061027591906123a3565b61075d565b60405161028791906126cd565b60405180910390f35b6102aa60048036038101906102a59190612156565b61080f565b6040516102b79190612951565b60405180910390f35b6102c86108c7565b6040516102d5919061274f565b60405180910390f35b6102f860048036038101906102f39190612285565b610959565b005b610314600480360381019061030f919061220a565b61096f565b005b610330600480360381019061032b91906123a3565b6109d1565b60405161033d919061274f565b60405180910390f35b610360600480360381019061035b91906122c1565b6109e3565b005b61037c6004803603810190610377919061217f565b610a59565b6040516103899190612734565b60405180910390f35b600061039d82610aed565b9050919050565b6060600080546103b390612ba7565b80601f01602080910402602001604051908101604052809291908181526020018280546103df90612ba7565b801561042c5780601f106104015761010080835404028352916020019161042c565b820191906000526020600020905b81548152906001019060200180831161040f57829003601f168201915b5050505050905090565b600061044182610b67565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006104878261075d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156104f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ef906128d1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610517610bb2565b73ffffffffffffffffffffffffffffffffffffffff161480610546575061054581610540610bb2565b610a59565b5b610585576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161057c90612871565b60405180910390fd5b61058f8383610bba565b505050565b6000600880549050905090565b6105b26105ac610bb2565b82610c73565b6105f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e890612931565b60405180910390fd5b6105fc838383610d08565b505050565b600061060c8361080f565b821061064d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064490612771565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6106c18383836040518060200160405280600081525061096f565b505050565b60006106d0610594565b8210610711576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610708906128f1565b60405180910390fd5b6008828154811061074b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610806576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fd906128b1565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610880576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087790612831565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600180546108d690612ba7565b80601f016020809104026020016040519081016040528092919081815260200182805461090290612ba7565b801561094f5780601f106109245761010080835404028352916020019161094f565b820191906000526020600020905b81548152906001019060200180831161093257829003601f168201915b5050505050905090565b61096b610964610bb2565b8383610f6f565b5050565b61098061097a610bb2565b83610c73565b6109bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b690612931565b60405180910390fd5b6109cb848484846110dc565b50505050565b60606109dc82611138565b9050919050565b60006109ef600b61124b565b9050600c54811115610a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2d90612911565b60405180910390fd5b610a40600b611259565b610a4a838261126f565b610a54818361128d565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b605750610b5f82611301565b5b9050919050565b610b70816113e3565b610baf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba6906128b1565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610c2d8361075d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610c7f8361075d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610cc15750610cc08185610a59565b5b80610cff57508373ffffffffffffffffffffffffffffffffffffffff16610ce784610436565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610d288261075d565b73ffffffffffffffffffffffffffffffffffffffff1614610d7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d75906127b1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610dee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de5906127f1565b60405180910390fd5b610df983838361144f565b610e04600082610bba565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e549190612abd565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610eab9190612a36565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f6a83838361145f565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd590612811565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110cf9190612734565b60405180910390a3505050565b6110e7848484610d08565b6110f384848484611464565b611132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112990612791565b60405180910390fd5b50505050565b606061114382610b67565b6000600a6000848152602001908152602001600020805461116390612ba7565b80601f016020809104026020016040519081016040528092919081815260200182805461118f90612ba7565b80156111dc5780601f106111b1576101008083540402835291602001916111dc565b820191906000526020600020905b8154815290600101906020018083116111bf57829003601f168201915b5050505050905060006111ed6115fb565b9050600081511415611203578192505050611246565b6000825111156112385780826040516020016112209291906126a9565b60405160208183030381529060405292505050611246565b61124184611612565b925050505b919050565b600081600001549050919050565b6001816000016000828254019250508190555050565b61128982826040518060200160405280600081525061167a565b5050565b611296826113e3565b6112d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cc90612851565b60405180910390fd5b80600a600084815260200190815260200160002090805190602001906112fc929190611f7a565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806113cc57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806113dc57506113db826116d5565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b61145a83838361173f565b505050565b505050565b60006114858473ffffffffffffffffffffffffffffffffffffffff16611853565b156115ee578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026114ae610bb2565b8786866040518563ffffffff1660e01b81526004016114d094939291906126e8565b602060405180830381600087803b1580156114ea57600080fd5b505af192505050801561151b57506040513d601f19601f82011682018060405250810190611518919061237a565b60015b61159e573d806000811461154b576040519150601f19603f3d011682016040523d82523d6000602084013e611550565b606091505b50600081511415611596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158d90612791565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506115f3565b600190505b949350505050565b606060405180602001604052806000815250905090565b606061161d82610b67565b60006116276115fb565b905060008151116116475760405180602001604052806000815250611672565b8061165184611876565b6040516020016116629291906126a9565b6040516020818303038152906040525b915050919050565b6116848383611a23565b6116916000848484611464565b6116d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c790612791565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61174a838383611bfd565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561178d5761178881611c02565b6117cc565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146117cb576117ca8382611c4b565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561180f5761180a81611db8565b61184e565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461184d5761184c8282611efb565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606060008214156118be576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611a1e565b600082905060005b600082146118f05780806118d990612c0a565b915050600a826118e99190612a8c565b91506118c6565b60008167ffffffffffffffff811115611932577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156119645781602001600182028036833780820191505090505b5090505b60008514611a175760018261197d9190612abd565b9150600a8561198c9190612c53565b60306119989190612a36565b60f81b8183815181106119d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611a109190612a8c565b9450611968565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8a90612891565b60405180910390fd5b611a9c816113e3565b15611adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad3906127d1565b60405180910390fd5b611ae86000838361144f565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b389190612a36565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611bf96000838361145f565b5050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001611c588461080f565b611c629190612abd565b9050600060076000848152602001908152602001600020549050818114611d47576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050611dcc9190612abd565b9050600060096000848152602001908152602001600020549050600060088381548110611e22577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110611e6a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480611edf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000611f068361080f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054611f8690612ba7565b90600052602060002090601f016020900481019282611fa85760008555611fef565b82601f10611fc157805160ff1916838001178555611fef565b82800160010185558215611fef579182015b82811115611fee578251825591602001919060010190611fd3565b5b509050611ffc9190612000565b5090565b5b80821115612019576000816000905550600101612001565b5090565b600061203061202b84612991565b61296c565b90508281526020810184848401111561204857600080fd5b612053848285612b65565b509392505050565b600061206e612069846129c2565b61296c565b90508281526020810184848401111561208657600080fd5b612091848285612b65565b509392505050565b6000813590506120a88161315a565b92915050565b6000813590506120bd81613171565b92915050565b6000813590506120d281613188565b92915050565b6000815190506120e781613188565b92915050565b600082601f8301126120fe57600080fd5b813561210e84826020860161201d565b91505092915050565b600082601f83011261212857600080fd5b813561213884826020860161205b565b91505092915050565b6000813590506121508161319f565b92915050565b60006020828403121561216857600080fd5b600061217684828501612099565b91505092915050565b6000806040838503121561219257600080fd5b60006121a085828601612099565b92505060206121b185828601612099565b9150509250929050565b6000806000606084860312156121d057600080fd5b60006121de86828701612099565b93505060206121ef86828701612099565b925050604061220086828701612141565b9150509250925092565b6000806000806080858703121561222057600080fd5b600061222e87828801612099565b945050602061223f87828801612099565b935050604061225087828801612141565b925050606085013567ffffffffffffffff81111561226d57600080fd5b612279878288016120ed565b91505092959194509250565b6000806040838503121561229857600080fd5b60006122a685828601612099565b92505060206122b7858286016120ae565b9150509250929050565b600080604083850312156122d457600080fd5b60006122e285828601612099565b925050602083013567ffffffffffffffff8111156122ff57600080fd5b61230b85828601612117565b9150509250929050565b6000806040838503121561232857600080fd5b600061233685828601612099565b925050602061234785828601612141565b9150509250929050565b60006020828403121561236357600080fd5b6000612371848285016120c3565b91505092915050565b60006020828403121561238c57600080fd5b600061239a848285016120d8565b91505092915050565b6000602082840312156123b557600080fd5b60006123c384828501612141565b91505092915050565b6123d581612af1565b82525050565b6123e481612b03565b82525050565b60006123f5826129f3565b6123ff8185612a09565b935061240f818560208601612b74565b61241881612d40565b840191505092915050565b600061242e826129fe565b6124388185612a1a565b9350612448818560208601612b74565b61245181612d40565b840191505092915050565b6000612467826129fe565b6124718185612a2b565b9350612481818560208601612b74565b80840191505092915050565b600061249a602b83612a1a565b91506124a582612d51565b604082019050919050565b60006124bd603283612a1a565b91506124c882612da0565b604082019050919050565b60006124e0602583612a1a565b91506124eb82612def565b604082019050919050565b6000612503601c83612a1a565b915061250e82612e3e565b602082019050919050565b6000612526602483612a1a565b915061253182612e67565b604082019050919050565b6000612549601983612a1a565b915061255482612eb6565b602082019050919050565b600061256c602983612a1a565b915061257782612edf565b604082019050919050565b600061258f602e83612a1a565b915061259a82612f2e565b604082019050919050565b60006125b2603e83612a1a565b91506125bd82612f7d565b604082019050919050565b60006125d5602083612a1a565b91506125e082612fcc565b602082019050919050565b60006125f8601883612a1a565b915061260382612ff5565b602082019050919050565b600061261b602183612a1a565b91506126268261301e565b604082019050919050565b600061263e602c83612a1a565b91506126498261306d565b604082019050919050565b6000612661602383612a1a565b915061266c826130bc565b604082019050919050565b6000612684602e83612a1a565b915061268f8261310b565b604082019050919050565b6126a381612b5b565b82525050565b60006126b5828561245c565b91506126c1828461245c565b91508190509392505050565b60006020820190506126e260008301846123cc565b92915050565b60006080820190506126fd60008301876123cc565b61270a60208301866123cc565b612717604083018561269a565b818103606083015261272981846123ea565b905095945050505050565b600060208201905061274960008301846123db565b92915050565b600060208201905081810360008301526127698184612423565b905092915050565b6000602082019050818103600083015261278a8161248d565b9050919050565b600060208201905081810360008301526127aa816124b0565b9050919050565b600060208201905081810360008301526127ca816124d3565b9050919050565b600060208201905081810360008301526127ea816124f6565b9050919050565b6000602082019050818103600083015261280a81612519565b9050919050565b6000602082019050818103600083015261282a8161253c565b9050919050565b6000602082019050818103600083015261284a8161255f565b9050919050565b6000602082019050818103600083015261286a81612582565b9050919050565b6000602082019050818103600083015261288a816125a5565b9050919050565b600060208201905081810360008301526128aa816125c8565b9050919050565b600060208201905081810360008301526128ca816125eb565b9050919050565b600060208201905081810360008301526128ea8161260e565b9050919050565b6000602082019050818103600083015261290a81612631565b9050919050565b6000602082019050818103600083015261292a81612654565b9050919050565b6000602082019050818103600083015261294a81612677565b9050919050565b6000602082019050612966600083018461269a565b92915050565b6000612976612987565b90506129828282612bd9565b919050565b6000604051905090565b600067ffffffffffffffff8211156129ac576129ab612d11565b5b6129b582612d40565b9050602081019050919050565b600067ffffffffffffffff8211156129dd576129dc612d11565b5b6129e682612d40565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612a4182612b5b565b9150612a4c83612b5b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612a8157612a80612c84565b5b828201905092915050565b6000612a9782612b5b565b9150612aa283612b5b565b925082612ab257612ab1612cb3565b5b828204905092915050565b6000612ac882612b5b565b9150612ad383612b5b565b925082821015612ae657612ae5612c84565b5b828203905092915050565b6000612afc82612b3b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612b92578082015181840152602081019050612b77565b83811115612ba1576000848401525b50505050565b60006002820490506001821680612bbf57607f821691505b60208210811415612bd357612bd2612ce2565b5b50919050565b612be282612d40565b810181811067ffffffffffffffff82111715612c0157612c00612d11565b5b80604052505050565b6000612c1582612b5b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612c4857612c47612c84565b5b600182019050919050565b6000612c5e82612b5b565b9150612c6983612b5b565b925082612c7957612c78612cb3565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f49276d20736f72727920616c6c204e4654732068617665206265656e206d696e60008201527f7465640000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b61316381612af1565b811461316e57600080fd5b50565b61317a81612b03565b811461318557600080fd5b50565b61319181612b0f565b811461319c57600080fd5b50565b6131a881612b5b565b81146131b357600080fd5b5056fea2646970667358221220299eac7b7e33889fc998fd83ffc6733439e05afe7545ac07dd15e4634882828564736f6c63430008040033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061010b5760003560e01c80634f6ccce7116100a2578063a22cb46511610071578063a22cb465146102de578063b88d4fde146102fa578063c87b56dd14610316578063d204c45e14610346578063e985e9c5146103625761010b565b80634f6ccce7146102305780636352211e1461026057806370a082311461029057806395d89b41146102c05761010b565b806318160ddd116100de57806318160ddd146101aa57806323b872dd146101c85780632f745c59146101e457806342842e0e146102145761010b565b806301ffc9a71461011057806306fdde0314610140578063081812fc1461015e578063095ea7b31461018e575b600080fd5b61012a60048036038101906101259190612351565b610392565b6040516101379190612734565b60405180910390f35b6101486103a4565b604051610155919061274f565b60405180910390f35b610178600480360381019061017391906123a3565b610436565b60405161018591906126cd565b60405180910390f35b6101a860048036038101906101a39190612315565b61047c565b005b6101b2610594565b6040516101bf9190612951565b60405180910390f35b6101e260048036038101906101dd91906121bb565b6105a1565b005b6101fe60048036038101906101f99190612315565b610601565b60405161020b9190612951565b60405180910390f35b61022e600480360381019061022991906121bb565b6106a6565b005b61024a600480360381019061024591906123a3565b6106c6565b6040516102579190612951565b60405180910390f35b61027a600480360381019061027591906123a3565b61075d565b60405161028791906126cd565b60405180910390f35b6102aa60048036038101906102a59190612156565b61080f565b6040516102b79190612951565b60405180910390f35b6102c86108c7565b6040516102d5919061274f565b60405180910390f35b6102f860048036038101906102f39190612285565b610959565b005b610314600480360381019061030f919061220a565b61096f565b005b610330600480360381019061032b91906123a3565b6109d1565b60405161033d919061274f565b60405180910390f35b610360600480360381019061035b91906122c1565b6109e3565b005b61037c6004803603810190610377919061217f565b610a59565b6040516103899190612734565b60405180910390f35b600061039d82610aed565b9050919050565b6060600080546103b390612ba7565b80601f01602080910402602001604051908101604052809291908181526020018280546103df90612ba7565b801561042c5780601f106104015761010080835404028352916020019161042c565b820191906000526020600020905b81548152906001019060200180831161040f57829003601f168201915b5050505050905090565b600061044182610b67565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006104878261075d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156104f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ef906128d1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610517610bb2565b73ffffffffffffffffffffffffffffffffffffffff161480610546575061054581610540610bb2565b610a59565b5b610585576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161057c90612871565b60405180910390fd5b61058f8383610bba565b505050565b6000600880549050905090565b6105b26105ac610bb2565b82610c73565b6105f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e890612931565b60405180910390fd5b6105fc838383610d08565b505050565b600061060c8361080f565b821061064d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064490612771565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6106c18383836040518060200160405280600081525061096f565b505050565b60006106d0610594565b8210610711576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610708906128f1565b60405180910390fd5b6008828154811061074b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610806576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fd906128b1565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610880576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087790612831565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600180546108d690612ba7565b80601f016020809104026020016040519081016040528092919081815260200182805461090290612ba7565b801561094f5780601f106109245761010080835404028352916020019161094f565b820191906000526020600020905b81548152906001019060200180831161093257829003601f168201915b5050505050905090565b61096b610964610bb2565b8383610f6f565b5050565b61098061097a610bb2565b83610c73565b6109bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b690612931565b60405180910390fd5b6109cb848484846110dc565b50505050565b60606109dc82611138565b9050919050565b60006109ef600b61124b565b9050600c54811115610a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2d90612911565b60405180910390fd5b610a40600b611259565b610a4a838261126f565b610a54818361128d565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b605750610b5f82611301565b5b9050919050565b610b70816113e3565b610baf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba6906128b1565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610c2d8361075d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610c7f8361075d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610cc15750610cc08185610a59565b5b80610cff57508373ffffffffffffffffffffffffffffffffffffffff16610ce784610436565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610d288261075d565b73ffffffffffffffffffffffffffffffffffffffff1614610d7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d75906127b1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610dee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de5906127f1565b60405180910390fd5b610df983838361144f565b610e04600082610bba565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e549190612abd565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610eab9190612a36565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f6a83838361145f565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd590612811565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110cf9190612734565b60405180910390a3505050565b6110e7848484610d08565b6110f384848484611464565b611132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112990612791565b60405180910390fd5b50505050565b606061114382610b67565b6000600a6000848152602001908152602001600020805461116390612ba7565b80601f016020809104026020016040519081016040528092919081815260200182805461118f90612ba7565b80156111dc5780601f106111b1576101008083540402835291602001916111dc565b820191906000526020600020905b8154815290600101906020018083116111bf57829003601f168201915b5050505050905060006111ed6115fb565b9050600081511415611203578192505050611246565b6000825111156112385780826040516020016112209291906126a9565b60405160208183030381529060405292505050611246565b61124184611612565b925050505b919050565b600081600001549050919050565b6001816000016000828254019250508190555050565b61128982826040518060200160405280600081525061167a565b5050565b611296826113e3565b6112d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cc90612851565b60405180910390fd5b80600a600084815260200190815260200160002090805190602001906112fc929190611f7a565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806113cc57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806113dc57506113db826116d5565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b61145a83838361173f565b505050565b505050565b60006114858473ffffffffffffffffffffffffffffffffffffffff16611853565b156115ee578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026114ae610bb2565b8786866040518563ffffffff1660e01b81526004016114d094939291906126e8565b602060405180830381600087803b1580156114ea57600080fd5b505af192505050801561151b57506040513d601f19601f82011682018060405250810190611518919061237a565b60015b61159e573d806000811461154b576040519150601f19603f3d011682016040523d82523d6000602084013e611550565b606091505b50600081511415611596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158d90612791565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506115f3565b600190505b949350505050565b606060405180602001604052806000815250905090565b606061161d82610b67565b60006116276115fb565b905060008151116116475760405180602001604052806000815250611672565b8061165184611876565b6040516020016116629291906126a9565b6040516020818303038152906040525b915050919050565b6116848383611a23565b6116916000848484611464565b6116d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c790612791565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61174a838383611bfd565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561178d5761178881611c02565b6117cc565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146117cb576117ca8382611c4b565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561180f5761180a81611db8565b61184e565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461184d5761184c8282611efb565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606060008214156118be576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611a1e565b600082905060005b600082146118f05780806118d990612c0a565b915050600a826118e99190612a8c565b91506118c6565b60008167ffffffffffffffff811115611932577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156119645781602001600182028036833780820191505090505b5090505b60008514611a175760018261197d9190612abd565b9150600a8561198c9190612c53565b60306119989190612a36565b60f81b8183815181106119d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611a109190612a8c565b9450611968565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8a90612891565b60405180910390fd5b611a9c816113e3565b15611adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad3906127d1565b60405180910390fd5b611ae86000838361144f565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b389190612a36565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611bf96000838361145f565b5050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001611c588461080f565b611c629190612abd565b9050600060076000848152602001908152602001600020549050818114611d47576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050611dcc9190612abd565b9050600060096000848152602001908152602001600020549050600060088381548110611e22577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110611e6a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480611edf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000611f068361080f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054611f8690612ba7565b90600052602060002090601f016020900481019282611fa85760008555611fef565b82601f10611fc157805160ff1916838001178555611fef565b82800160010185558215611fef579182015b82811115611fee578251825591602001919060010190611fd3565b5b509050611ffc9190612000565b5090565b5b80821115612019576000816000905550600101612001565b5090565b600061203061202b84612991565b61296c565b90508281526020810184848401111561204857600080fd5b612053848285612b65565b509392505050565b600061206e612069846129c2565b61296c565b90508281526020810184848401111561208657600080fd5b612091848285612b65565b509392505050565b6000813590506120a88161315a565b92915050565b6000813590506120bd81613171565b92915050565b6000813590506120d281613188565b92915050565b6000815190506120e781613188565b92915050565b600082601f8301126120fe57600080fd5b813561210e84826020860161201d565b91505092915050565b600082601f83011261212857600080fd5b813561213884826020860161205b565b91505092915050565b6000813590506121508161319f565b92915050565b60006020828403121561216857600080fd5b600061217684828501612099565b91505092915050565b6000806040838503121561219257600080fd5b60006121a085828601612099565b92505060206121b185828601612099565b9150509250929050565b6000806000606084860312156121d057600080fd5b60006121de86828701612099565b93505060206121ef86828701612099565b925050604061220086828701612141565b9150509250925092565b6000806000806080858703121561222057600080fd5b600061222e87828801612099565b945050602061223f87828801612099565b935050604061225087828801612141565b925050606085013567ffffffffffffffff81111561226d57600080fd5b612279878288016120ed565b91505092959194509250565b6000806040838503121561229857600080fd5b60006122a685828601612099565b92505060206122b7858286016120ae565b9150509250929050565b600080604083850312156122d457600080fd5b60006122e285828601612099565b925050602083013567ffffffffffffffff8111156122ff57600080fd5b61230b85828601612117565b9150509250929050565b6000806040838503121561232857600080fd5b600061233685828601612099565b925050602061234785828601612141565b9150509250929050565b60006020828403121561236357600080fd5b6000612371848285016120c3565b91505092915050565b60006020828403121561238c57600080fd5b600061239a848285016120d8565b91505092915050565b6000602082840312156123b557600080fd5b60006123c384828501612141565b91505092915050565b6123d581612af1565b82525050565b6123e481612b03565b82525050565b60006123f5826129f3565b6123ff8185612a09565b935061240f818560208601612b74565b61241881612d40565b840191505092915050565b600061242e826129fe565b6124388185612a1a565b9350612448818560208601612b74565b61245181612d40565b840191505092915050565b6000612467826129fe565b6124718185612a2b565b9350612481818560208601612b74565b80840191505092915050565b600061249a602b83612a1a565b91506124a582612d51565b604082019050919050565b60006124bd603283612a1a565b91506124c882612da0565b604082019050919050565b60006124e0602583612a1a565b91506124eb82612def565b604082019050919050565b6000612503601c83612a1a565b915061250e82612e3e565b602082019050919050565b6000612526602483612a1a565b915061253182612e67565b604082019050919050565b6000612549601983612a1a565b915061255482612eb6565b602082019050919050565b600061256c602983612a1a565b915061257782612edf565b604082019050919050565b600061258f602e83612a1a565b915061259a82612f2e565b604082019050919050565b60006125b2603e83612a1a565b91506125bd82612f7d565b604082019050919050565b60006125d5602083612a1a565b91506125e082612fcc565b602082019050919050565b60006125f8601883612a1a565b915061260382612ff5565b602082019050919050565b600061261b602183612a1a565b91506126268261301e565b604082019050919050565b600061263e602c83612a1a565b91506126498261306d565b604082019050919050565b6000612661602383612a1a565b915061266c826130bc565b604082019050919050565b6000612684602e83612a1a565b915061268f8261310b565b604082019050919050565b6126a381612b5b565b82525050565b60006126b5828561245c565b91506126c1828461245c565b91508190509392505050565b60006020820190506126e260008301846123cc565b92915050565b60006080820190506126fd60008301876123cc565b61270a60208301866123cc565b612717604083018561269a565b818103606083015261272981846123ea565b905095945050505050565b600060208201905061274960008301846123db565b92915050565b600060208201905081810360008301526127698184612423565b905092915050565b6000602082019050818103600083015261278a8161248d565b9050919050565b600060208201905081810360008301526127aa816124b0565b9050919050565b600060208201905081810360008301526127ca816124d3565b9050919050565b600060208201905081810360008301526127ea816124f6565b9050919050565b6000602082019050818103600083015261280a81612519565b9050919050565b6000602082019050818103600083015261282a8161253c565b9050919050565b6000602082019050818103600083015261284a8161255f565b9050919050565b6000602082019050818103600083015261286a81612582565b9050919050565b6000602082019050818103600083015261288a816125a5565b9050919050565b600060208201905081810360008301526128aa816125c8565b9050919050565b600060208201905081810360008301526128ca816125eb565b9050919050565b600060208201905081810360008301526128ea8161260e565b9050919050565b6000602082019050818103600083015261290a81612631565b9050919050565b6000602082019050818103600083015261292a81612654565b9050919050565b6000602082019050818103600083015261294a81612677565b9050919050565b6000602082019050612966600083018461269a565b92915050565b6000612976612987565b90506129828282612bd9565b919050565b6000604051905090565b600067ffffffffffffffff8211156129ac576129ab612d11565b5b6129b582612d40565b9050602081019050919050565b600067ffffffffffffffff8211156129dd576129dc612d11565b5b6129e682612d40565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612a4182612b5b565b9150612a4c83612b5b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612a8157612a80612c84565b5b828201905092915050565b6000612a9782612b5b565b9150612aa283612b5b565b925082612ab257612ab1612cb3565b5b828204905092915050565b6000612ac882612b5b565b9150612ad383612b5b565b925082821015612ae657612ae5612c84565b5b828203905092915050565b6000612afc82612b3b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612b92578082015181840152602081019050612b77565b83811115612ba1576000848401525b50505050565b60006002820490506001821680612bbf57607f821691505b60208210811415612bd357612bd2612ce2565b5b50919050565b612be282612d40565b810181811067ffffffffffffffff82111715612c0157612c00612d11565b5b80604052505050565b6000612c1582612b5b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612c4857612c47612c84565b5b600182019050919050565b6000612c5e82612b5b565b9150612c6983612b5b565b925082612c7957612c78612cb3565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f49276d20736f72727920616c6c204e4654732068617665206265656e206d696e60008201527f7465640000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b61316381612af1565b811461316e57600080fd5b50565b61317a81612b03565b811461318557600080fd5b50565b61319181612b0f565b811461319c57600080fd5b50565b6131a881612b5b565b81146131b357600080fd5b5056fea2646970667358221220299eac7b7e33889fc998fd83ffc6733439e05afe7545ac07dd15e4634882828564736f6c63430008040033

Deployed Bytecode Sourcemap

47068:1401:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48254:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25608:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27121:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26638:417;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41487:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27821:336;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41155:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28228:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41677:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25319:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25050:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25777:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27364:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28484:323;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48050:196;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47331:306;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27590:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48254:212;48393:4;48422:36;48446:11;48422:23;:36::i;:::-;48415:43;;48254:212;;;:::o;25608:100::-;25662:13;25695:5;25688:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25608:100;:::o;27121:171::-;27197:7;27217:23;27232:7;27217:14;:23::i;:::-;27260:15;:24;27276:7;27260:24;;;;;;;;;;;;;;;;;;;;;27253:31;;27121:171;;;:::o;26638:417::-;26719:13;26735:23;26750:7;26735:14;:23::i;:::-;26719:39;;26783:5;26777:11;;:2;:11;;;;26769:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26877:5;26861:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26886:37;26903:5;26910:12;:10;:12::i;:::-;26886:16;:37::i;:::-;26861:62;26839:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;27026:21;27035:2;27039:7;27026:8;:21::i;:::-;26638:417;;;:::o;41487:113::-;41548:7;41575:10;:17;;;;41568:24;;41487:113;:::o;27821:336::-;28016:41;28035:12;:10;:12::i;:::-;28049:7;28016:18;:41::i;:::-;28008:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;28121:28;28131:4;28137:2;28141:7;28121:9;:28::i;:::-;27821:336;;;:::o;41155:256::-;41252:7;41288:23;41305:5;41288:16;:23::i;:::-;41280:5;:31;41272:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;41377:12;:19;41390:5;41377:19;;;;;;;;;;;;;;;:26;41397:5;41377:26;;;;;;;;;;;;41370:33;;41155:256;;;;:::o;28228:185::-;28366:39;28383:4;28389:2;28393:7;28366:39;;;;;;;;;;;;:16;:39::i;:::-;28228:185;;;:::o;41677:233::-;41752:7;41788:30;:28;:30::i;:::-;41780:5;:38;41772:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;41885:10;41896:5;41885:17;;;;;;;;;;;;;;;;;;;;;;;;41878:24;;41677:233;;;:::o;25319:222::-;25391:7;25411:13;25427:7;:16;25435:7;25427:16;;;;;;;;;;;;;;;;;;;;;25411:32;;25479:1;25462:19;;:5;:19;;;;25454:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;25528:5;25521:12;;;25319:222;;;:::o;25050:207::-;25122:7;25167:1;25150:19;;:5;:19;;;;25142:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25233:9;:16;25243:5;25233:16;;;;;;;;;;;;;;;;25226:23;;25050:207;;;:::o;25777:104::-;25833:13;25866:7;25859:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25777:104;:::o;27364:155::-;27459:52;27478:12;:10;:12::i;:::-;27492:8;27502;27459:18;:52::i;:::-;27364:155;;:::o;28484:323::-;28658:41;28677:12;:10;:12::i;:::-;28691:7;28658:18;:41::i;:::-;28650:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;28761:38;28775:4;28781:2;28785:7;28794:4;28761:13;:38::i;:::-;28484:323;;;;:::o;48050:196::-;48177:13;48215:23;48230:7;48215:14;:23::i;:::-;48208:30;;48050:196;;;:::o;47331:306::-;47398:15;47416:25;:15;:23;:25::i;:::-;47398:43;;47471:10;;47460:7;:21;;47452:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;47532:27;:15;:25;:27::i;:::-;47570:22;47580:2;47584:7;47570:9;:22::i;:::-;47603:26;47616:7;47625:3;47603:12;:26::i;:::-;47331:306;;;:::o;27590:164::-;27687:4;27711:18;:25;27730:5;27711:25;;;;;;;;;;;;;;;:35;27737:8;27711:35;;;;;;;;;;;;;;;;;;;;;;;;;27704:42;;27590:164;;;;:::o;40847:224::-;40949:4;40988:35;40973:50;;;:11;:50;;;;:90;;;;41027:36;41051:11;41027:23;:36::i;:::-;40973:90;40966:97;;40847:224;;;:::o;35096:135::-;35178:16;35186:7;35178;:16::i;:::-;35170:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;35096:135;:::o;4692:98::-;4745:7;4772:10;4765:17;;4692:98;:::o;34375:174::-;34477:2;34450:15;:24;34466:7;34450:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34533:7;34529:2;34495:46;;34504:23;34519:7;34504:14;:23::i;:::-;34495:46;;;;;;;;;;;;34375:174;;:::o;30608:264::-;30701:4;30718:13;30734:23;30749:7;30734:14;:23::i;:::-;30718:39;;30787:5;30776:16;;:7;:16;;;:52;;;;30796:32;30813:5;30820:7;30796:16;:32::i;:::-;30776:52;:87;;;;30856:7;30832:31;;:20;30844:7;30832:11;:20::i;:::-;:31;;;30776:87;30768:96;;;30608:264;;;;:::o;33631:625::-;33790:4;33763:31;;:23;33778:7;33763:14;:23::i;:::-;:31;;;33755:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;33869:1;33855:16;;:2;:16;;;;33847:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33925:39;33946:4;33952:2;33956:7;33925:20;:39::i;:::-;34029:29;34046:1;34050:7;34029:8;:29::i;:::-;34090:1;34071:9;:15;34081:4;34071:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34119:1;34102:9;:13;34112:2;34102:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34150:2;34131:7;:16;34139:7;34131:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34189:7;34185:2;34170:27;;34179:4;34170:27;;;;;;;;;;;;34210:38;34230:4;34236:2;34240:7;34210:19;:38::i;:::-;33631:625;;;:::o;34692:315::-;34847:8;34838:17;;:5;:17;;;;34830:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;34934:8;34896:18;:25;34915:5;34896:25;;;;;;;;;;;;;;;:35;34922:8;34896:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;34980:8;34958:41;;34973:5;34958:41;;;34990:8;34958:41;;;;;;:::i;:::-;;;;;;;;34692:315;;;:::o;29688:313::-;29844:28;29854:4;29860:2;29864:7;29844:9;:28::i;:::-;29891:47;29914:4;29920:2;29924:7;29933:4;29891:22;:47::i;:::-;29883:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;29688:313;;;;:::o;38395:624::-;38468:13;38494:23;38509:7;38494:14;:23::i;:::-;38530;38556:10;:19;38567:7;38556:19;;;;;;;;;;;38530:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38586:18;38607:10;:8;:10::i;:::-;38586:31;;38715:1;38699:4;38693:18;:23;38689:72;;;38740:9;38733:16;;;;;;38689:72;38891:1;38871:9;38865:23;:27;38861:108;;;38940:4;38946:9;38923:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38909:48;;;;;;38861:108;38988:23;39003:7;38988:14;:23::i;:::-;38981:30;;;;38395:624;;;;:::o;911:114::-;976:7;1003;:14;;;996:21;;911:114;;;:::o;1033:127::-;1140:1;1122:7;:14;;;:19;;;;;;;;;;;1033:127;:::o;31214:110::-;31290:26;31300:2;31304:7;31290:26;;;;;;;;;;;;:9;:26::i;:::-;31214:110;;:::o;39175:217::-;39275:16;39283:7;39275;:16::i;:::-;39267:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;39375:9;39353:10;:19;39364:7;39353:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;39175:217;;:::o;24681:305::-;24783:4;24835:25;24820:40;;;:11;:40;;;;:105;;;;24892:33;24877:48;;;:11;:48;;;;24820:105;:158;;;;24942:36;24966:11;24942:23;:36::i;:::-;24820:158;24800:178;;24681:305;;;:::o;30314:127::-;30379:4;30431:1;30403:30;;:7;:16;30411:7;30403:16;;;;;;;;;;;;;;;;;;;;;:30;;;;30396:37;;30314:127;;;:::o;47715:204::-;47866:45;47893:4;47899:2;47903:7;47866:26;:45::i;:::-;47715:204;;;:::o;37731:125::-;;;;:::o;35795:853::-;35949:4;35970:15;:2;:13;;;:15::i;:::-;35966:675;;;36022:2;36006:36;;;36043:12;:10;:12::i;:::-;36057:4;36063:7;36072:4;36006:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36002:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36264:1;36247:6;:13;:18;36243:328;;;36290:60;;;;;;;;;;:::i;:::-;;;;;;;;36243:328;36521:6;36515:13;36506:6;36502:2;36498:15;36491:38;36002:584;36138:41;;;36128:51;;;:6;:51;;;;36121:58;;;;;35966:675;36625:4;36618:11;;35795:853;;;;;;;:::o;26482:94::-;26533:13;26559:9;;;;;;;;;;;;;;26482:94;:::o;25952:281::-;26025:13;26051:23;26066:7;26051:14;:23::i;:::-;26087:21;26111:10;:8;:10::i;:::-;26087:34;;26163:1;26145:7;26139:21;:25;:86;;;;;;;;;;;;;;;;;26191:7;26200:18;:7;:16;:18::i;:::-;26174:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26139:86;26132:93;;;25952:281;;;:::o;31551:319::-;31680:18;31686:2;31690:7;31680:5;:18::i;:::-;31731:53;31762:1;31766:2;31770:7;31779:4;31731:22;:53::i;:::-;31709:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;31551:319;;;:::o;16319:157::-;16404:4;16443:25;16428:40;;;:11;:40;;;;16421:47;;16319:157;;;:::o;42523:589::-;42667:45;42694:4;42700:2;42704:7;42667:26;:45::i;:::-;42745:1;42729:18;;:4;:18;;;42725:187;;;42764:40;42796:7;42764:31;:40::i;:::-;42725:187;;;42834:2;42826:10;;:4;:10;;;42822:90;;42853:47;42886:4;42892:7;42853:32;:47::i;:::-;42822:90;42725:187;42940:1;42926:16;;:2;:16;;;42922:183;;;42959:45;42996:7;42959:36;:45::i;:::-;42922:183;;;43032:4;43026:10;;:2;:10;;;43022:83;;43053:40;43081:2;43085:7;43053:27;:40::i;:::-;43022:83;42922:183;42523:589;;;:::o;6145:326::-;6205:4;6462:1;6440:7;:19;;;:23;6433:30;;6145:326;;;:::o;1940:723::-;1996:13;2226:1;2217:5;:10;2213:53;;;2244:10;;;;;;;;;;;;;;;;;;;;;2213:53;2276:12;2291:5;2276:20;;2307:14;2332:78;2347:1;2339:4;:9;2332:78;;2365:8;;;;;:::i;:::-;;;;2396:2;2388:10;;;;;:::i;:::-;;;2332:78;;;2420:19;2452:6;2442:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2420:39;;2470:154;2486:1;2477:5;:10;2470:154;;2514:1;2504:11;;;;;:::i;:::-;;;2581:2;2573:5;:10;;;;:::i;:::-;2560:2;:24;;;;:::i;:::-;2547:39;;2530:6;2537;2530:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;2610:2;2601:11;;;;;:::i;:::-;;;2470:154;;;2648:6;2634:21;;;;;1940:723;;;;:::o;32206:439::-;32300:1;32286:16;;:2;:16;;;;32278:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32359:16;32367:7;32359;:16::i;:::-;32358:17;32350:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32421:45;32450:1;32454:2;32458:7;32421:20;:45::i;:::-;32496:1;32479:9;:13;32489:2;32479:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32527:2;32508:7;:16;32516:7;32508:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32572:7;32568:2;32547:33;;32564:1;32547:33;;;;;;;;;;;;32593:44;32621:1;32625:2;32629:7;32593:19;:44::i;:::-;32206:439;;:::o;37220:126::-;;;;:::o;43835:164::-;43939:10;:17;;;;43912:15;:24;43928:7;43912:24;;;;;;;;;;;:44;;;;43967:10;43983:7;43967:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43835:164;:::o;44626:988::-;44892:22;44942:1;44917:22;44934:4;44917:16;:22::i;:::-;:26;;;;:::i;:::-;44892:51;;44954:18;44975:17;:26;44993:7;44975:26;;;;;;;;;;;;44954:47;;45122:14;45108:10;:28;45104:328;;45153:19;45175:12;:18;45188:4;45175:18;;;;;;;;;;;;;;;:34;45194:14;45175:34;;;;;;;;;;;;45153:56;;45259:11;45226:12;:18;45239:4;45226:18;;;;;;;;;;;;;;;:30;45245:10;45226:30;;;;;;;;;;;:44;;;;45376:10;45343:17;:30;45361:11;45343:30;;;;;;;;;;;:43;;;;45104:328;;45528:17;:26;45546:7;45528:26;;;;;;;;;;;45521:33;;;45572:12;:18;45585:4;45572:18;;;;;;;;;;;;;;;:34;45591:14;45572:34;;;;;;;;;;;45565:41;;;44626:988;;;;:::o;45909:1079::-;46162:22;46207:1;46187:10;:17;;;;:21;;;;:::i;:::-;46162:46;;46219:18;46240:15;:24;46256:7;46240:24;;;;;;;;;;;;46219:45;;46591:19;46613:10;46624:14;46613:26;;;;;;;;;;;;;;;;;;;;;;;;46591:48;;46677:11;46652:10;46663;46652:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;46788:10;46757:15;:28;46773:11;46757:28;;;;;;;;;;;:41;;;;46929:15;:24;46945:7;46929:24;;;;;;;;;;;46922:31;;;46964:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45909:1079;;;;:::o;43413:221::-;43498:14;43515:20;43532:2;43515:16;:20::i;:::-;43498:37;;43573:7;43546:12;:16;43559:2;43546:16;;;;;;;;;;;;;;;:24;43563:6;43546:24;;;;;;;;;;;:34;;;;43620:6;43591:17;:26;43609:7;43591:26;;;;;;;;;;;:35;;;;43413:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1036:5;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;1190:5;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;1349:5;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;1641:5;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;1910:5;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:262::-;2068:6;2117:2;2105:9;2096:7;2092:23;2088:32;2085:2;;;2133:1;2130;2123:12;2085:2;2176:1;2201:53;2246:7;2237:6;2226:9;2222:22;2201:53;:::i;:::-;2191:63;;2147:117;2075:196;;;;:::o;2277:407::-;2345:6;2353;2402:2;2390:9;2381:7;2377:23;2373:32;2370:2;;;2418:1;2415;2408:12;2370:2;2461:1;2486:53;2531:7;2522:6;2511:9;2507:22;2486:53;:::i;:::-;2476:63;;2432:117;2588:2;2614:53;2659:7;2650:6;2639:9;2635:22;2614:53;:::i;:::-;2604:63;;2559:118;2360:324;;;;;:::o;2690:552::-;2767:6;2775;2783;2832:2;2820:9;2811:7;2807:23;2803:32;2800:2;;;2848:1;2845;2838:12;2800:2;2891:1;2916:53;2961:7;2952:6;2941:9;2937:22;2916:53;:::i;:::-;2906:63;;2862:117;3018:2;3044:53;3089:7;3080:6;3069:9;3065:22;3044:53;:::i;:::-;3034:63;;2989:118;3146:2;3172:53;3217:7;3208:6;3197:9;3193:22;3172:53;:::i;:::-;3162:63;;3117:118;2790:452;;;;;:::o;3248:809::-;3343:6;3351;3359;3367;3416:3;3404:9;3395:7;3391:23;3387:33;3384:2;;;3433:1;3430;3423:12;3384:2;3476:1;3501:53;3546:7;3537:6;3526:9;3522:22;3501:53;:::i;:::-;3491:63;;3447:117;3603:2;3629:53;3674:7;3665:6;3654:9;3650:22;3629:53;:::i;:::-;3619:63;;3574:118;3731:2;3757:53;3802:7;3793:6;3782:9;3778:22;3757:53;:::i;:::-;3747:63;;3702:118;3887:2;3876:9;3872:18;3859:32;3918:18;3910:6;3907:30;3904:2;;;3950:1;3947;3940:12;3904:2;3978:62;4032:7;4023:6;4012:9;4008:22;3978:62;:::i;:::-;3968:72;;3830:220;3374:683;;;;;;;:::o;4063:401::-;4128:6;4136;4185:2;4173:9;4164:7;4160:23;4156:32;4153:2;;;4201:1;4198;4191:12;4153:2;4244:1;4269:53;4314:7;4305:6;4294:9;4290:22;4269:53;:::i;:::-;4259:63;;4215:117;4371:2;4397:50;4439:7;4430:6;4419:9;4415:22;4397:50;:::i;:::-;4387:60;;4342:115;4143:321;;;;;:::o;4470:520::-;4548:6;4556;4605:2;4593:9;4584:7;4580:23;4576:32;4573:2;;;4621:1;4618;4611:12;4573:2;4664:1;4689:53;4734:7;4725:6;4714:9;4710:22;4689:53;:::i;:::-;4679:63;;4635:117;4819:2;4808:9;4804:18;4791:32;4850:18;4842:6;4839:30;4836:2;;;4882:1;4879;4872:12;4836:2;4910:63;4965:7;4956:6;4945:9;4941:22;4910:63;:::i;:::-;4900:73;;4762:221;4563:427;;;;;:::o;4996:407::-;5064:6;5072;5121:2;5109:9;5100:7;5096:23;5092:32;5089:2;;;5137:1;5134;5127:12;5089:2;5180:1;5205:53;5250:7;5241:6;5230:9;5226:22;5205:53;:::i;:::-;5195:63;;5151:117;5307:2;5333:53;5378:7;5369:6;5358:9;5354:22;5333:53;:::i;:::-;5323:63;;5278:118;5079:324;;;;;:::o;5409:260::-;5467:6;5516:2;5504:9;5495:7;5491:23;5487:32;5484:2;;;5532:1;5529;5522:12;5484:2;5575:1;5600:52;5644:7;5635:6;5624:9;5620:22;5600:52;:::i;:::-;5590:62;;5546:116;5474:195;;;;:::o;5675:282::-;5744:6;5793:2;5781:9;5772:7;5768:23;5764:32;5761:2;;;5809:1;5806;5799:12;5761:2;5852:1;5877:63;5932:7;5923:6;5912:9;5908:22;5877:63;:::i;:::-;5867:73;;5823:127;5751:206;;;;:::o;5963:262::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:2;;;6087:1;6084;6077:12;6039:2;6130:1;6155:53;6200:7;6191:6;6180:9;6176:22;6155:53;:::i;:::-;6145:63;;6101:117;6029:196;;;;:::o;6231:118::-;6318:24;6336:5;6318:24;:::i;:::-;6313:3;6306:37;6296:53;;:::o;6355:109::-;6436:21;6451:5;6436:21;:::i;:::-;6431:3;6424:34;6414:50;;:::o;6470:360::-;6556:3;6584:38;6616:5;6584:38;:::i;:::-;6638:70;6701:6;6696:3;6638:70;:::i;:::-;6631:77;;6717:52;6762:6;6757:3;6750:4;6743:5;6739:16;6717:52;:::i;:::-;6794:29;6816:6;6794:29;:::i;:::-;6789:3;6785:39;6778:46;;6560:270;;;;;:::o;6836:364::-;6924:3;6952:39;6985:5;6952:39;:::i;:::-;7007:71;7071:6;7066:3;7007:71;:::i;:::-;7000:78;;7087:52;7132:6;7127:3;7120:4;7113:5;7109:16;7087:52;:::i;:::-;7164:29;7186:6;7164:29;:::i;:::-;7159:3;7155:39;7148:46;;6928:272;;;;;:::o;7206:377::-;7312:3;7340:39;7373:5;7340:39;:::i;:::-;7395:89;7477:6;7472:3;7395:89;:::i;:::-;7388:96;;7493:52;7538:6;7533:3;7526:4;7519:5;7515:16;7493:52;:::i;:::-;7570:6;7565:3;7561:16;7554:23;;7316:267;;;;;:::o;7589:366::-;7731:3;7752:67;7816:2;7811:3;7752:67;:::i;:::-;7745:74;;7828:93;7917:3;7828:93;:::i;:::-;7946:2;7941:3;7937:12;7930:19;;7735:220;;;:::o;7961:366::-;8103:3;8124:67;8188:2;8183:3;8124:67;:::i;:::-;8117:74;;8200:93;8289:3;8200:93;:::i;:::-;8318:2;8313:3;8309:12;8302:19;;8107:220;;;:::o;8333:366::-;8475:3;8496:67;8560:2;8555:3;8496:67;:::i;:::-;8489:74;;8572:93;8661:3;8572:93;:::i;:::-;8690:2;8685:3;8681:12;8674:19;;8479:220;;;:::o;8705:366::-;8847:3;8868:67;8932:2;8927:3;8868:67;:::i;:::-;8861:74;;8944:93;9033:3;8944:93;:::i;:::-;9062:2;9057:3;9053:12;9046:19;;8851:220;;;:::o;9077:366::-;9219:3;9240:67;9304:2;9299:3;9240:67;:::i;:::-;9233:74;;9316:93;9405:3;9316:93;:::i;:::-;9434:2;9429:3;9425:12;9418:19;;9223:220;;;:::o;9449:366::-;9591:3;9612:67;9676:2;9671:3;9612:67;:::i;:::-;9605:74;;9688:93;9777:3;9688:93;:::i;:::-;9806:2;9801:3;9797:12;9790:19;;9595:220;;;:::o;9821:366::-;9963:3;9984:67;10048:2;10043:3;9984:67;:::i;:::-;9977:74;;10060:93;10149:3;10060:93;:::i;:::-;10178:2;10173:3;10169:12;10162:19;;9967:220;;;:::o;10193:366::-;10335:3;10356:67;10420:2;10415:3;10356:67;:::i;:::-;10349:74;;10432:93;10521:3;10432:93;:::i;:::-;10550:2;10545:3;10541:12;10534:19;;10339:220;;;:::o;10565:366::-;10707:3;10728:67;10792:2;10787:3;10728:67;:::i;:::-;10721:74;;10804:93;10893:3;10804:93;:::i;:::-;10922:2;10917:3;10913:12;10906:19;;10711:220;;;:::o;10937:366::-;11079:3;11100:67;11164:2;11159:3;11100:67;:::i;:::-;11093:74;;11176:93;11265:3;11176:93;:::i;:::-;11294:2;11289:3;11285:12;11278:19;;11083:220;;;:::o;11309:366::-;11451:3;11472:67;11536:2;11531:3;11472:67;:::i;:::-;11465:74;;11548:93;11637:3;11548:93;:::i;:::-;11666:2;11661:3;11657:12;11650:19;;11455:220;;;:::o;11681:366::-;11823:3;11844:67;11908:2;11903:3;11844:67;:::i;:::-;11837:74;;11920:93;12009:3;11920:93;:::i;:::-;12038:2;12033:3;12029:12;12022:19;;11827:220;;;:::o;12053:366::-;12195:3;12216:67;12280:2;12275:3;12216:67;:::i;:::-;12209:74;;12292:93;12381:3;12292:93;:::i;:::-;12410:2;12405:3;12401:12;12394:19;;12199:220;;;:::o;12425:366::-;12567:3;12588:67;12652:2;12647:3;12588:67;:::i;:::-;12581:74;;12664:93;12753:3;12664:93;:::i;:::-;12782:2;12777:3;12773:12;12766:19;;12571:220;;;:::o;12797:366::-;12939:3;12960:67;13024:2;13019:3;12960:67;:::i;:::-;12953:74;;13036:93;13125:3;13036:93;:::i;:::-;13154:2;13149:3;13145:12;13138:19;;12943:220;;;:::o;13169:118::-;13256:24;13274:5;13256:24;:::i;:::-;13251:3;13244:37;13234:53;;:::o;13293:435::-;13473:3;13495:95;13586:3;13577:6;13495:95;:::i;:::-;13488:102;;13607:95;13698:3;13689:6;13607:95;:::i;:::-;13600:102;;13719:3;13712:10;;13477:251;;;;;:::o;13734:222::-;13827:4;13865:2;13854:9;13850:18;13842:26;;13878:71;13946:1;13935:9;13931:17;13922:6;13878:71;:::i;:::-;13832:124;;;;:::o;13962:640::-;14157:4;14195:3;14184:9;14180:19;14172:27;;14209:71;14277:1;14266:9;14262:17;14253:6;14209:71;:::i;:::-;14290:72;14358:2;14347:9;14343:18;14334:6;14290:72;:::i;:::-;14372;14440:2;14429:9;14425:18;14416:6;14372:72;:::i;:::-;14491:9;14485:4;14481:20;14476:2;14465:9;14461:18;14454:48;14519:76;14590:4;14581:6;14519:76;:::i;:::-;14511:84;;14162:440;;;;;;;:::o;14608:210::-;14695:4;14733:2;14722:9;14718:18;14710:26;;14746:65;14808:1;14797:9;14793:17;14784:6;14746:65;:::i;:::-;14700:118;;;;:::o;14824:313::-;14937:4;14975:2;14964:9;14960:18;14952:26;;15024:9;15018:4;15014:20;15010:1;14999:9;14995:17;14988:47;15052:78;15125:4;15116:6;15052:78;:::i;:::-;15044:86;;14942:195;;;;:::o;15143:419::-;15309:4;15347:2;15336:9;15332:18;15324:26;;15396:9;15390:4;15386:20;15382:1;15371:9;15367:17;15360:47;15424:131;15550:4;15424:131;:::i;:::-;15416:139;;15314:248;;;:::o;15568:419::-;15734:4;15772:2;15761:9;15757:18;15749:26;;15821:9;15815:4;15811:20;15807:1;15796:9;15792:17;15785:47;15849:131;15975:4;15849:131;:::i;:::-;15841:139;;15739:248;;;:::o;15993:419::-;16159:4;16197:2;16186:9;16182:18;16174:26;;16246:9;16240:4;16236:20;16232:1;16221:9;16217:17;16210:47;16274:131;16400:4;16274:131;:::i;:::-;16266:139;;16164:248;;;:::o;16418:419::-;16584:4;16622:2;16611:9;16607:18;16599:26;;16671:9;16665:4;16661:20;16657:1;16646:9;16642:17;16635:47;16699:131;16825:4;16699:131;:::i;:::-;16691:139;;16589:248;;;:::o;16843:419::-;17009:4;17047:2;17036:9;17032:18;17024:26;;17096:9;17090:4;17086:20;17082:1;17071:9;17067:17;17060:47;17124:131;17250:4;17124:131;:::i;:::-;17116:139;;17014:248;;;:::o;17268:419::-;17434:4;17472:2;17461:9;17457:18;17449:26;;17521:9;17515:4;17511:20;17507:1;17496:9;17492:17;17485:47;17549:131;17675:4;17549:131;:::i;:::-;17541:139;;17439:248;;;:::o;17693:419::-;17859:4;17897:2;17886:9;17882:18;17874:26;;17946:9;17940:4;17936:20;17932:1;17921:9;17917:17;17910:47;17974:131;18100:4;17974:131;:::i;:::-;17966:139;;17864:248;;;:::o;18118:419::-;18284:4;18322:2;18311:9;18307:18;18299:26;;18371:9;18365:4;18361:20;18357:1;18346:9;18342:17;18335:47;18399:131;18525:4;18399:131;:::i;:::-;18391:139;;18289:248;;;:::o;18543:419::-;18709:4;18747:2;18736:9;18732:18;18724:26;;18796:9;18790:4;18786:20;18782:1;18771:9;18767:17;18760:47;18824:131;18950:4;18824:131;:::i;:::-;18816:139;;18714:248;;;:::o;18968:419::-;19134:4;19172:2;19161:9;19157:18;19149:26;;19221:9;19215:4;19211:20;19207:1;19196:9;19192:17;19185:47;19249:131;19375:4;19249:131;:::i;:::-;19241:139;;19139:248;;;:::o;19393:419::-;19559:4;19597:2;19586:9;19582:18;19574:26;;19646:9;19640:4;19636:20;19632:1;19621:9;19617:17;19610:47;19674:131;19800:4;19674:131;:::i;:::-;19666:139;;19564:248;;;:::o;19818:419::-;19984:4;20022:2;20011:9;20007:18;19999:26;;20071:9;20065:4;20061:20;20057:1;20046:9;20042:17;20035:47;20099:131;20225:4;20099:131;:::i;:::-;20091:139;;19989:248;;;:::o;20243:419::-;20409:4;20447:2;20436:9;20432:18;20424:26;;20496:9;20490:4;20486:20;20482:1;20471:9;20467:17;20460:47;20524:131;20650:4;20524:131;:::i;:::-;20516:139;;20414:248;;;:::o;20668:419::-;20834:4;20872:2;20861:9;20857:18;20849:26;;20921:9;20915:4;20911:20;20907:1;20896:9;20892:17;20885:47;20949:131;21075:4;20949:131;:::i;:::-;20941:139;;20839:248;;;:::o;21093:419::-;21259:4;21297:2;21286:9;21282:18;21274:26;;21346:9;21340:4;21336:20;21332:1;21321:9;21317:17;21310:47;21374:131;21500:4;21374:131;:::i;:::-;21366:139;;21264:248;;;:::o;21518:222::-;21611:4;21649:2;21638:9;21634:18;21626:26;;21662:71;21730:1;21719:9;21715:17;21706:6;21662:71;:::i;:::-;21616:124;;;;:::o;21746:129::-;21780:6;21807:20;;:::i;:::-;21797:30;;21836:33;21864:4;21856:6;21836:33;:::i;:::-;21787:88;;;:::o;21881:75::-;21914:6;21947:2;21941:9;21931:19;;21921:35;:::o;21962:307::-;22023:4;22113:18;22105:6;22102:30;22099:2;;;22135:18;;:::i;:::-;22099:2;22173:29;22195:6;22173:29;:::i;:::-;22165:37;;22257:4;22251;22247:15;22239:23;;22028:241;;;:::o;22275:308::-;22337:4;22427:18;22419:6;22416:30;22413:2;;;22449:18;;:::i;:::-;22413:2;22487:29;22509:6;22487:29;:::i;:::-;22479:37;;22571:4;22565;22561:15;22553:23;;22342:241;;;:::o;22589:98::-;22640:6;22674:5;22668:12;22658:22;;22647:40;;;:::o;22693:99::-;22745:6;22779:5;22773:12;22763:22;;22752:40;;;:::o;22798:168::-;22881:11;22915:6;22910:3;22903:19;22955:4;22950:3;22946:14;22931:29;;22893:73;;;;:::o;22972:169::-;23056:11;23090:6;23085:3;23078:19;23130:4;23125:3;23121:14;23106:29;;23068:73;;;;:::o;23147:148::-;23249:11;23286:3;23271:18;;23261:34;;;;:::o;23301:305::-;23341:3;23360:20;23378:1;23360:20;:::i;:::-;23355:25;;23394:20;23412:1;23394:20;:::i;:::-;23389:25;;23548:1;23480:66;23476:74;23473:1;23470:81;23467:2;;;23554:18;;:::i;:::-;23467:2;23598:1;23595;23591:9;23584:16;;23345:261;;;;:::o;23612:185::-;23652:1;23669:20;23687:1;23669:20;:::i;:::-;23664:25;;23703:20;23721:1;23703:20;:::i;:::-;23698:25;;23742:1;23732:2;;23747:18;;:::i;:::-;23732:2;23789:1;23786;23782:9;23777:14;;23654:143;;;;:::o;23803:191::-;23843:4;23863:20;23881:1;23863:20;:::i;:::-;23858:25;;23897:20;23915:1;23897:20;:::i;:::-;23892:25;;23936:1;23933;23930:8;23927:2;;;23941:18;;:::i;:::-;23927:2;23986:1;23983;23979:9;23971:17;;23848:146;;;;:::o;24000:96::-;24037:7;24066:24;24084:5;24066:24;:::i;:::-;24055:35;;24045:51;;;:::o;24102:90::-;24136:7;24179:5;24172:13;24165:21;24154:32;;24144:48;;;:::o;24198:149::-;24234:7;24274:66;24267:5;24263:78;24252:89;;24242:105;;;:::o;24353:126::-;24390:7;24430:42;24423:5;24419:54;24408:65;;24398:81;;;:::o;24485:77::-;24522:7;24551:5;24540:16;;24530:32;;;:::o;24568:154::-;24652:6;24647:3;24642;24629:30;24714:1;24705:6;24700:3;24696:16;24689:27;24619:103;;;:::o;24728:307::-;24796:1;24806:113;24820:6;24817:1;24814:13;24806:113;;;24905:1;24900:3;24896:11;24890:18;24886:1;24881:3;24877:11;24870:39;24842:2;24839:1;24835:10;24830:15;;24806:113;;;24937:6;24934:1;24931:13;24928:2;;;25017:1;25008:6;25003:3;24999:16;24992:27;24928:2;24777:258;;;;:::o;25041:320::-;25085:6;25122:1;25116:4;25112:12;25102:22;;25169:1;25163:4;25159:12;25190:18;25180:2;;25246:4;25238:6;25234:17;25224:27;;25180:2;25308;25300:6;25297:14;25277:18;25274:38;25271:2;;;25327:18;;:::i;:::-;25271:2;25092:269;;;;:::o;25367:281::-;25450:27;25472:4;25450:27;:::i;:::-;25442:6;25438:40;25580:6;25568:10;25565:22;25544:18;25532:10;25529:34;25526:62;25523:2;;;25591:18;;:::i;:::-;25523:2;25631:10;25627:2;25620:22;25410:238;;;:::o;25654:233::-;25693:3;25716:24;25734:5;25716:24;:::i;:::-;25707:33;;25762:66;25755:5;25752:77;25749:2;;;25832:18;;:::i;:::-;25749:2;25879:1;25872:5;25868:13;25861:20;;25697:190;;;:::o;25893:176::-;25925:1;25942:20;25960:1;25942:20;:::i;:::-;25937:25;;25976:20;25994:1;25976:20;:::i;:::-;25971:25;;26015:1;26005:2;;26020:18;;:::i;:::-;26005:2;26061:1;26058;26054:9;26049:14;;25927:142;;;;:::o;26075:180::-;26123:77;26120:1;26113:88;26220:4;26217:1;26210:15;26244:4;26241:1;26234:15;26261:180;26309:77;26306:1;26299:88;26406:4;26403:1;26396:15;26430:4;26427:1;26420:15;26447:180;26495:77;26492:1;26485:88;26592:4;26589:1;26582:15;26616:4;26613:1;26606:15;26633:180;26681:77;26678:1;26671:88;26778:4;26775:1;26768:15;26802:4;26799:1;26792:15;26819:102;26860:6;26911:2;26907:7;26902:2;26895:5;26891:14;26887:28;26877:38;;26867:54;;;:::o;26927:230::-;27067:34;27063:1;27055:6;27051:14;27044:58;27136:13;27131:2;27123:6;27119:15;27112:38;27033:124;:::o;27163:237::-;27303:34;27299:1;27291:6;27287:14;27280:58;27372:20;27367:2;27359:6;27355:15;27348:45;27269:131;:::o;27406:224::-;27546:34;27542:1;27534:6;27530:14;27523:58;27615:7;27610:2;27602:6;27598:15;27591:32;27512:118;:::o;27636:178::-;27776:30;27772:1;27764:6;27760:14;27753:54;27742:72;:::o;27820:223::-;27960:34;27956:1;27948:6;27944:14;27937:58;28029:6;28024:2;28016:6;28012:15;28005:31;27926:117;:::o;28049:175::-;28189:27;28185:1;28177:6;28173:14;28166:51;28155:69;:::o;28230:228::-;28370:34;28366:1;28358:6;28354:14;28347:58;28439:11;28434:2;28426:6;28422:15;28415:36;28336:122;:::o;28464:233::-;28604:34;28600:1;28592:6;28588:14;28581:58;28673:16;28668:2;28660:6;28656:15;28649:41;28570:127;:::o;28703:249::-;28843:34;28839:1;28831:6;28827:14;28820:58;28912:32;28907:2;28899:6;28895:15;28888:57;28809:143;:::o;28958:182::-;29098:34;29094:1;29086:6;29082:14;29075:58;29064:76;:::o;29146:174::-;29286:26;29282:1;29274:6;29270:14;29263:50;29252:68;:::o;29326:220::-;29466:34;29462:1;29454:6;29450:14;29443:58;29535:3;29530:2;29522:6;29518:15;29511:28;29432:114;:::o;29552:231::-;29692:34;29688:1;29680:6;29676:14;29669:58;29761:14;29756:2;29748:6;29744:15;29737:39;29658:125;:::o;29789:222::-;29929:34;29925:1;29917:6;29913:14;29906:58;29998:5;29993:2;29985:6;29981:15;29974:30;29895:116;:::o;30017:233::-;30157:34;30153:1;30145:6;30141:14;30134:58;30226:16;30221:2;30213:6;30209:15;30202:41;30123:127;:::o;30256:122::-;30329:24;30347:5;30329:24;:::i;:::-;30322:5;30319:35;30309:2;;30368:1;30365;30358:12;30309:2;30299:79;:::o;30384:116::-;30454:21;30469:5;30454:21;:::i;:::-;30447:5;30444:32;30434:2;;30490:1;30487;30480:12;30434:2;30424:76;:::o;30506:120::-;30578:23;30595:5;30578:23;:::i;:::-;30571:5;30568:34;30558:2;;30616:1;30613;30606:12;30558:2;30548:78;:::o;30632:122::-;30705:24;30723:5;30705:24;:::i;:::-;30698:5;30695:35;30685:2;;30744:1;30741;30734:12;30685:2;30675:79;:::o

Swarm Source

ipfs://299eac7b7e33889fc998fd83ffc6733439e05afe7545ac07dd15e46348828285
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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