ETH Price: $3,698.17 (+1.22%)

Token

ERC-20: STFUPals (STFU)
 

Overview

Max Total Supply

420 STFU

Holders

273

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
4 STFU
0xbad89840c51774d503ea655f93357e4f19e644ed
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:
STFUPals

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


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

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree 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.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
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 Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle 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++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

    /**
     * @dev 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: @openzeppelin/contracts/utils/Address.sol


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;









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

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

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal _currentIndex;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        if (index >= totalSupply()) revert TokenIndexOutOfBounds();
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        if (index >= balanceOf(owner)) revert OwnerIndexOutOfBounds();
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        // Execution should never reach this point.
        assert(false);
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).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);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner].numberMinted);
    }

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

        unchecked {
            for (uint256 curr = tokenId; curr >= 0; curr--) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (ownership.addr != address(0)) {
                    return ownership;
                }
            }
        }

        revert UnableDetermineTokenOwner();
    }

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

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

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

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

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        if (!_checkOnERC721Received(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 tokenId < _currentIndex;
    }

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

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.56e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint128(quantity);
            _addressData[to].numberMinted += uint128(quantity);

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

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data)) {
                    revert TransferToNonERC721ReceiverImplementer();
                }

                updatedIndex++;
            }

            _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);

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * 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`.
     */
    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.
     *
     * 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` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}
// File: STFUPals.sol

//SPDX-License-Identifier: MIT
//IN BILLIONAIRE WE TRUST

pragma solidity ^0.8.7;




contract STFUPals is ERC721A, Ownable {
    using Strings for uint256;

    uint256 public constant MAX_SUPPLY = 420;
    uint256 public constant PRICE = 0.0420 ether;
    uint256 public constant MAX_QUANTITY = 1;

    address public constant THE_BLUFF_WALLET = 0xCF5BC8b7eA1856373d969169060e2E5fFA78825A;

    mapping(address => bool) public mintedWallets;

    bool public mintTime = false;

    string private baseTokenUri = "https://thebluff.mypinata.cloud/ipfs/QmaoVYBSDzTFz6TEw8MVVvsj47tvRmzoPKYFoyQToxQFVs/";

    bytes32 public claimMerkleRoot = 0x96c728cd2de3460c24edc60b9adb2e64d36c46a59e5fdeb4517504eba16c0d69;
    bytes32 public mintMerkleRoot = 0x8f08cecb4f7e178121d7d9a2f7973349fa4304ae36f33a5503cce9475b66e945;

    constructor() ERC721A("STFUPals", "STFU") {

         _safeMint(THE_BLUFF_WALLET, 22);

    }

    function claim(bytes32[] calldata _merkleProof) external payable {

        require((totalSupply() + 1) <= MAX_SUPPLY, "Out Of Stock!");
        require(mintTime, "It is not time to mint");
        require(mintedWallets[msg.sender] == false, "Already Minted!");

        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify(_merkleProof, claimMerkleRoot, leaf), "Invalid Merkle Proof");

            mintedWallets[msg.sender] = true;
            _safeMint(msg.sender, MAX_QUANTITY);


    }

    function mint(bytes32[] calldata _merkleProof) external payable {

        require(msg.value >= PRICE, "Not enough Ether");
        require((totalSupply() + 1) <= MAX_SUPPLY, "OOS");
        require(mintTime, "It is not time to mint");
        require(mintedWallets[msg.sender] == false, "Already Minted!");

        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify(_merkleProof, mintMerkleRoot, leaf), "Invalid Merkle Proof");

            mintedWallets[msg.sender] = true;
            _safeMint(msg.sender, MAX_QUANTITY);


    }


    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        uint256 trueId = tokenId;

        return bytes(baseTokenUri).length > 0 ? string(abi.encodePacked(baseTokenUri, trueId.toString(), ".json")) : "";
    }

    function setTokenUri(string memory _baseTokenUri) external onlyOwner {
        baseTokenUri = _baseTokenUri;
    }

    function flipState() public onlyOwner {

        mintTime = !mintTime;
    }

    function setMintMerkleRoot(bytes32 _merkleRoot) public onlyOwner {

        mintMerkleRoot = _merkleRoot;

    }

    function setClaimMerkleRoot(bytes32 _merkleRoot) public onlyOwner {

        claimMerkleRoot = _merkleRoot;

    }

    function withdraw() external onlyOwner {

        uint256 balance = address(this).balance;

        Address.sendValue(payable(owner()), balance);
    }


}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerIndexOutOfBounds","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenIndexOutOfBounds","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"UnableDetermineTokenOwner","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":[],"name":"MAX_QUANTITY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"THE_BLUFF_WALLET","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claimMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipState","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":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintTime","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedWallets","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setClaimMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMintMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenUri","type":"string"}],"name":"setTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600960006101000a81548160ff021916908315150217905550604051806080016040528060548152602001620048bd60549139600a9080519060200190620000509291906200080b565b507f96c728cd2de3460c24edc60b9adb2e64d36c46a59e5fdeb4517504eba16c0d6960001b600b557f8f08cecb4f7e178121d7d9a2f7973349fa4304ae36f33a5503cce9475b66e94560001b600c55348015620000ac57600080fd5b506040518060400160405280600881526020017f5354465550616c730000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f53544655000000000000000000000000000000000000000000000000000000008152508160019080519060200190620001319291906200080b565b5080600290805190602001906200014a9291906200080b565b5050506200016d620001616200019a60201b60201c565b620001a260201b60201c565b6200019473cf5bc8b7ea1856373d969169060e2e5ffa78825a60166200026860201b60201c565b62000b0c565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200028a8282604051806020016040528060008152506200028e60201b60201c565b5050565b620002a38383836001620002a860201b60201c565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141562000316576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141562000352576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200036760008683876200062d60201b60201c565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b858110156200060857818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4838015620005ba5750620005b860008884886200063360201b60201c565b155b15620005f2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8180600101925050808060010191505062000535565b508060008190555050620006266000868387620007e260201b60201c565b5050505050565b50505050565b6000620006618473ffffffffffffffffffffffffffffffffffffffff16620007e860201b620018ee1760201c565b15620007d5578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620006936200019a60201b60201c565b8786866040518563ffffffff1660e01b8152600401620006b7949392919062000967565b602060405180830381600087803b158015620006d257600080fd5b505af19250505080156200070657506040513d601f19601f82011682018060405250810190620007039190620008d2565b60015b62000784573d806000811462000739576040519150601f19603f3d011682016040523d82523d6000602084013e6200073e565b606091505b506000815114156200077c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050620007da565b600190505b949350505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054620008199062000a77565b90600052602060002090601f0160209004810192826200083d576000855562000889565b82601f106200085857805160ff191683800117855562000889565b8280016001018555821562000889579182015b82811115620008885782518255916020019190600101906200086b565b5b5090506200089891906200089c565b5090565b5b80821115620008b75760008160009055506001016200089d565b5090565b600081519050620008cc8162000af2565b92915050565b600060208284031215620008eb57620008ea62000adc565b5b6000620008fb84828501620008bb565b91505092915050565b6200090f81620009d7565b82525050565b60006200092282620009bb565b6200092e8185620009c6565b93506200094081856020860162000a41565b6200094b8162000ae1565b840191505092915050565b620009618162000a37565b82525050565b60006080820190506200097e600083018762000904565b6200098d602083018662000904565b6200099c604083018562000956565b8181036060830152620009b0818462000915565b905095945050505050565b600081519050919050565b600082825260208201905092915050565b6000620009e48262000a17565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000a6157808201518184015260208101905062000a44565b8381111562000a71576000848401525b50505050565b6000600282049050600182168062000a9057607f821691505b6020821081141562000aa75762000aa662000aad565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b62000afd81620009eb565b811462000b0957600080fd5b50565b613da18062000b1c6000396000f3fe6080604052600436106101f95760003560e01c8063715018a61161010d578063ada7c4ed116100a0578063c87b56dd1161006f578063c87b56dd146106f3578063e41ee46a14610730578063e985e9c51461075b578063f2fde38b14610798578063fd1e2962146107c1576101f9565b8063ada7c4ed14610655578063b391c50814610692578063b77a147b146106ae578063b88d4fde146106ca576101f9565b80638e920351116100dc5780638e920351146105bf57806395d89b41146105d65780639c4dab5214610601578063a22cb4651461062c576101f9565b8063715018a614610527578063864781221461053e5780638d859f3e146105695780638da5cb5b14610594576101f9565b806332cb6b0c11610190578063443310771161015f578063443310771461041a5780634f6ccce71461044557806355523b14146104825780636352211e146104ad57806370a08231146104ea576101f9565b806332cb6b0c146103865780633a4710c4146103b15780633ccfd60b146103da57806342842e0e146103f1576101f9565b8063095ea7b3116101cc578063095ea7b3146102cc57806318160ddd146102f557806323b872dd146103205780632f745c5914610349576101f9565b806301ffc9a7146101fe5780630675b7c61461023b57806306fdde0314610264578063081812fc1461028f575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190612f36565b6107ea565b6040516102329190613408565b60405180910390f35b34801561024757600080fd5b50610262600480360381019061025d9190612f90565b610934565b005b34801561027057600080fd5b50610279610956565b604051610286919061343e565b60405180910390f35b34801561029b57600080fd5b506102b660048036038101906102b19190612fd9565b6109e8565b6040516102c391906133a1565b60405180910390f35b3480156102d857600080fd5b506102f360048036038101906102ee9190612e7c565b610a64565b005b34801561030157600080fd5b5061030a610b6f565b60405161031791906135c0565b60405180910390f35b34801561032c57600080fd5b5061034760048036038101906103429190612d66565b610b78565b005b34801561035557600080fd5b50610370600480360381019061036b9190612e7c565b610b88565b60405161037d91906135c0565b60405180910390f35b34801561039257600080fd5b5061039b610d49565b6040516103a891906135c0565b60405180910390f35b3480156103bd57600080fd5b506103d860048036038101906103d39190612f09565b610d4f565b005b3480156103e657600080fd5b506103ef610d61565b005b3480156103fd57600080fd5b5061041860048036038101906104139190612d66565b610d82565b005b34801561042657600080fd5b5061042f610da2565b60405161043c9190613423565b60405180910390f35b34801561045157600080fd5b5061046c60048036038101906104679190612fd9565b610da8565b60405161047991906135c0565b60405180910390f35b34801561048e57600080fd5b50610497610df2565b6040516104a491906133a1565b60405180910390f35b3480156104b957600080fd5b506104d460048036038101906104cf9190612fd9565b610e0a565b6040516104e191906133a1565b60405180910390f35b3480156104f657600080fd5b50610511600480360381019061050c9190612cf9565b610e20565b60405161051e91906135c0565b60405180910390f35b34801561053357600080fd5b5061053c610f00565b005b34801561054a57600080fd5b50610553610f14565b6040516105609190613408565b60405180910390f35b34801561057557600080fd5b5061057e610f27565b60405161058b91906135c0565b60405180910390f35b3480156105a057600080fd5b506105a9610f32565b6040516105b691906133a1565b60405180910390f35b3480156105cb57600080fd5b506105d4610f5c565b005b3480156105e257600080fd5b506105eb610f90565b6040516105f8919061343e565b60405180910390f35b34801561060d57600080fd5b50610616611022565b6040516106239190613423565b60405180910390f35b34801561063857600080fd5b50610653600480360381019061064e9190612e3c565b611028565b005b34801561066157600080fd5b5061067c60048036038101906106779190612cf9565b6111a0565b6040516106899190613408565b60405180910390f35b6106ac60048036038101906106a79190612ebc565b6111c0565b005b6106c860048036038101906106c39190612ebc565b61141a565b005b3480156106d657600080fd5b506106f160048036038101906106ec9190612db9565b6116be565b005b3480156106ff57600080fd5b5061071a60048036038101906107159190612fd9565b611711565b604051610727919061343e565b60405180910390f35b34801561073c57600080fd5b506107456117bf565b60405161075291906135c0565b60405180910390f35b34801561076757600080fd5b50610782600480360381019061077d9190612d26565b6117c4565b60405161078f9190613408565b60405180910390f35b3480156107a457600080fd5b506107bf60048036038101906107ba9190612cf9565b611858565b005b3480156107cd57600080fd5b506107e860048036038101906107e39190612f09565b6118dc565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108b557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061091d57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061092d575061092c82611911565b5b9050919050565b61093c61197b565b80600a9080519060200190610952929190612a68565b5050565b60606001805461096590613840565b80601f016020809104026020016040519081016040528092919081815260200182805461099190613840565b80156109de5780601f106109b3576101008083540402835291602001916109de565b820191906000526020600020905b8154815290600101906020018083116109c157829003601f168201915b5050505050905090565b60006109f3826119f9565b610a29576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a6f82610e0a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ad7576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610af6611a06565b73ffffffffffffffffffffffffffffffffffffffff1614158015610b285750610b2681610b21611a06565b6117c4565b155b15610b5f576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b6a838383611a0e565b505050565b60008054905090565b610b83838383611ac0565b505050565b6000610b9383610e20565b8210610bcb576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610bd5610b6f565b905060008060005b83811015610d2f576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610ccf57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d215786841415610d18578195505050505050610d43565b83806001019450505b508080600101915050610bdd565b506000610d3f57610d3e613941565b5b5050505b92915050565b6101a481565b610d5761197b565b80600c8190555050565b610d6961197b565b6000479050610d7f610d79610f32565b82611fe5565b50565b610d9d838383604051806020016040528060008152506116be565b505050565b600c5481565b6000610db2610b6f565b8210610dea576040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b819050919050565b73cf5bc8b7ea1856373d969169060e2e5ffa78825a81565b6000610e15826120d9565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e88576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b610f0861197b565b610f126000612261565b565b600960009054906101000a900460ff1681565b669536c70891000081565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610f6461197b565b600960009054906101000a900460ff1615600960006101000a81548160ff021916908315150217905550565b606060028054610f9f90613840565b80601f0160208091040260200160405190810160405280929190818152602001828054610fcb90613840565b80156110185780601f10610fed57610100808354040283529160200191611018565b820191906000526020600020905b815481529060010190602001808311610ffb57829003601f168201915b5050505050905090565b600b5481565b611030611a06565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611095576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600660006110a2611a06565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661114f611a06565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111949190613408565b60405180910390a35050565b60086020528060005260406000206000915054906101000a900460ff1681565b6101a460016111cd610b6f565b6111d791906136c5565b1115611218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120f90613460565b60405180910390fd5b600960009054906101000a900460ff16611267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125e90613540565b60405180910390fd5b60001515600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146112fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f1906134a0565b60405180910390fd5b60003360405160200161130d9190613342565b604051602081830303815290604052805190602001209050611373838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600b5483612327565b6113b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a9906135a0565b60405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061141533600161233e565b505050565b669536c708910000341015611464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145b90613560565b60405180910390fd5b6101a46001611471610b6f565b61147b91906136c5565b11156114bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b390613580565b60405180910390fd5b600960009054906101000a900460ff1661150b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150290613540565b60405180910390fd5b60001515600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151461159e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611595906134a0565b60405180910390fd5b6000336040516020016115b19190613342565b604051602081830303815290604052805190602001209050611617838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600c5483612327565b611656576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164d906135a0565b60405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506116b933600161233e565b505050565b6116c9848484611ac0565b6116d58484848461235c565b61170b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061171c826119f9565b61175b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175290613520565b60405180910390fd5b60008290506000600a805461176f90613840565b90501161178b57604051806020016040528060008152506117b7565b600a611796826124ea565b6040516020016117a792919061335d565b6040516020818303038152906040525b915050919050565b600181565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61186061197b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c790613480565b60405180910390fd5b6118d981612261565b50565b6118e461197b565b80600b8190555050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611983611a06565b73ffffffffffffffffffffffffffffffffffffffff166119a1610f32565b73ffffffffffffffffffffffffffffffffffffffff16146119f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ee90613500565b60405180910390fd5b565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611acb826120d9565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611af2611a06565b73ffffffffffffffffffffffffffffffffffffffff161480611b4e5750611b17611a06565b73ffffffffffffffffffffffffffffffffffffffff16611b36846109e8565b73ffffffffffffffffffffffffffffffffffffffff16145b80611b6a5750611b698260000151611b64611a06565b6117c4565b5b905080611ba3576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611c0c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611c73576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c80858585600161264b565b611c906000848460000151611a0e565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611f7557611ed4816119f9565b15611f745782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611fde8585856001612651565b5050505050565b80471015612028576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201f906134e0565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161204e9061338c565b60006040518083038185875af1925050503d806000811461208b576040519150601f19603f3d011682016040523d82523d6000602084013e612090565b606091505b50509050806120d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cb906134c0565b60405180910390fd5b505050565b6120e1612aee565b6120ea826119f9565b612120576040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008290505b60008110612229576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461221a57809250505061225c565b50808060019003915050612126565b506040517fe7c0edfb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000826123348584612657565b1490509392505050565b6123588282604051806020016040528060008152506126ad565b5050565b600061237d8473ffffffffffffffffffffffffffffffffffffffff166118ee565b156124dd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123a6611a06565b8786866040518563ffffffff1660e01b81526004016123c894939291906133bc565b602060405180830381600087803b1580156123e257600080fd5b505af192505050801561241357506040513d601f19601f820116820180604052508101906124109190612f63565b60015b61248d573d8060008114612443576040519150601f19603f3d011682016040523d82523d6000602084013e612448565b606091505b50600081511415612485576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506124e2565b600190505b949350505050565b60606000821415612532576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612646565b600082905060005b6000821461256457808061254d906138a3565b915050600a8261255d919061371b565b915061253a565b60008167ffffffffffffffff8111156125805761257f613a2c565b5b6040519080825280601f01601f1916602001820160405280156125b25781602001600182028036833780820191505090505b5090505b6000851461263f576001826125cb919061374c565b9150600a856125da9190613910565b60306125e691906136c5565b60f81b8183815181106125fc576125fb6139fd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612638919061371b565b94506125b6565b8093505050505b919050565b50505050565b50505050565b60008082905060005b84518110156126a25761268d828683815181106126805761267f6139fd565b5b60200260200101516126bf565b9150808061269a906138a3565b915050612660565b508091505092915050565b6126ba83838360016126ea565b505050565b60008183106126d7576126d28284612a51565b6126e2565b6126e18383612a51565b5b905092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612757576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612792576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61279f600086838761264b565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015612a3457818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48380156129e857506129e6600088848861235c565b155b15612a1f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8180600101925050808060010191505061296d565b508060008190555050612a4a6000868387612651565b5050505050565b600082600052816020526040600020905092915050565b828054612a7490613840565b90600052602060002090601f016020900481019282612a965760008555612add565b82601f10612aaf57805160ff1916838001178555612add565b82800160010185558215612add579182015b82811115612adc578251825591602001919060010190612ac1565b5b509050612aea9190612b28565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115612b41576000816000905550600101612b29565b5090565b6000612b58612b5384613600565b6135db565b905082815260208101848484011115612b7457612b73613a6a565b5b612b7f8482856137fe565b509392505050565b6000612b9a612b9584613631565b6135db565b905082815260208101848484011115612bb657612bb5613a6a565b5b612bc18482856137fe565b509392505050565b600081359050612bd881613cf8565b92915050565b60008083601f840112612bf457612bf3613a60565b5b8235905067ffffffffffffffff811115612c1157612c10613a5b565b5b602083019150836020820283011115612c2d57612c2c613a65565b5b9250929050565b600081359050612c4381613d0f565b92915050565b600081359050612c5881613d26565b92915050565b600081359050612c6d81613d3d565b92915050565b600081519050612c8281613d3d565b92915050565b600082601f830112612c9d57612c9c613a60565b5b8135612cad848260208601612b45565b91505092915050565b600082601f830112612ccb57612cca613a60565b5b8135612cdb848260208601612b87565b91505092915050565b600081359050612cf381613d54565b92915050565b600060208284031215612d0f57612d0e613a74565b5b6000612d1d84828501612bc9565b91505092915050565b60008060408385031215612d3d57612d3c613a74565b5b6000612d4b85828601612bc9565b9250506020612d5c85828601612bc9565b9150509250929050565b600080600060608486031215612d7f57612d7e613a74565b5b6000612d8d86828701612bc9565b9350506020612d9e86828701612bc9565b9250506040612daf86828701612ce4565b9150509250925092565b60008060008060808587031215612dd357612dd2613a74565b5b6000612de187828801612bc9565b9450506020612df287828801612bc9565b9350506040612e0387828801612ce4565b925050606085013567ffffffffffffffff811115612e2457612e23613a6f565b5b612e3087828801612c88565b91505092959194509250565b60008060408385031215612e5357612e52613a74565b5b6000612e6185828601612bc9565b9250506020612e7285828601612c34565b9150509250929050565b60008060408385031215612e9357612e92613a74565b5b6000612ea185828601612bc9565b9250506020612eb285828601612ce4565b9150509250929050565b60008060208385031215612ed357612ed2613a74565b5b600083013567ffffffffffffffff811115612ef157612ef0613a6f565b5b612efd85828601612bde565b92509250509250929050565b600060208284031215612f1f57612f1e613a74565b5b6000612f2d84828501612c49565b91505092915050565b600060208284031215612f4c57612f4b613a74565b5b6000612f5a84828501612c5e565b91505092915050565b600060208284031215612f7957612f78613a74565b5b6000612f8784828501612c73565b91505092915050565b600060208284031215612fa657612fa5613a74565b5b600082013567ffffffffffffffff811115612fc457612fc3613a6f565b5b612fd084828501612cb6565b91505092915050565b600060208284031215612fef57612fee613a74565b5b6000612ffd84828501612ce4565b91505092915050565b61300f81613780565b82525050565b61302661302182613780565b6138ec565b82525050565b61303581613792565b82525050565b6130448161379e565b82525050565b600061305582613677565b61305f818561368d565b935061306f81856020860161380d565b61307881613a79565b840191505092915050565b600061308e82613682565b61309881856136a9565b93506130a881856020860161380d565b6130b181613a79565b840191505092915050565b60006130c782613682565b6130d181856136ba565b93506130e181856020860161380d565b80840191505092915050565b600081546130fa81613840565b61310481866136ba565b9450600182166000811461311f576001811461313057613163565b60ff19831686528186019350613163565b61313985613662565b60005b8381101561315b5781548189015260018201915060208101905061313c565b838801955050505b50505092915050565b6000613179600d836136a9565b915061318482613a97565b602082019050919050565b600061319c6026836136a9565b91506131a782613ac0565b604082019050919050565b60006131bf600f836136a9565b91506131ca82613b0f565b602082019050919050565b60006131e2603a836136a9565b91506131ed82613b38565b604082019050919050565b6000613205601d836136a9565b915061321082613b87565b602082019050919050565b60006132286005836136ba565b915061323382613bb0565b600582019050919050565b600061324b6020836136a9565b915061325682613bd9565b602082019050919050565b600061326e602f836136a9565b915061327982613c02565b604082019050919050565b60006132916016836136a9565b915061329c82613c51565b602082019050919050565b60006132b460008361369e565b91506132bf82613c7a565b600082019050919050565b60006132d76010836136a9565b91506132e282613c7d565b602082019050919050565b60006132fa6003836136a9565b915061330582613ca6565b602082019050919050565b600061331d6014836136a9565b915061332882613ccf565b602082019050919050565b61333c816137f4565b82525050565b600061334e8284613015565b60148201915081905092915050565b600061336982856130ed565b915061337582846130bc565b91506133808261321b565b91508190509392505050565b6000613397826132a7565b9150819050919050565b60006020820190506133b66000830184613006565b92915050565b60006080820190506133d16000830187613006565b6133de6020830186613006565b6133eb6040830185613333565b81810360608301526133fd818461304a565b905095945050505050565b600060208201905061341d600083018461302c565b92915050565b6000602082019050613438600083018461303b565b92915050565b600060208201905081810360008301526134588184613083565b905092915050565b600060208201905081810360008301526134798161316c565b9050919050565b600060208201905081810360008301526134998161318f565b9050919050565b600060208201905081810360008301526134b9816131b2565b9050919050565b600060208201905081810360008301526134d9816131d5565b9050919050565b600060208201905081810360008301526134f9816131f8565b9050919050565b600060208201905081810360008301526135198161323e565b9050919050565b6000602082019050818103600083015261353981613261565b9050919050565b6000602082019050818103600083015261355981613284565b9050919050565b60006020820190508181036000830152613579816132ca565b9050919050565b60006020820190508181036000830152613599816132ed565b9050919050565b600060208201905081810360008301526135b981613310565b9050919050565b60006020820190506135d56000830184613333565b92915050565b60006135e56135f6565b90506135f18282613872565b919050565b6000604051905090565b600067ffffffffffffffff82111561361b5761361a613a2c565b5b61362482613a79565b9050602081019050919050565b600067ffffffffffffffff82111561364c5761364b613a2c565b5b61365582613a79565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006136d0826137f4565b91506136db836137f4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156137105761370f613970565b5b828201905092915050565b6000613726826137f4565b9150613731836137f4565b9250826137415761374061399f565b5b828204905092915050565b6000613757826137f4565b9150613762836137f4565b92508282101561377557613774613970565b5b828203905092915050565b600061378b826137d4565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561382b578082015181840152602081019050613810565b8381111561383a576000848401525b50505050565b6000600282049050600182168061385857607f821691505b6020821081141561386c5761386b6139ce565b5b50919050565b61387b82613a79565b810181811067ffffffffffffffff8211171561389a57613899613a2c565b5b80604052505050565b60006138ae826137f4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156138e1576138e0613970565b5b600182019050919050565b60006138f7826138fe565b9050919050565b600061390982613a8a565b9050919050565b600061391b826137f4565b9150613926836137f4565b9250826139365761393561399f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f7574204f662053746f636b2100000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f416c7265616479204d696e746564210000000000000000000000000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4974206973206e6f742074696d6520746f206d696e7400000000000000000000600082015250565b50565b7f4e6f7420656e6f75676820457468657200000000000000000000000000000000600082015250565b7f4f4f530000000000000000000000000000000000000000000000000000000000600082015250565b7f496e76616c6964204d65726b6c652050726f6f66000000000000000000000000600082015250565b613d0181613780565b8114613d0c57600080fd5b50565b613d1881613792565b8114613d2357600080fd5b50565b613d2f8161379e565b8114613d3a57600080fd5b50565b613d46816137a8565b8114613d5157600080fd5b50565b613d5d816137f4565b8114613d6857600080fd5b5056fea2646970667358221220db5bd4da76e259031f8d50bcbc3f15422f923dabe5ecfc1052c58aac01b312bc64736f6c6343000807003368747470733a2f2f746865626c7566662e6d7970696e6174612e636c6f75642f697066732f516d616f56594253447a54467a36544577384d565676736a34377476526d7a6f504b59466f7951546f78514656732f

Deployed Bytecode

0x6080604052600436106101f95760003560e01c8063715018a61161010d578063ada7c4ed116100a0578063c87b56dd1161006f578063c87b56dd146106f3578063e41ee46a14610730578063e985e9c51461075b578063f2fde38b14610798578063fd1e2962146107c1576101f9565b8063ada7c4ed14610655578063b391c50814610692578063b77a147b146106ae578063b88d4fde146106ca576101f9565b80638e920351116100dc5780638e920351146105bf57806395d89b41146105d65780639c4dab5214610601578063a22cb4651461062c576101f9565b8063715018a614610527578063864781221461053e5780638d859f3e146105695780638da5cb5b14610594576101f9565b806332cb6b0c11610190578063443310771161015f578063443310771461041a5780634f6ccce71461044557806355523b14146104825780636352211e146104ad57806370a08231146104ea576101f9565b806332cb6b0c146103865780633a4710c4146103b15780633ccfd60b146103da57806342842e0e146103f1576101f9565b8063095ea7b3116101cc578063095ea7b3146102cc57806318160ddd146102f557806323b872dd146103205780632f745c5914610349576101f9565b806301ffc9a7146101fe5780630675b7c61461023b57806306fdde0314610264578063081812fc1461028f575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190612f36565b6107ea565b6040516102329190613408565b60405180910390f35b34801561024757600080fd5b50610262600480360381019061025d9190612f90565b610934565b005b34801561027057600080fd5b50610279610956565b604051610286919061343e565b60405180910390f35b34801561029b57600080fd5b506102b660048036038101906102b19190612fd9565b6109e8565b6040516102c391906133a1565b60405180910390f35b3480156102d857600080fd5b506102f360048036038101906102ee9190612e7c565b610a64565b005b34801561030157600080fd5b5061030a610b6f565b60405161031791906135c0565b60405180910390f35b34801561032c57600080fd5b5061034760048036038101906103429190612d66565b610b78565b005b34801561035557600080fd5b50610370600480360381019061036b9190612e7c565b610b88565b60405161037d91906135c0565b60405180910390f35b34801561039257600080fd5b5061039b610d49565b6040516103a891906135c0565b60405180910390f35b3480156103bd57600080fd5b506103d860048036038101906103d39190612f09565b610d4f565b005b3480156103e657600080fd5b506103ef610d61565b005b3480156103fd57600080fd5b5061041860048036038101906104139190612d66565b610d82565b005b34801561042657600080fd5b5061042f610da2565b60405161043c9190613423565b60405180910390f35b34801561045157600080fd5b5061046c60048036038101906104679190612fd9565b610da8565b60405161047991906135c0565b60405180910390f35b34801561048e57600080fd5b50610497610df2565b6040516104a491906133a1565b60405180910390f35b3480156104b957600080fd5b506104d460048036038101906104cf9190612fd9565b610e0a565b6040516104e191906133a1565b60405180910390f35b3480156104f657600080fd5b50610511600480360381019061050c9190612cf9565b610e20565b60405161051e91906135c0565b60405180910390f35b34801561053357600080fd5b5061053c610f00565b005b34801561054a57600080fd5b50610553610f14565b6040516105609190613408565b60405180910390f35b34801561057557600080fd5b5061057e610f27565b60405161058b91906135c0565b60405180910390f35b3480156105a057600080fd5b506105a9610f32565b6040516105b691906133a1565b60405180910390f35b3480156105cb57600080fd5b506105d4610f5c565b005b3480156105e257600080fd5b506105eb610f90565b6040516105f8919061343e565b60405180910390f35b34801561060d57600080fd5b50610616611022565b6040516106239190613423565b60405180910390f35b34801561063857600080fd5b50610653600480360381019061064e9190612e3c565b611028565b005b34801561066157600080fd5b5061067c60048036038101906106779190612cf9565b6111a0565b6040516106899190613408565b60405180910390f35b6106ac60048036038101906106a79190612ebc565b6111c0565b005b6106c860048036038101906106c39190612ebc565b61141a565b005b3480156106d657600080fd5b506106f160048036038101906106ec9190612db9565b6116be565b005b3480156106ff57600080fd5b5061071a60048036038101906107159190612fd9565b611711565b604051610727919061343e565b60405180910390f35b34801561073c57600080fd5b506107456117bf565b60405161075291906135c0565b60405180910390f35b34801561076757600080fd5b50610782600480360381019061077d9190612d26565b6117c4565b60405161078f9190613408565b60405180910390f35b3480156107a457600080fd5b506107bf60048036038101906107ba9190612cf9565b611858565b005b3480156107cd57600080fd5b506107e860048036038101906107e39190612f09565b6118dc565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108b557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061091d57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061092d575061092c82611911565b5b9050919050565b61093c61197b565b80600a9080519060200190610952929190612a68565b5050565b60606001805461096590613840565b80601f016020809104026020016040519081016040528092919081815260200182805461099190613840565b80156109de5780601f106109b3576101008083540402835291602001916109de565b820191906000526020600020905b8154815290600101906020018083116109c157829003601f168201915b5050505050905090565b60006109f3826119f9565b610a29576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a6f82610e0a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ad7576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610af6611a06565b73ffffffffffffffffffffffffffffffffffffffff1614158015610b285750610b2681610b21611a06565b6117c4565b155b15610b5f576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b6a838383611a0e565b505050565b60008054905090565b610b83838383611ac0565b505050565b6000610b9383610e20565b8210610bcb576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610bd5610b6f565b905060008060005b83811015610d2f576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610ccf57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d215786841415610d18578195505050505050610d43565b83806001019450505b508080600101915050610bdd565b506000610d3f57610d3e613941565b5b5050505b92915050565b6101a481565b610d5761197b565b80600c8190555050565b610d6961197b565b6000479050610d7f610d79610f32565b82611fe5565b50565b610d9d838383604051806020016040528060008152506116be565b505050565b600c5481565b6000610db2610b6f565b8210610dea576040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b819050919050565b73cf5bc8b7ea1856373d969169060e2e5ffa78825a81565b6000610e15826120d9565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e88576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b610f0861197b565b610f126000612261565b565b600960009054906101000a900460ff1681565b669536c70891000081565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610f6461197b565b600960009054906101000a900460ff1615600960006101000a81548160ff021916908315150217905550565b606060028054610f9f90613840565b80601f0160208091040260200160405190810160405280929190818152602001828054610fcb90613840565b80156110185780601f10610fed57610100808354040283529160200191611018565b820191906000526020600020905b815481529060010190602001808311610ffb57829003601f168201915b5050505050905090565b600b5481565b611030611a06565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611095576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600660006110a2611a06565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661114f611a06565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111949190613408565b60405180910390a35050565b60086020528060005260406000206000915054906101000a900460ff1681565b6101a460016111cd610b6f565b6111d791906136c5565b1115611218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120f90613460565b60405180910390fd5b600960009054906101000a900460ff16611267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125e90613540565b60405180910390fd5b60001515600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146112fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f1906134a0565b60405180910390fd5b60003360405160200161130d9190613342565b604051602081830303815290604052805190602001209050611373838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600b5483612327565b6113b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a9906135a0565b60405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061141533600161233e565b505050565b669536c708910000341015611464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145b90613560565b60405180910390fd5b6101a46001611471610b6f565b61147b91906136c5565b11156114bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b390613580565b60405180910390fd5b600960009054906101000a900460ff1661150b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150290613540565b60405180910390fd5b60001515600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151461159e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611595906134a0565b60405180910390fd5b6000336040516020016115b19190613342565b604051602081830303815290604052805190602001209050611617838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600c5483612327565b611656576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164d906135a0565b60405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506116b933600161233e565b505050565b6116c9848484611ac0565b6116d58484848461235c565b61170b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061171c826119f9565b61175b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175290613520565b60405180910390fd5b60008290506000600a805461176f90613840565b90501161178b57604051806020016040528060008152506117b7565b600a611796826124ea565b6040516020016117a792919061335d565b6040516020818303038152906040525b915050919050565b600181565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61186061197b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c790613480565b60405180910390fd5b6118d981612261565b50565b6118e461197b565b80600b8190555050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611983611a06565b73ffffffffffffffffffffffffffffffffffffffff166119a1610f32565b73ffffffffffffffffffffffffffffffffffffffff16146119f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ee90613500565b60405180910390fd5b565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611acb826120d9565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611af2611a06565b73ffffffffffffffffffffffffffffffffffffffff161480611b4e5750611b17611a06565b73ffffffffffffffffffffffffffffffffffffffff16611b36846109e8565b73ffffffffffffffffffffffffffffffffffffffff16145b80611b6a5750611b698260000151611b64611a06565b6117c4565b5b905080611ba3576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611c0c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611c73576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c80858585600161264b565b611c906000848460000151611a0e565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611f7557611ed4816119f9565b15611f745782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611fde8585856001612651565b5050505050565b80471015612028576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201f906134e0565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161204e9061338c565b60006040518083038185875af1925050503d806000811461208b576040519150601f19603f3d011682016040523d82523d6000602084013e612090565b606091505b50509050806120d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cb906134c0565b60405180910390fd5b505050565b6120e1612aee565b6120ea826119f9565b612120576040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008290505b60008110612229576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461221a57809250505061225c565b50808060019003915050612126565b506040517fe7c0edfb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000826123348584612657565b1490509392505050565b6123588282604051806020016040528060008152506126ad565b5050565b600061237d8473ffffffffffffffffffffffffffffffffffffffff166118ee565b156124dd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123a6611a06565b8786866040518563ffffffff1660e01b81526004016123c894939291906133bc565b602060405180830381600087803b1580156123e257600080fd5b505af192505050801561241357506040513d601f19601f820116820180604052508101906124109190612f63565b60015b61248d573d8060008114612443576040519150601f19603f3d011682016040523d82523d6000602084013e612448565b606091505b50600081511415612485576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506124e2565b600190505b949350505050565b60606000821415612532576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612646565b600082905060005b6000821461256457808061254d906138a3565b915050600a8261255d919061371b565b915061253a565b60008167ffffffffffffffff8111156125805761257f613a2c565b5b6040519080825280601f01601f1916602001820160405280156125b25781602001600182028036833780820191505090505b5090505b6000851461263f576001826125cb919061374c565b9150600a856125da9190613910565b60306125e691906136c5565b60f81b8183815181106125fc576125fb6139fd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612638919061371b565b94506125b6565b8093505050505b919050565b50505050565b50505050565b60008082905060005b84518110156126a25761268d828683815181106126805761267f6139fd565b5b60200260200101516126bf565b9150808061269a906138a3565b915050612660565b508091505092915050565b6126ba83838360016126ea565b505050565b60008183106126d7576126d28284612a51565b6126e2565b6126e18383612a51565b5b905092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612757576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612792576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61279f600086838761264b565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015612a3457818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48380156129e857506129e6600088848861235c565b155b15612a1f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8180600101925050808060010191505061296d565b508060008190555050612a4a6000868387612651565b5050505050565b600082600052816020526040600020905092915050565b828054612a7490613840565b90600052602060002090601f016020900481019282612a965760008555612add565b82601f10612aaf57805160ff1916838001178555612add565b82800160010185558215612add579182015b82811115612adc578251825591602001919060010190612ac1565b5b509050612aea9190612b28565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115612b41576000816000905550600101612b29565b5090565b6000612b58612b5384613600565b6135db565b905082815260208101848484011115612b7457612b73613a6a565b5b612b7f8482856137fe565b509392505050565b6000612b9a612b9584613631565b6135db565b905082815260208101848484011115612bb657612bb5613a6a565b5b612bc18482856137fe565b509392505050565b600081359050612bd881613cf8565b92915050565b60008083601f840112612bf457612bf3613a60565b5b8235905067ffffffffffffffff811115612c1157612c10613a5b565b5b602083019150836020820283011115612c2d57612c2c613a65565b5b9250929050565b600081359050612c4381613d0f565b92915050565b600081359050612c5881613d26565b92915050565b600081359050612c6d81613d3d565b92915050565b600081519050612c8281613d3d565b92915050565b600082601f830112612c9d57612c9c613a60565b5b8135612cad848260208601612b45565b91505092915050565b600082601f830112612ccb57612cca613a60565b5b8135612cdb848260208601612b87565b91505092915050565b600081359050612cf381613d54565b92915050565b600060208284031215612d0f57612d0e613a74565b5b6000612d1d84828501612bc9565b91505092915050565b60008060408385031215612d3d57612d3c613a74565b5b6000612d4b85828601612bc9565b9250506020612d5c85828601612bc9565b9150509250929050565b600080600060608486031215612d7f57612d7e613a74565b5b6000612d8d86828701612bc9565b9350506020612d9e86828701612bc9565b9250506040612daf86828701612ce4565b9150509250925092565b60008060008060808587031215612dd357612dd2613a74565b5b6000612de187828801612bc9565b9450506020612df287828801612bc9565b9350506040612e0387828801612ce4565b925050606085013567ffffffffffffffff811115612e2457612e23613a6f565b5b612e3087828801612c88565b91505092959194509250565b60008060408385031215612e5357612e52613a74565b5b6000612e6185828601612bc9565b9250506020612e7285828601612c34565b9150509250929050565b60008060408385031215612e9357612e92613a74565b5b6000612ea185828601612bc9565b9250506020612eb285828601612ce4565b9150509250929050565b60008060208385031215612ed357612ed2613a74565b5b600083013567ffffffffffffffff811115612ef157612ef0613a6f565b5b612efd85828601612bde565b92509250509250929050565b600060208284031215612f1f57612f1e613a74565b5b6000612f2d84828501612c49565b91505092915050565b600060208284031215612f4c57612f4b613a74565b5b6000612f5a84828501612c5e565b91505092915050565b600060208284031215612f7957612f78613a74565b5b6000612f8784828501612c73565b91505092915050565b600060208284031215612fa657612fa5613a74565b5b600082013567ffffffffffffffff811115612fc457612fc3613a6f565b5b612fd084828501612cb6565b91505092915050565b600060208284031215612fef57612fee613a74565b5b6000612ffd84828501612ce4565b91505092915050565b61300f81613780565b82525050565b61302661302182613780565b6138ec565b82525050565b61303581613792565b82525050565b6130448161379e565b82525050565b600061305582613677565b61305f818561368d565b935061306f81856020860161380d565b61307881613a79565b840191505092915050565b600061308e82613682565b61309881856136a9565b93506130a881856020860161380d565b6130b181613a79565b840191505092915050565b60006130c782613682565b6130d181856136ba565b93506130e181856020860161380d565b80840191505092915050565b600081546130fa81613840565b61310481866136ba565b9450600182166000811461311f576001811461313057613163565b60ff19831686528186019350613163565b61313985613662565b60005b8381101561315b5781548189015260018201915060208101905061313c565b838801955050505b50505092915050565b6000613179600d836136a9565b915061318482613a97565b602082019050919050565b600061319c6026836136a9565b91506131a782613ac0565b604082019050919050565b60006131bf600f836136a9565b91506131ca82613b0f565b602082019050919050565b60006131e2603a836136a9565b91506131ed82613b38565b604082019050919050565b6000613205601d836136a9565b915061321082613b87565b602082019050919050565b60006132286005836136ba565b915061323382613bb0565b600582019050919050565b600061324b6020836136a9565b915061325682613bd9565b602082019050919050565b600061326e602f836136a9565b915061327982613c02565b604082019050919050565b60006132916016836136a9565b915061329c82613c51565b602082019050919050565b60006132b460008361369e565b91506132bf82613c7a565b600082019050919050565b60006132d76010836136a9565b91506132e282613c7d565b602082019050919050565b60006132fa6003836136a9565b915061330582613ca6565b602082019050919050565b600061331d6014836136a9565b915061332882613ccf565b602082019050919050565b61333c816137f4565b82525050565b600061334e8284613015565b60148201915081905092915050565b600061336982856130ed565b915061337582846130bc565b91506133808261321b565b91508190509392505050565b6000613397826132a7565b9150819050919050565b60006020820190506133b66000830184613006565b92915050565b60006080820190506133d16000830187613006565b6133de6020830186613006565b6133eb6040830185613333565b81810360608301526133fd818461304a565b905095945050505050565b600060208201905061341d600083018461302c565b92915050565b6000602082019050613438600083018461303b565b92915050565b600060208201905081810360008301526134588184613083565b905092915050565b600060208201905081810360008301526134798161316c565b9050919050565b600060208201905081810360008301526134998161318f565b9050919050565b600060208201905081810360008301526134b9816131b2565b9050919050565b600060208201905081810360008301526134d9816131d5565b9050919050565b600060208201905081810360008301526134f9816131f8565b9050919050565b600060208201905081810360008301526135198161323e565b9050919050565b6000602082019050818103600083015261353981613261565b9050919050565b6000602082019050818103600083015261355981613284565b9050919050565b60006020820190508181036000830152613579816132ca565b9050919050565b60006020820190508181036000830152613599816132ed565b9050919050565b600060208201905081810360008301526135b981613310565b9050919050565b60006020820190506135d56000830184613333565b92915050565b60006135e56135f6565b90506135f18282613872565b919050565b6000604051905090565b600067ffffffffffffffff82111561361b5761361a613a2c565b5b61362482613a79565b9050602081019050919050565b600067ffffffffffffffff82111561364c5761364b613a2c565b5b61365582613a79565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006136d0826137f4565b91506136db836137f4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156137105761370f613970565b5b828201905092915050565b6000613726826137f4565b9150613731836137f4565b9250826137415761374061399f565b5b828204905092915050565b6000613757826137f4565b9150613762836137f4565b92508282101561377557613774613970565b5b828203905092915050565b600061378b826137d4565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561382b578082015181840152602081019050613810565b8381111561383a576000848401525b50505050565b6000600282049050600182168061385857607f821691505b6020821081141561386c5761386b6139ce565b5b50919050565b61387b82613a79565b810181811067ffffffffffffffff8211171561389a57613899613a2c565b5b80604052505050565b60006138ae826137f4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156138e1576138e0613970565b5b600182019050919050565b60006138f7826138fe565b9050919050565b600061390982613a8a565b9050919050565b600061391b826137f4565b9150613926836137f4565b9250826139365761393561399f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f7574204f662053746f636b2100000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f416c7265616479204d696e746564210000000000000000000000000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4974206973206e6f742074696d6520746f206d696e7400000000000000000000600082015250565b50565b7f4e6f7420656e6f75676820457468657200000000000000000000000000000000600082015250565b7f4f4f530000000000000000000000000000000000000000000000000000000000600082015250565b7f496e76616c6964204d65726b6c652050726f6f66000000000000000000000000600082015250565b613d0181613780565b8114613d0c57600080fd5b50565b613d1881613792565b8114613d2357600080fd5b50565b613d2f8161379e565b8114613d3a57600080fd5b50565b613d46816137a8565b8114613d5157600080fd5b50565b613d5d816137f4565b8114613d6857600080fd5b5056fea2646970667358221220db5bd4da76e259031f8d50bcbc3f15422f923dabe5ecfc1052c58aac01b312bc64736f6c63430008070033

Deployed Bytecode Sourcemap

50128:2976:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37288:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52480:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39104:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40581:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40170:345;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35555:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41438:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36209:1007;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50207:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52691:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52941:156;;;;;;;;;;;;;:::i;:::-;;41679:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50770:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35733:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50354:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38913:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37724:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13998:103;;;;;;;;;;;;;:::i;:::-;;50502:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50254:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13350:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52604:79;;;;;;;;;;;;;:::i;:::-;;39273:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50664:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40857:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50448:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50982:541;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51531:587;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41935:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52128:344;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50305:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41207:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14256:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52815:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37288:372;37390:4;37442:25;37427:40;;;:11;:40;;;;:105;;;;37499:33;37484:48;;;:11;:48;;;;37427:105;:172;;;;37564:35;37549:50;;;:11;:50;;;;37427:172;:225;;;;37616:36;37640:11;37616:23;:36::i;:::-;37427:225;37407:245;;37288:372;;;:::o;52480:116::-;13236:13;:11;:13::i;:::-;52575::::1;52560:12;:28;;;;;;;;;;;;:::i;:::-;;52480:116:::0;:::o;39104:100::-;39158:13;39191:5;39184:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39104:100;:::o;40581:204::-;40649:7;40674:16;40682:7;40674;:16::i;:::-;40669:64;;40699:34;;;;;;;;;;;;;;40669:64;40753:15;:24;40769:7;40753:24;;;;;;;;;;;;;;;;;;;;;40746:31;;40581:204;;;:::o;40170:345::-;40243:13;40259:24;40275:7;40259:15;:24::i;:::-;40243:40;;40304:5;40298:11;;:2;:11;;;40294:48;;;40318:24;;;;;;;;;;;;;;40294:48;40375:5;40359:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;40385:37;40402:5;40409:12;:10;:12::i;:::-;40385:16;:37::i;:::-;40384:38;40359:63;40355:111;;;40431:35;;;;;;;;;;;;;;40355:111;40479:28;40488:2;40492:7;40501:5;40479:8;:28::i;:::-;40232:283;40170:345;;:::o;35555:101::-;35608:7;35635:13;;35628:20;;35555:101;:::o;41438:170::-;41572:28;41582:4;41588:2;41592:7;41572:9;:28::i;:::-;41438:170;;;:::o;36209:1007::-;36298:7;36331:16;36341:5;36331:9;:16::i;:::-;36322:5;:25;36318:61;;36356:23;;;;;;;;;;;;;;36318:61;36390:22;36415:13;:11;:13::i;:::-;36390:38;;36439:19;36469:25;36658:9;36653:466;36673:14;36669:1;:18;36653:466;;;36713:31;36747:11;:14;36759:1;36747:14;;;;;;;;;;;36713:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36810:1;36784:28;;:9;:14;;;:28;;;36780:111;;36857:9;:14;;;36837:34;;36780:111;36934:5;36913:26;;:17;:26;;;36909:195;;;36983:5;36968:11;:20;36964:85;;;37024:1;37017:8;;;;;;;;;36964:85;37071:13;;;;;;;36909:195;36694:425;36689:3;;;;;;;36653:466;;;;37202:5;37195:13;;;;:::i;:::-;;36307:909;;;36209:1007;;;;;:::o;50207:40::-;50244:3;50207:40;:::o;52691:116::-;13236:13;:11;:13::i;:::-;52786:11:::1;52769:14;:28;;;;52691:116:::0;:::o;52941:156::-;13236:13;:11;:13::i;:::-;52993:15:::1;53011:21;52993:39;;53045:44;53071:7;:5;:7::i;:::-;53081;53045:17;:44::i;:::-;52980:117;52941:156::o:0;41679:185::-;41817:39;41834:4;41840:2;41844:7;41817:39;;;;;;;;;;;;:16;:39::i;:::-;41679:185;;;:::o;50770:98::-;;;;:::o;35733:176::-;35800:7;35833:13;:11;:13::i;:::-;35824:5;:22;35820:58;;35855:23;;;;;;;;;;;;;;35820:58;35896:5;35889:12;;35733:176;;;:::o;50354:85::-;50397:42;50354:85;:::o;38913:124::-;38977:7;39004:20;39016:7;39004:11;:20::i;:::-;:25;;;38997:32;;38913:124;;;:::o;37724:206::-;37788:7;37829:1;37812:19;;:5;:19;;;37808:60;;;37840:28;;;;;;;;;;;;;;37808:60;37894:12;:19;37907:5;37894:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;37886:36;;37879:43;;37724:206;;;:::o;13998:103::-;13236:13;:11;:13::i;:::-;14063:30:::1;14090:1;14063:18;:30::i;:::-;13998:103::o:0;50502:28::-;;;;;;;;;;;;;:::o;50254:44::-;50286:12;50254:44;:::o;13350:87::-;13396:7;13423:6;;;;;;;;;;;13416:13;;13350:87;:::o;52604:79::-;13236:13;:11;:13::i;:::-;52667:8:::1;;;;;;;;;;;52666:9;52655:8;;:20;;;;;;;;;;;;;;;;;;52604:79::o:0;39273:104::-;39329:13;39362:7;39355:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39273:104;:::o;50664:99::-;;;;:::o;40857:279::-;40960:12;:10;:12::i;:::-;40948:24;;:8;:24;;;40944:54;;;40981:17;;;;;;;;;;;;;;40944:54;41056:8;41011:18;:32;41030:12;:10;:12::i;:::-;41011:32;;;;;;;;;;;;;;;:42;41044:8;41011:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;41109:8;41080:48;;41095:12;:10;:12::i;:::-;41080:48;;;41119:8;41080:48;;;;;;:::i;:::-;;;;;;;;40857:279;;:::o;50448:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;50982:541::-;50244:3;51085:1;51069:13;:11;:13::i;:::-;:17;;;;:::i;:::-;51068:33;;51060:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;51138:8;;;;;;;;;;;51130:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;51221:5;51192:34;;:13;:25;51206:10;51192:25;;;;;;;;;;;;;;;;;;;;;;;;;:34;;;51184:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;51259:12;51301:10;51284:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;51274:39;;;;;;51259:54;;51332:55;51351:12;;51332:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51365:15;;51382:4;51332:18;:55::i;:::-;51324:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;51457:4;51429:13;:25;51443:10;51429:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;51476:35;51486:10;50344:1;51476:9;:35::i;:::-;51047:476;50982:541;;:::o;51531:587::-;50286:12;51616:9;:18;;51608:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;50244:3;51691:1;51675:13;:11;:13::i;:::-;:17;;;;:::i;:::-;51674:33;;51666:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;51734:8;;;;;;;;;;;51726:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;51817:5;51788:34;;:13;:25;51802:10;51788:25;;;;;;;;;;;;;;;;;;;;;;;;;:34;;;51780:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;51855:12;51897:10;51880:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;51870:39;;;;;;51855:54;;51928;51947:12;;51928:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51961:14;;51977:4;51928:18;:54::i;:::-;51920:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;52052:4;52024:13;:25;52038:10;52024:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;52071:35;52081:10;50344:1;52071:9;:35::i;:::-;51595:523;51531:587;;:::o;41935:308::-;42094:28;42104:4;42110:2;42114:7;42094:9;:28::i;:::-;42138:48;42161:4;42167:2;42171:7;42180:5;42138:22;:48::i;:::-;42133:102;;42195:40;;;;;;;;;;;;;;42133:102;41935:308;;;;:::o;52128:344::-;52201:13;52235:16;52243:7;52235;:16::i;:::-;52227:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;52316:14;52333:7;52316:24;;52389:1;52366:12;52360:26;;;;;:::i;:::-;;;:30;:104;;;;;;;;;;;;;;;;;52417:12;52431:17;:6;:15;:17::i;:::-;52400:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52360:104;52353:111;;;52128:344;;;:::o;50305:40::-;50344:1;50305:40;:::o;41207:164::-;41304:4;41328:18;:25;41347:5;41328:25;;;;;;;;;;;;;;;:35;41354:8;41328:35;;;;;;;;;;;;;;;;;;;;;;;;;41321:42;;41207:164;;;;:::o;14256:201::-;13236:13;:11;:13::i;:::-;14365:1:::1;14345:22;;:8;:22;;;;14337:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14421:28;14440:8;14421:18;:28::i;:::-;14256:201:::0;:::o;52815:118::-;13236:13;:11;:13::i;:::-;52912:11:::1;52894:15;:29;;;;52815:118:::0;:::o;16048:326::-;16108:4;16365:1;16343:7;:19;;;:23;16336:30;;16048:326;;;:::o;26204:157::-;26289:4;26328:25;26313:40;;;:11;:40;;;;26306:47;;26204:157;;;:::o;13515:132::-;13590:12;:10;:12::i;:::-;13579:23;;:7;:5;:7::i;:::-;:23;;;13571:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13515:132::o;42498:112::-;42555:4;42589:13;;42579:7;:23;42572:30;;42498:112;;;:::o;11901:98::-;11954:7;11981:10;11974:17;;11901:98;:::o;47261:196::-;47403:2;47376:15;:24;47392:7;47376:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;47441:7;47437:2;47421:28;;47430:5;47421:28;;;;;;;;;;;;47261:196;;;:::o;45181:1962::-;45296:35;45334:20;45346:7;45334:11;:20::i;:::-;45296:58;;45367:22;45409:13;:18;;;45393:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;45468:12;:10;:12::i;:::-;45444:36;;:20;45456:7;45444:11;:20::i;:::-;:36;;;45393:87;:154;;;;45497:50;45514:13;:18;;;45534:12;:10;:12::i;:::-;45497:16;:50::i;:::-;45393:154;45367:181;;45566:17;45561:66;;45592:35;;;;;;;;;;;;;;45561:66;45664:4;45642:26;;:13;:18;;;:26;;;45638:67;;45677:28;;;;;;;;;;;;;;45638:67;45734:1;45720:16;;:2;:16;;;45716:52;;;45745:23;;;;;;;;;;;;;;45716:52;45781:43;45803:4;45809:2;45813:7;45822:1;45781:21;:43::i;:::-;45889:49;45906:1;45910:7;45919:13;:18;;;45889:8;:49::i;:::-;46264:1;46234:12;:18;46247:4;46234:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46308:1;46280:12;:16;46293:2;46280:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46354:2;46326:11;:20;46338:7;46326:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;46416:15;46371:11;:20;46383:7;46371:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;46684:19;46716:1;46706:7;:11;46684:33;;46777:1;46736:43;;:11;:24;46748:11;46736:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;46732:295;;;46804:20;46812:11;46804:7;:20::i;:::-;46800:212;;;46881:13;:18;;;46849:11;:24;46861:11;46849:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;46964:13;:28;;;46922:11;:24;46934:11;46922:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;46800:212;46732:295;46209:829;47074:7;47070:2;47055:27;;47064:4;47055:27;;;;;;;;;;;;47093:42;47114:4;47120:2;47124:7;47133:1;47093:20;:42::i;:::-;45285:1858;;45181:1962;;;:::o;17309:317::-;17424:6;17399:21;:31;;17391:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;17478:12;17496:9;:14;;17518:6;17496:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17477:52;;;17548:7;17540:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;17380:246;17309:317;;:::o;38347:504::-;38408:21;;:::i;:::-;38447:16;38455:7;38447;:16::i;:::-;38442:61;;38472:31;;;;;;;;;;;;;;38442:61;38546:12;38561:7;38546:22;;38541:245;38578:1;38570:4;:9;38541:245;;38608:31;38642:11;:17;38654:4;38642:17;;;;;;;;;;;38608:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38708:1;38682:28;;:9;:14;;;:28;;;38678:93;;38742:9;38735:16;;;;;;38678:93;38589:197;38581:6;;;;;;;;38541:245;;;;38816:27;;;;;;;;;;;;;;38347:504;;;;:::o;14617:191::-;14691:16;14710:6;;;;;;;;;;;14691:25;;14736:8;14727:6;;:17;;;;;;;;;;;;;;;;;;14791:8;14760:40;;14781:8;14760:40;;;;;;;;;;;;14680:128;14617:191;:::o;1219:190::-;1344:4;1397;1368:25;1381:5;1388:4;1368:12;:25::i;:::-;:33;1361:40;;1219:190;;;;;:::o;42618:104::-;42687:27;42697:2;42701:8;42687:27;;;;;;;;;;;;:9;:27::i;:::-;42618:104;;:::o;48022:765::-;48177:4;48198:15;:2;:13;;;:15::i;:::-;48194:586;;;48250:2;48234:36;;;48271:12;:10;:12::i;:::-;48285:4;48291:7;48300:5;48234:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;48230:495;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48497:1;48480:6;:13;:18;48476:234;;;48507:40;;;;;;;;;;;;;;48476:234;48660:6;48654:13;48645:6;48641:2;48637:15;48630:38;48230:495;48367:45;;;48357:55;;;:6;:55;;;;48350:62;;;;;48194:586;48764:4;48757:11;;48022:765;;;;;;;:::o;9155:723::-;9211:13;9441:1;9432:5;:10;9428:53;;;9459:10;;;;;;;;;;;;;;;;;;;;;9428:53;9491:12;9506:5;9491:20;;9522:14;9547:78;9562:1;9554:4;:9;9547:78;;9580:8;;;;;:::i;:::-;;;;9611:2;9603:10;;;;;:::i;:::-;;;9547:78;;;9635:19;9667:6;9657:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9635:39;;9685:154;9701:1;9692:5;:10;9685:154;;9729:1;9719:11;;;;;:::i;:::-;;;9796:2;9788:5;:10;;;;:::i;:::-;9775:2;:24;;;;:::i;:::-;9762:39;;9745:6;9752;9745:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;9825:2;9816:11;;;;;:::i;:::-;;;9685:154;;;9863:6;9849:21;;;;;9155:723;;;;:::o;49275:159::-;;;;;:::o;49846:158::-;;;;;:::o;2086:296::-;2169:7;2189:20;2212:4;2189:27;;2232:9;2227:118;2251:5;:12;2247:1;:16;2227:118;;;2300:33;2310:12;2324:5;2330:1;2324:8;;;;;;;;:::i;:::-;;;;;;;;2300:9;:33::i;:::-;2285:48;;2265:3;;;;;:::i;:::-;;;;2227:118;;;;2362:12;2355:19;;;2086:296;;;;:::o;43085:163::-;43208:32;43214:2;43218:8;43228:5;43235:4;43208:5;:32::i;:::-;43085:163;;;:::o;8293:149::-;8356:7;8387:1;8383;:5;:51;;8414:20;8429:1;8432;8414:14;:20::i;:::-;8383:51;;;8391:20;8406:1;8409;8391:14;:20::i;:::-;8383:51;8376:58;;8293:149;;;;:::o;43507:1420::-;43646:20;43669:13;;43646:36;;43711:1;43697:16;;:2;:16;;;43693:48;;;43722:19;;;;;;;;;;;;;;43693:48;43768:1;43756:8;:13;43752:44;;;43778:18;;;;;;;;;;;;;;43752:44;43809:61;43839:1;43843:2;43847:12;43861:8;43809:21;:61::i;:::-;44185:8;44149:12;:16;44162:2;44149:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44250:8;44209:12;:16;44222:2;44209:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44309:2;44276:11;:25;44288:12;44276:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;44376:15;44326:11;:25;44338:12;44326:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;44409:20;44432:12;44409:35;;44466:9;44461:330;44481:8;44477:1;:12;44461:330;;;44545:12;44541:2;44520:38;;44537:1;44520:38;;;;;;;;;;;;44581:4;:68;;;;;44590:59;44621:1;44625:2;44629:12;44643:5;44590:22;:59::i;:::-;44589:60;44581:68;44577:164;;;44681:40;;;;;;;;;;;;;;44577:164;44761:14;;;;;;;44491:3;;;;;;;44461:330;;;;44823:12;44807:13;:28;;;;44124:723;44859:60;44888:1;44892:2;44896:12;44910:8;44859:20;:60::i;:::-;43635:1292;43507:1420;;;;:::o;8450:268::-;8518:13;8625:1;8619:4;8612:15;8654:1;8648:4;8641:15;8695:4;8689;8679:21;8670:30;;8450:268;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:139::-;1762:5;1800:6;1787:20;1778:29;;1816:33;1843:5;1816:33;:::i;:::-;1716:139;;;;:::o;1861:137::-;1906:5;1944:6;1931:20;1922:29;;1960:32;1986:5;1960:32;:::i;:::-;1861:137;;;;:::o;2004:141::-;2060:5;2091:6;2085:13;2076:22;;2107:32;2133:5;2107:32;:::i;:::-;2004:141;;;;:::o;2164:338::-;2219:5;2268:3;2261:4;2253:6;2249:17;2245:27;2235:122;;2276:79;;:::i;:::-;2235:122;2393:6;2380:20;2418:78;2492:3;2484:6;2477:4;2469:6;2465:17;2418:78;:::i;:::-;2409:87;;2225:277;2164:338;;;;:::o;2522:340::-;2578:5;2627:3;2620:4;2612:6;2608:17;2604:27;2594:122;;2635:79;;:::i;:::-;2594:122;2752:6;2739:20;2777:79;2852:3;2844:6;2837:4;2829:6;2825:17;2777:79;:::i;:::-;2768:88;;2584:278;2522:340;;;;:::o;2868:139::-;2914:5;2952:6;2939:20;2930:29;;2968:33;2995:5;2968:33;:::i;:::-;2868:139;;;;:::o;3013:329::-;3072:6;3121:2;3109:9;3100:7;3096:23;3092:32;3089:119;;;3127:79;;:::i;:::-;3089:119;3247:1;3272:53;3317:7;3308:6;3297:9;3293:22;3272:53;:::i;:::-;3262:63;;3218:117;3013:329;;;;:::o;3348:474::-;3416:6;3424;3473:2;3461:9;3452:7;3448:23;3444:32;3441:119;;;3479:79;;:::i;:::-;3441:119;3599:1;3624:53;3669:7;3660:6;3649:9;3645:22;3624:53;:::i;:::-;3614:63;;3570:117;3726:2;3752:53;3797:7;3788:6;3777:9;3773:22;3752:53;:::i;:::-;3742:63;;3697:118;3348:474;;;;;:::o;3828:619::-;3905:6;3913;3921;3970:2;3958:9;3949:7;3945:23;3941:32;3938:119;;;3976:79;;:::i;:::-;3938:119;4096:1;4121:53;4166:7;4157:6;4146:9;4142:22;4121:53;:::i;:::-;4111:63;;4067:117;4223:2;4249:53;4294:7;4285:6;4274:9;4270:22;4249:53;:::i;:::-;4239:63;;4194:118;4351:2;4377:53;4422:7;4413:6;4402:9;4398:22;4377:53;:::i;:::-;4367:63;;4322:118;3828:619;;;;;:::o;4453:943::-;4548:6;4556;4564;4572;4621:3;4609:9;4600:7;4596:23;4592:33;4589:120;;;4628:79;;:::i;:::-;4589:120;4748:1;4773:53;4818:7;4809:6;4798:9;4794:22;4773:53;:::i;:::-;4763:63;;4719:117;4875:2;4901:53;4946:7;4937:6;4926:9;4922:22;4901:53;:::i;:::-;4891:63;;4846:118;5003:2;5029:53;5074:7;5065:6;5054:9;5050:22;5029:53;:::i;:::-;5019:63;;4974:118;5159:2;5148:9;5144:18;5131:32;5190:18;5182:6;5179:30;5176:117;;;5212:79;;:::i;:::-;5176:117;5317:62;5371:7;5362:6;5351:9;5347:22;5317:62;:::i;:::-;5307:72;;5102:287;4453:943;;;;;;;:::o;5402:468::-;5467:6;5475;5524:2;5512:9;5503:7;5499:23;5495:32;5492:119;;;5530:79;;:::i;:::-;5492:119;5650:1;5675:53;5720:7;5711:6;5700:9;5696:22;5675:53;:::i;:::-;5665:63;;5621:117;5777:2;5803:50;5845:7;5836:6;5825:9;5821:22;5803:50;:::i;:::-;5793:60;;5748:115;5402:468;;;;;:::o;5876:474::-;5944:6;5952;6001:2;5989:9;5980:7;5976:23;5972:32;5969:119;;;6007:79;;:::i;:::-;5969:119;6127:1;6152:53;6197:7;6188:6;6177:9;6173:22;6152:53;:::i;:::-;6142:63;;6098:117;6254:2;6280:53;6325:7;6316:6;6305:9;6301:22;6280:53;:::i;:::-;6270:63;;6225:118;5876:474;;;;;:::o;6356:559::-;6442:6;6450;6499:2;6487:9;6478:7;6474:23;6470:32;6467:119;;;6505:79;;:::i;:::-;6467:119;6653:1;6642:9;6638:17;6625:31;6683:18;6675:6;6672:30;6669:117;;;6705:79;;:::i;:::-;6669:117;6818:80;6890:7;6881:6;6870:9;6866:22;6818:80;:::i;:::-;6800:98;;;;6596:312;6356:559;;;;;:::o;6921:329::-;6980:6;7029:2;7017:9;7008:7;7004:23;7000:32;6997:119;;;7035:79;;:::i;:::-;6997:119;7155:1;7180:53;7225:7;7216:6;7205:9;7201:22;7180:53;:::i;:::-;7170:63;;7126:117;6921:329;;;;:::o;7256:327::-;7314:6;7363:2;7351:9;7342:7;7338:23;7334:32;7331:119;;;7369:79;;:::i;:::-;7331:119;7489:1;7514:52;7558:7;7549:6;7538:9;7534:22;7514:52;:::i;:::-;7504:62;;7460:116;7256:327;;;;:::o;7589:349::-;7658:6;7707:2;7695:9;7686:7;7682:23;7678:32;7675:119;;;7713:79;;:::i;:::-;7675:119;7833:1;7858:63;7913:7;7904:6;7893:9;7889:22;7858:63;:::i;:::-;7848:73;;7804:127;7589:349;;;;:::o;7944:509::-;8013:6;8062:2;8050:9;8041:7;8037:23;8033:32;8030:119;;;8068:79;;:::i;:::-;8030:119;8216:1;8205:9;8201:17;8188:31;8246:18;8238:6;8235:30;8232:117;;;8268:79;;:::i;:::-;8232:117;8373:63;8428:7;8419:6;8408:9;8404:22;8373:63;:::i;:::-;8363:73;;8159:287;7944:509;;;;:::o;8459:329::-;8518:6;8567:2;8555:9;8546:7;8542:23;8538:32;8535:119;;;8573:79;;:::i;:::-;8535:119;8693:1;8718:53;8763:7;8754:6;8743:9;8739:22;8718:53;:::i;:::-;8708:63;;8664:117;8459:329;;;;:::o;8794:118::-;8881:24;8899:5;8881:24;:::i;:::-;8876:3;8869:37;8794:118;;:::o;8918:157::-;9023:45;9043:24;9061:5;9043:24;:::i;:::-;9023:45;:::i;:::-;9018:3;9011:58;8918:157;;:::o;9081:109::-;9162:21;9177:5;9162:21;:::i;:::-;9157:3;9150:34;9081:109;;:::o;9196:118::-;9283:24;9301:5;9283:24;:::i;:::-;9278:3;9271:37;9196:118;;:::o;9320:360::-;9406:3;9434:38;9466:5;9434:38;:::i;:::-;9488:70;9551:6;9546:3;9488:70;:::i;:::-;9481:77;;9567:52;9612:6;9607:3;9600:4;9593:5;9589:16;9567:52;:::i;:::-;9644:29;9666:6;9644:29;:::i;:::-;9639:3;9635:39;9628:46;;9410:270;9320:360;;;;:::o;9686:364::-;9774:3;9802:39;9835:5;9802:39;:::i;:::-;9857:71;9921:6;9916:3;9857:71;:::i;:::-;9850:78;;9937:52;9982:6;9977:3;9970:4;9963:5;9959:16;9937:52;:::i;:::-;10014:29;10036:6;10014:29;:::i;:::-;10009:3;10005:39;9998:46;;9778:272;9686:364;;;;:::o;10056:377::-;10162:3;10190:39;10223:5;10190:39;:::i;:::-;10245:89;10327:6;10322:3;10245:89;:::i;:::-;10238:96;;10343:52;10388:6;10383:3;10376:4;10369:5;10365:16;10343:52;:::i;:::-;10420:6;10415:3;10411:16;10404:23;;10166:267;10056:377;;;;:::o;10463:845::-;10566:3;10603:5;10597:12;10632:36;10658:9;10632:36;:::i;:::-;10684:89;10766:6;10761:3;10684:89;:::i;:::-;10677:96;;10804:1;10793:9;10789:17;10820:1;10815:137;;;;10966:1;10961:341;;;;10782:520;;10815:137;10899:4;10895:9;10884;10880:25;10875:3;10868:38;10935:6;10930:3;10926:16;10919:23;;10815:137;;10961:341;11028:38;11060:5;11028:38;:::i;:::-;11088:1;11102:154;11116:6;11113:1;11110:13;11102:154;;;11190:7;11184:14;11180:1;11175:3;11171:11;11164:35;11240:1;11231:7;11227:15;11216:26;;11138:4;11135:1;11131:12;11126:17;;11102:154;;;11285:6;11280:3;11276:16;11269:23;;10968:334;;10782:520;;10570:738;;10463:845;;;;:::o;11314:366::-;11456:3;11477:67;11541:2;11536:3;11477:67;:::i;:::-;11470:74;;11553:93;11642:3;11553:93;:::i;:::-;11671:2;11666:3;11662:12;11655:19;;11314:366;;;:::o;11686:::-;11828:3;11849:67;11913:2;11908:3;11849:67;:::i;:::-;11842:74;;11925:93;12014:3;11925:93;:::i;:::-;12043:2;12038:3;12034:12;12027:19;;11686:366;;;:::o;12058:::-;12200:3;12221:67;12285:2;12280:3;12221:67;:::i;:::-;12214:74;;12297:93;12386:3;12297:93;:::i;:::-;12415:2;12410:3;12406:12;12399:19;;12058:366;;;:::o;12430:::-;12572:3;12593:67;12657:2;12652:3;12593:67;:::i;:::-;12586:74;;12669:93;12758:3;12669:93;:::i;:::-;12787:2;12782:3;12778:12;12771:19;;12430:366;;;:::o;12802:::-;12944:3;12965:67;13029:2;13024:3;12965:67;:::i;:::-;12958:74;;13041:93;13130:3;13041:93;:::i;:::-;13159:2;13154:3;13150:12;13143:19;;12802:366;;;:::o;13174:400::-;13334:3;13355:84;13437:1;13432:3;13355:84;:::i;:::-;13348:91;;13448:93;13537:3;13448:93;:::i;:::-;13566:1;13561:3;13557:11;13550:18;;13174:400;;;:::o;13580:366::-;13722:3;13743:67;13807:2;13802:3;13743:67;:::i;:::-;13736:74;;13819:93;13908:3;13819:93;:::i;:::-;13937:2;13932:3;13928:12;13921:19;;13580:366;;;:::o;13952:::-;14094:3;14115:67;14179:2;14174:3;14115:67;:::i;:::-;14108:74;;14191:93;14280:3;14191:93;:::i;:::-;14309:2;14304:3;14300:12;14293:19;;13952:366;;;:::o;14324:::-;14466:3;14487:67;14551:2;14546:3;14487:67;:::i;:::-;14480:74;;14563:93;14652:3;14563:93;:::i;:::-;14681:2;14676:3;14672:12;14665:19;;14324:366;;;:::o;14696:398::-;14855:3;14876:83;14957:1;14952:3;14876:83;:::i;:::-;14869:90;;14968:93;15057:3;14968:93;:::i;:::-;15086:1;15081:3;15077:11;15070:18;;14696:398;;;:::o;15100:366::-;15242:3;15263:67;15327:2;15322:3;15263:67;:::i;:::-;15256:74;;15339:93;15428:3;15339:93;:::i;:::-;15457:2;15452:3;15448:12;15441:19;;15100:366;;;:::o;15472:365::-;15614:3;15635:66;15699:1;15694:3;15635:66;:::i;:::-;15628:73;;15710:93;15799:3;15710:93;:::i;:::-;15828:2;15823:3;15819:12;15812:19;;15472:365;;;:::o;15843:366::-;15985:3;16006:67;16070:2;16065:3;16006:67;:::i;:::-;15999:74;;16082:93;16171:3;16082:93;:::i;:::-;16200:2;16195:3;16191:12;16184:19;;15843:366;;;:::o;16215:118::-;16302:24;16320:5;16302:24;:::i;:::-;16297:3;16290:37;16215:118;;:::o;16339:256::-;16451:3;16466:75;16537:3;16528:6;16466:75;:::i;:::-;16566:2;16561:3;16557:12;16550:19;;16586:3;16579:10;;16339:256;;;;:::o;16601:695::-;16879:3;16901:92;16989:3;16980:6;16901:92;:::i;:::-;16894:99;;17010:95;17101:3;17092:6;17010:95;:::i;:::-;17003:102;;17122:148;17266:3;17122:148;:::i;:::-;17115:155;;17287:3;17280:10;;16601:695;;;;;:::o;17302:379::-;17486:3;17508:147;17651:3;17508:147;:::i;:::-;17501:154;;17672:3;17665:10;;17302:379;;;:::o;17687:222::-;17780:4;17818:2;17807:9;17803:18;17795:26;;17831:71;17899:1;17888:9;17884:17;17875:6;17831:71;:::i;:::-;17687:222;;;;:::o;17915:640::-;18110:4;18148:3;18137:9;18133:19;18125:27;;18162:71;18230:1;18219:9;18215:17;18206:6;18162:71;:::i;:::-;18243:72;18311:2;18300:9;18296:18;18287:6;18243:72;:::i;:::-;18325;18393:2;18382:9;18378:18;18369:6;18325:72;:::i;:::-;18444:9;18438:4;18434:20;18429:2;18418:9;18414:18;18407:48;18472:76;18543:4;18534:6;18472:76;:::i;:::-;18464:84;;17915:640;;;;;;;:::o;18561:210::-;18648:4;18686:2;18675:9;18671:18;18663:26;;18699:65;18761:1;18750:9;18746:17;18737:6;18699:65;:::i;:::-;18561:210;;;;:::o;18777:222::-;18870:4;18908:2;18897:9;18893:18;18885:26;;18921:71;18989:1;18978:9;18974:17;18965:6;18921:71;:::i;:::-;18777:222;;;;:::o;19005:313::-;19118:4;19156:2;19145:9;19141:18;19133:26;;19205:9;19199:4;19195:20;19191:1;19180:9;19176:17;19169:47;19233:78;19306:4;19297:6;19233:78;:::i;:::-;19225:86;;19005:313;;;;:::o;19324:419::-;19490:4;19528:2;19517:9;19513:18;19505:26;;19577:9;19571:4;19567:20;19563:1;19552:9;19548:17;19541:47;19605:131;19731:4;19605:131;:::i;:::-;19597:139;;19324:419;;;:::o;19749:::-;19915:4;19953:2;19942:9;19938:18;19930:26;;20002:9;19996:4;19992:20;19988:1;19977:9;19973:17;19966:47;20030:131;20156:4;20030:131;:::i;:::-;20022:139;;19749:419;;;:::o;20174:::-;20340:4;20378:2;20367:9;20363:18;20355:26;;20427:9;20421:4;20417:20;20413:1;20402:9;20398:17;20391:47;20455:131;20581:4;20455:131;:::i;:::-;20447:139;;20174:419;;;:::o;20599:::-;20765:4;20803:2;20792:9;20788:18;20780:26;;20852:9;20846:4;20842:20;20838:1;20827:9;20823:17;20816:47;20880:131;21006:4;20880:131;:::i;:::-;20872:139;;20599:419;;;:::o;21024:::-;21190:4;21228:2;21217:9;21213:18;21205:26;;21277:9;21271:4;21267:20;21263:1;21252:9;21248:17;21241:47;21305:131;21431:4;21305:131;:::i;:::-;21297:139;;21024:419;;;:::o;21449:::-;21615:4;21653:2;21642:9;21638:18;21630:26;;21702:9;21696:4;21692:20;21688:1;21677:9;21673:17;21666:47;21730:131;21856:4;21730:131;:::i;:::-;21722:139;;21449:419;;;:::o;21874:::-;22040:4;22078:2;22067:9;22063:18;22055:26;;22127:9;22121:4;22117:20;22113:1;22102:9;22098:17;22091:47;22155:131;22281:4;22155:131;:::i;:::-;22147:139;;21874:419;;;:::o;22299:::-;22465:4;22503:2;22492:9;22488:18;22480:26;;22552:9;22546:4;22542:20;22538:1;22527:9;22523:17;22516:47;22580:131;22706:4;22580:131;:::i;:::-;22572:139;;22299:419;;;:::o;22724:::-;22890:4;22928:2;22917:9;22913:18;22905:26;;22977:9;22971:4;22967:20;22963:1;22952:9;22948:17;22941:47;23005:131;23131:4;23005:131;:::i;:::-;22997:139;;22724:419;;;:::o;23149:::-;23315:4;23353:2;23342:9;23338:18;23330:26;;23402:9;23396:4;23392:20;23388:1;23377:9;23373:17;23366:47;23430:131;23556:4;23430:131;:::i;:::-;23422:139;;23149:419;;;:::o;23574:::-;23740:4;23778:2;23767:9;23763:18;23755:26;;23827:9;23821:4;23817:20;23813:1;23802:9;23798:17;23791:47;23855:131;23981:4;23855:131;:::i;:::-;23847:139;;23574:419;;;:::o;23999:222::-;24092:4;24130:2;24119:9;24115:18;24107:26;;24143:71;24211:1;24200:9;24196:17;24187:6;24143:71;:::i;:::-;23999:222;;;;:::o;24227:129::-;24261:6;24288:20;;:::i;:::-;24278:30;;24317:33;24345:4;24337:6;24317:33;:::i;:::-;24227:129;;;:::o;24362:75::-;24395:6;24428:2;24422:9;24412:19;;24362:75;:::o;24443:307::-;24504:4;24594:18;24586:6;24583:30;24580:56;;;24616:18;;:::i;:::-;24580:56;24654:29;24676:6;24654:29;:::i;:::-;24646:37;;24738:4;24732;24728:15;24720:23;;24443:307;;;:::o;24756:308::-;24818:4;24908:18;24900:6;24897:30;24894:56;;;24930:18;;:::i;:::-;24894:56;24968:29;24990:6;24968:29;:::i;:::-;24960:37;;25052:4;25046;25042:15;25034:23;;24756:308;;;:::o;25070:141::-;25119:4;25142:3;25134:11;;25165:3;25162:1;25155:14;25199:4;25196:1;25186:18;25178:26;;25070:141;;;:::o;25217:98::-;25268:6;25302:5;25296:12;25286:22;;25217:98;;;:::o;25321:99::-;25373:6;25407:5;25401:12;25391:22;;25321:99;;;:::o;25426:168::-;25509:11;25543:6;25538:3;25531:19;25583:4;25578:3;25574:14;25559:29;;25426:168;;;;:::o;25600:147::-;25701:11;25738:3;25723:18;;25600:147;;;;:::o;25753:169::-;25837:11;25871:6;25866:3;25859:19;25911:4;25906:3;25902:14;25887:29;;25753:169;;;;:::o;25928:148::-;26030:11;26067:3;26052:18;;25928:148;;;;:::o;26082:305::-;26122:3;26141:20;26159:1;26141:20;:::i;:::-;26136:25;;26175:20;26193:1;26175:20;:::i;:::-;26170:25;;26329:1;26261:66;26257:74;26254:1;26251:81;26248:107;;;26335:18;;:::i;:::-;26248:107;26379:1;26376;26372:9;26365:16;;26082:305;;;;:::o;26393:185::-;26433:1;26450:20;26468:1;26450:20;:::i;:::-;26445:25;;26484:20;26502:1;26484:20;:::i;:::-;26479:25;;26523:1;26513:35;;26528:18;;:::i;:::-;26513:35;26570:1;26567;26563:9;26558:14;;26393:185;;;;:::o;26584:191::-;26624:4;26644:20;26662:1;26644:20;:::i;:::-;26639:25;;26678:20;26696:1;26678:20;:::i;:::-;26673:25;;26717:1;26714;26711:8;26708:34;;;26722:18;;:::i;:::-;26708:34;26767:1;26764;26760:9;26752:17;;26584:191;;;;:::o;26781:96::-;26818:7;26847:24;26865:5;26847:24;:::i;:::-;26836:35;;26781:96;;;:::o;26883:90::-;26917:7;26960:5;26953:13;26946:21;26935:32;;26883:90;;;:::o;26979:77::-;27016:7;27045:5;27034:16;;26979:77;;;:::o;27062:149::-;27098:7;27138:66;27131:5;27127:78;27116:89;;27062:149;;;:::o;27217:126::-;27254:7;27294:42;27287:5;27283:54;27272:65;;27217:126;;;:::o;27349:77::-;27386:7;27415:5;27404:16;;27349:77;;;:::o;27432:154::-;27516:6;27511:3;27506;27493:30;27578:1;27569:6;27564:3;27560:16;27553:27;27432:154;;;:::o;27592:307::-;27660:1;27670:113;27684:6;27681:1;27678:13;27670:113;;;27769:1;27764:3;27760:11;27754:18;27750:1;27745:3;27741:11;27734:39;27706:2;27703:1;27699:10;27694:15;;27670:113;;;27801:6;27798:1;27795:13;27792:101;;;27881:1;27872:6;27867:3;27863:16;27856:27;27792:101;27641:258;27592:307;;;:::o;27905:320::-;27949:6;27986:1;27980:4;27976:12;27966:22;;28033:1;28027:4;28023:12;28054:18;28044:81;;28110:4;28102:6;28098:17;28088:27;;28044:81;28172:2;28164:6;28161:14;28141:18;28138:38;28135:84;;;28191:18;;:::i;:::-;28135:84;27956:269;27905:320;;;:::o;28231:281::-;28314:27;28336:4;28314:27;:::i;:::-;28306:6;28302:40;28444:6;28432:10;28429:22;28408:18;28396:10;28393:34;28390:62;28387:88;;;28455:18;;:::i;:::-;28387:88;28495:10;28491:2;28484:22;28274:238;28231:281;;:::o;28518:233::-;28557:3;28580:24;28598:5;28580:24;:::i;:::-;28571:33;;28626:66;28619:5;28616:77;28613:103;;;28696:18;;:::i;:::-;28613:103;28743:1;28736:5;28732:13;28725:20;;28518:233;;;:::o;28757:100::-;28796:7;28825:26;28845:5;28825:26;:::i;:::-;28814:37;;28757:100;;;:::o;28863:94::-;28902:7;28931:20;28945:5;28931:20;:::i;:::-;28920:31;;28863:94;;;:::o;28963:176::-;28995:1;29012:20;29030:1;29012:20;:::i;:::-;29007:25;;29046:20;29064:1;29046:20;:::i;:::-;29041:25;;29085:1;29075:35;;29090:18;;:::i;:::-;29075:35;29131:1;29128;29124:9;29119:14;;28963:176;;;;:::o;29145:180::-;29193:77;29190:1;29183:88;29290:4;29287:1;29280:15;29314:4;29311:1;29304:15;29331:180;29379:77;29376:1;29369:88;29476:4;29473:1;29466:15;29500:4;29497:1;29490:15;29517:180;29565:77;29562:1;29555:88;29662:4;29659:1;29652:15;29686:4;29683:1;29676:15;29703:180;29751:77;29748:1;29741:88;29848:4;29845:1;29838:15;29872:4;29869:1;29862:15;29889:180;29937:77;29934:1;29927:88;30034:4;30031:1;30024:15;30058:4;30055:1;30048:15;30075:180;30123:77;30120:1;30113:88;30220:4;30217:1;30210:15;30244:4;30241:1;30234:15;30261:117;30370:1;30367;30360:12;30384:117;30493:1;30490;30483:12;30507:117;30616:1;30613;30606:12;30630:117;30739:1;30736;30729:12;30753:117;30862:1;30859;30852:12;30876:117;30985:1;30982;30975:12;30999:102;31040:6;31091:2;31087:7;31082:2;31075:5;31071:14;31067:28;31057:38;;30999:102;;;:::o;31107:94::-;31140:8;31188:5;31184:2;31180:14;31159:35;;31107:94;;;:::o;31207:163::-;31347:15;31343:1;31335:6;31331:14;31324:39;31207:163;:::o;31376:225::-;31516:34;31512:1;31504:6;31500:14;31493:58;31585:8;31580:2;31572:6;31568:15;31561:33;31376:225;:::o;31607:165::-;31747:17;31743:1;31735:6;31731:14;31724:41;31607:165;:::o;31778:245::-;31918:34;31914:1;31906:6;31902:14;31895:58;31987:28;31982:2;31974:6;31970:15;31963:53;31778:245;:::o;32029:179::-;32169:31;32165:1;32157:6;32153:14;32146:55;32029:179;:::o;32214:155::-;32354:7;32350:1;32342:6;32338:14;32331:31;32214:155;:::o;32375:182::-;32515:34;32511:1;32503:6;32499:14;32492:58;32375:182;:::o;32563:234::-;32703:34;32699:1;32691:6;32687:14;32680:58;32772:17;32767:2;32759:6;32755:15;32748:42;32563:234;:::o;32803:172::-;32943:24;32939:1;32931:6;32927:14;32920:48;32803:172;:::o;32981:114::-;;:::o;33101:166::-;33241:18;33237:1;33229:6;33225:14;33218:42;33101:166;:::o;33273:153::-;33413:5;33409:1;33401:6;33397:14;33390:29;33273:153;:::o;33432:170::-;33572:22;33568:1;33560:6;33556:14;33549:46;33432:170;:::o;33608:122::-;33681:24;33699:5;33681:24;:::i;:::-;33674:5;33671:35;33661:63;;33720:1;33717;33710:12;33661:63;33608:122;:::o;33736:116::-;33806:21;33821:5;33806:21;:::i;:::-;33799:5;33796:32;33786:60;;33842:1;33839;33832:12;33786:60;33736:116;:::o;33858:122::-;33931:24;33949:5;33931:24;:::i;:::-;33924:5;33921:35;33911:63;;33970:1;33967;33960:12;33911:63;33858:122;:::o;33986:120::-;34058:23;34075:5;34058:23;:::i;:::-;34051:5;34048:34;34038:62;;34096:1;34093;34086:12;34038:62;33986:120;:::o;34112:122::-;34185:24;34203:5;34185:24;:::i;:::-;34178:5;34175:35;34165:63;;34224:1;34221;34214:12;34165:63;34112:122;:::o

Swarm Source

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