ETH Price: $3,223.59 (-3.93%)

Token

HAPEGIRLS (HG)
 

Overview

Max Total Supply

1,001 HG

Holders

130

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 HG
0x2f4497Efdc3FF5899ed649CC02Be9eB4e0C6237F
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:
HAPEGIRLS

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-29
*/

// 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/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 v4.4.1 (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 `IERC721.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 v4.4.1 (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`, 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 Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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

// 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: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts v4.4.1 (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 substraction 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/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/contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;








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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

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

        address from = prevOwnership.addr;

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

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

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

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

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

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

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

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

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

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

// File: @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: contracts/hapegirl.sol


pragma solidity ^0.8.7;
pragma abicoder v2;



 
contract HAPEGIRLS is ERC721A,Ownable {
using SafeMath for uint256;
using Strings for uint256;
 
uint256 public constant tokenPrice = 100000000000000000; 
uint256 public constant MAX_TOKENS = 10000;
string public baseURI = "";
 
bool public saleIsActive = false;
bool public presaleIsActive = false;
bool public isRevealed = false;
 
mapping(address => bool) private _presaleList;
mapping(address => uint256) private _presaleListClaimed;
 
uint256 public presaleMaxMint = 5;
uint256 public devReserve = 64;
 
mapping (address => uint256) index2;
address[] demandList;
function addToDemandList(address who) public {
require(!inArray(who),"Not Listed");
 
index2[who] = demandList.length;
demandList.push(who);
 
}
 
function addToPresaleList(address[] calldata addresses) external onlyOwner { 
for (uint256 i = 0; i < addresses.length; i++) {
require(addresses[i] != address(0), "Can't add the null address");
 
_presaleList[addresses[i]] = true;
}
}
 
function removeFromPresaleList(address[] calldata addresses)
external
onlyOwner
{
for (uint256 i = 0; i < addresses.length; i++) {
require(addresses[i] != address(0), "Can't add the null address");
 
_presaleList[addresses[i]] = false;
}
}
 
function inArray(address who) public view returns (bool) {
if (index2[who] > 0) {
return true;
}
return false;
}
 
function getPosition(uint pos) public view returns (address) {
 
return demandList[pos];
}
 
function getCount() public view returns(uint count) {
return demandList.length;
}
 
 
 
constructor() ERC721A("HAPEGIRLS", "HG") {
setBaseURI("https://media.hapegirls.io/json/");
}
 
function _baseURI() internal view virtual override returns (string memory) {
return baseURI;
}
 
 
function setBaseURI(string memory _newBaseURI) public onlyOwner {
baseURI = _newBaseURI;
}
 
function withdraw() public payable onlyOwner {
(bool os, ) = payable(owner()).call{ value: address(this).balance }("");
require(os);
}
 
function reveal() public onlyOwner {
isRevealed = true;
}
 
function reserveTokens(address _to, uint256 _reserveAmount)
external
onlyOwner
{
require(
_reserveAmount > 0 && _reserveAmount <= devReserve,
"Not enough reserve left for team"
);
for (uint256 i = 0; i < _reserveAmount; i++) {
uint256 id = totalSupply();
_safeMint(_to, id);
}
devReserve = devReserve.sub(_reserveAmount);
}
 
function toggleSaleState() external onlyOwner {
saleIsActive = !saleIsActive;
}
 
function togglePresaleState() external onlyOwner {
presaleIsActive = !presaleIsActive;
}
 
 
 
function mintHG(uint256 numberOfTokens) public payable {
require(saleIsActive, "Sale must be active to mint Token");
require(
numberOfTokens > 0,
"Can only mint one or more tokens at a time"
);
 
require(
msg.value >= tokenPrice.mul(numberOfTokens),
"Ether value sent is not correct"
);
_safeMint(msg.sender, numberOfTokens);
}
 
function balance(address owner) public view returns(uint accountBalance)
{
accountBalance = owner.balance;
}
 
function presaleHG(uint256 numberOfTokens,address addr) external payable {
require(presaleIsActive, "Presale is not active");
require(_presaleList[addr], "You are not on the Presale List");
require(
totalSupply().add(numberOfTokens) <= MAX_TOKENS,
"Purchase would exceed max supply of token"
);
require(
numberOfTokens > 0 && numberOfTokens <= presaleMaxMint,
"Cannot purchase this many tokens"
);
 
require(
_presaleListClaimed[msg.sender].add(numberOfTokens) <= presaleMaxMint,
"Purchase exceeds max allowed"
);
require(
msg.value >= tokenPrice.mul(numberOfTokens),
"Ether value sent is not correct"
);
_presaleListClaimed[msg.sender] += 1;
_safeMint(msg.sender, numberOfTokens);
}
 
 
 
function setPresaleMaxMint(uint256 maxMint) external onlyOwner {
presaleMaxMint = maxMint;
}
 
 
 
function onPreSaleList(address addr) external view returns (bool) {
return _presaleList[addr];
}
 
function tokenURI(uint256 tokenId)
public
view
virtual
override
returns (string memory)
{
require(
_exists(tokenId),
"ERC721Metadata: URI query for nonexistent token"
);
 
string memory currentBaseURI = _baseURI();
 
if (isRevealed == false) {
return
"ipfs://QmU8PcQHX8WkxSd5LtpgaBbeCu4zCsFHpuDHFc22RgYi7t/hidden.json";
}
 
return
bytes(currentBaseURI).length > 0
? string(abi.encodePacked(currentBaseURI, tokenId.toString(), ".json"))
: "";
 
}
 
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"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":"who","type":"address"}],"name":"addToDemandList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addToPresaleList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balance","outputs":[{"internalType":"uint256","name":"accountBalance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCount","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pos","type":"uint256"}],"name":"getPosition","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"inArray","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintHG","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"onPreSaleList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"address","name":"addr","type":"address"}],"name":"presaleHG","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleMaxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"removeFromPresaleList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_reserveAmount","type":"uint256"}],"name":"reserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxMint","type":"uint256"}],"name":"setPresaleMaxMint","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":"togglePresaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

