ETH Price: $3,909.47 (+7.00%)

Token

Thinkrs (THKRS)
 

Overview

Max Total Supply

10,000 THKRS

Holders

1,123

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
10 THKRS
0xdec9b6564209db8a58382ccd3868540d1ef700ef
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:
Thinkr

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-07-30
*/

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


// OpenZeppelin Contracts (last updated v4.5.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

                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.6.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 be 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/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: https://github.com/chiru-labs/ERC721A/contracts/IERC721A.sol


// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;



/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A is IERC721, IERC721Metadata {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

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

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     * 
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);
}

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


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

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


// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;







/**
 * @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, IERC721A{

    //Variables   
    using Address for address;
    using Strings for uint256;

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

//------------------------------------------------------------------------------------------
//Functions Begin
//------------------------------------------------------------------------------------------

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public 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 virtual 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;
    }
    
    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal{
        _safeMint(to, quantity, '');
    }

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

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

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

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

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

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

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

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

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

        address from = prevOwnership.addr;

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

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

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

        emit Transfer(from, address(0), tokenId);
        // 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))
                }
            }
        }
    }

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


// OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        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: Thinkr.sol



pragma solidity ^0.8.7;






contract Thinkr is Ownable, ERC721A, ReentrancyGuard{
    using SafeMath for uint256;
    using Strings for uint256;

    uint256 public immutable MAX_TOKENS = 10000;
    uint256 public price = 0.08 ether;
    uint256 public allowlistPrice = 0.05 ether;

    bool public saleStarted = false;
    bool public presaleStarted = false;
    bool public revealed = false;

    uint256 public maxPerWallet = 10;
    uint256 public maxPerAllow = 1;

    string public baseURI;
    string public baseExtension = ".json";
    string public notRevealedURI;

  //Stores addresses for allow list
  mapping(address => uint256) public allowlist;
  //This stores number of mints per wallet address during publicSale
  mapping(address => uint256) public _walletMints;

  //------------------------------------------------------------
  constructor(
    string memory initBaseURI_,
    string memory initNotRevealedURI_

  ) ERC721A("Thinkrs", "THKRS") {
    baseURI = initBaseURI_;
    notRevealedURI = initNotRevealedURI_;
    presaleStarted = true;
    _safeMint(msg.sender, 100);
  }
//------------------------------------------------------------

  function togglePresaleStarted() external onlyOwner {
        presaleStarted = !presaleStarted;
    }

  function toggleSaleStarted() external onlyOwner {
        saleStarted = !saleStarted;
        presaleStarted = !presaleStarted;
    }

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

  function reveal(bool _state) public onlyOwner {
      revealed = _state;
  }

  function setMaxPerWallet(uint256 _newMaxPerWallet) external onlyOwner {
      maxPerWallet = _newMaxPerWallet;
  }
  
  function setMaxPerAllow(uint256 _newMaxPerAllow) external onlyOwner {
      maxPerAllow = _newMaxPerAllow;
  }
 
 function setNotRevealedURI(string memory _notRevealedURI) external onlyOwner {
    notRevealedURI = _notRevealedURI;
  }

  function setBaseExtension(string memory _newBaseExtension) external onlyOwner {
    baseExtension = _newBaseExtension;
  }
  
  function setPrice(uint256 _newPrice) external onlyOwner {
    price = _newPrice * (1 ether);
  }

  function setAllowPrice(uint256 _newPrice) external onlyOwner {
    allowlistPrice = _newPrice * (1 ether);
  }

  function getMintSlots(address user)public view returns (uint256) {
    require(allowlist[user] >= 0, "Incorrect allowlist mint slots");
    if(allowlist[user] == 0){
      return 0;
    }
    uint256 mintSlots = allowlist[user];
    return mintSlots;
  }

  function seedAllowlist(address[] memory addresses) external onlyOwner
  {
    require(
      addresses.length > 0,
      "addresses cannot be empty"
    );
    for (uint256 i = 0; i < addresses.length; i++) {
      allowlist[addresses[i]] = maxPerAllow;
    }
  }

  function withdrawMoney() external onlyOwner nonReentrant {
    uint256 balance = address(this).balance;
    require(balance > 0, "Insufficent balance");
    (bool success, ) = payable(msg.sender).call{value: address(this).balance}("");
    require(success, "Transfer failed.");
  }

  
//------------------------------------------------------------
 //Check to see what token# we want to start at! 
function _startTokenId() internal pure override returns (uint256) {
        return 1;
}

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

}

//------------------------------------------------------------
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId),"ERC721Metadata: Nonexistent token");

        //Added for NFT reveal
        if (revealed == false){
            return (notRevealedURI);
        }   

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

function numberMinted(address owner) public view returns (uint256) {
    return _numberMinted(owner);
}

function getOwnershipData(uint256 tokenId) external view returns (TokenOwnership memory){
    return _ownershipOf(tokenId);
}

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

//AllowlistMint allows people to choose to mint 1 
function allowlistMint(uint256 tokens) external payable callerIsUser {
    require(presaleStarted, "Presale has not started");
    require(tokens > 0 && tokens <= maxPerAllow, "Must mint at least one token and not more than 2");
    uint256 mintPrice = allowlistPrice;
    require(mintPrice != 0, "allowlist sale has not begun yet");
    require(allowlist[msg.sender] > 0, "not eligible for allowlist mint");
    uint256 mintSlots = allowlist[msg.sender];
    require(tokens <= mintSlots, "You cannot mint this amount");
    require(totalSupply() + tokens <= MAX_TOKENS, "reached max supply");
    require(msg.value == mintPrice * tokens,"ETH amount is incorrect");
    allowlist[msg.sender] = allowlist[msg.sender] - tokens;
    _safeMint(msg.sender, tokens);
}

/// Public Sale mint function
/// @param tokens number of tokens to mint
/// @dev reverts if any of the public sale preconditions aren't satisfied
function mint(uint256 tokens) external payable callerIsUser {
    require(saleStarted, "Sale has not started");
    require(presaleStarted == false, "Public sale not started");
    require(tokens <= maxPerWallet, "Cannot purchase this many tokens in a transaction");
    require(_walletMints[_msgSender()] + tokens <= maxPerWallet, "Limit for this wallet reached");
    require(totalSupply() + tokens <= MAX_TOKENS, "Minting would exceed max supply");
    require(tokens > 0, "Must mint at least one token");
    require(price * tokens == msg.value, "ETH amount is incorrect");

    _walletMints[_msgSender()] += tokens;
    _safeMint(_msgSender(), tokens);
}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"initBaseURI_","type":"string"},{"internalType":"string","name":"initNotRevealedURI_","type":"string"}],"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":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_walletMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowlist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"allowlistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"allowlistPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"user","type":"address"}],"name":"getMintSlots","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"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":"maxPerAllow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"seedAllowlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setAllowPrice","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":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxPerAllow","type":"uint256"}],"name":"setMaxPerAllow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxPerWallet","type":"uint256"}],"name":"setMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","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":[],"name":"togglePresaleStarted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleSaleStarted","outputs":[],"stateMutability":"nonpayable","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":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a060405261271060809081525067011c37937e080000600a5566b1a2bc2ec50000600b556000600c60006101000a81548160ff0219169083151502179055506000600c60016101000a81548160ff0219169083151502179055506000600c60026101000a81548160ff021916908315150217905550600a600d556001600e556040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060109080519060200190620000cc929190620008c1565b50348015620000da57600080fd5b506040516200611f3803806200611f833981810160405281019062000100919062000a38565b6040518060400160405280600781526020017f5468696e6b7273000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f54484b52530000000000000000000000000000000000000000000000000000008152506200018c620001806200024660201b60201c565b6200024e60201b60201c565b8160039080519060200190620001a4929190620008c1565b508060049080519060200190620001bd929190620008c1565b50620001ce6200031260201b60201c565b6001819055505050600160098190555081600f9080519060200190620001f6929190620008c1565b5080601190805190602001906200020f929190620008c1565b506001600c60016101000a81548160ff0219169083151502179055506200023e3360646200031b60201b60201c565b505062000d98565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006001905090565b6200033d8282604051806020016040528060008152506200034160201b60201c565b5050565b6200035683838360016200035b60201b60201c565b505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415620003ca576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141562000406576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015620005de5750620005dd8773ffffffffffffffffffffffffffffffffffffffff166200072c60201b620028cf1760201c565b5b15620006b0575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46200065c60008884806001019550886200074f60201b60201c565b62000693576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210620005e5578260015414620006aa57600080fd5b6200071c565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210620006b1575b8160018190555050505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026200077d6200024660201b60201c565b8786866040518563ffffffff1660e01b8152600401620007a1949392919062000b20565b602060405180830381600087803b158015620007bc57600080fd5b505af1925050508015620007f057506040513d601f19601f82011682018060405250810190620007ed919062000a06565b60015b6200086e573d806000811462000823576040519150601f19603f3d011682016040523d82523d6000602084013e62000828565b606091505b5060008151141562000866576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b828054620008cf9062000c8f565b90600052602060002090601f016020900481019282620008f357600085556200093f565b82601f106200090e57805160ff19168380011785556200093f565b828001600101855582156200093f579182015b828111156200093e57825182559160200191906001019062000921565b5b5090506200094e919062000952565b5090565b5b808211156200096d57600081600090555060010162000953565b5090565b600062000988620009828462000b9d565b62000b74565b905082815260208101848484011115620009a757620009a662000d5e565b5b620009b484828562000c59565b509392505050565b600081519050620009cd8162000d7e565b92915050565b600082601f830112620009eb57620009ea62000d59565b5b8151620009fd84826020860162000971565b91505092915050565b60006020828403121562000a1f5762000a1e62000d68565b5b600062000a2f84828501620009bc565b91505092915050565b6000806040838503121562000a525762000a5162000d68565b5b600083015167ffffffffffffffff81111562000a735762000a7262000d63565b5b62000a8185828601620009d3565b925050602083015167ffffffffffffffff81111562000aa55762000aa462000d63565b5b62000ab385828601620009d3565b9150509250929050565b62000ac88162000bef565b82525050565b600062000adb8262000bd3565b62000ae7818562000bde565b935062000af981856020860162000c59565b62000b048162000d6d565b840191505092915050565b62000b1a8162000c4f565b82525050565b600060808201905062000b37600083018762000abd565b62000b46602083018662000abd565b62000b55604083018562000b0f565b818103606083015262000b69818462000ace565b905095945050505050565b600062000b8062000b93565b905062000b8e828262000cc5565b919050565b6000604051905090565b600067ffffffffffffffff82111562000bbb5762000bba62000d2a565b5b62000bc68262000d6d565b9050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600062000bfc8262000c2f565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000c7957808201518184015260208101905062000c5c565b8381111562000c89576000848401525b50505050565b6000600282049050600182168062000ca857607f821691505b6020821081141562000cbf5762000cbe62000cfb565b5b50919050565b62000cd08262000d6d565b810181811067ffffffffffffffff8211171562000cf25762000cf162000d2a565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b62000d898162000c03565b811462000d9557600080fd5b50565b60805161535d62000dc260003960008181611719015281816120d601526128ad015261535d6000f3fe6080604052600436106102885760003560e01c80639231ab2a1161015a578063c180526a116100c1578063e268e4d31161007a578063e268e4d3146109b2578063e985e9c5146109db578063ed1fc2a214610a18578063f2c4ce1e14610a2f578063f2fde38b14610a58578063f47c84c514610a8157610288565b8063c180526a1461089f578063c6682862146108bb578063c87b56dd146108e6578063cd094fb114610923578063da3ef23f1461094c578063dc33e6811461097557610288565b8063a7cd52cb11610113578063a7cd52cb14610791578063ac446002146107ce578063b85cecd3146107e5578063b88d4fde14610822578063bc6d26351461084b578063bec4a8931461086257610288565b80639231ab2a14610690578063940cd05b146106cd57806395d89b41146106f6578063a035b1fe14610721578063a0712d681461074c578063a22cb4651461076857610288565b806355f804b3116101fe578063715018a6116101b7578063715018a6146105a657806372250380146105bd57806388c206f7146105e85780638da5cb5b1461061157806390967a521461063c57806391b7f5ed1461066757610288565b806355f804b314610482578063574eb874146104ab5780635c474f9e146104d65780636352211e146105015780636c0360eb1461053e57806370a082311461056957610288565b806318160ddd1161025057806318160ddd1461038657806323b872dd146103b15780632a1de3a2146103da57806342842e0e14610403578063453c23101461042c578063518302271461045757610288565b806301ffc9a71461028d57806304549d6f146102ca57806306fdde03146102f5578063081812fc14610320578063095ea7b31461035d575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af9190613fde565b610aac565b6040516102c1919061468b565b60405180910390f35b3480156102d657600080fd5b506102df610b8e565b6040516102ec919061468b565b60405180910390f35b34801561030157600080fd5b5061030a610ba1565b60405161031791906146a6565b60405180910390f35b34801561032c57600080fd5b50610347600480360381019061034291906140ce565b610c33565b6040516103549190614624565b60405180910390f35b34801561036957600080fd5b50610384600480360381019061037f9190613f28565b610caf565b005b34801561039257600080fd5b5061039b610dba565b6040516103a891906149a3565b60405180910390f35b3480156103bd57600080fd5b506103d860048036038101906103d39190613e12565b610dd1565b005b3480156103e657600080fd5b5061040160048036038101906103fc91906140ce565b610de1565b005b34801561040f57600080fd5b5061042a60048036038101906104259190613e12565b610e67565b005b34801561043857600080fd5b50610441610e87565b60405161044e91906149a3565b60405180910390f35b34801561046357600080fd5b5061046c610e8d565b604051610479919061468b565b60405180910390f35b34801561048e57600080fd5b506104a960048036038101906104a49190614038565b610ea0565b005b3480156104b757600080fd5b506104c0610f32565b6040516104cd91906149a3565b60405180910390f35b3480156104e257600080fd5b506104eb610f38565b6040516104f8919061468b565b60405180910390f35b34801561050d57600080fd5b50610528600480360381019061052391906140ce565b610f4b565b6040516105359190614624565b60405180910390f35b34801561054a57600080fd5b50610553610f61565b60405161056091906146a6565b60405180910390f35b34801561057557600080fd5b50610590600480360381019061058b9190613da5565b610fef565b60405161059d91906149a3565b60405180910390f35b3480156105b257600080fd5b506105bb6110bf565b005b3480156105c957600080fd5b506105d2611147565b6040516105df91906146a6565b60405180910390f35b3480156105f457600080fd5b5061060f600480360381019061060a9190613f68565b6111d5565b005b34801561061d57600080fd5b50610626611318565b6040516106339190614624565b60405180910390f35b34801561064857600080fd5b50610651611341565b60405161065e91906149a3565b60405180910390f35b34801561067357600080fd5b5061068e600480360381019061068991906140ce565b611347565b005b34801561069c57600080fd5b506106b760048036038101906106b291906140ce565b6113e0565b6040516106c49190614988565b60405180910390f35b3480156106d957600080fd5b506106f460048036038101906106ef9190613fb1565b6113f8565b005b34801561070257600080fd5b5061070b611491565b60405161071891906146a6565b60405180910390f35b34801561072d57600080fd5b50610736611523565b60405161074391906149a3565b60405180910390f35b610766600480360381019061076191906140ce565b611529565b005b34801561077457600080fd5b5061078f600480360381019061078a9190613ee8565b61188f565b005b34801561079d57600080fd5b506107b860048036038101906107b39190613da5565b611a07565b6040516107c591906149a3565b60405180910390f35b3480156107da57600080fd5b506107e3611a1f565b005b3480156107f157600080fd5b5061080c60048036038101906108079190613da5565b611be9565b60405161081991906149a3565b60405180910390f35b34801561082e57600080fd5b5061084960048036038101906108449190613e65565b611c01565b005b34801561085757600080fd5b50610860611c7d565b005b34801561086e57600080fd5b5061088960048036038101906108849190613da5565b611d4f565b60405161089691906149a3565b60405180910390f35b6108b960048036038101906108b491906140ce565b611e72565b005b3480156108c757600080fd5b506108d0612233565b6040516108dd91906146a6565b60405180910390f35b3480156108f257600080fd5b5061090d600480360381019061090891906140ce565b6122c1565b60405161091a91906146a6565b60405180910390f35b34801561092f57600080fd5b5061094a600480360381019061094591906140ce565b61241a565b005b34801561095857600080fd5b50610973600480360381019061096e9190614085565b6124b3565b005b34801561098157600080fd5b5061099c60048036038101906109979190613da5565b612549565b6040516109a991906149a3565b60405180910390f35b3480156109be57600080fd5b506109d960048036038101906109d491906140ce565b61255b565b005b3480156109e757600080fd5b50610a0260048036038101906109fd9190613dd2565b6125e1565b604051610a0f919061468b565b60405180910390f35b348015610a2457600080fd5b50610a2d612675565b005b348015610a3b57600080fd5b50610a566004803603810190610a519190614085565b61271d565b005b348015610a6457600080fd5b50610a7f6004803603810190610a7a9190613da5565b6127b3565b005b348015610a8d57600080fd5b50610a966128ab565b604051610aa391906149a3565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b7757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b875750610b86826128f2565b5b9050919050565b600c60019054906101000a900460ff1681565b606060038054610bb090614cb3565b80601f0160208091040260200160405190810160405280929190818152602001828054610bdc90614cb3565b8015610c295780601f10610bfe57610100808354040283529160200191610c29565b820191906000526020600020905b815481529060010190602001808311610c0c57829003601f168201915b5050505050905090565b6000610c3e8261295c565b610c74576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cba82610f4b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d22576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d416129aa565b73ffffffffffffffffffffffffffffffffffffffff1614158015610d735750610d7181610d6c6129aa565b6125e1565b155b15610daa576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610db58383836129b2565b505050565b6000610dc4612a64565b6002546001540303905090565b610ddc838383612a6d565b505050565b610de96129aa565b73ffffffffffffffffffffffffffffffffffffffff16610e07611318565b73ffffffffffffffffffffffffffffffffffffffff1614610e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e54906148a8565b60405180910390fd5b80600e8190555050565b610e8283838360405180602001604052806000815250611c01565b505050565b600d5481565b600c60029054906101000a900460ff1681565b610ea86129aa565b73ffffffffffffffffffffffffffffffffffffffff16610ec6611318565b73ffffffffffffffffffffffffffffffffffffffff1614610f1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f13906148a8565b60405180910390fd5b8181600f9190610f2d9291906139fc565b505050565b600e5481565b600c60009054906101000a900460ff1681565b6000610f5682612f09565b600001519050919050565b600f8054610f6e90614cb3565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9a90614cb3565b8015610fe75780601f10610fbc57610100808354040283529160200191610fe7565b820191906000526020600020905b815481529060010190602001808311610fca57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611057576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6110c76129aa565b73ffffffffffffffffffffffffffffffffffffffff166110e5611318565b73ffffffffffffffffffffffffffffffffffffffff161461113b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611132906148a8565b60405180910390fd5b6111456000613198565b565b6011805461115490614cb3565b80601f016020809104026020016040519081016040528092919081815260200182805461118090614cb3565b80156111cd5780601f106111a2576101008083540402835291602001916111cd565b820191906000526020600020905b8154815290600101906020018083116111b057829003601f168201915b505050505081565b6111dd6129aa565b73ffffffffffffffffffffffffffffffffffffffff166111fb611318565b73ffffffffffffffffffffffffffffffffffffffff1614611251576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611248906148a8565b60405180910390fd5b6000815111611295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128c90614808565b60405180910390fd5b60005b815181101561131457600e54601260008484815181106112bb576112ba614e1d565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808061130c90614d16565b915050611298565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b5481565b61134f6129aa565b73ffffffffffffffffffffffffffffffffffffffff1661136d611318565b73ffffffffffffffffffffffffffffffffffffffff16146113c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ba906148a8565b60405180910390fd5b670de0b6b3a7640000816113d79190614b5b565b600a8190555050565b6113e8613a82565b6113f182612f09565b9050919050565b6114006129aa565b73ffffffffffffffffffffffffffffffffffffffff1661141e611318565b73ffffffffffffffffffffffffffffffffffffffff1614611474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146b906148a8565b60405180910390fd5b80600c60026101000a81548160ff02191690831515021790555050565b6060600480546114a090614cb3565b80601f01602080910402602001604051908101604052809291908181526020018280546114cc90614cb3565b80156115195780601f106114ee57610100808354040283529160200191611519565b820191906000526020600020905b8154815290600101906020018083116114fc57829003601f168201915b5050505050905090565b600a5481565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611597576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158e90614788565b60405180910390fd5b600c60009054906101000a900460ff166115e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115dd90614928565b60405180910390fd5b60001515600c60019054906101000a900460ff1615151461163c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163390614748565b60405180910390fd5b600d54811115611681576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611678906147c8565b60405180910390fd5b600d5481601360006116916129aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116d69190614ad4565b1115611717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170e90614968565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081611741610dba565b61174b9190614ad4565b111561178c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611783906147a8565b60405180910390fd5b600081116117cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c6906148e8565b60405180910390fd5b3481600a546117de9190614b5b565b1461181e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181590614828565b60405180910390fd5b806013600061182b6129aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118749190614ad4565b9250508190555061188c6118866129aa565b8261325c565b50565b6118976129aa565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118fc576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600860006119096129aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166119b66129aa565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119fb919061468b565b60405180910390a35050565b60126020528060005260406000206000915090505481565b611a276129aa565b73ffffffffffffffffffffffffffffffffffffffff16611a45611318565b73ffffffffffffffffffffffffffffffffffffffff1614611a9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a92906148a8565b60405180910390fd5b60026009541415611ae1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad890614948565b60405180910390fd5b6002600981905550600047905060008111611b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2890614888565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051611b579061460f565b60006040518083038185875af1925050503d8060008114611b94576040519150601f19603f3d011682016040523d82523d6000602084013e611b99565b606091505b5050905080611bdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd490614908565b60405180910390fd5b50506001600981905550565b60136020528060005260406000206000915090505481565b611c0c848484612a6d565b611c2b8373ffffffffffffffffffffffffffffffffffffffff166128cf565b8015611c405750611c3e8484848461327a565b155b15611c77576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b611c856129aa565b73ffffffffffffffffffffffffffffffffffffffff16611ca3611318565b73ffffffffffffffffffffffffffffffffffffffff1614611cf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf0906148a8565b60405180910390fd5b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550600c60019054906101000a900460ff1615600c60016101000a81548160ff021916908315150217905550565b600080601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dca906146e8565b60405180910390fd5b6000601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415611e245760009050611e6d565b6000601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050809150505b919050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed790614788565b60405180910390fd5b600c60019054906101000a900460ff16611f2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f26906146c8565b60405180910390fd5b600081118015611f415750600e548111155b611f80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7790614768565b60405180910390fd5b6000600b5490506000811415611fcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc2906148c8565b60405180910390fd5b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541161204d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204490614848565b60405180910390fd5b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050808311156120d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cb90614868565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000836120fe610dba565b6121089190614ad4565b1115612149576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612140906147e8565b60405180910390fd5b82826121559190614b5b565b3414612196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218d90614828565b60405180910390fd5b82601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121e19190614bb5565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061222e338461325c565b505050565b6010805461224090614cb3565b80601f016020809104026020016040519081016040528092919081815260200182805461226c90614cb3565b80156122b95780601f1061228e576101008083540402835291602001916122b9565b820191906000526020600020905b81548152906001019060200180831161229c57829003601f168201915b505050505081565b60606122cc8261295c565b61230b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230290614708565b60405180910390fd5b60001515600c60029054906101000a900460ff16151514156123b9576011805461233490614cb3565b80601f016020809104026020016040519081016040528092919081815260200182805461236090614cb3565b80156123ad5780601f10612382576101008083540402835291602001916123ad565b820191906000526020600020905b81548152906001019060200180831161239057829003601f168201915b50505050509050612415565b60006123c36133da565b905060008151116123e35760405180602001604052806000815250612411565b806123ed8461346c565b6010604051602001612401939291906145de565b6040516020818303038152906040525b9150505b919050565b6124226129aa565b73ffffffffffffffffffffffffffffffffffffffff16612440611318565b73ffffffffffffffffffffffffffffffffffffffff1614612496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248d906148a8565b60405180910390fd5b670de0b6b3a7640000816124aa9190614b5b565b600b8190555050565b6124bb6129aa565b73ffffffffffffffffffffffffffffffffffffffff166124d9611318565b73ffffffffffffffffffffffffffffffffffffffff161461252f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612526906148a8565b60405180910390fd5b8060109080519060200190612545929190613ac5565b5050565b6000612554826135cd565b9050919050565b6125636129aa565b73ffffffffffffffffffffffffffffffffffffffff16612581611318565b73ffffffffffffffffffffffffffffffffffffffff16146125d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ce906148a8565b60405180910390fd5b80600d8190555050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61267d6129aa565b73ffffffffffffffffffffffffffffffffffffffff1661269b611318565b73ffffffffffffffffffffffffffffffffffffffff16146126f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e8906148a8565b60405180910390fd5b600c60019054906101000a900460ff1615600c60016101000a81548160ff021916908315150217905550565b6127256129aa565b73ffffffffffffffffffffffffffffffffffffffff16612743611318565b73ffffffffffffffffffffffffffffffffffffffff1614612799576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612790906148a8565b60405180910390fd5b80601190805190602001906127af929190613ac5565b5050565b6127bb6129aa565b73ffffffffffffffffffffffffffffffffffffffff166127d9611318565b73ffffffffffffffffffffffffffffffffffffffff161461282f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612826906148a8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561289f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289690614728565b60405180910390fd5b6128a881613198565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081612967612a64565b11158015612976575060015482105b80156129a3575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000612a7882612f09565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612ae3576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612b046129aa565b73ffffffffffffffffffffffffffffffffffffffff161480612b335750612b3285612b2d6129aa565b6125e1565b5b80612b785750612b416129aa565b73ffffffffffffffffffffffffffffffffffffffff16612b6084610c33565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612bb1576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612c18576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c24600084876129b2565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612ea4576001548214612ea357878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b612f11613a82565b600082905080612f1f612a64565b11158015612f2e575060015481105b15613161576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161315f57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614613043578092505050613193565b5b60011561315e57818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614613159578092505050613193565b613044565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613276828260405180602001604052806000815250613637565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026132a06129aa565b8786866040518563ffffffff1660e01b81526004016132c2949392919061463f565b602060405180830381600087803b1580156132dc57600080fd5b505af192505050801561330d57506040513d601f19601f8201168201806040525081019061330a919061400b565b60015b613387573d806000811461333d576040519150601f19603f3d011682016040523d82523d6000602084013e613342565b606091505b5060008151141561337f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600f80546133e990614cb3565b80601f016020809104026020016040519081016040528092919081815260200182805461341590614cb3565b80156134625780601f1061343757610100808354040283529160200191613462565b820191906000526020600020905b81548152906001019060200180831161344557829003601f168201915b5050505050905090565b606060008214156134b4576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506135c8565b600082905060005b600082146134e65780806134cf90614d16565b915050600a826134df9190614b2a565b91506134bc565b60008167ffffffffffffffff81111561350257613501614e4c565b5b6040519080825280601f01601f1916602001820160405280156135345781602001600182028036833780820191505090505b5090505b600085146135c15760018261354d9190614bb5565b9150600a8561355c9190614d5f565b60306135689190614ad4565b60f81b81838151811061357e5761357d614e1d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856135ba9190614b2a565b9450613538565b8093505050505b919050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6136448383836001613649565b505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156136b7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156136f2576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156138bc57506138bb8773ffffffffffffffffffffffffffffffffffffffff166128cf565b5b15613981575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613931600088848060010195508861327a565b613967576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106138c257826001541461397c57600080fd5b6139ec565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210613982575b8160018190555050505050505050565b828054613a0890614cb3565b90600052602060002090601f016020900481019282613a2a5760008555613a71565b82601f10613a4357803560ff1916838001178555613a71565b82800160010185558215613a71579182015b82811115613a70578235825591602001919060010190613a55565b5b509050613a7e9190613b4b565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b828054613ad190614cb3565b90600052602060002090601f016020900481019282613af35760008555613b3a565b82601f10613b0c57805160ff1916838001178555613b3a565b82800160010185558215613b3a579182015b82811115613b39578251825591602001919060010190613b1e565b5b509050613b479190613b4b565b5090565b5b80821115613b64576000816000905550600101613b4c565b5090565b6000613b7b613b76846149e3565b6149be565b90508083825260208201905082856020860282011115613b9e57613b9d614e85565b5b60005b85811015613bce5781613bb48882613c5c565b845260208401935060208301925050600181019050613ba1565b5050509392505050565b6000613beb613be684614a0f565b6149be565b905082815260208101848484011115613c0757613c06614e8a565b5b613c12848285614c71565b509392505050565b6000613c2d613c2884614a40565b6149be565b905082815260208101848484011115613c4957613c48614e8a565b5b613c54848285614c71565b509392505050565b600081359050613c6b816152cb565b92915050565b600082601f830112613c8657613c85614e80565b5b8135613c96848260208601613b68565b91505092915050565b600081359050613cae816152e2565b92915050565b600081359050613cc3816152f9565b92915050565b600081519050613cd8816152f9565b92915050565b600082601f830112613cf357613cf2614e80565b5b8135613d03848260208601613bd8565b91505092915050565b60008083601f840112613d2257613d21614e80565b5b8235905067ffffffffffffffff811115613d3f57613d3e614e7b565b5b602083019150836001820283011115613d5b57613d5a614e85565b5b9250929050565b600082601f830112613d7757613d76614e80565b5b8135613d87848260208601613c1a565b91505092915050565b600081359050613d9f81615310565b92915050565b600060208284031215613dbb57613dba614e94565b5b6000613dc984828501613c5c565b91505092915050565b60008060408385031215613de957613de8614e94565b5b6000613df785828601613c5c565b9250506020613e0885828601613c5c565b9150509250929050565b600080600060608486031215613e2b57613e2a614e94565b5b6000613e3986828701613c5c565b9350506020613e4a86828701613c5c565b9250506040613e5b86828701613d90565b9150509250925092565b60008060008060808587031215613e7f57613e7e614e94565b5b6000613e8d87828801613c5c565b9450506020613e9e87828801613c5c565b9350506040613eaf87828801613d90565b925050606085013567ffffffffffffffff811115613ed057613ecf614e8f565b5b613edc87828801613cde565b91505092959194509250565b60008060408385031215613eff57613efe614e94565b5b6000613f0d85828601613c5c565b9250506020613f1e85828601613c9f565b9150509250929050565b60008060408385031215613f3f57613f3e614e94565b5b6000613f4d85828601613c5c565b9250506020613f5e85828601613d90565b9150509250929050565b600060208284031215613f7e57613f7d614e94565b5b600082013567ffffffffffffffff811115613f9c57613f9b614e8f565b5b613fa884828501613c71565b91505092915050565b600060208284031215613fc757613fc6614e94565b5b6000613fd584828501613c9f565b91505092915050565b600060208284031215613ff457613ff3614e94565b5b600061400284828501613cb4565b91505092915050565b60006020828403121561402157614020614e94565b5b600061402f84828501613cc9565b91505092915050565b6000806020838503121561404f5761404e614e94565b5b600083013567ffffffffffffffff81111561406d5761406c614e8f565b5b61407985828601613d0c565b92509250509250929050565b60006020828403121561409b5761409a614e94565b5b600082013567ffffffffffffffff8111156140b9576140b8614e8f565b5b6140c584828501613d62565b91505092915050565b6000602082840312156140e4576140e3614e94565b5b60006140f284828501613d90565b91505092915050565b61410481614be9565b82525050565b61411381614be9565b82525050565b61412281614bfb565b82525050565b61413181614bfb565b82525050565b600061414282614a86565b61414c8185614a9c565b935061415c818560208601614c80565b61416581614e99565b840191505092915050565b600061417b82614a91565b6141858185614ab8565b9350614195818560208601614c80565b61419e81614e99565b840191505092915050565b60006141b482614a91565b6141be8185614ac9565b93506141ce818560208601614c80565b80840191505092915050565b600081546141e781614cb3565b6141f18186614ac9565b9450600182166000811461420c576001811461421d57614250565b60ff19831686528186019350614250565b61422685614a71565b60005b8381101561424857815481890152600182019150602081019050614229565b838801955050505b50505092915050565b6000614266601783614ab8565b915061427182614eaa565b602082019050919050565b6000614289601e83614ab8565b915061429482614ed3565b602082019050919050565b60006142ac602183614ab8565b91506142b782614efc565b604082019050919050565b60006142cf602683614ab8565b91506142da82614f4b565b604082019050919050565b60006142f2601783614ab8565b91506142fd82614f9a565b602082019050919050565b6000614315603083614ab8565b915061432082614fc3565b604082019050919050565b6000614338601e83614ab8565b915061434382615012565b602082019050919050565b600061435b601f83614ab8565b91506143668261503b565b602082019050919050565b600061437e603183614ab8565b915061438982615064565b604082019050919050565b60006143a1601283614ab8565b91506143ac826150b3565b602082019050919050565b60006143c4601983614ab8565b91506143cf826150dc565b602082019050919050565b60006143e7601783614ab8565b91506143f282615105565b602082019050919050565b600061440a601f83614ab8565b91506144158261512e565b602082019050919050565b600061442d601b83614ab8565b915061443882615157565b602082019050919050565b6000614450601383614ab8565b915061445b82615180565b602082019050919050565b6000614473602083614ab8565b915061447e826151a9565b602082019050919050565b6000614496602083614ab8565b91506144a1826151d2565b602082019050919050565b60006144b9601c83614ab8565b91506144c4826151fb565b602082019050919050565b60006144dc600083614aad565b91506144e782615224565b600082019050919050565b60006144ff601083614ab8565b915061450a82615227565b602082019050919050565b6000614522601483614ab8565b915061452d82615250565b602082019050919050565b6000614545601f83614ab8565b915061455082615279565b602082019050919050565b6000614568601d83614ab8565b9150614573826152a2565b602082019050919050565b60608201600082015161459460008501826140fb565b5060208201516145a760208501826145cf565b5060408201516145ba6040850182614119565b50505050565b6145c981614c53565b82525050565b6145d881614c5d565b82525050565b60006145ea82866141a9565b91506145f682856141a9565b915061460282846141da565b9150819050949350505050565b600061461a826144cf565b9150819050919050565b6000602082019050614639600083018461410a565b92915050565b6000608082019050614654600083018761410a565b614661602083018661410a565b61466e60408301856145c0565b81810360608301526146808184614137565b905095945050505050565b60006020820190506146a06000830184614128565b92915050565b600060208201905081810360008301526146c08184614170565b905092915050565b600060208201905081810360008301526146e181614259565b9050919050565b600060208201905081810360008301526147018161427c565b9050919050565b600060208201905081810360008301526147218161429f565b9050919050565b60006020820190508181036000830152614741816142c2565b9050919050565b60006020820190508181036000830152614761816142e5565b9050919050565b6000602082019050818103600083015261478181614308565b9050919050565b600060208201905081810360008301526147a18161432b565b9050919050565b600060208201905081810360008301526147c18161434e565b9050919050565b600060208201905081810360008301526147e181614371565b9050919050565b6000602082019050818103600083015261480181614394565b9050919050565b60006020820190508181036000830152614821816143b7565b9050919050565b60006020820190508181036000830152614841816143da565b9050919050565b60006020820190508181036000830152614861816143fd565b9050919050565b6000602082019050818103600083015261488181614420565b9050919050565b600060208201905081810360008301526148a181614443565b9050919050565b600060208201905081810360008301526148c181614466565b9050919050565b600060208201905081810360008301526148e181614489565b9050919050565b60006020820190508181036000830152614901816144ac565b9050919050565b60006020820190508181036000830152614921816144f2565b9050919050565b6000602082019050818103600083015261494181614515565b9050919050565b6000602082019050818103600083015261496181614538565b9050919050565b600060208201905081810360008301526149818161455b565b9050919050565b600060608201905061499d600083018461457e565b92915050565b60006020820190506149b860008301846145c0565b92915050565b60006149c86149d9565b90506149d48282614ce5565b919050565b6000604051905090565b600067ffffffffffffffff8211156149fe576149fd614e4c565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614a2a57614a29614e4c565b5b614a3382614e99565b9050602081019050919050565b600067ffffffffffffffff821115614a5b57614a5a614e4c565b5b614a6482614e99565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614adf82614c53565b9150614aea83614c53565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b1f57614b1e614d90565b5b828201905092915050565b6000614b3582614c53565b9150614b4083614c53565b925082614b5057614b4f614dbf565b5b828204905092915050565b6000614b6682614c53565b9150614b7183614c53565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614baa57614ba9614d90565b5b828202905092915050565b6000614bc082614c53565b9150614bcb83614c53565b925082821015614bde57614bdd614d90565b5b828203905092915050565b6000614bf482614c33565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015614c9e578082015181840152602081019050614c83565b83811115614cad576000848401525b50505050565b60006002820490506001821680614ccb57607f821691505b60208210811415614cdf57614cde614dee565b5b50919050565b614cee82614e99565b810181811067ffffffffffffffff82111715614d0d57614d0c614e4c565b5b80604052505050565b6000614d2182614c53565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d5457614d53614d90565b5b600182019050919050565b6000614d6a82614c53565b9150614d7583614c53565b925082614d8557614d84614dbf565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f50726573616c6520686173206e6f742073746172746564000000000000000000600082015250565b7f496e636f727265637420616c6c6f776c697374206d696e7420736c6f74730000600082015250565b7f4552433732314d657461646174613a204e6f6e6578697374656e7420746f6b6560008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5075626c69632073616c65206e6f742073746172746564000000000000000000600082015250565b7f4d757374206d696e74206174206c65617374206f6e6520746f6b656e20616e6460008201527f206e6f74206d6f7265207468616e203200000000000000000000000000000000602082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f4d696e74696e6720776f756c6420657863656564206d617820737570706c7900600082015250565b7f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e7360008201527f20696e2061207472616e73616374696f6e000000000000000000000000000000602082015250565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f6164647265737365732063616e6e6f7420626520656d70747900000000000000600082015250565b7f45544820616d6f756e7420697320696e636f7272656374000000000000000000600082015250565b7f6e6f7420656c696769626c6520666f7220616c6c6f776c697374206d696e7400600082015250565b7f596f752063616e6e6f74206d696e74207468697320616d6f756e740000000000600082015250565b7f496e737566666963656e742062616c616e636500000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f616c6c6f776c6973742073616c6520686173206e6f7420626567756e20796574600082015250565b7f4d757374206d696e74206174206c65617374206f6e6520746f6b656e00000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f53616c6520686173206e6f742073746172746564000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4c696d697420666f7220746869732077616c6c65742072656163686564000000600082015250565b6152d481614be9565b81146152df57600080fd5b50565b6152eb81614bfb565b81146152f657600080fd5b50565b61530281614c07565b811461530d57600080fd5b50565b61531981614c53565b811461532457600080fd5b5056fea26469706673582212205810a004ec66d780e5e173fd6096a95b75720c57758f7367f0da5ad4f0b91dde64736f6c63430008070033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000043697066733a2f2f6261667962656963766134337a7779746d6469756c6a34376c6d627378783762696737776777737378326e656f79623635326c72787737357968752f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042697066733a2f2f516d5535546642764d72646366367646426e7a414b5a347244505555524e314834547768505a4662734b767275732f707265766965772e6a736f6e000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102885760003560e01c80639231ab2a1161015a578063c180526a116100c1578063e268e4d31161007a578063e268e4d3146109b2578063e985e9c5146109db578063ed1fc2a214610a18578063f2c4ce1e14610a2f578063f2fde38b14610a58578063f47c84c514610a8157610288565b8063c180526a1461089f578063c6682862146108bb578063c87b56dd146108e6578063cd094fb114610923578063da3ef23f1461094c578063dc33e6811461097557610288565b8063a7cd52cb11610113578063a7cd52cb14610791578063ac446002146107ce578063b85cecd3146107e5578063b88d4fde14610822578063bc6d26351461084b578063bec4a8931461086257610288565b80639231ab2a14610690578063940cd05b146106cd57806395d89b41146106f6578063a035b1fe14610721578063a0712d681461074c578063a22cb4651461076857610288565b806355f804b3116101fe578063715018a6116101b7578063715018a6146105a657806372250380146105bd57806388c206f7146105e85780638da5cb5b1461061157806390967a521461063c57806391b7f5ed1461066757610288565b806355f804b314610482578063574eb874146104ab5780635c474f9e146104d65780636352211e146105015780636c0360eb1461053e57806370a082311461056957610288565b806318160ddd1161025057806318160ddd1461038657806323b872dd146103b15780632a1de3a2146103da57806342842e0e14610403578063453c23101461042c578063518302271461045757610288565b806301ffc9a71461028d57806304549d6f146102ca57806306fdde03146102f5578063081812fc14610320578063095ea7b31461035d575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af9190613fde565b610aac565b6040516102c1919061468b565b60405180910390f35b3480156102d657600080fd5b506102df610b8e565b6040516102ec919061468b565b60405180910390f35b34801561030157600080fd5b5061030a610ba1565b60405161031791906146a6565b60405180910390f35b34801561032c57600080fd5b50610347600480360381019061034291906140ce565b610c33565b6040516103549190614624565b60405180910390f35b34801561036957600080fd5b50610384600480360381019061037f9190613f28565b610caf565b005b34801561039257600080fd5b5061039b610dba565b6040516103a891906149a3565b60405180910390f35b3480156103bd57600080fd5b506103d860048036038101906103d39190613e12565b610dd1565b005b3480156103e657600080fd5b5061040160048036038101906103fc91906140ce565b610de1565b005b34801561040f57600080fd5b5061042a60048036038101906104259190613e12565b610e67565b005b34801561043857600080fd5b50610441610e87565b60405161044e91906149a3565b60405180910390f35b34801561046357600080fd5b5061046c610e8d565b604051610479919061468b565b60405180910390f35b34801561048e57600080fd5b506104a960048036038101906104a49190614038565b610ea0565b005b3480156104b757600080fd5b506104c0610f32565b6040516104cd91906149a3565b60405180910390f35b3480156104e257600080fd5b506104eb610f38565b6040516104f8919061468b565b60405180910390f35b34801561050d57600080fd5b50610528600480360381019061052391906140ce565b610f4b565b6040516105359190614624565b60405180910390f35b34801561054a57600080fd5b50610553610f61565b60405161056091906146a6565b60405180910390f35b34801561057557600080fd5b50610590600480360381019061058b9190613da5565b610fef565b60405161059d91906149a3565b60405180910390f35b3480156105b257600080fd5b506105bb6110bf565b005b3480156105c957600080fd5b506105d2611147565b6040516105df91906146a6565b60405180910390f35b3480156105f457600080fd5b5061060f600480360381019061060a9190613f68565b6111d5565b005b34801561061d57600080fd5b50610626611318565b6040516106339190614624565b60405180910390f35b34801561064857600080fd5b50610651611341565b60405161065e91906149a3565b60405180910390f35b34801561067357600080fd5b5061068e600480360381019061068991906140ce565b611347565b005b34801561069c57600080fd5b506106b760048036038101906106b291906140ce565b6113e0565b6040516106c49190614988565b60405180910390f35b3480156106d957600080fd5b506106f460048036038101906106ef9190613fb1565b6113f8565b005b34801561070257600080fd5b5061070b611491565b60405161071891906146a6565b60405180910390f35b34801561072d57600080fd5b50610736611523565b60405161074391906149a3565b60405180910390f35b610766600480360381019061076191906140ce565b611529565b005b34801561077457600080fd5b5061078f600480360381019061078a9190613ee8565b61188f565b005b34801561079d57600080fd5b506107b860048036038101906107b39190613da5565b611a07565b6040516107c591906149a3565b60405180910390f35b3480156107da57600080fd5b506107e3611a1f565b005b3480156107f157600080fd5b5061080c60048036038101906108079190613da5565b611be9565b60405161081991906149a3565b60405180910390f35b34801561082e57600080fd5b5061084960048036038101906108449190613e65565b611c01565b005b34801561085757600080fd5b50610860611c7d565b005b34801561086e57600080fd5b5061088960048036038101906108849190613da5565b611d4f565b60405161089691906149a3565b60405180910390f35b6108b960048036038101906108b491906140ce565b611e72565b005b3480156108c757600080fd5b506108d0612233565b6040516108dd91906146a6565b60405180910390f35b3480156108f257600080fd5b5061090d600480360381019061090891906140ce565b6122c1565b60405161091a91906146a6565b60405180910390f35b34801561092f57600080fd5b5061094a600480360381019061094591906140ce565b61241a565b005b34801561095857600080fd5b50610973600480360381019061096e9190614085565b6124b3565b005b34801561098157600080fd5b5061099c60048036038101906109979190613da5565b612549565b6040516109a991906149a3565b60405180910390f35b3480156109be57600080fd5b506109d960048036038101906109d491906140ce565b61255b565b005b3480156109e757600080fd5b50610a0260048036038101906109fd9190613dd2565b6125e1565b604051610a0f919061468b565b60405180910390f35b348015610a2457600080fd5b50610a2d612675565b005b348015610a3b57600080fd5b50610a566004803603810190610a519190614085565b61271d565b005b348015610a6457600080fd5b50610a7f6004803603810190610a7a9190613da5565b6127b3565b005b348015610a8d57600080fd5b50610a966128ab565b604051610aa391906149a3565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b7757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b875750610b86826128f2565b5b9050919050565b600c60019054906101000a900460ff1681565b606060038054610bb090614cb3565b80601f0160208091040260200160405190810160405280929190818152602001828054610bdc90614cb3565b8015610c295780601f10610bfe57610100808354040283529160200191610c29565b820191906000526020600020905b815481529060010190602001808311610c0c57829003601f168201915b5050505050905090565b6000610c3e8261295c565b610c74576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cba82610f4b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d22576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d416129aa565b73ffffffffffffffffffffffffffffffffffffffff1614158015610d735750610d7181610d6c6129aa565b6125e1565b155b15610daa576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610db58383836129b2565b505050565b6000610dc4612a64565b6002546001540303905090565b610ddc838383612a6d565b505050565b610de96129aa565b73ffffffffffffffffffffffffffffffffffffffff16610e07611318565b73ffffffffffffffffffffffffffffffffffffffff1614610e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e54906148a8565b60405180910390fd5b80600e8190555050565b610e8283838360405180602001604052806000815250611c01565b505050565b600d5481565b600c60029054906101000a900460ff1681565b610ea86129aa565b73ffffffffffffffffffffffffffffffffffffffff16610ec6611318565b73ffffffffffffffffffffffffffffffffffffffff1614610f1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f13906148a8565b60405180910390fd5b8181600f9190610f2d9291906139fc565b505050565b600e5481565b600c60009054906101000a900460ff1681565b6000610f5682612f09565b600001519050919050565b600f8054610f6e90614cb3565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9a90614cb3565b8015610fe75780601f10610fbc57610100808354040283529160200191610fe7565b820191906000526020600020905b815481529060010190602001808311610fca57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611057576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6110c76129aa565b73ffffffffffffffffffffffffffffffffffffffff166110e5611318565b73ffffffffffffffffffffffffffffffffffffffff161461113b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611132906148a8565b60405180910390fd5b6111456000613198565b565b6011805461115490614cb3565b80601f016020809104026020016040519081016040528092919081815260200182805461118090614cb3565b80156111cd5780601f106111a2576101008083540402835291602001916111cd565b820191906000526020600020905b8154815290600101906020018083116111b057829003601f168201915b505050505081565b6111dd6129aa565b73ffffffffffffffffffffffffffffffffffffffff166111fb611318565b73ffffffffffffffffffffffffffffffffffffffff1614611251576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611248906148a8565b60405180910390fd5b6000815111611295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128c90614808565b60405180910390fd5b60005b815181101561131457600e54601260008484815181106112bb576112ba614e1d565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808061130c90614d16565b915050611298565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b5481565b61134f6129aa565b73ffffffffffffffffffffffffffffffffffffffff1661136d611318565b73ffffffffffffffffffffffffffffffffffffffff16146113c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ba906148a8565b60405180910390fd5b670de0b6b3a7640000816113d79190614b5b565b600a8190555050565b6113e8613a82565b6113f182612f09565b9050919050565b6114006129aa565b73ffffffffffffffffffffffffffffffffffffffff1661141e611318565b73ffffffffffffffffffffffffffffffffffffffff1614611474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146b906148a8565b60405180910390fd5b80600c60026101000a81548160ff02191690831515021790555050565b6060600480546114a090614cb3565b80601f01602080910402602001604051908101604052809291908181526020018280546114cc90614cb3565b80156115195780601f106114ee57610100808354040283529160200191611519565b820191906000526020600020905b8154815290600101906020018083116114fc57829003601f168201915b5050505050905090565b600a5481565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611597576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158e90614788565b60405180910390fd5b600c60009054906101000a900460ff166115e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115dd90614928565b60405180910390fd5b60001515600c60019054906101000a900460ff1615151461163c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163390614748565b60405180910390fd5b600d54811115611681576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611678906147c8565b60405180910390fd5b600d5481601360006116916129aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116d69190614ad4565b1115611717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170e90614968565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000271081611741610dba565b61174b9190614ad4565b111561178c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611783906147a8565b60405180910390fd5b600081116117cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c6906148e8565b60405180910390fd5b3481600a546117de9190614b5b565b1461181e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181590614828565b60405180910390fd5b806013600061182b6129aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118749190614ad4565b9250508190555061188c6118866129aa565b8261325c565b50565b6118976129aa565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118fc576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600860006119096129aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166119b66129aa565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119fb919061468b565b60405180910390a35050565b60126020528060005260406000206000915090505481565b611a276129aa565b73ffffffffffffffffffffffffffffffffffffffff16611a45611318565b73ffffffffffffffffffffffffffffffffffffffff1614611a9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a92906148a8565b60405180910390fd5b60026009541415611ae1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad890614948565b60405180910390fd5b6002600981905550600047905060008111611b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2890614888565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051611b579061460f565b60006040518083038185875af1925050503d8060008114611b94576040519150601f19603f3d011682016040523d82523d6000602084013e611b99565b606091505b5050905080611bdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd490614908565b60405180910390fd5b50506001600981905550565b60136020528060005260406000206000915090505481565b611c0c848484612a6d565b611c2b8373ffffffffffffffffffffffffffffffffffffffff166128cf565b8015611c405750611c3e8484848461327a565b155b15611c77576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b611c856129aa565b73ffffffffffffffffffffffffffffffffffffffff16611ca3611318565b73ffffffffffffffffffffffffffffffffffffffff1614611cf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf0906148a8565b60405180910390fd5b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550600c60019054906101000a900460ff1615600c60016101000a81548160ff021916908315150217905550565b600080601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dca906146e8565b60405180910390fd5b6000601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415611e245760009050611e6d565b6000601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050809150505b919050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed790614788565b60405180910390fd5b600c60019054906101000a900460ff16611f2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f26906146c8565b60405180910390fd5b600081118015611f415750600e548111155b611f80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7790614768565b60405180910390fd5b6000600b5490506000811415611fcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc2906148c8565b60405180910390fd5b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541161204d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204490614848565b60405180910390fd5b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050808311156120d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cb90614868565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000002710836120fe610dba565b6121089190614ad4565b1115612149576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612140906147e8565b60405180910390fd5b82826121559190614b5b565b3414612196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218d90614828565b60405180910390fd5b82601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121e19190614bb5565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061222e338461325c565b505050565b6010805461224090614cb3565b80601f016020809104026020016040519081016040528092919081815260200182805461226c90614cb3565b80156122b95780601f1061228e576101008083540402835291602001916122b9565b820191906000526020600020905b81548152906001019060200180831161229c57829003601f168201915b505050505081565b60606122cc8261295c565b61230b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230290614708565b60405180910390fd5b60001515600c60029054906101000a900460ff16151514156123b9576011805461233490614cb3565b80601f016020809104026020016040519081016040528092919081815260200182805461236090614cb3565b80156123ad5780601f10612382576101008083540402835291602001916123ad565b820191906000526020600020905b81548152906001019060200180831161239057829003601f168201915b50505050509050612415565b60006123c36133da565b905060008151116123e35760405180602001604052806000815250612411565b806123ed8461346c565b6010604051602001612401939291906145de565b6040516020818303038152906040525b9150505b919050565b6124226129aa565b73ffffffffffffffffffffffffffffffffffffffff16612440611318565b73ffffffffffffffffffffffffffffffffffffffff1614612496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248d906148a8565b60405180910390fd5b670de0b6b3a7640000816124aa9190614b5b565b600b8190555050565b6124bb6129aa565b73ffffffffffffffffffffffffffffffffffffffff166124d9611318565b73ffffffffffffffffffffffffffffffffffffffff161461252f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612526906148a8565b60405180910390fd5b8060109080519060200190612545929190613ac5565b5050565b6000612554826135cd565b9050919050565b6125636129aa565b73ffffffffffffffffffffffffffffffffffffffff16612581611318565b73ffffffffffffffffffffffffffffffffffffffff16146125d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ce906148a8565b60405180910390fd5b80600d8190555050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61267d6129aa565b73ffffffffffffffffffffffffffffffffffffffff1661269b611318565b73ffffffffffffffffffffffffffffffffffffffff16146126f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e8906148a8565b60405180910390fd5b600c60019054906101000a900460ff1615600c60016101000a81548160ff021916908315150217905550565b6127256129aa565b73ffffffffffffffffffffffffffffffffffffffff16612743611318565b73ffffffffffffffffffffffffffffffffffffffff1614612799576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612790906148a8565b60405180910390fd5b80601190805190602001906127af929190613ac5565b5050565b6127bb6129aa565b73ffffffffffffffffffffffffffffffffffffffff166127d9611318565b73ffffffffffffffffffffffffffffffffffffffff161461282f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612826906148a8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561289f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289690614728565b60405180910390fd5b6128a881613198565b50565b7f000000000000000000000000000000000000000000000000000000000000271081565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081612967612a64565b11158015612976575060015482105b80156129a3575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000612a7882612f09565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612ae3576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612b046129aa565b73ffffffffffffffffffffffffffffffffffffffff161480612b335750612b3285612b2d6129aa565b6125e1565b5b80612b785750612b416129aa565b73ffffffffffffffffffffffffffffffffffffffff16612b6084610c33565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612bb1576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612c18576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c24600084876129b2565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612ea4576001548214612ea357878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b612f11613a82565b600082905080612f1f612a64565b11158015612f2e575060015481105b15613161576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161315f57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614613043578092505050613193565b5b60011561315e57818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614613159578092505050613193565b613044565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613276828260405180602001604052806000815250613637565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026132a06129aa565b8786866040518563ffffffff1660e01b81526004016132c2949392919061463f565b602060405180830381600087803b1580156132dc57600080fd5b505af192505050801561330d57506040513d601f19601f8201168201806040525081019061330a919061400b565b60015b613387573d806000811461333d576040519150601f19603f3d011682016040523d82523d6000602084013e613342565b606091505b5060008151141561337f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600f80546133e990614cb3565b80601f016020809104026020016040519081016040528092919081815260200182805461341590614cb3565b80156134625780601f1061343757610100808354040283529160200191613462565b820191906000526020600020905b81548152906001019060200180831161344557829003601f168201915b5050505050905090565b606060008214156134b4576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506135c8565b600082905060005b600082146134e65780806134cf90614d16565b915050600a826134df9190614b2a565b91506134bc565b60008167ffffffffffffffff81111561350257613501614e4c565b5b6040519080825280601f01601f1916602001820160405280156135345781602001600182028036833780820191505090505b5090505b600085146135c15760018261354d9190614bb5565b9150600a8561355c9190614d5f565b60306135689190614ad4565b60f81b81838151811061357e5761357d614e1d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856135ba9190614b2a565b9450613538565b8093505050505b919050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6136448383836001613649565b505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156136b7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156136f2576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156138bc57506138bb8773ffffffffffffffffffffffffffffffffffffffff166128cf565b5b15613981575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613931600088848060010195508861327a565b613967576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106138c257826001541461397c57600080fd5b6139ec565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210613982575b8160018190555050505050505050565b828054613a0890614cb3565b90600052602060002090601f016020900481019282613a2a5760008555613a71565b82601f10613a4357803560ff1916838001178555613a71565b82800160010185558215613a71579182015b82811115613a70578235825591602001919060010190613a55565b5b509050613a7e9190613b4b565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b828054613ad190614cb3565b90600052602060002090601f016020900481019282613af35760008555613b3a565b82601f10613b0c57805160ff1916838001178555613b3a565b82800160010185558215613b3a579182015b82811115613b39578251825591602001919060010190613b1e565b5b509050613b479190613b4b565b5090565b5b80821115613b64576000816000905550600101613b4c565b5090565b6000613b7b613b76846149e3565b6149be565b90508083825260208201905082856020860282011115613b9e57613b9d614e85565b5b60005b85811015613bce5781613bb48882613c5c565b845260208401935060208301925050600181019050613ba1565b5050509392505050565b6000613beb613be684614a0f565b6149be565b905082815260208101848484011115613c0757613c06614e8a565b5b613c12848285614c71565b509392505050565b6000613c2d613c2884614a40565b6149be565b905082815260208101848484011115613c4957613c48614e8a565b5b613c54848285614c71565b509392505050565b600081359050613c6b816152cb565b92915050565b600082601f830112613c8657613c85614e80565b5b8135613c96848260208601613b68565b91505092915050565b600081359050613cae816152e2565b92915050565b600081359050613cc3816152f9565b92915050565b600081519050613cd8816152f9565b92915050565b600082601f830112613cf357613cf2614e80565b5b8135613d03848260208601613bd8565b91505092915050565b60008083601f840112613d2257613d21614e80565b5b8235905067ffffffffffffffff811115613d3f57613d3e614e7b565b5b602083019150836001820283011115613d5b57613d5a614e85565b5b9250929050565b600082601f830112613d7757613d76614e80565b5b8135613d87848260208601613c1a565b91505092915050565b600081359050613d9f81615310565b92915050565b600060208284031215613dbb57613dba614e94565b5b6000613dc984828501613c5c565b91505092915050565b60008060408385031215613de957613de8614e94565b5b6000613df785828601613c5c565b9250506020613e0885828601613c5c565b9150509250929050565b600080600060608486031215613e2b57613e2a614e94565b5b6000613e3986828701613c5c565b9350506020613e4a86828701613c5c565b9250506040613e5b86828701613d90565b9150509250925092565b60008060008060808587031215613e7f57613e7e614e94565b5b6000613e8d87828801613c5c565b9450506020613e9e87828801613c5c565b9350506040613eaf87828801613d90565b925050606085013567ffffffffffffffff811115613ed057613ecf614e8f565b5b613edc87828801613cde565b91505092959194509250565b60008060408385031215613eff57613efe614e94565b5b6000613f0d85828601613c5c565b9250506020613f1e85828601613c9f565b9150509250929050565b60008060408385031215613f3f57613f3e614e94565b5b6000613f4d85828601613c5c565b9250506020613f5e85828601613d90565b9150509250929050565b600060208284031215613f7e57613f7d614e94565b5b600082013567ffffffffffffffff811115613f9c57613f9b614e8f565b5b613fa884828501613c71565b91505092915050565b600060208284031215613fc757613fc6614e94565b5b6000613fd584828501613c9f565b91505092915050565b600060208284031215613ff457613ff3614e94565b5b600061400284828501613cb4565b91505092915050565b60006020828403121561402157614020614e94565b5b600061402f84828501613cc9565b91505092915050565b6000806020838503121561404f5761404e614e94565b5b600083013567ffffffffffffffff81111561406d5761406c614e8f565b5b61407985828601613d0c565b92509250509250929050565b60006020828403121561409b5761409a614e94565b5b600082013567ffffffffffffffff8111156140b9576140b8614e8f565b5b6140c584828501613d62565b91505092915050565b6000602082840312156140e4576140e3614e94565b5b60006140f284828501613d90565b91505092915050565b61410481614be9565b82525050565b61411381614be9565b82525050565b61412281614bfb565b82525050565b61413181614bfb565b82525050565b600061414282614a86565b61414c8185614a9c565b935061415c818560208601614c80565b61416581614e99565b840191505092915050565b600061417b82614a91565b6141858185614ab8565b9350614195818560208601614c80565b61419e81614e99565b840191505092915050565b60006141b482614a91565b6141be8185614ac9565b93506141ce818560208601614c80565b80840191505092915050565b600081546141e781614cb3565b6141f18186614ac9565b9450600182166000811461420c576001811461421d57614250565b60ff19831686528186019350614250565b61422685614a71565b60005b8381101561424857815481890152600182019150602081019050614229565b838801955050505b50505092915050565b6000614266601783614ab8565b915061427182614eaa565b602082019050919050565b6000614289601e83614ab8565b915061429482614ed3565b602082019050919050565b60006142ac602183614ab8565b91506142b782614efc565b604082019050919050565b60006142cf602683614ab8565b91506142da82614f4b565b604082019050919050565b60006142f2601783614ab8565b91506142fd82614f9a565b602082019050919050565b6000614315603083614ab8565b915061432082614fc3565b604082019050919050565b6000614338601e83614ab8565b915061434382615012565b602082019050919050565b600061435b601f83614ab8565b91506143668261503b565b602082019050919050565b600061437e603183614ab8565b915061438982615064565b604082019050919050565b60006143a1601283614ab8565b91506143ac826150b3565b602082019050919050565b60006143c4601983614ab8565b91506143cf826150dc565b602082019050919050565b60006143e7601783614ab8565b91506143f282615105565b602082019050919050565b600061440a601f83614ab8565b91506144158261512e565b602082019050919050565b600061442d601b83614ab8565b915061443882615157565b602082019050919050565b6000614450601383614ab8565b915061445b82615180565b602082019050919050565b6000614473602083614ab8565b915061447e826151a9565b602082019050919050565b6000614496602083614ab8565b91506144a1826151d2565b602082019050919050565b60006144b9601c83614ab8565b91506144c4826151fb565b602082019050919050565b60006144dc600083614aad565b91506144e782615224565b600082019050919050565b60006144ff601083614ab8565b915061450a82615227565b602082019050919050565b6000614522601483614ab8565b915061452d82615250565b602082019050919050565b6000614545601f83614ab8565b915061455082615279565b602082019050919050565b6000614568601d83614ab8565b9150614573826152a2565b602082019050919050565b60608201600082015161459460008501826140fb565b5060208201516145a760208501826145cf565b5060408201516145ba6040850182614119565b50505050565b6145c981614c53565b82525050565b6145d881614c5d565b82525050565b60006145ea82866141a9565b91506145f682856141a9565b915061460282846141da565b9150819050949350505050565b600061461a826144cf565b9150819050919050565b6000602082019050614639600083018461410a565b92915050565b6000608082019050614654600083018761410a565b614661602083018661410a565b61466e60408301856145c0565b81810360608301526146808184614137565b905095945050505050565b60006020820190506146a06000830184614128565b92915050565b600060208201905081810360008301526146c08184614170565b905092915050565b600060208201905081810360008301526146e181614259565b9050919050565b600060208201905081810360008301526147018161427c565b9050919050565b600060208201905081810360008301526147218161429f565b9050919050565b60006020820190508181036000830152614741816142c2565b9050919050565b60006020820190508181036000830152614761816142e5565b9050919050565b6000602082019050818103600083015261478181614308565b9050919050565b600060208201905081810360008301526147a18161432b565b9050919050565b600060208201905081810360008301526147c18161434e565b9050919050565b600060208201905081810360008301526147e181614371565b9050919050565b6000602082019050818103600083015261480181614394565b9050919050565b60006020820190508181036000830152614821816143b7565b9050919050565b60006020820190508181036000830152614841816143da565b9050919050565b60006020820190508181036000830152614861816143fd565b9050919050565b6000602082019050818103600083015261488181614420565b9050919050565b600060208201905081810360008301526148a181614443565b9050919050565b600060208201905081810360008301526148c181614466565b9050919050565b600060208201905081810360008301526148e181614489565b9050919050565b60006020820190508181036000830152614901816144ac565b9050919050565b60006020820190508181036000830152614921816144f2565b9050919050565b6000602082019050818103600083015261494181614515565b9050919050565b6000602082019050818103600083015261496181614538565b9050919050565b600060208201905081810360008301526149818161455b565b9050919050565b600060608201905061499d600083018461457e565b92915050565b60006020820190506149b860008301846145c0565b92915050565b60006149c86149d9565b90506149d48282614ce5565b919050565b6000604051905090565b600067ffffffffffffffff8211156149fe576149fd614e4c565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614a2a57614a29614e4c565b5b614a3382614e99565b9050602081019050919050565b600067ffffffffffffffff821115614a5b57614a5a614e4c565b5b614a6482614e99565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614adf82614c53565b9150614aea83614c53565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b1f57614b1e614d90565b5b828201905092915050565b6000614b3582614c53565b9150614b4083614c53565b925082614b5057614b4f614dbf565b5b828204905092915050565b6000614b6682614c53565b9150614b7183614c53565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614baa57614ba9614d90565b5b828202905092915050565b6000614bc082614c53565b9150614bcb83614c53565b925082821015614bde57614bdd614d90565b5b828203905092915050565b6000614bf482614c33565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015614c9e578082015181840152602081019050614c83565b83811115614cad576000848401525b50505050565b60006002820490506001821680614ccb57607f821691505b60208210811415614cdf57614cde614dee565b5b50919050565b614cee82614e99565b810181811067ffffffffffffffff82111715614d0d57614d0c614e4c565b5b80604052505050565b6000614d2182614c53565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d5457614d53614d90565b5b600182019050919050565b6000614d6a82614c53565b9150614d7583614c53565b925082614d8557614d84614dbf565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f50726573616c6520686173206e6f742073746172746564000000000000000000600082015250565b7f496e636f727265637420616c6c6f776c697374206d696e7420736c6f74730000600082015250565b7f4552433732314d657461646174613a204e6f6e6578697374656e7420746f6b6560008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5075626c69632073616c65206e6f742073746172746564000000000000000000600082015250565b7f4d757374206d696e74206174206c65617374206f6e6520746f6b656e20616e6460008201527f206e6f74206d6f7265207468616e203200000000000000000000000000000000602082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f4d696e74696e6720776f756c6420657863656564206d617820737570706c7900600082015250565b7f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e7360008201527f20696e2061207472616e73616374696f6e000000000000000000000000000000602082015250565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f6164647265737365732063616e6e6f7420626520656d70747900000000000000600082015250565b7f45544820616d6f756e7420697320696e636f7272656374000000000000000000600082015250565b7f6e6f7420656c696769626c6520666f7220616c6c6f776c697374206d696e7400600082015250565b7f596f752063616e6e6f74206d696e74207468697320616d6f756e740000000000600082015250565b7f496e737566666963656e742062616c616e636500000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f616c6c6f776c6973742073616c6520686173206e6f7420626567756e20796574600082015250565b7f4d757374206d696e74206174206c65617374206f6e6520746f6b656e00000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f53616c6520686173206e6f742073746172746564000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4c696d697420666f7220746869732077616c6c65742072656163686564000000600082015250565b6152d481614be9565b81146152df57600080fd5b50565b6152eb81614bfb565b81146152f657600080fd5b50565b61530281614c07565b811461530d57600080fd5b50565b61531981614c53565b811461532457600080fd5b5056fea26469706673582212205810a004ec66d780e5e173fd6096a95b75720c57758f7367f0da5ad4f0b91dde64736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000043697066733a2f2f6261667962656963766134337a7779746d6469756c6a34376c6d627378783762696737776777737378326e656f79623635326c72787737357968752f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042697066733a2f2f516d5535546642764d72646366367646426e7a414b5a347244505555524e314834547768505a4662734b767275732f707265766965772e6a736f6e000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : initBaseURI_ (string): ipfs://bafybeicva43zwytmdiulj47lmbsxx7big7wgwssx2neoyb652lrxw75yhu/
Arg [1] : initNotRevealedURI_ (string): ipfs://QmU5TfBvMrdcf6vFBnzAKZ4rDPUURN1H4TwhPZFbsKvrus/preview.json

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [3] : 697066733a2f2f6261667962656963766134337a7779746d6469756c6a34376c
Arg [4] : 6d627378783762696737776777737378326e656f79623635326c727877373579
Arg [5] : 68752f0000000000000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000042
Arg [7] : 697066733a2f2f516d5535546642764d72646366367646426e7a414b5a347244
Arg [8] : 505555524e314834547768505a4662734b767275732f707265766965772e6a73
Arg [9] : 6f6e000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

54603:6033:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36061:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54908:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39174:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40679:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40242:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35301:312;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41544:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56339:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41785:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54986:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54949:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56025:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55025:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54870:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38982:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55064:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36430:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53722:103;;;;;;;;;;;;;:::i;:::-;;55136:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57206:272;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53071:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54819:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56717:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58739:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56131:78;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39343:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54779:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59963:670;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40955:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55208:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57484:286;;;;;;;;;;;;;:::i;:::-;;55327:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42041:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55884:136;;;;;;;;;;;;;:::i;:::-;;56939:261;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59035:774;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55092:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58156:470;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56821:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56585:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58630:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56215:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41313:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55776:102;;;;;;;;;;;;;:::i;:::-;;56457:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53980:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54729:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36061:305;36163:4;36215:25;36200:40;;;:11;:40;;;;:105;;;;36272:33;36257:48;;;:11;:48;;;;36200:105;:158;;;;36322:36;36346:11;36322:23;:36::i;:::-;36200:158;36180:178;;36061:305;;;:::o;54908:34::-;;;;;;;;;;;;;:::o;39174:100::-;39228:13;39261:5;39254:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39174:100;:::o;40679:204::-;40747:7;40772:16;40780:7;40772;:16::i;:::-;40767:64;;40797:34;;;;;;;;;;;;;;40767:64;40851:15;:24;40867:7;40851:24;;;;;;;;;;;;;;;;;;;;;40844:31;;40679:204;;;:::o;40242:371::-;40315:13;40331:24;40347:7;40331:15;:24::i;:::-;40315:40;;40376:5;40370:11;;:2;:11;;;40366:48;;;40390:24;;;;;;;;;;;;;;40366:48;40447:5;40431:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;40457:37;40474:5;40481:12;:10;:12::i;:::-;40457:16;:37::i;:::-;40456:38;40431:63;40427:138;;;40518:35;;;;;;;;;;;;;;40427:138;40577:28;40586:2;40590:7;40599:5;40577:8;:28::i;:::-;40304:309;40242:371;;:::o;35301:312::-;35354:7;35579:15;:13;:15::i;:::-;35564:12;;35548:13;;:28;:46;35541:53;;35301:312;:::o;41544:170::-;41678:28;41688:4;41694:2;41698:7;41678:9;:28::i;:::-;41544:170;;;:::o;56339:112::-;53302:12;:10;:12::i;:::-;53291:23;;:7;:5;:7::i;:::-;:23;;;53283:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56430:15:::1;56416:11;:29;;;;56339:112:::0;:::o;41785:185::-;41923:39;41940:4;41946:2;41950:7;41923:39;;;;;;;;;;;;:16;:39::i;:::-;41785:185;;;:::o;54986:32::-;;;;:::o;54949:28::-;;;;;;;;;;;;;:::o;56025:100::-;53302:12;:10;:12::i;:::-;53291:23;;:7;:5;:7::i;:::-;:23;;;53283:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56109:10:::1;;56099:7;:20;;;;;;;:::i;:::-;;56025:100:::0;;:::o;55025:30::-;;;;:::o;54870:31::-;;;;;;;;;;;;;:::o;38982:125::-;39046:7;39073:21;39086:7;39073:12;:21::i;:::-;:26;;;39066:33;;38982:125;;;:::o;55064:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36430:206::-;36494:7;36535:1;36518:19;;:5;:19;;;36514:60;;;36546:28;;;;;;;;;;;;;;36514:60;36600:12;:19;36613:5;36600:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;36592:36;;36585:43;;36430:206;;;:::o;53722:103::-;53302:12;:10;:12::i;:::-;53291:23;;:7;:5;:7::i;:::-;:23;;;53283:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53787:30:::1;53814:1;53787:18;:30::i;:::-;53722:103::o:0;55136:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;57206:272::-;53302:12;:10;:12::i;:::-;53291:23;;:7;:5;:7::i;:::-;:23;;;53283:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57321:1:::1;57302:9;:16;:20;57286:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;57377:9;57372:101;57396:9;:16;57392:1;:20;57372:101;;;57454:11;;57428:9;:23;57438:9;57448:1;57438:12;;;;;;;;:::i;:::-;;;;;;;;57428:23;;;;;;;;;;;;;;;:37;;;;57414:3;;;;;:::i;:::-;;;;57372:101;;;;57206:272:::0;:::o;53071:87::-;53117:7;53144:6;;;;;;;;;;;53137:13;;53071:87;:::o;54819:42::-;;;;:::o;56717:98::-;53302:12;:10;:12::i;:::-;53291:23;;:7;:5;:7::i;:::-;:23;;;53283:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56801:7:::1;56788:9;:21;;;;:::i;:::-;56780:5;:29;;;;56717:98:::0;:::o;58739:127::-;58805:21;;:::i;:::-;58841;58854:7;58841:12;:21::i;:::-;58834:28;;58739:127;;;:::o;56131:78::-;53302:12;:10;:12::i;:::-;53291:23;;:7;:5;:7::i;:::-;:23;;;53283:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56197:6:::1;56186:8;;:17;;;;;;;;;;;;;;;;;;56131:78:::0;:::o;39343:104::-;39399:13;39432:7;39425:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39343:104;:::o;54779:33::-;;;;:::o;59963:670::-;58922:10;58909:23;;:9;:23;;;58901:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;60038:11:::1;;;;;;;;;;;60030:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;60107:5;60089:23;;:14;;;;;;;;;;;:23;;;60081:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;60165:12;;60155:6;:22;;60147:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;60285:12;;60275:6;60246:12;:26;60259:12;:10;:12::i;:::-;60246:26;;;;;;;;;;;;;;;;:35;;;;:::i;:::-;:51;;60238:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;60372:10;60362:6;60346:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:36;;60338:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;60442:1;60433:6;:10;60425:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;60509:9;60499:6;60491:5;;:14;;;;:::i;:::-;:27;60483:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;60585:6;60555:12;:26;60568:12;:10;:12::i;:::-;60555:26;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;60598:31;60608:12;:10;:12::i;:::-;60622:6;60598:9;:31::i;:::-;59963:670:::0;:::o;40955:287::-;41066:12;:10;:12::i;:::-;41054:24;;:8;:24;;;41050:54;;;41087:17;;;;;;;;;;;;;;41050:54;41162:8;41117:18;:32;41136:12;:10;:12::i;:::-;41117:32;;;;;;;;;;;;;;;:42;41150:8;41117:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;41215:8;41186:48;;41201:12;:10;:12::i;:::-;41186:48;;;41225:8;41186:48;;;;;;:::i;:::-;;;;;;;;40955:287;;:::o;55208:44::-;;;;;;;;;;;;;;;;;:::o;57484:286::-;53302:12;:10;:12::i;:::-;53291:23;;:7;:5;:7::i;:::-;:23;;;53283:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31156:1:::1;31754:7;;:19;;31746:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;31156:1;31887:7;:18;;;;57548:15:::2;57566:21;57548:39;;57612:1;57602:7;:11;57594:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;57645:12;57671:10;57663:24;;57695:21;57663:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57644:77;;;57736:7;57728:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;57541:229;;31112:1:::1;32066:7;:22;;;;57484:286::o:0;55327:47::-;;;;;;;;;;;;;;;;;:::o;42041:369::-;42208:28;42218:4;42224:2;42228:7;42208:9;:28::i;:::-;42251:15;:2;:13;;;:15::i;:::-;:76;;;;;42271:56;42302:4;42308:2;42312:7;42321:5;42271:30;:56::i;:::-;42270:57;42251:76;42247:156;;;42351:40;;;;;;;;;;;;;;42247:156;42041:369;;;;:::o;55884:136::-;53302:12;:10;:12::i;:::-;53291:23;;:7;:5;:7::i;:::-;:23;;;53283:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55958:11:::1;;;;;;;;;;;55957:12;55943:11;;:26;;;;;;;;;;;;;;;;;;55998:14;;;;;;;;;;;55997:15;55980:14;;:32;;;;;;;;;;;;;;;;;;55884:136::o:0;56939:261::-;56995:7;57038:1;57019:9;:15;57029:4;57019:15;;;;;;;;;;;;;;;;:20;;57011:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;57103:1;57084:9;:15;57094:4;57084:15;;;;;;;;;;;;;;;;:20;57081:49;;;57121:1;57114:8;;;;57081:49;57136:17;57156:9;:15;57166:4;57156:15;;;;;;;;;;;;;;;;57136:35;;57185:9;57178:16;;;56939:261;;;;:::o;59035:774::-;58922:10;58909:23;;:9;:23;;;58901:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;59119:14:::1;;;;;;;;;;;59111:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;59185:1;59176:6;:10;:35;;;;;59200:11;;59190:6;:21;;59176:35;59168:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;59271:17;59291:14;;59271:34;;59333:1;59320:9;:14;;59312:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;59410:1;59386:9;:21;59396:10;59386:21;;;;;;;;;;;;;;;;:25;59378:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;59454:17;59474:9;:21;59484:10;59474:21;;;;;;;;;;;;;;;;59454:41;;59520:9;59510:6;:19;;59502:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;59602:10;59592:6;59576:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:36;;59568:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;59675:6;59663:9;:18;;;;:::i;:::-;59650:9;:31;59642:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;59763:6;59739:9;:21;59749:10;59739:21;;;;;;;;;;;;;;;;:30;;;;:::i;:::-;59715:9;:21;59725:10;59715:21;;;;;;;;;;;;;;;:54;;;;59776:29;59786:10;59798:6;59776:9;:29::i;:::-;59104:705;;59035:774:::0;:::o;55092:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58156:470::-;58229:13;58263:16;58271:7;58263;:16::i;:::-;58255:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;58377:5;58365:17;;:8;;;;;;;;;;;:17;;;58361:72;;;58406:14;58398:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58361:72;58448:28;58479:10;:8;:10::i;:::-;58448:41;;58538:1;58513:14;58507:28;:32;:115;;;;;;;;;;;;;;;;;58566:14;58582:18;:7;:16;:18::i;:::-;58602:13;58549:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58507:115;58500:122;;;58156:470;;;;:::o;56821:112::-;53302:12;:10;:12::i;:::-;53291:23;;:7;:5;:7::i;:::-;:23;;;53283:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56919:7:::1;56906:9;:21;;;;:::i;:::-;56889:14;:38;;;;56821:112:::0;:::o;56585:124::-;53302:12;:10;:12::i;:::-;53291:23;;:7;:5;:7::i;:::-;:23;;;53283:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56686:17:::1;56670:13;:33;;;;;;;;;;;;:::i;:::-;;56585:124:::0;:::o;58630:105::-;58688:7;58711:20;58725:5;58711:13;:20::i;:::-;58704:27;;58630:105;;;:::o;56215:116::-;53302:12;:10;:12::i;:::-;53291:23;;:7;:5;:7::i;:::-;:23;;;53283:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56309:16:::1;56294:12;:31;;;;56215:116:::0;:::o;41313:164::-;41410:4;41434:18;:25;41453:5;41434:25;;;;;;;;;;;;;;;:35;41460:8;41434:35;;;;;;;;;;;;;;;;;;;;;;;;;41427:42;;41313:164;;;;:::o;55776:102::-;53302:12;:10;:12::i;:::-;53291:23;;:7;:5;:7::i;:::-;:23;;;53283:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55856:14:::1;;;;;;;;;;;55855:15;55838:14;;:32;;;;;;;;;;;;;;;;;;55776:102::o:0;56457:122::-;53302:12;:10;:12::i;:::-;53291:23;;:7;:5;:7::i;:::-;:23;;;53283:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56558:15:::1;56541:14;:32;;;;;;;;;;;;:::i;:::-;;56457:122:::0;:::o;53980:201::-;53302:12;:10;:12::i;:::-;53291:23;;:7;:5;:7::i;:::-;:23;;;53283:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54089:1:::1;54069:22;;:8;:22;;;;54061:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;54145:28;54164:8;54145:18;:28::i;:::-;53980:201:::0;:::o;54729:43::-;;;:::o;1233:326::-;1293:4;1550:1;1528:7;:19;;;:23;1521:30;;1233:326;;;:::o;11339:157::-;11424:4;11463:25;11448:40;;;:11;:40;;;;11441:47;;11339:157;;;:::o;42665:174::-;42722:4;42765:7;42746:15;:13;:15::i;:::-;:26;;:53;;;;;42786:13;;42776:7;:23;42746:53;:85;;;;;42804:11;:20;42816:7;42804:20;;;;;;;;;;;:27;;;;;;;;;;;;42803:28;42746:85;42739:92;;42665:174;;;:::o;32782:98::-;32835:7;32862:10;32855:17;;32782:98;:::o;50647:196::-;50789:2;50762:15;:24;50778:7;50762:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;50827:7;50823:2;50807:28;;50816:5;50807:28;;;;;;;;;;;;50647:196;;;:::o;57893:89::-;57950:7;57977:1;57970:8;;57893:89;:::o;45831:2021::-;45946:35;45984:21;45997:7;45984:12;:21::i;:::-;45946:59;;46044:4;46022:26;;:13;:18;;;:26;;;46018:67;;46057:28;;;;;;;;;;;;;;46018:67;46098:22;46140:4;46124:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;46161:36;46178:4;46184:12;:10;:12::i;:::-;46161:16;:36::i;:::-;46124:73;:126;;;;46238:12;:10;:12::i;:::-;46214:36;;:20;46226:7;46214:11;:20::i;:::-;:36;;;46124:126;46098:153;;46269:17;46264:66;;46295:35;;;;;;;;;;;;;;46264:66;46359:1;46345:16;;:2;:16;;;46341:52;;;46370:23;;;;;;;;;;;;;;46341:52;46458:35;46475:1;46479:7;46488:4;46458:8;:35::i;:::-;46819:1;46789:12;:18;46802:4;46789:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46863:1;46835:12;:16;46848:2;46835:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46881:31;46915:11;:20;46927:7;46915:20;;;;;;;;;;;46881:54;;46966:2;46950:8;:13;;;:18;;;;;;;;;;;;;;;;;;47016:15;46983:8;:23;;;:49;;;;;;;;;;;;;;;;;;47284:19;47316:1;47306:7;:11;47284:33;;47332:31;47366:11;:24;47378:11;47366:24;;;;;;;;;;;47332:58;;47434:1;47409:27;;:8;:13;;;;;;;;;;;;:27;;;47405:384;;;47619:13;;47604:11;:28;47600:174;;47673:4;47657:8;:13;;;:20;;;;;;;;;;;;;;;;;;47726:13;:28;;;47700:8;:23;;;:54;;;;;;;;;;;;;;;;;;47600:174;47405:384;46764:1036;;;47836:7;47832:2;47817:27;;47826:4;47817:27;;;;;;;;;;;;45935:1917;;45831:2021;;;:::o;37811:1109::-;37873:21;;:::i;:::-;37907:12;37922:7;37907:22;;37990:4;37971:15;:13;:15::i;:::-;:23;;:47;;;;;38005:13;;37998:4;:20;37971:47;37967:886;;;38039:31;38073:11;:17;38085:4;38073:17;;;;;;;;;;;38039:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38114:9;:16;;;38109:729;;38185:1;38159:28;;:9;:14;;;:28;;;38155:101;;38223:9;38216:16;;;;;;38155:101;38558:261;38565:4;38558:261;;;38598:6;;;;;;;;38643:11;:17;38655:4;38643:17;;;;;;;;;;;38631:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38717:1;38691:28;;:9;:14;;;:28;;;38687:109;;38759:9;38752:16;;;;;;38687:109;38558:261;;;38109:729;38020:833;37967:886;38881:31;;;;;;;;;;;;;;37811:1109;;;;:::o;54341:191::-;54415:16;54434:6;;;;;;;;;;;54415:25;;54460:8;54451:6;;:17;;;;;;;;;;;;;;;;;;54515:8;54484:40;;54505:8;54484:40;;;;;;;;;;;;54404:128;54341:191;:::o;42927:103::-;42995:27;43005:2;43009:8;42995:27;;;;;;;;;;;;:9;:27::i;:::-;42927:103;;:::o;51335:667::-;51498:4;51535:2;51519:36;;;51556:12;:10;:12::i;:::-;51570:4;51576:7;51585:5;51519:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;51515:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51770:1;51753:6;:13;:18;51749:235;;;51799:40;;;;;;;;;;;;;;51749:235;51942:6;51936:13;51927:6;51923:2;51919:15;51912:38;51515:480;51648:45;;;51638:55;;;:6;:55;;;;51631:62;;;51335:667;;;;;;:::o;57986:102::-;58046:13;58075:7;58068:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57986:102;:::o;20544:723::-;20600:13;20830:1;20821:5;:10;20817:53;;;20848:10;;;;;;;;;;;;;;;;;;;;;20817:53;20880:12;20895:5;20880:20;;20911:14;20936:78;20951:1;20943:4;:9;20936:78;;20969:8;;;;;:::i;:::-;;;;21000:2;20992:10;;;;;:::i;:::-;;;20936:78;;;21024:19;21056:6;21046:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21024:39;;21074:154;21090:1;21081:5;:10;21074:154;;21118:1;21108:11;;;;;:::i;:::-;;;21185:2;21177:5;:10;;;;:::i;:::-;21164:2;:24;;;;:::i;:::-;21151:39;;21134:6;21141;21134:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;21214:2;21205:11;;;;;:::i;:::-;;;21074:154;;;21252:6;21238:21;;;;;20544:723;;;;:::o;36718:137::-;36779:7;36814:12;:19;36827:5;36814:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;36806:41;;36799:48;;36718:137;;;:::o;43403:163::-;43526:32;43532:2;43536:8;43546:5;43553:4;43526:5;:32::i;:::-;43403:163;;;:::o;43825:1658::-;43994:20;44017:13;;43994:36;;44059:1;44045:16;;:2;:16;;;44041:48;;;44070:19;;;;;;;;;;;;;;44041:48;44116:1;44104:8;:13;44100:44;;;44126:18;;;;;;;;;;;;;;44100:44;44456:8;44421:12;:16;44434:2;44421:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44520:8;44480:12;:16;44493:2;44480:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44579:2;44546:11;:25;44558:12;44546:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;44646:15;44596:11;:25;44608:12;44596:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;44679:20;44702:12;44679:35;;44729:11;44758:8;44743:12;:23;44729:37;;44787:4;:23;;;;;44795:15;:2;:13;;;:15::i;:::-;44787:23;44783:639;;;44831:313;44887:12;44883:2;44862:38;;44879:1;44862:38;;;;;;;;;;;;44928:69;44967:1;44971:2;44975:14;;;;;;44991:5;44928:30;:69::i;:::-;44923:174;;45033:40;;;;;;;;;;;;;;44923:174;45139:3;45124:12;:18;44831:313;;45225:12;45208:13;;:29;45204:43;;45239:8;;;45204:43;44783:639;;;45288:119;45344:14;;;;;;45340:2;45319:40;;45336:1;45319:40;;;;;;;;;;;;45402:3;45387:12;:18;45288:119;;44783:639;45452:12;45436:13;:28;;;;44396:1080;;43983:1500;43825:1658;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:122;;1876:79;;:::i;:::-;1835:122;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;1748:370;;;;:::o;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2124:133;;;;:::o;2263:137::-;2308:5;2346:6;2333:20;2324:29;;2362:32;2388:5;2362:32;:::i;:::-;2263:137;;;;:::o;2406:141::-;2462:5;2493:6;2487:13;2478:22;;2509:32;2535:5;2509:32;:::i;:::-;2406:141;;;;:::o;2566:338::-;2621:5;2670:3;2663:4;2655:6;2651:17;2647:27;2637:122;;2678:79;;:::i;:::-;2637:122;2795:6;2782:20;2820:78;2894:3;2886:6;2879:4;2871:6;2867:17;2820:78;:::i;:::-;2811:87;;2627:277;2566:338;;;;:::o;2924:553::-;2982:8;2992:6;3042:3;3035:4;3027:6;3023:17;3019:27;3009:122;;3050:79;;:::i;:::-;3009:122;3163:6;3150:20;3140:30;;3193:18;3185:6;3182:30;3179:117;;;3215:79;;:::i;:::-;3179:117;3329:4;3321:6;3317:17;3305:29;;3383:3;3375:4;3367:6;3363:17;3353:8;3349:32;3346:41;3343:128;;;3390:79;;:::i;:::-;3343:128;2924:553;;;;;:::o;3497:340::-;3553:5;3602:3;3595:4;3587:6;3583:17;3579:27;3569:122;;3610:79;;:::i;:::-;3569:122;3727:6;3714:20;3752:79;3827:3;3819:6;3812:4;3804:6;3800:17;3752:79;:::i;:::-;3743:88;;3559:278;3497:340;;;;:::o;3843:139::-;3889:5;3927:6;3914:20;3905:29;;3943:33;3970:5;3943:33;:::i;:::-;3843:139;;;;:::o;3988:329::-;4047:6;4096:2;4084:9;4075:7;4071:23;4067:32;4064:119;;;4102:79;;:::i;:::-;4064:119;4222:1;4247:53;4292:7;4283:6;4272:9;4268:22;4247:53;:::i;:::-;4237:63;;4193:117;3988:329;;;;:::o;4323:474::-;4391:6;4399;4448:2;4436:9;4427:7;4423:23;4419:32;4416:119;;;4454:79;;:::i;:::-;4416:119;4574:1;4599:53;4644:7;4635:6;4624:9;4620:22;4599:53;:::i;:::-;4589:63;;4545:117;4701:2;4727:53;4772:7;4763:6;4752:9;4748:22;4727:53;:::i;:::-;4717:63;;4672:118;4323:474;;;;;:::o;4803:619::-;4880:6;4888;4896;4945:2;4933:9;4924:7;4920:23;4916:32;4913:119;;;4951:79;;:::i;:::-;4913:119;5071:1;5096:53;5141:7;5132:6;5121:9;5117:22;5096:53;:::i;:::-;5086:63;;5042:117;5198:2;5224:53;5269:7;5260:6;5249:9;5245:22;5224:53;:::i;:::-;5214:63;;5169:118;5326:2;5352:53;5397:7;5388:6;5377:9;5373:22;5352:53;:::i;:::-;5342:63;;5297:118;4803:619;;;;;:::o;5428:943::-;5523:6;5531;5539;5547;5596:3;5584:9;5575:7;5571:23;5567:33;5564:120;;;5603:79;;:::i;:::-;5564:120;5723:1;5748:53;5793:7;5784:6;5773:9;5769:22;5748:53;:::i;:::-;5738:63;;5694:117;5850:2;5876:53;5921:7;5912:6;5901:9;5897:22;5876:53;:::i;:::-;5866:63;;5821:118;5978:2;6004:53;6049:7;6040:6;6029:9;6025:22;6004:53;:::i;:::-;5994:63;;5949:118;6134:2;6123:9;6119:18;6106:32;6165:18;6157:6;6154:30;6151:117;;;6187:79;;:::i;:::-;6151:117;6292:62;6346:7;6337:6;6326:9;6322:22;6292:62;:::i;:::-;6282:72;;6077:287;5428:943;;;;;;;:::o;6377:468::-;6442:6;6450;6499:2;6487:9;6478:7;6474:23;6470:32;6467:119;;;6505:79;;:::i;:::-;6467:119;6625:1;6650:53;6695:7;6686:6;6675:9;6671:22;6650:53;:::i;:::-;6640:63;;6596:117;6752:2;6778:50;6820:7;6811:6;6800:9;6796:22;6778:50;:::i;:::-;6768:60;;6723:115;6377:468;;;;;:::o;6851:474::-;6919:6;6927;6976:2;6964:9;6955:7;6951:23;6947:32;6944:119;;;6982:79;;:::i;:::-;6944:119;7102:1;7127:53;7172:7;7163:6;7152:9;7148:22;7127:53;:::i;:::-;7117:63;;7073:117;7229:2;7255:53;7300:7;7291:6;7280:9;7276:22;7255:53;:::i;:::-;7245:63;;7200:118;6851:474;;;;;:::o;7331:539::-;7415:6;7464:2;7452:9;7443:7;7439:23;7435:32;7432:119;;;7470:79;;:::i;:::-;7432:119;7618:1;7607:9;7603:17;7590:31;7648:18;7640:6;7637:30;7634:117;;;7670:79;;:::i;:::-;7634:117;7775:78;7845:7;7836:6;7825:9;7821:22;7775:78;:::i;:::-;7765:88;;7561:302;7331:539;;;;:::o;7876:323::-;7932:6;7981:2;7969:9;7960:7;7956:23;7952:32;7949:119;;;7987:79;;:::i;:::-;7949:119;8107:1;8132:50;8174:7;8165:6;8154:9;8150:22;8132:50;:::i;:::-;8122:60;;8078:114;7876:323;;;;:::o;8205:327::-;8263:6;8312:2;8300:9;8291:7;8287:23;8283:32;8280:119;;;8318:79;;:::i;:::-;8280:119;8438:1;8463:52;8507:7;8498:6;8487:9;8483:22;8463:52;:::i;:::-;8453:62;;8409:116;8205:327;;;;:::o;8538:349::-;8607:6;8656:2;8644:9;8635:7;8631:23;8627:32;8624:119;;;8662:79;;:::i;:::-;8624:119;8782:1;8807:63;8862:7;8853:6;8842:9;8838:22;8807:63;:::i;:::-;8797:73;;8753:127;8538:349;;;;:::o;8893:529::-;8964:6;8972;9021:2;9009:9;9000:7;8996:23;8992:32;8989:119;;;9027:79;;:::i;:::-;8989:119;9175:1;9164:9;9160:17;9147:31;9205:18;9197:6;9194:30;9191:117;;;9227:79;;:::i;:::-;9191:117;9340:65;9397:7;9388:6;9377:9;9373:22;9340:65;:::i;:::-;9322:83;;;;9118:297;8893:529;;;;;:::o;9428:509::-;9497:6;9546:2;9534:9;9525:7;9521:23;9517:32;9514:119;;;9552:79;;:::i;:::-;9514:119;9700:1;9689:9;9685:17;9672:31;9730:18;9722:6;9719:30;9716:117;;;9752:79;;:::i;:::-;9716:117;9857:63;9912:7;9903:6;9892:9;9888:22;9857:63;:::i;:::-;9847:73;;9643:287;9428:509;;;;:::o;9943:329::-;10002:6;10051:2;10039:9;10030:7;10026:23;10022:32;10019:119;;;10057:79;;:::i;:::-;10019:119;10177:1;10202:53;10247:7;10238:6;10227:9;10223:22;10202:53;:::i;:::-;10192:63;;10148:117;9943:329;;;;:::o;10278:108::-;10355:24;10373:5;10355:24;:::i;:::-;10350:3;10343:37;10278:108;;:::o;10392:118::-;10479:24;10497:5;10479:24;:::i;:::-;10474:3;10467:37;10392:118;;:::o;10516:99::-;10587:21;10602:5;10587:21;:::i;:::-;10582:3;10575:34;10516:99;;:::o;10621:109::-;10702:21;10717:5;10702:21;:::i;:::-;10697:3;10690:34;10621:109;;:::o;10736:360::-;10822:3;10850:38;10882:5;10850:38;:::i;:::-;10904:70;10967:6;10962:3;10904:70;:::i;:::-;10897:77;;10983:52;11028:6;11023:3;11016:4;11009:5;11005:16;10983:52;:::i;:::-;11060:29;11082:6;11060:29;:::i;:::-;11055:3;11051:39;11044:46;;10826:270;10736:360;;;;:::o;11102:364::-;11190:3;11218:39;11251:5;11218:39;:::i;:::-;11273:71;11337:6;11332:3;11273:71;:::i;:::-;11266:78;;11353:52;11398:6;11393:3;11386:4;11379:5;11375:16;11353:52;:::i;:::-;11430:29;11452:6;11430:29;:::i;:::-;11425:3;11421:39;11414:46;;11194:272;11102:364;;;;:::o;11472:377::-;11578:3;11606:39;11639:5;11606:39;:::i;:::-;11661:89;11743:6;11738:3;11661:89;:::i;:::-;11654:96;;11759:52;11804:6;11799:3;11792:4;11785:5;11781:16;11759:52;:::i;:::-;11836:6;11831:3;11827:16;11820:23;;11582:267;11472:377;;;;:::o;11879:845::-;11982:3;12019:5;12013:12;12048:36;12074:9;12048:36;:::i;:::-;12100:89;12182:6;12177:3;12100:89;:::i;:::-;12093:96;;12220:1;12209:9;12205:17;12236:1;12231:137;;;;12382:1;12377:341;;;;12198:520;;12231:137;12315:4;12311:9;12300;12296:25;12291:3;12284:38;12351:6;12346:3;12342:16;12335:23;;12231:137;;12377:341;12444:38;12476:5;12444:38;:::i;:::-;12504:1;12518:154;12532:6;12529:1;12526:13;12518:154;;;12606:7;12600:14;12596:1;12591:3;12587:11;12580:35;12656:1;12647:7;12643:15;12632:26;;12554:4;12551:1;12547:12;12542:17;;12518:154;;;12701:6;12696:3;12692:16;12685:23;;12384:334;;12198:520;;11986:738;;11879:845;;;;:::o;12730:366::-;12872:3;12893:67;12957:2;12952:3;12893:67;:::i;:::-;12886:74;;12969:93;13058:3;12969:93;:::i;:::-;13087:2;13082:3;13078:12;13071:19;;12730:366;;;:::o;13102:::-;13244:3;13265:67;13329:2;13324:3;13265:67;:::i;:::-;13258:74;;13341:93;13430:3;13341:93;:::i;:::-;13459:2;13454:3;13450:12;13443:19;;13102:366;;;:::o;13474:::-;13616:3;13637:67;13701:2;13696:3;13637:67;:::i;:::-;13630:74;;13713:93;13802:3;13713:93;:::i;:::-;13831:2;13826:3;13822:12;13815:19;;13474:366;;;:::o;13846:::-;13988:3;14009:67;14073:2;14068:3;14009:67;:::i;:::-;14002:74;;14085:93;14174:3;14085:93;:::i;:::-;14203:2;14198:3;14194:12;14187:19;;13846:366;;;:::o;14218:::-;14360:3;14381:67;14445:2;14440:3;14381:67;:::i;:::-;14374:74;;14457:93;14546:3;14457:93;:::i;:::-;14575:2;14570:3;14566:12;14559:19;;14218:366;;;:::o;14590:::-;14732:3;14753:67;14817:2;14812:3;14753:67;:::i;:::-;14746:74;;14829:93;14918:3;14829:93;:::i;:::-;14947:2;14942:3;14938:12;14931:19;;14590:366;;;:::o;14962:::-;15104:3;15125:67;15189:2;15184:3;15125:67;:::i;:::-;15118:74;;15201:93;15290:3;15201:93;:::i;:::-;15319:2;15314:3;15310:12;15303:19;;14962:366;;;:::o;15334:::-;15476:3;15497:67;15561:2;15556:3;15497:67;:::i;:::-;15490:74;;15573:93;15662:3;15573:93;:::i;:::-;15691:2;15686:3;15682:12;15675:19;;15334:366;;;:::o;15706:::-;15848:3;15869:67;15933:2;15928:3;15869:67;:::i;:::-;15862:74;;15945:93;16034:3;15945:93;:::i;:::-;16063:2;16058:3;16054:12;16047:19;;15706:366;;;:::o;16078:::-;16220:3;16241:67;16305:2;16300:3;16241:67;:::i;:::-;16234:74;;16317:93;16406:3;16317:93;:::i;:::-;16435:2;16430:3;16426:12;16419:19;;16078:366;;;:::o;16450:::-;16592:3;16613:67;16677:2;16672:3;16613:67;:::i;:::-;16606:74;;16689:93;16778:3;16689:93;:::i;:::-;16807:2;16802:3;16798:12;16791:19;;16450:366;;;:::o;16822:::-;16964:3;16985:67;17049:2;17044:3;16985:67;:::i;:::-;16978:74;;17061:93;17150:3;17061:93;:::i;:::-;17179:2;17174:3;17170:12;17163:19;;16822:366;;;:::o;17194:::-;17336:3;17357:67;17421:2;17416:3;17357:67;:::i;:::-;17350:74;;17433:93;17522:3;17433:93;:::i;:::-;17551:2;17546:3;17542:12;17535:19;;17194:366;;;:::o;17566:::-;17708:3;17729:67;17793:2;17788:3;17729:67;:::i;:::-;17722:74;;17805:93;17894:3;17805:93;:::i;:::-;17923:2;17918:3;17914:12;17907:19;;17566:366;;;:::o;17938:::-;18080:3;18101:67;18165:2;18160:3;18101:67;:::i;:::-;18094:74;;18177:93;18266:3;18177:93;:::i;:::-;18295:2;18290:3;18286:12;18279:19;;17938:366;;;:::o;18310:::-;18452:3;18473:67;18537:2;18532:3;18473:67;:::i;:::-;18466:74;;18549:93;18638:3;18549:93;:::i;:::-;18667:2;18662:3;18658:12;18651:19;;18310:366;;;:::o;18682:::-;18824:3;18845:67;18909:2;18904:3;18845:67;:::i;:::-;18838:74;;18921:93;19010:3;18921:93;:::i;:::-;19039:2;19034:3;19030:12;19023:19;;18682:366;;;:::o;19054:::-;19196:3;19217:67;19281:2;19276:3;19217:67;:::i;:::-;19210:74;;19293:93;19382:3;19293:93;:::i;:::-;19411:2;19406:3;19402:12;19395:19;;19054:366;;;:::o;19426:398::-;19585:3;19606:83;19687:1;19682:3;19606:83;:::i;:::-;19599:90;;19698:93;19787:3;19698:93;:::i;:::-;19816:1;19811:3;19807:11;19800:18;;19426:398;;;:::o;19830:366::-;19972:3;19993:67;20057:2;20052:3;19993:67;:::i;:::-;19986:74;;20069:93;20158:3;20069:93;:::i;:::-;20187:2;20182:3;20178:12;20171:19;;19830:366;;;:::o;20202:::-;20344:3;20365:67;20429:2;20424:3;20365:67;:::i;:::-;20358:74;;20441:93;20530:3;20441:93;:::i;:::-;20559:2;20554:3;20550:12;20543:19;;20202:366;;;:::o;20574:::-;20716:3;20737:67;20801:2;20796:3;20737:67;:::i;:::-;20730:74;;20813:93;20902:3;20813:93;:::i;:::-;20931:2;20926:3;20922:12;20915:19;;20574:366;;;:::o;20946:::-;21088:3;21109:67;21173:2;21168:3;21109:67;:::i;:::-;21102:74;;21185:93;21274:3;21185:93;:::i;:::-;21303:2;21298:3;21294:12;21287:19;;20946:366;;;:::o;21390:697::-;21549:4;21544:3;21540:14;21636:4;21629:5;21625:16;21619:23;21655:63;21712:4;21707:3;21703:14;21689:12;21655:63;:::i;:::-;21564:164;21820:4;21813:5;21809:16;21803:23;21839:61;21894:4;21889:3;21885:14;21871:12;21839:61;:::i;:::-;21738:172;21994:4;21987:5;21983:16;21977:23;22013:57;22064:4;22059:3;22055:14;22041:12;22013:57;:::i;:::-;21920:160;21518:569;21390:697;;:::o;22093:118::-;22180:24;22198:5;22180:24;:::i;:::-;22175:3;22168:37;22093:118;;:::o;22217:105::-;22292:23;22309:5;22292:23;:::i;:::-;22287:3;22280:36;22217:105;;:::o;22328:589::-;22553:3;22575:95;22666:3;22657:6;22575:95;:::i;:::-;22568:102;;22687:95;22778:3;22769:6;22687:95;:::i;:::-;22680:102;;22799:92;22887:3;22878:6;22799:92;:::i;:::-;22792:99;;22908:3;22901:10;;22328:589;;;;;;:::o;22923:379::-;23107:3;23129:147;23272:3;23129:147;:::i;:::-;23122:154;;23293:3;23286:10;;22923:379;;;:::o;23308:222::-;23401:4;23439:2;23428:9;23424:18;23416:26;;23452:71;23520:1;23509:9;23505:17;23496:6;23452:71;:::i;:::-;23308:222;;;;:::o;23536:640::-;23731:4;23769:3;23758:9;23754:19;23746:27;;23783:71;23851:1;23840:9;23836:17;23827:6;23783:71;:::i;:::-;23864:72;23932:2;23921:9;23917:18;23908:6;23864:72;:::i;:::-;23946;24014:2;24003:9;23999:18;23990:6;23946:72;:::i;:::-;24065:9;24059:4;24055:20;24050:2;24039:9;24035:18;24028:48;24093:76;24164:4;24155:6;24093:76;:::i;:::-;24085:84;;23536:640;;;;;;;:::o;24182:210::-;24269:4;24307:2;24296:9;24292:18;24284:26;;24320:65;24382:1;24371:9;24367:17;24358:6;24320:65;:::i;:::-;24182:210;;;;:::o;24398:313::-;24511:4;24549:2;24538:9;24534:18;24526:26;;24598:9;24592:4;24588:20;24584:1;24573:9;24569:17;24562:47;24626:78;24699:4;24690:6;24626:78;:::i;:::-;24618:86;;24398:313;;;;:::o;24717:419::-;24883:4;24921:2;24910:9;24906:18;24898:26;;24970:9;24964:4;24960:20;24956:1;24945:9;24941:17;24934:47;24998:131;25124:4;24998:131;:::i;:::-;24990:139;;24717:419;;;:::o;25142:::-;25308:4;25346:2;25335:9;25331:18;25323:26;;25395:9;25389:4;25385:20;25381:1;25370:9;25366:17;25359:47;25423:131;25549:4;25423:131;:::i;:::-;25415:139;;25142:419;;;:::o;25567:::-;25733:4;25771:2;25760:9;25756:18;25748:26;;25820:9;25814:4;25810:20;25806:1;25795:9;25791:17;25784:47;25848:131;25974:4;25848:131;:::i;:::-;25840:139;;25567:419;;;:::o;25992:::-;26158:4;26196:2;26185:9;26181:18;26173:26;;26245:9;26239:4;26235:20;26231:1;26220:9;26216:17;26209:47;26273:131;26399:4;26273:131;:::i;:::-;26265:139;;25992:419;;;:::o;26417:::-;26583:4;26621:2;26610:9;26606:18;26598:26;;26670:9;26664:4;26660:20;26656:1;26645:9;26641:17;26634:47;26698:131;26824:4;26698:131;:::i;:::-;26690:139;;26417:419;;;:::o;26842:::-;27008:4;27046:2;27035:9;27031:18;27023:26;;27095:9;27089:4;27085:20;27081:1;27070:9;27066:17;27059:47;27123:131;27249:4;27123:131;:::i;:::-;27115:139;;26842:419;;;:::o;27267:::-;27433:4;27471:2;27460:9;27456:18;27448:26;;27520:9;27514:4;27510:20;27506:1;27495:9;27491:17;27484:47;27548:131;27674:4;27548:131;:::i;:::-;27540:139;;27267:419;;;:::o;27692:::-;27858:4;27896:2;27885:9;27881:18;27873:26;;27945:9;27939:4;27935:20;27931:1;27920:9;27916:17;27909:47;27973:131;28099:4;27973:131;:::i;:::-;27965:139;;27692:419;;;:::o;28117:::-;28283:4;28321:2;28310:9;28306:18;28298:26;;28370:9;28364:4;28360:20;28356:1;28345:9;28341:17;28334:47;28398:131;28524:4;28398:131;:::i;:::-;28390:139;;28117:419;;;:::o;28542:::-;28708:4;28746:2;28735:9;28731:18;28723:26;;28795:9;28789:4;28785:20;28781:1;28770:9;28766:17;28759:47;28823:131;28949:4;28823:131;:::i;:::-;28815:139;;28542:419;;;:::o;28967:::-;29133:4;29171:2;29160:9;29156:18;29148:26;;29220:9;29214:4;29210:20;29206:1;29195:9;29191:17;29184:47;29248:131;29374:4;29248:131;:::i;:::-;29240:139;;28967:419;;;:::o;29392:::-;29558:4;29596:2;29585:9;29581:18;29573:26;;29645:9;29639:4;29635:20;29631:1;29620:9;29616:17;29609:47;29673:131;29799:4;29673:131;:::i;:::-;29665:139;;29392:419;;;:::o;29817:::-;29983:4;30021:2;30010:9;30006:18;29998:26;;30070:9;30064:4;30060:20;30056:1;30045:9;30041:17;30034:47;30098:131;30224:4;30098:131;:::i;:::-;30090:139;;29817:419;;;:::o;30242:::-;30408:4;30446:2;30435:9;30431:18;30423:26;;30495:9;30489:4;30485:20;30481:1;30470:9;30466:17;30459:47;30523:131;30649:4;30523:131;:::i;:::-;30515:139;;30242:419;;;:::o;30667:::-;30833:4;30871:2;30860:9;30856:18;30848:26;;30920:9;30914:4;30910:20;30906:1;30895:9;30891:17;30884:47;30948:131;31074:4;30948:131;:::i;:::-;30940:139;;30667:419;;;:::o;31092:::-;31258:4;31296:2;31285:9;31281:18;31273:26;;31345:9;31339:4;31335:20;31331:1;31320:9;31316:17;31309:47;31373:131;31499:4;31373:131;:::i;:::-;31365:139;;31092:419;;;:::o;31517:::-;31683:4;31721:2;31710:9;31706:18;31698:26;;31770:9;31764:4;31760:20;31756:1;31745:9;31741:17;31734:47;31798:131;31924:4;31798:131;:::i;:::-;31790:139;;31517:419;;;:::o;31942:::-;32108:4;32146:2;32135:9;32131:18;32123:26;;32195:9;32189:4;32185:20;32181:1;32170:9;32166:17;32159:47;32223:131;32349:4;32223:131;:::i;:::-;32215:139;;31942:419;;;:::o;32367:::-;32533:4;32571:2;32560:9;32556:18;32548:26;;32620:9;32614:4;32610:20;32606:1;32595:9;32591:17;32584:47;32648:131;32774:4;32648:131;:::i;:::-;32640:139;;32367:419;;;:::o;32792:::-;32958:4;32996:2;32985:9;32981:18;32973:26;;33045:9;33039:4;33035:20;33031:1;33020:9;33016:17;33009:47;33073:131;33199:4;33073:131;:::i;:::-;33065:139;;32792:419;;;:::o;33217:::-;33383:4;33421:2;33410:9;33406:18;33398:26;;33470:9;33464:4;33460:20;33456:1;33445:9;33441:17;33434:47;33498:131;33624:4;33498:131;:::i;:::-;33490:139;;33217:419;;;:::o;33642:::-;33808:4;33846:2;33835:9;33831:18;33823:26;;33895:9;33889:4;33885:20;33881:1;33870:9;33866:17;33859:47;33923:131;34049:4;33923:131;:::i;:::-;33915:139;;33642:419;;;:::o;34067:346::-;34222:4;34260:2;34249:9;34245:18;34237:26;;34273:133;34403:1;34392:9;34388:17;34379:6;34273:133;:::i;:::-;34067:346;;;;:::o;34419:222::-;34512:4;34550:2;34539:9;34535:18;34527:26;;34563:71;34631:1;34620:9;34616:17;34607:6;34563:71;:::i;:::-;34419:222;;;;:::o;34647:129::-;34681:6;34708:20;;:::i;:::-;34698:30;;34737:33;34765:4;34757:6;34737:33;:::i;:::-;34647:129;;;:::o;34782:75::-;34815:6;34848:2;34842:9;34832:19;;34782:75;:::o;34863:311::-;34940:4;35030:18;35022:6;35019:30;35016:56;;;35052:18;;:::i;:::-;35016:56;35102:4;35094:6;35090:17;35082:25;;35162:4;35156;35152:15;35144:23;;34863:311;;;:::o;35180:307::-;35241:4;35331:18;35323:6;35320:30;35317:56;;;35353:18;;:::i;:::-;35317:56;35391:29;35413:6;35391:29;:::i;:::-;35383:37;;35475:4;35469;35465:15;35457:23;;35180:307;;;:::o;35493:308::-;35555:4;35645:18;35637:6;35634:30;35631:56;;;35667:18;;:::i;:::-;35631:56;35705:29;35727:6;35705:29;:::i;:::-;35697:37;;35789:4;35783;35779:15;35771:23;;35493:308;;;:::o;35807:141::-;35856:4;35879:3;35871:11;;35902:3;35899:1;35892:14;35936:4;35933:1;35923:18;35915:26;;35807:141;;;:::o;35954:98::-;36005:6;36039:5;36033:12;36023:22;;35954:98;;;:::o;36058:99::-;36110:6;36144:5;36138:12;36128:22;;36058:99;;;:::o;36163:168::-;36246:11;36280:6;36275:3;36268:19;36320:4;36315:3;36311:14;36296:29;;36163:168;;;;:::o;36337:147::-;36438:11;36475:3;36460:18;;36337:147;;;;:::o;36490:169::-;36574:11;36608:6;36603:3;36596:19;36648:4;36643:3;36639:14;36624:29;;36490:169;;;;:::o;36665:148::-;36767:11;36804:3;36789:18;;36665:148;;;;:::o;36819:305::-;36859:3;36878:20;36896:1;36878:20;:::i;:::-;36873:25;;36912:20;36930:1;36912:20;:::i;:::-;36907:25;;37066:1;36998:66;36994:74;36991:1;36988:81;36985:107;;;37072:18;;:::i;:::-;36985:107;37116:1;37113;37109:9;37102:16;;36819:305;;;;:::o;37130:185::-;37170:1;37187:20;37205:1;37187:20;:::i;:::-;37182:25;;37221:20;37239:1;37221:20;:::i;:::-;37216:25;;37260:1;37250:35;;37265:18;;:::i;:::-;37250:35;37307:1;37304;37300:9;37295:14;;37130:185;;;;:::o;37321:348::-;37361:7;37384:20;37402:1;37384:20;:::i;:::-;37379:25;;37418:20;37436:1;37418:20;:::i;:::-;37413:25;;37606:1;37538:66;37534:74;37531:1;37528:81;37523:1;37516:9;37509:17;37505:105;37502:131;;;37613:18;;:::i;:::-;37502:131;37661:1;37658;37654:9;37643:20;;37321:348;;;;:::o;37675:191::-;37715:4;37735:20;37753:1;37735:20;:::i;:::-;37730:25;;37769:20;37787:1;37769:20;:::i;:::-;37764:25;;37808:1;37805;37802:8;37799:34;;;37813:18;;:::i;:::-;37799:34;37858:1;37855;37851:9;37843:17;;37675:191;;;;:::o;37872:96::-;37909:7;37938:24;37956:5;37938:24;:::i;:::-;37927:35;;37872:96;;;:::o;37974:90::-;38008:7;38051:5;38044:13;38037:21;38026:32;;37974:90;;;:::o;38070:149::-;38106:7;38146:66;38139:5;38135:78;38124:89;;38070:149;;;:::o;38225:126::-;38262:7;38302:42;38295:5;38291:54;38280:65;;38225:126;;;:::o;38357:77::-;38394:7;38423:5;38412:16;;38357:77;;;:::o;38440:101::-;38476:7;38516:18;38509:5;38505:30;38494:41;;38440:101;;;:::o;38547:154::-;38631:6;38626:3;38621;38608:30;38693:1;38684:6;38679:3;38675:16;38668:27;38547:154;;;:::o;38707:307::-;38775:1;38785:113;38799:6;38796:1;38793:13;38785:113;;;38884:1;38879:3;38875:11;38869:18;38865:1;38860:3;38856:11;38849:39;38821:2;38818:1;38814:10;38809:15;;38785:113;;;38916:6;38913:1;38910:13;38907:101;;;38996:1;38987:6;38982:3;38978:16;38971:27;38907:101;38756:258;38707:307;;;:::o;39020:320::-;39064:6;39101:1;39095:4;39091:12;39081:22;;39148:1;39142:4;39138:12;39169:18;39159:81;;39225:4;39217:6;39213:17;39203:27;;39159:81;39287:2;39279:6;39276:14;39256:18;39253:38;39250:84;;;39306:18;;:::i;:::-;39250:84;39071:269;39020:320;;;:::o;39346:281::-;39429:27;39451:4;39429:27;:::i;:::-;39421:6;39417:40;39559:6;39547:10;39544:22;39523:18;39511:10;39508:34;39505:62;39502:88;;;39570:18;;:::i;:::-;39502:88;39610:10;39606:2;39599:22;39389:238;39346:281;;:::o;39633:233::-;39672:3;39695:24;39713:5;39695:24;:::i;:::-;39686:33;;39741:66;39734:5;39731:77;39728:103;;;39811:18;;:::i;:::-;39728:103;39858:1;39851:5;39847:13;39840:20;;39633:233;;;:::o;39872:176::-;39904:1;39921:20;39939:1;39921:20;:::i;:::-;39916:25;;39955:20;39973:1;39955:20;:::i;:::-;39950:25;;39994:1;39984:35;;39999:18;;:::i;:::-;39984:35;40040:1;40037;40033:9;40028:14;;39872:176;;;;:::o;40054:180::-;40102:77;40099:1;40092:88;40199:4;40196:1;40189:15;40223:4;40220:1;40213:15;40240:180;40288:77;40285:1;40278:88;40385:4;40382:1;40375:15;40409:4;40406:1;40399:15;40426:180;40474:77;40471:1;40464:88;40571:4;40568:1;40561:15;40595:4;40592:1;40585:15;40612:180;40660:77;40657:1;40650:88;40757:4;40754:1;40747:15;40781:4;40778:1;40771:15;40798:180;40846:77;40843:1;40836:88;40943:4;40940:1;40933:15;40967:4;40964:1;40957:15;40984:117;41093:1;41090;41083:12;41107:117;41216:1;41213;41206:12;41230:117;41339:1;41336;41329:12;41353:117;41462:1;41459;41452:12;41476:117;41585:1;41582;41575:12;41599:117;41708:1;41705;41698:12;41722:102;41763:6;41814:2;41810:7;41805:2;41798:5;41794:14;41790:28;41780:38;;41722:102;;;:::o;41830:173::-;41970:25;41966:1;41958:6;41954:14;41947:49;41830:173;:::o;42009:180::-;42149:32;42145:1;42137:6;42133:14;42126:56;42009:180;:::o;42195:220::-;42335:34;42331:1;42323:6;42319:14;42312:58;42404:3;42399:2;42391:6;42387:15;42380:28;42195:220;:::o;42421:225::-;42561:34;42557:1;42549:6;42545:14;42538:58;42630:8;42625:2;42617:6;42613:15;42606:33;42421:225;:::o;42652:173::-;42792:25;42788:1;42780:6;42776:14;42769:49;42652:173;:::o;42831:235::-;42971:34;42967:1;42959:6;42955:14;42948:58;43040:18;43035:2;43027:6;43023:15;43016:43;42831:235;:::o;43072:180::-;43212:32;43208:1;43200:6;43196:14;43189:56;43072:180;:::o;43258:181::-;43398:33;43394:1;43386:6;43382:14;43375:57;43258:181;:::o;43445:236::-;43585:34;43581:1;43573:6;43569:14;43562:58;43654:19;43649:2;43641:6;43637:15;43630:44;43445:236;:::o;43687:168::-;43827:20;43823:1;43815:6;43811:14;43804:44;43687:168;:::o;43861:175::-;44001:27;43997:1;43989:6;43985:14;43978:51;43861:175;:::o;44042:173::-;44182:25;44178:1;44170:6;44166:14;44159:49;44042:173;:::o;44221:181::-;44361:33;44357:1;44349:6;44345:14;44338:57;44221:181;:::o;44408:177::-;44548:29;44544:1;44536:6;44532:14;44525:53;44408:177;:::o;44591:169::-;44731:21;44727:1;44719:6;44715:14;44708:45;44591:169;:::o;44766:182::-;44906:34;44902:1;44894:6;44890:14;44883:58;44766:182;:::o;44954:::-;45094:34;45090:1;45082:6;45078:14;45071:58;44954:182;:::o;45142:178::-;45282:30;45278:1;45270:6;45266:14;45259:54;45142:178;:::o;45326:114::-;;:::o;45446:166::-;45586:18;45582:1;45574:6;45570:14;45563:42;45446:166;:::o;45618:170::-;45758:22;45754:1;45746:6;45742:14;45735:46;45618:170;:::o;45794:181::-;45934:33;45930:1;45922:6;45918:14;45911:57;45794:181;:::o;45981:179::-;46121:31;46117:1;46109:6;46105:14;46098:55;45981:179;:::o;46166:122::-;46239:24;46257:5;46239:24;:::i;:::-;46232:5;46229:35;46219:63;;46278:1;46275;46268:12;46219:63;46166:122;:::o;46294:116::-;46364:21;46379:5;46364:21;:::i;:::-;46357:5;46354:32;46344:60;;46400:1;46397;46390:12;46344:60;46294:116;:::o;46416:120::-;46488:23;46505:5;46488:23;:::i;:::-;46481:5;46478:34;46468:62;;46526:1;46523;46516:12;46468:62;46416:120;:::o;46542:122::-;46615:24;46633:5;46615:24;:::i;:::-;46608:5;46605:35;46595:63;;46654:1;46651;46644:12;46595:63;46542:122;:::o

Swarm Source

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