ETH Price: $3,375.86 (+0.25%)

Token

The Sufferers (TheSufferers)
 

Overview

Max Total Supply

4,444 TheSufferers

Holders

994

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
tharun.eth
Balance
1 TheSufferers
0xa670b78c084178b2c7f8947bcd6ea5da97d82827
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:
TheSufferers

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-09
*/

// 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 BurnedQueryForZeroAddress();
error AuxQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

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

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

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

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

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

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

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

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

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

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

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

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

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


pragma solidity ^0.8.0;






contract TheSufferers is ERC721A, Ownable {
    string  public baseURI;

    uint256 public immutable _mintPrice = 0.0015 ether;
    uint32 public immutable _txLimit = 10;
    uint32 public immutable _maxSupply = 4444;
    uint32 public immutable _walletLimit = 10;

    bool public activePublic = false;

    mapping(address => uint256) public publicMinted;
    mapping(address => bool) public freeMinted;

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

    constructor()
    ERC721A ("The Sufferers", "TheSufferers") {
        _safeMint(msg.sender, 222);
    }

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

    function setBaseURI(string memory uri) public onlyOwner {
        baseURI = uri;
    }

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

    function publicMint(uint32 amount) public payable callerIsUser {
        require(activePublic,"not now");
        require(publicMinted[msg.sender] < _txLimit, "only 10 tx");
        require(totalSupply() + amount <= _maxSupply,"sold out");
        require(msg.value >= amount * _mintPrice,"insufficient eth");
        require(amount <= _walletLimit,"only 10 amount");
        publicMinted[msg.sender] += 1;
        _safeMint(msg.sender, amount);
    }

    function freeMint() public callerIsUser {
        require(activePublic,"not now");
        require(!freeMinted[msg.sender], "already minted");
        require(totalSupply() + 1 <= _maxSupply,"sold out");
        freeMinted[msg.sender] = true;
        _safeMint(msg.sender, 1);
    }

    function setActivePublic(bool active) public onlyOwner{
        activePublic = active;
    }

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

        address h = payable(msg.sender);

        bool success;

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_maxSupply","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_txLimit","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_walletLimit","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activePublic","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"amount","type":"uint32"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"publicMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"bool","name":"active","type":"bool"}],"name":"setActivePublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101006040526605543df729c000608090815250600a63ffffffff1660a09063ffffffff1660e01b81525061115c63ffffffff1660c09063ffffffff1660e01b815250600a63ffffffff1660e09063ffffffff1660e01b8152506000600a60006101000a81548160ff0219169083151502179055503480156200008157600080fd5b506040518060400160405280600d81526020017f54686520537566666572657273000000000000000000000000000000000000008152506040518060400160405280600c81526020017f546865537566666572657273000000000000000000000000000000000000000081525081600290805190602001906200010692919062000821565b5080600390805190602001906200011f92919062000821565b50620001306200017160201b60201c565b6000819055505050620001586200014c6200017660201b60201c565b6200017e60201b60201c565b6200016b3360de6200024460201b60201c565b62000b22565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002668282604051806020016040528060008152506200026a60201b60201c565b5050565b6200027f83838360016200028460201b60201c565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415620002f2576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156200032e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200034360008683876200068060201b60201c565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156200051b57506200051a8773ffffffffffffffffffffffffffffffffffffffff166200068660201b620017861760201c565b5b15620005ee575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4620005996000888480600101955088620006a960201b60201c565b620005d0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141562000522578260005414620005e857600080fd5b6200065b565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415620005ef575b8160008190555050506200067960008683876200081b60201b60201c565b5050505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620006d76200017660201b60201c565b8786866040518563ffffffff1660e01b8152600401620006fb94939291906200097d565b602060405180830381600087803b1580156200071657600080fd5b505af19250505080156200074a57506040513d601f19601f82011682018060405250810190620007479190620008e8565b60015b620007c8573d80600081146200077d576040519150601f19603f3d011682016040523d82523d6000602084013e62000782565b606091505b50600081511415620007c0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b8280546200082f9062000a8d565b90600052602060002090601f0160209004810192826200085357600085556200089f565b82601f106200086e57805160ff19168380011785556200089f565b828001600101855582156200089f579182015b828111156200089e57825182559160200191906001019062000881565b5b509050620008ae9190620008b2565b5090565b5b80821115620008cd576000816000905550600101620008b3565b5090565b600081519050620008e28162000b08565b92915050565b60006020828403121562000901576200090062000af2565b5b60006200091184828501620008d1565b91505092915050565b6200092581620009ed565b82525050565b60006200093882620009d1565b620009448185620009dc565b93506200095681856020860162000a57565b620009618162000af7565b840191505092915050565b620009778162000a4d565b82525050565b60006080820190506200099460008301876200091a565b620009a360208301866200091a565b620009b260408301856200096c565b8181036060830152620009c681846200092b565b905095945050505050565b600081519050919050565b600082825260208201905092915050565b6000620009fa8262000a2d565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000a7757808201518184015260208101905062000a5a565b8381111562000a87576000848401525b50505050565b6000600282049050600182168062000aa657607f821691505b6020821081141562000abd5762000abc62000ac3565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b62000b138162000a01565b811462000b1f57600080fd5b50565b60805160a05160e01c60c05160e01c60e05160e01c613a2e62000b8860003960008181610a32015261162b015260008181610a8501528181610d4f0152611536015260008181610e46015261148f0152600081816107f501526115b70152613a2e6000f3fe6080604052600436106101cd5760003560e01c80635b70ea9f116100f757806395d89b4111610095578063e985e9c511610064578063e985e9c514610664578063eb1909b5146106a1578063f151d791146106cc578063f2fde38b146106e8576101cd565b806395d89b41146105aa578063a22cb465146105d5578063b88d4fde146105fe578063c87b56dd14610627576101cd565b80636c0360eb116100d15780636c0360eb1461050057806370a082311461052b578063715018a6146105685780638da5cb5b1461057f576101cd565b80635b70ea9f146104815780636352211e1461049857806363553e7c146104d5576101cd565b806318160ddd1161016f5780633ccfd60b1161013e5780633ccfd60b146103ef5780633d49c9f71461040657806342842e0e1461042f57806355f804b314610458576101cd565b806318160ddd1461033357806322f4596f1461035e57806323b872dd14610389578063389fcf06146103b2576101cd565b8063081812fc116101ab578063081812fc14610265578063095ea7b3146102a25780630e2351e2146102cb5780631015805b146102f6576101cd565b806301ffc9a7146101d25780630387da421461020f57806306fdde031461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612d75565b610711565b6040516102069190613172565b60405180910390f35b34801561021b57600080fd5b506102246107f3565b60405161023191906132ef565b60405180910390f35b34801561024657600080fd5b5061024f610817565b60405161025c919061318d565b60405180910390f35b34801561027157600080fd5b5061028c60048036038101906102879190612e18565b6108a9565b604051610299919061310b565b60405180910390f35b3480156102ae57600080fd5b506102c960048036038101906102c49190612d08565b610925565b005b3480156102d757600080fd5b506102e0610a30565b6040516102ed919061330a565b60405180910390f35b34801561030257600080fd5b5061031d60048036038101906103189190612b85565b610a54565b60405161032a91906132ef565b60405180910390f35b34801561033f57600080fd5b50610348610a6c565b60405161035591906132ef565b60405180910390f35b34801561036a57600080fd5b50610373610a83565b604051610380919061330a565b60405180910390f35b34801561039557600080fd5b506103b060048036038101906103ab9190612bf2565b610aa7565b005b3480156103be57600080fd5b506103d960048036038101906103d49190612b85565b610ab7565b6040516103e69190613172565b60405180910390f35b3480156103fb57600080fd5b50610404610ad7565b005b34801561041257600080fd5b5061042d60048036038101906104289190612d48565b610b9c565b005b34801561043b57600080fd5b5061045660048036038101906104519190612bf2565b610bc1565b005b34801561046457600080fd5b5061047f600480360381019061047a9190612dcf565b610be1565b005b34801561048d57600080fd5b50610496610c03565b005b3480156104a457600080fd5b506104bf60048036038101906104ba9190612e18565b610e2e565b6040516104cc919061310b565b60405180910390f35b3480156104e157600080fd5b506104ea610e44565b6040516104f7919061330a565b60405180910390f35b34801561050c57600080fd5b50610515610e68565b604051610522919061318d565b60405180910390f35b34801561053757600080fd5b50610552600480360381019061054d9190612b85565b610ef6565b60405161055f91906132ef565b60405180910390f35b34801561057457600080fd5b5061057d610fc6565b005b34801561058b57600080fd5b50610594610fda565b6040516105a1919061310b565b60405180910390f35b3480156105b657600080fd5b506105bf611004565b6040516105cc919061318d565b60405180910390f35b3480156105e157600080fd5b506105fc60048036038101906105f79190612cc8565b611096565b005b34801561060a57600080fd5b5061062560048036038101906106209190612c45565b61120e565b005b34801561063357600080fd5b5061064e60048036038101906106499190612e18565b61128a565b60405161065b919061318d565b60405180910390f35b34801561067057600080fd5b5061068b60048036038101906106869190612bb2565b611329565b6040516106989190613172565b60405180910390f35b3480156106ad57600080fd5b506106b66113bd565b6040516106c39190613172565b60405180910390f35b6106e660048036038101906106e19190612e45565b6113d0565b005b3480156106f457600080fd5b5061070f600480360381019061070a9190612b85565b611702565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107dc57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107ec57506107eb826117a9565b5b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b606060028054610826906135d5565b80601f0160208091040260200160405190810160405280929190818152602001828054610852906135d5565b801561089f5780601f106108745761010080835404028352916020019161089f565b820191906000526020600020905b81548152906001019060200180831161088257829003601f168201915b5050505050905090565b60006108b482611813565b6108ea576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061093082610e2e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610998576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109b7611861565b73ffffffffffffffffffffffffffffffffffffffff16141580156109e957506109e7816109e2611861565b611329565b155b15610a20576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a2b838383611869565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600b6020528060005260406000206000915090505481565b6000610a7661191b565b6001546000540303905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b610ab2838383611920565b505050565b600c6020528060005260406000206000915054906101000a900460ff1681565b610adf611e11565b6000479050600033905060008173ffffffffffffffffffffffffffffffffffffffff1683604051610b0f906130f6565b60006040518083038185875af1925050503d8060008114610b4c576040519150601f19603f3d011682016040523d82523d6000602084013e610b51565b606091505b50508091505080610b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8e906131ef565b60405180910390fd5b505050565b610ba4611e11565b80600a60006101000a81548160ff02191690831515021790555050565b610bdc8383836040518060200160405280600081525061120e565b505050565b610be9611e11565b8060099080519060200190610bff929190612941565b5050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610c71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c689061324f565b60405180910390fd5b600a60009054906101000a900460ff16610cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb7906132af565b60405180910390fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d44906132cf565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff166001610d7e610a6c565b610d8891906133fa565b1115610dc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc09061320f565b60405180910390fd5b6001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610e2c336001611e8f565b565b6000610e3982611ead565b600001519050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60098054610e75906135d5565b80601f0160208091040260200160405190810160405280929190818152602001828054610ea1906135d5565b8015610eee5780601f10610ec357610100808354040283529160200191610eee565b820191906000526020600020905b815481529060010190602001808311610ed157829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f5e576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610fce611e11565b610fd8600061213c565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054611013906135d5565b80601f016020809104026020016040519081016040528092919081815260200182805461103f906135d5565b801561108c5780601f106110615761010080835404028352916020019161108c565b820191906000526020600020905b81548152906001019060200180831161106f57829003601f168201915b5050505050905090565b61109e611861565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611103576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611110611861565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166111bd611861565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112029190613172565b60405180910390a35050565b611219848484611920565b6112388373ffffffffffffffffffffffffffffffffffffffff16611786565b801561124d575061124b84848484612202565b155b15611284576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061129582611813565b6112cb576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006112d5612362565b90506000815114156112f65760405180602001604052806000815250611321565b80611300846123f4565b6040516020016113119291906130d2565b6040516020818303038152906040525b915050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600a60009054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461143e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114359061324f565b60405180910390fd5b600a60009054906101000a900460ff1661148d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611484906132af565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff16600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611534576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152b906131cf565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168163ffffffff1661156a610a6c565b61157491906133fa565b11156115b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ac9061320f565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008163ffffffff166115e79190613481565b341015611629576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116209061322f565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168163ffffffff161115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f9061326f565b60405180910390fd5b6001600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116e891906133fa565b925050819055506116ff338263ffffffff16611e8f565b50565b61170a611e11565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561177a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611771906131af565b60405180910390fd5b6117838161213c565b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161181e61191b565b1115801561182d575060005482105b801561185a575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061192b82611ead565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611952611861565b73ffffffffffffffffffffffffffffffffffffffff1614806119855750611984826000015161197f611861565b611329565b5b806119ca5750611993611861565b73ffffffffffffffffffffffffffffffffffffffff166119b2846108a9565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611a03576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611a6c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611ad3576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ae08585856001612555565b611af06000848460000151611869565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611da157600054811015611da05782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e0a858585600161255b565b5050505050565b611e19611861565b73ffffffffffffffffffffffffffffffffffffffff16611e37610fda565b73ffffffffffffffffffffffffffffffffffffffff1614611e8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e849061328f565b60405180910390fd5b565b611ea9828260405180602001604052806000815250612561565b5050565b611eb56129c7565b600082905080611ec361191b565b11158015611ed2575060005481105b15612105576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161210357600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611fe7578092505050612137565b5b60011561210257818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146120fd578092505050612137565b611fe8565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612228611861565b8786866040518563ffffffff1660e01b815260040161224a9493929190613126565b602060405180830381600087803b15801561226457600080fd5b505af192505050801561229557506040513d601f19601f820116820180604052508101906122929190612da2565b60015b61230f573d80600081146122c5576040519150601f19603f3d011682016040523d82523d6000602084013e6122ca565b606091505b50600081511415612307576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054612371906135d5565b80601f016020809104026020016040519081016040528092919081815260200182805461239d906135d5565b80156123ea5780601f106123bf576101008083540402835291602001916123ea565b820191906000526020600020905b8154815290600101906020018083116123cd57829003601f168201915b5050505050905090565b6060600082141561243c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612550565b600082905060005b6000821461246e57808061245790613638565b915050600a826124679190613450565b9150612444565b60008167ffffffffffffffff81111561248a5761248961376e565b5b6040519080825280601f01601f1916602001820160405280156124bc5781602001600182028036833780820191505090505b5090505b60008514612549576001826124d591906134db565b9150600a856124e49190613681565b60306124f091906133fa565b60f81b8183815181106125065761250561373f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125429190613450565b94506124c0565b8093505050505b919050565b50505050565b50505050565b61256e8383836001612573565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156125e0576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561261b576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126286000868387612555565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156127f257506127f18773ffffffffffffffffffffffffffffffffffffffff16611786565b5b156128b8575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128676000888480600101955088612202565b61289d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156127f85782600054146128b357600080fd5b612924565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156128b9575b81600081905550505061293a600086838761255b565b5050505050565b82805461294d906135d5565b90600052602060002090601f01602090048101928261296f57600085556129b6565b82601f1061298857805160ff19168380011785556129b6565b828001600101855582156129b6579182015b828111156129b557825182559160200191906001019061299a565b5b5090506129c39190612a0a565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612a23576000816000905550600101612a0b565b5090565b6000612a3a612a358461334a565b613325565b905082815260208101848484011115612a5657612a556137a2565b5b612a61848285613593565b509392505050565b6000612a7c612a778461337b565b613325565b905082815260208101848484011115612a9857612a976137a2565b5b612aa3848285613593565b509392505050565b600081359050612aba81613985565b92915050565b600081359050612acf8161399c565b92915050565b600081359050612ae4816139b3565b92915050565b600081519050612af9816139b3565b92915050565b600082601f830112612b1457612b1361379d565b5b8135612b24848260208601612a27565b91505092915050565b600082601f830112612b4257612b4161379d565b5b8135612b52848260208601612a69565b91505092915050565b600081359050612b6a816139ca565b92915050565b600081359050612b7f816139e1565b92915050565b600060208284031215612b9b57612b9a6137ac565b5b6000612ba984828501612aab565b91505092915050565b60008060408385031215612bc957612bc86137ac565b5b6000612bd785828601612aab565b9250506020612be885828601612aab565b9150509250929050565b600080600060608486031215612c0b57612c0a6137ac565b5b6000612c1986828701612aab565b9350506020612c2a86828701612aab565b9250506040612c3b86828701612b5b565b9150509250925092565b60008060008060808587031215612c5f57612c5e6137ac565b5b6000612c6d87828801612aab565b9450506020612c7e87828801612aab565b9350506040612c8f87828801612b5b565b925050606085013567ffffffffffffffff811115612cb057612caf6137a7565b5b612cbc87828801612aff565b91505092959194509250565b60008060408385031215612cdf57612cde6137ac565b5b6000612ced85828601612aab565b9250506020612cfe85828601612ac0565b9150509250929050565b60008060408385031215612d1f57612d1e6137ac565b5b6000612d2d85828601612aab565b9250506020612d3e85828601612b5b565b9150509250929050565b600060208284031215612d5e57612d5d6137ac565b5b6000612d6c84828501612ac0565b91505092915050565b600060208284031215612d8b57612d8a6137ac565b5b6000612d9984828501612ad5565b91505092915050565b600060208284031215612db857612db76137ac565b5b6000612dc684828501612aea565b91505092915050565b600060208284031215612de557612de46137ac565b5b600082013567ffffffffffffffff811115612e0357612e026137a7565b5b612e0f84828501612b2d565b91505092915050565b600060208284031215612e2e57612e2d6137ac565b5b6000612e3c84828501612b5b565b91505092915050565b600060208284031215612e5b57612e5a6137ac565b5b6000612e6984828501612b70565b91505092915050565b612e7b8161350f565b82525050565b612e8a81613521565b82525050565b6000612e9b826133ac565b612ea581856133c2565b9350612eb58185602086016135a2565b612ebe816137b1565b840191505092915050565b6000612ed4826133b7565b612ede81856133de565b9350612eee8185602086016135a2565b612ef7816137b1565b840191505092915050565b6000612f0d826133b7565b612f1781856133ef565b9350612f278185602086016135a2565b80840191505092915050565b6000612f406026836133de565b9150612f4b826137c2565b604082019050919050565b6000612f63600a836133de565b9150612f6e82613811565b602082019050919050565b6000612f866018836133de565b9150612f918261383a565b602082019050919050565b6000612fa96008836133de565b9150612fb482613863565b602082019050919050565b6000612fcc6010836133de565b9150612fd78261388c565b602082019050919050565b6000612fef601e836133de565b9150612ffa826138b5565b602082019050919050565b6000613012600e836133de565b915061301d826138de565b602082019050919050565b60006130356020836133de565b915061304082613907565b602082019050919050565b60006130586000836133d3565b915061306382613930565b600082019050919050565b600061307b6007836133de565b915061308682613933565b602082019050919050565b600061309e600e836133de565b91506130a98261395c565b602082019050919050565b6130bd81613579565b82525050565b6130cc81613583565b82525050565b60006130de8285612f02565b91506130ea8284612f02565b91508190509392505050565b60006131018261304b565b9150819050919050565b60006020820190506131206000830184612e72565b92915050565b600060808201905061313b6000830187612e72565b6131486020830186612e72565b61315560408301856130b4565b81810360608301526131678184612e90565b905095945050505050565b60006020820190506131876000830184612e81565b92915050565b600060208201905081810360008301526131a78184612ec9565b905092915050565b600060208201905081810360008301526131c881612f33565b9050919050565b600060208201905081810360008301526131e881612f56565b9050919050565b6000602082019050818103600083015261320881612f79565b9050919050565b6000602082019050818103600083015261322881612f9c565b9050919050565b6000602082019050818103600083015261324881612fbf565b9050919050565b6000602082019050818103600083015261326881612fe2565b9050919050565b6000602082019050818103600083015261328881613005565b9050919050565b600060208201905081810360008301526132a881613028565b9050919050565b600060208201905081810360008301526132c88161306e565b9050919050565b600060208201905081810360008301526132e881613091565b9050919050565b600060208201905061330460008301846130b4565b92915050565b600060208201905061331f60008301846130c3565b92915050565b600061332f613340565b905061333b8282613607565b919050565b6000604051905090565b600067ffffffffffffffff8211156133655761336461376e565b5b61336e826137b1565b9050602081019050919050565b600067ffffffffffffffff8211156133965761339561376e565b5b61339f826137b1565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061340582613579565b915061341083613579565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613445576134446136b2565b5b828201905092915050565b600061345b82613579565b915061346683613579565b925082613476576134756136e1565b5b828204905092915050565b600061348c82613579565b915061349783613579565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156134d0576134cf6136b2565b5b828202905092915050565b60006134e682613579565b91506134f183613579565b925082821015613504576135036136b2565b5b828203905092915050565b600061351a82613559565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b82818337600083830152505050565b60005b838110156135c05780820151818401526020810190506135a5565b838111156135cf576000848401525b50505050565b600060028204905060018216806135ed57607f821691505b6020821081141561360157613600613710565b5b50919050565b613610826137b1565b810181811067ffffffffffffffff8211171561362f5761362e61376e565b5b80604052505050565b600061364382613579565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613676576136756136b2565b5b600182019050919050565b600061368c82613579565b915061369783613579565b9250826136a7576136a66136e1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f6f6e6c7920313020747800000000000000000000000000000000000000000000600082015250565b7f5472616e73616374696f6e20556e7375636365737366756c0000000000000000600082015250565b7f736f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b7f696e73756666696369656e742065746800000000000000000000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f6f6e6c7920313020616d6f756e74000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b7f6e6f74206e6f7700000000000000000000000000000000000000000000000000600082015250565b7f616c7265616479206d696e746564000000000000000000000000000000000000600082015250565b61398e8161350f565b811461399957600080fd5b50565b6139a581613521565b81146139b057600080fd5b50565b6139bc8161352d565b81146139c757600080fd5b50565b6139d381613579565b81146139de57600080fd5b50565b6139ea81613583565b81146139f557600080fd5b5056fea2646970667358221220e3ad32214d4add6afe44d30e22740066204fc55662ab66680e4d9fd1718a0e0f64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101cd5760003560e01c80635b70ea9f116100f757806395d89b4111610095578063e985e9c511610064578063e985e9c514610664578063eb1909b5146106a1578063f151d791146106cc578063f2fde38b146106e8576101cd565b806395d89b41146105aa578063a22cb465146105d5578063b88d4fde146105fe578063c87b56dd14610627576101cd565b80636c0360eb116100d15780636c0360eb1461050057806370a082311461052b578063715018a6146105685780638da5cb5b1461057f576101cd565b80635b70ea9f146104815780636352211e1461049857806363553e7c146104d5576101cd565b806318160ddd1161016f5780633ccfd60b1161013e5780633ccfd60b146103ef5780633d49c9f71461040657806342842e0e1461042f57806355f804b314610458576101cd565b806318160ddd1461033357806322f4596f1461035e57806323b872dd14610389578063389fcf06146103b2576101cd565b8063081812fc116101ab578063081812fc14610265578063095ea7b3146102a25780630e2351e2146102cb5780631015805b146102f6576101cd565b806301ffc9a7146101d25780630387da421461020f57806306fdde031461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612d75565b610711565b6040516102069190613172565b60405180910390f35b34801561021b57600080fd5b506102246107f3565b60405161023191906132ef565b60405180910390f35b34801561024657600080fd5b5061024f610817565b60405161025c919061318d565b60405180910390f35b34801561027157600080fd5b5061028c60048036038101906102879190612e18565b6108a9565b604051610299919061310b565b60405180910390f35b3480156102ae57600080fd5b506102c960048036038101906102c49190612d08565b610925565b005b3480156102d757600080fd5b506102e0610a30565b6040516102ed919061330a565b60405180910390f35b34801561030257600080fd5b5061031d60048036038101906103189190612b85565b610a54565b60405161032a91906132ef565b60405180910390f35b34801561033f57600080fd5b50610348610a6c565b60405161035591906132ef565b60405180910390f35b34801561036a57600080fd5b50610373610a83565b604051610380919061330a565b60405180910390f35b34801561039557600080fd5b506103b060048036038101906103ab9190612bf2565b610aa7565b005b3480156103be57600080fd5b506103d960048036038101906103d49190612b85565b610ab7565b6040516103e69190613172565b60405180910390f35b3480156103fb57600080fd5b50610404610ad7565b005b34801561041257600080fd5b5061042d60048036038101906104289190612d48565b610b9c565b005b34801561043b57600080fd5b5061045660048036038101906104519190612bf2565b610bc1565b005b34801561046457600080fd5b5061047f600480360381019061047a9190612dcf565b610be1565b005b34801561048d57600080fd5b50610496610c03565b005b3480156104a457600080fd5b506104bf60048036038101906104ba9190612e18565b610e2e565b6040516104cc919061310b565b60405180910390f35b3480156104e157600080fd5b506104ea610e44565b6040516104f7919061330a565b60405180910390f35b34801561050c57600080fd5b50610515610e68565b604051610522919061318d565b60405180910390f35b34801561053757600080fd5b50610552600480360381019061054d9190612b85565b610ef6565b60405161055f91906132ef565b60405180910390f35b34801561057457600080fd5b5061057d610fc6565b005b34801561058b57600080fd5b50610594610fda565b6040516105a1919061310b565b60405180910390f35b3480156105b657600080fd5b506105bf611004565b6040516105cc919061318d565b60405180910390f35b3480156105e157600080fd5b506105fc60048036038101906105f79190612cc8565b611096565b005b34801561060a57600080fd5b5061062560048036038101906106209190612c45565b61120e565b005b34801561063357600080fd5b5061064e60048036038101906106499190612e18565b61128a565b60405161065b919061318d565b60405180910390f35b34801561067057600080fd5b5061068b60048036038101906106869190612bb2565b611329565b6040516106989190613172565b60405180910390f35b3480156106ad57600080fd5b506106b66113bd565b6040516106c39190613172565b60405180910390f35b6106e660048036038101906106e19190612e45565b6113d0565b005b3480156106f457600080fd5b5061070f600480360381019061070a9190612b85565b611702565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107dc57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107ec57506107eb826117a9565b5b9050919050565b7f0000000000000000000000000000000000000000000000000005543df729c00081565b606060028054610826906135d5565b80601f0160208091040260200160405190810160405280929190818152602001828054610852906135d5565b801561089f5780601f106108745761010080835404028352916020019161089f565b820191906000526020600020905b81548152906001019060200180831161088257829003601f168201915b5050505050905090565b60006108b482611813565b6108ea576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061093082610e2e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610998576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109b7611861565b73ffffffffffffffffffffffffffffffffffffffff16141580156109e957506109e7816109e2611861565b611329565b155b15610a20576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a2b838383611869565b505050565b7f000000000000000000000000000000000000000000000000000000000000000a81565b600b6020528060005260406000206000915090505481565b6000610a7661191b565b6001546000540303905090565b7f000000000000000000000000000000000000000000000000000000000000115c81565b610ab2838383611920565b505050565b600c6020528060005260406000206000915054906101000a900460ff1681565b610adf611e11565b6000479050600033905060008173ffffffffffffffffffffffffffffffffffffffff1683604051610b0f906130f6565b60006040518083038185875af1925050503d8060008114610b4c576040519150601f19603f3d011682016040523d82523d6000602084013e610b51565b606091505b50508091505080610b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8e906131ef565b60405180910390fd5b505050565b610ba4611e11565b80600a60006101000a81548160ff02191690831515021790555050565b610bdc8383836040518060200160405280600081525061120e565b505050565b610be9611e11565b8060099080519060200190610bff929190612941565b5050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610c71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c689061324f565b60405180910390fd5b600a60009054906101000a900460ff16610cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb7906132af565b60405180910390fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d44906132cf565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000115c63ffffffff166001610d7e610a6c565b610d8891906133fa565b1115610dc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc09061320f565b60405180910390fd5b6001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610e2c336001611e8f565b565b6000610e3982611ead565b600001519050919050565b7f000000000000000000000000000000000000000000000000000000000000000a81565b60098054610e75906135d5565b80601f0160208091040260200160405190810160405280929190818152602001828054610ea1906135d5565b8015610eee5780601f10610ec357610100808354040283529160200191610eee565b820191906000526020600020905b815481529060010190602001808311610ed157829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f5e576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610fce611e11565b610fd8600061213c565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054611013906135d5565b80601f016020809104026020016040519081016040528092919081815260200182805461103f906135d5565b801561108c5780601f106110615761010080835404028352916020019161108c565b820191906000526020600020905b81548152906001019060200180831161106f57829003601f168201915b5050505050905090565b61109e611861565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611103576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611110611861565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166111bd611861565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112029190613172565b60405180910390a35050565b611219848484611920565b6112388373ffffffffffffffffffffffffffffffffffffffff16611786565b801561124d575061124b84848484612202565b155b15611284576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061129582611813565b6112cb576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006112d5612362565b90506000815114156112f65760405180602001604052806000815250611321565b80611300846123f4565b6040516020016113119291906130d2565b6040516020818303038152906040525b915050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600a60009054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461143e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114359061324f565b60405180910390fd5b600a60009054906101000a900460ff1661148d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611484906132af565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000a63ffffffff16600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611534576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152b906131cf565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000115c63ffffffff168163ffffffff1661156a610a6c565b61157491906133fa565b11156115b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ac9061320f565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000005543df729c0008163ffffffff166115e79190613481565b341015611629576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116209061322f565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000a63ffffffff168163ffffffff161115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f9061326f565b60405180910390fd5b6001600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116e891906133fa565b925050819055506116ff338263ffffffff16611e8f565b50565b61170a611e11565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561177a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611771906131af565b60405180910390fd5b6117838161213c565b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161181e61191b565b1115801561182d575060005482105b801561185a575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061192b82611ead565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611952611861565b73ffffffffffffffffffffffffffffffffffffffff1614806119855750611984826000015161197f611861565b611329565b5b806119ca5750611993611861565b73ffffffffffffffffffffffffffffffffffffffff166119b2846108a9565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611a03576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611a6c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611ad3576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ae08585856001612555565b611af06000848460000151611869565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611da157600054811015611da05782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e0a858585600161255b565b5050505050565b611e19611861565b73ffffffffffffffffffffffffffffffffffffffff16611e37610fda565b73ffffffffffffffffffffffffffffffffffffffff1614611e8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e849061328f565b60405180910390fd5b565b611ea9828260405180602001604052806000815250612561565b5050565b611eb56129c7565b600082905080611ec361191b565b11158015611ed2575060005481105b15612105576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161210357600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611fe7578092505050612137565b5b60011561210257818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146120fd578092505050612137565b611fe8565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612228611861565b8786866040518563ffffffff1660e01b815260040161224a9493929190613126565b602060405180830381600087803b15801561226457600080fd5b505af192505050801561229557506040513d601f19601f820116820180604052508101906122929190612da2565b60015b61230f573d80600081146122c5576040519150601f19603f3d011682016040523d82523d6000602084013e6122ca565b606091505b50600081511415612307576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054612371906135d5565b80601f016020809104026020016040519081016040528092919081815260200182805461239d906135d5565b80156123ea5780601f106123bf576101008083540402835291602001916123ea565b820191906000526020600020905b8154815290600101906020018083116123cd57829003601f168201915b5050505050905090565b6060600082141561243c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612550565b600082905060005b6000821461246e57808061245790613638565b915050600a826124679190613450565b9150612444565b60008167ffffffffffffffff81111561248a5761248961376e565b5b6040519080825280601f01601f1916602001820160405280156124bc5781602001600182028036833780820191505090505b5090505b60008514612549576001826124d591906134db565b9150600a856124e49190613681565b60306124f091906133fa565b60f81b8183815181106125065761250561373f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125429190613450565b94506124c0565b8093505050505b919050565b50505050565b50505050565b61256e8383836001612573565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156125e0576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561261b576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126286000868387612555565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156127f257506127f18773ffffffffffffffffffffffffffffffffffffffff16611786565b5b156128b8575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128676000888480600101955088612202565b61289d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156127f85782600054146128b357600080fd5b612924565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156128b9575b81600081905550505061293a600086838761255b565b5050505050565b82805461294d906135d5565b90600052602060002090601f01602090048101928261296f57600085556129b6565b82601f1061298857805160ff19168380011785556129b6565b828001600101855582156129b6579182015b828111156129b557825182559160200191906001019061299a565b5b5090506129c39190612a0a565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612a23576000816000905550600101612a0b565b5090565b6000612a3a612a358461334a565b613325565b905082815260208101848484011115612a5657612a556137a2565b5b612a61848285613593565b509392505050565b6000612a7c612a778461337b565b613325565b905082815260208101848484011115612a9857612a976137a2565b5b612aa3848285613593565b509392505050565b600081359050612aba81613985565b92915050565b600081359050612acf8161399c565b92915050565b600081359050612ae4816139b3565b92915050565b600081519050612af9816139b3565b92915050565b600082601f830112612b1457612b1361379d565b5b8135612b24848260208601612a27565b91505092915050565b600082601f830112612b4257612b4161379d565b5b8135612b52848260208601612a69565b91505092915050565b600081359050612b6a816139ca565b92915050565b600081359050612b7f816139e1565b92915050565b600060208284031215612b9b57612b9a6137ac565b5b6000612ba984828501612aab565b91505092915050565b60008060408385031215612bc957612bc86137ac565b5b6000612bd785828601612aab565b9250506020612be885828601612aab565b9150509250929050565b600080600060608486031215612c0b57612c0a6137ac565b5b6000612c1986828701612aab565b9350506020612c2a86828701612aab565b9250506040612c3b86828701612b5b565b9150509250925092565b60008060008060808587031215612c5f57612c5e6137ac565b5b6000612c6d87828801612aab565b9450506020612c7e87828801612aab565b9350506040612c8f87828801612b5b565b925050606085013567ffffffffffffffff811115612cb057612caf6137a7565b5b612cbc87828801612aff565b91505092959194509250565b60008060408385031215612cdf57612cde6137ac565b5b6000612ced85828601612aab565b9250506020612cfe85828601612ac0565b9150509250929050565b60008060408385031215612d1f57612d1e6137ac565b5b6000612d2d85828601612aab565b9250506020612d3e85828601612b5b565b9150509250929050565b600060208284031215612d5e57612d5d6137ac565b5b6000612d6c84828501612ac0565b91505092915050565b600060208284031215612d8b57612d8a6137ac565b5b6000612d9984828501612ad5565b91505092915050565b600060208284031215612db857612db76137ac565b5b6000612dc684828501612aea565b91505092915050565b600060208284031215612de557612de46137ac565b5b600082013567ffffffffffffffff811115612e0357612e026137a7565b5b612e0f84828501612b2d565b91505092915050565b600060208284031215612e2e57612e2d6137ac565b5b6000612e3c84828501612b5b565b91505092915050565b600060208284031215612e5b57612e5a6137ac565b5b6000612e6984828501612b70565b91505092915050565b612e7b8161350f565b82525050565b612e8a81613521565b82525050565b6000612e9b826133ac565b612ea581856133c2565b9350612eb58185602086016135a2565b612ebe816137b1565b840191505092915050565b6000612ed4826133b7565b612ede81856133de565b9350612eee8185602086016135a2565b612ef7816137b1565b840191505092915050565b6000612f0d826133b7565b612f1781856133ef565b9350612f278185602086016135a2565b80840191505092915050565b6000612f406026836133de565b9150612f4b826137c2565b604082019050919050565b6000612f63600a836133de565b9150612f6e82613811565b602082019050919050565b6000612f866018836133de565b9150612f918261383a565b602082019050919050565b6000612fa96008836133de565b9150612fb482613863565b602082019050919050565b6000612fcc6010836133de565b9150612fd78261388c565b602082019050919050565b6000612fef601e836133de565b9150612ffa826138b5565b602082019050919050565b6000613012600e836133de565b915061301d826138de565b602082019050919050565b60006130356020836133de565b915061304082613907565b602082019050919050565b60006130586000836133d3565b915061306382613930565b600082019050919050565b600061307b6007836133de565b915061308682613933565b602082019050919050565b600061309e600e836133de565b91506130a98261395c565b602082019050919050565b6130bd81613579565b82525050565b6130cc81613583565b82525050565b60006130de8285612f02565b91506130ea8284612f02565b91508190509392505050565b60006131018261304b565b9150819050919050565b60006020820190506131206000830184612e72565b92915050565b600060808201905061313b6000830187612e72565b6131486020830186612e72565b61315560408301856130b4565b81810360608301526131678184612e90565b905095945050505050565b60006020820190506131876000830184612e81565b92915050565b600060208201905081810360008301526131a78184612ec9565b905092915050565b600060208201905081810360008301526131c881612f33565b9050919050565b600060208201905081810360008301526131e881612f56565b9050919050565b6000602082019050818103600083015261320881612f79565b9050919050565b6000602082019050818103600083015261322881612f9c565b9050919050565b6000602082019050818103600083015261324881612fbf565b9050919050565b6000602082019050818103600083015261326881612fe2565b9050919050565b6000602082019050818103600083015261328881613005565b9050919050565b600060208201905081810360008301526132a881613028565b9050919050565b600060208201905081810360008301526132c88161306e565b9050919050565b600060208201905081810360008301526132e881613091565b9050919050565b600060208201905061330460008301846130b4565b92915050565b600060208201905061331f60008301846130c3565b92915050565b600061332f613340565b905061333b8282613607565b919050565b6000604051905090565b600067ffffffffffffffff8211156133655761336461376e565b5b61336e826137b1565b9050602081019050919050565b600067ffffffffffffffff8211156133965761339561376e565b5b61339f826137b1565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061340582613579565b915061341083613579565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613445576134446136b2565b5b828201905092915050565b600061345b82613579565b915061346683613579565b925082613476576134756136e1565b5b828204905092915050565b600061348c82613579565b915061349783613579565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156134d0576134cf6136b2565b5b828202905092915050565b60006134e682613579565b91506134f183613579565b925082821015613504576135036136b2565b5b828203905092915050565b600061351a82613559565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b82818337600083830152505050565b60005b838110156135c05780820151818401526020810190506135a5565b838111156135cf576000848401525b50505050565b600060028204905060018216806135ed57607f821691505b6020821081141561360157613600613710565b5b50919050565b613610826137b1565b810181811067ffffffffffffffff8211171561362f5761362e61376e565b5b80604052505050565b600061364382613579565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613676576136756136b2565b5b600182019050919050565b600061368c82613579565b915061369783613579565b9250826136a7576136a66136e1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f6f6e6c7920313020747800000000000000000000000000000000000000000000600082015250565b7f5472616e73616374696f6e20556e7375636365737366756c0000000000000000600082015250565b7f736f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b7f696e73756666696369656e742065746800000000000000000000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f6f6e6c7920313020616d6f756e74000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b7f6e6f74206e6f7700000000000000000000000000000000000000000000000000600082015250565b7f616c7265616479206d696e746564000000000000000000000000000000000000600082015250565b61398e8161350f565b811461399957600080fd5b50565b6139a581613521565b81146139b057600080fd5b50565b6139bc8161352d565b81146139c757600080fd5b50565b6139d381613579565b81146139de57600080fd5b50565b6139ea81613583565b81146139f557600080fd5b5056fea2646970667358221220e3ad32214d4add6afe44d30e22740066204fc55662ab66680e4d9fd1718a0e0f64736f6c63430008070033

Deployed Bytecode Sourcemap

55133:2145:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37607:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55213:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40992:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42495:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42058:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55362:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55453:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36856:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55314:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43352:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55507:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56997:278;;;;;;;;;;;;;:::i;:::-;;56895:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43593:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55918:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56599:288;;;;;;;;;;;;;:::i;:::-;;40801:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55270:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55182:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37976:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13998:103;;;;;;;;;;;;;:::i;:::-;;13350:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41161:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42771:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43849:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41336:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43121:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55412:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56132:459;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14256:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37607:305;37709:4;37761:25;37746:40;;;:11;:40;;;;:105;;;;37818:33;37803:48;;;:11;:48;;;;37746:105;:158;;;;37868:36;37892:11;37868:23;:36::i;:::-;37746:158;37726:178;;37607:305;;;:::o;55213:50::-;;;:::o;40992:100::-;41046:13;41079:5;41072:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40992:100;:::o;42495:204::-;42563:7;42588:16;42596:7;42588;:16::i;:::-;42583:64;;42613:34;;;;;;;;;;;;;;42583:64;42667:15;:24;42683:7;42667:24;;;;;;;;;;;;;;;;;;;;;42660:31;;42495:204;;;:::o;42058:371::-;42131:13;42147:24;42163:7;42147:15;:24::i;:::-;42131:40;;42192:5;42186:11;;:2;:11;;;42182:48;;;42206:24;;;;;;;;;;;;;;42182:48;42263:5;42247:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;42273:37;42290:5;42297:12;:10;:12::i;:::-;42273:16;:37::i;:::-;42272:38;42247:63;42243:138;;;42334:35;;;;;;;;;;;;;;42243:138;42393:28;42402:2;42406:7;42415:5;42393:8;:28::i;:::-;42120:309;42058:371;;:::o;55362:41::-;;;:::o;55453:47::-;;;;;;;;;;;;;;;;;:::o;36856:303::-;36900:7;37125:15;:13;:15::i;:::-;37110:12;;37094:13;;:28;:46;37087:53;;36856:303;:::o;55314:41::-;;;:::o;43352:170::-;43486:28;43496:4;43502:2;43506:7;43486:9;:28::i;:::-;43352:170;;;:::o;55507:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;56997:278::-;13236:13;:11;:13::i;:::-;57045:18:::1;57066:21;57045:42;;57100:9;57120:10;57100:31;;57144:12;57183:1;:6;;57197:10;57183:29;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57169:43;;;;;57231:7;57223:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;57034:241;;;56997:278::o:0;56895:94::-;13236:13;:11;:13::i;:::-;56975:6:::1;56960:12;;:21;;;;;;;;;;;;;;;;;;56895:94:::0;:::o;43593:185::-;43731:39;43748:4;43754:2;43758:7;43731:39;;;;;;;;;;;;:16;:39::i;:::-;43593:185;;;:::o;55918:88::-;13236:13;:11;:13::i;:::-;55995:3:::1;55985:7;:13;;;;;;;;;;;;:::i;:::-;;55918:88:::0;:::o;56599:288::-;55614:10;55601:23;;:9;:23;;;55593:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;56658:12:::1;;;;;;;;;;;56650:31;;;;;;;;;;;;:::i;:::-;;;;;;;;;56701:10;:22;56712:10;56701:22;;;;;;;;;;;;;;;;;;;;;;;;;56700:23;56692:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;56782:10;56761:31;;56777:1;56761:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:31;;56753:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;56840:4;56815:10;:22;56826:10;56815:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;56855:24;56865:10;56877:1;56855:9;:24::i;:::-;56599:288::o:0;40801:124::-;40865:7;40892:20;40904:7;40892:11;:20::i;:::-;:25;;;40885:32;;40801:124;;;:::o;55270:37::-;;;:::o;55182:22::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37976:206::-;38040:7;38081:1;38064:19;;:5;:19;;;38060:60;;;38092:28;;;;;;;;;;;;;;38060:60;38146:12;:19;38159:5;38146:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;38138:36;;38131:43;;37976:206;;;:::o;13998:103::-;13236:13;:11;:13::i;:::-;14063:30:::1;14090:1;14063:18;:30::i;:::-;13998:103::o:0;13350:87::-;13396:7;13423:6;;;;;;;;;;;13416:13;;13350:87;:::o;41161:104::-;41217:13;41250:7;41243:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41161:104;:::o;42771:279::-;42874:12;:10;:12::i;:::-;42862:24;;:8;:24;;;42858:54;;;42895:17;;;;;;;;;;;;;;42858:54;42970:8;42925:18;:32;42944:12;:10;:12::i;:::-;42925:32;;;;;;;;;;;;;;;:42;42958:8;42925:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;43023:8;42994:48;;43009:12;:10;:12::i;:::-;42994:48;;;43033:8;42994:48;;;;;;:::i;:::-;;;;;;;;42771:279;;:::o;43849:369::-;44016:28;44026:4;44032:2;44036:7;44016:9;:28::i;:::-;44059:15;:2;:13;;;:15::i;:::-;:76;;;;;44079:56;44110:4;44116:2;44120:7;44129:5;44079:30;:56::i;:::-;44078:57;44059:76;44055:156;;;44159:40;;;;;;;;;;;;;;44055:156;43849:369;;;;:::o;41336:318::-;41409:13;41440:16;41448:7;41440;:16::i;:::-;41435:59;;41465:29;;;;;;;;;;;;;;41435:59;41507:21;41531:10;:8;:10::i;:::-;41507:34;;41584:1;41565:7;41559:21;:26;;:87;;;;;;;;;;;;;;;;;41612:7;41621:18;:7;:16;:18::i;:::-;41595:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41559:87;41552:94;;;41336:318;;;:::o;43121:164::-;43218:4;43242:18;:25;43261:5;43242:25;;;;;;;;;;;;;;;:35;43268:8;43242:35;;;;;;;;;;;;;;;;;;;;;;;;;43235:42;;43121:164;;;;:::o;55412:32::-;;;;;;;;;;;;;:::o;56132:459::-;55614:10;55601:23;;:9;:23;;;55593:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;56214:12:::1;;;;;;;;;;;56206:31;;;;;;;;;;;;:::i;:::-;;;;;;;;;56283:8;56256:35;;:12;:24;56269:10;56256:24;;;;;;;;;;;;;;;;:35;56248:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;56351:10;56325:36;;56341:6;56325:22;;:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:36;;56317:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;56414:10;56405:6;:19;;;;;;:::i;:::-;56392:9;:32;;56384:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;56473:12;56463:22;;:6;:22;;;;56455:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;56542:1;56514:12;:24;56527:10;56514:24;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;56554;56564:10;56576:6;56554:29;;:9;:29::i;:::-;56132:459:::0;:::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;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;44473:187::-;44530:4;44573:7;44554:15;:13;:15::i;:::-;:26;;:53;;;;;44594:13;;44584:7;:23;44554:53;:98;;;;;44625:11;:20;44637:7;44625:20;;;;;;;;;;;:27;;;;;;;;;;;;44624:28;44554:98;44547:105;;44473:187;;;:::o;11901:98::-;11954:7;11981:10;11974:17;;11901:98;:::o;52084:196::-;52226:2;52199:15;:24;52215:7;52199:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;52264:7;52260:2;52244:28;;52253:5;52244:28;;;;;;;;;;;;52084:196;;;:::o;56014:110::-;56088:7;56014:110;:::o;47586:2112::-;47701:35;47739:20;47751:7;47739:11;:20::i;:::-;47701:58;;47772:22;47814:13;:18;;;47798:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;47849:50;47866:13;:18;;;47886:12;:10;:12::i;:::-;47849:16;:50::i;:::-;47798:101;:154;;;;47940:12;:10;:12::i;:::-;47916:36;;:20;47928:7;47916:11;:20::i;:::-;:36;;;47798:154;47772:181;;47971:17;47966:66;;47997:35;;;;;;;;;;;;;;47966:66;48069:4;48047:26;;:13;:18;;;:26;;;48043:67;;48082:28;;;;;;;;;;;;;;48043:67;48139:1;48125:16;;:2;:16;;;48121:52;;;48150:23;;;;;;;;;;;;;;48121:52;48186:43;48208:4;48214:2;48218:7;48227:1;48186:21;:43::i;:::-;48294:49;48311:1;48315:7;48324:13;:18;;;48294:8;:49::i;:::-;48669:1;48639:12;:18;48652:4;48639:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48713:1;48685:12;:16;48698:2;48685:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48759:2;48731:11;:20;48743:7;48731:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;48821:15;48776:11;:20;48788:7;48776:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;49089:19;49121:1;49111:7;:11;49089:33;;49182:1;49141:43;;:11;:24;49153:11;49141:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;49137:445;;;49366:13;;49352:11;:27;49348:219;;;49436:13;:18;;;49404:11;:24;49416:11;49404:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;49519:13;:28;;;49477:11;:24;49489:11;49477:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;49348:219;49137:445;48614:979;49629:7;49625:2;49610:27;;49619:4;49610:27;;;;;;;;;;;;49648:42;49669:4;49675:2;49679:7;49688:1;49648:20;:42::i;:::-;47690:2008;;47586:2112;;;:::o;13515:132::-;13590:12;:10;:12::i;:::-;13579:23;;:7;:5;:7::i;:::-;:23;;;13571:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13515:132::o;44668:104::-;44737:27;44747:2;44751:8;44737:27;;;;;;;;;;;;:9;:27::i;:::-;44668:104;;:::o;39631:1108::-;39692:21;;:::i;:::-;39726:12;39741:7;39726:22;;39809:4;39790:15;:13;:15::i;:::-;:23;;:47;;;;;39824:13;;39817:4;:20;39790:47;39786:886;;;39858:31;39892:11;:17;39904:4;39892:17;;;;;;;;;;;39858:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39933:9;:16;;;39928:729;;40004:1;39978:28;;:9;:14;;;:28;;;39974:101;;40042:9;40035:16;;;;;;39974:101;40377:261;40384:4;40377:261;;;40417:6;;;;;;;;40462:11;:17;40474:4;40462:17;;;;;;;;;;;40450:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40536:1;40510:28;;:9;:14;;;:28;;;40506:109;;40578:9;40571:16;;;;;;40506:109;40377:261;;;39928:729;39839:833;39786:886;40700:31;;;;;;;;;;;;;;39631:1108;;;;:::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;52772:667::-;52935:4;52972:2;52956:36;;;52993:12;:10;:12::i;:::-;53007:4;53013:7;53022:5;52956:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;52952:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53207:1;53190:6;:13;:18;53186:235;;;53236:40;;;;;;;;;;;;;;53186:235;53379:6;53373:13;53364:6;53360:2;53356:15;53349:38;52952:480;53085:45;;;53075:55;;;:6;:55;;;;53068:62;;;52772:667;;;;;;:::o;55801:109::-;55862:13;55895:7;55888:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55801:109;:::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;54087:159::-;;;;;:::o;54905:158::-;;;;;:::o;45135:163::-;45258:32;45264:2;45268:8;45278:5;45285:4;45258:5;:32::i;:::-;45135:163;;;:::o;45557:1775::-;45696:20;45719:13;;45696:36;;45761:1;45747:16;;:2;:16;;;45743:48;;;45772:19;;;;;;;;;;;;;;45743:48;45818:1;45806:8;:13;45802:44;;;45828:18;;;;;;;;;;;;;;45802:44;45859:61;45889:1;45893:2;45897:12;45911:8;45859:21;:61::i;:::-;46232:8;46197:12;:16;46210:2;46197:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46296:8;46256:12;:16;46269:2;46256:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46355:2;46322:11;:25;46334:12;46322:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;46422:15;46372:11;:25;46384:12;46372:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;46455:20;46478:12;46455:35;;46505:11;46534:8;46519:12;:23;46505:37;;46563:4;:23;;;;;46571:15;:2;:13;;;:15::i;:::-;46563:23;46559:641;;;46607:314;46663:12;46659:2;46638:38;;46655:1;46638:38;;;;;;;;;;;;46704:69;46743:1;46747:2;46751:14;;;;;;46767:5;46704:30;:69::i;:::-;46699:174;;46809:40;;;;;;;;;;;;;;46699:174;46916:3;46900:12;:19;;46607:314;;47002:12;46985:13;;:29;46981:43;;47016:8;;;46981:43;46559:641;;;47065:120;47121:14;;;;;;47117:2;47096:40;;47113:1;47096:40;;;;;;;;;;;;47180:3;47164:12;:19;;47065:120;;46559:641;47230:12;47214:13;:28;;;;46172:1082;;47264:60;47293:1;47297:2;47301:12;47315:8;47264:20;:60::i;:::-;45685:1647;45557:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:137::-;2322:5;2360:6;2347:20;2338:29;;2376:32;2402:5;2376:32;:::i;:::-;2277:137;;;;:::o;2420:329::-;2479:6;2528:2;2516:9;2507:7;2503:23;2499:32;2496:119;;;2534:79;;:::i;:::-;2496:119;2654:1;2679:53;2724:7;2715:6;2704:9;2700:22;2679:53;:::i;:::-;2669:63;;2625:117;2420:329;;;;:::o;2755:474::-;2823:6;2831;2880:2;2868:9;2859:7;2855:23;2851:32;2848:119;;;2886:79;;:::i;:::-;2848:119;3006:1;3031:53;3076:7;3067:6;3056:9;3052:22;3031:53;:::i;:::-;3021:63;;2977:117;3133:2;3159:53;3204:7;3195:6;3184:9;3180:22;3159:53;:::i;:::-;3149:63;;3104:118;2755:474;;;;;:::o;3235:619::-;3312:6;3320;3328;3377:2;3365:9;3356:7;3352:23;3348:32;3345:119;;;3383:79;;:::i;:::-;3345:119;3503:1;3528:53;3573:7;3564:6;3553:9;3549:22;3528:53;:::i;:::-;3518:63;;3474:117;3630:2;3656:53;3701:7;3692:6;3681:9;3677:22;3656:53;:::i;:::-;3646:63;;3601:118;3758:2;3784:53;3829:7;3820:6;3809:9;3805:22;3784:53;:::i;:::-;3774:63;;3729:118;3235:619;;;;;:::o;3860:943::-;3955:6;3963;3971;3979;4028:3;4016:9;4007:7;4003:23;3999:33;3996:120;;;4035:79;;:::i;:::-;3996:120;4155:1;4180:53;4225:7;4216:6;4205:9;4201:22;4180:53;:::i;:::-;4170:63;;4126:117;4282:2;4308:53;4353:7;4344:6;4333:9;4329:22;4308:53;:::i;:::-;4298:63;;4253:118;4410:2;4436:53;4481:7;4472:6;4461:9;4457:22;4436:53;:::i;:::-;4426:63;;4381:118;4566:2;4555:9;4551:18;4538:32;4597:18;4589:6;4586:30;4583:117;;;4619:79;;:::i;:::-;4583:117;4724:62;4778:7;4769:6;4758:9;4754:22;4724:62;:::i;:::-;4714:72;;4509:287;3860:943;;;;;;;:::o;4809:468::-;4874:6;4882;4931:2;4919:9;4910:7;4906:23;4902:32;4899:119;;;4937:79;;:::i;:::-;4899:119;5057:1;5082:53;5127:7;5118:6;5107:9;5103:22;5082:53;:::i;:::-;5072:63;;5028:117;5184:2;5210:50;5252:7;5243:6;5232:9;5228:22;5210:50;:::i;:::-;5200:60;;5155:115;4809:468;;;;;:::o;5283:474::-;5351:6;5359;5408:2;5396:9;5387:7;5383:23;5379:32;5376:119;;;5414:79;;:::i;:::-;5376:119;5534:1;5559:53;5604:7;5595:6;5584:9;5580:22;5559:53;:::i;:::-;5549:63;;5505:117;5661:2;5687:53;5732:7;5723:6;5712:9;5708:22;5687:53;:::i;:::-;5677:63;;5632:118;5283:474;;;;;:::o;5763:323::-;5819:6;5868:2;5856:9;5847:7;5843:23;5839:32;5836:119;;;5874:79;;:::i;:::-;5836:119;5994:1;6019:50;6061:7;6052:6;6041:9;6037:22;6019:50;:::i;:::-;6009:60;;5965:114;5763:323;;;;:::o;6092:327::-;6150:6;6199:2;6187:9;6178:7;6174:23;6170:32;6167:119;;;6205:79;;:::i;:::-;6167:119;6325:1;6350:52;6394:7;6385:6;6374:9;6370:22;6350:52;:::i;:::-;6340:62;;6296:116;6092:327;;;;:::o;6425:349::-;6494:6;6543:2;6531:9;6522:7;6518:23;6514:32;6511:119;;;6549:79;;:::i;:::-;6511:119;6669:1;6694:63;6749:7;6740:6;6729:9;6725:22;6694:63;:::i;:::-;6684:73;;6640:127;6425:349;;;;:::o;6780:509::-;6849:6;6898:2;6886:9;6877:7;6873:23;6869:32;6866:119;;;6904:79;;:::i;:::-;6866:119;7052:1;7041:9;7037:17;7024:31;7082:18;7074:6;7071:30;7068:117;;;7104:79;;:::i;:::-;7068:117;7209:63;7264:7;7255:6;7244:9;7240:22;7209:63;:::i;:::-;7199:73;;6995:287;6780:509;;;;:::o;7295:329::-;7354:6;7403:2;7391:9;7382:7;7378:23;7374:32;7371:119;;;7409:79;;:::i;:::-;7371:119;7529:1;7554:53;7599:7;7590:6;7579:9;7575:22;7554:53;:::i;:::-;7544:63;;7500:117;7295:329;;;;:::o;7630:327::-;7688:6;7737:2;7725:9;7716:7;7712:23;7708:32;7705:119;;;7743:79;;:::i;:::-;7705:119;7863:1;7888:52;7932:7;7923:6;7912:9;7908:22;7888:52;:::i;:::-;7878:62;;7834:116;7630:327;;;;:::o;7963:118::-;8050:24;8068:5;8050:24;:::i;:::-;8045:3;8038:37;7963:118;;:::o;8087:109::-;8168:21;8183:5;8168:21;:::i;:::-;8163:3;8156:34;8087:109;;:::o;8202:360::-;8288:3;8316:38;8348:5;8316:38;:::i;:::-;8370:70;8433:6;8428:3;8370:70;:::i;:::-;8363:77;;8449:52;8494:6;8489:3;8482:4;8475:5;8471:16;8449:52;:::i;:::-;8526:29;8548:6;8526:29;:::i;:::-;8521:3;8517:39;8510:46;;8292:270;8202:360;;;;:::o;8568:364::-;8656:3;8684:39;8717:5;8684:39;:::i;:::-;8739:71;8803:6;8798:3;8739:71;:::i;:::-;8732:78;;8819:52;8864:6;8859:3;8852:4;8845:5;8841:16;8819:52;:::i;:::-;8896:29;8918:6;8896:29;:::i;:::-;8891:3;8887:39;8880:46;;8660:272;8568:364;;;;:::o;8938:377::-;9044:3;9072:39;9105:5;9072:39;:::i;:::-;9127:89;9209:6;9204:3;9127:89;:::i;:::-;9120:96;;9225:52;9270:6;9265:3;9258:4;9251:5;9247:16;9225:52;:::i;:::-;9302:6;9297:3;9293:16;9286:23;;9048:267;8938:377;;;;:::o;9321:366::-;9463:3;9484:67;9548:2;9543:3;9484:67;:::i;:::-;9477:74;;9560:93;9649:3;9560:93;:::i;:::-;9678:2;9673:3;9669:12;9662:19;;9321:366;;;:::o;9693:::-;9835:3;9856:67;9920:2;9915:3;9856:67;:::i;:::-;9849:74;;9932:93;10021:3;9932:93;:::i;:::-;10050:2;10045:3;10041:12;10034:19;;9693:366;;;:::o;10065:::-;10207:3;10228:67;10292:2;10287:3;10228:67;:::i;:::-;10221:74;;10304:93;10393:3;10304:93;:::i;:::-;10422:2;10417:3;10413:12;10406:19;;10065:366;;;:::o;10437:365::-;10579:3;10600:66;10664:1;10659:3;10600:66;:::i;:::-;10593:73;;10675:93;10764:3;10675:93;:::i;:::-;10793:2;10788:3;10784:12;10777:19;;10437:365;;;:::o;10808:366::-;10950:3;10971:67;11035:2;11030:3;10971:67;:::i;:::-;10964:74;;11047:93;11136:3;11047:93;:::i;:::-;11165:2;11160:3;11156:12;11149:19;;10808:366;;;:::o;11180:::-;11322:3;11343:67;11407:2;11402:3;11343:67;:::i;:::-;11336:74;;11419:93;11508:3;11419:93;:::i;:::-;11537:2;11532:3;11528:12;11521:19;;11180:366;;;:::o;11552:::-;11694:3;11715:67;11779:2;11774:3;11715:67;:::i;:::-;11708:74;;11791:93;11880:3;11791:93;:::i;:::-;11909:2;11904:3;11900:12;11893:19;;11552:366;;;:::o;11924:::-;12066:3;12087:67;12151:2;12146:3;12087:67;:::i;:::-;12080:74;;12163:93;12252:3;12163:93;:::i;:::-;12281:2;12276:3;12272:12;12265:19;;11924:366;;;:::o;12296:398::-;12455:3;12476:83;12557:1;12552:3;12476:83;:::i;:::-;12469:90;;12568:93;12657:3;12568:93;:::i;:::-;12686:1;12681:3;12677:11;12670:18;;12296:398;;;:::o;12700:365::-;12842:3;12863:66;12927:1;12922:3;12863:66;:::i;:::-;12856:73;;12938:93;13027:3;12938:93;:::i;:::-;13056:2;13051:3;13047:12;13040:19;;12700:365;;;:::o;13071:366::-;13213:3;13234:67;13298:2;13293:3;13234:67;:::i;:::-;13227:74;;13310:93;13399:3;13310:93;:::i;:::-;13428:2;13423:3;13419:12;13412:19;;13071:366;;;:::o;13443:118::-;13530:24;13548:5;13530:24;:::i;:::-;13525:3;13518:37;13443:118;;:::o;13567:115::-;13652:23;13669:5;13652:23;:::i;:::-;13647:3;13640:36;13567:115;;:::o;13688:435::-;13868:3;13890:95;13981:3;13972:6;13890:95;:::i;:::-;13883:102;;14002:95;14093:3;14084:6;14002:95;:::i;:::-;13995:102;;14114:3;14107:10;;13688:435;;;;;:::o;14129:379::-;14313:3;14335:147;14478:3;14335:147;:::i;:::-;14328:154;;14499:3;14492:10;;14129:379;;;:::o;14514:222::-;14607:4;14645:2;14634:9;14630:18;14622:26;;14658:71;14726:1;14715:9;14711:17;14702:6;14658:71;:::i;:::-;14514:222;;;;:::o;14742:640::-;14937:4;14975:3;14964:9;14960:19;14952:27;;14989:71;15057:1;15046:9;15042:17;15033:6;14989:71;:::i;:::-;15070:72;15138:2;15127:9;15123:18;15114:6;15070:72;:::i;:::-;15152;15220:2;15209:9;15205:18;15196:6;15152:72;:::i;:::-;15271:9;15265:4;15261:20;15256:2;15245:9;15241:18;15234:48;15299:76;15370:4;15361:6;15299:76;:::i;:::-;15291:84;;14742:640;;;;;;;:::o;15388:210::-;15475:4;15513:2;15502:9;15498:18;15490:26;;15526:65;15588:1;15577:9;15573:17;15564:6;15526:65;:::i;:::-;15388:210;;;;:::o;15604:313::-;15717:4;15755:2;15744:9;15740:18;15732:26;;15804:9;15798:4;15794:20;15790:1;15779:9;15775:17;15768:47;15832:78;15905:4;15896:6;15832:78;:::i;:::-;15824:86;;15604:313;;;;:::o;15923:419::-;16089:4;16127:2;16116:9;16112:18;16104:26;;16176:9;16170:4;16166:20;16162:1;16151:9;16147:17;16140:47;16204:131;16330:4;16204:131;:::i;:::-;16196:139;;15923:419;;;:::o;16348:::-;16514:4;16552:2;16541:9;16537:18;16529:26;;16601:9;16595:4;16591:20;16587:1;16576:9;16572:17;16565:47;16629:131;16755:4;16629:131;:::i;:::-;16621:139;;16348:419;;;:::o;16773:::-;16939:4;16977:2;16966:9;16962:18;16954:26;;17026:9;17020:4;17016:20;17012:1;17001:9;16997:17;16990:47;17054:131;17180:4;17054:131;:::i;:::-;17046:139;;16773:419;;;:::o;17198:::-;17364:4;17402:2;17391:9;17387:18;17379:26;;17451:9;17445:4;17441:20;17437:1;17426:9;17422:17;17415:47;17479:131;17605:4;17479:131;:::i;:::-;17471:139;;17198:419;;;:::o;17623:::-;17789:4;17827:2;17816:9;17812:18;17804:26;;17876:9;17870:4;17866:20;17862:1;17851:9;17847:17;17840:47;17904:131;18030:4;17904:131;:::i;:::-;17896:139;;17623:419;;;:::o;18048:::-;18214:4;18252:2;18241:9;18237:18;18229:26;;18301:9;18295:4;18291:20;18287:1;18276:9;18272:17;18265:47;18329:131;18455:4;18329:131;:::i;:::-;18321:139;;18048:419;;;:::o;18473:::-;18639:4;18677:2;18666:9;18662:18;18654:26;;18726:9;18720:4;18716:20;18712:1;18701:9;18697:17;18690:47;18754:131;18880:4;18754:131;:::i;:::-;18746:139;;18473:419;;;:::o;18898:::-;19064:4;19102:2;19091:9;19087:18;19079:26;;19151:9;19145:4;19141:20;19137:1;19126:9;19122:17;19115:47;19179:131;19305:4;19179:131;:::i;:::-;19171:139;;18898:419;;;:::o;19323:::-;19489:4;19527:2;19516:9;19512:18;19504:26;;19576:9;19570:4;19566:20;19562:1;19551:9;19547:17;19540:47;19604:131;19730:4;19604:131;:::i;:::-;19596:139;;19323:419;;;:::o;19748:::-;19914:4;19952:2;19941:9;19937:18;19929:26;;20001:9;19995:4;19991:20;19987:1;19976:9;19972:17;19965:47;20029:131;20155:4;20029:131;:::i;:::-;20021:139;;19748:419;;;:::o;20173:222::-;20266:4;20304:2;20293:9;20289:18;20281:26;;20317:71;20385:1;20374:9;20370:17;20361:6;20317:71;:::i;:::-;20173:222;;;;:::o;20401:218::-;20492:4;20530:2;20519:9;20515:18;20507:26;;20543:69;20609:1;20598:9;20594:17;20585:6;20543:69;:::i;:::-;20401:218;;;;:::o;20625:129::-;20659:6;20686:20;;:::i;:::-;20676:30;;20715:33;20743:4;20735:6;20715:33;:::i;:::-;20625:129;;;:::o;20760:75::-;20793:6;20826:2;20820:9;20810:19;;20760:75;:::o;20841:307::-;20902:4;20992:18;20984:6;20981:30;20978:56;;;21014:18;;:::i;:::-;20978:56;21052:29;21074:6;21052:29;:::i;:::-;21044:37;;21136:4;21130;21126:15;21118:23;;20841:307;;;:::o;21154:308::-;21216:4;21306:18;21298:6;21295:30;21292:56;;;21328:18;;:::i;:::-;21292:56;21366:29;21388:6;21366:29;:::i;:::-;21358:37;;21450:4;21444;21440:15;21432:23;;21154:308;;;:::o;21468:98::-;21519:6;21553:5;21547:12;21537:22;;21468:98;;;:::o;21572:99::-;21624:6;21658:5;21652:12;21642:22;;21572:99;;;:::o;21677:168::-;21760:11;21794:6;21789:3;21782:19;21834:4;21829:3;21825:14;21810:29;;21677:168;;;;:::o;21851:147::-;21952:11;21989:3;21974:18;;21851:147;;;;:::o;22004:169::-;22088:11;22122:6;22117:3;22110:19;22162:4;22157:3;22153:14;22138:29;;22004:169;;;;:::o;22179:148::-;22281:11;22318:3;22303:18;;22179:148;;;;:::o;22333:305::-;22373:3;22392:20;22410:1;22392:20;:::i;:::-;22387:25;;22426:20;22444:1;22426:20;:::i;:::-;22421:25;;22580:1;22512:66;22508:74;22505:1;22502:81;22499:107;;;22586:18;;:::i;:::-;22499:107;22630:1;22627;22623:9;22616:16;;22333:305;;;;:::o;22644:185::-;22684:1;22701:20;22719:1;22701:20;:::i;:::-;22696:25;;22735:20;22753:1;22735:20;:::i;:::-;22730:25;;22774:1;22764:35;;22779:18;;:::i;:::-;22764:35;22821:1;22818;22814:9;22809:14;;22644:185;;;;:::o;22835:348::-;22875:7;22898:20;22916:1;22898:20;:::i;:::-;22893:25;;22932:20;22950:1;22932:20;:::i;:::-;22927:25;;23120:1;23052:66;23048:74;23045:1;23042:81;23037:1;23030:9;23023:17;23019:105;23016:131;;;23127:18;;:::i;:::-;23016:131;23175:1;23172;23168:9;23157:20;;22835:348;;;;:::o;23189:191::-;23229:4;23249:20;23267:1;23249:20;:::i;:::-;23244:25;;23283:20;23301:1;23283:20;:::i;:::-;23278:25;;23322:1;23319;23316:8;23313:34;;;23327:18;;:::i;:::-;23313:34;23372:1;23369;23365:9;23357:17;;23189:191;;;;:::o;23386:96::-;23423:7;23452:24;23470:5;23452:24;:::i;:::-;23441:35;;23386:96;;;:::o;23488:90::-;23522:7;23565:5;23558:13;23551:21;23540:32;;23488:90;;;:::o;23584:149::-;23620:7;23660:66;23653:5;23649:78;23638:89;;23584:149;;;:::o;23739:126::-;23776:7;23816:42;23809:5;23805:54;23794:65;;23739:126;;;:::o;23871:77::-;23908:7;23937:5;23926:16;;23871:77;;;:::o;23954:93::-;23990:7;24030:10;24023:5;24019:22;24008:33;;23954:93;;;:::o;24053:154::-;24137:6;24132:3;24127;24114:30;24199:1;24190:6;24185:3;24181:16;24174:27;24053:154;;;:::o;24213:307::-;24281:1;24291:113;24305:6;24302:1;24299:13;24291:113;;;24390:1;24385:3;24381:11;24375:18;24371:1;24366:3;24362:11;24355:39;24327:2;24324:1;24320:10;24315:15;;24291:113;;;24422:6;24419:1;24416:13;24413:101;;;24502:1;24493:6;24488:3;24484:16;24477:27;24413:101;24262:258;24213:307;;;:::o;24526:320::-;24570:6;24607:1;24601:4;24597:12;24587:22;;24654:1;24648:4;24644:12;24675:18;24665:81;;24731:4;24723:6;24719:17;24709:27;;24665:81;24793:2;24785:6;24782:14;24762:18;24759:38;24756:84;;;24812:18;;:::i;:::-;24756:84;24577:269;24526:320;;;:::o;24852:281::-;24935:27;24957:4;24935:27;:::i;:::-;24927:6;24923:40;25065:6;25053:10;25050:22;25029:18;25017:10;25014:34;25011:62;25008:88;;;25076:18;;:::i;:::-;25008:88;25116:10;25112:2;25105:22;24895:238;24852:281;;:::o;25139:233::-;25178:3;25201:24;25219:5;25201:24;:::i;:::-;25192:33;;25247:66;25240:5;25237:77;25234:103;;;25317:18;;:::i;:::-;25234:103;25364:1;25357:5;25353:13;25346:20;;25139:233;;;:::o;25378:176::-;25410:1;25427:20;25445:1;25427:20;:::i;:::-;25422:25;;25461:20;25479:1;25461:20;:::i;:::-;25456:25;;25500:1;25490:35;;25505:18;;:::i;:::-;25490:35;25546:1;25543;25539:9;25534:14;;25378:176;;;;:::o;25560:180::-;25608:77;25605:1;25598:88;25705:4;25702:1;25695:15;25729:4;25726:1;25719:15;25746:180;25794:77;25791:1;25784:88;25891:4;25888:1;25881:15;25915:4;25912:1;25905:15;25932:180;25980:77;25977:1;25970:88;26077:4;26074:1;26067:15;26101:4;26098:1;26091:15;26118:180;26166:77;26163:1;26156:88;26263:4;26260:1;26253:15;26287:4;26284:1;26277:15;26304:180;26352:77;26349:1;26342:88;26449:4;26446:1;26439:15;26473:4;26470:1;26463:15;26490:117;26599:1;26596;26589:12;26613:117;26722:1;26719;26712:12;26736:117;26845:1;26842;26835:12;26859:117;26968:1;26965;26958:12;26982:102;27023:6;27074:2;27070:7;27065:2;27058:5;27054:14;27050:28;27040:38;;26982:102;;;:::o;27090:225::-;27230:34;27226:1;27218:6;27214:14;27207:58;27299:8;27294:2;27286:6;27282:15;27275:33;27090:225;:::o;27321:160::-;27461:12;27457:1;27449:6;27445:14;27438:36;27321:160;:::o;27487:174::-;27627:26;27623:1;27615:6;27611:14;27604:50;27487:174;:::o;27667:158::-;27807:10;27803:1;27795:6;27791:14;27784:34;27667:158;:::o;27831:166::-;27971:18;27967:1;27959:6;27955:14;27948:42;27831:166;:::o;28003:180::-;28143:32;28139:1;28131:6;28127:14;28120:56;28003:180;:::o;28189:164::-;28329:16;28325:1;28317:6;28313:14;28306:40;28189:164;:::o;28359:182::-;28499:34;28495:1;28487:6;28483:14;28476:58;28359:182;:::o;28547:114::-;;:::o;28667:157::-;28807:9;28803:1;28795:6;28791:14;28784:33;28667:157;:::o;28830:164::-;28970:16;28966:1;28958:6;28954:14;28947:40;28830:164;:::o;29000:122::-;29073:24;29091:5;29073:24;:::i;:::-;29066:5;29063:35;29053:63;;29112:1;29109;29102:12;29053:63;29000:122;:::o;29128:116::-;29198:21;29213:5;29198:21;:::i;:::-;29191:5;29188:32;29178:60;;29234:1;29231;29224:12;29178:60;29128:116;:::o;29250:120::-;29322:23;29339:5;29322:23;:::i;:::-;29315:5;29312:34;29302:62;;29360:1;29357;29350:12;29302:62;29250:120;:::o;29376:122::-;29449:24;29467:5;29449:24;:::i;:::-;29442:5;29439:35;29429:63;;29488:1;29485;29478:12;29429:63;29376:122;:::o;29504:120::-;29576:23;29593:5;29576:23;:::i;:::-;29569:5;29566:34;29556:62;;29614:1;29611;29604:12;29556:62;29504:120;:::o

Swarm Source

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