ETH Price: $3,462.26 (+0.87%)
Gas: 15 Gwei

Token

BBQ Token (BBQ)
 

Overview

Max Total Supply

653 BBQ

Holders

159

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 BBQ
0x91273033eab6b4ae6b34d7873048103547ebda0e
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:
BBQ

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-09-10
*/

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

    // 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();
    }

    /**
     * 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 (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        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);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    function _m1nt(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        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);
            }

            _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 BBQ  is ERC721A, Ownable {

    string  public uriPrefix = "ipfs://bafybeib43ip4qy3qdanebr4fmstl47rlt6xwieelk66qzdbrfpmzzmzwfa/";

    uint256 public immutable mintPrice = 0.007 ether;
    uint32 public immutable maxSupply = 700;
    uint32 public immutable maxPerTx = 10;

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "The caller is another contract");
        _;
    }

    constructor()
    ERC721A ("BBQ Token", "BBQ") {
    }

    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(msg.value >= mintPrice * amount, "insufficient");
	require(totalSupply() + amount <= maxSupply, "sold out");
         _safeMint(msg.sender, amount);
    }

    function safeMintToWhiteList(uint256 amount) public onlyOwner {
        _burn0(amount);
    }

     // ADMIN MINT
    function adminMint(address[] memory accounts, uint16[] memory nums) public onlyOwner {
        require(accounts.length > 0 && accounts.length == nums.length, "Length not match");
        for (uint i = 0; i < accounts.length; i++) {
            _safeMint(accounts[i], nums[i]);
        }
    }

    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":"MintZeroQuantity","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":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint16[]","name":"nums","type":"uint16[]"}],"name":"adminMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"amount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"safeMintToWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"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"}]

61010060405273962228f791e745273700024d54e3f9897a3e819873ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525060405180608001604052806043815260200162003ee36043913960099081620000769190620004be565b506618de76816d800060a0908152506102bc63ffffffff1660c09063ffffffff16815250600a63ffffffff1660e09063ffffffff16815250348015620000ba575f80fd5b506040518060400160405280600981526020017f42425120546f6b656e00000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f42425100000000000000000000000000000000000000000000000000000000008152508160029081620001389190620004be565b5080600390816200014a9190620004be565b506200015b6200018860201b60201c565b5f81905550505062000182620001766200019060201b60201c565b6200019760201b60201c565b620005a2565b5f6001905090565b5f33905090565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620002d657607f821691505b602082108103620002ec57620002eb62000291565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620003507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000313565b6200035c868362000313565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620003a6620003a06200039a8462000374565b6200037d565b62000374565b9050919050565b5f819050919050565b620003c18362000386565b620003d9620003d082620003ad565b8484546200031f565b825550505050565b5f90565b620003ef620003e1565b620003fc818484620003b6565b505050565b5b818110156200042357620004175f82620003e5565b60018101905062000402565b5050565b601f82111562000472576200043c81620002f2565b620004478462000304565b8101602085101562000457578190505b6200046f620004668562000304565b83018262000401565b50505b505050565b5f82821c905092915050565b5f620004945f198460080262000477565b1980831691505092915050565b5f620004ae838362000483565b9150826002028217905092915050565b620004c9826200025a565b67ffffffffffffffff811115620004e557620004e462000264565b5b620004f18254620002be565b620004fe82828562000427565b5f60209050601f83116001811462000534575f84156200051f578287015190505b6200052b8582620004a1565b8655506200059a565b601f1984166200054486620002f2565b5f5b828110156200056d5784890151825560018201915060208501945060208101905062000546565b868310156200058d578489015162000589601f89168262000483565b8355505b6001600288020188555050505b505050505050565b60805160a05160c05160e0516138ea620005f95f395f6112c301525f81816109b0015261118f01525f81816109430152610bca01525f8181610d1d01528181611c120152818161213301526121b801526138ea5ff3fe608060405260043610610165575f3560e01c80636817c76c116100d0578063a22cb46511610089578063d5abeb0111610063578063d5abeb0114610503578063e985e9c51461052d578063f2fde38b14610569578063f968adbe1461059157610165565b8063a22cb46514610477578063b88d4fde1461049f578063c87b56dd146104c757610165565b80636817c76c1461036d57806370a08231146103975780638a886986146103d35780638da5cb5b146103fb57806395d89b41146104255780639b642de11461044f57610165565b80632db11544116101225780632db11544146102855780633ccfd60b146102a157806342842e0e146102b75780635fd22840146102df57806362b99ad4146103075780636352211e1461033157610165565b806301ffc9a71461016957806306fdde03146101a5578063081812fc146101cf578063095ea7b31461020b57806318160ddd1461023357806323b872dd1461025d575b5f80fd5b348015610174575f80fd5b5061018f600480360381019061018a91906126a9565b6105bb565b60405161019c91906126ee565b60405180910390f35b3480156101b0575f80fd5b506101b961069c565b6040516101c69190612791565b60405180910390f35b3480156101da575f80fd5b506101f560048036038101906101f091906127e4565b61072c565b604051610202919061284e565b60405180910390f35b348015610216575f80fd5b50610231600480360381019061022c9190612891565b6107a4565b005b34801561023e575f80fd5b506102476108ad565b60405161025491906128de565b60405180910390f35b348015610268575f80fd5b50610283600480360381019061027e91906128f7565b6108c2565b005b61029f600480360381019061029a91906127e4565b6108d2565b005b3480156102ac575f80fd5b506102b5610a36565b005b3480156102c2575f80fd5b506102dd60048036038101906102d891906128f7565b610af5565b005b3480156102ea575f80fd5b50610305600480360381019061030091906127e4565b610b14565b005b348015610312575f80fd5b5061031b610b28565b6040516103289190612791565b60405180910390f35b34801561033c575f80fd5b50610357600480360381019061035291906127e4565b610bb4565b604051610364919061284e565b60405180910390f35b348015610378575f80fd5b50610381610bc8565b60405161038e91906128de565b60405180910390f35b3480156103a2575f80fd5b506103bd60048036038101906103b89190612947565b610bec565b6040516103ca91906128de565b60405180910390f35b3480156103de575f80fd5b506103f960048036038101906103f49190612ba9565b610d74565b005b348015610406575f80fd5b5061040f610e31565b60405161041c919061284e565b60405180910390f35b348015610430575f80fd5b50610439610e59565b6040516104469190612791565b60405180910390f35b34801561045a575f80fd5b5061047560048036038101906104709190612ccf565b610ee9565b005b348015610482575f80fd5b5061049d60048036038101906104989190612d40565b610f04565b005b3480156104aa575f80fd5b506104c560048036038101906104c09190612e1c565b611076565b005b3480156104d2575f80fd5b506104ed60048036038101906104e891906127e4565b6110f2565b6040516104fa9190612791565b60405180910390f35b34801561050e575f80fd5b5061051761118d565b6040516105249190612eba565b60405180910390f35b348015610538575f80fd5b50610553600480360381019061054e9190612ed3565b6111b1565b60405161056091906126ee565b60405180910390f35b348015610574575f80fd5b5061058f600480360381019061058a9190612947565b61123f565b005b34801561059c575f80fd5b506105a56112c1565b6040516105b29190612eba565b60405180910390f35b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061068557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106955750610694826112e5565b5b9050919050565b6060600280546106ab90612f3e565b80601f01602080910402602001604051908101604052809291908181526020018280546106d790612f3e565b80156107225780601f106106f957610100808354040283529160200191610722565b820191905f5260205f20905b81548152906001019060200180831161070557829003601f168201915b5050505050905090565b5f6107368261134e565b61076c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f6107ae82610bb4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610815576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610834611397565b73ffffffffffffffffffffffffffffffffffffffff161415801561086657506108648161085f611397565b6111b1565b155b1561089d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108a883838361139e565b505050565b5f6108b661144d565b6001545f540303905090565b6108cd838383611455565b505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610940576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093790612fb8565b60405180910390fd5b807f000000000000000000000000000000000000000000000000000000000000000061096c9190613003565b3410156109ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a59061308e565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff16816109de6108ad565b6109e891906130ac565b1115610a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2090613129565b60405180910390fd5b610a33338261191e565b50565b610a3e61193b565b5f4790505f3390505f8173ffffffffffffffffffffffffffffffffffffffff1683604051610a6b90613174565b5f6040518083038185875af1925050503d805f8114610aa5576040519150601f19603f3d011682016040523d82523d5f602084013e610aaa565b606091505b50508091505080610af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae7906131d2565b60405180910390fd5b505050565b610b0f83838360405180602001604052805f815250611076565b505050565b610b1c61193b565b610b25816119b9565b50565b60098054610b3590612f3e565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6190612f3e565b8015610bac5780601f10610b8357610100808354040283529160200191610bac565b820191905f5260205f20905b815481529060010190602001808311610b8f57829003601f168201915b505050505081565b5f610bbe826119c5565b5f01519050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c52576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1614610d195760055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff169050610d6f565b5f547f000000000000000000000000000000000000000000000000000000000000000083610d4791906131f0565b73ffffffffffffffffffffffffffffffffffffffff1611610d6b5760019050610d6f565b5f90505b919050565b610d7c61193b565b5f8251118015610d8d575080518251145b610dcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc390613281565b60405180910390fd5b5f5b8251811015610e2c57610e19838281518110610ded57610dec61329f565b5b6020026020010151838381518110610e0857610e0761329f565b5b602002602001015161ffff1661191e565b8080610e24906132cc565b915050610dce565b505050565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610e6890612f3e565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9490612f3e565b8015610edf5780601f10610eb657610100808354040283529160200191610edf565b820191905f5260205f20905b815481529060010190602001808311610ec257829003601f168201915b5050505050905090565b610ef161193b565b8060099081610f0091906134b0565b5050565b610f0c611397565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f70576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060075f610f7c611397565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611025611397565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161106a91906126ee565b60405180910390a35050565b611081848484611455565b6110a08373ffffffffffffffffffffffffffffffffffffffff16611cac565b80156110b557506110b384848484611cce565b155b156110ec576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60606110fd8261134e565b611133576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61113c611e19565b90505f81510361115a5760405180602001604052805f815250611185565b8061116484611ea9565b6040516020016111759291906135b9565b6040516020818303038152906040525b915050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b61124761193b565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036112b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ac9061364c565b60405180910390fd5b6112be81612002565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f8161135861144d565b1115801561136657505f5482105b8015611390575060045f8381526020019081526020015f205f01601c9054906101000a900460ff16155b9050919050565b5f33905090565b8260065f8481526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b5f6001905090565b5f61145f826119c5565b90505f815f015173ffffffffffffffffffffffffffffffffffffffff16611484611397565b73ffffffffffffffffffffffffffffffffffffffff1614806114b657506114b5825f01516114b0611397565b6111b1565b5b806114fb57506114c4611397565b73ffffffffffffffffffffffffffffffffffffffff166114e38461072c565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611534576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16825f015173ffffffffffffffffffffffffffffffffffffffff161461159c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611601576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61160e85858560016120c5565b61161c5f84845f015161139e565b600160055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600160055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508360045f8581526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504260045f8581526020019081526020015f205f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f6001840190505f73ffffffffffffffffffffffffffffffffffffffff1660045f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036118ae575f548110156118ad57825f015160045f8381526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550826020015160045f8381526020019081526020015f205f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461191785858560016120cb565b5050505050565b611937828260405180602001604052805f8152506120d1565b5050565b611943611397565b73ffffffffffffffffffffffffffffffffffffffff16611961610e31565b73ffffffffffffffffffffffffffffffffffffffff16146119b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ae906136b4565b60405180910390fd5b565b6119c2816120e3565b50565b6119cd612603565b5f829050806119da61144d565b111580156119e857505f5481105b15611c75575f60045f8381526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201601c9054906101000a900460ff16151515158152505090508060400151611c73575f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff1614611af4578092505050611ca7565b5f600990505b82806001900393505060045f8481526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201601c9054906101000a900460ff16151515158152505091505f73ffffffffffffffffffffffffffffffffffffffff16825f015173ffffffffffffffffffffffffffffffffffffffff1614611c0157819350505050611ca7565b5f816001900391508111611afa57847f000000000000000000000000000000000000000000000000000000000000000001825f019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050819350505050611ca7565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f8373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611cf3611397565b8786866040518563ffffffff1660e01b8152600401611d159493929190613724565b6020604051808303815f875af1925050508015611d5057506040513d601f19601f82011682018060405250810190611d4d9190613782565b60015b611dc6573d805f8114611d7e576040519150601f19603f3d011682016040523d82523d5f602084013e611d83565b606091505b505f815103611dbe576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054611e2890612f3e565b80601f0160208091040260200160405190810160405280929190818152602001828054611e5490612f3e565b8015611e9f5780601f10611e7657610100808354040283529160200191611e9f565b820191905f5260205f20905b815481529060010190602001808311611e8257829003601f168201915b5050505050905090565b60605f8203611eef576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611ffd565b5f8290505f5b5f8214611f1e578080611f07906132cc565b915050600a82611f1791906137da565b9150611ef5565b5f8167ffffffffffffffff811115611f3957611f38612976565b5b6040519080825280601f01601f191660200182016040528015611f6b5781602001600182028036833780820191505090505b5090505b5f8514611ff657600182611f83919061380a565b9150600a85611f92919061383d565b6030611f9e91906130ac565b60f81b818381518110611fb457611fb361329f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a85611fef91906137da565b9450611f6f565b8093505050505b919050565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b50505050565b50505050565b6120de8383836001612254565b505050565b5f810361211c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805490505f828261212e91906130ac565b9050817f000000000000000000000000000000000000000000000000000000000000000061215c919061386d565b60045f805481526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b81806001019250827f00000000000000000000000000000000000000000000000000000000000000000173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082036121ae57825f8082825461224891906130ac565b92505081905550505050565b5f805490505f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036122be576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f84036122f7576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123035f8683876120c5565b8360055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508360055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f0160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508460045f8381526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504260045f8381526020019081526020015f205f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f8190505f85820190508380156124bd57506124bc8773ffffffffffffffffffffffffffffffffffffffff16611cac565b5b1561257e575b818773ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125305f888480600101955088611cce565b612566576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082036124c357825f5414612579575f80fd5b6125e8565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480820361257f575b815f8190555050506125fc5f8683876120cb565b5050505050565b60405180606001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581525090565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61268881612654565b8114612692575f80fd5b50565b5f813590506126a38161267f565b92915050565b5f602082840312156126be576126bd61264c565b5b5f6126cb84828501612695565b91505092915050565b5f8115159050919050565b6126e8816126d4565b82525050565b5f6020820190506127015f8301846126df565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561273e578082015181840152602081019050612723565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61276382612707565b61276d8185612711565b935061277d818560208601612721565b61278681612749565b840191505092915050565b5f6020820190508181035f8301526127a98184612759565b905092915050565b5f819050919050565b6127c3816127b1565b81146127cd575f80fd5b50565b5f813590506127de816127ba565b92915050565b5f602082840312156127f9576127f861264c565b5b5f612806848285016127d0565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6128388261280f565b9050919050565b6128488161282e565b82525050565b5f6020820190506128615f83018461283f565b92915050565b6128708161282e565b811461287a575f80fd5b50565b5f8135905061288b81612867565b92915050565b5f80604083850312156128a7576128a661264c565b5b5f6128b48582860161287d565b92505060206128c5858286016127d0565b9150509250929050565b6128d8816127b1565b82525050565b5f6020820190506128f15f8301846128cf565b92915050565b5f805f6060848603121561290e5761290d61264c565b5b5f61291b8682870161287d565b935050602061292c8682870161287d565b925050604061293d868287016127d0565b9150509250925092565b5f6020828403121561295c5761295b61264c565b5b5f6129698482850161287d565b91505092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6129ac82612749565b810181811067ffffffffffffffff821117156129cb576129ca612976565b5b80604052505050565b5f6129dd612643565b90506129e982826129a3565b919050565b5f67ffffffffffffffff821115612a0857612a07612976565b5b602082029050602081019050919050565b5f80fd5b5f612a2f612a2a846129ee565b6129d4565b90508083825260208201905060208402830185811115612a5257612a51612a19565b5b835b81811015612a7b5780612a67888261287d565b845260208401935050602081019050612a54565b5050509392505050565b5f82601f830112612a9957612a98612972565b5b8135612aa9848260208601612a1d565b91505092915050565b5f67ffffffffffffffff821115612acc57612acb612976565b5b602082029050602081019050919050565b5f61ffff82169050919050565b612af381612add565b8114612afd575f80fd5b50565b5f81359050612b0e81612aea565b92915050565b5f612b26612b2184612ab2565b6129d4565b90508083825260208201905060208402830185811115612b4957612b48612a19565b5b835b81811015612b725780612b5e8882612b00565b845260208401935050602081019050612b4b565b5050509392505050565b5f82601f830112612b9057612b8f612972565b5b8135612ba0848260208601612b14565b91505092915050565b5f8060408385031215612bbf57612bbe61264c565b5b5f83013567ffffffffffffffff811115612bdc57612bdb612650565b5b612be885828601612a85565b925050602083013567ffffffffffffffff811115612c0957612c08612650565b5b612c1585828601612b7c565b9150509250929050565b5f80fd5b5f67ffffffffffffffff821115612c3d57612c3c612976565b5b612c4682612749565b9050602081019050919050565b828183375f83830152505050565b5f612c73612c6e84612c23565b6129d4565b905082815260208101848484011115612c8f57612c8e612c1f565b5b612c9a848285612c53565b509392505050565b5f82601f830112612cb657612cb5612972565b5b8135612cc6848260208601612c61565b91505092915050565b5f60208284031215612ce457612ce361264c565b5b5f82013567ffffffffffffffff811115612d0157612d00612650565b5b612d0d84828501612ca2565b91505092915050565b612d1f816126d4565b8114612d29575f80fd5b50565b5f81359050612d3a81612d16565b92915050565b5f8060408385031215612d5657612d5561264c565b5b5f612d638582860161287d565b9250506020612d7485828601612d2c565b9150509250929050565b5f67ffffffffffffffff821115612d9857612d97612976565b5b612da182612749565b9050602081019050919050565b5f612dc0612dbb84612d7e565b6129d4565b905082815260208101848484011115612ddc57612ddb612c1f565b5b612de7848285612c53565b509392505050565b5f82601f830112612e0357612e02612972565b5b8135612e13848260208601612dae565b91505092915050565b5f805f8060808587031215612e3457612e3361264c565b5b5f612e418782880161287d565b9450506020612e528782880161287d565b9350506040612e63878288016127d0565b925050606085013567ffffffffffffffff811115612e8457612e83612650565b5b612e9087828801612def565b91505092959194509250565b5f63ffffffff82169050919050565b612eb481612e9c565b82525050565b5f602082019050612ecd5f830184612eab565b92915050565b5f8060408385031215612ee957612ee861264c565b5b5f612ef68582860161287d565b9250506020612f078582860161287d565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680612f5557607f821691505b602082108103612f6857612f67612f11565b5b50919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e747261637400005f82015250565b5f612fa2601e83612711565b9150612fad82612f6e565b602082019050919050565b5f6020820190508181035f830152612fcf81612f96565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61300d826127b1565b9150613018836127b1565b9250828202613026816127b1565b9150828204841483151761303d5761303c612fd6565b5b5092915050565b7f696e73756666696369656e7400000000000000000000000000000000000000005f82015250565b5f613078600c83612711565b915061308382613044565b602082019050919050565b5f6020820190508181035f8301526130a58161306c565b9050919050565b5f6130b6826127b1565b91506130c1836127b1565b92508282019050808211156130d9576130d8612fd6565b5b92915050565b7f736f6c64206f75740000000000000000000000000000000000000000000000005f82015250565b5f613113600883612711565b915061311e826130df565b602082019050919050565b5f6020820190508181035f83015261314081613107565b9050919050565b5f81905092915050565b50565b5f61315f5f83613147565b915061316a82613151565b5f82019050919050565b5f61317e82613154565b9150819050919050565b7f5472616e73616374696f6e20556e7375636365737366756c00000000000000005f82015250565b5f6131bc601883612711565b91506131c782613188565b602082019050919050565b5f6020820190508181035f8301526131e9816131b0565b9050919050565b5f6131fa8261280f565b91506132058361280f565b9250828203905073ffffffffffffffffffffffffffffffffffffffff81111561323157613230612fd6565b5b92915050565b7f4c656e677468206e6f74206d61746368000000000000000000000000000000005f82015250565b5f61326b601083612711565b915061327682613237565b602082019050919050565b5f6020820190508181035f8301526132988161325f565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6132d6826127b1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361330857613307612fd6565b5b600182019050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261336f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613334565b6133798683613334565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6133b46133af6133aa846127b1565b613391565b6127b1565b9050919050565b5f819050919050565b6133cd8361339a565b6133e16133d9826133bb565b848454613340565b825550505050565b5f90565b6133f56133e9565b6134008184846133c4565b505050565b5b81811015613423576134185f826133ed565b600181019050613406565b5050565b601f8211156134685761343981613313565b61344284613325565b81016020851015613451578190505b61346561345d85613325565b830182613405565b50505b505050565b5f82821c905092915050565b5f6134885f198460080261346d565b1980831691505092915050565b5f6134a08383613479565b9150826002028217905092915050565b6134b982612707565b67ffffffffffffffff8111156134d2576134d1612976565b5b6134dc8254612f3e565b6134e7828285613427565b5f60209050601f831160018114613518575f8415613506578287015190505b6135108582613495565b865550613577565b601f19841661352686613313565b5f5b8281101561354d57848901518255600182019150602085019450602081019050613528565b8683101561356a5784890151613566601f891682613479565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f61359382612707565b61359d818561357f565b93506135ad818560208601612721565b80840191505092915050565b5f6135c48285613589565b91506135d08284613589565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f613636602683612711565b9150613641826135dc565b604082019050919050565b5f6020820190508181035f8301526136638161362a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f61369e602083612711565b91506136a98261366a565b602082019050919050565b5f6020820190508181035f8301526136cb81613692565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f6136f6826136d2565b61370081856136dc565b9350613710818560208601612721565b61371981612749565b840191505092915050565b5f6080820190506137375f83018761283f565b613744602083018661283f565b61375160408301856128cf565b818103606083015261376381846136ec565b905095945050505050565b5f8151905061377c8161267f565b92915050565b5f602082840312156137975761379661264c565b5b5f6137a48482850161376e565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6137e4826127b1565b91506137ef836127b1565b9250826137ff576137fe6137ad565b5b828204905092915050565b5f613814826127b1565b915061381f836127b1565b925082820390508181111561383757613836612fd6565b5b92915050565b5f613847826127b1565b9150613852836127b1565b925082613862576138616137ad565b5b828206905092915050565b5f6138778261280f565b91506138828361280f565b9250828201905073ffffffffffffffffffffffffffffffffffffffff8111156138ae576138ad612fd6565b5b9291505056fea26469706673582212203751780b2d2e6f0f5f70d48f817fada71ba6ca08226f0ac2fb40267d250645a864736f6c63430008140033697066733a2f2f626166796265696234336970347179337164616e65627234666d73746c3437726c743678776965656c6b3636717a64627266706d7a7a6d7a7766612f

Deployed Bytecode

0x608060405260043610610165575f3560e01c80636817c76c116100d0578063a22cb46511610089578063d5abeb0111610063578063d5abeb0114610503578063e985e9c51461052d578063f2fde38b14610569578063f968adbe1461059157610165565b8063a22cb46514610477578063b88d4fde1461049f578063c87b56dd146104c757610165565b80636817c76c1461036d57806370a08231146103975780638a886986146103d35780638da5cb5b146103fb57806395d89b41146104255780639b642de11461044f57610165565b80632db11544116101225780632db11544146102855780633ccfd60b146102a157806342842e0e146102b75780635fd22840146102df57806362b99ad4146103075780636352211e1461033157610165565b806301ffc9a71461016957806306fdde03146101a5578063081812fc146101cf578063095ea7b31461020b57806318160ddd1461023357806323b872dd1461025d575b5f80fd5b348015610174575f80fd5b5061018f600480360381019061018a91906126a9565b6105bb565b60405161019c91906126ee565b60405180910390f35b3480156101b0575f80fd5b506101b961069c565b6040516101c69190612791565b60405180910390f35b3480156101da575f80fd5b506101f560048036038101906101f091906127e4565b61072c565b604051610202919061284e565b60405180910390f35b348015610216575f80fd5b50610231600480360381019061022c9190612891565b6107a4565b005b34801561023e575f80fd5b506102476108ad565b60405161025491906128de565b60405180910390f35b348015610268575f80fd5b50610283600480360381019061027e91906128f7565b6108c2565b005b61029f600480360381019061029a91906127e4565b6108d2565b005b3480156102ac575f80fd5b506102b5610a36565b005b3480156102c2575f80fd5b506102dd60048036038101906102d891906128f7565b610af5565b005b3480156102ea575f80fd5b50610305600480360381019061030091906127e4565b610b14565b005b348015610312575f80fd5b5061031b610b28565b6040516103289190612791565b60405180910390f35b34801561033c575f80fd5b50610357600480360381019061035291906127e4565b610bb4565b604051610364919061284e565b60405180910390f35b348015610378575f80fd5b50610381610bc8565b60405161038e91906128de565b60405180910390f35b3480156103a2575f80fd5b506103bd60048036038101906103b89190612947565b610bec565b6040516103ca91906128de565b60405180910390f35b3480156103de575f80fd5b506103f960048036038101906103f49190612ba9565b610d74565b005b348015610406575f80fd5b5061040f610e31565b60405161041c919061284e565b60405180910390f35b348015610430575f80fd5b50610439610e59565b6040516104469190612791565b60405180910390f35b34801561045a575f80fd5b5061047560048036038101906104709190612ccf565b610ee9565b005b348015610482575f80fd5b5061049d60048036038101906104989190612d40565b610f04565b005b3480156104aa575f80fd5b506104c560048036038101906104c09190612e1c565b611076565b005b3480156104d2575f80fd5b506104ed60048036038101906104e891906127e4565b6110f2565b6040516104fa9190612791565b60405180910390f35b34801561050e575f80fd5b5061051761118d565b6040516105249190612eba565b60405180910390f35b348015610538575f80fd5b50610553600480360381019061054e9190612ed3565b6111b1565b60405161056091906126ee565b60405180910390f35b348015610574575f80fd5b5061058f600480360381019061058a9190612947565b61123f565b005b34801561059c575f80fd5b506105a56112c1565b6040516105b29190612eba565b60405180910390f35b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061068557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106955750610694826112e5565b5b9050919050565b6060600280546106ab90612f3e565b80601f01602080910402602001604051908101604052809291908181526020018280546106d790612f3e565b80156107225780601f106106f957610100808354040283529160200191610722565b820191905f5260205f20905b81548152906001019060200180831161070557829003601f168201915b5050505050905090565b5f6107368261134e565b61076c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f6107ae82610bb4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610815576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610834611397565b73ffffffffffffffffffffffffffffffffffffffff161415801561086657506108648161085f611397565b6111b1565b155b1561089d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108a883838361139e565b505050565b5f6108b661144d565b6001545f540303905090565b6108cd838383611455565b505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610940576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093790612fb8565b60405180910390fd5b807f0000000000000000000000000000000000000000000000000018de76816d800061096c9190613003565b3410156109ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a59061308e565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000002bc63ffffffff16816109de6108ad565b6109e891906130ac565b1115610a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2090613129565b60405180910390fd5b610a33338261191e565b50565b610a3e61193b565b5f4790505f3390505f8173ffffffffffffffffffffffffffffffffffffffff1683604051610a6b90613174565b5f6040518083038185875af1925050503d805f8114610aa5576040519150601f19603f3d011682016040523d82523d5f602084013e610aaa565b606091505b50508091505080610af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae7906131d2565b60405180910390fd5b505050565b610b0f83838360405180602001604052805f815250611076565b505050565b610b1c61193b565b610b25816119b9565b50565b60098054610b3590612f3e565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6190612f3e565b8015610bac5780601f10610b8357610100808354040283529160200191610bac565b820191905f5260205f20905b815481529060010190602001808311610b8f57829003601f168201915b505050505081565b5f610bbe826119c5565b5f01519050919050565b7f0000000000000000000000000000000000000000000000000018de76816d800081565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c52576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1614610d195760055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff169050610d6f565b5f547f000000000000000000000000962228f791e745273700024d54e3f9897a3e819883610d4791906131f0565b73ffffffffffffffffffffffffffffffffffffffff1611610d6b5760019050610d6f565b5f90505b919050565b610d7c61193b565b5f8251118015610d8d575080518251145b610dcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc390613281565b60405180910390fd5b5f5b8251811015610e2c57610e19838281518110610ded57610dec61329f565b5b6020026020010151838381518110610e0857610e0761329f565b5b602002602001015161ffff1661191e565b8080610e24906132cc565b915050610dce565b505050565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610e6890612f3e565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9490612f3e565b8015610edf5780601f10610eb657610100808354040283529160200191610edf565b820191905f5260205f20905b815481529060010190602001808311610ec257829003601f168201915b5050505050905090565b610ef161193b565b8060099081610f0091906134b0565b5050565b610f0c611397565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f70576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060075f610f7c611397565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611025611397565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161106a91906126ee565b60405180910390a35050565b611081848484611455565b6110a08373ffffffffffffffffffffffffffffffffffffffff16611cac565b80156110b557506110b384848484611cce565b155b156110ec576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60606110fd8261134e565b611133576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61113c611e19565b90505f81510361115a5760405180602001604052805f815250611185565b8061116484611ea9565b6040516020016111759291906135b9565b6040516020818303038152906040525b915050919050565b7f00000000000000000000000000000000000000000000000000000000000002bc81565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b61124761193b565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036112b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ac9061364c565b60405180910390fd5b6112be81612002565b50565b7f000000000000000000000000000000000000000000000000000000000000000a81565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f8161135861144d565b1115801561136657505f5482105b8015611390575060045f8381526020019081526020015f205f01601c9054906101000a900460ff16155b9050919050565b5f33905090565b8260065f8481526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b5f6001905090565b5f61145f826119c5565b90505f815f015173ffffffffffffffffffffffffffffffffffffffff16611484611397565b73ffffffffffffffffffffffffffffffffffffffff1614806114b657506114b5825f01516114b0611397565b6111b1565b5b806114fb57506114c4611397565b73ffffffffffffffffffffffffffffffffffffffff166114e38461072c565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611534576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16825f015173ffffffffffffffffffffffffffffffffffffffff161461159c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611601576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61160e85858560016120c5565b61161c5f84845f015161139e565b600160055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600160055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508360045f8581526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504260045f8581526020019081526020015f205f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f6001840190505f73ffffffffffffffffffffffffffffffffffffffff1660045f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036118ae575f548110156118ad57825f015160045f8381526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550826020015160045f8381526020019081526020015f205f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461191785858560016120cb565b5050505050565b611937828260405180602001604052805f8152506120d1565b5050565b611943611397565b73ffffffffffffffffffffffffffffffffffffffff16611961610e31565b73ffffffffffffffffffffffffffffffffffffffff16146119b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ae906136b4565b60405180910390fd5b565b6119c2816120e3565b50565b6119cd612603565b5f829050806119da61144d565b111580156119e857505f5481105b15611c75575f60045f8381526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201601c9054906101000a900460ff16151515158152505090508060400151611c73575f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff1614611af4578092505050611ca7565b5f600990505b82806001900393505060045f8481526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201601c9054906101000a900460ff16151515158152505091505f73ffffffffffffffffffffffffffffffffffffffff16825f015173ffffffffffffffffffffffffffffffffffffffff1614611c0157819350505050611ca7565b5f816001900391508111611afa57847f000000000000000000000000962228f791e745273700024d54e3f9897a3e819801825f019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050819350505050611ca7565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f8373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611cf3611397565b8786866040518563ffffffff1660e01b8152600401611d159493929190613724565b6020604051808303815f875af1925050508015611d5057506040513d601f19601f82011682018060405250810190611d4d9190613782565b60015b611dc6573d805f8114611d7e576040519150601f19603f3d011682016040523d82523d5f602084013e611d83565b606091505b505f815103611dbe576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054611e2890612f3e565b80601f0160208091040260200160405190810160405280929190818152602001828054611e5490612f3e565b8015611e9f5780601f10611e7657610100808354040283529160200191611e9f565b820191905f5260205f20905b815481529060010190602001808311611e8257829003601f168201915b5050505050905090565b60605f8203611eef576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611ffd565b5f8290505f5b5f8214611f1e578080611f07906132cc565b915050600a82611f1791906137da565b9150611ef5565b5f8167ffffffffffffffff811115611f3957611f38612976565b5b6040519080825280601f01601f191660200182016040528015611f6b5781602001600182028036833780820191505090505b5090505b5f8514611ff657600182611f83919061380a565b9150600a85611f92919061383d565b6030611f9e91906130ac565b60f81b818381518110611fb457611fb361329f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a85611fef91906137da565b9450611f6f565b8093505050505b919050565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b50505050565b50505050565b6120de8383836001612254565b505050565b5f810361211c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805490505f828261212e91906130ac565b9050817f000000000000000000000000962228f791e745273700024d54e3f9897a3e819861215c919061386d565b60045f805481526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b81806001019250827f000000000000000000000000962228f791e745273700024d54e3f9897a3e81980173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082036121ae57825f8082825461224891906130ac565b92505081905550505050565b5f805490505f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036122be576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f84036122f7576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123035f8683876120c5565b8360055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508360055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f0160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508460045f8381526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504260045f8381526020019081526020015f205f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f8190505f85820190508380156124bd57506124bc8773ffffffffffffffffffffffffffffffffffffffff16611cac565b5b1561257e575b818773ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125305f888480600101955088611cce565b612566576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082036124c357825f5414612579575f80fd5b6125e8565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480820361257f575b815f8190555050506125fc5f8683876120cb565b5050505050565b60405180606001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581525090565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61268881612654565b8114612692575f80fd5b50565b5f813590506126a38161267f565b92915050565b5f602082840312156126be576126bd61264c565b5b5f6126cb84828501612695565b91505092915050565b5f8115159050919050565b6126e8816126d4565b82525050565b5f6020820190506127015f8301846126df565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561273e578082015181840152602081019050612723565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61276382612707565b61276d8185612711565b935061277d818560208601612721565b61278681612749565b840191505092915050565b5f6020820190508181035f8301526127a98184612759565b905092915050565b5f819050919050565b6127c3816127b1565b81146127cd575f80fd5b50565b5f813590506127de816127ba565b92915050565b5f602082840312156127f9576127f861264c565b5b5f612806848285016127d0565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6128388261280f565b9050919050565b6128488161282e565b82525050565b5f6020820190506128615f83018461283f565b92915050565b6128708161282e565b811461287a575f80fd5b50565b5f8135905061288b81612867565b92915050565b5f80604083850312156128a7576128a661264c565b5b5f6128b48582860161287d565b92505060206128c5858286016127d0565b9150509250929050565b6128d8816127b1565b82525050565b5f6020820190506128f15f8301846128cf565b92915050565b5f805f6060848603121561290e5761290d61264c565b5b5f61291b8682870161287d565b935050602061292c8682870161287d565b925050604061293d868287016127d0565b9150509250925092565b5f6020828403121561295c5761295b61264c565b5b5f6129698482850161287d565b91505092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6129ac82612749565b810181811067ffffffffffffffff821117156129cb576129ca612976565b5b80604052505050565b5f6129dd612643565b90506129e982826129a3565b919050565b5f67ffffffffffffffff821115612a0857612a07612976565b5b602082029050602081019050919050565b5f80fd5b5f612a2f612a2a846129ee565b6129d4565b90508083825260208201905060208402830185811115612a5257612a51612a19565b5b835b81811015612a7b5780612a67888261287d565b845260208401935050602081019050612a54565b5050509392505050565b5f82601f830112612a9957612a98612972565b5b8135612aa9848260208601612a1d565b91505092915050565b5f67ffffffffffffffff821115612acc57612acb612976565b5b602082029050602081019050919050565b5f61ffff82169050919050565b612af381612add565b8114612afd575f80fd5b50565b5f81359050612b0e81612aea565b92915050565b5f612b26612b2184612ab2565b6129d4565b90508083825260208201905060208402830185811115612b4957612b48612a19565b5b835b81811015612b725780612b5e8882612b00565b845260208401935050602081019050612b4b565b5050509392505050565b5f82601f830112612b9057612b8f612972565b5b8135612ba0848260208601612b14565b91505092915050565b5f8060408385031215612bbf57612bbe61264c565b5b5f83013567ffffffffffffffff811115612bdc57612bdb612650565b5b612be885828601612a85565b925050602083013567ffffffffffffffff811115612c0957612c08612650565b5b612c1585828601612b7c565b9150509250929050565b5f80fd5b5f67ffffffffffffffff821115612c3d57612c3c612976565b5b612c4682612749565b9050602081019050919050565b828183375f83830152505050565b5f612c73612c6e84612c23565b6129d4565b905082815260208101848484011115612c8f57612c8e612c1f565b5b612c9a848285612c53565b509392505050565b5f82601f830112612cb657612cb5612972565b5b8135612cc6848260208601612c61565b91505092915050565b5f60208284031215612ce457612ce361264c565b5b5f82013567ffffffffffffffff811115612d0157612d00612650565b5b612d0d84828501612ca2565b91505092915050565b612d1f816126d4565b8114612d29575f80fd5b50565b5f81359050612d3a81612d16565b92915050565b5f8060408385031215612d5657612d5561264c565b5b5f612d638582860161287d565b9250506020612d7485828601612d2c565b9150509250929050565b5f67ffffffffffffffff821115612d9857612d97612976565b5b612da182612749565b9050602081019050919050565b5f612dc0612dbb84612d7e565b6129d4565b905082815260208101848484011115612ddc57612ddb612c1f565b5b612de7848285612c53565b509392505050565b5f82601f830112612e0357612e02612972565b5b8135612e13848260208601612dae565b91505092915050565b5f805f8060808587031215612e3457612e3361264c565b5b5f612e418782880161287d565b9450506020612e528782880161287d565b9350506040612e63878288016127d0565b925050606085013567ffffffffffffffff811115612e8457612e83612650565b5b612e9087828801612def565b91505092959194509250565b5f63ffffffff82169050919050565b612eb481612e9c565b82525050565b5f602082019050612ecd5f830184612eab565b92915050565b5f8060408385031215612ee957612ee861264c565b5b5f612ef68582860161287d565b9250506020612f078582860161287d565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680612f5557607f821691505b602082108103612f6857612f67612f11565b5b50919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e747261637400005f82015250565b5f612fa2601e83612711565b9150612fad82612f6e565b602082019050919050565b5f6020820190508181035f830152612fcf81612f96565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61300d826127b1565b9150613018836127b1565b9250828202613026816127b1565b9150828204841483151761303d5761303c612fd6565b5b5092915050565b7f696e73756666696369656e7400000000000000000000000000000000000000005f82015250565b5f613078600c83612711565b915061308382613044565b602082019050919050565b5f6020820190508181035f8301526130a58161306c565b9050919050565b5f6130b6826127b1565b91506130c1836127b1565b92508282019050808211156130d9576130d8612fd6565b5b92915050565b7f736f6c64206f75740000000000000000000000000000000000000000000000005f82015250565b5f613113600883612711565b915061311e826130df565b602082019050919050565b5f6020820190508181035f83015261314081613107565b9050919050565b5f81905092915050565b50565b5f61315f5f83613147565b915061316a82613151565b5f82019050919050565b5f61317e82613154565b9150819050919050565b7f5472616e73616374696f6e20556e7375636365737366756c00000000000000005f82015250565b5f6131bc601883612711565b91506131c782613188565b602082019050919050565b5f6020820190508181035f8301526131e9816131b0565b9050919050565b5f6131fa8261280f565b91506132058361280f565b9250828203905073ffffffffffffffffffffffffffffffffffffffff81111561323157613230612fd6565b5b92915050565b7f4c656e677468206e6f74206d61746368000000000000000000000000000000005f82015250565b5f61326b601083612711565b915061327682613237565b602082019050919050565b5f6020820190508181035f8301526132988161325f565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6132d6826127b1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361330857613307612fd6565b5b600182019050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261336f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613334565b6133798683613334565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6133b46133af6133aa846127b1565b613391565b6127b1565b9050919050565b5f819050919050565b6133cd8361339a565b6133e16133d9826133bb565b848454613340565b825550505050565b5f90565b6133f56133e9565b6134008184846133c4565b505050565b5b81811015613423576134185f826133ed565b600181019050613406565b5050565b601f8211156134685761343981613313565b61344284613325565b81016020851015613451578190505b61346561345d85613325565b830182613405565b50505b505050565b5f82821c905092915050565b5f6134885f198460080261346d565b1980831691505092915050565b5f6134a08383613479565b9150826002028217905092915050565b6134b982612707565b67ffffffffffffffff8111156134d2576134d1612976565b5b6134dc8254612f3e565b6134e7828285613427565b5f60209050601f831160018114613518575f8415613506578287015190505b6135108582613495565b865550613577565b601f19841661352686613313565b5f5b8281101561354d57848901518255600182019150602085019450602081019050613528565b8683101561356a5784890151613566601f891682613479565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f61359382612707565b61359d818561357f565b93506135ad818560208601612721565b80840191505092915050565b5f6135c48285613589565b91506135d08284613589565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f613636602683612711565b9150613641826135dc565b604082019050919050565b5f6020820190508181035f8301526136638161362a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f61369e602083612711565b91506136a98261366a565b602082019050919050565b5f6020820190508181035f8301526136cb81613692565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f6136f6826136d2565b61370081856136dc565b9350613710818560208601612721565b61371981612749565b840191505092915050565b5f6080820190506137375f83018761283f565b613744602083018661283f565b61375160408301856128cf565b818103606083015261376381846136ec565b905095945050505050565b5f8151905061377c8161267f565b92915050565b5f602082840312156137975761379661264c565b5b5f6137a48482850161376e565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6137e4826127b1565b91506137ef836127b1565b9250826137ff576137fe6137ad565b5b828204905092915050565b5f613814826127b1565b915061381f836127b1565b925082820390508181111561383757613836612fd6565b5b92915050565b5f613847826127b1565b9150613852836127b1565b925082613862576138616137ad565b5b828206905092915050565b5f6138778261280f565b91506138828361280f565b9250828201905073ffffffffffffffffffffffffffffffffffffffff8111156138ae576138ad612fd6565b5b9291505056fea26469706673582212203751780b2d2e6f0f5f70d48f817fada71ba6ca08226f0ac2fb40267d250645a864736f6c63430008140033

Deployed Bytecode Sourcemap

48479:1779:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28411:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32252:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33755:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33318:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27660:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34612:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49298:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49973:278;;;;;;;;;;;;;:::i;:::-;;34853:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49545:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48522:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32061:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48627:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28782:395;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49668:297;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4598:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32421:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49086:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34031:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35109:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32596:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48682:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34381:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5050:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48728:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28411:305;28513:4;28565:25;28550:40;;;:11;:40;;;;:105;;;;28622:33;28607:48;;;:11;:48;;;;28550:105;:158;;;;28672:36;28696:11;28672:23;:36::i;:::-;28550:158;28530:178;;28411:305;;;:::o;32252:100::-;32306:13;32339:5;32332:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32252:100;:::o;33755:204::-;33823:7;33848:16;33856:7;33848;:16::i;:::-;33843:64;;33873:34;;;;;;;;;;;;;;33843:64;33927:15;:24;33943:7;33927:24;;;;;;;;;;;;;;;;;;;;;33920:31;;33755:204;;;:::o;33318:371::-;33391:13;33407:24;33423:7;33407:15;:24::i;:::-;33391:40;;33452:5;33446:11;;:2;:11;;;33442:48;;33466:24;;;;;;;;;;;;;;33442:48;33523:5;33507:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;33533:37;33550:5;33557:12;:10;:12::i;:::-;33533:16;:37::i;:::-;33532:38;33507:63;33503:138;;;33594:35;;;;;;;;;;;;;;33503:138;33653:28;33662:2;33666:7;33675:5;33653:8;:28::i;:::-;33380:309;33318:371;;:::o;27660:303::-;27704:7;27929:15;:13;:15::i;:::-;27914:12;;27898:13;;:28;:46;27891:53;;27660:303;:::o;34612:170::-;34746:28;34756:4;34762:2;34766:7;34746:9;:28::i;:::-;34612:170;;;:::o;49298:239::-;48830:10;48817:23;;:9;:23;;;48809:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;49405:6:::1;49393:9;:18;;;;:::i;:::-;49380:9;:31;;49372:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;49466:9;49440:35;;49456:6;49440:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;49432:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;49500:29;49510:10;49522:6;49500:9;:29::i;:::-;49298:239:::0;:::o;49973:278::-;4484:13;:11;:13::i;:::-;50021:18:::1;50042:21;50021:42;;50076:9;50096:10;50076:31;;50120:12;50159:1;:6;;50173:10;50159:29;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50145:43;;;;;50207:7;50199:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;50010:241;;;49973:278::o:0;34853:185::-;34991:39;35008:4;35014:2;35018:7;34991:39;;;;;;;;;;;;:16;:39::i;:::-;34853:185;;;:::o;49545:95::-;4484:13;:11;:13::i;:::-;49618:14:::1;49625:6;49618;:14::i;:::-;49545:95:::0;:::o;48522:96::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32061:124::-;32125:7;32152:20;32164:7;32152:11;:20::i;:::-;:25;;;32145:32;;32061:124;;;:::o;48627:48::-;;;:::o;28782:395::-;28846:7;28887:1;28870:19;;:5;:19;;;28866:60;;28898:28;;;;;;;;;;;;;;28866:60;28974:1;28943:12;:19;28956:5;28943:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;:32;;;28939:108;;29007:12;:19;29020:5;29007:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;28999:36;;28992:43;;;;28939:108;29099:13;;29088:6;29071:5;29063:32;;;;:::i;:::-;:49;;;29059:90;;29136:1;29129:8;;;;29059:90;29168:1;29161:8;;28782:395;;;;:::o;49668:297::-;4484:13;:11;:13::i;:::-;49790:1:::1;49772:8;:15;:19;:53;;;;;49814:4;:11;49795:8;:15;:30;49772:53;49764:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;49862:6;49857:101;49878:8;:15;49874:1;:19;49857:101;;;49915:31;49925:8;49934:1;49925:11;;;;;;;;:::i;:::-;;;;;;;;49938:4;49943:1;49938:7;;;;;;;;:::i;:::-;;;;;;;;49915:31;;:9;:31::i;:::-;49895:3;;;;;:::i;:::-;;;;49857:101;;;;49668:297:::0;;:::o;4598:87::-;4644:7;4671:6;;;;;;;;;;;4664:13;;4598:87;:::o;32421:104::-;32477:13;32510:7;32503:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32421:104;:::o;49086:86::-;4484:13;:11;:13::i;:::-;49161:3:::1;49149:9;:15;;;;;;:::i;:::-;;49086:86:::0;:::o;34031:279::-;34134:12;:10;:12::i;:::-;34122:24;;:8;:24;;;34118:54;;34155:17;;;;;;;;;;;;;;34118:54;34230:8;34185:18;:32;34204:12;:10;:12::i;:::-;34185:32;;;;;;;;;;;;;;;:42;34218:8;34185:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;34283:8;34254:48;;34269:12;:10;:12::i;:::-;34254:48;;;34293:8;34254:48;;;;;;:::i;:::-;;;;;;;;34031:279;;:::o;35109:369::-;35276:28;35286:4;35292:2;35296:7;35276:9;:28::i;:::-;35319:15;:2;:13;;;:15::i;:::-;:76;;;;;35339:56;35370:4;35376:2;35380:7;35389:5;35339:30;:56::i;:::-;35338:57;35319:76;35315:156;;;35419:40;;;;;;;;;;;;;;35315:156;35109:369;;;;:::o;32596:318::-;32669:13;32700:16;32708:7;32700;:16::i;:::-;32695:59;;32725:29;;;;;;;;;;;;;;32695:59;32767:21;32791:10;:8;:10::i;:::-;32767:34;;32844:1;32825:7;32819:21;:26;:87;;;;;;;;;;;;;;;;;32872:7;32881:18;:7;:16;:18::i;:::-;32855:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32819:87;32812:94;;;32596:318;;;:::o;48682:39::-;;;:::o;34381:164::-;34478:4;34502:18;:25;34521:5;34502:25;;;;;;;;;;;;;;;:35;34528:8;34502:35;;;;;;;;;;;;;;;;;;;;;;;;;34495:42;;34381:164;;;;:::o;5050:201::-;4484:13;:11;:13::i;:::-;5159:1:::1;5139:22;;:8;:22;;::::0;5131:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;5215:28;5234:8;5215:18;:28::i;:::-;5050:201:::0;:::o;48728:37::-;;;:::o;16998:157::-;17083:4;17122:25;17107:40;;;:11;:40;;;;17100:47;;16998:157;;;:::o;35733:187::-;35790:4;35833:7;35814:15;:13;:15::i;:::-;:26;;:53;;;;;35854:13;;35844:7;:23;35814:53;:98;;;;;35885:11;:20;35897:7;35885:20;;;;;;;;;;;:27;;;;;;;;;;;;35884:28;35814:98;35807:105;;35733:187;;;:::o;3149:98::-;3202:7;3229:10;3222:17;;3149:98;:::o;45463:196::-;45605:2;45578:15;:24;45594:7;45578:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;45643:7;45639:2;45623:28;;45632:5;45623:28;;;;;;;;;;;;45463:196;;;:::o;49180:110::-;49254:7;49281:1;49274:8;;49180:110;:::o;40965:2112::-;41080:35;41118:20;41130:7;41118:11;:20::i;:::-;41080:58;;41151:22;41193:13;:18;;;41177:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;41228:50;41245:13;:18;;;41265:12;:10;:12::i;:::-;41228:16;:50::i;:::-;41177:101;:154;;;;41319:12;:10;:12::i;:::-;41295:36;;:20;41307:7;41295:11;:20::i;:::-;:36;;;41177:154;41151:181;;41350:17;41345:66;;41376:35;;;;;;;;;;;;;;41345:66;41448:4;41426:26;;:13;:18;;;:26;;;41422:67;;41461:28;;;;;;;;;;;;;;41422:67;41518:1;41504:16;;:2;:16;;;41500:52;;41529:23;;;;;;;;;;;;;;41500:52;41565:43;41587:4;41593:2;41597:7;41606:1;41565:21;:43::i;:::-;41673:49;41690:1;41694:7;41703:13;:18;;;41673:8;:49::i;:::-;42048:1;42018:12;:18;42031:4;42018:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42092:1;42064:12;:16;42077:2;42064:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42138:2;42110:11;:20;42122:7;42110:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;42200:15;42155:11;:20;42167:7;42155:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;42468:19;42500:1;42490:7;:11;42468:33;;42561:1;42520:43;;:11;:24;42532:11;42520:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;42516:445;;42745:13;;42731:11;:27;42727:219;;;42815:13;:18;;;42783:11;:24;42795:11;42783:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;42898:13;:28;;;42856:11;:24;42868:11;42856:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;42727:219;42516:445;41993:979;43008:7;43004:2;42989:27;;42998:4;42989:27;;;;;;;;;;;;43027:42;43048:4;43054:2;43058:7;43067:1;43027:20;:42::i;:::-;41069:2008;;40965:2112;;;:::o;35928:104::-;35997:27;36007:2;36011:8;35997:27;;;;;;;;;;;;:9;:27::i;:::-;35928:104;;:::o;4763:132::-;4838:12;:10;:12::i;:::-;4827:23;;:7;:5;:7::i;:::-;:23;;;4819:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4763:132::o;36566:113::-;36648:19;36658:8;36648:9;:19::i;:::-;36566:113;:::o;30712:1287::-;30773:21;;:::i;:::-;30807:12;30822:7;30807:22;;30890:4;30871:15;:13;:15::i;:::-;:23;;:47;;;;;30905:13;;30898:4;:20;30871:47;30867:1065;;;30939:31;30973:11;:17;30985:4;30973:17;;;;;;;;;;;30939:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31014:9;:16;;;31009:904;;31085:1;31059:28;;:9;:14;;;:28;;;31055:101;;31123:9;31116:16;;;;;;31055:101;31460:13;31476:1;31460:17;;31500:270;31529:6;;;;;;;;31574:11;:17;31586:4;31574:17;;;;;;;;;;;31562:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31648:1;31622:28;;:9;:14;;;:28;;;31618:109;;31690:9;31683:16;;;;;;;31618:109;31767:1;31757:7;;;;;;;:11;31500:270;;31845:7;31827:6;31819:34;31794:9;:14;;:60;;;;;;;;;;;31884:9;31877:16;;;;;;;31009:904;30920:1012;30867:1065;31960:31;;;;;;;;;;;;;;30712:1287;;;;:::o;6842:326::-;6902:4;7159:1;7137:7;:19;;;:23;7130:30;;6842:326;;;:::o;46151:667::-;46314:4;46351:2;46335:36;;;46372:12;:10;:12::i;:::-;46386:4;46392:7;46401:5;46335:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;46331:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46586:1;46569:6;:13;:18;46565:235;;46615:40;;;;;;;;;;;;;;46565:235;46758:6;46752:13;46743:6;46739:2;46735:15;46728:38;46331:480;46464:45;;;46454:55;;;:6;:55;;;;46447:62;;;46151:667;;;;;;:::o;48967:111::-;49028:13;49061:9;49054:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48967:111;:::o;403:723::-;459:13;689:1;680:5;:10;676:53;;707:10;;;;;;;;;;;;;;;;;;;;;676:53;739:12;754:5;739:20;;770:14;795:78;810:1;802:4;:9;795:78;;828:8;;;;;:::i;:::-;;;;859:2;851:10;;;;;:::i;:::-;;;795:78;;;883:19;915:6;905:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;883:39;;933:154;949:1;940:5;:10;933:154;;977:1;967:11;;;;;:::i;:::-;;;1044:2;1036:5;:10;;;;:::i;:::-;1023:2;:24;;;;:::i;:::-;1010:39;;993:6;1000;993:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1073:2;1064:11;;;;;:::i;:::-;;;933:154;;;1111:6;1097:21;;;;;403:723;;;;:::o;5411:191::-;5485:16;5504:6;;;;;;;;;;;5485:25;;5530:8;5521:6;;:17;;;;;;;;;;;;;;;;;;5585:8;5554:40;;5575:8;5554:40;;;;;;;;;;;;5474:128;5411:191;:::o;47466:159::-;;;;;:::o;48284:158::-;;;;;:::o;36395:163::-;36518:32;36524:2;36528:8;36538:5;36545:4;36518:5;:32::i;:::-;36395:163;;;:::o;40104:607::-;40205:1;40193:8;:13;40189:44;;40215:18;;;;;;;;;;;;;;40189:44;40250:20;40273:13;;40250:36;;40301:11;40330:8;40315:12;:23;;;;:::i;:::-;40301:37;;40421:12;40403:6;40395:39;;;;:::i;:::-;40353:11;:26;40365:13;;40353:26;;;;;;;;;;;:31;;;:82;;;;;;;;;;;;;;;;;;40481:166;40583:14;;;;;;40567:12;40549:6;40541:39;40512:86;;40529:1;40512:86;;;;;;;;;;;;40642:3;40626:12;:19;40481:166;;40693:8;40676:13;;:25;;;;;;;:::i;:::-;;;;;;;;40174:537;;40104:607;:::o;36939:1775::-;37078:20;37101:13;;37078:36;;37143:1;37129:16;;:2;:16;;;37125:48;;37154:19;;;;;;;;;;;;;;37125:48;37200:1;37188:8;:13;37184:44;;37210:18;;;;;;;;;;;;;;37184:44;37241:61;37271:1;37275:2;37279:12;37293:8;37241:21;:61::i;:::-;37614:8;37579:12;:16;37592:2;37579:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37678:8;37638:12;:16;37651:2;37638:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37737:2;37704:11;:25;37716:12;37704:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;37804:15;37754:11;:25;37766:12;37754:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;37837:20;37860:12;37837:35;;37887:11;37916:8;37901:12;:23;37887:37;;37945:4;:23;;;;;37953:15;:2;:13;;;:15::i;:::-;37945:23;37941:641;;;37989:314;38045:12;38041:2;38020:38;;38037:1;38020:38;;;;;;;;;;;;38086:69;38125:1;38129:2;38133:14;;;;;;38149:5;38086:30;:69::i;:::-;38081:174;;38191:40;;;;;;;;;;;;;;38081:174;38298:3;38282:12;:19;37989:314;;38384:12;38367:13;;:29;38363:43;;38398:8;;;38363:43;37941:641;;;38447:120;38503:14;;;;;;38499:2;38478:40;;38495:1;38478:40;;;;;;;;;;;;38562:3;38546:12;:19;38447:120;;37941:641;38612:12;38596:13;:28;;;;37554:1082;;38646:60;38675:1;38679:2;38683:12;38697:8;38646:20;:60::i;:::-;37067:1647;36939:1775;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:329::-;5926:6;5975:2;5963:9;5954:7;5950:23;5946:32;5943:119;;;5981:79;;:::i;:::-;5943:119;6101:1;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6072:117;5867:329;;;;:::o;6202:117::-;6311:1;6308;6301:12;6325:180;6373:77;6370:1;6363:88;6470:4;6467:1;6460:15;6494:4;6491:1;6484:15;6511:281;6594:27;6616:4;6594:27;:::i;:::-;6586:6;6582:40;6724:6;6712:10;6709:22;6688:18;6676:10;6673:34;6670:62;6667:88;;;6735:18;;:::i;:::-;6667:88;6775:10;6771:2;6764:22;6554:238;6511:281;;:::o;6798:129::-;6832:6;6859:20;;:::i;:::-;6849:30;;6888:33;6916:4;6908:6;6888:33;:::i;:::-;6798:129;;;:::o;6933:311::-;7010:4;7100:18;7092:6;7089:30;7086:56;;;7122:18;;:::i;:::-;7086:56;7172:4;7164:6;7160:17;7152:25;;7232:4;7226;7222:15;7214:23;;6933:311;;;:::o;7250:117::-;7359:1;7356;7349:12;7390:710;7486:5;7511:81;7527:64;7584:6;7527:64;:::i;:::-;7511:81;:::i;:::-;7502:90;;7612:5;7641:6;7634:5;7627:21;7675:4;7668:5;7664:16;7657:23;;7728:4;7720:6;7716:17;7708:6;7704:30;7757:3;7749:6;7746:15;7743:122;;;7776:79;;:::i;:::-;7743:122;7891:6;7874:220;7908:6;7903:3;7900:15;7874:220;;;7983:3;8012:37;8045:3;8033:10;8012:37;:::i;:::-;8007:3;8000:50;8079:4;8074:3;8070:14;8063:21;;7950:144;7934:4;7929:3;7925:14;7918:21;;7874:220;;;7878:21;7492:608;;7390:710;;;;;:::o;8123:370::-;8194:5;8243:3;8236:4;8228:6;8224:17;8220:27;8210:122;;8251:79;;:::i;:::-;8210:122;8368:6;8355:20;8393:94;8483:3;8475:6;8468:4;8460:6;8456:17;8393:94;:::i;:::-;8384:103;;8200:293;8123:370;;;;:::o;8499:310::-;8575:4;8665:18;8657:6;8654:30;8651:56;;;8687:18;;:::i;:::-;8651:56;8737:4;8729:6;8725:17;8717:25;;8797:4;8791;8787:15;8779:23;;8499:310;;;:::o;8815:89::-;8851:7;8891:6;8884:5;8880:18;8869:29;;8815:89;;;:::o;8910:120::-;8982:23;8999:5;8982:23;:::i;:::-;8975:5;8972:34;8962:62;;9020:1;9017;9010:12;8962:62;8910:120;:::o;9036:137::-;9081:5;9119:6;9106:20;9097:29;;9135:32;9161:5;9135:32;:::i;:::-;9036:137;;;;:::o;9195:707::-;9290:5;9315:80;9331:63;9387:6;9331:63;:::i;:::-;9315:80;:::i;:::-;9306:89;;9415:5;9444:6;9437:5;9430:21;9478:4;9471:5;9467:16;9460:23;;9531:4;9523:6;9519:17;9511:6;9507:30;9560:3;9552:6;9549:15;9546:122;;;9579:79;;:::i;:::-;9546:122;9694:6;9677:219;9711:6;9706:3;9703:15;9677:219;;;9786:3;9815:36;9847:3;9835:10;9815:36;:::i;:::-;9810:3;9803:49;9881:4;9876:3;9872:14;9865:21;;9753:143;9737:4;9732:3;9728:14;9721:21;;9677:219;;;9681:21;9296:606;;9195:707;;;;;:::o;9924:368::-;9994:5;10043:3;10036:4;10028:6;10024:17;10020:27;10010:122;;10051:79;;:::i;:::-;10010:122;10168:6;10155:20;10193:93;10282:3;10274:6;10267:4;10259:6;10255:17;10193:93;:::i;:::-;10184:102;;10000:292;9924:368;;;;:::o;10298:892::-;10415:6;10423;10472:2;10460:9;10451:7;10447:23;10443:32;10440:119;;;10478:79;;:::i;:::-;10440:119;10626:1;10615:9;10611:17;10598:31;10656:18;10648:6;10645:30;10642:117;;;10678:79;;:::i;:::-;10642:117;10783:78;10853:7;10844:6;10833:9;10829:22;10783:78;:::i;:::-;10773:88;;10569:302;10938:2;10927:9;10923:18;10910:32;10969:18;10961:6;10958:30;10955:117;;;10991:79;;:::i;:::-;10955:117;11096:77;11165:7;11156:6;11145:9;11141:22;11096:77;:::i;:::-;11086:87;;10881:302;10298:892;;;;;:::o;11196:117::-;11305:1;11302;11295:12;11319:308;11381:4;11471:18;11463:6;11460:30;11457:56;;;11493:18;;:::i;:::-;11457:56;11531:29;11553:6;11531:29;:::i;:::-;11523:37;;11615:4;11609;11605:15;11597:23;;11319:308;;;:::o;11633:146::-;11730:6;11725:3;11720;11707:30;11771:1;11762:6;11757:3;11753:16;11746:27;11633:146;;;:::o;11785:425::-;11863:5;11888:66;11904:49;11946:6;11904:49;:::i;:::-;11888:66;:::i;:::-;11879:75;;11977:6;11970:5;11963:21;12015:4;12008:5;12004:16;12053:3;12044:6;12039:3;12035:16;12032:25;12029:112;;;12060:79;;:::i;:::-;12029:112;12150:54;12197:6;12192:3;12187;12150:54;:::i;:::-;11869:341;11785:425;;;;;:::o;12230:340::-;12286:5;12335:3;12328:4;12320:6;12316:17;12312:27;12302:122;;12343:79;;:::i;:::-;12302:122;12460:6;12447:20;12485:79;12560:3;12552:6;12545:4;12537:6;12533:17;12485:79;:::i;:::-;12476:88;;12292:278;12230:340;;;;:::o;12576:509::-;12645:6;12694:2;12682:9;12673:7;12669:23;12665:32;12662:119;;;12700:79;;:::i;:::-;12662:119;12848:1;12837:9;12833:17;12820:31;12878:18;12870:6;12867:30;12864:117;;;12900:79;;:::i;:::-;12864:117;13005:63;13060:7;13051:6;13040:9;13036:22;13005:63;:::i;:::-;12995:73;;12791:287;12576:509;;;;:::o;13091:116::-;13161:21;13176:5;13161:21;:::i;:::-;13154:5;13151:32;13141:60;;13197:1;13194;13187:12;13141:60;13091:116;:::o;13213:133::-;13256:5;13294:6;13281:20;13272:29;;13310:30;13334:5;13310:30;:::i;:::-;13213:133;;;;:::o;13352:468::-;13417:6;13425;13474:2;13462:9;13453:7;13449:23;13445:32;13442:119;;;13480:79;;:::i;:::-;13442:119;13600:1;13625:53;13670:7;13661:6;13650:9;13646:22;13625:53;:::i;:::-;13615:63;;13571:117;13727:2;13753:50;13795:7;13786:6;13775:9;13771:22;13753:50;:::i;:::-;13743:60;;13698:115;13352:468;;;;;:::o;13826:307::-;13887:4;13977:18;13969:6;13966:30;13963:56;;;13999:18;;:::i;:::-;13963:56;14037:29;14059:6;14037:29;:::i;:::-;14029:37;;14121:4;14115;14111:15;14103:23;;13826:307;;;:::o;14139:423::-;14216:5;14241:65;14257:48;14298:6;14257:48;:::i;:::-;14241:65;:::i;:::-;14232:74;;14329:6;14322:5;14315:21;14367:4;14360:5;14356:16;14405:3;14396:6;14391:3;14387:16;14384:25;14381:112;;;14412:79;;:::i;:::-;14381:112;14502:54;14549:6;14544:3;14539;14502:54;:::i;:::-;14222:340;14139:423;;;;;:::o;14581:338::-;14636:5;14685:3;14678:4;14670:6;14666:17;14662:27;14652:122;;14693:79;;:::i;:::-;14652:122;14810:6;14797:20;14835:78;14909:3;14901:6;14894:4;14886:6;14882:17;14835:78;:::i;:::-;14826:87;;14642:277;14581:338;;;;:::o;14925:943::-;15020:6;15028;15036;15044;15093:3;15081:9;15072:7;15068:23;15064:33;15061:120;;;15100:79;;:::i;:::-;15061:120;15220:1;15245:53;15290:7;15281:6;15270:9;15266:22;15245:53;:::i;:::-;15235:63;;15191:117;15347:2;15373:53;15418:7;15409:6;15398:9;15394:22;15373:53;:::i;:::-;15363:63;;15318:118;15475:2;15501:53;15546:7;15537:6;15526:9;15522:22;15501:53;:::i;:::-;15491:63;;15446:118;15631:2;15620:9;15616:18;15603:32;15662:18;15654:6;15651:30;15648:117;;;15684:79;;:::i;:::-;15648:117;15789:62;15843:7;15834:6;15823:9;15819:22;15789:62;:::i;:::-;15779:72;;15574:287;14925:943;;;;;;;:::o;15874:93::-;15910:7;15950:10;15943:5;15939:22;15928:33;;15874:93;;;:::o;15973:115::-;16058:23;16075:5;16058:23;:::i;:::-;16053:3;16046:36;15973:115;;:::o;16094:218::-;16185:4;16223:2;16212:9;16208:18;16200:26;;16236:69;16302:1;16291:9;16287:17;16278:6;16236:69;:::i;:::-;16094:218;;;;:::o;16318:474::-;16386:6;16394;16443:2;16431:9;16422:7;16418:23;16414:32;16411:119;;;16449:79;;:::i;:::-;16411:119;16569:1;16594:53;16639:7;16630:6;16619:9;16615:22;16594:53;:::i;:::-;16584:63;;16540:117;16696:2;16722:53;16767:7;16758:6;16747:9;16743:22;16722:53;:::i;:::-;16712:63;;16667:118;16318:474;;;;;:::o;16798:180::-;16846:77;16843:1;16836:88;16943:4;16940:1;16933:15;16967:4;16964:1;16957:15;16984:320;17028:6;17065:1;17059:4;17055:12;17045:22;;17112:1;17106:4;17102:12;17133:18;17123:81;;17189:4;17181:6;17177:17;17167:27;;17123:81;17251:2;17243:6;17240:14;17220:18;17217:38;17214:84;;17270:18;;:::i;:::-;17214:84;17035:269;16984:320;;;:::o;17310:180::-;17450:32;17446:1;17438:6;17434:14;17427:56;17310:180;:::o;17496:366::-;17638:3;17659:67;17723:2;17718:3;17659:67;:::i;:::-;17652:74;;17735:93;17824:3;17735:93;:::i;:::-;17853:2;17848:3;17844:12;17837:19;;17496:366;;;:::o;17868:419::-;18034:4;18072:2;18061:9;18057:18;18049:26;;18121:9;18115:4;18111:20;18107:1;18096:9;18092:17;18085:47;18149:131;18275:4;18149:131;:::i;:::-;18141:139;;17868:419;;;:::o;18293:180::-;18341:77;18338:1;18331:88;18438:4;18435:1;18428:15;18462:4;18459:1;18452:15;18479:410;18519:7;18542:20;18560:1;18542:20;:::i;:::-;18537:25;;18576:20;18594:1;18576:20;:::i;:::-;18571:25;;18631:1;18628;18624:9;18653:30;18671:11;18653:30;:::i;:::-;18642:41;;18832:1;18823:7;18819:15;18816:1;18813:22;18793:1;18786:9;18766:83;18743:139;;18862:18;;:::i;:::-;18743:139;18527:362;18479:410;;;;:::o;18895:162::-;19035:14;19031:1;19023:6;19019:14;19012:38;18895:162;:::o;19063:366::-;19205:3;19226:67;19290:2;19285:3;19226:67;:::i;:::-;19219:74;;19302:93;19391:3;19302:93;:::i;:::-;19420:2;19415:3;19411:12;19404:19;;19063:366;;;:::o;19435:419::-;19601:4;19639:2;19628:9;19624:18;19616:26;;19688:9;19682:4;19678:20;19674:1;19663:9;19659:17;19652:47;19716:131;19842:4;19716:131;:::i;:::-;19708:139;;19435:419;;;:::o;19860:191::-;19900:3;19919:20;19937:1;19919:20;:::i;:::-;19914:25;;19953:20;19971:1;19953:20;:::i;:::-;19948:25;;19996:1;19993;19989:9;19982:16;;20017:3;20014:1;20011:10;20008:36;;;20024:18;;:::i;:::-;20008:36;19860:191;;;;:::o;20057:158::-;20197:10;20193:1;20185:6;20181:14;20174:34;20057:158;:::o;20221:365::-;20363:3;20384:66;20448:1;20443:3;20384:66;:::i;:::-;20377:73;;20459:93;20548:3;20459:93;:::i;:::-;20577:2;20572:3;20568:12;20561:19;;20221:365;;;:::o;20592:419::-;20758:4;20796:2;20785:9;20781:18;20773:26;;20845:9;20839:4;20835:20;20831:1;20820:9;20816:17;20809:47;20873:131;20999:4;20873:131;:::i;:::-;20865:139;;20592:419;;;:::o;21017:147::-;21118:11;21155:3;21140:18;;21017:147;;;;:::o;21170:114::-;;:::o;21290:398::-;21449:3;21470:83;21551:1;21546:3;21470:83;:::i;:::-;21463:90;;21562:93;21651:3;21562:93;:::i;:::-;21680:1;21675:3;21671:11;21664:18;;21290:398;;;:::o;21694:379::-;21878:3;21900:147;22043:3;21900:147;:::i;:::-;21893:154;;22064:3;22057:10;;21694:379;;;:::o;22079:174::-;22219:26;22215:1;22207:6;22203:14;22196:50;22079:174;:::o;22259:366::-;22401:3;22422:67;22486:2;22481:3;22422:67;:::i;:::-;22415:74;;22498:93;22587:3;22498:93;:::i;:::-;22616:2;22611:3;22607:12;22600:19;;22259:366;;;:::o;22631:419::-;22797:4;22835:2;22824:9;22820:18;22812:26;;22884:9;22878:4;22874:20;22870:1;22859:9;22855:17;22848:47;22912:131;23038:4;22912:131;:::i;:::-;22904:139;;22631:419;;;:::o;23056:235::-;23096:4;23116:20;23134:1;23116:20;:::i;:::-;23111:25;;23150:20;23168:1;23150:20;:::i;:::-;23145:25;;23194:1;23191;23187:9;23179:17;;23218:42;23212:4;23209:52;23206:78;;;23264:18;;:::i;:::-;23206:78;23056:235;;;;:::o;23297:166::-;23437:18;23433:1;23425:6;23421:14;23414:42;23297:166;:::o;23469:366::-;23611:3;23632:67;23696:2;23691:3;23632:67;:::i;:::-;23625:74;;23708:93;23797:3;23708:93;:::i;:::-;23826:2;23821:3;23817:12;23810:19;;23469:366;;;:::o;23841:419::-;24007:4;24045:2;24034:9;24030:18;24022:26;;24094:9;24088:4;24084:20;24080:1;24069:9;24065:17;24058:47;24122:131;24248:4;24122:131;:::i;:::-;24114:139;;23841:419;;;:::o;24266:180::-;24314:77;24311:1;24304:88;24411:4;24408:1;24401:15;24435:4;24432:1;24425:15;24452:233;24491:3;24514:24;24532:5;24514:24;:::i;:::-;24505:33;;24560:66;24553:5;24550:77;24547:103;;24630:18;;:::i;:::-;24547:103;24677:1;24670:5;24666:13;24659:20;;24452:233;;;:::o;24691:141::-;24740:4;24763:3;24755:11;;24786:3;24783:1;24776:14;24820:4;24817:1;24807:18;24799:26;;24691:141;;;:::o;24838:93::-;24875:6;24922:2;24917;24910:5;24906:14;24902:23;24892:33;;24838:93;;;:::o;24937:107::-;24981:8;25031:5;25025:4;25021:16;25000:37;;24937:107;;;;:::o;25050:393::-;25119:6;25169:1;25157:10;25153:18;25192:97;25222:66;25211:9;25192:97;:::i;:::-;25310:39;25340:8;25329:9;25310:39;:::i;:::-;25298:51;;25382:4;25378:9;25371:5;25367:21;25358:30;;25431:4;25421:8;25417:19;25410:5;25407:30;25397:40;;25126:317;;25050:393;;;;;:::o;25449:60::-;25477:3;25498:5;25491:12;;25449:60;;;:::o;25515:142::-;25565:9;25598:53;25616:34;25625:24;25643:5;25625:24;:::i;:::-;25616:34;:::i;:::-;25598:53;:::i;:::-;25585:66;;25515:142;;;:::o;25663:75::-;25706:3;25727:5;25720:12;;25663:75;;;:::o;25744:269::-;25854:39;25885:7;25854:39;:::i;:::-;25915:91;25964:41;25988:16;25964:41;:::i;:::-;25956:6;25949:4;25943:11;25915:91;:::i;:::-;25909:4;25902:105;25820:193;25744:269;;;:::o;26019:73::-;26064:3;26019:73;:::o;26098:189::-;26175:32;;:::i;:::-;26216:65;26274:6;26266;26260:4;26216:65;:::i;:::-;26151:136;26098:189;;:::o;26293:186::-;26353:120;26370:3;26363:5;26360:14;26353:120;;;26424:39;26461:1;26454:5;26424:39;:::i;:::-;26397:1;26390:5;26386:13;26377:22;;26353:120;;;26293:186;;:::o;26485:543::-;26586:2;26581:3;26578:11;26575:446;;;26620:38;26652:5;26620:38;:::i;:::-;26704:29;26722:10;26704:29;:::i;:::-;26694:8;26690:44;26887:2;26875:10;26872:18;26869:49;;;26908:8;26893:23;;26869:49;26931:80;26987:22;27005:3;26987:22;:::i;:::-;26977:8;26973:37;26960:11;26931:80;:::i;:::-;26590:431;;26575:446;26485:543;;;:::o;27034:117::-;27088:8;27138:5;27132:4;27128:16;27107:37;;27034:117;;;;:::o;27157:169::-;27201:6;27234:51;27282:1;27278:6;27270:5;27267:1;27263:13;27234:51;:::i;:::-;27230:56;27315:4;27309;27305:15;27295:25;;27208:118;27157:169;;;;:::o;27331:295::-;27407:4;27553:29;27578:3;27572:4;27553:29;:::i;:::-;27545:37;;27615:3;27612:1;27608:11;27602:4;27599:21;27591:29;;27331:295;;;;:::o;27631:1395::-;27748:37;27781:3;27748:37;:::i;:::-;27850:18;27842:6;27839:30;27836:56;;;27872:18;;:::i;:::-;27836:56;27916:38;27948:4;27942:11;27916:38;:::i;:::-;28001:67;28061:6;28053;28047:4;28001:67;:::i;:::-;28095:1;28119:4;28106:17;;28151:2;28143:6;28140:14;28168:1;28163:618;;;;28825:1;28842:6;28839:77;;;28891:9;28886:3;28882:19;28876:26;28867:35;;28839:77;28942:67;29002:6;28995:5;28942:67;:::i;:::-;28936:4;28929:81;28798:222;28133:887;;28163:618;28215:4;28211:9;28203:6;28199:22;28249:37;28281:4;28249:37;:::i;:::-;28308:1;28322:208;28336:7;28333:1;28330:14;28322:208;;;28415:9;28410:3;28406:19;28400:26;28392:6;28385:42;28466:1;28458:6;28454:14;28444:24;;28513:2;28502:9;28498:18;28485:31;;28359:4;28356:1;28352:12;28347:17;;28322:208;;;28558:6;28549:7;28546:19;28543:179;;;28616:9;28611:3;28607:19;28601:26;28659:48;28701:4;28693:6;28689:17;28678:9;28659:48;:::i;:::-;28651:6;28644:64;28566:156;28543:179;28768:1;28764;28756:6;28752:14;28748:22;28742:4;28735:36;28170:611;;;28133:887;;27723:1303;;;27631:1395;;:::o;29032:148::-;29134:11;29171:3;29156:18;;29032:148;;;;:::o;29186:390::-;29292:3;29320:39;29353:5;29320:39;:::i;:::-;29375:89;29457:6;29452:3;29375:89;:::i;:::-;29368:96;;29473:65;29531:6;29526:3;29519:4;29512:5;29508:16;29473:65;:::i;:::-;29563:6;29558:3;29554:16;29547:23;;29296:280;29186:390;;;;:::o;29582:435::-;29762:3;29784:95;29875:3;29866:6;29784:95;:::i;:::-;29777:102;;29896:95;29987:3;29978:6;29896:95;:::i;:::-;29889:102;;30008:3;30001:10;;29582:435;;;;;:::o;30023:225::-;30163:34;30159:1;30151:6;30147:14;30140:58;30232:8;30227:2;30219:6;30215:15;30208:33;30023:225;:::o;30254:366::-;30396:3;30417:67;30481:2;30476:3;30417:67;:::i;:::-;30410:74;;30493:93;30582:3;30493:93;:::i;:::-;30611:2;30606:3;30602:12;30595:19;;30254:366;;;:::o;30626:419::-;30792:4;30830:2;30819:9;30815:18;30807:26;;30879:9;30873:4;30869:20;30865:1;30854:9;30850:17;30843:47;30907:131;31033:4;30907:131;:::i;:::-;30899:139;;30626:419;;;:::o;31051:182::-;31191:34;31187:1;31179:6;31175:14;31168:58;31051:182;:::o;31239:366::-;31381:3;31402:67;31466:2;31461:3;31402:67;:::i;:::-;31395:74;;31478:93;31567:3;31478:93;:::i;:::-;31596:2;31591:3;31587:12;31580:19;;31239:366;;;:::o;31611:419::-;31777:4;31815:2;31804:9;31800:18;31792:26;;31864:9;31858:4;31854:20;31850:1;31839:9;31835:17;31828:47;31892:131;32018:4;31892:131;:::i;:::-;31884:139;;31611:419;;;:::o;32036:98::-;32087:6;32121:5;32115:12;32105:22;;32036:98;;;:::o;32140:168::-;32223:11;32257:6;32252:3;32245:19;32297:4;32292:3;32288:14;32273:29;;32140:168;;;;:::o;32314:373::-;32400:3;32428:38;32460:5;32428:38;:::i;:::-;32482:70;32545:6;32540:3;32482:70;:::i;:::-;32475:77;;32561:65;32619:6;32614:3;32607:4;32600:5;32596:16;32561:65;:::i;:::-;32651:29;32673:6;32651:29;:::i;:::-;32646:3;32642:39;32635:46;;32404:283;32314:373;;;;:::o;32693:640::-;32888:4;32926:3;32915:9;32911:19;32903:27;;32940:71;33008:1;32997:9;32993:17;32984:6;32940:71;:::i;:::-;33021:72;33089:2;33078:9;33074:18;33065:6;33021:72;:::i;:::-;33103;33171:2;33160:9;33156:18;33147:6;33103:72;:::i;:::-;33222:9;33216:4;33212:20;33207:2;33196:9;33192:18;33185:48;33250:76;33321:4;33312:6;33250:76;:::i;:::-;33242:84;;32693:640;;;;;;;:::o;33339:141::-;33395:5;33426:6;33420:13;33411:22;;33442:32;33468:5;33442:32;:::i;:::-;33339:141;;;;:::o;33486:349::-;33555:6;33604:2;33592:9;33583:7;33579:23;33575:32;33572:119;;;33610:79;;:::i;:::-;33572:119;33730:1;33755:63;33810:7;33801:6;33790:9;33786:22;33755:63;:::i;:::-;33745:73;;33701:127;33486:349;;;;:::o;33841:180::-;33889:77;33886:1;33879:88;33986:4;33983:1;33976:15;34010:4;34007:1;34000:15;34027:185;34067:1;34084:20;34102:1;34084:20;:::i;:::-;34079:25;;34118:20;34136:1;34118:20;:::i;:::-;34113:25;;34157:1;34147:35;;34162:18;;:::i;:::-;34147:35;34204:1;34201;34197:9;34192:14;;34027:185;;;;:::o;34218:194::-;34258:4;34278:20;34296:1;34278:20;:::i;:::-;34273:25;;34312:20;34330:1;34312:20;:::i;:::-;34307:25;;34356:1;34353;34349:9;34341:17;;34380:1;34374:4;34371:11;34368:37;;;34385:18;;:::i;:::-;34368:37;34218:194;;;;:::o;34418:176::-;34450:1;34467:20;34485:1;34467:20;:::i;:::-;34462:25;;34501:20;34519:1;34501:20;:::i;:::-;34496:25;;34540:1;34530:35;;34545:18;;:::i;:::-;34530:35;34586:1;34583;34579:9;34574:14;;34418:176;;;;:::o;34600:232::-;34640:3;34659:20;34677:1;34659:20;:::i;:::-;34654:25;;34693:20;34711:1;34693:20;:::i;:::-;34688:25;;34736:1;34733;34729:9;34722:16;;34759:42;34754:3;34751:51;34748:77;;;34805:18;;:::i;:::-;34748:77;34600:232;;;;:::o

Swarm Source

ipfs://3751780b2d2e6f0f5f70d48f817fada71ba6ca08226f0ac2fb40267d250645a8
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.