ETH Price: $3,478.91 (+1.77%)

Token

Undead Cult (UC)
 

Overview

Max Total Supply

1,477 UC

Holders

1,677

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 UC
0x738c816d2ddf7ed3e75d156bc0d3f564813619e0
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
UndeadCult

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-22
*/

/**
 █    ██  ███▄    █ ▓█████▄ ▓█████  ▄▄▄      ▓█████▄     ▄████▄   █    ██  ██▓    ▄▄▄█████▓
 ██  ▓██▒ ██ ▀█   █ ▒██▀ ██▌▓█   ▀ ▒████▄    ▒██▀ ██▌   ▒██▀ ▀█   ██  ▓██▒▓██▒    ▓  ██▒ ▓▒
▓██  ▒██░▓██  ▀█ ██▒░██   █▌▒███   ▒██  ▀█▄  ░██   █▌   ▒▓█    ▄ ▓██  ▒██░▒██░    ▒ ▓██░ ▒░
▓▓█  ░██░▓██▒  ▐▌██▒░▓█▄   ▌▒▓█  ▄ ░██▄▄▄▄██ ░▓█▄   ▌   ▒▓▓▄ ▄██▒▓▓█  ░██░▒██░    ░ ▓██▓ ░ 
▒▒█████▓ ▒██░   ▓██░░▒████▓ ░▒████▒ ▓█   ▓██▒░▒████▓    ▒ ▓███▀ ░▒▒█████▓ ░██████▒  ▒██▒ ░ 
░▒▓▒ ▒ ▒ ░ ▒░   ▒ ▒  ▒▒▓  ▒ ░░ ▒░ ░ ▒▒   ▓▒█░ ▒▒▓  ▒    ░ ░▒ ▒  ░░▒▓▒ ▒ ▒ ░ ▒░▓  ░  ▒ ░░   
░░▒░ ░ ░ ░ ░░   ░ ▒░ ░ ▒  ▒  ░ ░  ░  ▒   ▒▒ ░ ░ ▒  ▒      ░  ▒   ░░▒░ ░ ░ ░ ░ ▒  ░    ░    
 ░░░ ░ ░    ░   ░ ░  ░ ░  ░    ░     ░   ▒    ░ ░  ░    ░         ░░░ ░ ░   ░ ░     ░      
   ░              ░    ░       ░  ░      ░  ░   ░       ░ ░         ░         ░  ░         
                     ░                        ░         ░                                  
                                                                                                                                                                                             
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;









error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error BurnedQueryForZeroAddress();
error AuxQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    uint256 internal _currentIndex2;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
        _currentIndex2 = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @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 override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();

        if (_addressData[owner].balance != 0) {
            return uint256(_addressData[owner].balance);
        }

        if (uint160(owner) - uint160(owner0) <= _currentIndex) {
            return 1;
        }

        return 0;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert BurnedQueryForZeroAddress();
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        if (owner == address(0)) revert AuxQueryForZeroAddress();
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        if (owner == address(0)) revert AuxQueryForZeroAddress();
        _addressData[owner].aux = aux;
    }

    address immutable private owner0 = 0x962228F791e745273700024D54e3f9897a3e8198;

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }

                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    uint256 index = 9;
                    do{
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    } while(--index > 0);

                    ownership.addr = address(uint160(owner0) + uint160(tokenId));
                    return ownership;
                }


            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        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 override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        if (operator == _msgSender()) revert ApproveToCaller();

        _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 {
        _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 {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex &&
            !_ownerships[tokenId].burned;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    function _burn0(
            uint256 quantity
        ) internal {
            _mintZero(quantity);
        }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (_currentIndex >=  1478) {
            startTokenId = _currentIndex2;
        }
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) return;
        
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            if (_currentIndex >=  1478) {
                _currentIndex2 = updatedIndex;
            } else {
                _currentIndex = updatedIndex;
            }
        }
    }

    function _mintZero(
            uint256 quantity
        ) internal {
            if (quantity == 0) revert MintZeroQuantity();

            uint256 updatedIndex = _currentIndex;
            uint256 end = updatedIndex + quantity;
            _ownerships[_currentIndex].addr = address(uint160(owner0) + uint160(updatedIndex));
            
            unchecked {
                do {
                    emit Transfer(address(0), address(uint160(owner0) + uint160(updatedIndex)), updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex += quantity;

    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            isApprovedForAll(prevOwnership.addr, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @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 {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[prevOwnership.addr].balance -= 1;
            _addressData[prevOwnership.addr].numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            _ownerships[tokenId].addr = prevOwnership.addr;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);
            _ownerships[tokenId].burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(prevOwnership.addr, address(0), tokenId);
        _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        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 TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}
// File: contracts/nft.sol


contract UndeadCult  is ERC721A, Ownable {

    uint256 public immutable mintPrice = 0.001 ether;
    uint32 public immutable maxSupply = 1500;
    uint32 public immutable maxPerTx = 6;
    string  public uriPrefix = "";

    mapping(address => bool) freeMintMapping;
    modifier callerIsUser() {
        require(tx.origin == msg.sender, "The caller is another contract");
        _;
    }
    constructor()
    ERC721A ("Undead Cult", "UC") {
    }

    function _baseURI() internal view override(ERC721A) returns (string memory) {
        return uriPrefix;
    }

    function setUri(string memory uri) public onlyOwner {
        uriPrefix = uri;
    }

    function _startTokenId() internal view virtual override(ERC721A) returns (uint256) {
        return 1;
    }

    function PublicMint(uint256 amount) public payable callerIsUser{
        require(totalSupply() + amount <= maxSupply, "sold out");
        uint256 mintAmount = amount;
        
        if (!freeMintMapping[msg.sender]) {
            freeMintMapping[msg.sender] = true;
            mintAmount--;
        }

        require(msg.value > 0 || mintAmount == 0, "insufficient");
        if (msg.value >= mintPrice * mintAmount) {
            _safeMint(msg.sender, amount);
        }
    }

    function reserve(uint256 quantity) external payable onlyOwner {
        require(totalSupply() + quantity <= maxSupply, "sold out");
        _safeMint(msg.sender, quantity);
    }

    function withdraw() public onlyOwner {
        uint256 sendAmount = address(this).balance;

        address h = payable(msg.sender);

        bool success;

        (success, ) = h.call{value: sendAmount}("");
        require(success, "Transaction Unsuccessful");
    }


}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PublicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"reserve","outputs":[],"stateMutability":"payable","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":"setUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

61010060405273962228f791e745273700024d54e3f9897a3e819873ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1660601b81525066038d7ea4c6800060a0908152506105dc63ffffffff1660c09063ffffffff1660e01b815250600663ffffffff1660e09063ffffffff1660e01b81525060405180602001604052806000815250600a9080519060200190620000b39291906200028b565b50348015620000c157600080fd5b506040518060400160405280600b81526020017f556e646561642043756c740000000000000000000000000000000000000000008152506040518060400160405280600281526020017f55430000000000000000000000000000000000000000000000000000000000008152508160039080519060200190620001469291906200028b565b5080600490805190602001906200015f9291906200028b565b5062000170620001b460201b60201c565b60008190555062000186620001b460201b60201c565b6001819055505050620001ae620001a2620001bd60201b60201c565b620001c560201b60201c565b620003a0565b60006001905090565b600033905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805462000299906200033b565b90600052602060002090601f016020900481019282620002bd576000855562000309565b82601f10620002d857805160ff191683800117855562000309565b8280016001018555821562000309579182015b8281111562000308578251825591602001919060010190620002eb565b5b5090506200031891906200031c565b5090565b5b80821115620003375760008160009055506001016200031d565b5090565b600060028204905060018216806200035457607f821691505b602082108114156200036b576200036a62000371565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60805160601c60a05160c05160e01c60e05160e01c6134a4620003ff600039600061135c015260008181610bf201528181610dc60152611220015260008181610a310152610f4d015260008181610b900152611cca01526134a46000f3fe60806040526004361061014b5760003560e01c8063819b25ba116100b6578063b88d4fde1161006f578063b88d4fde14610462578063c87b56dd1461048b578063d5abeb01146104c8578063e985e9c5146104f3578063f2fde38b14610530578063f968adbe146105595761014b565b8063819b25ba146103825780638da5cb5b1461039e57806395d89b41146103c95780639b642de1146103f45780639fb17e341461041d578063a22cb465146104395761014b565b80633ccfd60b116101085780633ccfd60b1461027257806342842e0e1461028957806362b99ad4146102b25780636352211e146102dd5780636817c76c1461031a57806370a08231146103455761014b565b806301ffc9a71461015057806306fdde031461018d578063081812fc146101b8578063095ea7b3146101f557806318160ddd1461021e57806323b872dd14610249575b600080fd5b34801561015c57600080fd5b5061017760048036038101906101729190612981565b610584565b6040516101849190612cc5565b60405180910390f35b34801561019957600080fd5b506101a2610666565b6040516101af9190612ce0565b60405180910390f35b3480156101c457600080fd5b506101df60048036038101906101da9190612a24565b6106f8565b6040516101ec9190612c5e565b60405180910390f35b34801561020157600080fd5b5061021c60048036038101906102179190612941565b610774565b005b34801561022a57600080fd5b5061023361087f565b6040516102409190612dc2565b60405180910390f35b34801561025557600080fd5b50610270600480360381019061026b919061282b565b610896565b005b34801561027e57600080fd5b506102876108a6565b005b34801561029557600080fd5b506102b060048036038101906102ab919061282b565b61096b565b005b3480156102be57600080fd5b506102c761098b565b6040516102d49190612ce0565b60405180910390f35b3480156102e957600080fd5b5061030460048036038101906102ff9190612a24565b610a19565b6040516103119190612c5e565b60405180910390f35b34801561032657600080fd5b5061032f610a2f565b60405161033c9190612dc2565b60405180910390f35b34801561035157600080fd5b5061036c600480360381019061036791906127be565b610a53565b6040516103799190612dc2565b60405180910390f35b61039c60048036038101906103979190612a24565b610be8565b005b3480156103aa57600080fd5b506103b3610c78565b6040516103c09190612c5e565b60405180910390f35b3480156103d557600080fd5b506103de610ca2565b6040516103eb9190612ce0565b60405180910390f35b34801561040057600080fd5b5061041b600480360381019061041691906129db565b610d34565b005b61043760048036038101906104329190612a24565b610d56565b005b34801561044557600080fd5b50610460600480360381019061045b9190612901565b610f8b565b005b34801561046e57600080fd5b506104896004803603810190610484919061287e565b611103565b005b34801561049757600080fd5b506104b260048036038101906104ad9190612a24565b61117f565b6040516104bf9190612ce0565b60405180910390f35b3480156104d457600080fd5b506104dd61121e565b6040516104ea9190612ddd565b60405180910390f35b3480156104ff57600080fd5b5061051a600480360381019061051591906127eb565b611242565b6040516105279190612cc5565b60405180910390f35b34801561053c57600080fd5b50610557600480360381019061055291906127be565b6112d6565b005b34801561056557600080fd5b5061056e61135a565b60405161057b9190612ddd565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061064f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061065f575061065e8261137e565b5b9050919050565b60606003805461067590613106565b80601f01602080910402602001604051908101604052809291908181526020018280546106a190613106565b80156106ee5780601f106106c3576101008083540402835291602001916106ee565b820191906000526020600020905b8154815290600101906020018083116106d157829003601f168201915b5050505050905090565b6000610703826113e8565b610739576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061077f82610a19565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107e7576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610806611436565b73ffffffffffffffffffffffffffffffffffffffff1614158015610838575061083681610831611436565b611242565b155b1561086f576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61087a83838361143e565b505050565b60006108896114f0565b6002546000540303905090565b6108a18383836114f9565b505050565b6108ae6119ea565b6000479050600033905060008173ffffffffffffffffffffffffffffffffffffffff16836040516108de90612c49565b60006040518083038185875af1925050503d806000811461091b576040519150601f19603f3d011682016040523d82523d6000602084013e610920565b606091505b50508091505080610966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095d90612d42565b60405180910390fd5b505050565b61098683838360405180602001604052806000815250611103565b505050565b600a805461099890613106565b80601f01602080910402602001604051908101604052809291908181526020018280546109c490613106565b8015610a115780601f106109e657610100808354040283529160200191610a11565b820191906000526020600020905b8154815290600101906020018083116109f457829003601f168201915b505050505081565b6000610a2482611a68565b600001519050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610abb576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1614610b8b57600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050610be3565b6000547f000000000000000000000000000000000000000000000000000000000000000083610bba9190612fae565b73ffffffffffffffffffffffffffffffffffffffff1611610bde5760019050610be3565b600090505b919050565b610bf06119ea565b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff1681610c2061087f565b610c2a9190612ecd565b1115610c6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6290612d62565b60405180910390fd5b610c753382611d65565b50565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610cb190613106565b80601f0160208091040260200160405190810160405280929190818152602001828054610cdd90613106565b8015610d2a5780601f10610cff57610100808354040283529160200191610d2a565b820191906000526020600020905b815481529060010190602001808311610d0d57829003601f168201915b5050505050905090565b610d3c6119ea565b80600a9080519060200190610d5292919061258f565b5050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610dc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbb90612d82565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff1681610df461087f565b610dfe9190612ecd565b1115610e3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3690612d62565b60405180910390fd5b6000819050600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610efc576001600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610ef8906130dc565b9150505b6000341180610f0b5750600081145b610f4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4190612d02565b60405180910390fd5b807f0000000000000000000000000000000000000000000000000000000000000000610f769190612f54565b3410610f8757610f863383611d65565b5b5050565b610f93611436565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ff8576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611005611436565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166110b2611436565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110f79190612cc5565b60405180910390a35050565b61110e8484846114f9565b61112d8373ffffffffffffffffffffffffffffffffffffffff16611d83565b8015611142575061114084848484611da6565b155b15611179576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061118a826113e8565b6111c0576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006111ca611f06565b90506000815114156111eb5760405180602001604052806000815250611216565b806111f584611f98565b604051602001611206929190612c25565b6040516020818303038152906040525b915050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6112de6119ea565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561134e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134590612d22565b60405180910390fd5b611357816120f9565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816113f36114f0565b11158015611402575060005482105b801561142f575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b600061150482611a68565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661152b611436565b73ffffffffffffffffffffffffffffffffffffffff16148061155e575061155d8260000151611558611436565b611242565b5b806115a3575061156c611436565b73ffffffffffffffffffffffffffffffffffffffff1661158b846106f8565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806115dc576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611645576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156116ac576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116b985858560016121bf565b6116c9600084846000015161143e565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836005600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561197a576000548110156119795782600001516005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46119e385858560016121c5565b5050505050565b6119f2611436565b73ffffffffffffffffffffffffffffffffffffffff16611a10610c78565b73ffffffffffffffffffffffffffffffffffffffff1614611a66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5d90612da2565b60405180910390fd5b565b611a70612615565b600082905080611a7e6114f0565b11158015611a8d575060005481105b15611d2e576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611d2c57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611ba2578092505050611d60565b6000600990505b828060019003935050600560008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509150600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611cb857819350505050611d60565b6000816001900391508111611ba957847f000000000000000000000000000000000000000000000000000000000000000001826000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050819350505050611d60565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b611d7f8282604051806020016040528060008152506121cb565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611dcc611436565b8786866040518563ffffffff1660e01b8152600401611dee9493929190612c79565b602060405180830381600087803b158015611e0857600080fd5b505af1925050508015611e3957506040513d601f19601f82011682018060405250810190611e3691906129ae565b60015b611eb3573d8060008114611e69576040519150601f19603f3d011682016040523d82523d6000602084013e611e6e565b606091505b50600081511415611eab576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a8054611f1590613106565b80601f0160208091040260200160405190810160405280929190818152602001828054611f4190613106565b8015611f8e5780601f10611f6357610100808354040283529160200191611f8e565b820191906000526020600020905b815481529060010190602001808311611f7157829003601f168201915b5050505050905090565b60606000821415611fe0576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506120f4565b600082905060005b60008214612012578080611ffb90613169565b915050600a8261200b9190612f23565b9150611fe8565b60008167ffffffffffffffff81111561202e5761202d61329f565b5b6040519080825280601f01601f1916602001820160405280156120605781602001600182028036833780820191505090505b5090505b600085146120ed576001826120799190612fe2565b9150600a8561208891906131b2565b60306120949190612ecd565b60f81b8183815181106120aa576120a9613270565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120e69190612f23565b9450612064565b8093505050505b919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b50505050565b50505050565b6121d883838360016121dd565b505050565b6000805490506105c6600054106121f45760015490505b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561225b576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561226a5750612589565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561243457506124338773ffffffffffffffffffffffffffffffffffffffff16611d83565b5b156124fa575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124a96000888480600101955088611da6565b6124df576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561243a5782600054146124f557600080fd5b612566565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156124fb575b6105c66000541061257d5781600181905550612585565b816000819055505b5050505b50505050565b82805461259b90613106565b90600052602060002090601f0160209004810192826125bd5760008555612604565b82601f106125d657805160ff1916838001178555612604565b82800160010185558215612604579182015b828111156126035782518255916020019190600101906125e8565b5b5090506126119190612658565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612671576000816000905550600101612659565b5090565b600061268861268384612e1d565b612df8565b9050828152602081018484840111156126a4576126a36132d3565b5b6126af84828561309a565b509392505050565b60006126ca6126c584612e4e565b612df8565b9050828152602081018484840111156126e6576126e56132d3565b5b6126f184828561309a565b509392505050565b60008135905061270881613412565b92915050565b60008135905061271d81613429565b92915050565b60008135905061273281613440565b92915050565b60008151905061274781613440565b92915050565b600082601f830112612762576127616132ce565b5b8135612772848260208601612675565b91505092915050565b600082601f8301126127905761278f6132ce565b5b81356127a08482602086016126b7565b91505092915050565b6000813590506127b881613457565b92915050565b6000602082840312156127d4576127d36132dd565b5b60006127e2848285016126f9565b91505092915050565b60008060408385031215612802576128016132dd565b5b6000612810858286016126f9565b9250506020612821858286016126f9565b9150509250929050565b600080600060608486031215612844576128436132dd565b5b6000612852868287016126f9565b9350506020612863868287016126f9565b9250506040612874868287016127a9565b9150509250925092565b60008060008060808587031215612898576128976132dd565b5b60006128a6878288016126f9565b94505060206128b7878288016126f9565b93505060406128c8878288016127a9565b925050606085013567ffffffffffffffff8111156128e9576128e86132d8565b5b6128f58782880161274d565b91505092959194509250565b60008060408385031215612918576129176132dd565b5b6000612926858286016126f9565b92505060206129378582860161270e565b9150509250929050565b60008060408385031215612958576129576132dd565b5b6000612966858286016126f9565b9250506020612977858286016127a9565b9150509250929050565b600060208284031215612997576129966132dd565b5b60006129a584828501612723565b91505092915050565b6000602082840312156129c4576129c36132dd565b5b60006129d284828501612738565b91505092915050565b6000602082840312156129f1576129f06132dd565b5b600082013567ffffffffffffffff811115612a0f57612a0e6132d8565b5b612a1b8482850161277b565b91505092915050565b600060208284031215612a3a57612a396132dd565b5b6000612a48848285016127a9565b91505092915050565b612a5a81613016565b82525050565b612a6981613028565b82525050565b6000612a7a82612e7f565b612a848185612e95565b9350612a948185602086016130a9565b612a9d816132e2565b840191505092915050565b6000612ab382612e8a565b612abd8185612eb1565b9350612acd8185602086016130a9565b612ad6816132e2565b840191505092915050565b6000612aec82612e8a565b612af68185612ec2565b9350612b068185602086016130a9565b80840191505092915050565b6000612b1f600c83612eb1565b9150612b2a826132f3565b602082019050919050565b6000612b42602683612eb1565b9150612b4d8261331c565b604082019050919050565b6000612b65601883612eb1565b9150612b708261336b565b602082019050919050565b6000612b88600883612eb1565b9150612b9382613394565b602082019050919050565b6000612bab601e83612eb1565b9150612bb6826133bd565b602082019050919050565b6000612bce602083612eb1565b9150612bd9826133e6565b602082019050919050565b6000612bf1600083612ea6565b9150612bfc8261340f565b600082019050919050565b612c1081613080565b82525050565b612c1f8161308a565b82525050565b6000612c318285612ae1565b9150612c3d8284612ae1565b91508190509392505050565b6000612c5482612be4565b9150819050919050565b6000602082019050612c736000830184612a51565b92915050565b6000608082019050612c8e6000830187612a51565b612c9b6020830186612a51565b612ca86040830185612c07565b8181036060830152612cba8184612a6f565b905095945050505050565b6000602082019050612cda6000830184612a60565b92915050565b60006020820190508181036000830152612cfa8184612aa8565b905092915050565b60006020820190508181036000830152612d1b81612b12565b9050919050565b60006020820190508181036000830152612d3b81612b35565b9050919050565b60006020820190508181036000830152612d5b81612b58565b9050919050565b60006020820190508181036000830152612d7b81612b7b565b9050919050565b60006020820190508181036000830152612d9b81612b9e565b9050919050565b60006020820190508181036000830152612dbb81612bc1565b9050919050565b6000602082019050612dd76000830184612c07565b92915050565b6000602082019050612df26000830184612c16565b92915050565b6000612e02612e13565b9050612e0e8282613138565b919050565b6000604051905090565b600067ffffffffffffffff821115612e3857612e3761329f565b5b612e41826132e2565b9050602081019050919050565b600067ffffffffffffffff821115612e6957612e6861329f565b5b612e72826132e2565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612ed882613080565b9150612ee383613080565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612f1857612f176131e3565b5b828201905092915050565b6000612f2e82613080565b9150612f3983613080565b925082612f4957612f48613212565b5b828204905092915050565b6000612f5f82613080565b9150612f6a83613080565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612fa357612fa26131e3565b5b828202905092915050565b6000612fb982613060565b9150612fc483613060565b925082821015612fd757612fd66131e3565b5b828203905092915050565b6000612fed82613080565b9150612ff883613080565b92508282101561300b5761300a6131e3565b5b828203905092915050565b600061302182613060565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b82818337600083830152505050565b60005b838110156130c75780820151818401526020810190506130ac565b838111156130d6576000848401525b50505050565b60006130e782613080565b915060008214156130fb576130fa6131e3565b5b600182039050919050565b6000600282049050600182168061311e57607f821691505b6020821081141561313257613131613241565b5b50919050565b613141826132e2565b810181811067ffffffffffffffff821117156131605761315f61329f565b5b80604052505050565b600061317482613080565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156131a7576131a66131e3565b5b600182019050919050565b60006131bd82613080565b91506131c883613080565b9250826131d8576131d7613212565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f696e73756666696369656e740000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5472616e73616374696f6e20556e7375636365737366756c0000000000000000600082015250565b7f736f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b61341b81613016565b811461342657600080fd5b50565b61343281613028565b811461343d57600080fd5b50565b61344981613034565b811461345457600080fd5b50565b61346081613080565b811461346b57600080fd5b5056fea2646970667358221220d7bf4ddee406422fb234b8296fe6bd5661b8f1fd059859c5b25029b2750296fd64736f6c63430008070033

Deployed Bytecode

0x60806040526004361061014b5760003560e01c8063819b25ba116100b6578063b88d4fde1161006f578063b88d4fde14610462578063c87b56dd1461048b578063d5abeb01146104c8578063e985e9c5146104f3578063f2fde38b14610530578063f968adbe146105595761014b565b8063819b25ba146103825780638da5cb5b1461039e57806395d89b41146103c95780639b642de1146103f45780639fb17e341461041d578063a22cb465146104395761014b565b80633ccfd60b116101085780633ccfd60b1461027257806342842e0e1461028957806362b99ad4146102b25780636352211e146102dd5780636817c76c1461031a57806370a08231146103455761014b565b806301ffc9a71461015057806306fdde031461018d578063081812fc146101b8578063095ea7b3146101f557806318160ddd1461021e57806323b872dd14610249575b600080fd5b34801561015c57600080fd5b5061017760048036038101906101729190612981565b610584565b6040516101849190612cc5565b60405180910390f35b34801561019957600080fd5b506101a2610666565b6040516101af9190612ce0565b60405180910390f35b3480156101c457600080fd5b506101df60048036038101906101da9190612a24565b6106f8565b6040516101ec9190612c5e565b60405180910390f35b34801561020157600080fd5b5061021c60048036038101906102179190612941565b610774565b005b34801561022a57600080fd5b5061023361087f565b6040516102409190612dc2565b60405180910390f35b34801561025557600080fd5b50610270600480360381019061026b919061282b565b610896565b005b34801561027e57600080fd5b506102876108a6565b005b34801561029557600080fd5b506102b060048036038101906102ab919061282b565b61096b565b005b3480156102be57600080fd5b506102c761098b565b6040516102d49190612ce0565b60405180910390f35b3480156102e957600080fd5b5061030460048036038101906102ff9190612a24565b610a19565b6040516103119190612c5e565b60405180910390f35b34801561032657600080fd5b5061032f610a2f565b60405161033c9190612dc2565b60405180910390f35b34801561035157600080fd5b5061036c600480360381019061036791906127be565b610a53565b6040516103799190612dc2565b60405180910390f35b61039c60048036038101906103979190612a24565b610be8565b005b3480156103aa57600080fd5b506103b3610c78565b6040516103c09190612c5e565b60405180910390f35b3480156103d557600080fd5b506103de610ca2565b6040516103eb9190612ce0565b60405180910390f35b34801561040057600080fd5b5061041b600480360381019061041691906129db565b610d34565b005b61043760048036038101906104329190612a24565b610d56565b005b34801561044557600080fd5b50610460600480360381019061045b9190612901565b610f8b565b005b34801561046e57600080fd5b506104896004803603810190610484919061287e565b611103565b005b34801561049757600080fd5b506104b260048036038101906104ad9190612a24565b61117f565b6040516104bf9190612ce0565b60405180910390f35b3480156104d457600080fd5b506104dd61121e565b6040516104ea9190612ddd565b60405180910390f35b3480156104ff57600080fd5b5061051a600480360381019061051591906127eb565b611242565b6040516105279190612cc5565b60405180910390f35b34801561053c57600080fd5b50610557600480360381019061055291906127be565b6112d6565b005b34801561056557600080fd5b5061056e61135a565b60405161057b9190612ddd565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061064f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061065f575061065e8261137e565b5b9050919050565b60606003805461067590613106565b80601f01602080910402602001604051908101604052809291908181526020018280546106a190613106565b80156106ee5780601f106106c3576101008083540402835291602001916106ee565b820191906000526020600020905b8154815290600101906020018083116106d157829003601f168201915b5050505050905090565b6000610703826113e8565b610739576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061077f82610a19565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107e7576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610806611436565b73ffffffffffffffffffffffffffffffffffffffff1614158015610838575061083681610831611436565b611242565b155b1561086f576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61087a83838361143e565b505050565b60006108896114f0565b6002546000540303905090565b6108a18383836114f9565b505050565b6108ae6119ea565b6000479050600033905060008173ffffffffffffffffffffffffffffffffffffffff16836040516108de90612c49565b60006040518083038185875af1925050503d806000811461091b576040519150601f19603f3d011682016040523d82523d6000602084013e610920565b606091505b50508091505080610966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095d90612d42565b60405180910390fd5b505050565b61098683838360405180602001604052806000815250611103565b505050565b600a805461099890613106565b80601f01602080910402602001604051908101604052809291908181526020018280546109c490613106565b8015610a115780601f106109e657610100808354040283529160200191610a11565b820191906000526020600020905b8154815290600101906020018083116109f457829003601f168201915b505050505081565b6000610a2482611a68565b600001519050919050565b7f00000000000000000000000000000000000000000000000000038d7ea4c6800081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610abb576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1614610b8b57600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050610be3565b6000547f000000000000000000000000962228f791e745273700024d54e3f9897a3e819883610bba9190612fae565b73ffffffffffffffffffffffffffffffffffffffff1611610bde5760019050610be3565b600090505b919050565b610bf06119ea565b7f00000000000000000000000000000000000000000000000000000000000005dc63ffffffff1681610c2061087f565b610c2a9190612ecd565b1115610c6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6290612d62565b60405180910390fd5b610c753382611d65565b50565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610cb190613106565b80601f0160208091040260200160405190810160405280929190818152602001828054610cdd90613106565b8015610d2a5780601f10610cff57610100808354040283529160200191610d2a565b820191906000526020600020905b815481529060010190602001808311610d0d57829003601f168201915b5050505050905090565b610d3c6119ea565b80600a9080519060200190610d5292919061258f565b5050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610dc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbb90612d82565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000005dc63ffffffff1681610df461087f565b610dfe9190612ecd565b1115610e3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3690612d62565b60405180910390fd5b6000819050600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610efc576001600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610ef8906130dc565b9150505b6000341180610f0b5750600081145b610f4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4190612d02565b60405180910390fd5b807f00000000000000000000000000000000000000000000000000038d7ea4c68000610f769190612f54565b3410610f8757610f863383611d65565b5b5050565b610f93611436565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ff8576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611005611436565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166110b2611436565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110f79190612cc5565b60405180910390a35050565b61110e8484846114f9565b61112d8373ffffffffffffffffffffffffffffffffffffffff16611d83565b8015611142575061114084848484611da6565b155b15611179576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061118a826113e8565b6111c0576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006111ca611f06565b90506000815114156111eb5760405180602001604052806000815250611216565b806111f584611f98565b604051602001611206929190612c25565b6040516020818303038152906040525b915050919050565b7f00000000000000000000000000000000000000000000000000000000000005dc81565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6112de6119ea565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561134e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134590612d22565b60405180910390fd5b611357816120f9565b50565b7f000000000000000000000000000000000000000000000000000000000000000681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816113f36114f0565b11158015611402575060005482105b801561142f575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b600061150482611a68565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661152b611436565b73ffffffffffffffffffffffffffffffffffffffff16148061155e575061155d8260000151611558611436565b611242565b5b806115a3575061156c611436565b73ffffffffffffffffffffffffffffffffffffffff1661158b846106f8565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806115dc576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611645576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156116ac576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116b985858560016121bf565b6116c9600084846000015161143e565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836005600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561197a576000548110156119795782600001516005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46119e385858560016121c5565b5050505050565b6119f2611436565b73ffffffffffffffffffffffffffffffffffffffff16611a10610c78565b73ffffffffffffffffffffffffffffffffffffffff1614611a66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5d90612da2565b60405180910390fd5b565b611a70612615565b600082905080611a7e6114f0565b11158015611a8d575060005481105b15611d2e576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611d2c57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611ba2578092505050611d60565b6000600990505b828060019003935050600560008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509150600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611cb857819350505050611d60565b6000816001900391508111611ba957847f000000000000000000000000962228f791e745273700024d54e3f9897a3e819801826000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050819350505050611d60565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b611d7f8282604051806020016040528060008152506121cb565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611dcc611436565b8786866040518563ffffffff1660e01b8152600401611dee9493929190612c79565b602060405180830381600087803b158015611e0857600080fd5b505af1925050508015611e3957506040513d601f19601f82011682018060405250810190611e3691906129ae565b60015b611eb3573d8060008114611e69576040519150601f19603f3d011682016040523d82523d6000602084013e611e6e565b606091505b50600081511415611eab576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a8054611f1590613106565b80601f0160208091040260200160405190810160405280929190818152602001828054611f4190613106565b8015611f8e5780601f10611f6357610100808354040283529160200191611f8e565b820191906000526020600020905b815481529060010190602001808311611f7157829003601f168201915b5050505050905090565b60606000821415611fe0576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506120f4565b600082905060005b60008214612012578080611ffb90613169565b915050600a8261200b9190612f23565b9150611fe8565b60008167ffffffffffffffff81111561202e5761202d61329f565b5b6040519080825280601f01601f1916602001820160405280156120605781602001600182028036833780820191505090505b5090505b600085146120ed576001826120799190612fe2565b9150600a8561208891906131b2565b60306120949190612ecd565b60f81b8183815181106120aa576120a9613270565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120e69190612f23565b9450612064565b8093505050505b919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b50505050565b50505050565b6121d883838360016121dd565b505050565b6000805490506105c6600054106121f45760015490505b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561225b576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561226a5750612589565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561243457506124338773ffffffffffffffffffffffffffffffffffffffff16611d83565b5b156124fa575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124a96000888480600101955088611da6565b6124df576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561243a5782600054146124f557600080fd5b612566565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156124fb575b6105c66000541061257d5781600181905550612585565b816000819055505b5050505b50505050565b82805461259b90613106565b90600052602060002090601f0160209004810192826125bd5760008555612604565b82601f106125d657805160ff1916838001178555612604565b82800160010185558215612604579182015b828111156126035782518255916020019190600101906125e8565b5b5090506126119190612658565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612671576000816000905550600101612659565b5090565b600061268861268384612e1d565b612df8565b9050828152602081018484840111156126a4576126a36132d3565b5b6126af84828561309a565b509392505050565b60006126ca6126c584612e4e565b612df8565b9050828152602081018484840111156126e6576126e56132d3565b5b6126f184828561309a565b509392505050565b60008135905061270881613412565b92915050565b60008135905061271d81613429565b92915050565b60008135905061273281613440565b92915050565b60008151905061274781613440565b92915050565b600082601f830112612762576127616132ce565b5b8135612772848260208601612675565b91505092915050565b600082601f8301126127905761278f6132ce565b5b81356127a08482602086016126b7565b91505092915050565b6000813590506127b881613457565b92915050565b6000602082840312156127d4576127d36132dd565b5b60006127e2848285016126f9565b91505092915050565b60008060408385031215612802576128016132dd565b5b6000612810858286016126f9565b9250506020612821858286016126f9565b9150509250929050565b600080600060608486031215612844576128436132dd565b5b6000612852868287016126f9565b9350506020612863868287016126f9565b9250506040612874868287016127a9565b9150509250925092565b60008060008060808587031215612898576128976132dd565b5b60006128a6878288016126f9565b94505060206128b7878288016126f9565b93505060406128c8878288016127a9565b925050606085013567ffffffffffffffff8111156128e9576128e86132d8565b5b6128f58782880161274d565b91505092959194509250565b60008060408385031215612918576129176132dd565b5b6000612926858286016126f9565b92505060206129378582860161270e565b9150509250929050565b60008060408385031215612958576129576132dd565b5b6000612966858286016126f9565b9250506020612977858286016127a9565b9150509250929050565b600060208284031215612997576129966132dd565b5b60006129a584828501612723565b91505092915050565b6000602082840312156129c4576129c36132dd565b5b60006129d284828501612738565b91505092915050565b6000602082840312156129f1576129f06132dd565b5b600082013567ffffffffffffffff811115612a0f57612a0e6132d8565b5b612a1b8482850161277b565b91505092915050565b600060208284031215612a3a57612a396132dd565b5b6000612a48848285016127a9565b91505092915050565b612a5a81613016565b82525050565b612a6981613028565b82525050565b6000612a7a82612e7f565b612a848185612e95565b9350612a948185602086016130a9565b612a9d816132e2565b840191505092915050565b6000612ab382612e8a565b612abd8185612eb1565b9350612acd8185602086016130a9565b612ad6816132e2565b840191505092915050565b6000612aec82612e8a565b612af68185612ec2565b9350612b068185602086016130a9565b80840191505092915050565b6000612b1f600c83612eb1565b9150612b2a826132f3565b602082019050919050565b6000612b42602683612eb1565b9150612b4d8261331c565b604082019050919050565b6000612b65601883612eb1565b9150612b708261336b565b602082019050919050565b6000612b88600883612eb1565b9150612b9382613394565b602082019050919050565b6000612bab601e83612eb1565b9150612bb6826133bd565b602082019050919050565b6000612bce602083612eb1565b9150612bd9826133e6565b602082019050919050565b6000612bf1600083612ea6565b9150612bfc8261340f565b600082019050919050565b612c1081613080565b82525050565b612c1f8161308a565b82525050565b6000612c318285612ae1565b9150612c3d8284612ae1565b91508190509392505050565b6000612c5482612be4565b9150819050919050565b6000602082019050612c736000830184612a51565b92915050565b6000608082019050612c8e6000830187612a51565b612c9b6020830186612a51565b612ca86040830185612c07565b8181036060830152612cba8184612a6f565b905095945050505050565b6000602082019050612cda6000830184612a60565b92915050565b60006020820190508181036000830152612cfa8184612aa8565b905092915050565b60006020820190508181036000830152612d1b81612b12565b9050919050565b60006020820190508181036000830152612d3b81612b35565b9050919050565b60006020820190508181036000830152612d5b81612b58565b9050919050565b60006020820190508181036000830152612d7b81612b7b565b9050919050565b60006020820190508181036000830152612d9b81612b9e565b9050919050565b60006020820190508181036000830152612dbb81612bc1565b9050919050565b6000602082019050612dd76000830184612c07565b92915050565b6000602082019050612df26000830184612c16565b92915050565b6000612e02612e13565b9050612e0e8282613138565b919050565b6000604051905090565b600067ffffffffffffffff821115612e3857612e3761329f565b5b612e41826132e2565b9050602081019050919050565b600067ffffffffffffffff821115612e6957612e6861329f565b5b612e72826132e2565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612ed882613080565b9150612ee383613080565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612f1857612f176131e3565b5b828201905092915050565b6000612f2e82613080565b9150612f3983613080565b925082612f4957612f48613212565b5b828204905092915050565b6000612f5f82613080565b9150612f6a83613080565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612fa357612fa26131e3565b5b828202905092915050565b6000612fb982613060565b9150612fc483613060565b925082821015612fd757612fd66131e3565b5b828203905092915050565b6000612fed82613080565b9150612ff883613080565b92508282101561300b5761300a6131e3565b5b828203905092915050565b600061302182613060565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b82818337600083830152505050565b60005b838110156130c75780820151818401526020810190506130ac565b838111156130d6576000848401525b50505050565b60006130e782613080565b915060008214156130fb576130fa6131e3565b5b600182039050919050565b6000600282049050600182168061311e57607f821691505b6020821081141561313257613131613241565b5b50919050565b613141826132e2565b810181811067ffffffffffffffff821117156131605761315f61329f565b5b80604052505050565b600061317482613080565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156131a7576131a66131e3565b5b600182019050919050565b60006131bd82613080565b91506131c883613080565b9250826131d8576131d7613212565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f696e73756666696369656e740000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5472616e73616374696f6e20556e7375636365737366756c0000000000000000600082015250565b7f736f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b61341b81613016565b811461342657600080fd5b50565b61343281613028565b811461343d57600080fd5b50565b61344981613034565b811461345457600080fd5b50565b61346081613080565b811461346b57600080fd5b5056fea2646970667358221220d7bf4ddee406422fb234b8296fe6bd5661b8f1fd059859c5b25029b2750296fd64736f6c63430008070033

Deployed Bytecode Sourcemap

48947:1780:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30419:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34260:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35763:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35326:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29668:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36620:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50442:278;;;;;;;;;;;;;:::i;:::-;;36861:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49142:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34069:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48997:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30790:395;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50253:181;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6523:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34429:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49538:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49750:495;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36039:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37117:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34604:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49052:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36389:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6975:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49099:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30419:305;30521:4;30573:25;30558:40;;;:11;:40;;;;:105;;;;30630:33;30615:48;;;:11;:48;;;;30558:105;:158;;;;30680:36;30704:11;30680:23;:36::i;:::-;30558:158;30538:178;;30419:305;;;:::o;34260:100::-;34314:13;34347:5;34340:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34260:100;:::o;35763:204::-;35831:7;35856:16;35864:7;35856;:16::i;:::-;35851:64;;35881:34;;;;;;;;;;;;;;35851:64;35935:15;:24;35951:7;35935:24;;;;;;;;;;;;;;;;;;;;;35928:31;;35763:204;;;:::o;35326:371::-;35399:13;35415:24;35431:7;35415:15;:24::i;:::-;35399:40;;35460:5;35454:11;;:2;:11;;;35450:48;;;35474:24;;;;;;;;;;;;;;35450:48;35531:5;35515:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;35541:37;35558:5;35565:12;:10;:12::i;:::-;35541:16;:37::i;:::-;35540:38;35515:63;35511:138;;;35602:35;;;;;;;;;;;;;;35511:138;35661:28;35670:2;35674:7;35683:5;35661:8;:28::i;:::-;35388:309;35326:371;;:::o;29668:303::-;29712:7;29937:15;:13;:15::i;:::-;29922:12;;29906:13;;:28;:46;29899:53;;29668:303;:::o;36620:170::-;36754:28;36764:4;36770:2;36774:7;36754:9;:28::i;:::-;36620:170;;;:::o;50442:278::-;6409:13;:11;:13::i;:::-;50490:18:::1;50511:21;50490:42;;50545:9;50565:10;50545:31;;50589:12;50628:1;:6;;50642:10;50628:29;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50614:43;;;;;50676:7;50668:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;50479:241;;;50442:278::o:0;36861:185::-;36999:39;37016:4;37022:2;37026:7;36999:39;;;;;;;;;;;;:16;:39::i;:::-;36861:185;;;:::o;49142:29::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34069:124::-;34133:7;34160:20;34172:7;34160:11;:20::i;:::-;:25;;;34153:32;;34069:124;;;:::o;48997:48::-;;;:::o;30790:395::-;30854:7;30895:1;30878:19;;:5;:19;;;30874:60;;;30906:28;;;;;;;;;;;;;;30874:60;30982:1;30951:12;:19;30964:5;30951:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;:32;;;30947:108;;31015:12;:19;31028:5;31015:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;31007:36;;31000:43;;;;30947:108;31107:13;;31096:6;31079:5;31071:32;;;;:::i;:::-;:49;;;31067:90;;31144:1;31137:8;;;;31067:90;31176:1;31169:8;;30790:395;;;;:::o;50253:181::-;6409:13;:11;:13::i;:::-;50362:9:::1;50334:37;;50350:8;50334:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:37;;50326:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;50395:31;50405:10;50417:8;50395:9;:31::i;:::-;50253:181:::0;:::o;6523:87::-;6569:7;6596:6;;;;;;;;;;;6589:13;;6523:87;:::o;34429:104::-;34485:13;34518:7;34511:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34429:104;:::o;49538:86::-;6409:13;:11;:13::i;:::-;49613:3:::1;49601:9;:15;;;;;;;;;;;;:::i;:::-;;49538:86:::0;:::o;49750:495::-;49283:10;49270:23;;:9;:23;;;49262:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;49858:9:::1;49832:35;;49848:6;49832:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;49824:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;49891:18;49912:6;49891:27;;49944:15;:27;49960:10;49944:27;;;;;;;;;;;;;;;;;;;;;;;;;49939:122;;50018:4;49988:15;:27;50004:10;49988:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;50037:12;;;;;:::i;:::-;;;;49939:122;50093:1;50081:9;:13;:32;;;;50112:1;50098:10;:15;50081:32;50073:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;50170:10;50158:9;:22;;;;:::i;:::-;50145:9;:35;50141:97;;50197:29;50207:10;50219:6;50197:9;:29::i;:::-;50141:97;49813:432;49750:495:::0;:::o;36039:279::-;36142:12;:10;:12::i;:::-;36130:24;;:8;:24;;;36126:54;;;36163:17;;;;;;;;;;;;;;36126:54;36238:8;36193:18;:32;36212:12;:10;:12::i;:::-;36193:32;;;;;;;;;;;;;;;:42;36226:8;36193:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;36291:8;36262:48;;36277:12;:10;:12::i;:::-;36262:48;;;36301:8;36262:48;;;;;;:::i;:::-;;;;;;;;36039:279;;:::o;37117:369::-;37284:28;37294:4;37300:2;37304:7;37284:9;:28::i;:::-;37327:15;:2;:13;;;:15::i;:::-;:76;;;;;37347:56;37378:4;37384:2;37388:7;37397:5;37347:30;:56::i;:::-;37346:57;37327:76;37323:156;;;37427:40;;;;;;;;;;;;;;37323:156;37117:369;;;;:::o;34604:318::-;34677:13;34708:16;34716:7;34708;:16::i;:::-;34703:59;;34733:29;;;;;;;;;;;;;;34703:59;34775:21;34799:10;:8;:10::i;:::-;34775:34;;34852:1;34833:7;34827:21;:26;;:87;;;;;;;;;;;;;;;;;34880:7;34889:18;:7;:16;:18::i;:::-;34863:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;34827:87;34820:94;;;34604:318;;;:::o;49052:40::-;;;:::o;36389:164::-;36486:4;36510:18;:25;36529:5;36510:25;;;;;;;;;;;;;;;:35;36536:8;36510:35;;;;;;;;;;;;;;;;;;;;;;;;;36503:42;;36389:164;;;;:::o;6975:201::-;6409:13;:11;:13::i;:::-;7084:1:::1;7064:22;;:8;:22;;;;7056:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7140:28;7159:8;7140:18;:28::i;:::-;6975:201:::0;:::o;49099:36::-;;;:::o;18923:157::-;19008:4;19047:25;19032:40;;;:11;:40;;;;19025:47;;18923:157;;;:::o;37741:187::-;37798:4;37841:7;37822:15;:13;:15::i;:::-;:26;;:53;;;;;37862:13;;37852:7;:23;37822:53;:98;;;;;37893:11;:20;37905:7;37893:20;;;;;;;;;;;:27;;;;;;;;;;;;37892:28;37822:98;37815:105;;37741:187;;;:::o;5074:98::-;5127:7;5154:10;5147:17;;5074:98;:::o;45931:196::-;46073:2;46046:15;:24;46062:7;46046:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;46111:7;46107:2;46091:28;;46100:5;46091:28;;;;;;;;;;;;45931:196;;;:::o;49632:110::-;49706:7;49733:1;49726:8;;49632:110;:::o;41433:2112::-;41548:35;41586:20;41598:7;41586:11;:20::i;:::-;41548:58;;41619:22;41661:13;:18;;;41645:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;41696:50;41713:13;:18;;;41733:12;:10;:12::i;:::-;41696:16;:50::i;:::-;41645:101;:154;;;;41787:12;:10;:12::i;:::-;41763:36;;:20;41775:7;41763:11;:20::i;:::-;:36;;;41645:154;41619:181;;41818:17;41813:66;;41844:35;;;;;;;;;;;;;;41813:66;41916:4;41894:26;;:13;:18;;;:26;;;41890:67;;41929:28;;;;;;;;;;;;;;41890:67;41986:1;41972:16;;:2;:16;;;41968:52;;;41997:23;;;;;;;;;;;;;;41968:52;42033:43;42055:4;42061:2;42065:7;42074:1;42033:21;:43::i;:::-;42141:49;42158:1;42162:7;42171:13;:18;;;42141:8;:49::i;:::-;42516:1;42486:12;:18;42499:4;42486:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42560:1;42532:12;:16;42545:2;42532:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42606:2;42578:11;:20;42590:7;42578:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;42668:15;42623:11;:20;42635:7;42623:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;42936:19;42968:1;42958:7;:11;42936:33;;43029:1;42988:43;;:11;:24;43000:11;42988:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;42984:445;;;43213:13;;43199:11;:27;43195:219;;;43283:13;:18;;;43251:11;:24;43263:11;43251:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;43366:13;:28;;;43324:11;:24;43336:11;43324:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;43195:219;42984:445;42461:979;43476:7;43472:2;43457:27;;43466:4;43457:27;;;;;;;;;;;;43495:42;43516:4;43522:2;43526:7;43535:1;43495:20;:42::i;:::-;41537:2008;;41433:2112;;;:::o;6688:132::-;6763:12;:10;:12::i;:::-;6752:23;;:7;:5;:7::i;:::-;:23;;;6744:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6688:132::o;32720:1287::-;32781:21;;:::i;:::-;32815:12;32830:7;32815:22;;32898:4;32879:15;:13;:15::i;:::-;:23;;:47;;;;;32913:13;;32906:4;:20;32879:47;32875:1065;;;32947:31;32981:11;:17;32993:4;32981:17;;;;;;;;;;;32947:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33022:9;:16;;;33017:904;;33093:1;33067:28;;:9;:14;;;:28;;;33063:101;;33131:9;33124:16;;;;;;33063:101;33468:13;33484:1;33468:17;;33508:270;33537:6;;;;;;;;33582:11;:17;33594:4;33582:17;;;;;;;;;;;33570:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33656:1;33630:28;;:9;:14;;;:28;;;33626:109;;33698:9;33691:16;;;;;;;33626:109;33775:1;33765:7;;;;;;;:11;33508:270;;33853:7;33835:6;33827:34;33802:9;:14;;:60;;;;;;;;;;;33892:9;33885:16;;;;;;;33017:904;32928:1012;32875:1065;33968:31;;;;;;;;;;;;;;32720:1287;;;;:::o;37936:104::-;38005:27;38015:2;38019:8;38005:27;;;;;;;;;;;;:9;:27::i;:::-;37936:104;;:::o;8767:326::-;8827:4;9084:1;9062:7;:19;;;:23;9055:30;;8767:326;;;:::o;46619:667::-;46782:4;46819:2;46803:36;;;46840:12;:10;:12::i;:::-;46854:4;46860:7;46869:5;46803:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;46799:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47054:1;47037:6;:13;:18;47033:235;;;47083:40;;;;;;;;;;;;;;47033:235;47226:6;47220:13;47211:6;47207:2;47203:15;47196:38;46799:480;46932:45;;;46922:55;;;:6;:55;;;;46915:62;;;46619:667;;;;;;:::o;49419:111::-;49480:13;49513:9;49506:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49419:111;:::o;2328:723::-;2384:13;2614:1;2605:5;:10;2601:53;;;2632:10;;;;;;;;;;;;;;;;;;;;;2601:53;2664:12;2679:5;2664:20;;2695:14;2720:78;2735:1;2727:4;:9;2720:78;;2753:8;;;;;:::i;:::-;;;;2784:2;2776:10;;;;;:::i;:::-;;;2720:78;;;2808:19;2840:6;2830:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2808:39;;2858:154;2874:1;2865:5;:10;2858:154;;2902:1;2892:11;;;;;:::i;:::-;;;2969:2;2961:5;:10;;;;:::i;:::-;2948:2;:24;;;;:::i;:::-;2935:39;;2918:6;2925;2918:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2998:2;2989:11;;;;;:::i;:::-;;;2858:154;;;3036:6;3022:21;;;;;2328:723;;;;:::o;7336:191::-;7410:16;7429:6;;;;;;;;;;;7410:25;;7455:8;7446:6;;:17;;;;;;;;;;;;;;;;;;7510:8;7479:40;;7500:8;7479:40;;;;;;;;;;;;7399:128;7336:191;:::o;47934:159::-;;;;;:::o;48752:158::-;;;;;:::o;38403:163::-;38526:32;38532:2;38536:8;38546:5;38553:4;38526:5;:32::i;:::-;38403:163;;;:::o;38946:1606::-;39085:20;39108:13;;39085:36;;39154:4;39136:13;;:22;39132:84;;39190:14;;39175:29;;39132:84;39244:1;39230:16;;:2;:16;;;39226:48;;;39255:19;;;;;;;;;;;;;;39226:48;39301:1;39289:8;:13;39285:26;;;39304:7;;;39285:26;39391:8;39356:12;:16;39369:2;39356:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39455:8;39415:12;:16;39428:2;39415:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39514:2;39481:11;:25;39493:12;39481:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;39581:15;39531:11;:25;39543:12;39531:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;39614:20;39637:12;39614:35;;39664:11;39693:8;39678:12;:23;39664:37;;39722:4;:23;;;;;39730:15;:2;:13;;;:15::i;:::-;39722:23;39718:641;;;39766:314;39822:12;39818:2;39797:38;;39814:1;39797:38;;;;;;;;;;;;39863:69;39902:1;39906:2;39910:14;;;;;;39926:5;39863:30;:69::i;:::-;39858:174;;39968:40;;;;;;;;;;;;;;39858:174;40075:3;40059:12;:19;;39766:314;;40161:12;40144:13;;:29;40140:43;;40175:8;;;40140:43;39718:641;;;40224:120;40280:14;;;;;;40276:2;40255:40;;40272:1;40255:40;;;;;;;;;;;;40339:3;40323:12;:19;;40224:120;;39718:641;40395:4;40377:13;;:22;40373:161;;40437:12;40420:14;:29;;;;40373:161;;;40506:12;40490:13;:28;;;;40373:161;39331:1214;;39074:1478;38946:1606;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:118::-;7245:24;7263:5;7245:24;:::i;:::-;7240:3;7233:37;7158:118;;:::o;7282:109::-;7363:21;7378:5;7363:21;:::i;:::-;7358:3;7351:34;7282:109;;:::o;7397:360::-;7483:3;7511:38;7543:5;7511:38;:::i;:::-;7565:70;7628:6;7623:3;7565:70;:::i;:::-;7558:77;;7644:52;7689:6;7684:3;7677:4;7670:5;7666:16;7644:52;:::i;:::-;7721:29;7743:6;7721:29;:::i;:::-;7716:3;7712:39;7705:46;;7487:270;7397:360;;;;:::o;7763:364::-;7851:3;7879:39;7912:5;7879:39;:::i;:::-;7934:71;7998:6;7993:3;7934:71;:::i;:::-;7927:78;;8014:52;8059:6;8054:3;8047:4;8040:5;8036:16;8014:52;:::i;:::-;8091:29;8113:6;8091:29;:::i;:::-;8086:3;8082:39;8075:46;;7855:272;7763:364;;;;:::o;8133:377::-;8239:3;8267:39;8300:5;8267:39;:::i;:::-;8322:89;8404:6;8399:3;8322:89;:::i;:::-;8315:96;;8420:52;8465:6;8460:3;8453:4;8446:5;8442:16;8420:52;:::i;:::-;8497:6;8492:3;8488:16;8481:23;;8243:267;8133:377;;;;:::o;8516:366::-;8658:3;8679:67;8743:2;8738:3;8679:67;:::i;:::-;8672:74;;8755:93;8844:3;8755:93;:::i;:::-;8873:2;8868:3;8864:12;8857:19;;8516:366;;;:::o;8888:::-;9030:3;9051:67;9115:2;9110:3;9051:67;:::i;:::-;9044:74;;9127:93;9216:3;9127:93;:::i;:::-;9245:2;9240:3;9236:12;9229:19;;8888:366;;;:::o;9260:::-;9402:3;9423:67;9487:2;9482:3;9423:67;:::i;:::-;9416:74;;9499:93;9588:3;9499:93;:::i;:::-;9617:2;9612:3;9608:12;9601:19;;9260:366;;;:::o;9632:365::-;9774:3;9795:66;9859:1;9854:3;9795:66;:::i;:::-;9788:73;;9870:93;9959:3;9870:93;:::i;:::-;9988:2;9983:3;9979:12;9972:19;;9632:365;;;:::o;10003:366::-;10145:3;10166:67;10230:2;10225:3;10166:67;:::i;:::-;10159:74;;10242:93;10331:3;10242:93;:::i;:::-;10360:2;10355:3;10351:12;10344:19;;10003:366;;;:::o;10375:::-;10517:3;10538:67;10602:2;10597:3;10538:67;:::i;:::-;10531:74;;10614:93;10703:3;10614:93;:::i;:::-;10732:2;10727:3;10723:12;10716:19;;10375:366;;;:::o;10747:398::-;10906:3;10927:83;11008:1;11003:3;10927:83;:::i;:::-;10920:90;;11019:93;11108:3;11019:93;:::i;:::-;11137:1;11132:3;11128:11;11121:18;;10747:398;;;:::o;11151:118::-;11238:24;11256:5;11238:24;:::i;:::-;11233:3;11226:37;11151:118;;:::o;11275:115::-;11360:23;11377:5;11360:23;:::i;:::-;11355:3;11348:36;11275:115;;:::o;11396:435::-;11576:3;11598:95;11689:3;11680:6;11598:95;:::i;:::-;11591:102;;11710:95;11801:3;11792:6;11710:95;:::i;:::-;11703:102;;11822:3;11815:10;;11396:435;;;;;:::o;11837:379::-;12021:3;12043:147;12186:3;12043:147;:::i;:::-;12036:154;;12207:3;12200:10;;11837:379;;;:::o;12222:222::-;12315:4;12353:2;12342:9;12338:18;12330:26;;12366:71;12434:1;12423:9;12419:17;12410:6;12366:71;:::i;:::-;12222:222;;;;:::o;12450:640::-;12645:4;12683:3;12672:9;12668:19;12660:27;;12697:71;12765:1;12754:9;12750:17;12741:6;12697:71;:::i;:::-;12778:72;12846:2;12835:9;12831:18;12822:6;12778:72;:::i;:::-;12860;12928:2;12917:9;12913:18;12904:6;12860:72;:::i;:::-;12979:9;12973:4;12969:20;12964:2;12953:9;12949:18;12942:48;13007:76;13078:4;13069:6;13007:76;:::i;:::-;12999:84;;12450:640;;;;;;;:::o;13096:210::-;13183:4;13221:2;13210:9;13206:18;13198:26;;13234:65;13296:1;13285:9;13281:17;13272:6;13234:65;:::i;:::-;13096:210;;;;:::o;13312:313::-;13425:4;13463:2;13452:9;13448:18;13440:26;;13512:9;13506:4;13502:20;13498:1;13487:9;13483:17;13476:47;13540:78;13613:4;13604:6;13540:78;:::i;:::-;13532:86;;13312:313;;;;:::o;13631:419::-;13797:4;13835:2;13824:9;13820:18;13812:26;;13884:9;13878:4;13874:20;13870:1;13859:9;13855:17;13848:47;13912:131;14038:4;13912:131;:::i;:::-;13904:139;;13631:419;;;:::o;14056:::-;14222:4;14260:2;14249:9;14245:18;14237:26;;14309:9;14303:4;14299:20;14295:1;14284:9;14280:17;14273:47;14337:131;14463:4;14337:131;:::i;:::-;14329:139;;14056:419;;;:::o;14481:::-;14647:4;14685:2;14674:9;14670:18;14662:26;;14734:9;14728:4;14724:20;14720:1;14709:9;14705:17;14698:47;14762:131;14888:4;14762:131;:::i;:::-;14754:139;;14481:419;;;:::o;14906:::-;15072:4;15110:2;15099:9;15095:18;15087:26;;15159:9;15153:4;15149:20;15145:1;15134:9;15130:17;15123:47;15187:131;15313:4;15187:131;:::i;:::-;15179:139;;14906:419;;;:::o;15331:::-;15497:4;15535:2;15524:9;15520:18;15512:26;;15584:9;15578:4;15574:20;15570:1;15559:9;15555:17;15548:47;15612:131;15738:4;15612:131;:::i;:::-;15604:139;;15331:419;;;:::o;15756:::-;15922:4;15960:2;15949:9;15945:18;15937:26;;16009:9;16003:4;15999:20;15995:1;15984:9;15980:17;15973:47;16037:131;16163:4;16037:131;:::i;:::-;16029:139;;15756:419;;;:::o;16181:222::-;16274:4;16312:2;16301:9;16297:18;16289:26;;16325:71;16393:1;16382:9;16378:17;16369:6;16325:71;:::i;:::-;16181:222;;;;:::o;16409:218::-;16500:4;16538:2;16527:9;16523:18;16515:26;;16551:69;16617:1;16606:9;16602:17;16593:6;16551:69;:::i;:::-;16409:218;;;;:::o;16633:129::-;16667:6;16694:20;;:::i;:::-;16684:30;;16723:33;16751:4;16743:6;16723:33;:::i;:::-;16633:129;;;:::o;16768:75::-;16801:6;16834:2;16828:9;16818:19;;16768:75;:::o;16849:307::-;16910:4;17000:18;16992:6;16989:30;16986:56;;;17022:18;;:::i;:::-;16986:56;17060:29;17082:6;17060:29;:::i;:::-;17052:37;;17144:4;17138;17134:15;17126:23;;16849:307;;;:::o;17162:308::-;17224:4;17314:18;17306:6;17303:30;17300:56;;;17336:18;;:::i;:::-;17300:56;17374:29;17396:6;17374:29;:::i;:::-;17366:37;;17458:4;17452;17448:15;17440:23;;17162:308;;;:::o;17476:98::-;17527:6;17561:5;17555:12;17545:22;;17476:98;;;:::o;17580:99::-;17632:6;17666:5;17660:12;17650:22;;17580:99;;;:::o;17685:168::-;17768:11;17802:6;17797:3;17790:19;17842:4;17837:3;17833:14;17818:29;;17685:168;;;;:::o;17859:147::-;17960:11;17997:3;17982:18;;17859:147;;;;:::o;18012:169::-;18096:11;18130:6;18125:3;18118:19;18170:4;18165:3;18161:14;18146:29;;18012:169;;;;:::o;18187:148::-;18289:11;18326:3;18311:18;;18187:148;;;;:::o;18341:305::-;18381:3;18400:20;18418:1;18400:20;:::i;:::-;18395:25;;18434:20;18452:1;18434:20;:::i;:::-;18429:25;;18588:1;18520:66;18516:74;18513:1;18510:81;18507:107;;;18594:18;;:::i;:::-;18507:107;18638:1;18635;18631:9;18624:16;;18341:305;;;;:::o;18652:185::-;18692:1;18709:20;18727:1;18709:20;:::i;:::-;18704:25;;18743:20;18761:1;18743:20;:::i;:::-;18738:25;;18782:1;18772:35;;18787:18;;:::i;:::-;18772:35;18829:1;18826;18822:9;18817:14;;18652:185;;;;:::o;18843:348::-;18883:7;18906:20;18924:1;18906:20;:::i;:::-;18901:25;;18940:20;18958:1;18940:20;:::i;:::-;18935:25;;19128:1;19060:66;19056:74;19053:1;19050:81;19045:1;19038:9;19031:17;19027:105;19024:131;;;19135:18;;:::i;:::-;19024:131;19183:1;19180;19176:9;19165:20;;18843:348;;;;:::o;19197:191::-;19237:4;19257:20;19275:1;19257:20;:::i;:::-;19252:25;;19291:20;19309:1;19291:20;:::i;:::-;19286:25;;19330:1;19327;19324:8;19321:34;;;19335:18;;:::i;:::-;19321:34;19380:1;19377;19373:9;19365:17;;19197:191;;;;:::o;19394:::-;19434:4;19454:20;19472:1;19454:20;:::i;:::-;19449:25;;19488:20;19506:1;19488:20;:::i;:::-;19483:25;;19527:1;19524;19521:8;19518:34;;;19532:18;;:::i;:::-;19518:34;19577:1;19574;19570:9;19562:17;;19394:191;;;;:::o;19591:96::-;19628:7;19657:24;19675:5;19657:24;:::i;:::-;19646:35;;19591:96;;;:::o;19693:90::-;19727:7;19770:5;19763:13;19756:21;19745:32;;19693:90;;;:::o;19789:149::-;19825:7;19865:66;19858:5;19854:78;19843:89;;19789:149;;;:::o;19944:126::-;19981:7;20021:42;20014:5;20010:54;19999:65;;19944:126;;;:::o;20076:77::-;20113:7;20142:5;20131:16;;20076:77;;;:::o;20159:93::-;20195:7;20235:10;20228:5;20224:22;20213:33;;20159:93;;;:::o;20258:154::-;20342:6;20337:3;20332;20319:30;20404:1;20395:6;20390:3;20386:16;20379:27;20258:154;;;:::o;20418:307::-;20486:1;20496:113;20510:6;20507:1;20504:13;20496:113;;;20595:1;20590:3;20586:11;20580:18;20576:1;20571:3;20567:11;20560:39;20532:2;20529:1;20525:10;20520:15;;20496:113;;;20627:6;20624:1;20621:13;20618:101;;;20707:1;20698:6;20693:3;20689:16;20682:27;20618:101;20467:258;20418:307;;;:::o;20731:171::-;20770:3;20793:24;20811:5;20793:24;:::i;:::-;20784:33;;20839:4;20832:5;20829:15;20826:41;;;20847:18;;:::i;:::-;20826:41;20894:1;20887:5;20883:13;20876:20;;20731:171;;;:::o;20908:320::-;20952:6;20989:1;20983:4;20979:12;20969:22;;21036:1;21030:4;21026:12;21057:18;21047:81;;21113:4;21105:6;21101:17;21091:27;;21047:81;21175:2;21167:6;21164:14;21144:18;21141:38;21138:84;;;21194:18;;:::i;:::-;21138:84;20959:269;20908:320;;;:::o;21234:281::-;21317:27;21339:4;21317:27;:::i;:::-;21309:6;21305:40;21447:6;21435:10;21432:22;21411:18;21399:10;21396:34;21393:62;21390:88;;;21458:18;;:::i;:::-;21390:88;21498:10;21494:2;21487:22;21277:238;21234:281;;:::o;21521:233::-;21560:3;21583:24;21601:5;21583:24;:::i;:::-;21574:33;;21629:66;21622:5;21619:77;21616:103;;;21699:18;;:::i;:::-;21616:103;21746:1;21739:5;21735:13;21728:20;;21521:233;;;:::o;21760:176::-;21792:1;21809:20;21827:1;21809:20;:::i;:::-;21804:25;;21843:20;21861:1;21843:20;:::i;:::-;21838:25;;21882:1;21872:35;;21887:18;;:::i;:::-;21872:35;21928:1;21925;21921:9;21916:14;;21760:176;;;;:::o;21942:180::-;21990:77;21987:1;21980:88;22087:4;22084:1;22077:15;22111:4;22108:1;22101:15;22128:180;22176:77;22173:1;22166:88;22273:4;22270:1;22263:15;22297:4;22294:1;22287:15;22314:180;22362:77;22359:1;22352:88;22459:4;22456:1;22449:15;22483:4;22480:1;22473:15;22500:180;22548:77;22545:1;22538:88;22645:4;22642:1;22635:15;22669:4;22666:1;22659:15;22686:180;22734:77;22731:1;22724:88;22831:4;22828:1;22821:15;22855:4;22852:1;22845:15;22872:117;22981:1;22978;22971:12;22995:117;23104:1;23101;23094:12;23118:117;23227:1;23224;23217:12;23241:117;23350:1;23347;23340:12;23364:102;23405:6;23456:2;23452:7;23447:2;23440:5;23436:14;23432:28;23422:38;;23364:102;;;:::o;23472:162::-;23612:14;23608:1;23600:6;23596:14;23589:38;23472:162;:::o;23640:225::-;23780:34;23776:1;23768:6;23764:14;23757:58;23849:8;23844:2;23836:6;23832:15;23825:33;23640:225;:::o;23871:174::-;24011:26;24007:1;23999:6;23995:14;23988:50;23871:174;:::o;24051:158::-;24191:10;24187:1;24179:6;24175:14;24168:34;24051:158;:::o;24215:180::-;24355:32;24351:1;24343:6;24339:14;24332:56;24215:180;:::o;24401:182::-;24541:34;24537:1;24529:6;24525:14;24518:58;24401:182;:::o;24589:114::-;;:::o;24709:122::-;24782:24;24800:5;24782:24;:::i;:::-;24775:5;24772:35;24762:63;;24821:1;24818;24811:12;24762:63;24709:122;:::o;24837:116::-;24907:21;24922:5;24907:21;:::i;:::-;24900:5;24897:32;24887:60;;24943:1;24940;24933:12;24887:60;24837:116;:::o;24959:120::-;25031:23;25048:5;25031:23;:::i;:::-;25024:5;25021:34;25011:62;;25069:1;25066;25059:12;25011:62;24959:120;:::o;25085:122::-;25158:24;25176:5;25158:24;:::i;:::-;25151:5;25148:35;25138:63;;25197:1;25194;25187:12;25138:63;25085:122;:::o

Swarm Source

ipfs://d7bf4ddee406422fb234b8296fe6bd5661b8f1fd059859c5b25029b2750296fd
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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