608060405260405180602001604052806000815250600990805190602001906200002b9291906200035f565b506000600a60006101000a81548160ff0219169083151502179055506000600a60016101000a81548160ff0219169083151502179055506000600a60026101000a81548160ff0219169083151502179055506005600d556040600e553480156200009457600080fd5b506040518060400160405280600981526020017f484150454749524c5300000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f48470000000000000000000000000000000000000000000000000000000000008152508160029080519060200190620001199291906200035f565b508060039080519060200190620001329291906200035f565b5062000143620001b760201b60201c565b60008190555050506200016b6200015f620001bc60201b60201c565b620001c460201b60201c565b620001b16040518060400160405280602081526020017f68747470733a2f2f6d656469612e686170656769726c732e696f2f6a736f6e2f8152506200028a60201b60201c565b620004f7565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200029a620001bc60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002c06200033560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000319576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003109062000436565b60405180910390fd5b8060099080519060200190620003319291906200035f565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200036d9062000469565b90600052602060002090601f016020900481019282620003915760008555620003dd565b82601f10620003ac57805160ff1916838001178555620003dd565b82800160010185558215620003dd579182015b82811115620003dc578251825591602001919060010190620003bf565b5b509050620003ec9190620003f0565b5090565b5b808211156200040b576000816000905550600101620003f1565b5090565b60006200041e60208362000458565b91506200042b82620004ce565b602082019050919050565b6000602082019050818103600083015262000451816200040f565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200048257607f821691505b602082108114156200049957620004986200049f565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6147f680620005076000396000f3fe6080604052600436106102515760003560e01c8063946ef42a11610139578063daaeec86116100b6578063eb02c3011161007a578063eb02c30114610873578063eb8d2444146108b0578063f285e69e146108db578063f2fde38b146108f2578063f47c84c51461091b578063fcd2a4271461094657610251565b8063daaeec861461077c578063deac465914610793578063df4305d2146107d0578063e3d670d7146107f9578063e985e9c51461083657610251565b8063b179e060116100fd578063b179e060146106a8578063b357d81a146106d1578063b88d4fde146106fa578063c87b56dd14610723578063d14b16ac1461076057610251565b8063946ef42a146105e757806395d89b4114610612578063a22cb4651461063d578063a475b5dd14610666578063a87d942c1461067d57610251565b806354214f69116101d257806370a082311161019657806370a08231146104eb578063715018a6146105285780637204a3c91461053f57806378cf19e9146105685780637ff9b596146105915780638da5cb5b146105bc57610251565b806354214f691461041357806355f804b31461043e5780636352211e1461046757806365f6ef7e146104a45780636c0360eb146104c057610251565b806318160ddd1161021957806318160ddd1461036157806323b872dd1461038c57806330f72cd4146103b55780633ccfd60b146103e057806342842e0e146103ea57610251565b806301ffc9a71461025657806306fdde0314610293578063081812fc146102be578063095ea7b3146102fb57806311576b7914610324575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190613891565b610971565b60405161028a9190613d4c565b60405180910390f35b34801561029f57600080fd5b506102a8610a53565b6040516102b59190613d67565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e09190613934565b610ae5565b6040516102f29190613ce5565b60405180910390f35b34801561030757600080fd5b50610322600480360381019061031d9190613804565b610b61565b005b34801561033057600080fd5b5061034b60048036038101906103469190613681565b610c6c565b6040516103589190613d4c565b60405180910390f35b34801561036d57600080fd5b50610376610cc2565b6040516103839190613f49565b60405180910390f35b34801561039857600080fd5b506103b360048036038101906103ae91906136ee565b610cd9565b005b3480156103c157600080fd5b506103ca610ce9565b6040516103d79190613d4c565b60405180910390f35b6103e8610cfc565b005b3480156103f657600080fd5b50610411600480360381019061040c91906136ee565b610df8565b005b34801561041f57600080fd5b50610428610e18565b6040516104359190613d4c565b60405180910390f35b34801561044a57600080fd5b50610465600480360381019061046091906138eb565b610e2b565b005b34801561047357600080fd5b5061048e60048036038101906104899190613934565b610ec1565b60405161049b9190613ce5565b60405180910390f35b6104be60048036038101906104b99190613961565b610ed7565b005b3480156104cc57600080fd5b506104d56111b9565b6040516104e29190613d67565b60405180910390f35b3480156104f757600080fd5b50610512600480360381019061050d9190613681565b611247565b60405161051f9190613f49565b60405180910390f35b34801561053457600080fd5b5061053d611317565b005b34801561054b57600080fd5b5061056660048036038101906105619190613844565b61139f565b005b34801561057457600080fd5b5061058f600480360381019061058a9190613804565b611557565b005b34801561059d57600080fd5b506105a6611679565b6040516105b39190613f49565b60405180910390f35b3480156105c857600080fd5b506105d1611685565b6040516105de9190613ce5565b60405180910390f35b3480156105f357600080fd5b506105fc6116af565b6040516106099190613f49565b60405180910390f35b34801561061e57600080fd5b506106276116b5565b6040516106349190613d67565b60405180910390f35b34801561064957600080fd5b50610664600480360381019061065f91906137c4565b611747565b005b34801561067257600080fd5b5061067b6118bf565b005b34801561068957600080fd5b50610692611958565b60405161069f9190613f49565b60405180910390f35b3480156106b457600080fd5b506106cf60048036038101906106ca9190613844565b611965565b005b3480156106dd57600080fd5b506106f860048036038101906106f39190613681565b611b1d565b005b34801561070657600080fd5b50610721600480360381019061071c9190613741565b611c15565b005b34801561072f57600080fd5b5061074a60048036038101906107459190613934565b611c91565b6040516107579190613d67565b60405180910390f35b61077a60048036038101906107759190613934565b611d76565b005b34801561078857600080fd5b50610791611e72565b005b34801561079f57600080fd5b506107ba60048036038101906107b59190613681565b611f1a565b6040516107c79190613d4c565b60405180910390f35b3480156107dc57600080fd5b506107f760048036038101906107f29190613934565b611f76565b005b34801561080557600080fd5b50610820600480360381019061081b9190613681565b611ffc565b60405161082d9190613f49565b60405180910390f35b34801561084257600080fd5b5061085d600480360381019061085891906136ae565b61201d565b60405161086a9190613d4c565b60405180910390f35b34801561087f57600080fd5b5061089a60048036038101906108959190613934565b6120b1565b6040516108a79190613ce5565b60405180910390f35b3480156108bc57600080fd5b506108c56120f9565b6040516108d29190613d4c565b60405180910390f35b3480156108e757600080fd5b506108f061210c565b005b3480156108fe57600080fd5b5061091960048036038101906109149190613681565b6121b4565b005b34801561092757600080fd5b506109306122ac565b60405161093d9190613f49565b60405180910390f35b34801561095257600080fd5b5061095b6122b2565b6040516109689190613f49565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a3c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a4c5750610a4b826122b8565b5b9050919050565b606060028054610a6290614204565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8e90614204565b8015610adb5780601f10610ab057610100808354040283529160200191610adb565b820191906000526020600020905b815481529060010190602001808311610abe57829003601f168201915b5050505050905090565b6000610af082612322565b610b26576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b6c82610ec1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bd4576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bf3612370565b73ffffffffffffffffffffffffffffffffffffffff1614158015610c255750610c2381610c1e612370565b61201d565b155b15610c5c576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c67838383612378565b505050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000610ccc61242a565b6001546000540303905090565b610ce483838361242f565b505050565b600a60019054906101000a900460ff1681565b610d04612370565b73ffffffffffffffffffffffffffffffffffffffff16610d22611685565b73ffffffffffffffffffffffffffffffffffffffff1614610d78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6f90613e49565b60405180910390fd5b6000610d82611685565b73ffffffffffffffffffffffffffffffffffffffff1647604051610da590613cd0565b60006040518083038185875af1925050503d8060008114610de2576040519150601f19603f3d011682016040523d82523d6000602084013e610de7565b606091505b5050905080610df557600080fd5b50565b610e1383838360405180602001604052806000815250611c15565b505050565b600a60029054906101000a900460ff1681565b610e33612370565b73ffffffffffffffffffffffffffffffffffffffff16610e51611685565b73ffffffffffffffffffffffffffffffffffffffff1614610ea7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9e90613e49565b60405180910390fd5b8060099080519060200190610ebd9291906133fc565b5050565b6000610ecc826128e5565b600001519050919050565b600a60019054906101000a900460ff16610f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1d90613ee9565b60405180910390fd5b600b60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa990613dc9565b60405180910390fd5b612710610fcf83610fc1610cc2565b612b7490919063ffffffff16565b1115611010576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100790613e89565b60405180910390fd5b6000821180156110225750600d548211155b611061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105890613f29565b60405180910390fd5b600d546110b683600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612b7490919063ffffffff16565b11156110f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ee90613f09565b60405180910390fd5b6111128267016345785d8a0000612b8a90919063ffffffff16565b341015611154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114b90613e29565b60405180910390fd5b6001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111a49190614039565b925050819055506111b53383612ba0565b5050565b600980546111c690614204565b80601f01602080910402602001604051908101604052809291908181526020018280546111f290614204565b801561123f5780601f106112145761010080835404028352916020019161123f565b820191906000526020600020905b81548152906001019060200180831161122257829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112af576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61131f612370565b73ffffffffffffffffffffffffffffffffffffffff1661133d611685565b73ffffffffffffffffffffffffffffffffffffffff1614611393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138a90613e49565b60405180910390fd5b61139d6000612bbe565b565b6113a7612370565b73ffffffffffffffffffffffffffffffffffffffff166113c5611685565b73ffffffffffffffffffffffffffffffffffffffff161461141b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141290613e49565b60405180910390fd5b60005b8282905081101561155257600073ffffffffffffffffffffffffffffffffffffffff168383838181106114545761145361436e565b5b90506020020160208101906114699190613681565b73ffffffffffffffffffffffffffffffffffffffff1614156114c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b790613e69565b60405180910390fd5b6001600b60008585858181106114d9576114d861436e565b5b90506020020160208101906114ee9190613681565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061154a90614267565b91505061141e565b505050565b61155f612370565b73ffffffffffffffffffffffffffffffffffffffff1661157d611685565b73ffffffffffffffffffffffffffffffffffffffff16146115d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ca90613e49565b60405180910390fd5b6000811180156115e55750600e548111155b611624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161b90613e09565b60405180910390fd5b60005b81811015611659576000611639610cc2565b90506116458482612ba0565b50808061165190614267565b915050611627565b5061166f81600e54612c8490919063ffffffff16565b600e819055505050565b67016345785d8a000081565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d5481565b6060600380546116c490614204565b80601f01602080910402602001604051908101604052809291908181526020018280546116f090614204565b801561173d5780601f106117125761010080835404028352916020019161173d565b820191906000526020600020905b81548152906001019060200180831161172057829003601f168201915b5050505050905090565b61174f612370565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117b4576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006117c1612370565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661186e612370565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118b39190613d4c565b60405180910390a35050565b6118c7612370565b73ffffffffffffffffffffffffffffffffffffffff166118e5611685565b73ffffffffffffffffffffffffffffffffffffffff161461193b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193290613e49565b60405180910390fd5b6001600a60026101000a81548160ff021916908315150217905550565b6000601080549050905090565b61196d612370565b73ffffffffffffffffffffffffffffffffffffffff1661198b611685565b73ffffffffffffffffffffffffffffffffffffffff16146119e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d890613e49565b60405180910390fd5b60005b82829050811015611b1857600073ffffffffffffffffffffffffffffffffffffffff16838383818110611a1a57611a1961436e565b5b9050602002016020810190611a2f9190613681565b73ffffffffffffffffffffffffffffffffffffffff161415611a86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7d90613e69565b60405180910390fd5b6000600b6000858585818110611a9f57611a9e61436e565b5b9050602002016020810190611ab49190613681565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611b1090614267565b9150506119e4565b505050565b611b2681611f1a565b15611b66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5d90613ec9565b60405180910390fd5b601080549050600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506010819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611c2084848461242f565b611c3f8373ffffffffffffffffffffffffffffffffffffffff16612c9a565b8015611c545750611c5284848484612cbd565b155b15611c8b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060611c9c82612322565b611cdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd290613ea9565b60405180910390fd5b6000611ce5612e1d565b905060001515600a60029054906101000a900460ff1615151415611d245760405180608001604052806041815260200161478060419139915050611d71565b6000815111611d425760405180602001604052806000815250611d6d565b80611d4c84612eaf565b604051602001611d5d929190613ca1565b6040516020818303038152906040525b9150505b919050565b600a60009054906101000a900460ff16611dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbc90613de9565b60405180910390fd5b60008111611e08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dff90613d89565b60405180910390fd5b611e238167016345785d8a0000612b8a90919063ffffffff16565b341015611e65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5c90613e29565b60405180910390fd5b611e6f3382612ba0565b50565b611e7a612370565b73ffffffffffffffffffffffffffffffffffffffff16611e98611685565b73ffffffffffffffffffffffffffffffffffffffff1614611eee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee590613e49565b60405180910390fd5b600a60009054906101000a900460ff1615600a60006101000a81548160ff021916908315150217905550565b600080600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611f6c5760019050611f71565b600090505b919050565b611f7e612370565b73ffffffffffffffffffffffffffffffffffffffff16611f9c611685565b73ffffffffffffffffffffffffffffffffffffffff1614611ff2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe990613e49565b60405180910390fd5b80600d8190555050565b60008173ffffffffffffffffffffffffffffffffffffffff16319050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000601082815481106120c7576120c661436e565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600a60009054906101000a900460ff1681565b612114612370565b73ffffffffffffffffffffffffffffffffffffffff16612132611685565b73ffffffffffffffffffffffffffffffffffffffff1614612188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217f90613e49565b60405180910390fd5b600a60019054906101000a900460ff1615600a60016101000a81548160ff021916908315150217905550565b6121bc612370565b73ffffffffffffffffffffffffffffffffffffffff166121da611685565b73ffffffffffffffffffffffffffffffffffffffff1614612230576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222790613e49565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229790613da9565b60405180910390fd5b6122a981612bbe565b50565b61271081565b600e5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161232d61242a565b1115801561233c575060005482105b8015612369575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061243a826128e5565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146124a5576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166124c6612370565b73ffffffffffffffffffffffffffffffffffffffff1614806124f557506124f4856124ef612370565b61201d565b5b8061253a5750612503612370565b73ffffffffffffffffffffffffffffffffffffffff1661252284610ae5565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612573576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156125da576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125e78585856001613010565b6125f360008487612378565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561287357600054821461287257878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128de8585856001613016565b5050505050565b6128ed613482565b6000829050806128fb61242a565b1115801561290a575060005481105b15612b3d576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612b3b57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612a1f578092505050612b6f565b5b600115612b3a57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612b35578092505050612b6f565b612a20565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008183612b829190614039565b905092915050565b60008183612b9891906140c0565b905092915050565b612bba82826040518060200160405280600081525061301c565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183612c92919061411a565b905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ce3612370565b8786866040518563ffffffff1660e01b8152600401612d059493929190613d00565b602060405180830381600087803b158015612d1f57600080fd5b505af1925050508015612d5057506040513d601f19601f82011682018060405250810190612d4d91906138be565b60015b612dca573d8060008114612d80576040519150601f19603f3d011682016040523d82523d6000602084013e612d85565b606091505b50600081511415612dc2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054612e2c90614204565b80601f0160208091040260200160405190810160405280929190818152602001828054612e5890614204565b8015612ea55780601f10612e7a57610100808354040283529160200191612ea5565b820191906000526020600020905b815481529060010190602001808311612e8857829003601f168201915b5050505050905090565b60606000821415612ef7576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061300b565b600082905060005b60008214612f29578080612f1290614267565b915050600a82612f22919061408f565b9150612eff565b60008167ffffffffffffffff811115612f4557612f4461439d565b5b6040519080825280601f01601f191660200182016040528015612f775781602001600182028036833780820191505090505b5090505b6000851461300457600182612f90919061411a565b9150600a85612f9f91906142b0565b6030612fab9190614039565b60f81b818381518110612fc157612fc061436e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ffd919061408f565b9450612f7b565b8093505050505b919050565b50505050565b50505050565b613029838383600161302e565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561309b576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156130d6576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6130e36000868387613010565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156132ad57506132ac8773ffffffffffffffffffffffffffffffffffffffff16612c9a565b5b15613373575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46133226000888480600101955088612cbd565b613358576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156132b357826000541461336e57600080fd5b6133df565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415613374575b8160008190555050506133f56000868387613016565b5050505050565b82805461340890614204565b90600052602060002090601f01602090048101928261342a5760008555613471565b82601f1061344357805160ff1916838001178555613471565b82800160010185558215613471579182015b82811115613470578251825591602001919060010190613455565b5b50905061347e91906134c5565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156134de5760008160009055506001016134c6565b5090565b60006134f56134f084613f89565b613f64565b905082815260208101848484011115613511576135106143db565b5b61351c8482856141c2565b509392505050565b600061353761353284613fba565b613f64565b905082815260208101848484011115613553576135526143db565b5b61355e8482856141c2565b509392505050565b60008135905061357581614723565b92915050565b60008083601f840112613591576135906143d1565b5b8235905067ffffffffffffffff8111156135ae576135ad6143cc565b5b6020830191508360208202830111156135ca576135c96143d6565b5b9250929050565b6000813590506135e08161473a565b92915050565b6000813590506135f581614751565b92915050565b60008151905061360a81614751565b92915050565b600082601f830112613625576136246143d1565b5b81356136358482602086016134e2565b91505092915050565b600082601f830112613653576136526143d1565b5b8135613663848260208601613524565b91505092915050565b60008135905061367b81614768565b92915050565b600060208284031215613697576136966143e5565b5b60006136a584828501613566565b91505092915050565b600080604083850312156136c5576136c46143e5565b5b60006136d385828601613566565b92505060206136e485828601613566565b9150509250929050565b600080600060608486031215613707576137066143e5565b5b600061371586828701613566565b935050602061372686828701613566565b92505060406137378682870161366c565b9150509250925092565b6000806000806080858703121561375b5761375a6143e5565b5b600061376987828801613566565b945050602061377a87828801613566565b935050604061378b8782880161366c565b925050606085013567ffffffffffffffff8111156137ac576137ab6143e0565b5b6137b887828801613610565b91505092959194509250565b600080604083850312156137db576137da6143e5565b5b60006137e985828601613566565b92505060206137fa858286016135d1565b9150509250929050565b6000806040838503121561381b5761381a6143e5565b5b600061382985828601613566565b925050602061383a8582860161366c565b9150509250929050565b6000806020838503121561385b5761385a6143e5565b5b600083013567ffffffffffffffff811115613879576138786143e0565b5b6138858582860161357b565b92509250509250929050565b6000602082840312156138a7576138a66143e5565b5b60006138b5848285016135e6565b91505092915050565b6000602082840312156138d4576138d36143e5565b5b60006138e2848285016135fb565b91505092915050565b600060208284031215613901576139006143e5565b5b600082013567ffffffffffffffff81111561391f5761391e6143e0565b5b61392b8482850161363e565b91505092915050565b60006020828403121561394a576139496143e5565b5b60006139588482850161366c565b91505092915050565b60008060408385031215613978576139776143e5565b5b60006139868582860161366c565b925050602061399785828601613566565b9150509250929050565b6139aa8161414e565b82525050565b6139b981614160565b82525050565b60006139ca82613feb565b6139d48185614001565b93506139e48185602086016141d1565b6139ed816143ea565b840191505092915050565b6000613a0382613ff6565b613a0d818561401d565b9350613a1d8185602086016141d1565b613a26816143ea565b840191505092915050565b6000613a3c82613ff6565b613a46818561402e565b9350613a568185602086016141d1565b80840191505092915050565b6000613a6f602a8361401d565b9150613a7a826143fb565b604082019050919050565b6000613a9260268361401d565b9150613a9d8261444a565b604082019050919050565b6000613ab5601f8361401d565b9150613ac082614499565b602082019050919050565b6000613ad860218361401d565b9150613ae3826144c2565b604082019050919050565b6000613afb60208361401d565b9150613b0682614511565b602082019050919050565b6000613b1e601f8361401d565b9150613b298261453a565b602082019050919050565b6000613b4160058361402e565b9150613b4c82614563565b600582019050919050565b6000613b6460208361401d565b9150613b6f8261458c565b602082019050919050565b6000613b87601a8361401d565b9150613b92826145b5565b602082019050919050565b6000613baa60298361401d565b9150613bb5826145de565b604082019050919050565b6000613bcd602f8361401d565b9150613bd88261462d565b604082019050919050565b6000613bf0600a8361401d565b9150613bfb8261467c565b602082019050919050565b6000613c13600083614012565b9150613c1e826146a5565b600082019050919050565b6000613c3660158361401d565b9150613c41826146a8565b602082019050919050565b6000613c59601c8361401d565b9150613c64826146d1565b602082019050919050565b6000613c7c60208361401d565b9150613c87826146fa565b602082019050919050565b613c9b816141b8565b82525050565b6000613cad8285613a31565b9150613cb98284613a31565b9150613cc482613b34565b91508190509392505050565b6000613cdb82613c06565b9150819050919050565b6000602082019050613cfa60008301846139a1565b92915050565b6000608082019050613d1560008301876139a1565b613d2260208301866139a1565b613d2f6040830185613c92565b8181036060830152613d4181846139bf565b905095945050505050565b6000602082019050613d6160008301846139b0565b92915050565b60006020820190508181036000830152613d8181846139f8565b905092915050565b60006020820190508181036000830152613da281613a62565b9050919050565b60006020820190508181036000830152613dc281613a85565b9050919050565b60006020820190508181036000830152613de281613aa8565b9050919050565b60006020820190508181036000830152613e0281613acb565b9050919050565b60006020820190508181036000830152613e2281613aee565b9050919050565b60006020820190508181036000830152613e4281613b11565b9050919050565b60006020820190508181036000830152613e6281613b57565b9050919050565b60006020820190508181036000830152613e8281613b7a565b9050919050565b60006020820190508181036000830152613ea281613b9d565b9050919050565b60006020820190508181036000830152613ec281613bc0565b9050919050565b60006020820190508181036000830152613ee281613be3565b9050919050565b60006020820190508181036000830152613f0281613c29565b9050919050565b60006020820190508181036000830152613f2281613c4c565b9050919050565b60006020820190508181036000830152613f4281613c6f565b9050919050565b6000602082019050613f5e6000830184613c92565b92915050565b6000613f6e613f7f565b9050613f7a8282614236565b919050565b6000604051905090565b600067ffffffffffffffff821115613fa457613fa361439d565b5b613fad826143ea565b9050602081019050919050565b600067ffffffffffffffff821115613fd557613fd461439d565b5b613fde826143ea565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614044826141b8565b915061404f836141b8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614084576140836142e1565b5b828201905092915050565b600061409a826141b8565b91506140a5836141b8565b9250826140b5576140b4614310565b5b828204905092915050565b60006140cb826141b8565b91506140d6836141b8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561410f5761410e6142e1565b5b828202905092915050565b6000614125826141b8565b9150614130836141b8565b925082821015614143576141426142e1565b5b828203905092915050565b600061415982614198565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156141ef5780820151818401526020810190506141d4565b838111156141fe576000848401525b50505050565b6000600282049050600182168061421c57607f821691505b602082108114156142305761422f61433f565b5b50919050565b61423f826143ea565b810181811067ffffffffffffffff8211171561425e5761425d61439d565b5b80604052505050565b6000614272826141b8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156142a5576142a46142e1565b5b600182019050919050565b60006142bb826141b8565b91506142c6836141b8565b9250826142d6576142d5614310565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f43616e206f6e6c79206d696e74206f6e65206f72206d6f726520746f6b656e7360008201527f20617420612074696d6500000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f596f7520617265206e6f74206f6e207468652050726573616c65204c69737400600082015250565b7f53616c65206d7573742062652061637469766520746f206d696e7420546f6b6560008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f7567682072657365727665206c65667420666f72207465616d600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f43616e27742061646420746865206e756c6c2061646472657373000000000000600082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f6620746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4e6f74204c697374656400000000000000000000000000000000000000000000600082015250565b50565b7f50726573616c65206973206e6f74206163746976650000000000000000000000600082015250565b7f50757263686173652065786365656473206d617820616c6c6f77656400000000600082015250565b7f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e73600082015250565b61472c8161414e565b811461473757600080fd5b50565b61474381614160565b811461474e57600080fd5b50565b61475a8161416c565b811461476557600080fd5b50565b614771816141b8565b811461477c57600080fd5b5056fe697066733a2f2f516d5538506351485838576b785364354c747067614262654375347a4373464870754448466332325267596937742f68696464656e2e6a736f6ea26469706673582212202aecf99924b40f4fb9d1b32552717d32b9aa3efdb1b92644a1cd3c59a9d4063764736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102515760003560e01c8063946ef42a11610139578063daaeec86116100b6578063eb02c3011161007a578063eb02c30114610873578063eb8d2444146108b0578063f285e69e146108db578063f2fde38b146108f2578063f47c84c51461091b578063fcd2a4271461094657610251565b8063daaeec861461077c578063deac465914610793578063df4305d2146107d0578063e3d670d7146107f9578063e985e9c51461083657610251565b8063b179e060116100fd578063b179e060146106a8578063b357d81a146106d1578063b88d4fde146106fa578063c87b56dd14610723578063d14b16ac1461076057610251565b8063946ef42a146105e757806395d89b4114610612578063a22cb4651461063d578063a475b5dd14610666578063a87d942c1461067d57610251565b806354214f69116101d257806370a082311161019657806370a08231146104eb578063715018a6146105285780637204a3c91461053f57806378cf19e9146105685780637ff9b596146105915780638da5cb5b146105bc57610251565b806354214f691461041357806355f804b31461043e5780636352211e1461046757806365f6ef7e146104a45780636c0360eb146104c057610251565b806318160ddd1161021957806318160ddd1461036157806323b872dd1461038c57806330f72cd4146103b55780633ccfd60b146103e057806342842e0e146103ea57610251565b806301ffc9a71461025657806306fdde0314610293578063081812fc146102be578063095ea7b3146102fb57806311576b7914610324575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190613891565b610971565b60405161028a9190613d4c565b60405180910390f35b34801561029f57600080fd5b506102a8610a53565b6040516102b59190613d67565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e09190613934565b610ae5565b6040516102f29190613ce5565b60405180910390f35b34801561030757600080fd5b50610322600480360381019061031d9190613804565b610b61565b005b34801561033057600080fd5b5061034b60048036038101906103469190613681565b610c6c565b6040516103589190613d4c565b60405180910390f35b34801561036d57600080fd5b50610376610cc2565b6040516103839190613f49565b60405180910390f35b34801561039857600080fd5b506103b360048036038101906103ae91906136ee565b610cd9565b005b3480156103c157600080fd5b506103ca610ce9565b6040516103d79190613d4c565b60405180910390f35b6103e8610cfc565b005b3480156103f657600080fd5b50610411600480360381019061040c91906136ee565b610df8565b005b34801561041f57600080fd5b50610428610e18565b6040516104359190613d4c565b60405180910390f35b34801561044a57600080fd5b50610465600480360381019061046091906138eb565b610e2b565b005b34801561047357600080fd5b5061048e60048036038101906104899190613934565b610ec1565b60405161049b9190613ce5565b60405180910390f35b6104be60048036038101906104b99190613961565b610ed7565b005b3480156104cc57600080fd5b506104d56111b9565b6040516104e29190613d67565b60405180910390f35b3480156104f757600080fd5b50610512600480360381019061050d9190613681565b611247565b60405161051f9190613f49565b60405180910390f35b34801561053457600080fd5b5061053d611317565b005b34801561054b57600080fd5b5061056660048036038101906105619190613844565b61139f565b005b34801561057457600080fd5b5061058f600480360381019061058a9190613804565b611557565b005b34801561059d57600080fd5b506105a6611679565b6040516105b39190613f49565b60405180910390f35b3480156105c857600080fd5b506105d1611685565b6040516105de9190613ce5565b60405180910390f35b3480156105f357600080fd5b506105fc6116af565b6040516106099190613f49565b60405180910390f35b34801561061e57600080fd5b506106276116b5565b6040516106349190613d67565b60405180910390f35b34801561064957600080fd5b50610664600480360381019061065f91906137c4565b611747565b005b34801561067257600080fd5b5061067b6118bf565b005b34801561068957600080fd5b50610692611958565b60405161069f9190613f49565b60405180910390f35b3480156106b457600080fd5b506106cf60048036038101906106ca9190613844565b611965565b005b3480156106dd57600080fd5b506106f860048036038101906106f39190613681565b611b1d565b005b34801561070657600080fd5b50610721600480360381019061071c9190613741565b611c15565b005b34801561072f57600080fd5b5061074a60048036038101906107459190613934565b611c91565b6040516107579190613d67565b60405180910390f35b61077a60048036038101906107759190613934565b611d76565b005b34801561078857600080fd5b50610791611e72565b005b34801561079f57600080fd5b506107ba60048036038101906107b59190613681565b611f1a565b6040516107c79190613d4c565b60405180910390f35b3480156107dc57600080fd5b506107f760048036038101906107f29190613934565b611f76565b005b34801561080557600080fd5b50610820600480360381019061081b9190613681565b611ffc565b60405161082d9190613f49565b60405180910390f35b34801561084257600080fd5b5061085d600480360381019061085891906136ae565b61201d565b60405161086a9190613d4c565b60405180910390f35b34801561087f57600080fd5b5061089a60048036038101906108959190613934565b6120b1565b6040516108a79190613ce5565b60405180910390f35b3480156108bc57600080fd5b506108c56120f9565b6040516108d29190613d4c565b60405180910390f35b3480156108e757600080fd5b506108f061210c565b005b3480156108fe57600080fd5b5061091960048036038101906109149190613681565b6121b4565b005b34801561092757600080fd5b506109306122ac565b60405161093d9190613f49565b60405180910390f35b34801561095257600080fd5b5061095b6122b2565b6040516109689190613f49565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a3c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a4c5750610a4b826122b8565b5b9050919050565b606060028054610a6290614204565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8e90614204565b8015610adb5780601f10610ab057610100808354040283529160200191610adb565b820191906000526020600020905b815481529060010190602001808311610abe57829003601f168201915b5050505050905090565b6000610af082612322565b610b26576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b6c82610ec1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bd4576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bf3612370565b73ffffffffffffffffffffffffffffffffffffffff1614158015610c255750610c2381610c1e612370565b61201d565b155b15610c5c576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c67838383612378565b505050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000610ccc61242a565b6001546000540303905090565b610ce483838361242f565b505050565b600a60019054906101000a900460ff1681565b610d04612370565b73ffffffffffffffffffffffffffffffffffffffff16610d22611685565b73ffffffffffffffffffffffffffffffffffffffff1614610d78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6f90613e49565b60405180910390fd5b6000610d82611685565b73ffffffffffffffffffffffffffffffffffffffff1647604051610da590613cd0565b60006040518083038185875af1925050503d8060008114610de2576040519150601f19603f3d011682016040523d82523d6000602084013e610de7565b606091505b5050905080610df557600080fd5b50565b610e1383838360405180602001604052806000815250611c15565b505050565b600a60029054906101000a900460ff1681565b610e33612370565b73ffffffffffffffffffffffffffffffffffffffff16610e51611685565b73ffffffffffffffffffffffffffffffffffffffff1614610ea7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9e90613e49565b60405180910390fd5b8060099080519060200190610ebd9291906133fc565b5050565b6000610ecc826128e5565b600001519050919050565b600a60019054906101000a900460ff16610f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1d90613ee9565b60405180910390fd5b600b60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa990613dc9565b60405180910390fd5b612710610fcf83610fc1610cc2565b612b7490919063ffffffff16565b1115611010576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100790613e89565b60405180910390fd5b6000821180156110225750600d548211155b611061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105890613f29565b60405180910390fd5b600d546110b683600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612b7490919063ffffffff16565b11156110f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ee90613f09565b60405180910390fd5b6111128267016345785d8a0000612b8a90919063ffffffff16565b341015611154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114b90613e29565b60405180910390fd5b6001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111a49190614039565b925050819055506111b53383612ba0565b5050565b600980546111c690614204565b80601f01602080910402602001604051908101604052809291908181526020018280546111f290614204565b801561123f5780601f106112145761010080835404028352916020019161123f565b820191906000526020600020905b81548152906001019060200180831161122257829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112af576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61131f612370565b73ffffffffffffffffffffffffffffffffffffffff1661133d611685565b73ffffffffffffffffffffffffffffffffffffffff1614611393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138a90613e49565b60405180910390fd5b61139d6000612bbe565b565b6113a7612370565b73ffffffffffffffffffffffffffffffffffffffff166113c5611685565b73ffffffffffffffffffffffffffffffffffffffff161461141b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141290613e49565b60405180910390fd5b60005b8282905081101561155257600073ffffffffffffffffffffffffffffffffffffffff168383838181106114545761145361436e565b5b90506020020160208101906114699190613681565b73ffffffffffffffffffffffffffffffffffffffff1614156114c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b790613e69565b60405180910390fd5b6001600b60008585858181106114d9576114d861436e565b5b90506020020160208101906114ee9190613681565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061154a90614267565b91505061141e565b505050565b61155f612370565b73ffffffffffffffffffffffffffffffffffffffff1661157d611685565b73ffffffffffffffffffffffffffffffffffffffff16146115d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ca90613e49565b60405180910390fd5b6000811180156115e55750600e548111155b611624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161b90613e09565b60405180910390fd5b60005b81811015611659576000611639610cc2565b90506116458482612ba0565b50808061165190614267565b915050611627565b5061166f81600e54612c8490919063ffffffff16565b600e819055505050565b67016345785d8a000081565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d5481565b6060600380546116c490614204565b80601f01602080910402602001604051908101604052809291908181526020018280546116f090614204565b801561173d5780601f106117125761010080835404028352916020019161173d565b820191906000526020600020905b81548152906001019060200180831161172057829003601f168201915b5050505050905090565b61174f612370565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117b4576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006117c1612370565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661186e612370565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118b39190613d4c565b60405180910390a35050565b6118c7612370565b73ffffffffffffffffffffffffffffffffffffffff166118e5611685565b73ffffffffffffffffffffffffffffffffffffffff161461193b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193290613e49565b60405180910390fd5b6001600a60026101000a81548160ff021916908315150217905550565b6000601080549050905090565b61196d612370565b73ffffffffffffffffffffffffffffffffffffffff1661198b611685565b73ffffffffffffffffffffffffffffffffffffffff16146119e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d890613e49565b60405180910390fd5b60005b82829050811015611b1857600073ffffffffffffffffffffffffffffffffffffffff16838383818110611a1a57611a1961436e565b5b9050602002016020810190611a2f9190613681565b73ffffffffffffffffffffffffffffffffffffffff161415611a86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7d90613e69565b60405180910390fd5b6000600b6000858585818110611a9f57611a9e61436e565b5b9050602002016020810190611ab49190613681565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611b1090614267565b9150506119e4565b505050565b611b2681611f1a565b15611b66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5d90613ec9565b60405180910390fd5b601080549050600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506010819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611c2084848461242f565b611c3f8373ffffffffffffffffffffffffffffffffffffffff16612c9a565b8015611c545750611c5284848484612cbd565b155b15611c8b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060611c9c82612322565b611cdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd290613ea9565b60405180910390fd5b6000611ce5612e1d565b905060001515600a60029054906101000a900460ff1615151415611d245760405180608001604052806041815260200161478060419139915050611d71565b6000815111611d425760405180602001604052806000815250611d6d565b80611d4c84612eaf565b604051602001611d5d929190613ca1565b6040516020818303038152906040525b9150505b919050565b600a60009054906101000a900460ff16611dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbc90613de9565b60405180910390fd5b60008111611e08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dff90613d89565b60405180910390fd5b611e238167016345785d8a0000612b8a90919063ffffffff16565b341015611e65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5c90613e29565b60405180910390fd5b611e6f3382612ba0565b50565b611e7a612370565b73ffffffffffffffffffffffffffffffffffffffff16611e98611685565b73ffffffffffffffffffffffffffffffffffffffff1614611eee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee590613e49565b60405180910390fd5b600a60009054906101000a900460ff1615600a60006101000a81548160ff021916908315150217905550565b600080600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611f6c5760019050611f71565b600090505b919050565b611f7e612370565b73ffffffffffffffffffffffffffffffffffffffff16611f9c611685565b73ffffffffffffffffffffffffffffffffffffffff1614611ff2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe990613e49565b60405180910390fd5b80600d8190555050565b60008173ffffffffffffffffffffffffffffffffffffffff16319050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000601082815481106120c7576120c661436e565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600a60009054906101000a900460ff1681565b612114612370565b73ffffffffffffffffffffffffffffffffffffffff16612132611685565b73ffffffffffffffffffffffffffffffffffffffff1614612188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217f90613e49565b60405180910390fd5b600a60019054906101000a900460ff1615600a60016101000a81548160ff021916908315150217905550565b6121bc612370565b73ffffffffffffffffffffffffffffffffffffffff166121da611685565b73ffffffffffffffffffffffffffffffffffffffff1614612230576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222790613e49565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229790613da9565b60405180910390fd5b6122a981612bbe565b50565b61271081565b600e5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161232d61242a565b1115801561233c575060005482105b8015612369575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061243a826128e5565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146124a5576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166124c6612370565b73ffffffffffffffffffffffffffffffffffffffff1614806124f557506124f4856124ef612370565b61201d565b5b8061253a5750612503612370565b73ffffffffffffffffffffffffffffffffffffffff1661252284610ae5565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612573576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156125da576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125e78585856001613010565b6125f360008487612378565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561287357600054821461287257878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128de8585856001613016565b5050505050565b6128ed613482565b6000829050806128fb61242a565b1115801561290a575060005481105b15612b3d576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612b3b57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612a1f578092505050612b6f565b5b600115612b3a57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612b35578092505050612b6f565b612a20565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008183612b829190614039565b905092915050565b60008183612b9891906140c0565b905092915050565b612bba82826040518060200160405280600081525061301c565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183612c92919061411a565b905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ce3612370565b8786866040518563ffffffff1660e01b8152600401612d059493929190613d00565b602060405180830381600087803b158015612d1f57600080fd5b505af1925050508015612d5057506040513d601f19601f82011682018060405250810190612d4d91906138be565b60015b612dca573d8060008114612d80576040519150601f19603f3d011682016040523d82523d6000602084013e612d85565b606091505b50600081511415612dc2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054612e2c90614204565b80601f0160208091040260200160405190810160405280929190818152602001828054612e5890614204565b8015612ea55780601f10612e7a57610100808354040283529160200191612ea5565b820191906000526020600020905b815481529060010190602001808311612e8857829003601f168201915b5050505050905090565b60606000821415612ef7576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061300b565b600082905060005b60008214612f29578080612f1290614267565b915050600a82612f22919061408f565b9150612eff565b60008167ffffffffffffffff811115612f4557612f4461439d565b5b6040519080825280601f01601f191660200182016040528015612f775781602001600182028036833780820191505090505b5090505b6000851461300457600182612f90919061411a565b9150600a85612f9f91906142b0565b6030612fab9190614039565b60f81b818381518110612fc157612fc061436e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ffd919061408f565b9450612f7b565b8093505050505b919050565b50505050565b50505050565b613029838383600161302e565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561309b576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156130d6576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6130e36000868387613010565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156132ad57506132ac8773ffffffffffffffffffffffffffffffffffffffff16612c9a565b5b15613373575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46133226000888480600101955088612cbd565b613358576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156132b357826000541461336e57600080fd5b6133df565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415613374575b8160008190555050506133f56000868387613016565b5050505050565b82805461340890614204565b90600052602060002090601f01602090048101928261342a5760008555613471565b82601f1061344357805160ff1916838001178555613471565b82800160010185558215613471579182015b82811115613470578251825591602001919060010190613455565b5b50905061347e91906134c5565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156134de5760008160009055506001016134c6565b5090565b60006134f56134f084613f89565b613f64565b905082815260208101848484011115613511576135106143db565b5b61351c8482856141c2565b509392505050565b600061353761353284613fba565b613f64565b905082815260208101848484011115613553576135526143db565b5b61355e8482856141c2565b509392505050565b60008135905061357581614723565b92915050565b60008083601f840112613591576135906143d1565b5b8235905067ffffffffffffffff8111156135ae576135ad6143cc565b5b6020830191508360208202830111156135ca576135c96143d6565b5b9250929050565b6000813590506135e08161473a565b92915050565b6000813590506135f581614751565b92915050565b60008151905061360a81614751565b92915050565b600082601f830112613625576136246143d1565b5b81356136358482602086016134e2565b91505092915050565b600082601f830112613653576136526143d1565b5b8135613663848260208601613524565b91505092915050565b60008135905061367b81614768565b92915050565b600060208284031215613697576136966143e5565b5b60006136a584828501613566565b91505092915050565b600080604083850312156136c5576136c46143e5565b5b60006136d385828601613566565b92505060206136e485828601613566565b9150509250929050565b600080600060608486031215613707576137066143e5565b5b600061371586828701613566565b935050602061372686828701613566565b92505060406137378682870161366c565b9150509250925092565b6000806000806080858703121561375b5761375a6143e5565b5b600061376987828801613566565b945050602061377a87828801613566565b935050604061378b8782880161366c565b925050606085013567ffffffffffffffff8111156137ac576137ab6143e0565b5b6137b887828801613610565b91505092959194509250565b600080604083850312156137db576137da6143e5565b5b60006137e985828601613566565b92505060206137fa858286016135d1565b9150509250929050565b6000806040838503121561381b5761381a6143e5565b5b600061382985828601613566565b925050602061383a8582860161366c565b9150509250929050565b6000806020838503121561385b5761385a6143e5565b5b600083013567ffffffffffffffff811115613879576138786143e0565b5b6138858582860161357b565b92509250509250929050565b6000602082840312156138a7576138a66143e5565b5b60006138b5848285016135e6565b91505092915050565b6000602082840312156138d4576138d36143e5565b5b60006138e2848285016135fb565b91505092915050565b600060208284031215613901576139006143e5565b5b600082013567ffffffffffffffff81111561391f5761391e6143e0565b5b61392b8482850161363e565b91505092915050565b60006020828403121561394a576139496143e5565b5b60006139588482850161366c565b91505092915050565b60008060408385031215613978576139776143e5565b5b60006139868582860161366c565b925050602061399785828601613566565b9150509250929050565b6139aa8161414e565b82525050565b6139b981614160565b82525050565b60006139ca82613feb565b6139d48185614001565b93506139e48185602086016141d1565b6139ed816143ea565b840191505092915050565b6000613a0382613ff6565b613a0d818561401d565b9350613a1d8185602086016141d1565b613a26816143ea565b840191505092915050565b6000613a3c82613ff6565b613a46818561402e565b9350613a568185602086016141d1565b80840191505092915050565b6000613a6f602a8361401d565b9150613a7a826143fb565b604082019050919050565b6000613a9260268361401d565b9150613a9d8261444a565b604082019050919050565b6000613ab5601f8361401d565b9150613ac082614499565b602082019050919050565b6000613ad860218361401d565b9150613ae3826144c2565b604082019050919050565b6000613afb60208361401d565b9150613b0682614511565b602082019050919050565b6000613b1e601f8361401d565b9150613b298261453a565b602082019050919050565b6000613b4160058361402e565b9150613b4c82614563565b600582019050919050565b6000613b6460208361401d565b9150613b6f8261458c565b602082019050919050565b6000613b87601a8361401d565b9150613b92826145b5565b602082019050919050565b6000613baa60298361401d565b9150613bb5826145de565b604082019050919050565b6000613bcd602f8361401d565b9150613bd88261462d565b604082019050919050565b6000613bf0600a8361401d565b9150613bfb8261467c565b602082019050919050565b6000613c13600083614012565b9150613c1e826146a5565b600082019050919050565b6000613c3660158361401d565b9150613c41826146a8565b602082019050919050565b6000613c59601c8361401d565b9150613c64826146d1565b602082019050919050565b6000613c7c60208361401d565b9150613c87826146fa565b602082019050919050565b613c9b816141b8565b82525050565b6000613cad8285613a31565b9150613cb98284613a31565b9150613cc482613b34565b91508190509392505050565b6000613cdb82613c06565b9150819050919050565b6000602082019050613cfa60008301846139a1565b92915050565b6000608082019050613d1560008301876139a1565b613d2260208301866139a1565b613d2f6040830185613c92565b8181036060830152613d4181846139bf565b905095945050505050565b6000602082019050613d6160008301846139b0565b92915050565b60006020820190508181036000830152613d8181846139f8565b905092915050565b60006020820190508181036000830152613da281613a62565b9050919050565b60006020820190508181036000830152613dc281613a85565b9050919050565b60006020820190508181036000830152613de281613aa8565b9050919050565b60006020820190508181036000830152613e0281613acb565b9050919050565b60006020820190508181036000830152613e2281613aee565b9050919050565b60006020820190508181036000830152613e4281613b11565b9050919050565b60006020820190508181036000830152613e6281613b57565b9050919050565b60006020820190508181036000830152613e8281613b7a565b9050919050565b60006020820190508181036000830152613ea281613b9d565b9050919050565b60006020820190508181036000830152613ec281613bc0565b9050919050565b60006020820190508181036000830152613ee281613be3565b9050919050565b60006020820190508181036000830152613f0281613c29565b9050919050565b60006020820190508181036000830152613f2281613c4c565b9050919050565b60006020820190508181036000830152613f4281613c6f565b9050919050565b6000602082019050613f5e6000830184613c92565b92915050565b6000613f6e613f7f565b9050613f7a8282614236565b919050565b6000604051905090565b600067ffffffffffffffff821115613fa457613fa361439d565b5b613fad826143ea565b9050602081019050919050565b600067ffffffffffffffff821115613fd557613fd461439d565b5b613fde826143ea565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614044826141b8565b915061404f836141b8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614084576140836142e1565b5b828201905092915050565b600061409a826141b8565b91506140a5836141b8565b9250826140b5576140b4614310565b5b828204905092915050565b60006140cb826141b8565b91506140d6836141b8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561410f5761410e6142e1565b5b828202905092915050565b6000614125826141b8565b9150614130836141b8565b925082821015614143576141426142e1565b5b828203905092915050565b600061415982614198565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156141ef5780820151818401526020810190506141d4565b838111156141fe576000848401525b50505050565b6000600282049050600182168061421c57607f821691505b602082108114156142305761422f61433f565b5b50919050565b61423f826143ea565b810181811067ffffffffffffffff8211171561425e5761425d61439d565b5b80604052505050565b6000614272826141b8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156142a5576142a46142e1565b5b600182019050919050565b60006142bb826141b8565b91506142c6836141b8565b9250826142d6576142d5614310565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f43616e206f6e6c79206d696e74206f6e65206f72206d6f726520746f6b656e7360008201527f20617420612074696d6500000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f596f7520617265206e6f74206f6e207468652050726573616c65204c69737400600082015250565b7f53616c65206d7573742062652061637469766520746f206d696e7420546f6b6560008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f7567682072657365727665206c65667420666f72207465616d600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f43616e27742061646420746865206e756c6c2061646472657373000000000000600082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f6620746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4e6f74204c697374656400000000000000000000000000000000000000000000600082015250565b50565b7f50726573616c65206973206e6f74206163746976650000000000000000000000600082015250565b7f50757263686173652065786365656473206d617820616c6c6f77656400000000600082015250565b7f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e73600082015250565b61472c8161414e565b811461473757600080fd5b50565b61474381614160565b811461474e57600080fd5b50565b61475a8161416c565b811461476557600080fd5b50565b614771816141b8565b811461477c57600080fd5b5056fe697066733a2f2f516d5538506351485838576b785364354c747067614262654375347a4373464870754448466332325267596937742f68696464656e2e6a736f6ea26469706673582212202aecf99924b40f4fb9d1b32552717d32b9aa3efdb1b92644a1cd3c59a9d4063764736f6c63430008070033

