Token Wrapped Cronos Punk

Overview CRC721

Total Supply:
1,021 CRONOSPUNK

Holders:
449 addresses
Balance
2 CRONOSPUNK
0xd156f87ea9f25b7820582b460553ee621eddc258
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
WrappedCronosPunk

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 15 of 15: WrappedCronosPunk.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./Ownable.sol";
import "./ERC721Enumerable.sol";
import "./ERC721Burnable.sol";
import "./Context.sol";
import "./IERC721Receiver.sol";

contract WrappedCronosPunk is
    Context,
    Ownable,
    ERC721Enumerable,
    ERC721Burnable,
    IERC721Receiver
{

    address public punkAddress = 0x16134B610f15338B96D8DF52EE63553dD2B013A2;
    ERC721 private punks;

    string public _baseTokenURI;
    bool public tokenURIFrozen = false;

    constructor(
        string memory name,
        string memory symbol,
        string memory baseTokenURI
    ) ERC721(name, symbol) {
        _baseTokenURI = baseTokenURI;
        punks = ERC721(punkAddress);
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return _baseTokenURI;
    }
    
    function wrapPunks(
        uint256[] memory ids
    ) public {
        require(punks.isApprovedForAll(_msgSender(), address(this)) == true, "Must approve contract");
        for (uint256 i = 0; i < ids.length; i++){
            uint256 id = ids[i];
            require(id >= 0, "ID out of bounds");
            require(id <= 2719,"ID out of bounds");
            require(_msgSender() == punks.ownerOf(id), "Need to own Punk");
            punks.safeTransferFrom(_msgSender(), address(this), id, "0x00");
            _safeMint(_msgSender(), id);
        }
    }
    
    function setBaseTokenURI(string memory uri) public onlyOwner {
        require(tokenURIFrozen == false, "Metadata frozen");
        _baseTokenURI = uri;
    }

    function freezeBaseURI() public onlyOwner {
        tokenURIFrozen = true;
    }
    function walletOfOwner(address _owner) public view returns (uint256[] memory) {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for (uint256 i; i < ownerTokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIds;
    }
    function onERC721Received(address, address, uint256, bytes memory) public virtual override returns (bytes4) {
        return this.onERC721Received.selector;
    }
    
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

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

File 1 of 15: Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 2 of 15: Context.sol
// SPDX-License-Identifier: MIT

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 3 of 15: ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 4 of 15: ERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

File 5 of 15: ERC721Burnable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./Context.sol";

/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}

File 6 of 15: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./IERC721Enumerable.sol";

/**
 * @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 7 of 15: IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

File 8 of 15: IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 9 of 15: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

File 10 of 15: IERC721Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

File 11 of 15: IERC721Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

File 12 of 15: Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

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

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

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

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

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

File 13 of 15: Pausable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 14 of 15: Strings.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"baseTokenURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freezeBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"punkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":"tokenURIFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"wrapPunks","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040527316134b610f15338b96d8df52ee63553dd2b013a2600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600e60006101000a81548160ff0219169083151502179055503480156200008157600080fd5b50604051620049d2380380620049d28339818101604052810190620000a791906200037c565b8282620000c9620000bd6200018260201b60201c565b6200018a60201b60201c565b8160019080519060200190620000e19291906200024e565b508060029080519060200190620000fa9291906200024e565b50505080600d9080519060200190620001159291906200024e565b50600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050620005b9565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200025c90620004ca565b90600052602060002090601f016020900481019282620002805760008555620002cc565b82601f106200029b57805160ff1916838001178555620002cc565b82800160010185558215620002cc579182015b82811115620002cb578251825591602001919060010190620002ae565b5b509050620002db9190620002df565b5090565b5b80821115620002fa576000816000905550600101620002e0565b5090565b6000620003156200030f846200045e565b62000435565b90508281526020810184848401111562000334576200033362000599565b5b6200034184828562000494565b509392505050565b600082601f83011262000361576200036062000594565b5b815162000373848260208601620002fe565b91505092915050565b600080600060608486031215620003985762000397620005a3565b5b600084015167ffffffffffffffff811115620003b957620003b86200059e565b5b620003c78682870162000349565b935050602084015167ffffffffffffffff811115620003eb57620003ea6200059e565b5b620003f98682870162000349565b925050604084015167ffffffffffffffff8111156200041d576200041c6200059e565b5b6200042b8682870162000349565b9150509250925092565b60006200044162000454565b90506200044f828262000500565b919050565b6000604051905090565b600067ffffffffffffffff8211156200047c576200047b62000565565b5b6200048782620005a8565b9050602081019050919050565b60005b83811015620004b457808201518184015260208101905062000497565b83811115620004c4576000848401525b50505050565b60006002820490506001821680620004e357607f821691505b60208210811415620004fa57620004f962000536565b5b50919050565b6200050b82620005a8565b810181811067ffffffffffffffff821117156200052d576200052c62000565565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b61440980620005c96000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063c29de63011610097578063d788c16211610071578063d788c16214610519578063e7bc820814610535578063e985e9c51461053f578063f2fde38b1461056f576101c4565b8063c29de630146104ad578063c87b56dd146104cb578063cfc86f7b146104fb576101c4565b806395d89b41116100d357806395d89b4114610439578063a22cb46514610457578063b88d4fde14610473578063b9aba48d1461048f576101c4565b806370a08231146103e1578063715018a6146104115780638da5cb5b1461041b576101c4565b80632f745c591161016657806342966c681161014057806342966c6814610335578063438b6300146103515780634f6ccce7146103815780636352211e146103b1576101c4565b80632f745c59146102cd57806330176e13146102fd57806342842e0e14610319576101c4565b8063095ea7b3116101a2578063095ea7b314610247578063150b7a021461026357806318160ddd1461029357806323b872dd146102b1576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063081812fc14610217575b600080fd5b6101e360048036038101906101de9190612eb5565b61058b565b6040516101f09190613551565b60405180910390f35b61020161059d565b60405161020e9190613587565b60405180910390f35b610231600480360381019061022c9190612f58565b61062f565b60405161023e9190613455565b60405180910390f35b610261600480360381019061025c9190612dff565b6106b4565b005b61027d60048036038101906102789190612d3c565b6107cc565b60405161028a919061356c565b60405180910390f35b61029b6107e0565b6040516102a89190613889565b60405180910390f35b6102cb60048036038101906102c69190612ce9565b6107ed565b005b6102e760048036038101906102e29190612dff565b61084d565b6040516102f49190613889565b60405180910390f35b61031760048036038101906103129190612f0f565b6108f2565b005b610333600480360381019061032e9190612ce9565b6109de565b005b61034f600480360381019061034a9190612f58565b6109fe565b005b61036b60048036038101906103669190612c4f565b610a5a565b604051610378919061352f565b60405180910390f35b61039b60048036038101906103969190612f58565b610b08565b6040516103a89190613889565b60405180910390f35b6103cb60048036038101906103c69190612f58565b610b79565b6040516103d89190613455565b60405180910390f35b6103fb60048036038101906103f69190612c4f565b610c2b565b6040516104089190613889565b60405180910390f35b610419610ce3565b005b610423610d6b565b6040516104309190613455565b60405180910390f35b610441610d94565b60405161044e9190613587565b60405180910390f35b610471600480360381019061046c9190612dbf565b610e26565b005b61048d60048036038101906104889190612d3c565b610fa7565b005b610497611009565b6040516104a49190613455565b60405180910390f35b6104b561102f565b6040516104c29190613551565b60405180910390f35b6104e560048036038101906104e09190612f58565b611042565b6040516104f29190613587565b60405180910390f35b6105036110e9565b6040516105109190613587565b60405180910390f35b610533600480360381019061052e9190612e3f565b611177565b005b61053d611505565b005b61055960048036038101906105549190612ca9565b61159e565b6040516105669190613551565b60405180910390f35b61058960048036038101906105849190612c4f565b611632565b005b60006105968261172a565b9050919050565b6060600180546105ac90613b44565b80601f01602080910402602001604051908101604052809291908181526020018280546105d890613b44565b80156106255780601f106105fa57610100808354040283529160200191610625565b820191906000526020600020905b81548152906001019060200180831161060857829003601f168201915b5050505050905090565b600061063a826117a4565b610679576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067090613729565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106bf82610b79565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610730576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610727906137a9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661074f611810565b73ffffffffffffffffffffffffffffffffffffffff16148061077e575061077d81610778611810565b61159e565b5b6107bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b490613689565b60405180910390fd5b6107c78383611818565b505050565b600063150b7a0260e01b9050949350505050565b6000600980549050905090565b6107fe6107f8611810565b826118d1565b61083d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610834906137e9565b60405180910390fd5b6108488383836119af565b505050565b600061085883610c2b565b8210610899576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610890906135a9565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6108fa611810565b73ffffffffffffffffffffffffffffffffffffffff16610918610d6b565b73ffffffffffffffffffffffffffffffffffffffff161461096e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096590613749565b60405180910390fd5b60001515600e60009054906101000a900460ff161515146109c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bb90613809565b60405180910390fd5b80600d90805190602001906109da92919061299b565b5050565b6109f983838360405180602001604052806000815250610fa7565b505050565b610a0f610a09611810565b826118d1565b610a4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4590613869565b60405180910390fd5b610a5781611c0b565b50565b60606000610a6783610c2b565b905060008167ffffffffffffffff811115610a8557610a84613d0c565b5b604051908082528060200260200182016040528015610ab35781602001602082028036833780820191505090505b50905060005b82811015610afd57610acb858261084d565b828281518110610ade57610add613cdd565b5b6020026020010181815250508080610af590613ba7565b915050610ab9565b508092505050919050565b6000610b126107e0565b8210610b53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4a90613829565b60405180910390fd5b60098281548110610b6757610b66613cdd565b5b90600052602060002001549050919050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c19906136c9565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c93906136a9565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ceb611810565b73ffffffffffffffffffffffffffffffffffffffff16610d09610d6b565b73ffffffffffffffffffffffffffffffffffffffff1614610d5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5690613749565b60405180910390fd5b610d696000611d1c565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054610da390613b44565b80601f0160208091040260200160405190810160405280929190818152602001828054610dcf90613b44565b8015610e1c5780601f10610df157610100808354040283529160200191610e1c565b820191906000526020600020905b815481529060010190602001808311610dff57829003601f168201915b5050505050905090565b610e2e611810565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9390613649565b60405180910390fd5b8060066000610ea9611810565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610f56611810565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610f9b9190613551565b60405180910390a35050565b610fb8610fb2611810565b836118d1565b610ff7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fee906137e9565b60405180910390fd5b61100384848484611de0565b50505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e60009054906101000a900460ff1681565b606061104d826117a4565b61108c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108390613789565b60405180910390fd5b6000611096611e3c565b905060008151116110b657604051806020016040528060008152506110e1565b806110c084611ece565b6040516020016110d1929190613431565b6040516020818303038152906040525b915050919050565b600d80546110f690613b44565b80601f016020809104026020016040519081016040528092919081815260200182805461112290613b44565b801561116f5780601f106111445761010080835404028352916020019161116f565b820191906000526020600020905b81548152906001019060200180831161115257829003601f168201915b505050505081565b60011515600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e985e9c56111c1611810565b306040518363ffffffff1660e01b81526004016111df929190613470565b60206040518083038186803b1580156111f757600080fd5b505afa15801561120b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122f9190612e88565b151514611271576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611268906137c9565b60405180910390fd5b60005b815181101561150157600082828151811061129257611291613cdd565b5b6020026020010151905060008110156112e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d790613849565b60405180910390fd5b610a9f811115611325576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131c90613849565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e826040518263ffffffff1660e01b81526004016113809190613889565b60206040518083038186803b15801561139857600080fd5b505afa1580156113ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d09190612c7c565b73ffffffffffffffffffffffffffffffffffffffff166113ee611810565b73ffffffffffffffffffffffffffffffffffffffff1614611444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143b90613709565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b88d4fde61148a611810565b30846040518463ffffffff1660e01b81526004016114aa939291906134e5565b600060405180830381600087803b1580156114c457600080fd5b505af11580156114d8573d6000803e3d6000fd5b505050506114ed6114e7611810565b8261202f565b5080806114f990613ba7565b915050611274565b5050565b61150d611810565b73ffffffffffffffffffffffffffffffffffffffff1661152b610d6b565b73ffffffffffffffffffffffffffffffffffffffff1614611581576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157890613749565b60405180910390fd5b6001600e60006101000a81548160ff021916908315150217905550565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61163a611810565b73ffffffffffffffffffffffffffffffffffffffff16611658610d6b565b73ffffffffffffffffffffffffffffffffffffffff16146116ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a590613749565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561171e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611715906135e9565b60405180910390fd5b61172781611d1c565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061179d575061179c8261204d565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661188b83610b79565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006118dc826117a4565b61191b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191290613669565b60405180910390fd5b600061192683610b79565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061199557508373ffffffffffffffffffffffffffffffffffffffff1661197d8461062f565b73ffffffffffffffffffffffffffffffffffffffff16145b806119a657506119a5818561159e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166119cf82610b79565b73ffffffffffffffffffffffffffffffffffffffff1614611a25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1c90613769565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8c90613629565b60405180910390fd5b611aa083838361212f565b611aab600082611818565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611afb9190613a5a565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b5291906139d3565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000611c1682610b79565b9050611c248160008461212f565b611c2f600083611818565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c7f9190613a5a565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611deb8484846119af565b611df78484848461213f565b611e36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2d906135c9565b60405180910390fd5b50505050565b6060600d8054611e4b90613b44565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7790613b44565b8015611ec45780601f10611e9957610100808354040283529160200191611ec4565b820191906000526020600020905b815481529060010190602001808311611ea757829003601f168201915b5050505050905090565b60606000821415611f16576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061202a565b600082905060005b60008214611f48578080611f3190613ba7565b915050600a82611f419190613a29565b9150611f1e565b60008167ffffffffffffffff811115611f6457611f63613d0c565b5b6040519080825280601f01601f191660200182016040528015611f965781602001600182028036833780820191505090505b5090505b6000851461202357600182611faf9190613a5a565b9150600a85611fbe9190613bf0565b6030611fca91906139d3565b60f81b818381518110611fe057611fdf613cdd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561201c9190613a29565b9450611f9a565b8093505050505b919050565b6120498282604051806020016040528060008152506122d6565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061211857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612128575061212782612331565b5b9050919050565b61213a83838361239b565b505050565b60006121608473ffffffffffffffffffffffffffffffffffffffff166124af565b156122c9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612189611810565b8786866040518563ffffffff1660e01b81526004016121ab9493929190613499565b602060405180830381600087803b1580156121c557600080fd5b505af19250505080156121f657506040513d601f19601f820116820180604052508101906121f39190612ee2565b60015b612279573d8060008114612226576040519150601f19603f3d011682016040523d82523d6000602084013e61222b565b606091505b50600081511415612271576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612268906135c9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506122ce565b600190505b949350505050565b6122e083836124c2565b6122ed600084848461213f565b61232c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612323906135c9565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6123a6838383612690565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123e9576123e481612695565b612428565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146124275761242683826126de565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561246b576124668161284b565b6124aa565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146124a9576124a8828261291c565b5b5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612532576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612529906136e9565b60405180910390fd5b61253b816117a4565b1561257b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257290613609565b60405180910390fd5b6125876000838361212f565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125d791906139d3565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016126eb84610c2b565b6126f59190613a5a565b90506000600860008481526020019081526020016000205490508181146127da576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160098054905061285f9190613a5a565b90506000600a600084815260200190815260200160002054905060006009838154811061288f5761288e613cdd565b5b9060005260206000200154905080600983815481106128b1576128b0613cdd565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a6000858152602001908152602001600020600090556009805480612900576128ff613cae565b5b6001900381819060005260206000200160009055905550505050565b600061292783610c2b565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b8280546129a790613b44565b90600052602060002090601f0160209004810192826129c95760008555612a10565b82601f106129e257805160ff1916838001178555612a10565b82800160010185558215612a10579182015b82811115612a0f5782518255916020019190600101906129f4565b5b509050612a1d9190612a21565b5090565b5b80821115612a3a576000816000905550600101612a22565b5090565b6000612a51612a4c846138c9565b6138a4565b90508083825260208201905082856020860282011115612a7457612a73613d40565b5b60005b85811015612aa45781612a8a8882612c3a565b845260208401935060208301925050600181019050612a77565b5050509392505050565b6000612ac1612abc846138f5565b6138a4565b905082815260208101848484011115612add57612adc613d45565b5b612ae8848285613b02565b509392505050565b6000612b03612afe84613926565b6138a4565b905082815260208101848484011115612b1f57612b1e613d45565b5b612b2a848285613b02565b509392505050565b600081359050612b4181614377565b92915050565b600081519050612b5681614377565b92915050565b600082601f830112612b7157612b70613d3b565b5b8135612b81848260208601612a3e565b91505092915050565b600081359050612b998161438e565b92915050565b600081519050612bae8161438e565b92915050565b600081359050612bc3816143a5565b92915050565b600081519050612bd8816143a5565b92915050565b600082601f830112612bf357612bf2613d3b565b5b8135612c03848260208601612aae565b91505092915050565b600082601f830112612c2157612c20613d3b565b5b8135612c31848260208601612af0565b91505092915050565b600081359050612c49816143bc565b92915050565b600060208284031215612c6557612c64613d4f565b5b6000612c7384828501612b32565b91505092915050565b600060208284031215612c9257612c91613d4f565b5b6000612ca084828501612b47565b91505092915050565b60008060408385031215612cc057612cbf613d4f565b5b6000612cce85828601612b32565b9250506020612cdf85828601612b32565b9150509250929050565b600080600060608486031215612d0257612d01613d4f565b5b6000612d1086828701612b32565b9350506020612d2186828701612b32565b9250506040612d3286828701612c3a565b9150509250925092565b60008060008060808587031215612d5657612d55613d4f565b5b6000612d6487828801612b32565b9450506020612d7587828801612b32565b9350506040612d8687828801612c3a565b925050606085013567ffffffffffffffff811115612da757612da6613d4a565b5b612db387828801612bde565b91505092959194509250565b60008060408385031215612dd657612dd5613d4f565b5b6000612de485828601612b32565b9250506020612df585828601612b8a565b9150509250929050565b60008060408385031215612e1657612e15613d4f565b5b6000612e2485828601612b32565b9250506020612e3585828601612c3a565b9150509250929050565b600060208284031215612e5557612e54613d4f565b5b600082013567ffffffffffffffff811115612e7357612e72613d4a565b5b612e7f84828501612b5c565b91505092915050565b600060208284031215612e9e57612e9d613d4f565b5b6000612eac84828501612b9f565b91505092915050565b600060208284031215612ecb57612eca613d4f565b5b6000612ed984828501612bb4565b91505092915050565b600060208284031215612ef857612ef7613d4f565b5b6000612f0684828501612bc9565b91505092915050565b600060208284031215612f2557612f24613d4f565b5b600082013567ffffffffffffffff811115612f4357612f42613d4a565b5b612f4f84828501612c0c565b91505092915050565b600060208284031215612f6e57612f6d613d4f565b5b6000612f7c84828501612c3a565b91505092915050565b6000612f918383613413565b60208301905092915050565b612fa681613a8e565b82525050565b6000612fb782613967565b612fc18185613995565b9350612fcc83613957565b8060005b83811015612ffd578151612fe48882612f85565b9750612fef83613988565b925050600181019050612fd0565b5085935050505092915050565b61301381613aa0565b82525050565b61302281613aac565b82525050565b600061303382613972565b61303d81856139a6565b935061304d818560208601613b11565b61305681613d54565b840191505092915050565b600061306c8261397d565b61307681856139b7565b9350613086818560208601613b11565b61308f81613d54565b840191505092915050565b60006130a58261397d565b6130af81856139c8565b93506130bf818560208601613b11565b80840191505092915050565b60006130d8602b836139b7565b91506130e382613d65565b604082019050919050565b60006130fb6032836139b7565b915061310682613db4565b604082019050919050565b600061311e6026836139b7565b915061312982613e03565b604082019050919050565b60006131416004836139a6565b915061314c82613e52565b602082019050919050565b6000613164601c836139b7565b915061316f82613e7b565b602082019050919050565b60006131876024836139b7565b915061319282613ea4565b604082019050919050565b60006131aa6019836139b7565b91506131b582613ef3565b602082019050919050565b60006131cd602c836139b7565b91506131d882613f1c565b604082019050919050565b60006131f06038836139b7565b91506131fb82613f6b565b604082019050919050565b6000613213602a836139b7565b915061321e82613fba565b604082019050919050565b60006132366029836139b7565b915061324182614009565b604082019050919050565b60006132596020836139b7565b915061326482614058565b602082019050919050565b600061327c6010836139b7565b915061328782614081565b602082019050919050565b600061329f602c836139b7565b91506132aa826140aa565b604082019050919050565b60006132c26020836139b7565b91506132cd826140f9565b602082019050919050565b60006132e56029836139b7565b91506132f082614122565b604082019050919050565b6000613308602f836139b7565b915061331382614171565b604082019050919050565b600061332b6021836139b7565b9150613336826141c0565b604082019050919050565b600061334e6015836139b7565b91506133598261420f565b602082019050919050565b60006133716031836139b7565b915061337c82614238565b604082019050919050565b6000613394600f836139b7565b915061339f82614287565b602082019050919050565b60006133b7602c836139b7565b91506133c2826142b0565b604082019050919050565b60006133da6010836139b7565b91506133e5826142ff565b602082019050919050565b60006133fd6030836139b7565b915061340882614328565b604082019050919050565b61341c81613af8565b82525050565b61342b81613af8565b82525050565b600061343d828561309a565b9150613449828461309a565b91508190509392505050565b600060208201905061346a6000830184612f9d565b92915050565b60006040820190506134856000830185612f9d565b6134926020830184612f9d565b9392505050565b60006080820190506134ae6000830187612f9d565b6134bb6020830186612f9d565b6134c86040830185613422565b81810360608301526134da8184613028565b905095945050505050565b60006080820190506134fa6000830186612f9d565b6135076020830185612f9d565b6135146040830184613422565b818103606083015261352581613134565b9050949350505050565b600060208201905081810360008301526135498184612fac565b905092915050565b6000602082019050613566600083018461300a565b92915050565b60006020820190506135816000830184613019565b92915050565b600060208201905081810360008301526135a18184613061565b905092915050565b600060208201905081810360008301526135c2816130cb565b9050919050565b600060208201905081810360008301526135e2816130ee565b9050919050565b6000602082019050818103600083015261360281613111565b9050919050565b6000602082019050818103600083015261362281613157565b9050919050565b600060208201905081810360008301526136428161317a565b9050919050565b600060208201905081810360008301526136628161319d565b9050919050565b60006020820190508181036000830152613682816131c0565b9050919050565b600060208201905081810360008301526136a2816131e3565b9050919050565b600060208201905081810360008301526136c281613206565b9050919050565b600060208201905081810360008301526136e281613229565b9050919050565b600060208201905081810360008301526137028161324c565b9050919050565b600060208201905081810360008301526137228161326f565b9050919050565b6000602082019050818103600083015261374281613292565b9050919050565b60006020820190508181036000830152613762816132b5565b9050919050565b60006020820190508181036000830152613782816132d8565b9050919050565b600060208201905081810360008301526137a2816132fb565b9050919050565b600060208201905081810360008301526137c28161331e565b9050919050565b600060208201905081810360008301526137e281613341565b9050919050565b6000602082019050818103600083015261380281613364565b9050919050565b6000602082019050818103600083015261382281613387565b9050919050565b60006020820190508181036000830152613842816133aa565b9050919050565b60006020820190508181036000830152613862816133cd565b9050919050565b60006020820190508181036000830152613882816133f0565b9050919050565b600060208201905061389e6000830184613422565b92915050565b60006138ae6138bf565b90506138ba8282613b76565b919050565b6000604051905090565b600067ffffffffffffffff8211156138e4576138e3613d0c565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156139105761390f613d0c565b5b61391982613d54565b9050602081019050919050565b600067ffffffffffffffff82111561394157613940613d0c565b5b61394a82613d54565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006139de82613af8565b91506139e983613af8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a1e57613a1d613c21565b5b828201905092915050565b6000613a3482613af8565b9150613a3f83613af8565b925082613a4f57613a4e613c50565b5b828204905092915050565b6000613a6582613af8565b9150613a7083613af8565b925082821015613a8357613a82613c21565b5b828203905092915050565b6000613a9982613ad8565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613b2f578082015181840152602081019050613b14565b83811115613b3e576000848401525b50505050565b60006002820490506001821680613b5c57607f821691505b60208210811415613b7057613b6f613c7f565b5b50919050565b613b7f82613d54565b810181811067ffffffffffffffff82111715613b9e57613b9d613d0c565b5b80604052505050565b6000613bb282613af8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613be557613be4613c21565b5b600182019050919050565b6000613bfb82613af8565b9150613c0683613af8565b925082613c1657613c15613c50565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f3078303000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4e65656420746f206f776e2050756e6b00000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d75737420617070726f766520636f6e74726163740000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4d657461646174612066726f7a656e0000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4944206f7574206f6620626f756e647300000000000000000000000000000000600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b61438081613a8e565b811461438b57600080fd5b50565b61439781613aa0565b81146143a257600080fd5b50565b6143ae81613aac565b81146143b957600080fd5b50565b6143c581613af8565b81146143d057600080fd5b5056fea2646970667358221220411920bf2c5c1816d5293bbf7e0ef3adfc7cd2725eb80d9809866d798c86597064736f6c63430008070033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000013577261707065642043726f6e6f732050756e6b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a43524f4e4f5350554e4b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d6452716a4d59434a4766416f5143426236524a32737556345a5658426a58436232374431564a5268327252792f00000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063c29de63011610097578063d788c16211610071578063d788c16214610519578063e7bc820814610535578063e985e9c51461053f578063f2fde38b1461056f576101c4565b8063c29de630146104ad578063c87b56dd146104cb578063cfc86f7b146104fb576101c4565b806395d89b41116100d357806395d89b4114610439578063a22cb46514610457578063b88d4fde14610473578063b9aba48d1461048f576101c4565b806370a08231146103e1578063715018a6146104115780638da5cb5b1461041b576101c4565b80632f745c591161016657806342966c681161014057806342966c6814610335578063438b6300146103515780634f6ccce7146103815780636352211e146103b1576101c4565b80632f745c59146102cd57806330176e13146102fd57806342842e0e14610319576101c4565b8063095ea7b3116101a2578063095ea7b314610247578063150b7a021461026357806318160ddd1461029357806323b872dd146102b1576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063081812fc14610217575b600080fd5b6101e360048036038101906101de9190612eb5565b61058b565b6040516101f09190613551565b60405180910390f35b61020161059d565b60405161020e9190613587565b60405180910390f35b610231600480360381019061022c9190612f58565b61062f565b60405161023e9190613455565b60405180910390f35b610261600480360381019061025c9190612dff565b6106b4565b005b61027d60048036038101906102789190612d3c565b6107cc565b60405161028a919061356c565b60405180910390f35b61029b6107e0565b6040516102a89190613889565b60405180910390f35b6102cb60048036038101906102c69190612ce9565b6107ed565b005b6102e760048036038101906102e29190612dff565b61084d565b6040516102f49190613889565b60405180910390f35b61031760048036038101906103129190612f0f565b6108f2565b005b610333600480360381019061032e9190612ce9565b6109de565b005b61034f600480360381019061034a9190612f58565b6109fe565b005b61036b60048036038101906103669190612c4f565b610a5a565b604051610378919061352f565b60405180910390f35b61039b60048036038101906103969190612f58565b610b08565b6040516103a89190613889565b60405180910390f35b6103cb60048036038101906103c69190612f58565b610b79565b6040516103d89190613455565b60405180910390f35b6103fb60048036038101906103f69190612c4f565b610c2b565b6040516104089190613889565b60405180910390f35b610419610ce3565b005b610423610d6b565b6040516104309190613455565b60405180910390f35b610441610d94565b60405161044e9190613587565b60405180910390f35b610471600480360381019061046c9190612dbf565b610e26565b005b61048d60048036038101906104889190612d3c565b610fa7565b005b610497611009565b6040516104a49190613455565b60405180910390f35b6104b561102f565b6040516104c29190613551565b60405180910390f35b6104e560048036038101906104e09190612f58565b611042565b6040516104f29190613587565b60405180910390f35b6105036110e9565b6040516105109190613587565b60405180910390f35b610533600480360381019061052e9190612e3f565b611177565b005b61053d611505565b005b61055960048036038101906105549190612ca9565b61159e565b6040516105669190613551565b60405180910390f35b61058960048036038101906105849190612c4f565b611632565b005b60006105968261172a565b9050919050565b6060600180546105ac90613b44565b80601f01602080910402602001604051908101604052809291908181526020018280546105d890613b44565b80156106255780601f106105fa57610100808354040283529160200191610625565b820191906000526020600020905b81548152906001019060200180831161060857829003601f168201915b5050505050905090565b600061063a826117a4565b610679576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067090613729565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106bf82610b79565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610730576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610727906137a9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661074f611810565b73ffffffffffffffffffffffffffffffffffffffff16148061077e575061077d81610778611810565b61159e565b5b6107bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b490613689565b60405180910390fd5b6107c78383611818565b505050565b600063150b7a0260e01b9050949350505050565b6000600980549050905090565b6107fe6107f8611810565b826118d1565b61083d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610834906137e9565b60405180910390fd5b6108488383836119af565b505050565b600061085883610c2b565b8210610899576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610890906135a9565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6108fa611810565b73ffffffffffffffffffffffffffffffffffffffff16610918610d6b565b73ffffffffffffffffffffffffffffffffffffffff161461096e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096590613749565b60405180910390fd5b60001515600e60009054906101000a900460ff161515146109c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bb90613809565b60405180910390fd5b80600d90805190602001906109da92919061299b565b5050565b6109f983838360405180602001604052806000815250610fa7565b505050565b610a0f610a09611810565b826118d1565b610a4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4590613869565b60405180910390fd5b610a5781611c0b565b50565b60606000610a6783610c2b565b905060008167ffffffffffffffff811115610a8557610a84613d0c565b5b604051908082528060200260200182016040528015610ab35781602001602082028036833780820191505090505b50905060005b82811015610afd57610acb858261084d565b828281518110610ade57610add613cdd565b5b6020026020010181815250508080610af590613ba7565b915050610ab9565b508092505050919050565b6000610b126107e0565b8210610b53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4a90613829565b60405180910390fd5b60098281548110610b6757610b66613cdd565b5b90600052602060002001549050919050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c19906136c9565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c93906136a9565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ceb611810565b73ffffffffffffffffffffffffffffffffffffffff16610d09610d6b565b73ffffffffffffffffffffffffffffffffffffffff1614610d5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5690613749565b60405180910390fd5b610d696000611d1c565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054610da390613b44565b80601f0160208091040260200160405190810160405280929190818152602001828054610dcf90613b44565b8015610e1c5780601f10610df157610100808354040283529160200191610e1c565b820191906000526020600020905b815481529060010190602001808311610dff57829003601f168201915b5050505050905090565b610e2e611810565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9390613649565b60405180910390fd5b8060066000610ea9611810565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610f56611810565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610f9b9190613551565b60405180910390a35050565b610fb8610fb2611810565b836118d1565b610ff7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fee906137e9565b60405180910390fd5b61100384848484611de0565b50505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e60009054906101000a900460ff1681565b606061104d826117a4565b61108c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108390613789565b60405180910390fd5b6000611096611e3c565b905060008151116110b657604051806020016040528060008152506110e1565b806110c084611ece565b6040516020016110d1929190613431565b6040516020818303038152906040525b915050919050565b600d80546110f690613b44565b80601f016020809104026020016040519081016040528092919081815260200182805461112290613b44565b801561116f5780601f106111445761010080835404028352916020019161116f565b820191906000526020600020905b81548152906001019060200180831161115257829003601f168201915b505050505081565b60011515600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e985e9c56111c1611810565b306040518363ffffffff1660e01b81526004016111df929190613470565b60206040518083038186803b1580156111f757600080fd5b505afa15801561120b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122f9190612e88565b151514611271576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611268906137c9565b60405180910390fd5b60005b815181101561150157600082828151811061129257611291613cdd565b5b6020026020010151905060008110156112e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d790613849565b60405180910390fd5b610a9f811115611325576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131c90613849565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e826040518263ffffffff1660e01b81526004016113809190613889565b60206040518083038186803b15801561139857600080fd5b505afa1580156113ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d09190612c7c565b73ffffffffffffffffffffffffffffffffffffffff166113ee611810565b73ffffffffffffffffffffffffffffffffffffffff1614611444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143b90613709565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b88d4fde61148a611810565b30846040518463ffffffff1660e01b81526004016114aa939291906134e5565b600060405180830381600087803b1580156114c457600080fd5b505af11580156114d8573d6000803e3d6000fd5b505050506114ed6114e7611810565b8261202f565b5080806114f990613ba7565b915050611274565b5050565b61150d611810565b73ffffffffffffffffffffffffffffffffffffffff1661152b610d6b565b73ffffffffffffffffffffffffffffffffffffffff1614611581576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157890613749565b60405180910390fd5b6001600e60006101000a81548160ff021916908315150217905550565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61163a611810565b73ffffffffffffffffffffffffffffffffffffffff16611658610d6b565b73ffffffffffffffffffffffffffffffffffffffff16146116ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a590613749565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561171e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611715906135e9565b60405180910390fd5b61172781611d1c565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061179d575061179c8261204d565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661188b83610b79565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006118dc826117a4565b61191b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191290613669565b60405180910390fd5b600061192683610b79565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061199557508373ffffffffffffffffffffffffffffffffffffffff1661197d8461062f565b73ffffffffffffffffffffffffffffffffffffffff16145b806119a657506119a5818561159e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166119cf82610b79565b73ffffffffffffffffffffffffffffffffffffffff1614611a25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1c90613769565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8c90613629565b60405180910390fd5b611aa083838361212f565b611aab600082611818565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611afb9190613a5a565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b5291906139d3565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000611c1682610b79565b9050611c248160008461212f565b611c2f600083611818565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c7f9190613a5a565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611deb8484846119af565b611df78484848461213f565b611e36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2d906135c9565b60405180910390fd5b50505050565b6060600d8054611e4b90613b44565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7790613b44565b8015611ec45780601f10611e9957610100808354040283529160200191611ec4565b820191906000526020600020905b815481529060010190602001808311611ea757829003601f168201915b5050505050905090565b60606000821415611f16576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061202a565b600082905060005b60008214611f48578080611f3190613ba7565b915050600a82611f419190613a29565b9150611f1e565b60008167ffffffffffffffff811115611f6457611f63613d0c565b5b6040519080825280601f01601f191660200182016040528015611f965781602001600182028036833780820191505090505b5090505b6000851461202357600182611faf9190613a5a565b9150600a85611fbe9190613bf0565b6030611fca91906139d3565b60f81b818381518110611fe057611fdf613cdd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561201c9190613a29565b9450611f9a565b8093505050505b919050565b6120498282604051806020016040528060008152506122d6565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061211857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612128575061212782612331565b5b9050919050565b61213a83838361239b565b505050565b60006121608473ffffffffffffffffffffffffffffffffffffffff166124af565b156122c9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612189611810565b8786866040518563ffffffff1660e01b81526004016121ab9493929190613499565b602060405180830381600087803b1580156121c557600080fd5b505af19250505080156121f657506040513d601f19601f820116820180604052508101906121f39190612ee2565b60015b612279573d8060008114612226576040519150601f19603f3d011682016040523d82523d6000602084013e61222b565b606091505b50600081511415612271576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612268906135c9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506122ce565b600190505b949350505050565b6122e083836124c2565b6122ed600084848461213f565b61232c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612323906135c9565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6123a6838383612690565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123e9576123e481612695565b612428565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146124275761242683826126de565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561246b576124668161284b565b6124aa565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146124a9576124a8828261291c565b5b5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612532576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612529906136e9565b60405180910390fd5b61253b816117a4565b1561257b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257290613609565b60405180910390fd5b6125876000838361212f565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125d791906139d3565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016126eb84610c2b565b6126f59190613a5a565b90506000600860008481526020019081526020016000205490508181146127da576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160098054905061285f9190613a5a565b90506000600a600084815260200190815260200160002054905060006009838154811061288f5761288e613cdd565b5b9060005260206000200154905080600983815481106128b1576128b0613cdd565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a6000858152602001908152602001600020600090556009805480612900576128ff613cae565b5b6001900381819060005260206000200160009055905550505050565b600061292783610c2b565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b8280546129a790613b44565b90600052602060002090601f0160209004810192826129c95760008555612a10565b82601f106129e257805160ff1916838001178555612a10565b82800160010185558215612a10579182015b82811115612a0f5782518255916020019190600101906129f4565b5b509050612a1d9190612a21565b5090565b5b80821115612a3a576000816000905550600101612a22565b5090565b6000612a51612a4c846138c9565b6138a4565b90508083825260208201905082856020860282011115612a7457612a73613d40565b5b60005b85811015612aa45781612a8a8882612c3a565b845260208401935060208301925050600181019050612a77565b5050509392505050565b6000612ac1612abc846138f5565b6138a4565b905082815260208101848484011115612add57612adc613d45565b5b612ae8848285613b02565b509392505050565b6000612b03612afe84613926565b6138a4565b905082815260208101848484011115612b1f57612b1e613d45565b5b612b2a848285613b02565b509392505050565b600081359050612b4181614377565b92915050565b600081519050612b5681614377565b92915050565b600082601f830112612b7157612b70613d3b565b5b8135612b81848260208601612a3e565b91505092915050565b600081359050612b998161438e565b92915050565b600081519050612bae8161438e565b92915050565b600081359050612bc3816143a5565b92915050565b600081519050612bd8816143a5565b92915050565b600082601f830112612bf357612bf2613d3b565b5b8135612c03848260208601612aae565b91505092915050565b600082601f830112612c2157612c20613d3b565b5b8135612c31848260208601612af0565b91505092915050565b600081359050612c49816143bc565b92915050565b600060208284031215612c6557612c64613d4f565b5b6000612c7384828501612b32565b91505092915050565b600060208284031215612c9257612c91613d4f565b5b6000612ca084828501612b47565b91505092915050565b60008060408385031215612cc057612cbf613d4f565b5b6000612cce85828601612b32565b9250506020612cdf85828601612b32565b9150509250929050565b600080600060608486031215612d0257612d01613d4f565b5b6000612d1086828701612b32565b9350506020612d2186828701612b32565b9250506040612d3286828701612c3a565b9150509250925092565b60008060008060808587031215612d5657612d55613d4f565b5b6000612d6487828801612b32565b9450506020612d7587828801612b32565b9350506040612d8687828801612c3a565b925050606085013567ffffffffffffffff811115612da757612da6613d4a565b5b612db387828801612bde565b91505092959194509250565b60008060408385031215612dd657612dd5613d4f565b5b6000612de485828601612b32565b9250506020612df585828601612b8a565b9150509250929050565b60008060408385031215612e1657612e15613d4f565b5b6000612e2485828601612b32565b9250506020612e3585828601612c3a565b9150509250929050565b600060208284031215612e5557612e54613d4f565b5b600082013567ffffffffffffffff811115612e7357612e72613d4a565b5b612e7f84828501612b5c565b91505092915050565b600060208284031215612e9e57612e9d613d4f565b5b6000612eac84828501612b9f565b91505092915050565b600060208284031215612ecb57612eca613d4f565b5b6000612ed984828501612bb4565b91505092915050565b600060208284031215612ef857612ef7613d4f565b5b6000612f0684828501612bc9565b91505092915050565b600060208284031215612f2557612f24613d4f565b5b600082013567ffffffffffffffff811115612f4357612f42613d4a565b5b612f4f84828501612c0c565b91505092915050565b600060208284031215612f6e57612f6d613d4f565b5b6000612f7c84828501612c3a565b91505092915050565b6000612f918383613413565b60208301905092915050565b612fa681613a8e565b82525050565b6000612fb782613967565b612fc18185613995565b9350612fcc83613957565b8060005b83811015612ffd578151612fe48882612f85565b9750612fef83613988565b925050600181019050612fd0565b5085935050505092915050565b61301381613aa0565b82525050565b61302281613aac565b82525050565b600061303382613972565b61303d81856139a6565b935061304d818560208601613b11565b61305681613d54565b840191505092915050565b600061306c8261397d565b61307681856139b7565b9350613086818560208601613b11565b61308f81613d54565b840191505092915050565b60006130a58261397d565b6130af81856139c8565b93506130bf818560208601613b11565b80840191505092915050565b60006130d8602b836139b7565b91506130e382613d65565b604082019050919050565b60006130fb6032836139b7565b915061310682613db4565b604082019050919050565b600061311e6026836139b7565b915061312982613e03565b604082019050919050565b60006131416004836139a6565b915061314c82613e52565b602082019050919050565b6000613164601c836139b7565b915061316f82613e7b565b602082019050919050565b60006131876024836139b7565b915061319282613ea4565b604082019050919050565b60006131aa6019836139b7565b91506131b582613ef3565b602082019050919050565b60006131cd602c836139b7565b91506131d882613f1c565b604082019050919050565b60006131f06038836139b7565b91506131fb82613f6b565b604082019050919050565b6000613213602a836139b7565b915061321e82613fba565b604082019050919050565b60006132366029836139b7565b915061324182614009565b604082019050919050565b60006132596020836139b7565b915061326482614058565b602082019050919050565b600061327c6010836139b7565b915061328782614081565b602082019050919050565b600061329f602c836139b7565b91506132aa826140aa565b604082019050919050565b60006132c26020836139b7565b91506132cd826140f9565b602082019050919050565b60006132e56029836139b7565b91506132f082614122565b604082019050919050565b6000613308602f836139b7565b915061331382614171565b604082019050919050565b600061332b6021836139b7565b9150613336826141c0565b604082019050919050565b600061334e6015836139b7565b91506133598261420f565b602082019050919050565b60006133716031836139b7565b915061337c82614238565b604082019050919050565b6000613394600f836139b7565b915061339f82614287565b602082019050919050565b60006133b7602c836139b7565b91506133c2826142b0565b604082019050919050565b60006133da6010836139b7565b91506133e5826142ff565b602082019050919050565b60006133fd6030836139b7565b915061340882614328565b604082019050919050565b61341c81613af8565b82525050565b61342b81613af8565b82525050565b600061343d828561309a565b9150613449828461309a565b91508190509392505050565b600060208201905061346a6000830184612f9d565b92915050565b60006040820190506134856000830185612f9d565b6134926020830184612f9d565b9392505050565b60006080820190506134ae6000830187612f9d565b6134bb6020830186612f9d565b6134c86040830185613422565b81810360608301526134da8184613028565b905095945050505050565b60006080820190506134fa6000830186612f9d565b6135076020830185612f9d565b6135146040830184613422565b818103606083015261352581613134565b9050949350505050565b600060208201905081810360008301526135498184612fac565b905092915050565b6000602082019050613566600083018461300a565b92915050565b60006020820190506135816000830184613019565b92915050565b600060208201905081810360008301526135a18184613061565b905092915050565b600060208201905081810360008301526135c2816130cb565b9050919050565b600060208201905081810360008301526135e2816130ee565b9050919050565b6000602082019050818103600083015261360281613111565b9050919050565b6000602082019050818103600083015261362281613157565b9050919050565b600060208201905081810360008301526136428161317a565b9050919050565b600060208201905081810360008301526136628161319d565b9050919050565b60006020820190508181036000830152613682816131c0565b9050919050565b600060208201905081810360008301526136a2816131e3565b9050919050565b600060208201905081810360008301526136c281613206565b9050919050565b600060208201905081810360008301526136e281613229565b9050919050565b600060208201905081810360008301526137028161324c565b9050919050565b600060208201905081810360008301526137228161326f565b9050919050565b6000602082019050818103600083015261374281613292565b9050919050565b60006020820190508181036000830152613762816132b5565b9050919050565b60006020820190508181036000830152613782816132d8565b9050919050565b600060208201905081810360008301526137a2816132fb565b9050919050565b600060208201905081810360008301526137c28161331e565b9050919050565b600060208201905081810360008301526137e281613341565b9050919050565b6000602082019050818103600083015261380281613364565b9050919050565b6000602082019050818103600083015261382281613387565b9050919050565b60006020820190508181036000830152613842816133aa565b9050919050565b60006020820190508181036000830152613862816133cd565b9050919050565b60006020820190508181036000830152613882816133f0565b9050919050565b600060208201905061389e6000830184613422565b92915050565b60006138ae6138bf565b90506138ba8282613b76565b919050565b6000604051905090565b600067ffffffffffffffff8211156138e4576138e3613d0c565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156139105761390f613d0c565b5b61391982613d54565b9050602081019050919050565b600067ffffffffffffffff82111561394157613940613d0c565b5b61394a82613d54565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006139de82613af8565b91506139e983613af8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a1e57613a1d613c21565b5b828201905092915050565b6000613a3482613af8565b9150613a3f83613af8565b925082613a4f57613a4e613c50565b5b828204905092915050565b6000613a6582613af8565b9150613a7083613af8565b925082821015613a8357613a82613c21565b5b828203905092915050565b6000613a9982613ad8565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613b2f578082015181840152602081019050613b14565b83811115613b3e576000848401525b50505050565b60006002820490506001821680613b5c57607f821691505b60208210811415613b7057613b6f613c7f565b5b50919050565b613b7f82613d54565b810181811067ffffffffffffffff82111715613b9e57613b9d613d0c565b5b80604052505050565b6000613bb282613af8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613be557613be4613c21565b5b600182019050919050565b6000613bfb82613af8565b9150613c0683613af8565b925082613c1657613c15613c50565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f3078303000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4e65656420746f206f776e2050756e6b00000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d75737420617070726f766520636f6e74726163740000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4d657461646174612066726f7a656e0000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4944206f7574206f6620626f756e647300000000000000000000000000000000600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b61438081613a8e565b811461438b57600080fd5b50565b61439781613aa0565b81146143a257600080fd5b50565b6143ae81613aac565b81146143b957600080fd5b50565b6143c581613af8565b81146143d057600080fd5b5056fea2646970667358221220411920bf2c5c1816d5293bbf7e0ef3adfc7cd2725eb80d9809866d798c86597064736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000013577261707065642043726f6e6f732050756e6b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a43524f4e4f5350554e4b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d6452716a4d59434a4766416f5143426236524a32737556345a5658426a58436232374431564a5268327252792f00000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Wrapped Cronos Punk
Arg [1] : symbol (string): CRONOSPUNK
Arg [2] : baseTokenURI (string): ipfs://QmdRqjMYCJGfAoQCBb6RJ2suV4ZVXBjXCb27D1VJRh2rRy/

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000013
Arg [4] : 577261707065642043726f6e6f732050756e6b00000000000000000000000000
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [6] : 43524f4e4f5350554e4b00000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [8] : 697066733a2f2f516d6452716a4d59434a4766416f5143426236524a32737556
Arg [9] : 345a5658426a58436232374431564a5268327252792f00000000000000000000


Deployed ByteCode Sourcemap

237:2582:14:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2587:229;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2426:100:3;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3985:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3508:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2116:164:14;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1577:113:5;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4875:339:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1245:256:5;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1495:161:14;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5285:185:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;456:245:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1752:358:14;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1767:233:5;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2120:239:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1850:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1650:94:11;;;:::i;:::-;;999:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2595:104:3;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4278:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5541:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;370:71:14;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;511:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2770:334:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;477:27:14;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;910:573;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1664:82;;;:::i;:::-;;4644:164:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1899:192:11;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2587:229:14;2743:4;2772:36;2796:11;2772:23;:36::i;:::-;2765:43;;2587:229;;;:::o;2426:100:3:-;2480:13;2513:5;2506:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2426:100;:::o;3985:221::-;4061:7;4089:16;4097:7;4089;:16::i;:::-;4081:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4174:15;:24;4190:7;4174:24;;;;;;;;;;;;;;;;;;;;;4167:31;;3985:221;;;:::o;3508:411::-;3589:13;3605:23;3620:7;3605:14;:23::i;:::-;3589:39;;3653:5;3647:11;;:2;:11;;;;3639:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3747:5;3731:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3756:37;3773:5;3780:12;:10;:12::i;:::-;3756:16;:37::i;:::-;3731:62;3709:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;3890:21;3899:2;3903:7;3890:8;:21::i;:::-;3578:341;3508:411;;:::o;2116:164:14:-;2216:6;2242:30;;;2235:37;;2116:164;;;;;;:::o;1577:113:5:-;1638:7;1665:10;:17;;;;1658:24;;1577:113;:::o;4875:339:3:-;5070:41;5089:12;:10;:12::i;:::-;5103:7;5070:18;:41::i;:::-;5062:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5178:28;5188:4;5194:2;5198:7;5178:9;:28::i;:::-;4875:339;;;:::o;1245:256:5:-;1342:7;1378:23;1395:5;1378:16;:23::i;:::-;1370:5;:31;1362:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1467:12;:19;1480:5;1467:19;;;;;;;;;;;;;;;:26;1487:5;1467:26;;;;;;;;;;;;1460:33;;1245:256;;;;:::o;1495:161:14:-;1230:12:11;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1593:5:14::1;1575:23;;:14;;;;;;;;;;;:23;;;1567:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;1645:3;1629:13;:19;;;;;;;;;;;;:::i;:::-;;1495:161:::0;:::o;5285:185:3:-;5423:39;5440:4;5446:2;5450:7;5423:39;;;;;;;;;;;;:16;:39::i;:::-;5285:185;;;:::o;456:245:4:-;574:41;593:12;:10;:12::i;:::-;607:7;574:18;:41::i;:::-;566:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;679:14;685:7;679:5;:14::i;:::-;456:245;:::o;1752:358:14:-;1812:16;1841:23;1867:17;1877:6;1867:9;:17::i;:::-;1841:43;;1895:25;1937:15;1923:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1895:58;;1969:9;1964:113;1984:15;1980:1;:19;1964:113;;;2035:30;2055:6;2063:1;2035:19;:30::i;:::-;2021:8;2030:1;2021:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;2001:3;;;;;:::i;:::-;;;;1964:113;;;;2094:8;2087:15;;;;1752:358;;;:::o;1767:233:5:-;1842:7;1878:30;:28;:30::i;:::-;1870:5;:38;1862:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;1975:10;1986:5;1975:17;;;;;;;;:::i;:::-;;;;;;;;;;1968:24;;1767:233;;;:::o;2120:239:3:-;2192:7;2212:13;2228:7;:16;2236:7;2228:16;;;;;;;;;;;;;;;;;;;;;2212:32;;2280:1;2263:19;;:5;:19;;;;2255:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2346:5;2339:12;;;2120:239;;;:::o;1850:208::-;1922:7;1967:1;1950:19;;:5;:19;;;;1942:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2034:9;:16;2044:5;2034:16;;;;;;;;;;;;;;;;2027:23;;1850:208;;;:::o;1650:94:11:-;1230:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1715:21:::1;1733:1;1715:9;:21::i;:::-;1650:94::o:0;999:87::-;1045:7;1072:6;;;;;;;;;;;1065:13;;999:87;:::o;2595:104:3:-;2651:13;2684:7;2677:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2595:104;:::o;4278:295::-;4393:12;:10;:12::i;:::-;4381:24;;:8;:24;;;;4373:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4493:8;4448:18;:32;4467:12;:10;:12::i;:::-;4448:32;;;;;;;;;;;;;;;:42;4481:8;4448:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;4546:8;4517:48;;4532:12;:10;:12::i;:::-;4517:48;;;4556:8;4517:48;;;;;;:::i;:::-;;;;;;;;4278:295;;:::o;5541:328::-;5716:41;5735:12;:10;:12::i;:::-;5749:7;5716:18;:41::i;:::-;5708:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5822:39;5836:4;5842:2;5846:7;5855:5;5822:13;:39::i;:::-;5541:328;;;;:::o;370:71:14:-;;;;;;;;;;;;;:::o;511:34::-;;;;;;;;;;;;;:::o;2770:334:3:-;2843:13;2877:16;2885:7;2877;:16::i;:::-;2869:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2958:21;2982:10;:8;:10::i;:::-;2958:34;;3034:1;3016:7;3010:21;:25;:86;;;;;;;;;;;;;;;;;3062:7;3071:18;:7;:16;:18::i;:::-;3045:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3010:86;3003:93;;;2770:334;;;:::o;477:27:14:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;910:573::-;1048:4;993:59;;:5;;;;;;;;;;;:22;;;1016:12;:10;:12::i;:::-;1038:4;993:51;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;;985:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;1094:9;1089:387;1113:3;:10;1109:1;:14;1089:387;;;1144:10;1157:3;1161:1;1157:6;;;;;;;;:::i;:::-;;;;;;;;1144:19;;1192:1;1186:2;:7;;1178:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;1243:4;1237:2;:10;;1229:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;1306:5;;;;;;;;;;;:13;;;1320:2;1306:17;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1290:33;;:12;:10;:12::i;:::-;:33;;;1282:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;1359:5;;;;;;;;;;;:22;;;1382:12;:10;:12::i;:::-;1404:4;1411:2;1359:63;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1437:27;1447:12;:10;:12::i;:::-;1461:2;1437:9;:27::i;:::-;1129:347;1125:3;;;;;:::i;:::-;;;;1089:387;;;;910:573;:::o;1664:82::-;1230:12:11;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1734:4:14::1;1717:14;;:21;;;;;;;;;;;;;;;;;;1664:82::o:0;4644:164:3:-;4741:4;4765:18;:25;4784:5;4765:25;;;;;;;;;;;;;;;:35;4791:8;4765:35;;;;;;;;;;;;;;;;;;;;;;;;;4758:42;;4644:164;;;;:::o;1899:192:11:-;1230:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2008:1:::1;1988:22;;:8;:22;;;;1980:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2064:19;2074:8;2064:9;:19::i;:::-;1899:192:::0;:::o;937:224:5:-;1039:4;1078:35;1063:50;;;:11;:50;;;;:90;;;;1117:36;1141:11;1117:23;:36::i;:::-;1063:90;1056:97;;937:224;;;:::o;7379:127:3:-;7444:4;7496:1;7468:30;;:7;:16;7476:7;7468:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7461:37;;7379:127;;;:::o;601:98:1:-;654:7;681:10;674:17;;601:98;:::o;11361:174:3:-;11463:2;11436:15;:24;11452:7;11436:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11519:7;11515:2;11481:46;;11490:23;11505:7;11490:14;:23::i;:::-;11481:46;;;;;;;;;;;;11361:174;;:::o;7673:348::-;7766:4;7791:16;7799:7;7791;:16::i;:::-;7783:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7867:13;7883:23;7898:7;7883:14;:23::i;:::-;7867:39;;7936:5;7925:16;;:7;:16;;;:51;;;;7969:7;7945:31;;:20;7957:7;7945:11;:20::i;:::-;:31;;;7925:51;:87;;;;7980:32;7997:5;8004:7;7980:16;:32::i;:::-;7925:87;7917:96;;;7673:348;;;;:::o;10665:578::-;10824:4;10797:31;;:23;10812:7;10797:14;:23::i;:::-;:31;;;10789:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10907:1;10893:16;;:2;:16;;;;10885:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10963:39;10984:4;10990:2;10994:7;10963:20;:39::i;:::-;11067:29;11084:1;11088:7;11067:8;:29::i;:::-;11128:1;11109:9;:15;11119:4;11109:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;11157:1;11140:9;:13;11150:2;11140:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;11188:2;11169:7;:16;11177:7;11169:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;11227:7;11223:2;11208:27;;11217:4;11208:27;;;;;;;;;;;;10665:578;;;:::o;9968:360::-;10028:13;10044:23;10059:7;10044:14;:23::i;:::-;10028:39;;10080:48;10101:5;10116:1;10120:7;10080:20;:48::i;:::-;10169:29;10186:1;10190:7;10169:8;:29::i;:::-;10231:1;10211:9;:16;10221:5;10211:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;10250:7;:16;10258:7;10250:16;;;;;;;;;;;;10243:23;;;;;;;;;;;10312:7;10308:1;10284:36;;10293:5;10284:36;;;;;;;;;;;;10017:311;9968:360;:::o;2099:173:11:-;2155:16;2174:6;;;;;;;;;;;2155:25;;2200:8;2191:6;;:17;;;;;;;;;;;;;;;;;;2255:8;2224:40;;2245:8;2224:40;;;;;;;;;;;;2144:128;2099:173;:::o;6751:315:3:-;6908:28;6918:4;6924:2;6928:7;6908:9;:28::i;:::-;6955:48;6978:4;6984:2;6988:7;6997:5;6955:22;:48::i;:::-;6947:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6751:315;;;;:::o;784:114:14:-;844:13;877;870:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;784:114;:::o;288:723:13:-;344:13;574:1;565:5;:10;561:53;;;592:10;;;;;;;;;;;;;;;;;;;;;561:53;624:12;639:5;624:20;;655:14;680:78;695:1;687:4;:9;680:78;;713:8;;;;;:::i;:::-;;;;744:2;736:10;;;;;:::i;:::-;;;680:78;;;768:19;800:6;790:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;768:39;;818:154;834:1;825:5;:10;818:154;;862:1;852:11;;;;;:::i;:::-;;;929:2;921:5;:10;;;;:::i;:::-;908:2;:24;;;;:::i;:::-;895:39;;878:6;885;878:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;958:2;949:11;;;;;:::i;:::-;;;818:154;;;996:6;982:21;;;;;288:723;;;;:::o;8363:110:3:-;8439:26;8449:2;8453:7;8439:26;;;;;;;;;;;;:9;:26::i;:::-;8363:110;;:::o;1481:305::-;1583:4;1635:25;1620:40;;;:11;:40;;;;:105;;;;1692:33;1677:48;;;:11;:48;;;;1620:105;:158;;;;1742:36;1766:11;1742:23;:36::i;:::-;1620:158;1600:178;;1481:305;;;:::o;2292:223:14:-;2462:45;2489:4;2495:2;2499:7;2462:26;:45::i;:::-;2292:223;;;:::o;12100:803:3:-;12255:4;12276:15;:2;:13;;;:15::i;:::-;12272:624;;;12328:2;12312:36;;;12349:12;:10;:12::i;:::-;12363:4;12369:7;12378:5;12312:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12308:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12575:1;12558:6;:13;:18;12554:272;;;12601:60;;;;;;;;;;:::i;:::-;;;;;;;;12554:272;12776:6;12770:13;12761:6;12757:2;12753:15;12746:38;12308:533;12445:45;;;12435:55;;;:6;:55;;;;12428:62;;;;;12272:624;12880:4;12873:11;;12100:803;;;;;;;:::o;8700:321::-;8830:18;8836:2;8840:7;8830:5;:18::i;:::-;8881:54;8912:1;8916:2;8920:7;8929:5;8881:22;:54::i;:::-;8859:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;8700:321;;;:::o;787:157:2:-;872:4;911:25;896:40;;;:11;:40;;;;889:47;;787:157;;;:::o;2613:589:5:-;2757:45;2784:4;2790:2;2794:7;2757:26;:45::i;:::-;2835:1;2819:18;;:4;:18;;;2815:187;;;2854:40;2886:7;2854:31;:40::i;:::-;2815:187;;;2924:2;2916:10;;:4;:10;;;2912:90;;2943:47;2976:4;2982:7;2943:32;:47::i;:::-;2912:90;2815:187;3030:1;3016:16;;:2;:16;;;3012:183;;;3049:45;3086:7;3049:36;:45::i;:::-;3012:183;;;3122:4;3116:10;;:2;:10;;;3112:83;;3143:40;3171:2;3175:7;3143:27;:40::i;:::-;3112:83;3012:183;2613:589;;;:::o;743:387:0:-;803:4;1011:12;1078:7;1066:20;1058:28;;1121:1;1114:4;:8;1107:15;;;743:387;;;:::o;9357:382:3:-;9451:1;9437:16;;:2;:16;;;;9429:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9510:16;9518:7;9510;:16::i;:::-;9509:17;9501:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9572:45;9601:1;9605:2;9609:7;9572:20;:45::i;:::-;9647:1;9630:9;:13;9640:2;9630:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9678:2;9659:7;:16;9667:7;9659:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9723:7;9719:2;9698:33;;9715:1;9698:33;;;;;;;;;;;;9357:382;;:::o;13475:126::-;;;;:::o;3925:164:5:-;4029:10;:17;;;;4002:15;:24;4018:7;4002:24;;;;;;;;;;;:44;;;;4057:10;4073:7;4057:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3925:164;:::o;4716:988::-;4982:22;5032:1;5007:22;5024:4;5007:16;:22::i;:::-;:26;;;;:::i;:::-;4982:51;;5044:18;5065:17;:26;5083:7;5065:26;;;;;;;;;;;;5044:47;;5212:14;5198:10;:28;5194:328;;5243:19;5265:12;:18;5278:4;5265:18;;;;;;;;;;;;;;;:34;5284:14;5265:34;;;;;;;;;;;;5243:56;;5349:11;5316:12;:18;5329:4;5316:18;;;;;;;;;;;;;;;:30;5335:10;5316:30;;;;;;;;;;;:44;;;;5466:10;5433:17;:30;5451:11;5433:30;;;;;;;;;;;:43;;;;5228:294;5194:328;5618:17;:26;5636:7;5618:26;;;;;;;;;;;5611:33;;;5662:12;:18;5675:4;5662:18;;;;;;;;;;;;;;;:34;5681:14;5662:34;;;;;;;;;;;5655:41;;;4797:907;;4716:988;;:::o;5999:1079::-;6252:22;6297:1;6277:10;:17;;;;:21;;;;:::i;:::-;6252:46;;6309:18;6330:15;:24;6346:7;6330:24;;;;;;;;;;;;6309:45;;6681:19;6703:10;6714:14;6703:26;;;;;;;;:::i;:::-;;;;;;;;;;6681:48;;6767:11;6742:10;6753;6742:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;6878:10;6847:15;:28;6863:11;6847:28;;;;;;;;;;;:41;;;;7019:15;:24;7035:7;7019:24;;;;;;;;;;;7012:31;;;7054:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6070:1008;;;5999:1079;:::o;3503:221::-;3588:14;3605:20;3622:2;3605:16;:20::i;:::-;3588:37;;3663:7;3636:12;:16;3649:2;3636:16;;;;;;;;;;;;;;;:24;3653:6;3636:24;;;;;;;;;;;:34;;;;3710:6;3681:17;:26;3699:7;3681:26;;;;;;;;;;;:35;;;;3577:147;3503:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:15:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1731:143::-;1788:5;1819:6;1813:13;1804:22;;1835:33;1862:5;1835:33;:::i;:::-;1731:143;;;;:::o;1897:370::-;1968:5;2017:3;2010:4;2002:6;1998:17;1994:27;1984:122;;2025:79;;:::i;:::-;1984:122;2142:6;2129:20;2167:94;2257:3;2249:6;2242:4;2234:6;2230:17;2167:94;:::i;:::-;2158:103;;1974:293;1897:370;;;;:::o;2273:133::-;2316:5;2354:6;2341:20;2332:29;;2370:30;2394:5;2370:30;:::i;:::-;2273:133;;;;:::o;2412:137::-;2466:5;2497:6;2491:13;2482:22;;2513:30;2537:5;2513:30;:::i;:::-;2412:137;;;;:::o;2555:::-;2600:5;2638:6;2625:20;2616:29;;2654:32;2680:5;2654:32;:::i;:::-;2555:137;;;;:::o;2698:141::-;2754:5;2785:6;2779:13;2770:22;;2801:32;2827:5;2801:32;:::i;:::-;2698:141;;;;:::o;2858:338::-;2913:5;2962:3;2955:4;2947:6;2943:17;2939:27;2929:122;;2970:79;;:::i;:::-;2929:122;3087:6;3074:20;3112:78;3186:3;3178:6;3171:4;3163:6;3159:17;3112:78;:::i;:::-;3103:87;;2919:277;2858:338;;;;:::o;3216:340::-;3272:5;3321:3;3314:4;3306:6;3302:17;3298:27;3288:122;;3329:79;;:::i;:::-;3288:122;3446:6;3433:20;3471:79;3546:3;3538:6;3531:4;3523:6;3519:17;3471:79;:::i;:::-;3462:88;;3278:278;3216:340;;;;:::o;3562:139::-;3608:5;3646:6;3633:20;3624:29;;3662:33;3689:5;3662:33;:::i;:::-;3562:139;;;;:::o;3707:329::-;3766:6;3815:2;3803:9;3794:7;3790:23;3786:32;3783:119;;;3821:79;;:::i;:::-;3783:119;3941:1;3966:53;4011:7;4002:6;3991:9;3987:22;3966:53;:::i;:::-;3956:63;;3912:117;3707:329;;;;:::o;4042:351::-;4112:6;4161:2;4149:9;4140:7;4136:23;4132:32;4129:119;;;4167:79;;:::i;:::-;4129:119;4287:1;4312:64;4368:7;4359:6;4348:9;4344:22;4312:64;:::i;:::-;4302:74;;4258:128;4042:351;;;;:::o;4399:474::-;4467:6;4475;4524:2;4512:9;4503:7;4499:23;4495:32;4492:119;;;4530:79;;:::i;:::-;4492:119;4650:1;4675:53;4720:7;4711:6;4700:9;4696:22;4675:53;:::i;:::-;4665:63;;4621:117;4777:2;4803:53;4848:7;4839:6;4828:9;4824:22;4803:53;:::i;:::-;4793:63;;4748:118;4399:474;;;;;:::o;4879:619::-;4956:6;4964;4972;5021:2;5009:9;5000:7;4996:23;4992:32;4989:119;;;5027:79;;:::i;:::-;4989:119;5147:1;5172:53;5217:7;5208:6;5197:9;5193:22;5172:53;:::i;:::-;5162:63;;5118:117;5274:2;5300:53;5345:7;5336:6;5325:9;5321:22;5300:53;:::i;:::-;5290:63;;5245:118;5402:2;5428:53;5473:7;5464:6;5453:9;5449:22;5428:53;:::i;:::-;5418:63;;5373:118;4879:619;;;;;:::o;5504:943::-;5599:6;5607;5615;5623;5672:3;5660:9;5651:7;5647:23;5643:33;5640:120;;;5679:79;;:::i;:::-;5640:120;5799:1;5824:53;5869:7;5860:6;5849:9;5845:22;5824:53;:::i;:::-;5814:63;;5770:117;5926:2;5952:53;5997:7;5988:6;5977:9;5973:22;5952:53;:::i;:::-;5942:63;;5897:118;6054:2;6080:53;6125:7;6116:6;6105:9;6101:22;6080:53;:::i;:::-;6070:63;;6025:118;6210:2;6199:9;6195:18;6182:32;6241:18;6233:6;6230:30;6227:117;;;6263:79;;:::i;:::-;6227:117;6368:62;6422:7;6413:6;6402:9;6398:22;6368:62;:::i;:::-;6358:72;;6153:287;5504:943;;;;;;;:::o;6453:468::-;6518:6;6526;6575:2;6563:9;6554:7;6550:23;6546:32;6543:119;;;6581:79;;:::i;:::-;6543:119;6701:1;6726:53;6771:7;6762:6;6751:9;6747:22;6726:53;:::i;:::-;6716:63;;6672:117;6828:2;6854:50;6896:7;6887:6;6876:9;6872:22;6854:50;:::i;:::-;6844:60;;6799:115;6453:468;;;;;:::o;6927:474::-;6995:6;7003;7052:2;7040:9;7031:7;7027:23;7023:32;7020:119;;;7058:79;;:::i;:::-;7020:119;7178:1;7203:53;7248:7;7239:6;7228:9;7224:22;7203:53;:::i;:::-;7193:63;;7149:117;7305:2;7331:53;7376:7;7367:6;7356:9;7352:22;7331:53;:::i;:::-;7321:63;;7276:118;6927:474;;;;;:::o;7407:539::-;7491:6;7540:2;7528:9;7519:7;7515:23;7511:32;7508:119;;;7546:79;;:::i;:::-;7508:119;7694:1;7683:9;7679:17;7666:31;7724:18;7716:6;7713:30;7710:117;;;7746:79;;:::i;:::-;7710:117;7851:78;7921:7;7912:6;7901:9;7897:22;7851:78;:::i;:::-;7841:88;;7637:302;7407:539;;;;:::o;7952:345::-;8019:6;8068:2;8056:9;8047:7;8043:23;8039:32;8036:119;;;8074:79;;:::i;:::-;8036:119;8194:1;8219:61;8272:7;8263:6;8252:9;8248:22;8219:61;:::i;:::-;8209:71;;8165:125;7952:345;;;;:::o;8303:327::-;8361:6;8410:2;8398:9;8389:7;8385:23;8381:32;8378:119;;;8416:79;;:::i;:::-;8378:119;8536:1;8561:52;8605:7;8596:6;8585:9;8581:22;8561:52;:::i;:::-;8551:62;;8507:116;8303:327;;;;:::o;8636:349::-;8705:6;8754:2;8742:9;8733:7;8729:23;8725:32;8722:119;;;8760:79;;:::i;:::-;8722:119;8880:1;8905:63;8960:7;8951:6;8940:9;8936:22;8905:63;:::i;:::-;8895:73;;8851:127;8636:349;;;;:::o;8991:509::-;9060:6;9109:2;9097:9;9088:7;9084:23;9080:32;9077:119;;;9115:79;;:::i;:::-;9077:119;9263:1;9252:9;9248:17;9235:31;9293:18;9285:6;9282:30;9279:117;;;9315:79;;:::i;:::-;9279:117;9420:63;9475:7;9466:6;9455:9;9451:22;9420:63;:::i;:::-;9410:73;;9206:287;8991:509;;;;:::o;9506:329::-;9565:6;9614:2;9602:9;9593:7;9589:23;9585:32;9582:119;;;9620:79;;:::i;:::-;9582:119;9740:1;9765:53;9810:7;9801:6;9790:9;9786:22;9765:53;:::i;:::-;9755:63;;9711:117;9506:329;;;;:::o;9841:179::-;9910:10;9931:46;9973:3;9965:6;9931:46;:::i;:::-;10009:4;10004:3;10000:14;9986:28;;9841:179;;;;:::o;10026:118::-;10113:24;10131:5;10113:24;:::i;:::-;10108:3;10101:37;10026:118;;:::o;10180:732::-;10299:3;10328:54;10376:5;10328:54;:::i;:::-;10398:86;10477:6;10472:3;10398:86;:::i;:::-;10391:93;;10508:56;10558:5;10508:56;:::i;:::-;10587:7;10618:1;10603:284;10628:6;10625:1;10622:13;10603:284;;;10704:6;10698:13;10731:63;10790:3;10775:13;10731:63;:::i;:::-;10724:70;;10817:60;10870:6;10817:60;:::i;:::-;10807:70;;10663:224;10650:1;10647;10643:9;10638:14;;10603:284;;;10607:14;10903:3;10896:10;;10304:608;;;10180:732;;;;:::o;10918:109::-;10999:21;11014:5;10999:21;:::i;:::-;10994:3;10987:34;10918:109;;:::o;11033:115::-;11118:23;11135:5;11118:23;:::i;:::-;11113:3;11106:36;11033:115;;:::o;11154:360::-;11240:3;11268:38;11300:5;11268:38;:::i;:::-;11322:70;11385:6;11380:3;11322:70;:::i;:::-;11315:77;;11401:52;11446:6;11441:3;11434:4;11427:5;11423:16;11401:52;:::i;:::-;11478:29;11500:6;11478:29;:::i;:::-;11473:3;11469:39;11462:46;;11244:270;11154:360;;;;:::o;11520:364::-;11608:3;11636:39;11669:5;11636:39;:::i;:::-;11691:71;11755:6;11750:3;11691:71;:::i;:::-;11684:78;;11771:52;11816:6;11811:3;11804:4;11797:5;11793:16;11771:52;:::i;:::-;11848:29;11870:6;11848:29;:::i;:::-;11843:3;11839:39;11832:46;;11612:272;11520:364;;;;:::o;11890:377::-;11996:3;12024:39;12057:5;12024:39;:::i;:::-;12079:89;12161:6;12156:3;12079:89;:::i;:::-;12072:96;;12177:52;12222:6;12217:3;12210:4;12203:5;12199:16;12177:52;:::i;:::-;12254:6;12249:3;12245:16;12238:23;;12000:267;11890:377;;;;:::o;12273:366::-;12415:3;12436:67;12500:2;12495:3;12436:67;:::i;:::-;12429:74;;12512:93;12601:3;12512:93;:::i;:::-;12630:2;12625:3;12621:12;12614:19;;12273:366;;;:::o;12645:::-;12787:3;12808:67;12872:2;12867:3;12808:67;:::i;:::-;12801:74;;12884:93;12973:3;12884:93;:::i;:::-;13002:2;12997:3;12993:12;12986:19;;12645:366;;;:::o;13017:::-;13159:3;13180:67;13244:2;13239:3;13180:67;:::i;:::-;13173:74;;13256:93;13345:3;13256:93;:::i;:::-;13374:2;13369:3;13365:12;13358:19;;13017:366;;;:::o;13389:363::-;13530:3;13551:65;13614:1;13609:3;13551:65;:::i;:::-;13544:72;;13625:93;13714:3;13625:93;:::i;:::-;13743:2;13738:3;13734:12;13727:19;;13389:363;;;:::o;13758:366::-;13900:3;13921:67;13985:2;13980:3;13921:67;:::i;:::-;13914:74;;13997:93;14086:3;13997:93;:::i;:::-;14115:2;14110:3;14106:12;14099:19;;13758:366;;;:::o;14130:::-;14272:3;14293:67;14357:2;14352:3;14293:67;:::i;:::-;14286:74;;14369:93;14458:3;14369:93;:::i;:::-;14487:2;14482:3;14478:12;14471:19;;14130:366;;;:::o;14502:::-;14644:3;14665:67;14729:2;14724:3;14665:67;:::i;:::-;14658:74;;14741:93;14830:3;14741:93;:::i;:::-;14859:2;14854:3;14850:12;14843:19;;14502:366;;;:::o;14874:::-;15016:3;15037:67;15101:2;15096:3;15037:67;:::i;:::-;15030:74;;15113:93;15202:3;15113:93;:::i;:::-;15231:2;15226:3;15222:12;15215:19;;14874:366;;;:::o;15246:::-;15388:3;15409:67;15473:2;15468:3;15409:67;:::i;:::-;15402:74;;15485:93;15574:3;15485:93;:::i;:::-;15603:2;15598:3;15594:12;15587:19;;15246:366;;;:::o;15618:::-;15760:3;15781:67;15845:2;15840:3;15781:67;:::i;:::-;15774:74;;15857:93;15946:3;15857:93;:::i;:::-;15975:2;15970:3;15966:12;15959:19;;15618:366;;;:::o;15990:::-;16132:3;16153:67;16217:2;16212:3;16153:67;:::i;:::-;16146:74;;16229:93;16318:3;16229:93;:::i;:::-;16347:2;16342:3;16338:12;16331:19;;15990:366;;;:::o;16362:::-;16504:3;16525:67;16589:2;16584:3;16525:67;:::i;:::-;16518:74;;16601:93;16690:3;16601:93;:::i;:::-;16719:2;16714:3;16710:12;16703:19;;16362:366;;;:::o;16734:::-;16876:3;16897:67;16961:2;16956:3;16897:67;:::i;:::-;16890:74;;16973:93;17062:3;16973:93;:::i;:::-;17091:2;17086:3;17082:12;17075:19;;16734:366;;;:::o;17106:::-;17248:3;17269:67;17333:2;17328:3;17269:67;:::i;:::-;17262:74;;17345:93;17434:3;17345:93;:::i;:::-;17463:2;17458:3;17454:12;17447:19;;17106:366;;;:::o;17478:::-;17620:3;17641:67;17705:2;17700:3;17641:67;:::i;:::-;17634:74;;17717:93;17806:3;17717:93;:::i;:::-;17835:2;17830:3;17826:12;17819:19;;17478:366;;;:::o;17850:::-;17992:3;18013:67;18077:2;18072:3;18013:67;:::i;:::-;18006:74;;18089:93;18178:3;18089:93;:::i;:::-;18207:2;18202:3;18198:12;18191:19;;17850:366;;;:::o;18222:::-;18364:3;18385:67;18449:2;18444:3;18385:67;:::i;:::-;18378:74;;18461:93;18550:3;18461:93;:::i;:::-;18579:2;18574:3;18570:12;18563:19;;18222:366;;;:::o;18594:::-;18736:3;18757:67;18821:2;18816:3;18757:67;:::i;:::-;18750:74;;18833:93;18922:3;18833:93;:::i;:::-;18951:2;18946:3;18942:12;18935:19;;18594:366;;;:::o;18966:::-;19108:3;19129:67;19193:2;19188:3;19129:67;:::i;:::-;19122:74;;19205:93;19294:3;19205:93;:::i;:::-;19323:2;19318:3;19314:12;19307:19;;18966:366;;;:::o;19338:::-;19480:3;19501:67;19565:2;19560:3;19501:67;:::i;:::-;19494:74;;19577:93;19666:3;19577:93;:::i;:::-;19695:2;19690:3;19686:12;19679:19;;19338:366;;;:::o;19710:::-;19852:3;19873:67;19937:2;19932:3;19873:67;:::i;:::-;19866:74;;19949:93;20038:3;19949:93;:::i;:::-;20067:2;20062:3;20058:12;20051:19;;19710:366;;;:::o;20082:::-;20224:3;20245:67;20309:2;20304:3;20245:67;:::i;:::-;20238:74;;20321:93;20410:3;20321:93;:::i;:::-;20439:2;20434:3;20430:12;20423:19;;20082:366;;;:::o;20454:::-;20596:3;20617:67;20681:2;20676:3;20617:67;:::i;:::-;20610:74;;20693:93;20782:3;20693:93;:::i;:::-;20811:2;20806:3;20802:12;20795:19;;20454:366;;;:::o;20826:::-;20968:3;20989:67;21053:2;21048:3;20989:67;:::i;:::-;20982:74;;21065:93;21154:3;21065:93;:::i;:::-;21183:2;21178:3;21174:12;21167:19;;20826:366;;;:::o;21198:108::-;21275:24;21293:5;21275:24;:::i;:::-;21270:3;21263:37;21198:108;;:::o;21312:118::-;21399:24;21417:5;21399:24;:::i;:::-;21394:3;21387:37;21312:118;;:::o;21436:435::-;21616:3;21638:95;21729:3;21720:6;21638:95;:::i;:::-;21631:102;;21750:95;21841:3;21832:6;21750:95;:::i;:::-;21743:102;;21862:3;21855:10;;21436:435;;;;;:::o;21877:222::-;21970:4;22008:2;21997:9;21993:18;21985:26;;22021:71;22089:1;22078:9;22074:17;22065:6;22021:71;:::i;:::-;21877:222;;;;:::o;22105:332::-;22226:4;22264:2;22253:9;22249:18;22241:26;;22277:71;22345:1;22334:9;22330:17;22321:6;22277:71;:::i;:::-;22358:72;22426:2;22415:9;22411:18;22402:6;22358:72;:::i;:::-;22105:332;;;;;:::o;22443:640::-;22638:4;22676:3;22665:9;22661:19;22653:27;;22690:71;22758:1;22747:9;22743:17;22734:6;22690:71;:::i;:::-;22771:72;22839:2;22828:9;22824:18;22815:6;22771:72;:::i;:::-;22853;22921:2;22910:9;22906:18;22897:6;22853:72;:::i;:::-;22972:9;22966:4;22962:20;22957:2;22946:9;22942:18;22935:48;23000:76;23071:4;23062:6;23000:76;:::i;:::-;22992:84;;22443:640;;;;;;;:::o;23089:748::-;23338:4;23376:3;23365:9;23361:19;23353:27;;23390:71;23458:1;23447:9;23443:17;23434:6;23390:71;:::i;:::-;23471:72;23539:2;23528:9;23524:18;23515:6;23471:72;:::i;:::-;23553;23621:2;23610:9;23606:18;23597:6;23553:72;:::i;:::-;23672:9;23666:4;23662:20;23657:2;23646:9;23642:18;23635:48;23700:130;23825:4;23700:130;:::i;:::-;23692:138;;23089:748;;;;;;:::o;23843:373::-;23986:4;24024:2;24013:9;24009:18;24001:26;;24073:9;24067:4;24063:20;24059:1;24048:9;24044:17;24037:47;24101:108;24204:4;24195:6;24101:108;:::i;:::-;24093:116;;23843:373;;;;:::o;24222:210::-;24309:4;24347:2;24336:9;24332:18;24324:26;;24360:65;24422:1;24411:9;24407:17;24398:6;24360:65;:::i;:::-;24222:210;;;;:::o;24438:218::-;24529:4;24567:2;24556:9;24552:18;24544:26;;24580:69;24646:1;24635:9;24631:17;24622:6;24580:69;:::i;:::-;24438:218;;;;:::o;24662:313::-;24775:4;24813:2;24802:9;24798:18;24790:26;;24862:9;24856:4;24852:20;24848:1;24837:9;24833:17;24826:47;24890:78;24963:4;24954:6;24890:78;:::i;:::-;24882:86;;24662:313;;;;:::o;24981:419::-;25147:4;25185:2;25174:9;25170:18;25162:26;;25234:9;25228:4;25224:20;25220:1;25209:9;25205:17;25198:47;25262:131;25388:4;25262:131;:::i;:::-;25254:139;;24981:419;;;:::o;25406:::-;25572:4;25610:2;25599:9;25595:18;25587:26;;25659:9;25653:4;25649:20;25645:1;25634:9;25630:17;25623:47;25687:131;25813:4;25687:131;:::i;:::-;25679:139;;25406:419;;;:::o;25831:::-;25997:4;26035:2;26024:9;26020:18;26012:26;;26084:9;26078:4;26074:20;26070:1;26059:9;26055:17;26048:47;26112:131;26238:4;26112:131;:::i;:::-;26104:139;;25831:419;;;:::o;26256:::-;26422:4;26460:2;26449:9;26445:18;26437:26;;26509:9;26503:4;26499:20;26495:1;26484:9;26480:17;26473:47;26537:131;26663:4;26537:131;:::i;:::-;26529:139;;26256:419;;;:::o;26681:::-;26847:4;26885:2;26874:9;26870:18;26862:26;;26934:9;26928:4;26924:20;26920:1;26909:9;26905:17;26898:47;26962:131;27088:4;26962:131;:::i;:::-;26954:139;;26681:419;;;:::o;27106:::-;27272:4;27310:2;27299:9;27295:18;27287:26;;27359:9;27353:4;27349:20;27345:1;27334:9;27330:17;27323:47;27387:131;27513:4;27387:131;:::i;:::-;27379:139;;27106:419;;;:::o;27531:::-;27697:4;27735:2;27724:9;27720:18;27712:26;;27784:9;27778:4;27774:20;27770:1;27759:9;27755:17;27748:47;27812:131;27938:4;27812:131;:::i;:::-;27804:139;;27531:419;;;:::o;27956:::-;28122:4;28160:2;28149:9;28145:18;28137:26;;28209:9;28203:4;28199:20;28195:1;28184:9;28180:17;28173:47;28237:131;28363:4;28237:131;:::i;:::-;28229:139;;27956:419;;;:::o;28381:::-;28547:4;28585:2;28574:9;28570:18;28562:26;;28634:9;28628:4;28624:20;28620:1;28609:9;28605:17;28598:47;28662:131;28788:4;28662:131;:::i;:::-;28654:139;;28381:419;;;:::o;28806:::-;28972:4;29010:2;28999:9;28995:18;28987:26;;29059:9;29053:4;29049:20;29045:1;29034:9;29030:17;29023:47;29087:131;29213:4;29087:131;:::i;:::-;29079:139;;28806:419;;;:::o;29231:::-;29397:4;29435:2;29424:9;29420:18;29412:26;;29484:9;29478:4;29474:20;29470:1;29459:9;29455:17;29448:47;29512:131;29638:4;29512:131;:::i;:::-;29504:139;;29231:419;;;:::o;29656:::-;29822:4;29860:2;29849:9;29845:18;29837:26;;29909:9;29903:4;29899:20;29895:1;29884:9;29880:17;29873:47;29937:131;30063:4;29937:131;:::i;:::-;29929:139;;29656:419;;;:::o;30081:::-;30247:4;30285:2;30274:9;30270:18;30262:26;;30334:9;30328:4;30324:20;30320:1;30309:9;30305:17;30298:47;30362:131;30488:4;30362:131;:::i;:::-;30354:139;;30081:419;;;:::o;30506:::-;30672:4;30710:2;30699:9;30695:18;30687:26;;30759:9;30753:4;30749:20;30745:1;30734:9;30730:17;30723:47;30787:131;30913:4;30787:131;:::i;:::-;30779:139;;30506:419;;;:::o;30931:::-;31097:4;31135:2;31124:9;31120:18;31112:26;;31184:9;31178:4;31174:20;31170:1;31159:9;31155:17;31148:47;31212:131;31338:4;31212:131;:::i;:::-;31204:139;;30931:419;;;:::o;31356:::-;31522:4;31560:2;31549:9;31545:18;31537:26;;31609:9;31603:4;31599:20;31595:1;31584:9;31580:17;31573:47;31637:131;31763:4;31637:131;:::i;:::-;31629:139;;31356:419;;;:::o;31781:::-;31947:4;31985:2;31974:9;31970:18;31962:26;;32034:9;32028:4;32024:20;32020:1;32009:9;32005:17;31998:47;32062:131;32188:4;32062:131;:::i;:::-;32054:139;;31781:419;;;:::o;32206:::-;32372:4;32410:2;32399:9;32395:18;32387:26;;32459:9;32453:4;32449:20;32445:1;32434:9;32430:17;32423:47;32487:131;32613:4;32487:131;:::i;:::-;32479:139;;32206:419;;;:::o;32631:::-;32797:4;32835:2;32824:9;32820:18;32812:26;;32884:9;32878:4;32874:20;32870:1;32859:9;32855:17;32848:47;32912:131;33038:4;32912:131;:::i;:::-;32904:139;;32631:419;;;:::o;33056:::-;33222:4;33260:2;33249:9;33245:18;33237:26;;33309:9;33303:4;33299:20;33295:1;33284:9;33280:17;33273:47;33337:131;33463:4;33337:131;:::i;:::-;33329:139;;33056:419;;;:::o;33481:::-;33647:4;33685:2;33674:9;33670:18;33662:26;;33734:9;33728:4;33724:20;33720:1;33709:9;33705:17;33698:47;33762:131;33888:4;33762:131;:::i;:::-;33754:139;;33481:419;;;:::o;33906:::-;34072:4;34110:2;34099:9;34095:18;34087:26;;34159:9;34153:4;34149:20;34145:1;34134:9;34130:17;34123:47;34187:131;34313:4;34187:131;:::i;:::-;34179:139;;33906:419;;;:::o;34331:::-;34497:4;34535:2;34524:9;34520:18;34512:26;;34584:9;34578:4;34574:20;34570:1;34559:9;34555:17;34548:47;34612:131;34738:4;34612:131;:::i;:::-;34604:139;;34331:419;;;:::o;34756:222::-;34849:4;34887:2;34876:9;34872:18;34864:26;;34900:71;34968:1;34957:9;34953:17;34944:6;34900:71;:::i;:::-;34756:222;;;;:::o;34984:129::-;35018:6;35045:20;;:::i;:::-;35035:30;;35074:33;35102:4;35094:6;35074:33;:::i;:::-;34984:129;;;:::o;35119:75::-;35152:6;35185:2;35179:9;35169:19;;35119:75;:::o;35200:311::-;35277:4;35367:18;35359:6;35356:30;35353:56;;;35389:18;;:::i;:::-;35353:56;35439:4;35431:6;35427:17;35419:25;;35499:4;35493;35489:15;35481:23;;35200:311;;;:::o;35517:307::-;35578:4;35668:18;35660:6;35657:30;35654:56;;;35690:18;;:::i;:::-;35654:56;35728:29;35750:6;35728:29;:::i;:::-;35720:37;;35812:4;35806;35802:15;35794:23;;35517:307;;;:::o;35830:308::-;35892:4;35982:18;35974:6;35971:30;35968:56;;;36004:18;;:::i;:::-;35968:56;36042:29;36064:6;36042:29;:::i;:::-;36034:37;;36126:4;36120;36116:15;36108:23;;35830:308;;;:::o;36144:132::-;36211:4;36234:3;36226:11;;36264:4;36259:3;36255:14;36247:22;;36144:132;;;:::o;36282:114::-;36349:6;36383:5;36377:12;36367:22;;36282:114;;;:::o;36402:98::-;36453:6;36487:5;36481:12;36471:22;;36402:98;;;:::o;36506:99::-;36558:6;36592:5;36586:12;36576:22;;36506:99;;;:::o;36611:113::-;36681:4;36713;36708:3;36704:14;36696:22;;36611:113;;;:::o;36730:184::-;36829:11;36863:6;36858:3;36851:19;36903:4;36898:3;36894:14;36879:29;;36730:184;;;;:::o;36920:168::-;37003:11;37037:6;37032:3;37025:19;37077:4;37072:3;37068:14;37053:29;;36920:168;;;;:::o;37094:169::-;37178:11;37212:6;37207:3;37200:19;37252:4;37247:3;37243:14;37228:29;;37094:169;;;;:::o;37269:148::-;37371:11;37408:3;37393:18;;37269:148;;;;:::o;37423:305::-;37463:3;37482:20;37500:1;37482:20;:::i;:::-;37477:25;;37516:20;37534:1;37516:20;:::i;:::-;37511:25;;37670:1;37602:66;37598:74;37595:1;37592:81;37589:107;;;37676:18;;:::i;:::-;37589:107;37720:1;37717;37713:9;37706:16;;37423:305;;;;:::o;37734:185::-;37774:1;37791:20;37809:1;37791:20;:::i;:::-;37786:25;;37825:20;37843:1;37825:20;:::i;:::-;37820:25;;37864:1;37854:35;;37869:18;;:::i;:::-;37854:35;37911:1;37908;37904:9;37899:14;;37734:185;;;;:::o;37925:191::-;37965:4;37985:20;38003:1;37985:20;:::i;:::-;37980:25;;38019:20;38037:1;38019:20;:::i;:::-;38014:25;;38058:1;38055;38052:8;38049:34;;;38063:18;;:::i;:::-;38049:34;38108:1;38105;38101:9;38093:17;;37925:191;;;;:::o;38122:96::-;38159:7;38188:24;38206:5;38188:24;:::i;:::-;38177:35;;38122:96;;;:::o;38224:90::-;38258:7;38301:5;38294:13;38287:21;38276:32;;38224:90;;;:::o;38320:149::-;38356:7;38396:66;38389:5;38385:78;38374:89;;38320:149;;;:::o;38475:126::-;38512:7;38552:42;38545:5;38541:54;38530:65;;38475:126;;;:::o;38607:77::-;38644:7;38673:5;38662:16;;38607:77;;;:::o;38690:154::-;38774:6;38769:3;38764;38751:30;38836:1;38827:6;38822:3;38818:16;38811:27;38690:154;;;:::o;38850:307::-;38918:1;38928:113;38942:6;38939:1;38936:13;38928:113;;;39027:1;39022:3;39018:11;39012:18;39008:1;39003:3;38999:11;38992:39;38964:2;38961:1;38957:10;38952:15;;38928:113;;;39059:6;39056:1;39053:13;39050:101;;;39139:1;39130:6;39125:3;39121:16;39114:27;39050:101;38899:258;38850:307;;;:::o;39163:320::-;39207:6;39244:1;39238:4;39234:12;39224:22;;39291:1;39285:4;39281:12;39312:18;39302:81;;39368:4;39360:6;39356:17;39346:27;;39302:81;39430:2;39422:6;39419:14;39399:18;39396:38;39393:84;;;39449:18;;:::i;:::-;39393:84;39214:269;39163:320;;;:::o;39489:281::-;39572:27;39594:4;39572:27;:::i;:::-;39564:6;39560:40;39702:6;39690:10;39687:22;39666:18;39654:10;39651:34;39648:62;39645:88;;;39713:18;;:::i;:::-;39645:88;39753:10;39749:2;39742:22;39532:238;39489:281;;:::o;39776:233::-;39815:3;39838:24;39856:5;39838:24;:::i;:::-;39829:33;;39884:66;39877:5;39874:77;39871:103;;;39954:18;;:::i;:::-;39871:103;40001:1;39994:5;39990:13;39983:20;;39776:233;;;:::o;40015:176::-;40047:1;40064:20;40082:1;40064:20;:::i;:::-;40059:25;;40098:20;40116:1;40098:20;:::i;:::-;40093:25;;40137:1;40127:35;;40142:18;;:::i;:::-;40127:35;40183:1;40180;40176:9;40171:14;;40015:176;;;;:::o;40197:180::-;40245:77;40242:1;40235:88;40342:4;40339:1;40332:15;40366:4;40363:1;40356:15;40383:180;40431:77;40428:1;40421:88;40528:4;40525:1;40518:15;40552:4;40549:1;40542:15;40569:180;40617:77;40614:1;40607:88;40714:4;40711:1;40704:15;40738:4;40735:1;40728:15;40755:180;40803:77;40800:1;40793:88;40900:4;40897:1;40890:15;40924:4;40921:1;40914:15;40941:180;40989:77;40986:1;40979:88;41086:4;41083:1;41076:15;41110:4;41107:1;41100:15;41127:180;41175:77;41172:1;41165:88;41272:4;41269:1;41262:15;41296:4;41293:1;41286:15;41313:117;41422:1;41419;41412:12;41436:117;41545:1;41542;41535:12;41559:117;41668:1;41665;41658:12;41682:117;41791:1;41788;41781:12;41805:117;41914:1;41911;41904:12;41928:102;41969:6;42020:2;42016:7;42011:2;42004:5;42000:14;41996:28;41986:38;;41928:102;;;:::o;42036:230::-;42176:34;42172:1;42164:6;42160:14;42153:58;42245:13;42240:2;42232:6;42228:15;42221:38;42036:230;:::o;42272:237::-;42412:34;42408:1;42400:6;42396:14;42389:58;42481:20;42476:2;42468:6;42464:15;42457:45;42272:237;:::o;42515:225::-;42655:34;42651:1;42643:6;42639:14;42632:58;42724:8;42719:2;42711:6;42707:15;42700:33;42515:225;:::o;42746:154::-;42886:6;42882:1;42874:6;42870:14;42863:30;42746:154;:::o;42906:178::-;43046:30;43042:1;43034:6;43030:14;43023:54;42906:178;:::o;43090:223::-;43230:34;43226:1;43218:6;43214:14;43207:58;43299:6;43294:2;43286:6;43282:15;43275:31;43090:223;:::o;43319:175::-;43459:27;43455:1;43447:6;43443:14;43436:51;43319:175;:::o;43500:231::-;43640:34;43636:1;43628:6;43624:14;43617:58;43709:14;43704:2;43696:6;43692:15;43685:39;43500:231;:::o;43737:243::-;43877:34;43873:1;43865:6;43861:14;43854:58;43946:26;43941:2;43933:6;43929:15;43922:51;43737:243;:::o;43986:229::-;44126:34;44122:1;44114:6;44110:14;44103:58;44195:12;44190:2;44182:6;44178:15;44171:37;43986:229;:::o;44221:228::-;44361:34;44357:1;44349:6;44345:14;44338:58;44430:11;44425:2;44417:6;44413:15;44406:36;44221:228;:::o;44455:182::-;44595:34;44591:1;44583:6;44579:14;44572:58;44455:182;:::o;44643:166::-;44783:18;44779:1;44771:6;44767:14;44760:42;44643:166;:::o;44815:231::-;44955:34;44951:1;44943:6;44939:14;44932:58;45024:14;45019:2;45011:6;45007:15;45000:39;44815:231;:::o;45052:182::-;45192:34;45188:1;45180:6;45176:14;45169:58;45052:182;:::o;45240:228::-;45380:34;45376:1;45368:6;45364:14;45357:58;45449:11;45444:2;45436:6;45432:15;45425:36;45240:228;:::o;45474:234::-;45614:34;45610:1;45602:6;45598:14;45591:58;45683:17;45678:2;45670:6;45666:15;45659:42;45474:234;:::o;45714:220::-;45854:34;45850:1;45842:6;45838:14;45831:58;45923:3;45918:2;45910:6;45906:15;45899:28;45714:220;:::o;45940:171::-;46080:23;46076:1;46068:6;46064:14;46057:47;45940:171;:::o;46117:236::-;46257:34;46253:1;46245:6;46241:14;46234:58;46326:19;46321:2;46313:6;46309:15;46302:44;46117:236;:::o;46359:165::-;46499:17;46495:1;46487:6;46483:14;46476:41;46359:165;:::o;46530:231::-;46670:34;46666:1;46658:6;46654:14;46647:58;46739:14;46734:2;46726:6;46722:15;46715:39;46530:231;:::o;46767:166::-;46907:18;46903:1;46895:6;46891:14;46884:42;46767:166;:::o;46939:235::-;47079:34;47075:1;47067:6;47063:14;47056:58;47148:18;47143:2;47135:6;47131:15;47124:43;46939:235;:::o;47180:122::-;47253:24;47271:5;47253:24;:::i;:::-;47246:5;47243:35;47233:63;;47292:1;47289;47282:12;47233:63;47180:122;:::o;47308:116::-;47378:21;47393:5;47378:21;:::i;:::-;47371:5;47368:32;47358:60;;47414:1;47411;47404:12;47358:60;47308:116;:::o;47430:120::-;47502:23;47519:5;47502:23;:::i;:::-;47495:5;47492:34;47482:62;;47540:1;47537;47530:12;47482:62;47430:120;:::o;47556:122::-;47629:24;47647:5;47629:24;:::i;:::-;47622:5;47619:35;47609:63;;47668:1;47665;47658:12;47609:63;47556:122;:::o

Swarm Source

ipfs://411920bf2c5c1816d5293bbf7e0ef3adfc7cd2725eb80d9809866d798c865970
Loading