ETH Price: $3,836.70 (+6.06%)

Token

ERC-20: Floaties (FLOATIES)
 

Overview

Max Total Supply

3,333 FLOATIES

Holders

558

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
0 FLOATIES
0x1c676fde9c59ddbb1feffd92076090977fb8c113
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:
Floaties

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// Sources flattened with hardhat v2.10.1 https://hardhat.org

// File @openzeppelin/contracts/utils/introspection/[email protected]


// 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/token/ERC721/[email protected]


// 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/[email protected]


// 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/token/ERC721/extensions/[email protected]


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

pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/utils/[email protected]


// 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/utils/[email protected]


// 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/utils/[email protected]


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]


// 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 contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;







error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
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)) internal _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 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();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        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) {
        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) {
        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 {
        _addressData[owner].aux = aux;
    }

    /**
     * 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.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            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  virtual {}

    /**
     * @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 virtual  {}

    /**
     * @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;
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    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 {
        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 (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);
    }

    /**
     * @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) 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;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex != end);

            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, 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);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.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;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // 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 storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.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;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, 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
    ) internal {
        _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 @openzeppelin/contracts/access/[email protected]


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

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

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


// File contracts/MerkleProof.sol


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }
        return computedHash;
    }
}


// File contracts/Floaties.sol

// SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.9;



contract Floaties is ERC721A, Ownable {
    string private _baseTokenURI;
    bytes32 public merkleRoot;

    mapping(address => bool) public bannedExchanges;
    mapping(address => uint256) public whitelistMints;

    bool public saleIsActive = false;
    bool public whitelistSaleIsActive = false;

    uint256 public maxAmount = 3333;
    uint256 public maxPerMint = 8;
    uint256 public maxPerWhitelist = 8;
    uint256 public nftPrice = 0.07 ether;

    uint256 public whitelistLength = 0;

    address private mktWallet = 0xd6544adA9811B74899EB7aAEE742a8B9f552C5Cf;
    address private lowIQWallet = 0xe4446D52e2bdB3E31470643Ab1753a4c2aEee3eA;
    address private devWallet = 0x5f55F579beB3beaD4163604a630731556B52a9f0;
    address private artWallet = 0xa64c09B57d311f0a9240b75f6Ead51f83D1732EA;
    address private copyWallet = 0xB09e818F51E054eB50b570ED476951aB0F974b14;
    address private ideaWallet = 0x9114B6E313A29fd8eCe8Ca8fE7A834024434DA18;

    constructor(bytes32 merkleRoot_) ERC721A("Floaties", "FLOATIES") {
        merkleRoot = merkleRoot_;
        bannedExchanges[0x1E0049783F008A0085193E00003D00cd54003c71] = true;
        bannedExchanges[0xF849de01B080aDC3A814FaBE1E2087475cF2E354] = true;
        bannedExchanges[0xf42aa99F011A1fA7CDA90E5E98b277E306BcA83e] = true;
    }

    receive() external payable {}

    function _baseURI() internal view virtual override returns (string memory) {
        return _baseTokenURI;
    }

    function setBaseURI(string calldata baseURI) external onlyOwner {
        _baseTokenURI = baseURI;
    }

    function flipSaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }

    function flipWhitelistSaleState() public onlyOwner {
        whitelistSaleIsActive = !whitelistSaleIsActive;
    }

    function mintReserveTokens(uint256 numberOfTokens) public onlyOwner {
        _safeMint(msg.sender, numberOfTokens);
        require(totalSupply() <= maxAmount, "Limit reached");
    }

    function mintNFTWhitelist(
        bytes32[] calldata _merkleProof,
        uint256 numberOfTokens
    ) public payable {
        require(whitelistSaleIsActive, "Whitelist sale is not active");
        require(
            nftPrice * numberOfTokens <= msg.value,
            "Ether value incorrect"
        );
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(
            MerkleProof.verify(_merkleProof, merkleRoot, leaf) == true,
            "Incorrect Merkle Proof"
        );

        uint256 mintedSoFar = whitelistMints[msg.sender] + numberOfTokens;
        require(mintedSoFar <= maxPerWhitelist, "You can't mint that many");

        whitelistMints[msg.sender] = mintedSoFar;

        _safeMint(msg.sender, numberOfTokens);

        require(totalSupply() <= maxAmount, "Limit reached");
    }

    function mintNFT(uint256 numberOfTokens) public payable {
        require(saleIsActive, "Sale is not active");
        require(
            numberOfTokens <= maxPerMint,
            "You can't mint that many at once"
        );
        require(
            nftPrice * numberOfTokens <= msg.value,
            "Ether value sent is not correct"
        );

        _safeMint(msg.sender, numberOfTokens);

        require(totalSupply() <= maxAmount, "Limit reached");
    }

    function withdrawMoney() external onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }

    function sendPayouts() public onlyOwner {
        uint256 payout = (address(this).balance * 70) / 100;

        uint256 dev = (payout * 1950) / 10000;
        uint256 art = (payout * 1750) / 10000;
        uint256 copy = (payout * 1750) / 10000;
        uint256 idea = (payout * 1750) / 10000;
        uint256 lowiq = (payout * 1000) / 10000;
        uint256 mkt = (payout * 1800) / 10000;

        require(payable(devWallet).send(dev));
        require(payable(artWallet).send(art));
        require(payable(copyWallet).send(copy));
        require(payable(mktWallet).send(mkt));
        require(payable(ideaWallet).send(idea));
        require(payable(lowIQWallet).send(lowiq));
    }

    function addBannedExchange(address account) external onlyOwner {
        bannedExchanges[account] = true;
    }

    function removeBannedExchange(address account) external onlyOwner {
        bannedExchanges[account] = false;
    }

    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();
        }
        require(!bannedExchanges[to], "This exchange is not allowed.");

        _approve(to, tokenId, owner);
    }

    function setApprovalForAll(address operator, bool approved)
        public
        override
    {
        require(!bannedExchanges[operator], "This exchange is not allowed.");

        if (operator == _msgSender()) revert ApproveToCaller();

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

    function setMerkleRoot(bytes32 merkleRoot_) external onlyOwner {
        merkleRoot = merkleRoot_;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"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":"account","type":"address"}],"name":"addBannedExchange","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":"address","name":"","type":"address"}],"name":"bannedExchanges","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipWhitelistSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintNFTWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintReserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"address","name":"account","type":"address"}],"name":"removeBannedExchange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sendPayouts","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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"setMerkleRoot","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":"whitelistLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526000600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff021916908315150217905550610d05600e556008600f55600860105566f8b0a10e470000601155600060125573d6544ada9811b74899eb7aaee742a8b9f552c5cf601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073e4446d52e2bdb3e31470643ab1753a4c2aeee3ea601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550735f55f579beb3bead4163604a630731556b52a9f0601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073a64c09b57d311f0a9240b75f6ead51f83d1732ea601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073b09e818f51e054eb50b570ed476951ab0f974b14601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550739114b6e313a29fd8ece8ca8fe7a834024434da18601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200026557600080fd5b50604051620047293803806200472983398181016040528101906200028b919062000676565b6040518060400160405280600881526020017f466c6f61746965730000000000000000000000000000000000000000000000008152506040518060400160405280600881526020017f464c4f415449455300000000000000000000000000000000000000000000000081525081600290805190602001906200030f92919062000586565b5080600390805190602001906200032892919062000586565b5062000339620004b360201b60201c565b60008190555050506200036162000355620004b860201b60201c565b620004c060201b60201c565b80600a819055506001600b6000731e0049783f008a0085193e00003d00cd54003c7173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b600073f849de01b080adc3a814fabe1e2087475cf2e35473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b600073f42aa99f011a1fa7cda90e5e98b277e306bca83e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550506200070d565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200059490620006d7565b90600052602060002090601f016020900481019282620005b8576000855562000604565b82601f10620005d357805160ff191683800117855562000604565b8280016001018555821562000604579182015b8281111562000603578251825591602001919060010190620005e6565b5b50905062000613919062000617565b5090565b5b808211156200063257600081600090555060010162000618565b5090565b600080fd5b6000819050919050565b62000650816200063b565b81146200065c57600080fd5b50565b600081519050620006708162000645565b92915050565b6000602082840312156200068f576200068e62000636565b5b60006200069f848285016200065f565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620006f057607f821691505b60208210811415620007075762000706620006a8565b5b50919050565b61400c806200071d6000396000f3fe6080604052600436106102285760003560e01c8063715018a611610123578063b88d4fde116100ab578063e2e7bfb11161006f578063e2e7bfb1146107b8578063e985e9c5146107e1578063eb832d211461081e578063eb8d24441461083a578063f2fde38b146108655761022f565b8063b88d4fde146106fb578063c534b74c14610724578063c87b56dd1461074d578063d1beca641461078a578063d53016d5146107a15761022f565b806392642744116100f2578063926427441461063757806395d89b4114610653578063a22cb4651461067e578063ac446002146106a7578063b5c1847d146106be5761022f565b8063715018a6146105a157806378bb5164146105b85780637cb64759146105e35780638da5cb5b1461060c5761022f565b8063288bd8fd116101b157806355f804b31161017557806355f804b3146104a85780635f48f393146104d15780636352211e146104fc57806366cc5f0d1461053957806370a08231146105645761022f565b8063288bd8fd146103e95780632eb4a7ab1461041257806334918dfd1461043d57806342842e0e14610454578063507e094f1461047d5761022f565b8063095ea7b3116101f8578063095ea7b3146103165780630d39fc811461033f57806310b5454d1461036a57806318160ddd1461039557806323b872dd146103c05761022f565b80628af2e61461023457806301ffc9a71461027157806306fdde03146102ae578063081812fc146102d95761022f565b3661022f57005b600080fd5b34801561024057600080fd5b5061025b60048036038101906102569190612f5b565b61088e565b6040516102689190612fa1565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190613014565b6108a6565b6040516102a5919061305c565b60405180910390f35b3480156102ba57600080fd5b506102c3610988565b6040516102d09190613110565b60405180910390f35b3480156102e557600080fd5b5061030060048036038101906102fb919061315e565b610a1a565b60405161030d919061319a565b60405180910390f35b34801561032257600080fd5b5061033d600480360381019061033891906131b5565b610a96565b005b34801561034b57600080fd5b50610354610c2e565b6040516103619190612fa1565b60405180910390f35b34801561037657600080fd5b5061037f610c34565b60405161038c919061305c565b60405180910390f35b3480156103a157600080fd5b506103aa610c47565b6040516103b79190612fa1565b60405180910390f35b3480156103cc57600080fd5b506103e760048036038101906103e291906131f5565b610c5e565b005b3480156103f557600080fd5b50610410600480360381019061040b919061315e565b610c6e565b005b34801561041e57600080fd5b50610427610ccf565b6040516104349190613261565b60405180910390f35b34801561044957600080fd5b50610452610cd5565b005b34801561046057600080fd5b5061047b600480360381019061047691906131f5565b610d09565b005b34801561048957600080fd5b50610492610d29565b60405161049f9190612fa1565b60405180910390f35b3480156104b457600080fd5b506104cf60048036038101906104ca91906132e1565b610d2f565b005b3480156104dd57600080fd5b506104e6610d4d565b6040516104f39190612fa1565b60405180910390f35b34801561050857600080fd5b50610523600480360381019061051e919061315e565b610d53565b604051610530919061319a565b60405180910390f35b34801561054557600080fd5b5061054e610d69565b60405161055b9190612fa1565b60405180910390f35b34801561057057600080fd5b5061058b60048036038101906105869190612f5b565b610d6f565b6040516105989190612fa1565b60405180910390f35b3480156105ad57600080fd5b506105b6610e3f565b005b3480156105c457600080fd5b506105cd610e53565b6040516105da9190612fa1565b60405180910390f35b3480156105ef57600080fd5b5061060a6004803603810190610605919061335a565b610e59565b005b34801561061857600080fd5b50610621610e6b565b60405161062e919061319a565b60405180910390f35b610651600480360381019061064c919061315e565b610e95565b005b34801561065f57600080fd5b50610668610fd2565b6040516106759190613110565b60405180910390f35b34801561068a57600080fd5b506106a560048036038101906106a091906133b3565b611064565b005b3480156106b357600080fd5b506106bc611269565b005b3480156106ca57600080fd5b506106e560048036038101906106e09190612f5b565b6112ba565b6040516106f2919061305c565b60405180910390f35b34801561070757600080fd5b50610722600480360381019061071d9190613523565b6112da565b005b34801561073057600080fd5b5061074b60048036038101906107469190612f5b565b611356565b005b34801561075957600080fd5b50610774600480360381019061076f919061315e565b6113b9565b6040516107819190613110565b60405180910390f35b34801561079657600080fd5b5061079f611458565b005b3480156107ad57600080fd5b506107b661148c565b005b3480156107c457600080fd5b506107df60048036038101906107da9190612f5b565b6117b4565b005b3480156107ed57600080fd5b50610808600480360381019061080391906135a6565b611817565b604051610815919061305c565b60405180910390f35b6108386004803603810190610833919061363c565b6118ab565b005b34801561084657600080fd5b5061084f611b3e565b60405161085c919061305c565b60405180910390f35b34801561087157600080fd5b5061088c60048036038101906108879190612f5b565b611b51565b005b600c6020528060005260406000206000915090505481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061097157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610981575061098082611bd5565b5b9050919050565b606060028054610997906136cb565b80601f01602080910402602001604051908101604052809291908181526020018280546109c3906136cb565b8015610a105780601f106109e557610100808354040283529160200191610a10565b820191906000526020600020905b8154815290600101906020018083116109f357829003601f168201915b5050505050905090565b6000610a2582611c3f565b610a5b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610aa182610d53565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b09576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b28611c8d565b73ffffffffffffffffffffffffffffffffffffffff1614158015610b5a5750610b5881610b53611c8d565b611817565b155b15610b91576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1590613749565b60405180910390fd5b610c29838383611c95565b505050565b60115481565b600d60019054906101000a900460ff1681565b6000610c51611d47565b6001546000540303905090565b610c69838383611d4c565b505050565b610c76612202565b610c803382612280565b600e54610c8b610c47565b1115610ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc3906137b5565b60405180910390fd5b50565b600a5481565b610cdd612202565b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b610d24838383604051806020016040528060008152506112da565b505050565b600f5481565b610d37612202565b818160099190610d48929190612e03565b505050565b600e5481565b6000610d5e8261229e565b600001519050919050565b60105481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610dd7576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610e47612202565b610e51600061252d565b565b60125481565b610e61612202565b80600a8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d60009054906101000a900460ff16610ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edb90613821565b60405180910390fd5b600f54811115610f29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f209061388d565b60405180910390fd5b3481601154610f3891906138dc565b1115610f79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7090613982565b60405180910390fd5b610f833382612280565b600e54610f8e610c47565b1115610fcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc6906137b5565b60405180910390fd5b50565b606060038054610fe1906136cb565b80601f016020809104026020016040519081016040528092919081815260200182805461100d906136cb565b801561105a5780601f1061102f5761010080835404028352916020019161105a565b820191906000526020600020905b81548152906001019060200180831161103d57829003601f168201915b5050505050905090565b600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156110f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e890613749565b60405180910390fd5b6110f9611c8d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561115e576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061116b611c8d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611218611c8d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161125d919061305c565b60405180910390a35050565b611271612202565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156112b7573d6000803e3d6000fd5b50565b600b6020528060005260406000206000915054906101000a900460ff1681565b6112e5848484611d4c565b6113048373ffffffffffffffffffffffffffffffffffffffff166125f3565b8015611319575061131784848484612616565b155b15611350576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b61135e612202565b6001600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60606113c482611c3f565b6113fa576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611404612776565b90506000815114156114255760405180602001604052806000815250611450565b8061142f84612808565b6040516020016114409291906139de565b6040516020818303038152906040525b915050919050565b611460612202565b600d60019054906101000a900460ff1615600d60016101000a81548160ff021916908315150217905550565b611494612202565b600060646046476114a591906138dc565b6114af9190613a31565b9050600061271061079e836114c491906138dc565b6114ce9190613a31565b905060006127106106d6846114e391906138dc565b6114ed9190613a31565b905060006127106106d68561150291906138dc565b61150c9190613a31565b905060006127106106d68661152191906138dc565b61152b9190613a31565b905060006127106103e88761154091906138dc565b61154a9190613a31565b905060006127106107088861155f91906138dc565b6115699190613a31565b9050601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc879081150290604051600060405180830381858888f193505050506115cb57600080fd5b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f1935050505061162b57600080fd5b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc859081150290604051600060405180830381858888f1935050505061168b57600080fd5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050506116eb57600080fd5b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f1935050505061174b57600080fd5b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050506117ab57600080fd5b50505050505050565b6117bc612202565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60019054906101000a900460ff166118fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f190613aae565b60405180910390fd5b348160115461190991906138dc565b111561194a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194190613b1a565b60405180910390fd5b60003360405160200161195d9190613b82565b604051602081830303815290604052805190602001209050600115156119c7858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a5484612969565b151514611a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0090613be9565b60405180910390fd5b600082600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a569190613c09565b9050601054811115611a9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9490613cab565b60405180910390fd5b80600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611aeb3384612280565b600e54611af6610c47565b1115611b37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2e906137b5565b60405180910390fd5b5050505050565b600d60009054906101000a900460ff1681565b611b59612202565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc090613d3d565b60405180910390fd5b611bd28161252d565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611c4a611d47565b11158015611c59575060005482105b8015611c86575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6000611d578261229e565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611dc2576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611de3611c8d565b73ffffffffffffffffffffffffffffffffffffffff161480611e125750611e1185611e0c611c8d565b611817565b5b80611e575750611e20611c8d565b73ffffffffffffffffffffffffffffffffffffffff16611e3f84610a1a565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611e90576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611ef7576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f048585856001612980565b611f1060008487611c95565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561219057600054821461218f57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121fb8585856001612986565b5050505050565b61220a611c8d565b73ffffffffffffffffffffffffffffffffffffffff16612228610e6b565b73ffffffffffffffffffffffffffffffffffffffff161461227e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227590613da9565b60405180910390fd5b565b61229a82826040518060200160405280600081525061298c565b5050565b6122a6612e89565b6000829050806122b4611d47565b111580156122c3575060005481105b156124f6576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516124f457600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146123d8578092505050612528565b5b6001156124f357818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146124ee578092505050612528565b6123d9565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261263c611c8d565b8786866040518563ffffffff1660e01b815260040161265e9493929190613e1e565b602060405180830381600087803b15801561267857600080fd5b505af19250505080156126a957506040513d601f19601f820116820180604052508101906126a69190613e7f565b60015b612723573d80600081146126d9576040519150601f19603f3d011682016040523d82523d6000602084013e6126de565b606091505b5060008151141561271b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054612785906136cb565b80601f01602080910402602001604051908101604052809291908181526020018280546127b1906136cb565b80156127fe5780601f106127d3576101008083540402835291602001916127fe565b820191906000526020600020905b8154815290600101906020018083116127e157829003601f168201915b5050505050905090565b60606000821415612850576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612964565b600082905060005b6000821461288257808061286b90613eac565b915050600a8261287b9190613a31565b9150612858565b60008167ffffffffffffffff81111561289e5761289d6133f8565b5b6040519080825280601f01601f1916602001820160405280156128d05781602001600182028036833780820191505090505b5090505b6000851461295d576001826128e99190613ef5565b9150600a856128f89190613f29565b60306129049190613c09565b60f81b81838151811061291a57612919613f5a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129569190613a31565b94506128d4565b8093505050505b919050565b6000826129768584612d50565b1490509392505050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156129f9576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415612a34576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a416000858386612980565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008482019050612c028673ffffffffffffffffffffffffffffffffffffffff166125f3565b15612cc8575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c776000878480600101955087612616565b612cad576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612c08578260005414612cc357600080fd5b612d34565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612cc9575b816000819055505050612d4a6000858386612986565b50505050565b60008082905060005b8451811015612df8576000858281518110612d7757612d76613f5a565b5b60200260200101519050808311612db8578281604051602001612d9b929190613faa565b604051602081830303815290604052805190602001209250612de4565b8083604051602001612dcb929190613faa565b6040516020818303038152906040528051906020012092505b508080612df090613eac565b915050612d59565b508091505092915050565b828054612e0f906136cb565b90600052602060002090601f016020900481019282612e315760008555612e78565b82601f10612e4a57803560ff1916838001178555612e78565b82800160010185558215612e78579182015b82811115612e77578235825591602001919060010190612e5c565b5b509050612e859190612ecc565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612ee5576000816000905550600101612ecd565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612f2882612efd565b9050919050565b612f3881612f1d565b8114612f4357600080fd5b50565b600081359050612f5581612f2f565b92915050565b600060208284031215612f7157612f70612ef3565b5b6000612f7f84828501612f46565b91505092915050565b6000819050919050565b612f9b81612f88565b82525050565b6000602082019050612fb66000830184612f92565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612ff181612fbc565b8114612ffc57600080fd5b50565b60008135905061300e81612fe8565b92915050565b60006020828403121561302a57613029612ef3565b5b600061303884828501612fff565b91505092915050565b60008115159050919050565b61305681613041565b82525050565b6000602082019050613071600083018461304d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156130b1578082015181840152602081019050613096565b838111156130c0576000848401525b50505050565b6000601f19601f8301169050919050565b60006130e282613077565b6130ec8185613082565b93506130fc818560208601613093565b613105816130c6565b840191505092915050565b6000602082019050818103600083015261312a81846130d7565b905092915050565b61313b81612f88565b811461314657600080fd5b50565b60008135905061315881613132565b92915050565b60006020828403121561317457613173612ef3565b5b600061318284828501613149565b91505092915050565b61319481612f1d565b82525050565b60006020820190506131af600083018461318b565b92915050565b600080604083850312156131cc576131cb612ef3565b5b60006131da85828601612f46565b92505060206131eb85828601613149565b9150509250929050565b60008060006060848603121561320e5761320d612ef3565b5b600061321c86828701612f46565b935050602061322d86828701612f46565b925050604061323e86828701613149565b9150509250925092565b6000819050919050565b61325b81613248565b82525050565b60006020820190506132766000830184613252565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126132a1576132a061327c565b5b8235905067ffffffffffffffff8111156132be576132bd613281565b5b6020830191508360018202830111156132da576132d9613286565b5b9250929050565b600080602083850312156132f8576132f7612ef3565b5b600083013567ffffffffffffffff81111561331657613315612ef8565b5b6133228582860161328b565b92509250509250929050565b61333781613248565b811461334257600080fd5b50565b6000813590506133548161332e565b92915050565b6000602082840312156133705761336f612ef3565b5b600061337e84828501613345565b91505092915050565b61339081613041565b811461339b57600080fd5b50565b6000813590506133ad81613387565b92915050565b600080604083850312156133ca576133c9612ef3565b5b60006133d885828601612f46565b92505060206133e98582860161339e565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613430826130c6565b810181811067ffffffffffffffff8211171561344f5761344e6133f8565b5b80604052505050565b6000613462612ee9565b905061346e8282613427565b919050565b600067ffffffffffffffff82111561348e5761348d6133f8565b5b613497826130c6565b9050602081019050919050565b82818337600083830152505050565b60006134c66134c184613473565b613458565b9050828152602081018484840111156134e2576134e16133f3565b5b6134ed8482856134a4565b509392505050565b600082601f83011261350a5761350961327c565b5b813561351a8482602086016134b3565b91505092915050565b6000806000806080858703121561353d5761353c612ef3565b5b600061354b87828801612f46565b945050602061355c87828801612f46565b935050604061356d87828801613149565b925050606085013567ffffffffffffffff81111561358e5761358d612ef8565b5b61359a878288016134f5565b91505092959194509250565b600080604083850312156135bd576135bc612ef3565b5b60006135cb85828601612f46565b92505060206135dc85828601612f46565b9150509250929050565b60008083601f8401126135fc576135fb61327c565b5b8235905067ffffffffffffffff81111561361957613618613281565b5b60208301915083602082028301111561363557613634613286565b5b9250929050565b60008060006040848603121561365557613654612ef3565b5b600084013567ffffffffffffffff81111561367357613672612ef8565b5b61367f868287016135e6565b9350935050602061369286828701613149565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806136e357607f821691505b602082108114156136f7576136f661369c565b5b50919050565b7f546869732065786368616e6765206973206e6f7420616c6c6f7765642e000000600082015250565b6000613733601d83613082565b915061373e826136fd565b602082019050919050565b6000602082019050818103600083015261376281613726565b9050919050565b7f4c696d6974207265616368656400000000000000000000000000000000000000600082015250565b600061379f600d83613082565b91506137aa82613769565b602082019050919050565b600060208201905081810360008301526137ce81613792565b9050919050565b7f53616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b600061380b601283613082565b9150613816826137d5565b602082019050919050565b6000602082019050818103600083015261383a816137fe565b9050919050565b7f596f752063616e2774206d696e742074686174206d616e79206174206f6e6365600082015250565b6000613877602083613082565b915061388282613841565b602082019050919050565b600060208201905081810360008301526138a68161386a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006138e782612f88565b91506138f283612f88565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561392b5761392a6138ad565b5b828202905092915050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b600061396c601f83613082565b915061397782613936565b602082019050919050565b6000602082019050818103600083015261399b8161395f565b9050919050565b600081905092915050565b60006139b882613077565b6139c281856139a2565b93506139d2818560208601613093565b80840191505092915050565b60006139ea82856139ad565b91506139f682846139ad565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613a3c82612f88565b9150613a4783612f88565b925082613a5757613a56613a02565b5b828204905092915050565b7f57686974656c6973742073616c65206973206e6f742061637469766500000000600082015250565b6000613a98601c83613082565b9150613aa382613a62565b602082019050919050565b60006020820190508181036000830152613ac781613a8b565b9050919050565b7f45746865722076616c756520696e636f72726563740000000000000000000000600082015250565b6000613b04601583613082565b9150613b0f82613ace565b602082019050919050565b60006020820190508181036000830152613b3381613af7565b9050919050565b60008160601b9050919050565b6000613b5282613b3a565b9050919050565b6000613b6482613b47565b9050919050565b613b7c613b7782612f1d565b613b59565b82525050565b6000613b8e8284613b6b565b60148201915081905092915050565b7f496e636f7272656374204d65726b6c652050726f6f6600000000000000000000600082015250565b6000613bd3601683613082565b9150613bde82613b9d565b602082019050919050565b60006020820190508181036000830152613c0281613bc6565b9050919050565b6000613c1482612f88565b9150613c1f83612f88565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c5457613c536138ad565b5b828201905092915050565b7f596f752063616e2774206d696e742074686174206d616e790000000000000000600082015250565b6000613c95601883613082565b9150613ca082613c5f565b602082019050919050565b60006020820190508181036000830152613cc481613c88565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613d27602683613082565b9150613d3282613ccb565b604082019050919050565b60006020820190508181036000830152613d5681613d1a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613d93602083613082565b9150613d9e82613d5d565b602082019050919050565b60006020820190508181036000830152613dc281613d86565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613df082613dc9565b613dfa8185613dd4565b9350613e0a818560208601613093565b613e13816130c6565b840191505092915050565b6000608082019050613e33600083018761318b565b613e40602083018661318b565b613e4d6040830185612f92565b8181036060830152613e5f8184613de5565b905095945050505050565b600081519050613e7981612fe8565b92915050565b600060208284031215613e9557613e94612ef3565b5b6000613ea384828501613e6a565b91505092915050565b6000613eb782612f88565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613eea57613ee96138ad565b5b600182019050919050565b6000613f0082612f88565b9150613f0b83612f88565b925082821015613f1e57613f1d6138ad565b5b828203905092915050565b6000613f3482612f88565b9150613f3f83612f88565b925082613f4f57613f4e613a02565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b613fa4613f9f82613248565b613f89565b82525050565b6000613fb68285613f93565b602082019150613fc68284613f93565b602082019150819050939250505056fea264697066735822122051604abac4647200417737fd767d89f2fa273291883517e53c126cbd43dfacf664736f6c634300080900336ee6dc0c8ffddca9f889fb352fd6f145e5d453a2908ad19611a8d40a359c9bf0

Deployed Bytecode

0x6080604052600436106102285760003560e01c8063715018a611610123578063b88d4fde116100ab578063e2e7bfb11161006f578063e2e7bfb1146107b8578063e985e9c5146107e1578063eb832d211461081e578063eb8d24441461083a578063f2fde38b146108655761022f565b8063b88d4fde146106fb578063c534b74c14610724578063c87b56dd1461074d578063d1beca641461078a578063d53016d5146107a15761022f565b806392642744116100f2578063926427441461063757806395d89b4114610653578063a22cb4651461067e578063ac446002146106a7578063b5c1847d146106be5761022f565b8063715018a6146105a157806378bb5164146105b85780637cb64759146105e35780638da5cb5b1461060c5761022f565b8063288bd8fd116101b157806355f804b31161017557806355f804b3146104a85780635f48f393146104d15780636352211e146104fc57806366cc5f0d1461053957806370a08231146105645761022f565b8063288bd8fd146103e95780632eb4a7ab1461041257806334918dfd1461043d57806342842e0e14610454578063507e094f1461047d5761022f565b8063095ea7b3116101f8578063095ea7b3146103165780630d39fc811461033f57806310b5454d1461036a57806318160ddd1461039557806323b872dd146103c05761022f565b80628af2e61461023457806301ffc9a71461027157806306fdde03146102ae578063081812fc146102d95761022f565b3661022f57005b600080fd5b34801561024057600080fd5b5061025b60048036038101906102569190612f5b565b61088e565b6040516102689190612fa1565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190613014565b6108a6565b6040516102a5919061305c565b60405180910390f35b3480156102ba57600080fd5b506102c3610988565b6040516102d09190613110565b60405180910390f35b3480156102e557600080fd5b5061030060048036038101906102fb919061315e565b610a1a565b60405161030d919061319a565b60405180910390f35b34801561032257600080fd5b5061033d600480360381019061033891906131b5565b610a96565b005b34801561034b57600080fd5b50610354610c2e565b6040516103619190612fa1565b60405180910390f35b34801561037657600080fd5b5061037f610c34565b60405161038c919061305c565b60405180910390f35b3480156103a157600080fd5b506103aa610c47565b6040516103b79190612fa1565b60405180910390f35b3480156103cc57600080fd5b506103e760048036038101906103e291906131f5565b610c5e565b005b3480156103f557600080fd5b50610410600480360381019061040b919061315e565b610c6e565b005b34801561041e57600080fd5b50610427610ccf565b6040516104349190613261565b60405180910390f35b34801561044957600080fd5b50610452610cd5565b005b34801561046057600080fd5b5061047b600480360381019061047691906131f5565b610d09565b005b34801561048957600080fd5b50610492610d29565b60405161049f9190612fa1565b60405180910390f35b3480156104b457600080fd5b506104cf60048036038101906104ca91906132e1565b610d2f565b005b3480156104dd57600080fd5b506104e6610d4d565b6040516104f39190612fa1565b60405180910390f35b34801561050857600080fd5b50610523600480360381019061051e919061315e565b610d53565b604051610530919061319a565b60405180910390f35b34801561054557600080fd5b5061054e610d69565b60405161055b9190612fa1565b60405180910390f35b34801561057057600080fd5b5061058b60048036038101906105869190612f5b565b610d6f565b6040516105989190612fa1565b60405180910390f35b3480156105ad57600080fd5b506105b6610e3f565b005b3480156105c457600080fd5b506105cd610e53565b6040516105da9190612fa1565b60405180910390f35b3480156105ef57600080fd5b5061060a6004803603810190610605919061335a565b610e59565b005b34801561061857600080fd5b50610621610e6b565b60405161062e919061319a565b60405180910390f35b610651600480360381019061064c919061315e565b610e95565b005b34801561065f57600080fd5b50610668610fd2565b6040516106759190613110565b60405180910390f35b34801561068a57600080fd5b506106a560048036038101906106a091906133b3565b611064565b005b3480156106b357600080fd5b506106bc611269565b005b3480156106ca57600080fd5b506106e560048036038101906106e09190612f5b565b6112ba565b6040516106f2919061305c565b60405180910390f35b34801561070757600080fd5b50610722600480360381019061071d9190613523565b6112da565b005b34801561073057600080fd5b5061074b60048036038101906107469190612f5b565b611356565b005b34801561075957600080fd5b50610774600480360381019061076f919061315e565b6113b9565b6040516107819190613110565b60405180910390f35b34801561079657600080fd5b5061079f611458565b005b3480156107ad57600080fd5b506107b661148c565b005b3480156107c457600080fd5b506107df60048036038101906107da9190612f5b565b6117b4565b005b3480156107ed57600080fd5b50610808600480360381019061080391906135a6565b611817565b604051610815919061305c565b60405180910390f35b6108386004803603810190610833919061363c565b6118ab565b005b34801561084657600080fd5b5061084f611b3e565b60405161085c919061305c565b60405180910390f35b34801561087157600080fd5b5061088c60048036038101906108879190612f5b565b611b51565b005b600c6020528060005260406000206000915090505481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061097157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610981575061098082611bd5565b5b9050919050565b606060028054610997906136cb565b80601f01602080910402602001604051908101604052809291908181526020018280546109c3906136cb565b8015610a105780601f106109e557610100808354040283529160200191610a10565b820191906000526020600020905b8154815290600101906020018083116109f357829003601f168201915b5050505050905090565b6000610a2582611c3f565b610a5b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610aa182610d53565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b09576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b28611c8d565b73ffffffffffffffffffffffffffffffffffffffff1614158015610b5a5750610b5881610b53611c8d565b611817565b155b15610b91576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1590613749565b60405180910390fd5b610c29838383611c95565b505050565b60115481565b600d60019054906101000a900460ff1681565b6000610c51611d47565b6001546000540303905090565b610c69838383611d4c565b505050565b610c76612202565b610c803382612280565b600e54610c8b610c47565b1115610ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc3906137b5565b60405180910390fd5b50565b600a5481565b610cdd612202565b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b610d24838383604051806020016040528060008152506112da565b505050565b600f5481565b610d37612202565b818160099190610d48929190612e03565b505050565b600e5481565b6000610d5e8261229e565b600001519050919050565b60105481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610dd7576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610e47612202565b610e51600061252d565b565b60125481565b610e61612202565b80600a8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d60009054906101000a900460ff16610ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edb90613821565b60405180910390fd5b600f54811115610f29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f209061388d565b60405180910390fd5b3481601154610f3891906138dc565b1115610f79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7090613982565b60405180910390fd5b610f833382612280565b600e54610f8e610c47565b1115610fcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc6906137b5565b60405180910390fd5b50565b606060038054610fe1906136cb565b80601f016020809104026020016040519081016040528092919081815260200182805461100d906136cb565b801561105a5780601f1061102f5761010080835404028352916020019161105a565b820191906000526020600020905b81548152906001019060200180831161103d57829003601f168201915b5050505050905090565b600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156110f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e890613749565b60405180910390fd5b6110f9611c8d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561115e576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061116b611c8d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611218611c8d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161125d919061305c565b60405180910390a35050565b611271612202565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156112b7573d6000803e3d6000fd5b50565b600b6020528060005260406000206000915054906101000a900460ff1681565b6112e5848484611d4c565b6113048373ffffffffffffffffffffffffffffffffffffffff166125f3565b8015611319575061131784848484612616565b155b15611350576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b61135e612202565b6001600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60606113c482611c3f565b6113fa576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611404612776565b90506000815114156114255760405180602001604052806000815250611450565b8061142f84612808565b6040516020016114409291906139de565b6040516020818303038152906040525b915050919050565b611460612202565b600d60019054906101000a900460ff1615600d60016101000a81548160ff021916908315150217905550565b611494612202565b600060646046476114a591906138dc565b6114af9190613a31565b9050600061271061079e836114c491906138dc565b6114ce9190613a31565b905060006127106106d6846114e391906138dc565b6114ed9190613a31565b905060006127106106d68561150291906138dc565b61150c9190613a31565b905060006127106106d68661152191906138dc565b61152b9190613a31565b905060006127106103e88761154091906138dc565b61154a9190613a31565b905060006127106107088861155f91906138dc565b6115699190613a31565b9050601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc879081150290604051600060405180830381858888f193505050506115cb57600080fd5b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f1935050505061162b57600080fd5b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc859081150290604051600060405180830381858888f1935050505061168b57600080fd5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050506116eb57600080fd5b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f1935050505061174b57600080fd5b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050506117ab57600080fd5b50505050505050565b6117bc612202565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60019054906101000a900460ff166118fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f190613aae565b60405180910390fd5b348160115461190991906138dc565b111561194a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194190613b1a565b60405180910390fd5b60003360405160200161195d9190613b82565b604051602081830303815290604052805190602001209050600115156119c7858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a5484612969565b151514611a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0090613be9565b60405180910390fd5b600082600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a569190613c09565b9050601054811115611a9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9490613cab565b60405180910390fd5b80600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611aeb3384612280565b600e54611af6610c47565b1115611b37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2e906137b5565b60405180910390fd5b5050505050565b600d60009054906101000a900460ff1681565b611b59612202565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc090613d3d565b60405180910390fd5b611bd28161252d565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611c4a611d47565b11158015611c59575060005482105b8015611c86575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6000611d578261229e565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611dc2576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611de3611c8d565b73ffffffffffffffffffffffffffffffffffffffff161480611e125750611e1185611e0c611c8d565b611817565b5b80611e575750611e20611c8d565b73ffffffffffffffffffffffffffffffffffffffff16611e3f84610a1a565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611e90576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611ef7576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f048585856001612980565b611f1060008487611c95565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561219057600054821461218f57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121fb8585856001612986565b5050505050565b61220a611c8d565b73ffffffffffffffffffffffffffffffffffffffff16612228610e6b565b73ffffffffffffffffffffffffffffffffffffffff161461227e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227590613da9565b60405180910390fd5b565b61229a82826040518060200160405280600081525061298c565b5050565b6122a6612e89565b6000829050806122b4611d47565b111580156122c3575060005481105b156124f6576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516124f457600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146123d8578092505050612528565b5b6001156124f357818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146124ee578092505050612528565b6123d9565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261263c611c8d565b8786866040518563ffffffff1660e01b815260040161265e9493929190613e1e565b602060405180830381600087803b15801561267857600080fd5b505af19250505080156126a957506040513d601f19601f820116820180604052508101906126a69190613e7f565b60015b612723573d80600081146126d9576040519150601f19603f3d011682016040523d82523d6000602084013e6126de565b606091505b5060008151141561271b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054612785906136cb565b80601f01602080910402602001604051908101604052809291908181526020018280546127b1906136cb565b80156127fe5780601f106127d3576101008083540402835291602001916127fe565b820191906000526020600020905b8154815290600101906020018083116127e157829003601f168201915b5050505050905090565b60606000821415612850576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612964565b600082905060005b6000821461288257808061286b90613eac565b915050600a8261287b9190613a31565b9150612858565b60008167ffffffffffffffff81111561289e5761289d6133f8565b5b6040519080825280601f01601f1916602001820160405280156128d05781602001600182028036833780820191505090505b5090505b6000851461295d576001826128e99190613ef5565b9150600a856128f89190613f29565b60306129049190613c09565b60f81b81838151811061291a57612919613f5a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129569190613a31565b94506128d4565b8093505050505b919050565b6000826129768584612d50565b1490509392505050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156129f9576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415612a34576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a416000858386612980565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008482019050612c028673ffffffffffffffffffffffffffffffffffffffff166125f3565b15612cc8575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c776000878480600101955087612616565b612cad576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612c08578260005414612cc357600080fd5b612d34565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612cc9575b816000819055505050612d4a6000858386612986565b50505050565b60008082905060005b8451811015612df8576000858281518110612d7757612d76613f5a565b5b60200260200101519050808311612db8578281604051602001612d9b929190613faa565b604051602081830303815290604052805190602001209250612de4565b8083604051602001612dcb929190613faa565b6040516020818303038152906040528051906020012092505b508080612df090613eac565b915050612d59565b508091505092915050565b828054612e0f906136cb565b90600052602060002090601f016020900481019282612e315760008555612e78565b82601f10612e4a57803560ff1916838001178555612e78565b82800160010185558215612e78579182015b82811115612e77578235825591602001919060010190612e5c565b5b509050612e859190612ecc565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612ee5576000816000905550600101612ecd565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612f2882612efd565b9050919050565b612f3881612f1d565b8114612f4357600080fd5b50565b600081359050612f5581612f2f565b92915050565b600060208284031215612f7157612f70612ef3565b5b6000612f7f84828501612f46565b91505092915050565b6000819050919050565b612f9b81612f88565b82525050565b6000602082019050612fb66000830184612f92565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612ff181612fbc565b8114612ffc57600080fd5b50565b60008135905061300e81612fe8565b92915050565b60006020828403121561302a57613029612ef3565b5b600061303884828501612fff565b91505092915050565b60008115159050919050565b61305681613041565b82525050565b6000602082019050613071600083018461304d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156130b1578082015181840152602081019050613096565b838111156130c0576000848401525b50505050565b6000601f19601f8301169050919050565b60006130e282613077565b6130ec8185613082565b93506130fc818560208601613093565b613105816130c6565b840191505092915050565b6000602082019050818103600083015261312a81846130d7565b905092915050565b61313b81612f88565b811461314657600080fd5b50565b60008135905061315881613132565b92915050565b60006020828403121561317457613173612ef3565b5b600061318284828501613149565b91505092915050565b61319481612f1d565b82525050565b60006020820190506131af600083018461318b565b92915050565b600080604083850312156131cc576131cb612ef3565b5b60006131da85828601612f46565b92505060206131eb85828601613149565b9150509250929050565b60008060006060848603121561320e5761320d612ef3565b5b600061321c86828701612f46565b935050602061322d86828701612f46565b925050604061323e86828701613149565b9150509250925092565b6000819050919050565b61325b81613248565b82525050565b60006020820190506132766000830184613252565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126132a1576132a061327c565b5b8235905067ffffffffffffffff8111156132be576132bd613281565b5b6020830191508360018202830111156132da576132d9613286565b5b9250929050565b600080602083850312156132f8576132f7612ef3565b5b600083013567ffffffffffffffff81111561331657613315612ef8565b5b6133228582860161328b565b92509250509250929050565b61333781613248565b811461334257600080fd5b50565b6000813590506133548161332e565b92915050565b6000602082840312156133705761336f612ef3565b5b600061337e84828501613345565b91505092915050565b61339081613041565b811461339b57600080fd5b50565b6000813590506133ad81613387565b92915050565b600080604083850312156133ca576133c9612ef3565b5b60006133d885828601612f46565b92505060206133e98582860161339e565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613430826130c6565b810181811067ffffffffffffffff8211171561344f5761344e6133f8565b5b80604052505050565b6000613462612ee9565b905061346e8282613427565b919050565b600067ffffffffffffffff82111561348e5761348d6133f8565b5b613497826130c6565b9050602081019050919050565b82818337600083830152505050565b60006134c66134c184613473565b613458565b9050828152602081018484840111156134e2576134e16133f3565b5b6134ed8482856134a4565b509392505050565b600082601f83011261350a5761350961327c565b5b813561351a8482602086016134b3565b91505092915050565b6000806000806080858703121561353d5761353c612ef3565b5b600061354b87828801612f46565b945050602061355c87828801612f46565b935050604061356d87828801613149565b925050606085013567ffffffffffffffff81111561358e5761358d612ef8565b5b61359a878288016134f5565b91505092959194509250565b600080604083850312156135bd576135bc612ef3565b5b60006135cb85828601612f46565b92505060206135dc85828601612f46565b9150509250929050565b60008083601f8401126135fc576135fb61327c565b5b8235905067ffffffffffffffff81111561361957613618613281565b5b60208301915083602082028301111561363557613634613286565b5b9250929050565b60008060006040848603121561365557613654612ef3565b5b600084013567ffffffffffffffff81111561367357613672612ef8565b5b61367f868287016135e6565b9350935050602061369286828701613149565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806136e357607f821691505b602082108114156136f7576136f661369c565b5b50919050565b7f546869732065786368616e6765206973206e6f7420616c6c6f7765642e000000600082015250565b6000613733601d83613082565b915061373e826136fd565b602082019050919050565b6000602082019050818103600083015261376281613726565b9050919050565b7f4c696d6974207265616368656400000000000000000000000000000000000000600082015250565b600061379f600d83613082565b91506137aa82613769565b602082019050919050565b600060208201905081810360008301526137ce81613792565b9050919050565b7f53616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b600061380b601283613082565b9150613816826137d5565b602082019050919050565b6000602082019050818103600083015261383a816137fe565b9050919050565b7f596f752063616e2774206d696e742074686174206d616e79206174206f6e6365600082015250565b6000613877602083613082565b915061388282613841565b602082019050919050565b600060208201905081810360008301526138a68161386a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006138e782612f88565b91506138f283612f88565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561392b5761392a6138ad565b5b828202905092915050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b600061396c601f83613082565b915061397782613936565b602082019050919050565b6000602082019050818103600083015261399b8161395f565b9050919050565b600081905092915050565b60006139b882613077565b6139c281856139a2565b93506139d2818560208601613093565b80840191505092915050565b60006139ea82856139ad565b91506139f682846139ad565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613a3c82612f88565b9150613a4783612f88565b925082613a5757613a56613a02565b5b828204905092915050565b7f57686974656c6973742073616c65206973206e6f742061637469766500000000600082015250565b6000613a98601c83613082565b9150613aa382613a62565b602082019050919050565b60006020820190508181036000830152613ac781613a8b565b9050919050565b7f45746865722076616c756520696e636f72726563740000000000000000000000600082015250565b6000613b04601583613082565b9150613b0f82613ace565b602082019050919050565b60006020820190508181036000830152613b3381613af7565b9050919050565b60008160601b9050919050565b6000613b5282613b3a565b9050919050565b6000613b6482613b47565b9050919050565b613b7c613b7782612f1d565b613b59565b82525050565b6000613b8e8284613b6b565b60148201915081905092915050565b7f496e636f7272656374204d65726b6c652050726f6f6600000000000000000000600082015250565b6000613bd3601683613082565b9150613bde82613b9d565b602082019050919050565b60006020820190508181036000830152613c0281613bc6565b9050919050565b6000613c1482612f88565b9150613c1f83612f88565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c5457613c536138ad565b5b828201905092915050565b7f596f752063616e2774206d696e742074686174206d616e790000000000000000600082015250565b6000613c95601883613082565b9150613ca082613c5f565b602082019050919050565b60006020820190508181036000830152613cc481613c88565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613d27602683613082565b9150613d3282613ccb565b604082019050919050565b60006020820190508181036000830152613d5681613d1a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613d93602083613082565b9150613d9e82613d5d565b602082019050919050565b60006020820190508181036000830152613dc281613d86565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613df082613dc9565b613dfa8185613dd4565b9350613e0a818560208601613093565b613e13816130c6565b840191505092915050565b6000608082019050613e33600083018761318b565b613e40602083018661318b565b613e4d6040830185612f92565b8181036060830152613e5f8184613de5565b905095945050505050565b600081519050613e7981612fe8565b92915050565b600060208284031215613e9557613e94612ef3565b5b6000613ea384828501613e6a565b91505092915050565b6000613eb782612f88565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613eea57613ee96138ad565b5b600182019050919050565b6000613f0082612f88565b9150613f0b83612f88565b925082821015613f1e57613f1d6138ad565b5b828203905092915050565b6000613f3482612f88565b9150613f3f83612f88565b925082613f4f57613f4e613a02565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b613fa4613f9f82613248565b613f89565b82525050565b6000613fb68285613f93565b602082019150613fc68284613f93565b602082019150819050939250505056fea264697066735822122051604abac4647200417737fd767d89f2fa273291883517e53c126cbd43dfacf664736f6c63430008090033

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

6ee6dc0c8ffddca9f889fb352fd6f145e5d453a2908ad19611a8d40a359c9bf0

-----Decoded View---------------
Arg [0] : merkleRoot_ (bytes32): 0x6ee6dc0c8ffddca9f889fb352fd6f145e5d453a2908ad19611a8d40a359c9bf0

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 6ee6dc0c8ffddca9f889fb352fd6f145e5d453a2908ad19611a8d40a359c9bf0


Deployed Bytecode Sourcemap

48259:5406:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48427:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25013:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28126:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29322:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52713:444;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48689:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48524:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24262:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29978:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50086:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48339:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49865:89;;;;;;;;;;;;;:::i;:::-;;30219:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48612:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49751:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48574:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27934:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48648:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25382:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45200:103;;;;;;;;;;;;;:::i;:::-;;48734:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53556:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44552:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51143:484;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28295:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53165:383;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51635:114;;;;;;;;;;;;;:::i;:::-;;48373:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30475:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52467:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28470:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49962:116;;;;;;;;;;;;;:::i;:::-;;51757:702;;;;;;;;;;;;;:::i;:::-;;52588:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29747:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50281:854;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48485:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45458:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48427:49;;;;;;;;;;;;;;;;;:::o;25013:305::-;25115:4;25167:25;25152:40;;;:11;:40;;;;:105;;;;25224:33;25209:48;;;:11;:48;;;;25152:105;:158;;;;25274:36;25298:11;25274:23;:36::i;:::-;25152:158;25132:178;;25013:305;;;:::o;28126:100::-;28180:13;28213:5;28206:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28126:100;:::o;29322:204::-;29390:7;29415:16;29423:7;29415;:16::i;:::-;29410:64;;29440:34;;;;;;;;;;;;;;29410:64;29494:15;:24;29510:7;29494:24;;;;;;;;;;;;;;;;;;;;;29487:31;;29322:204;;;:::o;52713:444::-;52786:13;52802:24;52818:7;52802:15;:24::i;:::-;52786:40;;52847:5;52841:11;;:2;:11;;;52837:48;;;52861:24;;;;;;;;;;;;;;52837:48;52918:5;52902:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;52928:37;52945:5;52952:12;:10;:12::i;:::-;52928:16;:37::i;:::-;52927:38;52902:63;52898:138;;;52989:35;;;;;;;;;;;;;;52898:138;53055:15;:19;53071:2;53055:19;;;;;;;;;;;;;;;;;;;;;;;;;53054:20;53046:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;53121:28;53130:2;53134:7;53143:5;53121:8;:28::i;:::-;52775:382;52713:444;;:::o;48689:36::-;;;;:::o;48524:41::-;;;;;;;;;;;;;:::o;24262:303::-;24306:7;24531:15;:13;:15::i;:::-;24516:12;;24500:13;;:28;:46;24493:53;;24262:303;:::o;29978:170::-;30112:28;30122:4;30128:2;30132:7;30112:9;:28::i;:::-;29978:170;;;:::o;50086:187::-;44438:13;:11;:13::i;:::-;50165:37:::1;50175:10;50187:14;50165:9;:37::i;:::-;50238:9;;50221:13;:11;:13::i;:::-;:26;;50213:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;50086:187:::0;:::o;48339:25::-;;;;:::o;49865:89::-;44438:13;:11;:13::i;:::-;49934:12:::1;;;;;;;;;;;49933:13;49918:12;;:28;;;;;;;;;;;;;;;;;;49865:89::o:0;30219:185::-;30357:39;30374:4;30380:2;30384:7;30357:39;;;;;;;;;;;;:16;:39::i;:::-;30219:185;;;:::o;48612:29::-;;;;:::o;49751:106::-;44438:13;:11;:13::i;:::-;49842:7:::1;;49826:13;:23;;;;;;;:::i;:::-;;49751:106:::0;;:::o;48574:31::-;;;;:::o;27934:125::-;27998:7;28025:21;28038:7;28025:12;:21::i;:::-;:26;;;28018:33;;27934:125;;;:::o;48648:34::-;;;;:::o;25382:206::-;25446:7;25487:1;25470:19;;:5;:19;;;25466:60;;;25498:28;;;;;;;;;;;;;;25466:60;25552:12;:19;25565:5;25552:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;25544:36;;25537:43;;25382:206;;;:::o;45200:103::-;44438:13;:11;:13::i;:::-;45265:30:::1;45292:1;45265:18;:30::i;:::-;45200:103::o:0;48734:34::-;;;;:::o;53556:106::-;44438:13;:11;:13::i;:::-;53643:11:::1;53630:10;:24;;;;53556:106:::0;:::o;44552:87::-;44598:7;44625:6;;;;;;;;;;;44618:13;;44552:87;:::o;51143:484::-;51218:12;;;;;;;;;;;51210:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;51304:10;;51286:14;:28;;51264:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;51436:9;51418:14;51407:8;;:25;;;;:::i;:::-;:38;;51385:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;51517:37;51527:10;51539:14;51517:9;:37::i;:::-;51592:9;;51575:13;:11;:13::i;:::-;:26;;51567:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;51143:484;:::o;28295:104::-;28351:13;28384:7;28377:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28295:104;:::o;53165:383::-;53284:15;:25;53300:8;53284:25;;;;;;;;;;;;;;;;;;;;;;;;;53283:26;53275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53372:12;:10;:12::i;:::-;53360:24;;:8;:24;;;53356:54;;;53393:17;;;;;;;;;;;;;;53356:54;53468:8;53423:18;:32;53442:12;:10;:12::i;:::-;53423:32;;;;;;;;;;;;;;;:42;53456:8;53423:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;53521:8;53492:48;;53507:12;:10;:12::i;:::-;53492:48;;;53531:8;53492:48;;;;;;:::i;:::-;;;;;;;;53165:383;;:::o;51635:114::-;44438:13;:11;:13::i;:::-;51698:10:::1;51690:28;;:51;51719:21;51690:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;51635:114::o:0;48373:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;30475:369::-;30642:28;30652:4;30658:2;30662:7;30642:9;:28::i;:::-;30685:15;:2;:13;;;:15::i;:::-;:76;;;;;30705:56;30736:4;30742:2;30746:7;30755:5;30705:30;:56::i;:::-;30704:57;30685:76;30681:156;;;30785:40;;;;;;;;;;;;;;30681:156;30475:369;;;;:::o;52467:113::-;44438:13;:11;:13::i;:::-;52568:4:::1;52541:15;:24;52557:7;52541:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;52467:113:::0;:::o;28470:318::-;28543:13;28574:16;28582:7;28574;:16::i;:::-;28569:59;;28599:29;;;;;;;;;;;;;;28569:59;28641:21;28665:10;:8;:10::i;:::-;28641:34;;28718:1;28699:7;28693:21;:26;;:87;;;;;;;;;;;;;;;;;28746:7;28755:18;:7;:16;:18::i;:::-;28729:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28693:87;28686:94;;;28470:318;;;:::o;49962:116::-;44438:13;:11;:13::i;:::-;50049:21:::1;;;;;;;;;;;50048:22;50024:21;;:46;;;;;;;;;;;;;;;;;;49962:116::o:0;51757:702::-;44438:13;:11;:13::i;:::-;51808:14:::1;51856:3;51850:2;51826:21;:26;;;;:::i;:::-;51825:34;;;;:::i;:::-;51808:51;;51872:11;51904:5;51896:4;51887:6;:13;;;;:::i;:::-;51886:23;;;;:::i;:::-;51872:37;;51920:11;51952:5;51944:4;51935:6;:13;;;;:::i;:::-;51934:23;;;;:::i;:::-;51920:37;;51968:12;52001:5;51993:4;51984:6;:13;;;;:::i;:::-;51983:23;;;;:::i;:::-;51968:38;;52017:12;52050:5;52042:4;52033:6;:13;;;;:::i;:::-;52032:23;;;;:::i;:::-;52017:38;;52066:13;52100:5;52092:4;52083:6;:13;;;;:::i;:::-;52082:23;;;;:::i;:::-;52066:39;;52116:11;52148:5;52140:4;52131:6;:13;;;;:::i;:::-;52130:23;;;;:::i;:::-;52116:37;;52182:9;;;;;;;;;;;52174:23;;:28;52198:3;52174:28;;;;;;;;;;;;;;;;;;;;;;;52166:37;;;::::0;::::1;;52230:9;;;;;;;;;;;52222:23;;:28;52246:3;52222:28;;;;;;;;;;;;;;;;;;;;;;;52214:37;;;::::0;::::1;;52278:10;;;;;;;;;;;52270:24;;:30;52295:4;52270:30;;;;;;;;;;;;;;;;;;;;;;;52262:39;;;::::0;::::1;;52328:9;;;;;;;;;;;52320:23;;:28;52344:3;52320:28;;;;;;;;;;;;;;;;;;;;;;;52312:37;;;::::0;::::1;;52376:10;;;;;;;;;;;52368:24;;:30;52393:4;52368:30;;;;;;;;;;;;;;;;;;;;;;;52360:39;;;::::0;::::1;;52426:11;;;;;;;;;;;52418:25;;:32;52444:5;52418:32;;;;;;;;;;;;;;;;;;;;;;;52410:41;;;::::0;::::1;;51797:662;;;;;;;51757:702::o:0;52588:117::-;44438:13;:11;:13::i;:::-;52692:5:::1;52665:15;:24;52681:7;52665:24;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;52588:117:::0;:::o;29747:164::-;29844:4;29868:18;:25;29887:5;29868:25;;;;;;;;;;;;;;;:35;29894:8;29868:35;;;;;;;;;;;;;;;;;;;;;;;;;29861:42;;29747:164;;;;:::o;50281:854::-;50423:21;;;;;;;;;;;50415:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;50539:9;50521:14;50510:8;;:25;;;;:::i;:::-;:38;;50488:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;50608:12;50650:10;50633:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;50623:39;;;;;;50608:54;;50749:4;50695:58;;:50;50714:12;;50695:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50728:10;;50740:4;50695:18;:50::i;:::-;:58;;;50673:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;50816:19;50867:14;50838;:26;50853:10;50838:26;;;;;;;;;;;;;;;;:43;;;;:::i;:::-;50816:65;;50915:15;;50900:11;:30;;50892:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;51001:11;50972:14;:26;50987:10;50972:26;;;;;;;;;;;;;;;:40;;;;51025:37;51035:10;51047:14;51025:9;:37::i;:::-;51100:9;;51083:13;:11;:13::i;:::-;:26;;51075:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;50404:731;;50281:854;;;:::o;48485:32::-;;;;;;;;;;;;;:::o;45458:201::-;44438:13;:11;:13::i;:::-;45567:1:::1;45547:22;;:8;:22;;;;45539:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;45623:28;45642:8;45623:18;:28::i;:::-;45458:201:::0;:::o;20587:157::-;20672:4;20711:25;20696:40;;;:11;:40;;;;20689:47;;20587:157;;;:::o;31099:174::-;31156:4;31199:7;31180:15;:13;:15::i;:::-;:26;;:53;;;;;31220:13;;31210:7;:23;31180:53;:85;;;;;31238:11;:20;31250:7;31238:20;;;;;;;;;;;:27;;;;;;;;;;;;31237:28;31180:85;31173:92;;31099:174;;;:::o;16997:98::-;17050:7;17077:10;17070:17;;16997:98;:::o;40324:197::-;40467:2;40440:15;:24;40456:7;40440:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;40505:7;40501:2;40485:28;;40494:5;40485:28;;;;;;;;;;;;40324:197;;;:::o;24036:92::-;24092:7;24036:92;:::o;35272:2130::-;35387:35;35425:21;35438:7;35425:12;:21::i;:::-;35387:59;;35485:4;35463:26;;:13;:18;;;:26;;;35459:67;;35498:28;;;;;;;;;;;;;;35459:67;35539:22;35581:4;35565:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;35602:36;35619:4;35625:12;:10;:12::i;:::-;35602:16;:36::i;:::-;35565:73;:126;;;;35679:12;:10;:12::i;:::-;35655:36;;:20;35667:7;35655:11;:20::i;:::-;:36;;;35565:126;35539:153;;35710:17;35705:66;;35736:35;;;;;;;;;;;;;;35705:66;35800:1;35786:16;;:2;:16;;;35782:52;;;35811:23;;;;;;;;;;;;;;35782:52;35847:43;35869:4;35875:2;35879:7;35888:1;35847:21;:43::i;:::-;35955:35;35972:1;35976:7;35985:4;35955:8;:35::i;:::-;36316:1;36286:12;:18;36299:4;36286:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36360:1;36332:12;:16;36345:2;36332:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36378:31;36412:11;:20;36424:7;36412:20;;;;;;;;;;;36378:54;;36463:2;36447:8;:13;;;:18;;;;;;;;;;;;;;;;;;36513:15;36480:8;:23;;;:49;;;;;;;;;;;;;;;;;;36781:19;36813:1;36803:7;:11;36781:33;;36829:31;36863:11;:24;36875:11;36863:24;;;;;;;;;;;36829:58;;36931:1;36906:27;;:8;:13;;;;;;;;;;;;:27;;;36902:384;;;37116:13;;37101:11;:28;37097:174;;37170:4;37154:8;:13;;;:20;;;;;;;;;;;;;;;;;;37223:13;:28;;;37197:8;:23;;;:54;;;;;;;;;;;;;;;;;;37097:174;36902:384;36261:1036;;;37333:7;37329:2;37314:27;;37323:4;37314:27;;;;;;;;;;;;37352:42;37373:4;37379:2;37383:7;37392:1;37352:20;:42::i;:::-;35376:2026;;35272:2130;;;:::o;44717:132::-;44792:12;:10;:12::i;:::-;44781:23;;:7;:5;:7::i;:::-;:23;;;44773:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44717:132::o;31357:104::-;31426:27;31436:2;31440:8;31426:27;;;;;;;;;;;;:9;:27::i;:::-;31357:104;;:::o;26763:1109::-;26825:21;;:::i;:::-;26859:12;26874:7;26859:22;;26942:4;26923:15;:13;:15::i;:::-;:23;;:47;;;;;26957:13;;26950:4;:20;26923:47;26919:886;;;26991:31;27025:11;:17;27037:4;27025:17;;;;;;;;;;;26991:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27066:9;:16;;;27061:729;;27137:1;27111:28;;:9;:14;;;:28;;;27107:101;;27175:9;27168:16;;;;;;27107:101;27510:261;27517:4;27510:261;;;27550:6;;;;;;;;27595:11;:17;27607:4;27595:17;;;;;;;;;;;27583:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27669:1;27643:28;;:9;:14;;;:28;;;27639:109;;27711:9;27704:16;;;;;;27639:109;27510:261;;;27061:729;26972:833;26919:886;27833:31;;;;;;;;;;;;;;26763:1109;;;;:::o;45819:191::-;45893:16;45912:6;;;;;;;;;;;45893:25;;45938:8;45929:6;;:17;;;;;;;;;;;;;;;;;;45993:8;45962:40;;45983:8;45962:40;;;;;;;;;;;;45882:128;45819:191;:::o;8990:326::-;9050:4;9307:1;9285:7;:19;;;:23;9278:30;;8990:326;;;:::o;41013:667::-;41176:4;41213:2;41197:36;;;41234:12;:10;:12::i;:::-;41248:4;41254:7;41263:5;41197:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41193:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41448:1;41431:6;:13;:18;41427:235;;;41477:40;;;;;;;;;;;;;;41427:235;41620:6;41614:13;41605:6;41601:2;41597:15;41590:38;41193:480;41326:45;;;41316:55;;;:6;:55;;;;41309:62;;;41013:667;;;;;;:::o;49629:114::-;49689:13;49722;49715:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49629:114;:::o;17649:723::-;17705:13;17935:1;17926:5;:10;17922:53;;;17953:10;;;;;;;;;;;;;;;;;;;;;17922:53;17985:12;18000:5;17985:20;;18016:14;18041:78;18056:1;18048:4;:9;18041:78;;18074:8;;;;;:::i;:::-;;;;18105:2;18097:10;;;;;:::i;:::-;;;18041:78;;;18129:19;18161:6;18151:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18129:39;;18179:154;18195:1;18186:5;:10;18179:154;;18223:1;18213:11;;;;;:::i;:::-;;;18290:2;18282:5;:10;;;;:::i;:::-;18269:2;:24;;;;:::i;:::-;18256:39;;18239:6;18246;18239:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18319:2;18310:11;;;;;:::i;:::-;;;18179:154;;;18357:6;18343:21;;;;;17649:723;;;;:::o;46893:190::-;47018:4;47071;47042:25;47055:5;47062:4;47042:12;:25::i;:::-;:33;47035:40;;46893:190;;;;;:::o;42328:159::-;;;;;:::o;43146:158::-;;;;;:::o;31834:1751::-;31957:20;31980:13;;31957:36;;32022:1;32008:16;;:2;:16;;;32004:48;;;32033:19;;;;;;;;;;;;;;32004:48;32079:1;32067:8;:13;32063:44;;;32089:18;;;;;;;;;;;;;;32063:44;32120:61;32150:1;32154:2;32158:12;32172:8;32120:21;:61::i;:::-;32493:8;32458:12;:16;32471:2;32458:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32557:8;32517:12;:16;32530:2;32517:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32616:2;32583:11;:25;32595:12;32583:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;32683:15;32633:11;:25;32645:12;32633:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;32716:20;32739:12;32716:35;;32766:11;32795:8;32780:12;:23;32766:37;;32824:15;:2;:13;;;:15::i;:::-;32820:633;;;32860:314;32916:12;32912:2;32891:38;;32908:1;32891:38;;;;;;;;;;;;32957:69;32996:1;33000:2;33004:14;;;;;;33020:5;32957:30;:69::i;:::-;32952:174;;33062:40;;;;;;;;;;;;;;32952:174;33169:3;33153:12;:19;;32860:314;;33255:12;33238:13;;:29;33234:43;;33269:8;;;33234:43;32820:633;;;33318:120;33374:14;;;;;;33370:2;33349:40;;33366:1;33349:40;;;;;;;;;;;;33433:3;33417:12;:19;;33318:120;;32820:633;33483:12;33467:13;:28;;;;32433:1074;;33517:60;33546:1;33550:2;33554:12;33568:8;33517:20;:60::i;:::-;31946:1639;31834:1751;;;:::o;47445:701::-;47528:7;47548:20;47571:4;47548:27;;47591:9;47586:523;47610:5;:12;47606:1;:16;47586:523;;;47644:20;47667:5;47673:1;47667:8;;;;;;;;:::i;:::-;;;;;;;;47644:31;;47710:12;47694;:28;47690:408;;47864:12;47878;47847:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47837:55;;;;;;47822:70;;47690:408;;;48054:12;48068;48037:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48027:55;;;;;;48012:70;;47690:408;47629:480;47624:3;;;;;:::i;:::-;;;;47586:523;;;;48126:12;48119:19;;;47445:701;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::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:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:77::-;1213:7;1242:5;1231:16;;1176:77;;;:::o;1259:118::-;1346:24;1364:5;1346:24;:::i;:::-;1341:3;1334:37;1259:118;;:::o;1383:222::-;1476:4;1514:2;1503:9;1499:18;1491:26;;1527:71;1595:1;1584:9;1580:17;1571:6;1527:71;:::i;:::-;1383:222;;;;:::o;1611:149::-;1647:7;1687:66;1680:5;1676:78;1665:89;;1611:149;;;:::o;1766:120::-;1838:23;1855:5;1838:23;:::i;:::-;1831:5;1828:34;1818:62;;1876:1;1873;1866:12;1818:62;1766:120;:::o;1892:137::-;1937:5;1975:6;1962:20;1953:29;;1991:32;2017:5;1991:32;:::i;:::-;1892:137;;;;:::o;2035:327::-;2093:6;2142:2;2130:9;2121:7;2117:23;2113:32;2110:119;;;2148:79;;:::i;:::-;2110:119;2268:1;2293:52;2337:7;2328:6;2317:9;2313:22;2293:52;:::i;:::-;2283:62;;2239:116;2035:327;;;;:::o;2368:90::-;2402:7;2445:5;2438:13;2431:21;2420:32;;2368:90;;;:::o;2464:109::-;2545:21;2560:5;2545:21;:::i;:::-;2540:3;2533:34;2464:109;;:::o;2579:210::-;2666:4;2704:2;2693:9;2689:18;2681:26;;2717:65;2779:1;2768:9;2764:17;2755:6;2717:65;:::i;:::-;2579:210;;;;:::o;2795:99::-;2847:6;2881:5;2875:12;2865:22;;2795:99;;;:::o;2900:169::-;2984:11;3018:6;3013:3;3006:19;3058:4;3053:3;3049:14;3034:29;;2900:169;;;;:::o;3075:307::-;3143:1;3153:113;3167:6;3164:1;3161:13;3153:113;;;3252:1;3247:3;3243:11;3237:18;3233:1;3228:3;3224:11;3217:39;3189:2;3186:1;3182:10;3177:15;;3153:113;;;3284:6;3281:1;3278:13;3275:101;;;3364:1;3355:6;3350:3;3346:16;3339:27;3275:101;3124:258;3075:307;;;:::o;3388:102::-;3429:6;3480:2;3476:7;3471:2;3464:5;3460:14;3456:28;3446:38;;3388:102;;;:::o;3496:364::-;3584:3;3612:39;3645:5;3612:39;:::i;:::-;3667:71;3731:6;3726:3;3667:71;:::i;:::-;3660:78;;3747:52;3792:6;3787:3;3780:4;3773:5;3769:16;3747:52;:::i;:::-;3824:29;3846:6;3824:29;:::i;:::-;3819:3;3815:39;3808:46;;3588:272;3496:364;;;;:::o;3866:313::-;3979:4;4017:2;4006:9;4002:18;3994:26;;4066:9;4060:4;4056:20;4052:1;4041:9;4037:17;4030:47;4094:78;4167:4;4158:6;4094:78;:::i;:::-;4086:86;;3866:313;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:329::-;4517:6;4566:2;4554:9;4545:7;4541:23;4537:32;4534:119;;;4572:79;;:::i;:::-;4534:119;4692:1;4717:53;4762:7;4753:6;4742:9;4738:22;4717:53;:::i;:::-;4707:63;;4663:117;4458:329;;;;:::o;4793:118::-;4880:24;4898:5;4880:24;:::i;:::-;4875:3;4868:37;4793:118;;:::o;4917:222::-;5010:4;5048:2;5037:9;5033:18;5025:26;;5061:71;5129:1;5118:9;5114:17;5105:6;5061:71;:::i;:::-;4917:222;;;;:::o;5145:474::-;5213:6;5221;5270:2;5258:9;5249:7;5245:23;5241:32;5238:119;;;5276:79;;:::i;:::-;5238:119;5396:1;5421:53;5466:7;5457:6;5446:9;5442:22;5421:53;:::i;:::-;5411:63;;5367:117;5523:2;5549:53;5594:7;5585:6;5574:9;5570:22;5549:53;:::i;:::-;5539:63;;5494:118;5145:474;;;;;:::o;5625:619::-;5702:6;5710;5718;5767:2;5755:9;5746:7;5742:23;5738:32;5735:119;;;5773:79;;:::i;:::-;5735:119;5893:1;5918:53;5963:7;5954:6;5943:9;5939:22;5918:53;:::i;:::-;5908:63;;5864:117;6020:2;6046:53;6091:7;6082:6;6071:9;6067:22;6046:53;:::i;:::-;6036:63;;5991:118;6148:2;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6119:118;5625:619;;;;;:::o;6250:77::-;6287:7;6316:5;6305:16;;6250:77;;;:::o;6333:118::-;6420:24;6438:5;6420:24;:::i;:::-;6415:3;6408:37;6333:118;;:::o;6457:222::-;6550:4;6588:2;6577:9;6573:18;6565:26;;6601:71;6669:1;6658:9;6654:17;6645:6;6601:71;:::i;:::-;6457:222;;;;:::o;6685:117::-;6794:1;6791;6784:12;6808:117;6917:1;6914;6907:12;6931:117;7040:1;7037;7030:12;7068:553;7126:8;7136:6;7186:3;7179:4;7171:6;7167:17;7163:27;7153:122;;7194:79;;:::i;:::-;7153:122;7307:6;7294:20;7284:30;;7337:18;7329:6;7326:30;7323:117;;;7359:79;;:::i;:::-;7323:117;7473:4;7465:6;7461:17;7449:29;;7527:3;7519:4;7511:6;7507:17;7497:8;7493:32;7490:41;7487:128;;;7534:79;;:::i;:::-;7487:128;7068:553;;;;;:::o;7627:529::-;7698:6;7706;7755:2;7743:9;7734:7;7730:23;7726:32;7723:119;;;7761:79;;:::i;:::-;7723:119;7909:1;7898:9;7894:17;7881:31;7939:18;7931:6;7928:30;7925:117;;;7961:79;;:::i;:::-;7925:117;8074:65;8131:7;8122:6;8111:9;8107:22;8074:65;:::i;:::-;8056:83;;;;7852:297;7627:529;;;;;:::o;8162:122::-;8235:24;8253:5;8235:24;:::i;:::-;8228:5;8225:35;8215:63;;8274:1;8271;8264:12;8215:63;8162:122;:::o;8290:139::-;8336:5;8374:6;8361:20;8352:29;;8390:33;8417:5;8390:33;:::i;:::-;8290:139;;;;:::o;8435:329::-;8494:6;8543:2;8531:9;8522:7;8518:23;8514:32;8511:119;;;8549:79;;:::i;:::-;8511:119;8669:1;8694:53;8739:7;8730:6;8719:9;8715:22;8694:53;:::i;:::-;8684:63;;8640:117;8435:329;;;;:::o;8770:116::-;8840:21;8855:5;8840:21;:::i;:::-;8833:5;8830:32;8820:60;;8876:1;8873;8866:12;8820:60;8770:116;:::o;8892:133::-;8935:5;8973:6;8960:20;8951:29;;8989:30;9013:5;8989:30;:::i;:::-;8892:133;;;;:::o;9031:468::-;9096:6;9104;9153:2;9141:9;9132:7;9128:23;9124:32;9121:119;;;9159:79;;:::i;:::-;9121:119;9279:1;9304:53;9349:7;9340:6;9329:9;9325:22;9304:53;:::i;:::-;9294:63;;9250:117;9406:2;9432:50;9474:7;9465:6;9454:9;9450:22;9432:50;:::i;:::-;9422:60;;9377:115;9031:468;;;;;:::o;9505:117::-;9614:1;9611;9604:12;9628:180;9676:77;9673:1;9666:88;9773:4;9770:1;9763:15;9797:4;9794:1;9787:15;9814:281;9897:27;9919:4;9897:27;:::i;:::-;9889:6;9885:40;10027:6;10015:10;10012:22;9991:18;9979:10;9976:34;9973:62;9970:88;;;10038:18;;:::i;:::-;9970:88;10078:10;10074:2;10067:22;9857:238;9814:281;;:::o;10101:129::-;10135:6;10162:20;;:::i;:::-;10152:30;;10191:33;10219:4;10211:6;10191:33;:::i;:::-;10101:129;;;:::o;10236:307::-;10297:4;10387:18;10379:6;10376:30;10373:56;;;10409:18;;:::i;:::-;10373:56;10447:29;10469:6;10447:29;:::i;:::-;10439:37;;10531:4;10525;10521:15;10513:23;;10236:307;;;:::o;10549:154::-;10633:6;10628:3;10623;10610:30;10695:1;10686:6;10681:3;10677:16;10670:27;10549:154;;;:::o;10709:410::-;10786:5;10811:65;10827:48;10868:6;10827:48;:::i;:::-;10811:65;:::i;:::-;10802:74;;10899:6;10892:5;10885:21;10937:4;10930:5;10926:16;10975:3;10966:6;10961:3;10957:16;10954:25;10951:112;;;10982:79;;:::i;:::-;10951:112;11072:41;11106:6;11101:3;11096;11072:41;:::i;:::-;10792:327;10709:410;;;;;:::o;11138:338::-;11193:5;11242:3;11235:4;11227:6;11223:17;11219:27;11209:122;;11250:79;;:::i;:::-;11209:122;11367:6;11354:20;11392:78;11466:3;11458:6;11451:4;11443:6;11439:17;11392:78;:::i;:::-;11383:87;;11199:277;11138:338;;;;:::o;11482:943::-;11577:6;11585;11593;11601;11650:3;11638:9;11629:7;11625:23;11621:33;11618:120;;;11657:79;;:::i;:::-;11618:120;11777:1;11802:53;11847:7;11838:6;11827:9;11823:22;11802:53;:::i;:::-;11792:63;;11748:117;11904:2;11930:53;11975:7;11966:6;11955:9;11951:22;11930:53;:::i;:::-;11920:63;;11875:118;12032:2;12058:53;12103:7;12094:6;12083:9;12079:22;12058:53;:::i;:::-;12048:63;;12003:118;12188:2;12177:9;12173:18;12160:32;12219:18;12211:6;12208:30;12205:117;;;12241:79;;:::i;:::-;12205:117;12346:62;12400:7;12391:6;12380:9;12376:22;12346:62;:::i;:::-;12336:72;;12131:287;11482:943;;;;;;;:::o;12431:474::-;12499:6;12507;12556:2;12544:9;12535:7;12531:23;12527:32;12524:119;;;12562:79;;:::i;:::-;12524:119;12682:1;12707:53;12752:7;12743:6;12732:9;12728:22;12707:53;:::i;:::-;12697:63;;12653:117;12809:2;12835:53;12880:7;12871:6;12860:9;12856:22;12835:53;:::i;:::-;12825:63;;12780:118;12431:474;;;;;:::o;12928:568::-;13001:8;13011:6;13061:3;13054:4;13046:6;13042:17;13038:27;13028:122;;13069:79;;:::i;:::-;13028:122;13182:6;13169:20;13159:30;;13212:18;13204:6;13201:30;13198:117;;;13234:79;;:::i;:::-;13198:117;13348:4;13340:6;13336:17;13324:29;;13402:3;13394:4;13386:6;13382:17;13372:8;13368:32;13365:41;13362:128;;;13409:79;;:::i;:::-;13362:128;12928:568;;;;;:::o;13502:704::-;13597:6;13605;13613;13662:2;13650:9;13641:7;13637:23;13633:32;13630:119;;;13668:79;;:::i;:::-;13630:119;13816:1;13805:9;13801:17;13788:31;13846:18;13838:6;13835:30;13832:117;;;13868:79;;:::i;:::-;13832:117;13981:80;14053:7;14044:6;14033:9;14029:22;13981:80;:::i;:::-;13963:98;;;;13759:312;14110:2;14136:53;14181:7;14172:6;14161:9;14157:22;14136:53;:::i;:::-;14126:63;;14081:118;13502:704;;;;;:::o;14212:180::-;14260:77;14257:1;14250:88;14357:4;14354:1;14347:15;14381:4;14378:1;14371:15;14398:320;14442:6;14479:1;14473:4;14469:12;14459:22;;14526:1;14520:4;14516:12;14547:18;14537:81;;14603:4;14595:6;14591:17;14581:27;;14537:81;14665:2;14657:6;14654:14;14634:18;14631:38;14628:84;;;14684:18;;:::i;:::-;14628:84;14449:269;14398:320;;;:::o;14724:179::-;14864:31;14860:1;14852:6;14848:14;14841:55;14724:179;:::o;14909:366::-;15051:3;15072:67;15136:2;15131:3;15072:67;:::i;:::-;15065:74;;15148:93;15237:3;15148:93;:::i;:::-;15266:2;15261:3;15257:12;15250:19;;14909:366;;;:::o;15281:419::-;15447:4;15485:2;15474:9;15470:18;15462:26;;15534:9;15528:4;15524:20;15520:1;15509:9;15505:17;15498:47;15562:131;15688:4;15562:131;:::i;:::-;15554:139;;15281:419;;;:::o;15706:163::-;15846:15;15842:1;15834:6;15830:14;15823:39;15706:163;:::o;15875:366::-;16017:3;16038:67;16102:2;16097:3;16038:67;:::i;:::-;16031:74;;16114:93;16203:3;16114:93;:::i;:::-;16232:2;16227:3;16223:12;16216:19;;15875:366;;;:::o;16247:419::-;16413:4;16451:2;16440:9;16436:18;16428:26;;16500:9;16494:4;16490:20;16486:1;16475:9;16471:17;16464:47;16528:131;16654:4;16528:131;:::i;:::-;16520:139;;16247:419;;;:::o;16672:168::-;16812:20;16808:1;16800:6;16796:14;16789:44;16672:168;:::o;16846:366::-;16988:3;17009:67;17073:2;17068:3;17009:67;:::i;:::-;17002:74;;17085:93;17174:3;17085:93;:::i;:::-;17203:2;17198:3;17194:12;17187:19;;16846:366;;;:::o;17218:419::-;17384:4;17422:2;17411:9;17407:18;17399:26;;17471:9;17465:4;17461:20;17457:1;17446:9;17442:17;17435:47;17499:131;17625:4;17499:131;:::i;:::-;17491:139;;17218:419;;;:::o;17643:182::-;17783:34;17779:1;17771:6;17767:14;17760:58;17643:182;:::o;17831:366::-;17973:3;17994:67;18058:2;18053:3;17994:67;:::i;:::-;17987:74;;18070:93;18159:3;18070:93;:::i;:::-;18188:2;18183:3;18179:12;18172:19;;17831:366;;;:::o;18203:419::-;18369:4;18407:2;18396:9;18392:18;18384:26;;18456:9;18450:4;18446:20;18442:1;18431:9;18427:17;18420:47;18484:131;18610:4;18484:131;:::i;:::-;18476:139;;18203:419;;;:::o;18628:180::-;18676:77;18673:1;18666:88;18773:4;18770:1;18763:15;18797:4;18794:1;18787:15;18814:348;18854:7;18877:20;18895:1;18877:20;:::i;:::-;18872:25;;18911:20;18929:1;18911:20;:::i;:::-;18906:25;;19099:1;19031:66;19027:74;19024:1;19021:81;19016:1;19009:9;19002:17;18998:105;18995:131;;;19106:18;;:::i;:::-;18995:131;19154:1;19151;19147:9;19136:20;;18814:348;;;;:::o;19168:181::-;19308:33;19304:1;19296:6;19292:14;19285:57;19168:181;:::o;19355:366::-;19497:3;19518:67;19582:2;19577:3;19518:67;:::i;:::-;19511:74;;19594:93;19683:3;19594:93;:::i;:::-;19712:2;19707:3;19703:12;19696:19;;19355:366;;;:::o;19727:419::-;19893:4;19931:2;19920:9;19916:18;19908:26;;19980:9;19974:4;19970:20;19966:1;19955:9;19951:17;19944:47;20008:131;20134:4;20008:131;:::i;:::-;20000:139;;19727:419;;;:::o;20152:148::-;20254:11;20291:3;20276:18;;20152:148;;;;:::o;20306:377::-;20412:3;20440:39;20473:5;20440:39;:::i;:::-;20495:89;20577:6;20572:3;20495:89;:::i;:::-;20488:96;;20593:52;20638:6;20633:3;20626:4;20619:5;20615:16;20593:52;:::i;:::-;20670:6;20665:3;20661:16;20654:23;;20416:267;20306:377;;;;:::o;20689:435::-;20869:3;20891:95;20982:3;20973:6;20891:95;:::i;:::-;20884:102;;21003:95;21094:3;21085:6;21003:95;:::i;:::-;20996:102;;21115:3;21108:10;;20689:435;;;;;:::o;21130:180::-;21178:77;21175:1;21168:88;21275:4;21272:1;21265:15;21299:4;21296:1;21289:15;21316:185;21356:1;21373:20;21391:1;21373:20;:::i;:::-;21368:25;;21407:20;21425:1;21407:20;:::i;:::-;21402:25;;21446:1;21436:35;;21451:18;;:::i;:::-;21436:35;21493:1;21490;21486:9;21481:14;;21316:185;;;;:::o;21507:178::-;21647:30;21643:1;21635:6;21631:14;21624:54;21507:178;:::o;21691:366::-;21833:3;21854:67;21918:2;21913:3;21854:67;:::i;:::-;21847:74;;21930:93;22019:3;21930:93;:::i;:::-;22048:2;22043:3;22039:12;22032:19;;21691:366;;;:::o;22063:419::-;22229:4;22267:2;22256:9;22252:18;22244:26;;22316:9;22310:4;22306:20;22302:1;22291:9;22287:17;22280:47;22344:131;22470:4;22344:131;:::i;:::-;22336:139;;22063:419;;;:::o;22488:171::-;22628:23;22624:1;22616:6;22612:14;22605:47;22488:171;:::o;22665:366::-;22807:3;22828:67;22892:2;22887:3;22828:67;:::i;:::-;22821:74;;22904:93;22993:3;22904:93;:::i;:::-;23022:2;23017:3;23013:12;23006:19;;22665:366;;;:::o;23037:419::-;23203:4;23241:2;23230:9;23226:18;23218:26;;23290:9;23284:4;23280:20;23276:1;23265:9;23261:17;23254:47;23318:131;23444:4;23318:131;:::i;:::-;23310:139;;23037:419;;;:::o;23462:94::-;23495:8;23543:5;23539:2;23535:14;23514:35;;23462:94;;;:::o;23562:::-;23601:7;23630:20;23644:5;23630:20;:::i;:::-;23619:31;;23562:94;;;:::o;23662:100::-;23701:7;23730:26;23750:5;23730:26;:::i;:::-;23719:37;;23662:100;;;:::o;23768:157::-;23873:45;23893:24;23911:5;23893:24;:::i;:::-;23873:45;:::i;:::-;23868:3;23861:58;23768:157;;:::o;23931:256::-;24043:3;24058:75;24129:3;24120:6;24058:75;:::i;:::-;24158:2;24153:3;24149:12;24142:19;;24178:3;24171:10;;23931:256;;;;:::o;24193:172::-;24333:24;24329:1;24321:6;24317:14;24310:48;24193:172;:::o;24371:366::-;24513:3;24534:67;24598:2;24593:3;24534:67;:::i;:::-;24527:74;;24610:93;24699:3;24610:93;:::i;:::-;24728:2;24723:3;24719:12;24712:19;;24371:366;;;:::o;24743:419::-;24909:4;24947:2;24936:9;24932:18;24924:26;;24996:9;24990:4;24986:20;24982:1;24971:9;24967:17;24960:47;25024:131;25150:4;25024:131;:::i;:::-;25016:139;;24743:419;;;:::o;25168:305::-;25208:3;25227:20;25245:1;25227:20;:::i;:::-;25222:25;;25261:20;25279:1;25261:20;:::i;:::-;25256:25;;25415:1;25347:66;25343:74;25340:1;25337:81;25334:107;;;25421:18;;:::i;:::-;25334:107;25465:1;25462;25458:9;25451:16;;25168:305;;;;:::o;25479:174::-;25619:26;25615:1;25607:6;25603:14;25596:50;25479:174;:::o;25659:366::-;25801:3;25822:67;25886:2;25881:3;25822:67;:::i;:::-;25815:74;;25898:93;25987:3;25898:93;:::i;:::-;26016:2;26011:3;26007:12;26000:19;;25659:366;;;:::o;26031:419::-;26197:4;26235:2;26224:9;26220:18;26212:26;;26284:9;26278:4;26274:20;26270:1;26259:9;26255:17;26248:47;26312:131;26438:4;26312:131;:::i;:::-;26304:139;;26031:419;;;:::o;26456:225::-;26596:34;26592:1;26584:6;26580:14;26573:58;26665:8;26660:2;26652:6;26648:15;26641:33;26456:225;:::o;26687:366::-;26829:3;26850:67;26914:2;26909:3;26850:67;:::i;:::-;26843:74;;26926:93;27015:3;26926:93;:::i;:::-;27044:2;27039:3;27035:12;27028:19;;26687:366;;;:::o;27059:419::-;27225:4;27263:2;27252:9;27248:18;27240:26;;27312:9;27306:4;27302:20;27298:1;27287:9;27283:17;27276:47;27340:131;27466:4;27340:131;:::i;:::-;27332:139;;27059:419;;;:::o;27484:182::-;27624:34;27620:1;27612:6;27608:14;27601:58;27484:182;:::o;27672:366::-;27814:3;27835:67;27899:2;27894:3;27835:67;:::i;:::-;27828:74;;27911:93;28000:3;27911:93;:::i;:::-;28029:2;28024:3;28020:12;28013:19;;27672:366;;;:::o;28044:419::-;28210:4;28248:2;28237:9;28233:18;28225:26;;28297:9;28291:4;28287:20;28283:1;28272:9;28268:17;28261:47;28325:131;28451:4;28325:131;:::i;:::-;28317:139;;28044:419;;;:::o;28469:98::-;28520:6;28554:5;28548:12;28538:22;;28469:98;;;:::o;28573:168::-;28656:11;28690:6;28685:3;28678:19;28730:4;28725:3;28721:14;28706:29;;28573:168;;;;:::o;28747:360::-;28833:3;28861:38;28893:5;28861:38;:::i;:::-;28915:70;28978:6;28973:3;28915:70;:::i;:::-;28908:77;;28994:52;29039:6;29034:3;29027:4;29020:5;29016:16;28994:52;:::i;:::-;29071:29;29093:6;29071:29;:::i;:::-;29066:3;29062:39;29055:46;;28837:270;28747:360;;;;:::o;29113:640::-;29308:4;29346:3;29335:9;29331:19;29323:27;;29360:71;29428:1;29417:9;29413:17;29404:6;29360:71;:::i;:::-;29441:72;29509:2;29498:9;29494:18;29485:6;29441:72;:::i;:::-;29523;29591:2;29580:9;29576:18;29567:6;29523:72;:::i;:::-;29642:9;29636:4;29632:20;29627:2;29616:9;29612:18;29605:48;29670:76;29741:4;29732:6;29670:76;:::i;:::-;29662:84;;29113:640;;;;;;;:::o;29759:141::-;29815:5;29846:6;29840:13;29831:22;;29862:32;29888:5;29862:32;:::i;:::-;29759:141;;;;:::o;29906:349::-;29975:6;30024:2;30012:9;30003:7;29999:23;29995:32;29992:119;;;30030:79;;:::i;:::-;29992:119;30150:1;30175:63;30230:7;30221:6;30210:9;30206:22;30175:63;:::i;:::-;30165:73;;30121:127;29906:349;;;;:::o;30261:233::-;30300:3;30323:24;30341:5;30323:24;:::i;:::-;30314:33;;30369:66;30362:5;30359:77;30356:103;;;30439:18;;:::i;:::-;30356:103;30486:1;30479:5;30475:13;30468:20;;30261:233;;;:::o;30500:191::-;30540:4;30560:20;30578:1;30560:20;:::i;:::-;30555:25;;30594:20;30612:1;30594:20;:::i;:::-;30589:25;;30633:1;30630;30627:8;30624:34;;;30638:18;;:::i;:::-;30624:34;30683:1;30680;30676:9;30668:17;;30500:191;;;;:::o;30697:176::-;30729:1;30746:20;30764:1;30746:20;:::i;:::-;30741:25;;30780:20;30798:1;30780:20;:::i;:::-;30775:25;;30819:1;30809:35;;30824:18;;:::i;:::-;30809:35;30865:1;30862;30858:9;30853:14;;30697:176;;;;:::o;30879:180::-;30927:77;30924:1;30917:88;31024:4;31021:1;31014:15;31048:4;31045:1;31038:15;31065:79;31104:7;31133:5;31122:16;;31065:79;;;:::o;31150:157::-;31255:45;31275:24;31293:5;31275:24;:::i;:::-;31255:45;:::i;:::-;31250:3;31243:58;31150:157;;:::o;31313:397::-;31453:3;31468:75;31539:3;31530:6;31468:75;:::i;:::-;31568:2;31563:3;31559:12;31552:19;;31581:75;31652:3;31643:6;31581:75;:::i;:::-;31681:2;31676:3;31672:12;31665:19;;31701:3;31694:10;;31313:397;;;;;:::o

Swarm Source

ipfs://51604abac4647200417737fd767d89f2fa273291883517e53c126cbd43dfacf6
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.