Deployed Bytecode Sourcemap

51849:4448:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31469:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34582:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36085:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35648:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55719:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30718:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36950:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52121:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53704:137;;;:::i;:::-;;37191:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52159:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53607:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34390:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54898:705;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52054:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31838:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50940:103;;;;;;;;;;;;;:::i;:::-;;52592:240;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53910:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51950:55;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50289:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52304:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34751:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36361:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53846:59;;;;;;;;;;;;;:::i;:::-;;53310:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52837:248;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52437:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37447:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55822:469;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54438:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54251:81;;;;;;;;;;;;;:::i;:::-;;53090:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55614:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54782:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36719:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53212:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52086:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54337:90;;;;;;;;;;;;;:::i;:::-;;51198:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52009:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52340:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31469:305;31571:4;31623:25;31608:40;;;:11;:40;;;;:105;;;;31680:33;31665:48;;;:11;:48;;;;31608:105;:158;;;;31730:36;31754:11;31730:23;:36::i;:::-;31608:158;31588:178;;31469:305;;;:::o;34582:100::-;34636:13;34669:5;34662:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34582:100;:::o;36085:204::-;36153:7;36178:16;36186:7;36178;:16::i;:::-;36173:64;;36203:34;;;;;;;;;;;;;;36173:64;36257:15;:24;36273:7;36257:24;;;;;;;;;;;;;;;;;;;;;36250:31;;36085:204;;;:::o;35648:371::-;35721:13;35737:24;35753:7;35737:15;:24::i;:::-;35721:40;;35782:5;35776:11;;:2;:11;;;35772:48;;;35796:24;;;;;;;;;;;;;;35772:48;35853:5;35837:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;35863:37;35880:5;35887:12;:10;:12::i;:::-;35863:16;:37::i;:::-;35862:38;35837:63;35833:138;;;35924:35;;;;;;;;;;;;;;35833:138;35983:28;35992:2;35996:7;36005:5;35983:8;:28::i;:::-;35710:309;35648:371;;:::o;55719:98::-;55779:4;55795:12;:18;55808:4;55795:18;;;;;;;;;;;;;;;;;;;;;;;;;55788:25;;55719:98;;;:::o;30718:303::-;30762:7;30987:15;:13;:15::i;:::-;30972:12;;30956:13;;:28;:46;30949:53;;30718:303;:::o;36950:170::-;37084:28;37094:4;37100:2;37104:7;37084:9;:28::i;:::-;36950:170;;;:::o;52121:35::-;;;;;;;;;;;;;:::o;53704:137::-;50520:12;:10;:12::i;:::-;50509:23;;:7;:5;:7::i;:::-;:23;;;50501:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53753:7:::1;53774;:5;:7::i;:::-;53766:21;;53796;53766:57;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53752:71;;;53834:2;53826:11;;;::::0;::::1;;53749:92;53704:137::o:0;37191:185::-;37329:39;37346:4;37352:2;37356:7;37329:39;;;;;;;;;;;;:16;:39::i;:::-;37191:185;;;:::o;52159:30::-;;;;;;;;;;;;;:::o;53607:92::-;50520:12;:10;:12::i;:::-;50509:23;;:7;:5;:7::i;:::-;:23;;;50501:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53684:11:::1;53674:7;:21;;;;;;;;;;;;:::i;:::-;;53607:92:::0;:::o;34390:125::-;34454:7;34481:21;34494:7;34481:12;:21::i;:::-;:26;;;34474:33;;34390:125;;;:::o;54898:705::-;54982:15;;;;;;;;;;;54974:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;55034:12;:18;55047:4;55034:18;;;;;;;;;;;;;;;;;;;;;;;;;55026:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;52046:5;55101:33;55119:14;55101:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:47;;55091:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;55227:1;55210:14;:18;:54;;;;;55250:14;;55232;:32;;55210:54;55200:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;55375:14;;55320:51;55356:14;55320:19;:31;55340:10;55320:31;;;;;;;;;;;;;;;;:35;;:51;;;;:::i;:::-;:69;;55310:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;55451:30;55466:14;51987:18;55451:14;;:30;;;;:::i;:::-;55438:9;:43;;55428:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;55558:1;55523:19;:31;55543:10;55523:31;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;55562:37;55572:10;55584:14;55562:9;:37::i;:::-;54898:705;;:::o;52054:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31838:206::-;31902:7;31943:1;31926:19;;:5;:19;;;31922:60;;;31954:28;;;;;;;;;;;;;;31922:60;32008:12;:19;32021:5;32008:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;32000:36;;31993:43;;31838:206;;;:::o;50940:103::-;50520:12;:10;:12::i;:::-;50509:23;;:7;:5;:7::i;:::-;:23;;;50501:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51005:30:::1;51032:1;51005:18;:30::i;:::-;50940:103::o:0;52592:240::-;50520:12;:10;:12::i;:::-;50509:23;;:7;:5;:7::i;:::-;:23;;;50501:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52676:9:::1;52671:158;52695:9;;:16;;52691:1;:20;52671:158;;;52753:1;52729:26;;:9;;52739:1;52729:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;:26;;;;52721:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;52821:4;52792:12;:26;52805:9;;52815:1;52805:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;52792:26;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;52713:3;;;;;:::i;:::-;;;;52671:158;;;;52592:240:::0;;:::o;53910:336::-;50520:12;:10;:12::i;:::-;50509:23;;:7;:5;:7::i;:::-;:23;;;50501:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54022:1:::1;54005:14;:18;:50;;;;;54045:10;;54027:14;:28;;54005:50;53995:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;54103:9;54098:99;54122:14;54118:1;:18;54098:99;;;54146:10;54159:13;:11;:13::i;:::-;54146:26;;54175:18;54185:3;54190:2;54175:9;:18::i;:::-;54143:54;54138:3;;;;;:::i;:::-;;;;54098:99;;;;54212:30;54227:14;54212:10;;:14;;:30;;;;:::i;:::-;54199:10;:43;;;;53910:336:::0;;:::o;51950:55::-;51987:18;51950:55;:::o;50289:87::-;50335:7;50362:6;;;;;;;;;;;50355:13;;50289:87;:::o;52304:33::-;;;;:::o;34751:104::-;34807:13;34840:7;34833:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34751:104;:::o;36361:287::-;36472:12;:10;:12::i;:::-;36460:24;;:8;:24;;;36456:54;;;36493:17;;;;;;;;;;;;;;36456:54;36568:8;36523:18;:32;36542:12;:10;:12::i;:::-;36523:32;;;;;;;;;;;;;;;:42;36556:8;36523:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;36621:8;36592:48;;36607:12;:10;:12::i;:::-;36592:48;;;36631:8;36592:48;;;;;;:::i;:::-;;;;;;;;36361:287;;:::o;53846:59::-;50520:12;:10;:12::i;:::-;50509:23;;:7;:5;:7::i;:::-;:23;;;50501:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53897:4:::1;53884:10;;:17;;;;;;;;;;;;;;;;;;53846:59::o:0;53310:83::-;53350:10;53372;:17;;;;53365:24;;53310:83;:::o;52837:248::-;50520:12;:10;:12::i;:::-;50509:23;;:7;:5;:7::i;:::-;:23;;;50501:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52928:9:::1;52923:159;52947:9;;:16;;52943:1;:20;52923:159;;;53005:1;52981:26;;:9;;52991:1;52981:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;:26;;;;52973:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;53073:5;53044:12;:26;53057:9;;53067:1;53057:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;53044:26;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;52965:3;;;;;:::i;:::-;;;;52923:159;;;;52837:248:::0;;:::o;52437:150::-;52494:12;52502:3;52494:7;:12::i;:::-;52493:13;52485:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;52540:10;:17;;;;52526:6;:11;52533:3;52526:11;;;;;;;;;;;;;;;:31;;;;52560:10;52576:3;52560:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52437:150;:::o;37447:369::-;37614:28;37624:4;37630:2;37634:7;37614:9;:28::i;:::-;37657:15;:2;:13;;;:15::i;:::-;:76;;;;;37677:56;37708:4;37714:2;37718:7;37727:5;37677:30;:56::i;:::-;37676:57;37657:76;37653:156;;;37757:40;;;;;;;;;;;;;;37653:156;37447:369;;;;:::o;55822:469::-;55900:13;55929:16;55937:7;55929;:16::i;:::-;55919:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;56006:28;56037:10;:8;:10::i;:::-;56006:41;;56071:5;56057:19;;:10;;;;;;;;;;;:19;;;56053:107;;;56081:75;;;;;;;;;;;;;;;;;;;;;;56053:107;56204:1;56179:14;56173:28;:32;:111;;;;;;;;;;;;;;;;;56233:14;56249:18;:7;:16;:18::i;:::-;56216:61;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56173:111;56165:119;;;55822:469;;;;:::o;54438:339::-;54504:12;;;;;;;;;;;54496:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;54584:1;54567:14;:18;54557:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;54664:30;54679:14;51987:18;54664:14;;:30;;;;:::i;:::-;54651:9;:43;;54641:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;54736:37;54746:10;54758:14;54736:9;:37::i;:::-;54438:339;:::o;54251:81::-;50520:12;:10;:12::i;:::-;50509:23;;:7;:5;:7::i;:::-;:23;;;50501:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54316:12:::1;;;;;;;;;;;54315:13;54300:12;;:28;;;;;;;;;;;;;;;;;;54251:81::o:0;53090:117::-;53141:4;53168:1;53154:6;:11;53161:3;53154:11;;;;;;;;;;;;;;;;:15;53150:39;;;53181:4;53174:11;;;;53150:39;53198:5;53191:12;;53090:117;;;;:::o;55614:94::-;50520:12;:10;:12::i;:::-;50509:23;;:7;:5;:7::i;:::-;:23;;;50501:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55697:7:::1;55680:14;:24;;;;55614:94:::0;:::o;54782:111::-;54834:19;54876:5;:13;;;54859:30;;54782:111;;;:::o;36719:164::-;36816:4;36840:18;:25;36859:5;36840:25;;;;;;;;;;;;;;;:35;36866:8;36840:35;;;;;;;;;;;;;;;;;;;;;;;;;36833:42;;36719:164;;;;:::o;53212:93::-;53264:7;53286:10;53297:3;53286:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;53279:22;;53212:93;;;:::o;52086:32::-;;;;;;;;;;;;;:::o;54337:90::-;50520:12;:10;:12::i;:::-;50509:23;;:7;:5;:7::i;:::-;:23;;;50501:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54408:15:::1;;;;;;;;;;;54407:16;54389:15;;:34;;;;;;;;;;;;;;;;;;54337:90::o:0;51198:201::-;50520:12;:10;:12::i;:::-;50509:23;;:7;:5;:7::i;:::-;:23;;;50501:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51307:1:::1;51287:22;;:8;:22;;;;51279:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;51363:28;51382:8;51363:18;:28::i;:::-;51198:201:::0;:::o;52009:42::-;52046:5;52009:42;:::o;52340:30::-;;;;:::o;13440:157::-;13525:4;13564:25;13549:40;;;:11;:40;;;;13542:47;;13440:157;;;:::o;38071:187::-;38128:4;38171:7;38152:15;:13;:15::i;:::-;:26;;:53;;;;;38192:13;;38182:7;:23;38152:53;:98;;;;;38223:11;:20;38235:7;38223:20;;;;;;;;;;;:27;;;;;;;;;;;;38222:28;38152:98;38145:105;;38071:187;;;:::o;26985:98::-;27038:7;27065:10;27058:17;;26985:98;:::o;46241:196::-;46383:2;46356:15;:24;46372:7;46356:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;46421:7;46417:2;46401:28;;46410:5;46401:28;;;;;;;;;;;;46241:196;;;:::o;30492:92::-;30548:7;30492:92;:::o;41184:2130::-;41299:35;41337:21;41350:7;41337:12;:21::i;:::-;41299:59;;41397:4;41375:26;;:13;:18;;;:26;;;41371:67;;41410:28;;;;;;;;;;;;;;41371:67;41451:22;41493:4;41477:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;41514:36;41531:4;41537:12;:10;:12::i;:::-;41514:16;:36::i;:::-;41477:73;:126;;;;41591:12;:10;:12::i;:::-;41567:36;;:20;41579:7;41567:11;:20::i;:::-;:36;;;41477:126;41451:153;;41622:17;41617:66;;41648:35;;;;;;;;;;;;;;41617:66;41712:1;41698:16;;:2;:16;;;41694:52;;;41723:23;;;;;;;;;;;;;;41694:52;41759:43;41781:4;41787:2;41791:7;41800:1;41759:21;:43::i;:::-;41867:35;41884:1;41888:7;41897:4;41867:8;:35::i;:::-;42228:1;42198:12;:18;42211:4;42198:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42272:1;42244:12;:16;42257:2;42244:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42290:31;42324:11;:20;42336:7;42324:20;;;;;;;;;;;42290:54;;42375:2;42359:8;:13;;;:18;;;;;;;;;;;;;;;;;;42425:15;42392:8;:23;;;:49;;;;;;;;;;;;;;;;;;42693:19;42725:1;42715:7;:11;42693:33;;42741:31;42775:11;:24;42787:11;42775:24;;;;;;;;;;;42741:58;;42843:1;42818:27;;:8;:13;;;;;;;;;;;;:27;;;42814:384;;;43028:13;;43013:11;:28;43009:174;;43082:4;43066:8;:13;;;:20;;;;;;;;;;;;;;;;;;43135:13;:28;;;43109:8;:23;;;:54;;;;;;;;;;;;;;;;;;43009:174;42814:384;42173:1036;;;43245:7;43241:2;43226:27;;43235:4;43226:27;;;;;;;;;;;;43264:42;43285:4;43291:2;43295:7;43304:1;43264:20;:42::i;:::-;41288:2026;;41184:2130;;;:::o;33219:1109::-;33281:21;;:::i;:::-;33315:12;33330:7;33315:22;;33398:4;33379:15;:13;:15::i;:::-;:23;;:47;;;;;33413:13;;33406:4;:20;33379:47;33375:886;;;33447:31;33481:11;:17;33493:4;33481:17;;;;;;;;;;;33447:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33522:9;:16;;;33517:729;;33593:1;33567:28;;:9;:14;;;:28;;;33563:101;;33631:9;33624:16;;;;;;33563:101;33966:261;33973:4;33966:261;;;34006:6;;;;;;;;34051:11;:17;34063:4;34051:17;;;;;;;;;;;34039:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34125:1;34099:28;;:9;:14;;;:28;;;34095:109;;34167:9;34160:16;;;;;;34095:109;33966:261;;;33517:729;33428:833;33375:886;34289:31;;;;;;;;;;;;;;33219:1109;;;;:::o;22141:98::-;22199:7;22230:1;22226;:5;;;;:::i;:::-;22219:12;;22141:98;;;;:::o;22879:::-;22937:7;22968:1;22964;:5;;;;:::i;:::-;22957:12;;22879:98;;;;:::o;38266:104::-;38335:27;38345:2;38349:8;38335:27;;;;;;;;;;;;:9;:27::i;:::-;38266:104;;:::o;51559:191::-;51633:16;51652:6;;;;;;;;;;;51633:25;;51678:8;51669:6;;:17;;;;;;;;;;;;;;;;;;51733:8;51702:40;;51723:8;51702:40;;;;;;;;;;;;51622:128;51559:191;:::o;22522:98::-;22580:7;22611:1;22607;:5;;;;:::i;:::-;22600:12;;22522:98;;;;:::o;3357:326::-;3417:4;3674:1;3652:7;:19;;;:23;3645:30;;3357:326;;;:::o;46929:667::-;47092:4;47129:2;47113:36;;;47150:12;:10;:12::i;:::-;47164:4;47170:7;47179:5;47113:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;47109:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47364:1;47347:6;:13;:18;47343:235;;;47393:40;;;;;;;;;;;;;;47343:235;47536:6;47530:13;47521:6;47517:2;47513:15;47506:38;47109:480;47242:45;;;47232:55;;;:6;:55;;;;47225:62;;;46929:667;;;;;;:::o;53503:96::-;53563:13;53588:7;53581:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53503:96;:::o;365:723::-;421:13;651:1;642:5;:10;638:53;;;669:10;;;;;;;;;;;;;;;;;;;;;638:53;701:12;716:5;701:20;;732:14;757:78;772:1;764:4;:9;757:78;;790:8;;;;;:::i;:::-;;;;821:2;813:10;;;;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;845:39;;895:154;911:1;902:5;:10;895:154;;939:1;929:11;;;;;:::i;:::-;;;1006:2;998:5;:10;;;;:::i;:::-;985:2;:24;;;;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1035:2;1026:11;;;;;:::i;:::-;;;895:154;;;1073:6;1059:21;;;;;365:723;;;;:::o;48244:159::-;;;;;:::o;49062:158::-;;;;;:::o;38733:163::-;38856:32;38862:2;38866:8;38876:5;38883:4;38856:5;:32::i;:::-;38733:163;;;:::o;39155:1775::-;39294:20;39317:13;;39294:36;;39359:1;39345:16;;:2;:16;;;39341:48;;;39370:19;;;;;;;;;;;;;;39341:48;39416:1;39404:8;:13;39400:44;;;39426:18;;;;;;;;;;;;;;39400:44;39457:61;39487:1;39491:2;39495:12;39509:8;39457:21;:61::i;:::-;39830:8;39795:12;:16;39808:2;39795:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39894:8;39854:12;:16;39867:2;39854:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39953:2;39920:11;:25;39932:12;39920:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;40020:15;39970:11;:25;39982:12;39970:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;40053:20;40076:12;40053:35;;40103:11;40132:8;40117:12;:23;40103:37;;40161:4;:23;;;;;40169:15;:2;:13;;;:15::i;:::-;40161:23;40157:641;;;40205:314;40261:12;40257:2;40236:38;;40253:1;40236:38;;;;;;;;;;;;40302:69;40341:1;40345:2;40349:14;;;;;;40365:5;40302:30;:69::i;:::-;40297:174;;40407:40;;;;;;;;;;;;;;40297:174;40514:3;40498:12;:19;;40205:314;;40600:12;40583:13;;:29;40579:43;;40614:8;;;40579:43;40157:641;;;40663:120;40719:14;;;;;;40715:2;40694:40;;40711:1;40694:40;;;;;;;;;;;;40778:3;40762:12;:19;;40663:120;;40157:641;40828:12;40812:13;:28;;;;39770:1082;;40862:60;40891:1;40895:2;40899:12;40913:8;40862:20;:60::i;:::-;39283:1647;39155:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:137::-;1761:5;1799:6;1786:20;1777:29;;1815:32;1841:5;1815:32;:::i;:::-;1716:137;;;;:::o;1859:141::-;1915:5;1946:6;1940:13;1931:22;;1962:32;1988:5;1962:32;:::i;:::-;1859:141;;;;:::o;2019:338::-;2074:5;2123:3;2116:4;2108:6;2104:17;2100:27;2090:122;;2131:79;;:::i;:::-;2090:122;2248:6;2235:20;2273:78;2347:3;2339:6;2332:4;2324:6;2320:17;2273:78;:::i;:::-;2264:87;;2080:277;2019:338;;;;:::o;2377:340::-;2433:5;2482:3;2475:4;2467:6;2463:17;2459:27;2449:122;;2490:79;;:::i;:::-;2449:122;2607:6;2594:20;2632:79;2707:3;2699:6;2692:4;2684:6;2680:17;2632:79;:::i;:::-;2623:88;;2439:278;2377:340;;;;:::o;2723:139::-;2769:5;2807:6;2794:20;2785:29;;2823:33;2850:5;2823:33;:::i;:::-;2723:139;;;;:::o;2868:329::-;2927:6;2976:2;2964:9;2955:7;2951:23;2947:32;2944:119;;;2982:79;;:::i;:::-;2944:119;3102:1;3127:53;3172:7;3163:6;3152:9;3148:22;3127:53;:::i;:::-;3117:63;;3073:117;2868:329;;;;:::o;3203:474::-;3271:6;3279;3328:2;3316:9;3307:7;3303:23;3299:32;3296:119;;;3334:79;;:::i;:::-;3296:119;3454:1;3479:53;3524:7;3515:6;3504:9;3500:22;3479:53;:::i;:::-;3469:63;;3425:117;3581:2;3607:53;3652:7;3643:6;3632:9;3628:22;3607:53;:::i;:::-;3597:63;;3552:118;3203:474;;;;;:::o;3683:619::-;3760:6;3768;3776;3825:2;3813:9;3804:7;3800:23;3796:32;3793:119;;;3831:79;;:::i;:::-;3793:119;3951:1;3976:53;4021:7;4012:6;4001:9;3997:22;3976:53;:::i;:::-;3966:63;;3922:117;4078:2;4104:53;4149:7;4140:6;4129:9;4125:22;4104:53;:::i;:::-;4094:63;;4049:118;4206:2;4232:53;4277:7;4268:6;4257:9;4253:22;4232:53;:::i;:::-;4222:63;;4177:118;3683:619;;;;;:::o;4308:943::-;4403:6;4411;4419;4427;4476:3;4464:9;4455:7;4451:23;4447:33;4444:120;;;4483:79;;:::i;:::-;4444:120;4603:1;4628:53;4673:7;4664:6;4653:9;4649:22;4628:53;:::i;:::-;4618:63;;4574:117;4730:2;4756:53;4801:7;4792:6;4781:9;4777:22;4756:53;:::i;:::-;4746:63;;4701:118;4858:2;4884:53;4929:7;4920:6;4909:9;4905:22;4884:53;:::i;:::-;4874:63;;4829:118;5014:2;5003:9;4999:18;4986:32;5045:18;5037:6;5034:30;5031:117;;;5067:79;;:::i;:::-;5031:117;5172:62;5226:7;5217:6;5206:9;5202:22;5172:62;:::i;:::-;5162:72;;4957:287;4308:943;;;;;;;:::o;5257:468::-;5322:6;5330;5379:2;5367:9;5358:7;5354:23;5350:32;5347:119;;;5385:79;;:::i;:::-;5347:119;5505:1;5530:53;5575:7;5566:6;5555:9;5551:22;5530:53;:::i;:::-;5520:63;;5476:117;5632:2;5658:50;5700:7;5691:6;5680:9;5676:22;5658:50;:::i;:::-;5648:60;;5603:115;5257:468;;;;;:::o;5731:474::-;5799:6;5807;5856:2;5844:9;5835:7;5831:23;5827:32;5824:119;;;5862:79;;:::i;:::-;5824:119;5982:1;6007:53;6052:7;6043:6;6032:9;6028:22;6007:53;:::i;:::-;5997:63;;5953:117;6109:2;6135:53;6180:7;6171:6;6160:9;6156:22;6135:53;:::i;:::-;6125:63;;6080:118;5731:474;;;;;:::o;6211:559::-;6297:6;6305;6354:2;6342:9;6333:7;6329:23;6325:32;6322:119;;;6360:79;;:::i;:::-;6322:119;6508:1;6497:9;6493:17;6480:31;6538:18;6530:6;6527:30;6524:117;;;6560:79;;:::i;:::-;6524:117;6673:80;6745:7;6736:6;6725:9;6721:22;6673:80;:::i;:::-;6655:98;;;;6451:312;6211:559;;;;;:::o;6776:327::-;6834:6;6883:2;6871:9;6862:7;6858:23;6854:32;6851:119;;;6889:79;;:::i;:::-;6851:119;7009:1;7034:52;7078:7;7069:6;7058:9;7054:22;7034:52;:::i;:::-;7024:62;;6980:116;6776:327;;;;:::o;7109:349::-;7178:6;7227:2;7215:9;7206:7;7202:23;7198:32;7195:119;;;7233:79;;:::i;:::-;7195:119;7353:1;7378:63;7433:7;7424:6;7413:9;7409:22;7378:63;:::i;:::-;7368:73;;7324:127;7109:349;;;;:::o;7464:509::-;7533:6;7582:2;7570:9;7561:7;7557:23;7553:32;7550:119;;;7588:79;;:::i;:::-;7550:119;7736:1;7725:9;7721:17;7708:31;7766:18;7758:6;7755:30;7752:117;;;7788:79;;:::i;:::-;7752:117;7893:63;7948:7;7939:6;7928:9;7924:22;7893:63;:::i;:::-;7883:73;;7679:287;7464:509;;;;:::o;7979:329::-;8038:6;8087:2;8075:9;8066:7;8062:23;8058:32;8055:119;;;8093:79;;:::i;:::-;8055:119;8213:1;8238:53;8283:7;8274:6;8263:9;8259:22;8238:53;:::i;:::-;8228:63;;8184:117;7979:329;;;;:::o;8314:474::-;8382:6;8390;8439:2;8427:9;8418:7;8414:23;8410:32;8407:119;;;8445:79;;:::i;:::-;8407:119;8565:1;8590:53;8635:7;8626:6;8615:9;8611:22;8590:53;:::i;:::-;8580:63;;8536:117;8692:2;8718:53;8763:7;8754:6;8743:9;8739:22;8718:53;:::i;:::-;8708:63;;8663:118;8314:474;;;;;:::o;8794:118::-;8881:24;8899:5;8881:24;:::i;:::-;8876:3;8869:37;8794:118;;:::o;8918:109::-;8999:21;9014:5;8999:21;:::i;:::-;8994:3;8987:34;8918:109;;:::o;9033:360::-;9119:3;9147:38;9179:5;9147:38;:::i;:::-;9201:70;9264:6;9259:3;9201:70;:::i;:::-;9194:77;;9280:52;9325:6;9320:3;9313:4;9306:5;9302:16;9280:52;:::i;:::-;9357:29;9379:6;9357:29;:::i;:::-;9352:3;9348:39;9341:46;;9123:270;9033:360;;;;:::o;9399:364::-;9487:3;9515:39;9548:5;9515:39;:::i;:::-;9570:71;9634:6;9629:3;9570:71;:::i;:::-;9563:78;;9650:52;9695:6;9690:3;9683:4;9676:5;9672:16;9650:52;:::i;:::-;9727:29;9749:6;9727:29;:::i;:::-;9722:3;9718:39;9711:46;;9491:272;9399:364;;;;:::o;9769:377::-;9875:3;9903:39;9936:5;9903:39;:::i;:::-;9958:89;10040:6;10035:3;9958:89;:::i;:::-;9951:96;;10056:52;10101:6;10096:3;10089:4;10082:5;10078:16;10056:52;:::i;:::-;10133:6;10128:3;10124:16;10117:23;;9879:267;9769:377;;;;:::o;10152:366::-;10294:3;10315:67;10379:2;10374:3;10315:67;:::i;:::-;10308:74;;10391:93;10480:3;10391:93;:::i;:::-;10509:2;10504:3;10500:12;10493:19;;10152:366;;;:::o;10524:::-;10666:3;10687:67;10751:2;10746:3;10687:67;:::i;:::-;10680:74;;10763:93;10852:3;10763:93;:::i;:::-;10881:2;10876:3;10872:12;10865:19;;10524:366;;;:::o;10896:::-;11038:3;11059:67;11123:2;11118:3;11059:67;:::i;:::-;11052:74;;11135:93;11224:3;11135:93;:::i;:::-;11253:2;11248:3;11244:12;11237:19;;10896:366;;;:::o;11268:::-;11410:3;11431:67;11495:2;11490:3;11431:67;:::i;:::-;11424:74;;11507:93;11596:3;11507:93;:::i;:::-;11625:2;11620:3;11616:12;11609:19;;11268:366;;;:::o;11640:::-;11782:3;11803:67;11867:2;11862:3;11803:67;:::i;:::-;11796:74;;11879:93;11968:3;11879:93;:::i;:::-;11997:2;11992:3;11988:12;11981:19;;11640:366;;;:::o;12012:::-;12154:3;12175:67;12239:2;12234:3;12175:67;:::i;:::-;12168:74;;12251:93;12340:3;12251:93;:::i;:::-;12369:2;12364:3;12360:12;12353:19;;12012:366;;;:::o;12384:400::-;12544:3;12565:84;12647:1;12642:3;12565:84;:::i;:::-;12558:91;;12658:93;12747:3;12658:93;:::i;:::-;12776:1;12771:3;12767:11;12760:18;;12384:400;;;:::o;12790:366::-;12932:3;12953:67;13017:2;13012:3;12953:67;:::i;:::-;12946:74;;13029:93;13118:3;13029:93;:::i;:::-;13147:2;13142:3;13138:12;13131:19;;12790:366;;;:::o;13162:::-;13304:3;13325:67;13389:2;13384:3;13325:67;:::i;:::-;13318:74;;13401:93;13490:3;13401:93;:::i;:::-;13519:2;13514:3;13510:12;13503:19;;13162:366;;;:::o;13534:::-;13676:3;13697:67;13761:2;13756:3;13697:67;:::i;:::-;13690:74;;13773:93;13862:3;13773:93;:::i;:::-;13891:2;13886:3;13882:12;13875:19;;13534:366;;;:::o;13906:::-;14048:3;14069:67;14133:2;14128:3;14069:67;:::i;:::-;14062:74;;14145:93;14234:3;14145:93;:::i;:::-;14263:2;14258:3;14254:12;14247:19;;13906:366;;;:::o;14278:::-;14420:3;14441:67;14505:2;14500:3;14441:67;:::i;:::-;14434:74;;14517:93;14606:3;14517:93;:::i;:::-;14635:2;14630:3;14626:12;14619:19;;14278:366;;;:::o;14650:398::-;14809:3;14830:83;14911:1;14906:3;14830:83;:::i;:::-;14823:90;;14922:93;15011:3;14922:93;:::i;:::-;15040:1;15035:3;15031:11;15024:18;;14650:398;;;:::o;15054:366::-;15196:3;15217:67;15281:2;15276:3;15217:67;:::i;:::-;15210:74;;15293:93;15382:3;15293:93;:::i;:::-;15411:2;15406:3;15402:12;15395:19;;15054:366;;;:::o;15426:::-;15568:3;15589:67;15653:2;15648:3;15589:67;:::i;:::-;15582:74;;15665:93;15754:3;15665:93;:::i;:::-;15783:2;15778:3;15774:12;15767:19;;15426:366;;;:::o;15798:::-;15940:3;15961:67;16025:2;16020:3;15961:67;:::i;:::-;15954:74;;16037:93;16126:3;16037:93;:::i;:::-;16155:2;16150:3;16146:12;16139:19;;15798:366;;;:::o;16170:118::-;16257:24;16275:5;16257:24;:::i;:::-;16252:3;16245:37;16170:118;;:::o;16294:701::-;16575:3;16597:95;16688:3;16679:6;16597:95;:::i;:::-;16590:102;;16709:95;16800:3;16791:6;16709:95;:::i;:::-;16702:102;;16821:148;16965:3;16821:148;:::i;:::-;16814:155;;16986:3;16979:10;;16294:701;;;;;:::o;17001:379::-;17185:3;17207:147;17350:3;17207:147;:::i;:::-;17200:154;;17371:3;17364:10;;17001:379;;;:::o;17386:222::-;17479:4;17517:2;17506:9;17502:18;17494:26;;17530:71;17598:1;17587:9;17583:17;17574:6;17530:71;:::i;:::-;17386:222;;;;:::o;17614:640::-;17809:4;17847:3;17836:9;17832:19;17824:27;;17861:71;17929:1;17918:9;17914:17;17905:6;17861:71;:::i;:::-;17942:72;18010:2;17999:9;17995:18;17986:6;17942:72;:::i;:::-;18024;18092:2;18081:9;18077:18;18068:6;18024:72;:::i;:::-;18143:9;18137:4;18133:20;18128:2;18117:9;18113:18;18106:48;18171:76;18242:4;18233:6;18171:76;:::i;:::-;18163:84;;17614:640;;;;;;;:::o;18260:210::-;18347:4;18385:2;18374:9;18370:18;18362:26;;18398:65;18460:1;18449:9;18445:17;18436:6;18398:65;:::i;:::-;18260:210;;;;:::o;18476:313::-;18589:4;18627:2;18616:9;18612:18;18604:26;;18676:9;18670:4;18666:20;18662:1;18651:9;18647:17;18640:47;18704:78;18777:4;18768:6;18704:78;:::i;:::-;18696:86;;18476:313;;;;:::o;18795:419::-;18961:4;18999:2;18988:9;18984:18;18976:26;;19048:9;19042:4;19038:20;19034:1;19023:9;19019:17;19012:47;19076:131;19202:4;19076:131;:::i;:::-;19068:139;;18795:419;;;:::o;19220:::-;19386:4;19424:2;19413:9;19409:18;19401:26;;19473:9;19467:4;19463:20;19459:1;19448:9;19444:17;19437:47;19501:131;19627:4;19501:131;:::i;:::-;19493:139;;19220:419;;;:::o;19645:::-;19811:4;19849:2;19838:9;19834:18;19826:26;;19898:9;19892:4;19888:20;19884:1;19873:9;19869:17;19862:47;19926:131;20052:4;19926:131;:::i;:::-;19918:139;;19645:419;;;:::o;20070:::-;20236:4;20274:2;20263:9;20259:18;20251:26;;20323:9;20317:4;20313:20;20309:1;20298:9;20294:17;20287:47;20351:131;20477:4;20351:131;:::i;:::-;20343:139;;20070:419;;;:::o;20495:::-;20661:4;20699:2;20688:9;20684:18;20676:26;;20748:9;20742:4;20738:20;20734:1;20723:9;20719:17;20712:47;20776:131;20902:4;20776:131;:::i;:::-;20768:139;;20495:419;;;:::o;20920:::-;21086:4;21124:2;21113:9;21109:18;21101:26;;21173:9;21167:4;21163:20;21159:1;21148:9;21144:17;21137:47;21201:131;21327:4;21201:131;:::i;:::-;21193:139;;20920:419;;;:::o;21345:::-;21511:4;21549:2;21538:9;21534:18;21526:26;;21598:9;21592:4;21588:20;21584:1;21573:9;21569:17;21562:47;21626:131;21752:4;21626:131;:::i;:::-;21618:139;;21345:419;;;:::o;21770:::-;21936:4;21974:2;21963:9;21959:18;21951:26;;22023:9;22017:4;22013:20;22009:1;21998:9;21994:17;21987:47;22051:131;22177:4;22051:131;:::i;:::-;22043:139;;21770:419;;;:::o;22195:::-;22361:4;22399:2;22388:9;22384:18;22376:26;;22448:9;22442:4;22438:20;22434:1;22423:9;22419:17;22412:47;22476:131;22602:4;22476:131;:::i;:::-;22468:139;;22195:419;;;:::o;22620:::-;22786:4;22824:2;22813:9;22809:18;22801:26;;22873:9;22867:4;22863:20;22859:1;22848:9;22844:17;22837:47;22901:131;23027:4;22901:131;:::i;:::-;22893:139;;22620:419;;;:::o;23045:::-;23211:4;23249:2;23238:9;23234:18;23226:26;;23298:9;23292:4;23288:20;23284:1;23273:9;23269:17;23262:47;23326:131;23452:4;23326:131;:::i;:::-;23318:139;;23045:419;;;:::o;23470:::-;23636:4;23674:2;23663:9;23659:18;23651:26;;23723:9;23717:4;23713:20;23709:1;23698:9;23694:17;23687:47;23751:131;23877:4;23751:131;:::i;:::-;23743:139;;23470:419;;;:::o;23895:::-;24061:4;24099:2;24088:9;24084:18;24076:26;;24148:9;24142:4;24138:20;24134:1;24123:9;24119:17;24112:47;24176:131;24302:4;24176:131;:::i;:::-;24168:139;;23895:419;;;:::o;24320:::-;24486:4;24524:2;24513:9;24509:18;24501:26;;24573:9;24567:4;24563:20;24559:1;24548:9;24544:17;24537:47;24601:131;24727:4;24601:131;:::i;:::-;24593:139;;24320:419;;;:::o;24745:222::-;24838:4;24876:2;24865:9;24861:18;24853:26;;24889:71;24957:1;24946:9;24942:17;24933:6;24889:71;:::i;:::-;24745:222;;;;:::o;24973:129::-;25007:6;25034:20;;:::i;:::-;25024:30;;25063:33;25091:4;25083:6;25063:33;:::i;:::-;24973:129;;;:::o;25108:75::-;25141:6;25174:2;25168:9;25158:19;;25108:75;:::o;25189:307::-;25250:4;25340:18;25332:6;25329:30;25326:56;;;25362:18;;:::i;:::-;25326:56;25400:29;25422:6;25400:29;:::i;:::-;25392:37;;25484:4;25478;25474:15;25466:23;;25189:307;;;:::o;25502:308::-;25564:4;25654:18;25646:6;25643:30;25640:56;;;25676:18;;:::i;:::-;25640:56;25714:29;25736:6;25714:29;:::i;:::-;25706:37;;25798:4;25792;25788:15;25780:23;;25502:308;;;:::o;25816:98::-;25867:6;25901:5;25895:12;25885:22;;25816:98;;;:::o;25920:99::-;25972:6;26006:5;26000:12;25990:22;;25920:99;;;:::o;26025:168::-;26108:11;26142:6;26137:3;26130:19;26182:4;26177:3;26173:14;26158:29;;26025:168;;;;:::o;26199:147::-;26300:11;26337:3;26322:18;;26199:147;;;;:::o;26352:169::-;26436:11;26470:6;26465:3;26458:19;26510:4;26505:3;26501:14;26486:29;;26352:169;;;;:::o;26527:148::-;26629:11;26666:3;26651:18;;26527:148;;;;:::o;26681:305::-;26721:3;26740:20;26758:1;26740:20;:::i;:::-;26735:25;;26774:20;26792:1;26774:20;:::i;:::-;26769:25;;26928:1;26860:66;26856:74;26853:1;26850:81;26847:107;;;26934:18;;:::i;:::-;26847:107;26978:1;26975;26971:9;26964:16;;26681:305;;;;:::o;26992:185::-;27032:1;27049:20;27067:1;27049:20;:::i;:::-;27044:25;;27083:20;27101:1;27083:20;:::i;:::-;27078:25;;27122:1;27112:35;;27127:18;;:::i;:::-;27112:35;27169:1;27166;27162:9;27157:14;;26992:185;;;;:::o;27183:348::-;27223:7;27246:20;27264:1;27246:20;:::i;:::-;27241:25;;27280:20;27298:1;27280:20;:::i;:::-;27275:25;;27468:1;27400:66;27396:74;27393:1;27390:81;27385:1;27378:9;27371:17;27367:105;27364:131;;;27475:18;;:::i;:::-;27364:131;27523:1;27520;27516:9;27505:20;;27183:348;;;;:::o;27537:191::-;27577:4;27597:20;27615:1;27597:20;:::i;:::-;27592:25;;27631:20;27649:1;27631:20;:::i;:::-;27626:25;;27670:1;27667;27664:8;27661:34;;;27675:18;;:::i;:::-;27661:34;27720:1;27717;27713:9;27705:17;;27537:191;;;;:::o;27734:96::-;27771:7;27800:24;27818:5;27800:24;:::i;:::-;27789:35;;27734:96;;;:::o;27836:90::-;27870:7;27913:5;27906:13;27899:21;27888:32;;27836:90;;;:::o;27932:149::-;27968:7;28008:66;28001:5;27997:78;27986:89;;27932:149;;;:::o;28087:126::-;28124:7;28164:42;28157:5;28153:54;28142:65;;28087:126;;;:::o;28219:77::-;28256:7;28285:5;28274:16;;28219:77;;;:::o;28302:154::-;28386:6;28381:3;28376;28363:30;28448:1;28439:6;28434:3;28430:16;28423:27;28302:154;;;:::o;28462:307::-;28530:1;28540:113;28554:6;28551:1;28548:13;28540:113;;;28639:1;28634:3;28630:11;28624:18;28620:1;28615:3;28611:11;28604:39;28576:2;28573:1;28569:10;28564:15;;28540:113;;;28671:6;28668:1;28665:13;28662:101;;;28751:1;28742:6;28737:3;28733:16;28726:27;28662:101;28511:258;28462:307;;;:::o;28775:320::-;28819:6;28856:1;28850:4;28846:12;28836:22;;28903:1;28897:4;28893:12;28924:18;28914:81;;28980:4;28972:6;28968:17;28958:27;;28914:81;29042:2;29034:6;29031:14;29011:18;29008:38;29005:84;;;29061:18;;:::i;:::-;29005:84;28826:269;28775:320;;;:::o;29101:281::-;29184:27;29206:4;29184:27;:::i;:::-;29176:6;29172:40;29314:6;29302:10;29299:22;29278:18;29266:10;29263:34;29260:62;29257:88;;;29325:18;;:::i;:::-;29257:88;29365:10;29361:2;29354:22;29144:238;29101:281;;:::o;29388:233::-;29427:3;29450:24;29468:5;29450:24;:::i;:::-;29441:33;;29496:66;29489:5;29486:77;29483:103;;;29566:18;;:::i;:::-;29483:103;29613:1;29606:5;29602:13;29595:20;;29388:233;;;:::o;29627:176::-;29659:1;29676:20;29694:1;29676:20;:::i;:::-;29671:25;;29710:20;29728:1;29710:20;:::i;:::-;29705:25;;29749:1;29739:35;;29754:18;;:::i;:::-;29739:35;29795:1;29792;29788:9;29783:14;;29627:176;;;;:::o;29809:180::-;29857:77;29854:1;29847:88;29954:4;29951:1;29944:15;29978:4;29975:1;29968:15;29995:180;30043:77;30040:1;30033:88;30140:4;30137:1;30130:15;30164:4;30161:1;30154:15;30181:180;30229:77;30226:1;30219:88;30326:4;30323:1;30316:15;30350:4;30347:1;30340:15;30367:180;30415:77;30412:1;30405:88;30512:4;30509:1;30502:15;30536:4;30533:1;30526:15;30553:180;30601:77;30598:1;30591:88;30698:4;30695:1;30688:15;30722:4;30719:1;30712:15;30739:117;30848:1;30845;30838:12;30862:117;30971:1;30968;30961:12;30985:117;31094:1;31091;31084:12;31108:117;31217:1;31214;31207:12;31231:117;31340:1;31337;31330:12;31354:117;31463:1;31460;31453:12;31477:102;31518:6;31569:2;31565:7;31560:2;31553:5;31549:14;31545:28;31535:38;;31477:102;;;:::o;31585:229::-;31725:34;31721:1;31713:6;31709:14;31702:58;31794:12;31789:2;31781:6;31777:15;31770:37;31585:229;:::o;31820:225::-;31960:34;31956:1;31948:6;31944:14;31937:58;32029:8;32024:2;32016:6;32012:15;32005:33;31820:225;:::o;32051:181::-;32191:33;32187:1;32179:6;32175:14;32168:57;32051:181;:::o;32238:220::-;32378:34;32374:1;32366:6;32362:14;32355:58;32447:3;32442:2;32434:6;32430:15;32423:28;32238:220;:::o;32464:182::-;32604:34;32600:1;32592:6;32588:14;32581:58;32464:182;:::o;32652:181::-;32792:33;32788:1;32780:6;32776:14;32769:57;32652:181;:::o;32839:155::-;32979:7;32975:1;32967:6;32963:14;32956:31;32839:155;:::o;33000:182::-;33140:34;33136:1;33128:6;33124:14;33117:58;33000:182;:::o;33188:176::-;33328:28;33324:1;33316:6;33312:14;33305:52;33188:176;:::o;33370:228::-;33510:34;33506:1;33498:6;33494:14;33487:58;33579:11;33574:2;33566:6;33562:15;33555:36;33370:228;:::o;33604:234::-;33744:34;33740:1;33732:6;33728:14;33721:58;33813:17;33808:2;33800:6;33796:15;33789:42;33604:234;:::o;33844:160::-;33984:12;33980:1;33972:6;33968:14;33961:36;33844:160;:::o;34010:114::-;;:::o;34130:171::-;34270:23;34266:1;34258:6;34254:14;34247:47;34130:171;:::o;34307:178::-;34447:30;34443:1;34435:6;34431:14;34424:54;34307:178;:::o;34491:182::-;34631:34;34627:1;34619:6;34615:14;34608:58;34491:182;:::o;34679:122::-;34752:24;34770:5;34752:24;:::i;:::-;34745:5;34742:35;34732:63;;34791:1;34788;34781:12;34732:63;34679:122;:::o;34807:116::-;34877:21;34892:5;34877:21;:::i;:::-;34870:5;34867:32;34857:60;;34913:1;34910;34903:12;34857:60;34807:116;:::o;34929:120::-;35001:23;35018:5;35001:23;:::i;:::-;34994:5;34991:34;34981:62;;35039:1;35036;35029:12;34981:62;34929:120;:::o;35055:122::-;35128:24;35146:5;35128:24;:::i;:::-;35121:5;35118:35;35108:63;;35167:1;35164;35157:12;35108:63;35055:122;:::o

Swarm Source

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