ETH Price: $3,450.99 (-0.83%)
Gas: 3 Gwei

Token

GangApeBlingClub (GABC)
 

Overview

Max Total Supply

4 GABC

Holders

2

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 GABC
0xe7957347de21f15644b1b2f23f706e9043b246fe
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:
GangApeBlingClub

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

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

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

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

/**
 *Submitted for verification at Etherscan.io on 2022-07-25
 */

/**
 *Submitted for verification at Etherscan.io on 2022-06-27
 */

/**
 *Submitted for verification at Etherscan.io on 2022-06-23
 */

// SPDX-License-Identifier: MIT

// File 1: Address.sol

// OpenZeppelin Contracts v4.4.1 (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/security/ReentrancyGuard.sol

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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

// FILE 2: 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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File 3: 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/Counters.sol

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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File 4: 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() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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"
        );
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File 5: 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 6: 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 7: 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 returns (string memory);
}

// File 8: 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 9: ERC721.sol

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

pragma solidity ^0.8.0;

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @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
        virtual
        override
        returns (uint256)
    {
        require(
            owner != address(0),
            "ERC721: balance query for the zero address"
        );
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        address owner = _owners[tokenId];
        require(
            owner != address(0),
            "ERC721: owner query for nonexistent token"
        );
        return owner;
    }

    /**
     * @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
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

        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 overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );
        if (to.isContract()) {
            revert("Token transfer to contract address is not allowed.");
        } else {
            _approve(to, tokenId);
        }
        // _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        require(
            _exists(tokenId),
            "ERC721: approved query for nonexistent token"
        );

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        _setApprovalForAll(_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 {
        //solhint-disable-next-line max-line-length
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );

        _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 {
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @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`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId)
        internal
        view
        virtual
        returns (bool)
    {
        require(
            _exists(tokenId),
            "ERC721: operator query for nonexistent token"
        );
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner ||
            getApproved(tokenId) == spender ||
            isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

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

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * 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
    ) internal virtual {
        require(
            ERC721.ownerOf(tokenId) == from,
            "ERC721: transfer from incorrect owner"
        );
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File 10: IERC721Enumerable.sol

pragma solidity ^0.8.0;

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

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

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

// File 11: ERC721Enumerable.sol

pragma solidity ^0.8.0;

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            index < ERC721.balanceOf(owner),
            "ERC721Enumerable: owner index out of bounds"
        );
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            index < ERC721Enumerable.totalSupply(),
            "ERC721Enumerable: global index out of bounds"
        );
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId)
        private
    {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

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

pragma solidity ^0.8.0;

contract ERC721A is
    Context,
    ERC165,
    IERC721,
    IERC721Metadata,
    IERC721Enumerable
{
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index)
        public
        view
        override
        returns (uint256)
    {
        require(index < totalSupply(), "ERC721A: global index out of bounds");
        return index;
    }

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

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

        revert("ERC721A: unable to get token of owner by index");
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        require(
            owner != address(0),
            "ERC721A: balance query for the zero address"
        );
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        require(
            owner != address(0),
            "ERC721A: number minted query for the zero address"
        );
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId)
        internal
        view
        returns (TokenOwnership memory)
    {
        require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

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

        revert("ERC721A: unable to determine the owner of token");
    }

    /**
     * @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)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

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

    /**
     * @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);
        require(to != owner, "ERC721A: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721A: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId)
        public
        view
        override
        returns (address)
    {
        require(
            _exists(tokenId),
            "ERC721A: approved query for nonexistent token"
        );

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        override
    {
        require(operator != _msgSender(), "ERC721A: approve to caller");

        _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 override {
        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721A: transfer to non ERC721Receiver implementer"
        );
    }

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

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

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

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

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

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

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

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe) {
                    require(
                        _checkOnERC721Received(
                            address(0),
                            to,
                            updatedIndex,
                            _data
                        ),
                        "ERC721A: transfer to non ERC721Receiver implementer"
                    );
                }

                updatedIndex++;
            }

            currentIndex = updatedIndex;
        }

        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

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

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

        require(
            isApprovedOrOwner,
            "ERC721A: transfer caller is not owner nor approved"
        );

        require(
            prevOwnership.addr == from,
            "ERC721A: transfer from incorrect owner"
        );
        require(to != address(0), "ERC721A: transfer to the zero address");

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

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

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

// FILE 14: GABC.sol

pragma solidity ^0.8.0;

contract GangApeBlingClub is ERC721A, Ownable, ReentrancyGuard {
    using Strings for uint256;
    using Counters for Counters.Counter;

    enum SaleState {
        PAUSE,
        WHITELIST_SALE,
        PUBLIC_SALE
    }

    string private uriPrefix = "";
    string public uriSuffix = ".json";
    string private hiddenMetadataUri;

    constructor() ERC721A("GangApeBlingClub", "GABC") {
        setHiddenMetadataUri("ipfs://__CID__/hidden.json");
    }

    uint256 public cost = 0.0035 ether; // public price
    uint256 public wlCost = 0; //  whitelist mint price
    uint256 public maxPerTx = 20; // max per tnx
    uint256 public maxWLSupply = 1000; // whitelist wallet
    uint256 public maxSupply = 5555; // total supply
    uint256 public nftPerAddressLimit = 2; // max per tnx whitelist

    bool public revealed = true;
    bool public onlyWhitelisted = true;
    address[] public whitelistedAddresses;
    SaleState public saleState;

    mapping(address => uint256) private _addressMintedBalance;

    function withdraw() external onlyOwner {
        (bool success, ) = payable(msg.sender).call{
            value: address(this).balance
        }("");
        require(success, "Transfer failed.");
    }

    // Public Mint
    function publicMint(uint256 _count) external payable {
        uint256 supply = totalSupply();
        require(saleState == SaleState.PUBLIC_SALE, "NOT_PUBLIC_SALE");
        require(_count > 0, "Minimum 1 NFT has to be minted per transaction");
        require(_count <= maxPerTx, "Max per TX reached.");
        require(supply + _count <= maxSupply, "No more");

        if (msg.sender != owner()) {
            _addressMintedBalance[msg.sender] += _count;

            require(
                msg.value >= _count * cost,
                "Please send the exact amount."
            );
        }

        _safeMint(msg.sender, _count);
    }

    // Whitelist Mint
    function whitelistMint(uint256 _count) external payable {
        uint256 supply = totalSupply();
        require(saleState == SaleState.WHITELIST_SALE, "NOT_WHITELIST_SALE");
        require(_count > 0, "Minimum 1 NFT has to be minted per transaction");
        require(_count <= maxPerTx, "Max per TX reached.");
        require(supply + _count <= maxWLSupply, "No more");

        if (msg.sender != owner()) {
            if (onlyWhitelisted == true) {
                require(isWhitelisted(msg.sender), "User is not whitelisted");
                uint256 ownerMintedCount = _addressMintedBalance[msg.sender];
                require(
                    ownerMintedCount + _count <= nftPerAddressLimit,
                    "Max NFT per address exceeded"
                );
            }
            _addressMintedBalance[msg.sender] += _count;
            require(
                msg.value >= _count * wlCost,
                "Please send the exact amount."
            );
        }

        _safeMint(msg.sender, _count);
    }

    function walletOfOwner(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
        uint256 currentTokenId = 1;
        uint256 ownedTokenIndex = 0;

        while (
            ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply
        ) {
            address currentTokenOwner = ownerOf(currentTokenId);
            if (currentTokenOwner == _owner) {
                ownedTokenIds[ownedTokenIndex] = currentTokenId;
                ownedTokenIndex++;
            }
            currentTokenId++;
        }
        return ownedTokenIds;
    }

    function tokenURI(uint256 _tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(_tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );
        if (revealed == false) {
            return hiddenMetadataUri;
        }
        string memory currentBaseURI = _baseURI();
        return
            bytes(currentBaseURI).length > 0
                ? string(
                    abi.encodePacked(
                        currentBaseURI,
                        _tokenId.toString(),
                        uriSuffix
                    )
                )
                : "";
    }

    function isWhitelisted(address _user) public view returns (bool) {
        for (uint256 i = 0; i < whitelistedAddresses.length; i++) {
            if (whitelistedAddresses[i] == _user) {
                return true;
            }
        }
        return false;
    }

    function whitelistUsers(address[] calldata _users) public onlyOwner {
        delete whitelistedAddresses;
        whitelistedAddresses = _users;
    }

    function setState(SaleState _state) external onlyOwner {
        saleState = _state;
    }

    function setCost(uint256 _cost) external onlyOwner {
        cost = _cost;
    }

    function setWlCost(uint256 _wlcost) external onlyOwner {
        wlCost = _wlcost;
    }

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

    function setmaxPerTx(uint256 _maxPerTx) public onlyOwner {
        maxPerTx = _maxPerTx;
    }

    function setmaxWLSupply(uint256 _maxWLSupply) public onlyOwner {
        maxWLSupply = _maxWLSupply;
    }

    function setNftPerAddressLimit(uint256 _nftPerAddressLimit)
        public
        onlyOwner
    {
        nftPerAddressLimit = _nftPerAddressLimit;
    }

    function setmaxSupply(uint256 _maxSupply) public onlyOwner {
        maxSupply = _maxSupply;
    }

    function setHiddenMetadataUri(string memory _hiddenMetadataUri)
        public
        onlyOwner
    {
        hiddenMetadataUri = _hiddenMetadataUri;
    }

    function setUriPrefix(string memory _uriPrefix) public onlyOwner {
        uriPrefix = _uriPrefix;
    }

    function setUriSuffix(string memory _uriSuffix) public onlyOwner {
        uriSuffix = _uriSuffix;
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","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":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWLSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyWhitelisted","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":"_count","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleState","outputs":[{"internalType":"enum GangApeBlingClub.SaleState","name":"","type":"uint8"}],"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":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftPerAddressLimit","type":"uint256"}],"name":"setNftPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum GangApeBlingClub.SaleState","name":"_state","type":"uint8"}],"name":"setState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_wlcost","type":"uint256"}],"name":"setWlCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPerTx","type":"uint256"}],"name":"setmaxPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setmaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWLSupply","type":"uint256"}],"name":"setmaxWLSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"whitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistedAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wlCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

608060405260405180602001604052806000815250600990805190602001906200002b92919062000366565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600a90805190602001906200007992919062000366565b50660c6f3b40b6c000600c556000600d556014600e556103e8600f556115b360105560026011556001601260006101000a81548160ff0219169083151502179055506001601260016101000a81548160ff021916908315150217905550348015620000e357600080fd5b506040518060400160405280601081526020017f47616e67417065426c696e67436c7562000000000000000000000000000000008152506040518060400160405280600481526020017f474142430000000000000000000000000000000000000000000000000000000081525081600190805190602001906200016892919062000366565b5080600290805190602001906200018192919062000366565b5050506000620001966200028960201b60201c565b905080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506001600881905550620002836040518060400160405280601a81526020017f697066733a2f2f5f5f4349445f5f2f68696464656e2e6a736f6e0000000000008152506200029160201b60201c565b620004fe565b600033905090565b620002a16200028960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002c76200033c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000320576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000317906200043d565b60405180910390fd5b80600b90805190602001906200033892919062000366565b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003749062000470565b90600052602060002090601f016020900481019282620003985760008555620003e4565b82601f10620003b357805160ff1916838001178555620003e4565b82800160010185558215620003e4579182015b82811115620003e3578251825591602001919060010190620003c6565b5b509050620003f39190620003f7565b5090565b5b8082111562000412576000816000905550600101620003f8565b5090565b6000620004256020836200045f565b91506200043282620004d5565b602082019050919050565b60006020820190508181036000830152620004588162000416565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200048957607f821691505b60208210811415620004a0576200049f620004a6565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b61574a806200050e6000396000f3fe6080604052600436106102885760003560e01c8063603f4d521161015a578063ba4e5c49116100c1578063e0a808531161007a578063e0a80853146109c2578063e985e9c5146109eb578063edec5f2714610a28578063f12f6d5d14610a51578063f2fde38b14610a7a578063f968adbe14610aa357610288565b8063ba4e5c491461089e578063ba7d2c76146108db578063c87b56dd14610906578063d0eb26b014610943578063d5abeb011461096c578063d70a28d11461099757610288565b8063868ff4a211610113578063868ff4a2146107af5780638da5cb5b146107cb57806395d89b41146107f65780639c70b51214610821578063a22cb4651461084c578063b88d4fde1461087557610288565b8063603f4d52146106a15780636352211e146106cc57806370a0823114610709578063715018a6146107465780637ec4a6591461075d578063805dcae51461078657610288565b80633af32abf116101fe5780634f6ccce7116101b75780634f6ccce7146105915780634fdd43cb146105ce578063515dc327146105f757806351830227146106225780635503a0e81461064d57806356de96db1461067857610288565b80633af32abf146104855780633ccfd60b146104c257806342842e0e146104d9578063438b63001461050257806344a0d68a1461053f5780634d2057ac1461056857610288565b806316ba10e01161025057806316ba10e01461038657806318160ddd146103af578063228025e8146103da57806323b872dd146104035780632db115441461042c5780632f745c591461044857610288565b806301ffc9a71461028d57806306fdde03146102ca578063081812fc146102f5578063095ea7b31461033257806313faede61461035b575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af9190613e97565b610ace565b6040516102c1919061463d565b60405180910390f35b3480156102d657600080fd5b506102df610c18565b6040516102ec9190614673565b60405180910390f35b34801561030157600080fd5b5061031c60048036038101906103179190613f67565b610caa565b60405161032991906145b4565b60405180910390f35b34801561033e57600080fd5b5061035960048036038101906103549190613ddd565b610d2f565b005b34801561036757600080fd5b50610370610e48565b60405161037d9190614a15565b60405180910390f35b34801561039257600080fd5b506103ad60048036038101906103a89190613f1e565b610e4e565b005b3480156103bb57600080fd5b506103c4610ee4565b6040516103d19190614a15565b60405180910390f35b3480156103e657600080fd5b5061040160048036038101906103fc9190613f67565b610eed565b005b34801561040f57600080fd5b5061042a60048036038101906104259190613cc7565b610f73565b005b61044660048036038101906104419190613f67565b610f83565b005b34801561045457600080fd5b5061046f600480360381019061046a9190613ddd565b6111cb565b60405161047c9190614a15565b60405180910390f35b34801561049157600080fd5b506104ac60048036038101906104a79190613c5a565b6113bd565b6040516104b9919061463d565b60405180910390f35b3480156104ce57600080fd5b506104d761146c565b005b3480156104e557600080fd5b5061050060048036038101906104fb9190613cc7565b611597565b005b34801561050e57600080fd5b5061052960048036038101906105249190613c5a565b6115b7565b604051610536919061461b565b60405180910390f35b34801561054b57600080fd5b5061056660048036038101906105619190613f67565b6116c2565b005b34801561057457600080fd5b5061058f600480360381019061058a9190613f67565b611748565b005b34801561059d57600080fd5b506105b860048036038101906105b39190613f67565b6117ce565b6040516105c59190614a15565b60405180910390f35b3480156105da57600080fd5b506105f560048036038101906105f09190613f1e565b611821565b005b34801561060357600080fd5b5061060c6118b7565b6040516106199190614a15565b60405180910390f35b34801561062e57600080fd5b506106376118bd565b604051610644919061463d565b60405180910390f35b34801561065957600080fd5b506106626118d0565b60405161066f9190614673565b60405180910390f35b34801561068457600080fd5b5061069f600480360381019061069a9190613ef1565b61195e565b005b3480156106ad57600080fd5b506106b6611a07565b6040516106c39190614658565b60405180910390f35b3480156106d857600080fd5b506106f360048036038101906106ee9190613f67565b611a1a565b60405161070091906145b4565b60405180910390f35b34801561071557600080fd5b50610730600480360381019061072b9190613c5a565b611a30565b60405161073d9190614a15565b60405180910390f35b34801561075257600080fd5b5061075b611b19565b005b34801561076957600080fd5b50610784600480360381019061077f9190613f1e565b611c56565b005b34801561079257600080fd5b506107ad60048036038101906107a89190613f67565b611cec565b005b6107c960048036038101906107c49190613f67565b611d72565b005b3480156107d757600080fd5b506107e06120b5565b6040516107ed91906145b4565b60405180910390f35b34801561080257600080fd5b5061080b6120df565b6040516108189190614673565b60405180910390f35b34801561082d57600080fd5b50610836612171565b604051610843919061463d565b60405180910390f35b34801561085857600080fd5b50610873600480360381019061086e9190613d9d565b612184565b005b34801561088157600080fd5b5061089c60048036038101906108979190613d1a565b612305565b005b3480156108aa57600080fd5b506108c560048036038101906108c09190613f67565b612361565b6040516108d291906145b4565b60405180910390f35b3480156108e757600080fd5b506108f06123a0565b6040516108fd9190614a15565b60405180910390f35b34801561091257600080fd5b5061092d60048036038101906109289190613f67565b6123a6565b60405161093a9190614673565b60405180910390f35b34801561094f57600080fd5b5061096a60048036038101906109659190613f67565b6124ff565b005b34801561097857600080fd5b50610981612585565b60405161098e9190614a15565b60405180910390f35b3480156109a357600080fd5b506109ac61258b565b6040516109b99190614a15565b60405180910390f35b3480156109ce57600080fd5b506109e960048036038101906109e49190613e6a565b612591565b005b3480156109f757600080fd5b50610a126004803603810190610a0d9190613c87565b61262a565b604051610a1f919061463d565b60405180910390f35b348015610a3457600080fd5b50610a4f6004803603810190610a4a9190613e1d565b6126be565b005b348015610a5d57600080fd5b50610a786004803603810190610a739190613f67565b61275e565b005b348015610a8657600080fd5b50610aa16004803603810190610a9c9190613c5a565b6127e4565b005b348015610aaf57600080fd5b50610ab8612990565b604051610ac59190614a15565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b9957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c0157507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c115750610c1082612996565b5b9050919050565b606060018054610c2790614d43565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5390614d43565b8015610ca05780601f10610c7557610100808354040283529160200191610ca0565b820191906000526020600020905b815481529060010190602001808311610c8357829003601f168201915b5050505050905090565b6000610cb582612a00565b610cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ceb906149f5565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d3a82611a1a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610dab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da2906148f5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610dca612a0d565b73ffffffffffffffffffffffffffffffffffffffff161480610df95750610df881610df3612a0d565b61262a565b5b610e38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2f906147b5565b60405180910390fd5b610e43838383612a15565b505050565b600c5481565b610e56612a0d565b73ffffffffffffffffffffffffffffffffffffffff16610e746120b5565b73ffffffffffffffffffffffffffffffffffffffff1614610eca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec190614835565b60405180910390fd5b80600a9080519060200190610ee0929190613908565b5050565b60008054905090565b610ef5612a0d565b73ffffffffffffffffffffffffffffffffffffffff16610f136120b5565b73ffffffffffffffffffffffffffffffffffffffff1614610f69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6090614835565b60405180910390fd5b8060108190555050565b610f7e838383612ac7565b505050565b6000610f8d610ee4565b9050600280811115610fa257610fa1614e7e565b5b601460009054906101000a900460ff166002811115610fc457610fc3614e7e565b5b14611004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffb906146b5565b60405180910390fd5b60008211611047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103e906146d5565b60405180910390fd5b600e5482111561108c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108390614995565b60405180910390fd5b601054828261109b9190614b53565b11156110dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d3906146f5565b60405180910390fd5b6110e46120b5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111bd5781601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111659190614b53565b92505081905550600c548261117a9190614bda565b3410156111bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b3906148d5565b60405180910390fd5b5b6111c73383613007565b5050565b60006111d683611a30565b8210611217576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120e90614695565b60405180910390fd5b6000611221610ee4565b905060008060005b8381101561137b576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461131b57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561136d57868414156113645781955050505050506113b7565b83806001019450505b508080600101915050611229565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ae906149b5565b60405180910390fd5b92915050565b600080600090505b601380549050811015611461578273ffffffffffffffffffffffffffffffffffffffff16601382815481106113fd576113fc614edc565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561144e576001915050611467565b808061145990614da6565b9150506113c5565b50600090505b919050565b611474612a0d565b73ffffffffffffffffffffffffffffffffffffffff166114926120b5565b73ffffffffffffffffffffffffffffffffffffffff16146114e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114df90614835565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405161150e9061459f565b60006040518083038185875af1925050503d806000811461154b576040519150601f19603f3d011682016040523d82523d6000602084013e611550565b606091505b5050905080611594576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158b90614915565b60405180910390fd5b50565b6115b283838360405180602001604052806000815250612305565b505050565b606060006115c483611a30565b905060008167ffffffffffffffff8111156115e2576115e1614f0b565b5b6040519080825280602002602001820160405280156116105781602001602082028036833780820191505090505b50905060006001905060005b838110801561162d57506010548211155b156116b657600061163d83611a1a565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116a2578284838151811061168757611686614edc565b5b602002602001018181525050818061169e90614da6565b9250505b82806116ad90614da6565b9350505061161c565b82945050505050919050565b6116ca612a0d565b73ffffffffffffffffffffffffffffffffffffffff166116e86120b5565b73ffffffffffffffffffffffffffffffffffffffff161461173e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173590614835565b60405180910390fd5b80600c8190555050565b611750612a0d565b73ffffffffffffffffffffffffffffffffffffffff1661176e6120b5565b73ffffffffffffffffffffffffffffffffffffffff16146117c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bb90614835565b60405180910390fd5b80600f8190555050565b60006117d8610ee4565b8210611819576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181090614755565b60405180910390fd5b819050919050565b611829612a0d565b73ffffffffffffffffffffffffffffffffffffffff166118476120b5565b73ffffffffffffffffffffffffffffffffffffffff161461189d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189490614835565b60405180910390fd5b80600b90805190602001906118b3929190613908565b5050565b600f5481565b601260009054906101000a900460ff1681565b600a80546118dd90614d43565b80601f016020809104026020016040519081016040528092919081815260200182805461190990614d43565b80156119565780601f1061192b57610100808354040283529160200191611956565b820191906000526020600020905b81548152906001019060200180831161193957829003601f168201915b505050505081565b611966612a0d565b73ffffffffffffffffffffffffffffffffffffffff166119846120b5565b73ffffffffffffffffffffffffffffffffffffffff16146119da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d190614835565b60405180910390fd5b80601460006101000a81548160ff021916908360028111156119ff576119fe614e7e565b5b021790555050565b601460009054906101000a900460ff1681565b6000611a2582613025565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611aa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a98906147f5565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611b21612a0d565b73ffffffffffffffffffffffffffffffffffffffff16611b3f6120b5565b73ffffffffffffffffffffffffffffffffffffffff1614611b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8c90614835565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611c5e612a0d565b73ffffffffffffffffffffffffffffffffffffffff16611c7c6120b5565b73ffffffffffffffffffffffffffffffffffffffff1614611cd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc990614835565b60405180910390fd5b8060099080519060200190611ce8929190613908565b5050565b611cf4612a0d565b73ffffffffffffffffffffffffffffffffffffffff16611d126120b5565b73ffffffffffffffffffffffffffffffffffffffff1614611d68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5f90614835565b60405180910390fd5b80600e8190555050565b6000611d7c610ee4565b905060016002811115611d9257611d91614e7e565b5b601460009054906101000a900460ff166002811115611db457611db3614e7e565b5b14611df4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611deb906147d5565b60405180910390fd5b60008211611e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2e906146d5565b60405180910390fd5b600e54821115611e7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7390614995565b60405180910390fd5b600f548282611e8b9190614b53565b1115611ecc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec3906146f5565b60405180910390fd5b611ed46120b5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146120a75760011515601260019054906101000a900460ff161515141561200057611f2b336113bd565b611f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6190614795565b60405180910390fd5b6000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506011548382611fbd9190614b53565b1115611ffe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff5906148b5565b60405180910390fd5b505b81601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461204f9190614b53565b92505081905550600d54826120649190614bda565b3410156120a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209d906148d5565b60405180910390fd5b5b6120b13383613007565b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546120ee90614d43565b80601f016020809104026020016040519081016040528092919081815260200182805461211a90614d43565b80156121675780601f1061213c57610100808354040283529160200191612167565b820191906000526020600020905b81548152906001019060200180831161214a57829003601f168201915b5050505050905090565b601260019054906101000a900460ff1681565b61218c612a0d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f190614875565b60405180910390fd5b8060066000612207612a0d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166122b4612a0d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122f9919061463d565b60405180910390a35050565b612310848484612ac7565b61231c848484846131bf565b61235b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235290614935565b60405180910390fd5b50505050565b6013818154811061237157600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60115481565b60606123b182612a00565b6123f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e790614855565b60405180910390fd5b60001515601260009054906101000a900460ff161515141561249e57600b805461241990614d43565b80601f016020809104026020016040519081016040528092919081815260200182805461244590614d43565b80156124925780601f1061246757610100808354040283529160200191612492565b820191906000526020600020905b81548152906001019060200180831161247557829003601f168201915b505050505090506124fa565b60006124a8613356565b905060008151116124c857604051806020016040528060008152506124f6565b806124d2846133e8565b600a6040516020016124e69392919061456e565b6040516020818303038152906040525b9150505b919050565b612507612a0d565b73ffffffffffffffffffffffffffffffffffffffff166125256120b5565b73ffffffffffffffffffffffffffffffffffffffff161461257b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257290614835565b60405180910390fd5b8060118190555050565b60105481565b600d5481565b612599612a0d565b73ffffffffffffffffffffffffffffffffffffffff166125b76120b5565b73ffffffffffffffffffffffffffffffffffffffff161461260d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260490614835565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6126c6612a0d565b73ffffffffffffffffffffffffffffffffffffffff166126e46120b5565b73ffffffffffffffffffffffffffffffffffffffff161461273a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273190614835565b60405180910390fd5b60136000612748919061398e565b8181601391906127599291906139af565b505050565b612766612a0d565b73ffffffffffffffffffffffffffffffffffffffff166127846120b5565b73ffffffffffffffffffffffffffffffffffffffff16146127da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d190614835565b60405180910390fd5b80600d8190555050565b6127ec612a0d565b73ffffffffffffffffffffffffffffffffffffffff1661280a6120b5565b73ffffffffffffffffffffffffffffffffffffffff1614612860576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285790614835565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156128d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c790614715565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000612ad282613025565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612af9612a0d565b73ffffffffffffffffffffffffffffffffffffffff161480612b555750612b1e612a0d565b73ffffffffffffffffffffffffffffffffffffffff16612b3d84610caa565b73ffffffffffffffffffffffffffffffffffffffff16145b80612b715750612b708260000151612b6b612a0d565b61262a565b5b905080612bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612baa90614895565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612c25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1c90614815565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612c95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8c90614775565b60405180910390fd5b612ca28585856001613549565b612cb26000848460000151612a15565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612f9757612ef681612a00565b15612f965782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613000858585600161354f565b5050505050565b613021828260405180602001604052806000815250613555565b5050565b61302d613a4f565b61303682612a00565b613075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306c90614735565b60405180910390fd5b60008290505b6000811061317e576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461316f5780925050506131ba565b5080806001900391505061307b565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131b1906149d5565b60405180910390fd5b919050565b60006131e08473ffffffffffffffffffffffffffffffffffffffff16613567565b15613349578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613209612a0d565b8786866040518563ffffffff1660e01b815260040161322b94939291906145cf565b602060405180830381600087803b15801561324557600080fd5b505af192505050801561327657506040513d601f19601f820116820180604052508101906132739190613ec4565b60015b6132f9573d80600081146132a6576040519150601f19603f3d011682016040523d82523d6000602084013e6132ab565b606091505b506000815114156132f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132e890614935565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061334e565b600190505b949350505050565b60606009805461336590614d43565b80601f016020809104026020016040519081016040528092919081815260200182805461339190614d43565b80156133de5780601f106133b3576101008083540402835291602001916133de565b820191906000526020600020905b8154815290600101906020018083116133c157829003601f168201915b5050505050905090565b60606000821415613430576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613544565b600082905060005b6000821461346257808061344b90614da6565b915050600a8261345b9190614ba9565b9150613438565b60008167ffffffffffffffff81111561347e5761347d614f0b565b5b6040519080825280601f01601f1916602001820160405280156134b05781602001600182028036833780820191505090505b5090505b6000851461353d576001826134c99190614c34565b9150600a856134d89190614def565b60306134e49190614b53565b60f81b8183815181106134fa576134f9614edc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856135369190614ba9565b94506134b4565b8093505050505b919050565b50505050565b50505050565b613562838383600161358a565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135f790614955565b60405180910390fd5b6000841415613644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161363b90614975565b60405180910390fd5b6136516000868387613549565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b858110156138eb57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a483156138d65761389660008884886131bf565b6138d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138cc90614935565b60405180910390fd5b5b8180600101925050808060010191505061381f565b508060008190555050613901600086838761354f565b5050505050565b82805461391490614d43565b90600052602060002090601f016020900481019282613936576000855561397d565b82601f1061394f57805160ff191683800117855561397d565b8280016001018555821561397d579182015b8281111561397c578251825591602001919060010190613961565b5b50905061398a9190613a89565b5090565b50805460008255906000526020600020908101906139ac9190613a89565b50565b828054828255906000526020600020908101928215613a3e579160200282015b82811115613a3d57823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906139cf565b5b509050613a4b9190613a89565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613aa2576000816000905550600101613a8a565b5090565b6000613ab9613ab484614a55565b614a30565b905082815260208101848484011115613ad557613ad4614f49565b5b613ae0848285614d01565b509392505050565b6000613afb613af684614a86565b614a30565b905082815260208101848484011115613b1757613b16614f49565b5b613b22848285614d01565b509392505050565b600081359050613b39816156a8565b92915050565b60008083601f840112613b5557613b54614f3f565b5b8235905067ffffffffffffffff811115613b7257613b71614f3a565b5b602083019150836020820283011115613b8e57613b8d614f44565b5b9250929050565b600081359050613ba4816156bf565b92915050565b600081359050613bb9816156d6565b92915050565b600081519050613bce816156d6565b92915050565b600082601f830112613be957613be8614f3f565b5b8135613bf9848260208601613aa6565b91505092915050565b600081359050613c11816156ed565b92915050565b600082601f830112613c2c57613c2b614f3f565b5b8135613c3c848260208601613ae8565b91505092915050565b600081359050613c54816156fd565b92915050565b600060208284031215613c7057613c6f614f53565b5b6000613c7e84828501613b2a565b91505092915050565b60008060408385031215613c9e57613c9d614f53565b5b6000613cac85828601613b2a565b9250506020613cbd85828601613b2a565b9150509250929050565b600080600060608486031215613ce057613cdf614f53565b5b6000613cee86828701613b2a565b9350506020613cff86828701613b2a565b9250506040613d1086828701613c45565b9150509250925092565b60008060008060808587031215613d3457613d33614f53565b5b6000613d4287828801613b2a565b9450506020613d5387828801613b2a565b9350506040613d6487828801613c45565b925050606085013567ffffffffffffffff811115613d8557613d84614f4e565b5b613d9187828801613bd4565b91505092959194509250565b60008060408385031215613db457613db3614f53565b5b6000613dc285828601613b2a565b9250506020613dd385828601613b95565b9150509250929050565b60008060408385031215613df457613df3614f53565b5b6000613e0285828601613b2a565b9250506020613e1385828601613c45565b9150509250929050565b60008060208385031215613e3457613e33614f53565b5b600083013567ffffffffffffffff811115613e5257613e51614f4e565b5b613e5e85828601613b3f565b92509250509250929050565b600060208284031215613e8057613e7f614f53565b5b6000613e8e84828501613b95565b91505092915050565b600060208284031215613ead57613eac614f53565b5b6000613ebb84828501613baa565b91505092915050565b600060208284031215613eda57613ed9614f53565b5b6000613ee884828501613bbf565b91505092915050565b600060208284031215613f0757613f06614f53565b5b6000613f1584828501613c02565b91505092915050565b600060208284031215613f3457613f33614f53565b5b600082013567ffffffffffffffff811115613f5257613f51614f4e565b5b613f5e84828501613c17565b91505092915050565b600060208284031215613f7d57613f7c614f53565b5b6000613f8b84828501613c45565b91505092915050565b6000613fa08383614550565b60208301905092915050565b613fb581614c68565b82525050565b6000613fc682614adc565b613fd08185614b0a565b9350613fdb83614ab7565b8060005b8381101561400c578151613ff38882613f94565b9750613ffe83614afd565b925050600181019050613fdf565b5085935050505092915050565b61402281614c7a565b82525050565b600061403382614ae7565b61403d8185614b1b565b935061404d818560208601614d10565b61405681614f58565b840191505092915050565b61406a81614cef565b82525050565b600061407b82614af2565b6140858185614b37565b9350614095818560208601614d10565b61409e81614f58565b840191505092915050565b60006140b482614af2565b6140be8185614b48565b93506140ce818560208601614d10565b80840191505092915050565b600081546140e781614d43565b6140f18186614b48565b9450600182166000811461410c576001811461411d57614150565b60ff19831686528186019350614150565b61412685614ac7565b60005b8381101561414857815481890152600182019150602081019050614129565b838801955050505b50505092915050565b6000614166602283614b37565b915061417182614f69565b604082019050919050565b6000614189600f83614b37565b915061419482614fb8565b602082019050919050565b60006141ac602e83614b37565b91506141b782614fe1565b604082019050919050565b60006141cf600783614b37565b91506141da82615030565b602082019050919050565b60006141f2602683614b37565b91506141fd82615059565b604082019050919050565b6000614215602a83614b37565b9150614220826150a8565b604082019050919050565b6000614238602383614b37565b9150614243826150f7565b604082019050919050565b600061425b602583614b37565b915061426682615146565b604082019050919050565b600061427e601783614b37565b915061428982615195565b602082019050919050565b60006142a1603983614b37565b91506142ac826151be565b604082019050919050565b60006142c4601283614b37565b91506142cf8261520d565b602082019050919050565b60006142e7602b83614b37565b91506142f282615236565b604082019050919050565b600061430a602683614b37565b915061431582615285565b604082019050919050565b600061432d602083614b37565b9150614338826152d4565b602082019050919050565b6000614350602f83614b37565b915061435b826152fd565b604082019050919050565b6000614373601a83614b37565b915061437e8261534c565b602082019050919050565b6000614396603283614b37565b91506143a182615375565b604082019050919050565b60006143b9601c83614b37565b91506143c4826153c4565b602082019050919050565b60006143dc601d83614b37565b91506143e7826153ed565b602082019050919050565b60006143ff602283614b37565b915061440a82615416565b604082019050919050565b6000614422600083614b2c565b915061442d82615465565b600082019050919050565b6000614445601083614b37565b915061445082615468565b602082019050919050565b6000614468603383614b37565b915061447382615491565b604082019050919050565b600061448b602183614b37565b9150614496826154e0565b604082019050919050565b60006144ae602883614b37565b91506144b98261552f565b604082019050919050565b60006144d1601383614b37565b91506144dc8261557e565b602082019050919050565b60006144f4602e83614b37565b91506144ff826155a7565b604082019050919050565b6000614517602f83614b37565b9150614522826155f6565b604082019050919050565b600061453a602d83614b37565b915061454582615645565b604082019050919050565b61455981614ce5565b82525050565b61456881614ce5565b82525050565b600061457a82866140a9565b915061458682856140a9565b915061459282846140da565b9150819050949350505050565b60006145aa82614415565b9150819050919050565b60006020820190506145c96000830184613fac565b92915050565b60006080820190506145e46000830187613fac565b6145f16020830186613fac565b6145fe604083018561455f565b81810360608301526146108184614028565b905095945050505050565b600060208201905081810360008301526146358184613fbb565b905092915050565b60006020820190506146526000830184614019565b92915050565b600060208201905061466d6000830184614061565b92915050565b6000602082019050818103600083015261468d8184614070565b905092915050565b600060208201905081810360008301526146ae81614159565b9050919050565b600060208201905081810360008301526146ce8161417c565b9050919050565b600060208201905081810360008301526146ee8161419f565b9050919050565b6000602082019050818103600083015261470e816141c2565b9050919050565b6000602082019050818103600083015261472e816141e5565b9050919050565b6000602082019050818103600083015261474e81614208565b9050919050565b6000602082019050818103600083015261476e8161422b565b9050919050565b6000602082019050818103600083015261478e8161424e565b9050919050565b600060208201905081810360008301526147ae81614271565b9050919050565b600060208201905081810360008301526147ce81614294565b9050919050565b600060208201905081810360008301526147ee816142b7565b9050919050565b6000602082019050818103600083015261480e816142da565b9050919050565b6000602082019050818103600083015261482e816142fd565b9050919050565b6000602082019050818103600083015261484e81614320565b9050919050565b6000602082019050818103600083015261486e81614343565b9050919050565b6000602082019050818103600083015261488e81614366565b9050919050565b600060208201905081810360008301526148ae81614389565b9050919050565b600060208201905081810360008301526148ce816143ac565b9050919050565b600060208201905081810360008301526148ee816143cf565b9050919050565b6000602082019050818103600083015261490e816143f2565b9050919050565b6000602082019050818103600083015261492e81614438565b9050919050565b6000602082019050818103600083015261494e8161445b565b9050919050565b6000602082019050818103600083015261496e8161447e565b9050919050565b6000602082019050818103600083015261498e816144a1565b9050919050565b600060208201905081810360008301526149ae816144c4565b9050919050565b600060208201905081810360008301526149ce816144e7565b9050919050565b600060208201905081810360008301526149ee8161450a565b9050919050565b60006020820190508181036000830152614a0e8161452d565b9050919050565b6000602082019050614a2a600083018461455f565b92915050565b6000614a3a614a4b565b9050614a468282614d75565b919050565b6000604051905090565b600067ffffffffffffffff821115614a7057614a6f614f0b565b5b614a7982614f58565b9050602081019050919050565b600067ffffffffffffffff821115614aa157614aa0614f0b565b5b614aaa82614f58565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614b5e82614ce5565b9150614b6983614ce5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b9e57614b9d614e20565b5b828201905092915050565b6000614bb482614ce5565b9150614bbf83614ce5565b925082614bcf57614bce614e4f565b5b828204905092915050565b6000614be582614ce5565b9150614bf083614ce5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614c2957614c28614e20565b5b828202905092915050565b6000614c3f82614ce5565b9150614c4a83614ce5565b925082821015614c5d57614c5c614e20565b5b828203905092915050565b6000614c7382614cc5565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050614cc082615694565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614cfa82614cb2565b9050919050565b82818337600083830152505050565b60005b83811015614d2e578082015181840152602081019050614d13565b83811115614d3d576000848401525b50505050565b60006002820490506001821680614d5b57607f821691505b60208210811415614d6f57614d6e614ead565b5b50919050565b614d7e82614f58565b810181811067ffffffffffffffff82111715614d9d57614d9c614f0b565b5b80604052505050565b6000614db182614ce5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614de457614de3614e20565b5b600182019050919050565b6000614dfa82614ce5565b9150614e0583614ce5565b925082614e1557614e14614e4f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e4f545f5055424c49435f53414c450000000000000000000000000000000000600082015250565b7f4d696e696d756d2031204e46542068617320746f206265206d696e746564207060008201527f6572207472616e73616374696f6e000000000000000000000000000000000000602082015250565b7f4e6f206d6f726500000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f55736572206973206e6f742077686974656c6973746564000000000000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f4e4f545f57484954454c4953545f53414c450000000000000000000000000000600082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f4d6178204e465420706572206164647265737320657863656564656400000000600082015250565b7f506c656173652073656e642074686520657861637420616d6f756e742e000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b7f4d61782070657220545820726561636865642e00000000000000000000000000600082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b600381106156a5576156a4614e7e565b5b50565b6156b181614c68565b81146156bc57600080fd5b50565b6156c881614c7a565b81146156d357600080fd5b50565b6156df81614c86565b81146156ea57600080fd5b50565b600381106156fa57600080fd5b50565b61570681614ce5565b811461571157600080fd5b5056fea2646970667358221220940292608e5f7928dbd53f931870662accca0d645883eb96c3fdbcca598def8064736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102885760003560e01c8063603f4d521161015a578063ba4e5c49116100c1578063e0a808531161007a578063e0a80853146109c2578063e985e9c5146109eb578063edec5f2714610a28578063f12f6d5d14610a51578063f2fde38b14610a7a578063f968adbe14610aa357610288565b8063ba4e5c491461089e578063ba7d2c76146108db578063c87b56dd14610906578063d0eb26b014610943578063d5abeb011461096c578063d70a28d11461099757610288565b8063868ff4a211610113578063868ff4a2146107af5780638da5cb5b146107cb57806395d89b41146107f65780639c70b51214610821578063a22cb4651461084c578063b88d4fde1461087557610288565b8063603f4d52146106a15780636352211e146106cc57806370a0823114610709578063715018a6146107465780637ec4a6591461075d578063805dcae51461078657610288565b80633af32abf116101fe5780634f6ccce7116101b75780634f6ccce7146105915780634fdd43cb146105ce578063515dc327146105f757806351830227146106225780635503a0e81461064d57806356de96db1461067857610288565b80633af32abf146104855780633ccfd60b146104c257806342842e0e146104d9578063438b63001461050257806344a0d68a1461053f5780634d2057ac1461056857610288565b806316ba10e01161025057806316ba10e01461038657806318160ddd146103af578063228025e8146103da57806323b872dd146104035780632db115441461042c5780632f745c591461044857610288565b806301ffc9a71461028d57806306fdde03146102ca578063081812fc146102f5578063095ea7b31461033257806313faede61461035b575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af9190613e97565b610ace565b6040516102c1919061463d565b60405180910390f35b3480156102d657600080fd5b506102df610c18565b6040516102ec9190614673565b60405180910390f35b34801561030157600080fd5b5061031c60048036038101906103179190613f67565b610caa565b60405161032991906145b4565b60405180910390f35b34801561033e57600080fd5b5061035960048036038101906103549190613ddd565b610d2f565b005b34801561036757600080fd5b50610370610e48565b60405161037d9190614a15565b60405180910390f35b34801561039257600080fd5b506103ad60048036038101906103a89190613f1e565b610e4e565b005b3480156103bb57600080fd5b506103c4610ee4565b6040516103d19190614a15565b60405180910390f35b3480156103e657600080fd5b5061040160048036038101906103fc9190613f67565b610eed565b005b34801561040f57600080fd5b5061042a60048036038101906104259190613cc7565b610f73565b005b61044660048036038101906104419190613f67565b610f83565b005b34801561045457600080fd5b5061046f600480360381019061046a9190613ddd565b6111cb565b60405161047c9190614a15565b60405180910390f35b34801561049157600080fd5b506104ac60048036038101906104a79190613c5a565b6113bd565b6040516104b9919061463d565b60405180910390f35b3480156104ce57600080fd5b506104d761146c565b005b3480156104e557600080fd5b5061050060048036038101906104fb9190613cc7565b611597565b005b34801561050e57600080fd5b5061052960048036038101906105249190613c5a565b6115b7565b604051610536919061461b565b60405180910390f35b34801561054b57600080fd5b5061056660048036038101906105619190613f67565b6116c2565b005b34801561057457600080fd5b5061058f600480360381019061058a9190613f67565b611748565b005b34801561059d57600080fd5b506105b860048036038101906105b39190613f67565b6117ce565b6040516105c59190614a15565b60405180910390f35b3480156105da57600080fd5b506105f560048036038101906105f09190613f1e565b611821565b005b34801561060357600080fd5b5061060c6118b7565b6040516106199190614a15565b60405180910390f35b34801561062e57600080fd5b506106376118bd565b604051610644919061463d565b60405180910390f35b34801561065957600080fd5b506106626118d0565b60405161066f9190614673565b60405180910390f35b34801561068457600080fd5b5061069f600480360381019061069a9190613ef1565b61195e565b005b3480156106ad57600080fd5b506106b6611a07565b6040516106c39190614658565b60405180910390f35b3480156106d857600080fd5b506106f360048036038101906106ee9190613f67565b611a1a565b60405161070091906145b4565b60405180910390f35b34801561071557600080fd5b50610730600480360381019061072b9190613c5a565b611a30565b60405161073d9190614a15565b60405180910390f35b34801561075257600080fd5b5061075b611b19565b005b34801561076957600080fd5b50610784600480360381019061077f9190613f1e565b611c56565b005b34801561079257600080fd5b506107ad60048036038101906107a89190613f67565b611cec565b005b6107c960048036038101906107c49190613f67565b611d72565b005b3480156107d757600080fd5b506107e06120b5565b6040516107ed91906145b4565b60405180910390f35b34801561080257600080fd5b5061080b6120df565b6040516108189190614673565b60405180910390f35b34801561082d57600080fd5b50610836612171565b604051610843919061463d565b60405180910390f35b34801561085857600080fd5b50610873600480360381019061086e9190613d9d565b612184565b005b34801561088157600080fd5b5061089c60048036038101906108979190613d1a565b612305565b005b3480156108aa57600080fd5b506108c560048036038101906108c09190613f67565b612361565b6040516108d291906145b4565b60405180910390f35b3480156108e757600080fd5b506108f06123a0565b6040516108fd9190614a15565b60405180910390f35b34801561091257600080fd5b5061092d60048036038101906109289190613f67565b6123a6565b60405161093a9190614673565b60405180910390f35b34801561094f57600080fd5b5061096a60048036038101906109659190613f67565b6124ff565b005b34801561097857600080fd5b50610981612585565b60405161098e9190614a15565b60405180910390f35b3480156109a357600080fd5b506109ac61258b565b6040516109b99190614a15565b60405180910390f35b3480156109ce57600080fd5b506109e960048036038101906109e49190613e6a565b612591565b005b3480156109f757600080fd5b50610a126004803603810190610a0d9190613c87565b61262a565b604051610a1f919061463d565b60405180910390f35b348015610a3457600080fd5b50610a4f6004803603810190610a4a9190613e1d565b6126be565b005b348015610a5d57600080fd5b50610a786004803603810190610a739190613f67565b61275e565b005b348015610a8657600080fd5b50610aa16004803603810190610a9c9190613c5a565b6127e4565b005b348015610aaf57600080fd5b50610ab8612990565b604051610ac59190614a15565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b9957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c0157507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c115750610c1082612996565b5b9050919050565b606060018054610c2790614d43565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5390614d43565b8015610ca05780601f10610c7557610100808354040283529160200191610ca0565b820191906000526020600020905b815481529060010190602001808311610c8357829003601f168201915b5050505050905090565b6000610cb582612a00565b610cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ceb906149f5565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d3a82611a1a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610dab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da2906148f5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610dca612a0d565b73ffffffffffffffffffffffffffffffffffffffff161480610df95750610df881610df3612a0d565b61262a565b5b610e38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2f906147b5565b60405180910390fd5b610e43838383612a15565b505050565b600c5481565b610e56612a0d565b73ffffffffffffffffffffffffffffffffffffffff16610e746120b5565b73ffffffffffffffffffffffffffffffffffffffff1614610eca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec190614835565b60405180910390fd5b80600a9080519060200190610ee0929190613908565b5050565b60008054905090565b610ef5612a0d565b73ffffffffffffffffffffffffffffffffffffffff16610f136120b5565b73ffffffffffffffffffffffffffffffffffffffff1614610f69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6090614835565b60405180910390fd5b8060108190555050565b610f7e838383612ac7565b505050565b6000610f8d610ee4565b9050600280811115610fa257610fa1614e7e565b5b601460009054906101000a900460ff166002811115610fc457610fc3614e7e565b5b14611004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffb906146b5565b60405180910390fd5b60008211611047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103e906146d5565b60405180910390fd5b600e5482111561108c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108390614995565b60405180910390fd5b601054828261109b9190614b53565b11156110dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d3906146f5565b60405180910390fd5b6110e46120b5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111bd5781601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111659190614b53565b92505081905550600c548261117a9190614bda565b3410156111bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b3906148d5565b60405180910390fd5b5b6111c73383613007565b5050565b60006111d683611a30565b8210611217576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120e90614695565b60405180910390fd5b6000611221610ee4565b905060008060005b8381101561137b576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461131b57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561136d57868414156113645781955050505050506113b7565b83806001019450505b508080600101915050611229565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ae906149b5565b60405180910390fd5b92915050565b600080600090505b601380549050811015611461578273ffffffffffffffffffffffffffffffffffffffff16601382815481106113fd576113fc614edc565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561144e576001915050611467565b808061145990614da6565b9150506113c5565b50600090505b919050565b611474612a0d565b73ffffffffffffffffffffffffffffffffffffffff166114926120b5565b73ffffffffffffffffffffffffffffffffffffffff16146114e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114df90614835565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405161150e9061459f565b60006040518083038185875af1925050503d806000811461154b576040519150601f19603f3d011682016040523d82523d6000602084013e611550565b606091505b5050905080611594576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158b90614915565b60405180910390fd5b50565b6115b283838360405180602001604052806000815250612305565b505050565b606060006115c483611a30565b905060008167ffffffffffffffff8111156115e2576115e1614f0b565b5b6040519080825280602002602001820160405280156116105781602001602082028036833780820191505090505b50905060006001905060005b838110801561162d57506010548211155b156116b657600061163d83611a1a565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116a2578284838151811061168757611686614edc565b5b602002602001018181525050818061169e90614da6565b9250505b82806116ad90614da6565b9350505061161c565b82945050505050919050565b6116ca612a0d565b73ffffffffffffffffffffffffffffffffffffffff166116e86120b5565b73ffffffffffffffffffffffffffffffffffffffff161461173e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173590614835565b60405180910390fd5b80600c8190555050565b611750612a0d565b73ffffffffffffffffffffffffffffffffffffffff1661176e6120b5565b73ffffffffffffffffffffffffffffffffffffffff16146117c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bb90614835565b60405180910390fd5b80600f8190555050565b60006117d8610ee4565b8210611819576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181090614755565b60405180910390fd5b819050919050565b611829612a0d565b73ffffffffffffffffffffffffffffffffffffffff166118476120b5565b73ffffffffffffffffffffffffffffffffffffffff161461189d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189490614835565b60405180910390fd5b80600b90805190602001906118b3929190613908565b5050565b600f5481565b601260009054906101000a900460ff1681565b600a80546118dd90614d43565b80601f016020809104026020016040519081016040528092919081815260200182805461190990614d43565b80156119565780601f1061192b57610100808354040283529160200191611956565b820191906000526020600020905b81548152906001019060200180831161193957829003601f168201915b505050505081565b611966612a0d565b73ffffffffffffffffffffffffffffffffffffffff166119846120b5565b73ffffffffffffffffffffffffffffffffffffffff16146119da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d190614835565b60405180910390fd5b80601460006101000a81548160ff021916908360028111156119ff576119fe614e7e565b5b021790555050565b601460009054906101000a900460ff1681565b6000611a2582613025565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611aa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a98906147f5565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611b21612a0d565b73ffffffffffffffffffffffffffffffffffffffff16611b3f6120b5565b73ffffffffffffffffffffffffffffffffffffffff1614611b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8c90614835565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611c5e612a0d565b73ffffffffffffffffffffffffffffffffffffffff16611c7c6120b5565b73ffffffffffffffffffffffffffffffffffffffff1614611cd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc990614835565b60405180910390fd5b8060099080519060200190611ce8929190613908565b5050565b611cf4612a0d565b73ffffffffffffffffffffffffffffffffffffffff16611d126120b5565b73ffffffffffffffffffffffffffffffffffffffff1614611d68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5f90614835565b60405180910390fd5b80600e8190555050565b6000611d7c610ee4565b905060016002811115611d9257611d91614e7e565b5b601460009054906101000a900460ff166002811115611db457611db3614e7e565b5b14611df4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611deb906147d5565b60405180910390fd5b60008211611e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2e906146d5565b60405180910390fd5b600e54821115611e7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7390614995565b60405180910390fd5b600f548282611e8b9190614b53565b1115611ecc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec3906146f5565b60405180910390fd5b611ed46120b5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146120a75760011515601260019054906101000a900460ff161515141561200057611f2b336113bd565b611f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6190614795565b60405180910390fd5b6000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506011548382611fbd9190614b53565b1115611ffe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff5906148b5565b60405180910390fd5b505b81601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461204f9190614b53565b92505081905550600d54826120649190614bda565b3410156120a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209d906148d5565b60405180910390fd5b5b6120b13383613007565b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546120ee90614d43565b80601f016020809104026020016040519081016040528092919081815260200182805461211a90614d43565b80156121675780601f1061213c57610100808354040283529160200191612167565b820191906000526020600020905b81548152906001019060200180831161214a57829003601f168201915b5050505050905090565b601260019054906101000a900460ff1681565b61218c612a0d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f190614875565b60405180910390fd5b8060066000612207612a0d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166122b4612a0d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122f9919061463d565b60405180910390a35050565b612310848484612ac7565b61231c848484846131bf565b61235b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235290614935565b60405180910390fd5b50505050565b6013818154811061237157600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60115481565b60606123b182612a00565b6123f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e790614855565b60405180910390fd5b60001515601260009054906101000a900460ff161515141561249e57600b805461241990614d43565b80601f016020809104026020016040519081016040528092919081815260200182805461244590614d43565b80156124925780601f1061246757610100808354040283529160200191612492565b820191906000526020600020905b81548152906001019060200180831161247557829003601f168201915b505050505090506124fa565b60006124a8613356565b905060008151116124c857604051806020016040528060008152506124f6565b806124d2846133e8565b600a6040516020016124e69392919061456e565b6040516020818303038152906040525b9150505b919050565b612507612a0d565b73ffffffffffffffffffffffffffffffffffffffff166125256120b5565b73ffffffffffffffffffffffffffffffffffffffff161461257b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257290614835565b60405180910390fd5b8060118190555050565b60105481565b600d5481565b612599612a0d565b73ffffffffffffffffffffffffffffffffffffffff166125b76120b5565b73ffffffffffffffffffffffffffffffffffffffff161461260d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260490614835565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6126c6612a0d565b73ffffffffffffffffffffffffffffffffffffffff166126e46120b5565b73ffffffffffffffffffffffffffffffffffffffff161461273a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273190614835565b60405180910390fd5b60136000612748919061398e565b8181601391906127599291906139af565b505050565b612766612a0d565b73ffffffffffffffffffffffffffffffffffffffff166127846120b5565b73ffffffffffffffffffffffffffffffffffffffff16146127da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d190614835565b60405180910390fd5b80600d8190555050565b6127ec612a0d565b73ffffffffffffffffffffffffffffffffffffffff1661280a6120b5565b73ffffffffffffffffffffffffffffffffffffffff1614612860576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285790614835565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156128d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c790614715565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000612ad282613025565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612af9612a0d565b73ffffffffffffffffffffffffffffffffffffffff161480612b555750612b1e612a0d565b73ffffffffffffffffffffffffffffffffffffffff16612b3d84610caa565b73ffffffffffffffffffffffffffffffffffffffff16145b80612b715750612b708260000151612b6b612a0d565b61262a565b5b905080612bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612baa90614895565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612c25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1c90614815565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612c95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8c90614775565b60405180910390fd5b612ca28585856001613549565b612cb26000848460000151612a15565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612f9757612ef681612a00565b15612f965782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613000858585600161354f565b5050505050565b613021828260405180602001604052806000815250613555565b5050565b61302d613a4f565b61303682612a00565b613075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306c90614735565b60405180910390fd5b60008290505b6000811061317e576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461316f5780925050506131ba565b5080806001900391505061307b565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131b1906149d5565b60405180910390fd5b919050565b60006131e08473ffffffffffffffffffffffffffffffffffffffff16613567565b15613349578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613209612a0d565b8786866040518563ffffffff1660e01b815260040161322b94939291906145cf565b602060405180830381600087803b15801561324557600080fd5b505af192505050801561327657506040513d601f19601f820116820180604052508101906132739190613ec4565b60015b6132f9573d80600081146132a6576040519150601f19603f3d011682016040523d82523d6000602084013e6132ab565b606091505b506000815114156132f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132e890614935565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061334e565b600190505b949350505050565b60606009805461336590614d43565b80601f016020809104026020016040519081016040528092919081815260200182805461339190614d43565b80156133de5780601f106133b3576101008083540402835291602001916133de565b820191906000526020600020905b8154815290600101906020018083116133c157829003601f168201915b5050505050905090565b60606000821415613430576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613544565b600082905060005b6000821461346257808061344b90614da6565b915050600a8261345b9190614ba9565b9150613438565b60008167ffffffffffffffff81111561347e5761347d614f0b565b5b6040519080825280601f01601f1916602001820160405280156134b05781602001600182028036833780820191505090505b5090505b6000851461353d576001826134c99190614c34565b9150600a856134d89190614def565b60306134e49190614b53565b60f81b8183815181106134fa576134f9614edc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856135369190614ba9565b94506134b4565b8093505050505b919050565b50505050565b50505050565b613562838383600161358a565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135f790614955565b60405180910390fd5b6000841415613644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161363b90614975565b60405180910390fd5b6136516000868387613549565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b858110156138eb57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a483156138d65761389660008884886131bf565b6138d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138cc90614935565b60405180910390fd5b5b8180600101925050808060010191505061381f565b508060008190555050613901600086838761354f565b5050505050565b82805461391490614d43565b90600052602060002090601f016020900481019282613936576000855561397d565b82601f1061394f57805160ff191683800117855561397d565b8280016001018555821561397d579182015b8281111561397c578251825591602001919060010190613961565b5b50905061398a9190613a89565b5090565b50805460008255906000526020600020908101906139ac9190613a89565b50565b828054828255906000526020600020908101928215613a3e579160200282015b82811115613a3d57823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906139cf565b5b509050613a4b9190613a89565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613aa2576000816000905550600101613a8a565b5090565b6000613ab9613ab484614a55565b614a30565b905082815260208101848484011115613ad557613ad4614f49565b5b613ae0848285614d01565b509392505050565b6000613afb613af684614a86565b614a30565b905082815260208101848484011115613b1757613b16614f49565b5b613b22848285614d01565b509392505050565b600081359050613b39816156a8565b92915050565b60008083601f840112613b5557613b54614f3f565b5b8235905067ffffffffffffffff811115613b7257613b71614f3a565b5b602083019150836020820283011115613b8e57613b8d614f44565b5b9250929050565b600081359050613ba4816156bf565b92915050565b600081359050613bb9816156d6565b92915050565b600081519050613bce816156d6565b92915050565b600082601f830112613be957613be8614f3f565b5b8135613bf9848260208601613aa6565b91505092915050565b600081359050613c11816156ed565b92915050565b600082601f830112613c2c57613c2b614f3f565b5b8135613c3c848260208601613ae8565b91505092915050565b600081359050613c54816156fd565b92915050565b600060208284031215613c7057613c6f614f53565b5b6000613c7e84828501613b2a565b91505092915050565b60008060408385031215613c9e57613c9d614f53565b5b6000613cac85828601613b2a565b9250506020613cbd85828601613b2a565b9150509250929050565b600080600060608486031215613ce057613cdf614f53565b5b6000613cee86828701613b2a565b9350506020613cff86828701613b2a565b9250506040613d1086828701613c45565b9150509250925092565b60008060008060808587031215613d3457613d33614f53565b5b6000613d4287828801613b2a565b9450506020613d5387828801613b2a565b9350506040613d6487828801613c45565b925050606085013567ffffffffffffffff811115613d8557613d84614f4e565b5b613d9187828801613bd4565b91505092959194509250565b60008060408385031215613db457613db3614f53565b5b6000613dc285828601613b2a565b9250506020613dd385828601613b95565b9150509250929050565b60008060408385031215613df457613df3614f53565b5b6000613e0285828601613b2a565b9250506020613e1385828601613c45565b9150509250929050565b60008060208385031215613e3457613e33614f53565b5b600083013567ffffffffffffffff811115613e5257613e51614f4e565b5b613e5e85828601613b3f565b92509250509250929050565b600060208284031215613e8057613e7f614f53565b5b6000613e8e84828501613b95565b91505092915050565b600060208284031215613ead57613eac614f53565b5b6000613ebb84828501613baa565b91505092915050565b600060208284031215613eda57613ed9614f53565b5b6000613ee884828501613bbf565b91505092915050565b600060208284031215613f0757613f06614f53565b5b6000613f1584828501613c02565b91505092915050565b600060208284031215613f3457613f33614f53565b5b600082013567ffffffffffffffff811115613f5257613f51614f4e565b5b613f5e84828501613c17565b91505092915050565b600060208284031215613f7d57613f7c614f53565b5b6000613f8b84828501613c45565b91505092915050565b6000613fa08383614550565b60208301905092915050565b613fb581614c68565b82525050565b6000613fc682614adc565b613fd08185614b0a565b9350613fdb83614ab7565b8060005b8381101561400c578151613ff38882613f94565b9750613ffe83614afd565b925050600181019050613fdf565b5085935050505092915050565b61402281614c7a565b82525050565b600061403382614ae7565b61403d8185614b1b565b935061404d818560208601614d10565b61405681614f58565b840191505092915050565b61406a81614cef565b82525050565b600061407b82614af2565b6140858185614b37565b9350614095818560208601614d10565b61409e81614f58565b840191505092915050565b60006140b482614af2565b6140be8185614b48565b93506140ce818560208601614d10565b80840191505092915050565b600081546140e781614d43565b6140f18186614b48565b9450600182166000811461410c576001811461411d57614150565b60ff19831686528186019350614150565b61412685614ac7565b60005b8381101561414857815481890152600182019150602081019050614129565b838801955050505b50505092915050565b6000614166602283614b37565b915061417182614f69565b604082019050919050565b6000614189600f83614b37565b915061419482614fb8565b602082019050919050565b60006141ac602e83614b37565b91506141b782614fe1565b604082019050919050565b60006141cf600783614b37565b91506141da82615030565b602082019050919050565b60006141f2602683614b37565b91506141fd82615059565b604082019050919050565b6000614215602a83614b37565b9150614220826150a8565b604082019050919050565b6000614238602383614b37565b9150614243826150f7565b604082019050919050565b600061425b602583614b37565b915061426682615146565b604082019050919050565b600061427e601783614b37565b915061428982615195565b602082019050919050565b60006142a1603983614b37565b91506142ac826151be565b604082019050919050565b60006142c4601283614b37565b91506142cf8261520d565b602082019050919050565b60006142e7602b83614b37565b91506142f282615236565b604082019050919050565b600061430a602683614b37565b915061431582615285565b604082019050919050565b600061432d602083614b37565b9150614338826152d4565b602082019050919050565b6000614350602f83614b37565b915061435b826152fd565b604082019050919050565b6000614373601a83614b37565b915061437e8261534c565b602082019050919050565b6000614396603283614b37565b91506143a182615375565b604082019050919050565b60006143b9601c83614b37565b91506143c4826153c4565b602082019050919050565b60006143dc601d83614b37565b91506143e7826153ed565b602082019050919050565b60006143ff602283614b37565b915061440a82615416565b604082019050919050565b6000614422600083614b2c565b915061442d82615465565b600082019050919050565b6000614445601083614b37565b915061445082615468565b602082019050919050565b6000614468603383614b37565b915061447382615491565b604082019050919050565b600061448b602183614b37565b9150614496826154e0565b604082019050919050565b60006144ae602883614b37565b91506144b98261552f565b604082019050919050565b60006144d1601383614b37565b91506144dc8261557e565b602082019050919050565b60006144f4602e83614b37565b91506144ff826155a7565b604082019050919050565b6000614517602f83614b37565b9150614522826155f6565b604082019050919050565b600061453a602d83614b37565b915061454582615645565b604082019050919050565b61455981614ce5565b82525050565b61456881614ce5565b82525050565b600061457a82866140a9565b915061458682856140a9565b915061459282846140da565b9150819050949350505050565b60006145aa82614415565b9150819050919050565b60006020820190506145c96000830184613fac565b92915050565b60006080820190506145e46000830187613fac565b6145f16020830186613fac565b6145fe604083018561455f565b81810360608301526146108184614028565b905095945050505050565b600060208201905081810360008301526146358184613fbb565b905092915050565b60006020820190506146526000830184614019565b92915050565b600060208201905061466d6000830184614061565b92915050565b6000602082019050818103600083015261468d8184614070565b905092915050565b600060208201905081810360008301526146ae81614159565b9050919050565b600060208201905081810360008301526146ce8161417c565b9050919050565b600060208201905081810360008301526146ee8161419f565b9050919050565b6000602082019050818103600083015261470e816141c2565b9050919050565b6000602082019050818103600083015261472e816141e5565b9050919050565b6000602082019050818103600083015261474e81614208565b9050919050565b6000602082019050818103600083015261476e8161422b565b9050919050565b6000602082019050818103600083015261478e8161424e565b9050919050565b600060208201905081810360008301526147ae81614271565b9050919050565b600060208201905081810360008301526147ce81614294565b9050919050565b600060208201905081810360008301526147ee816142b7565b9050919050565b6000602082019050818103600083015261480e816142da565b9050919050565b6000602082019050818103600083015261482e816142fd565b9050919050565b6000602082019050818103600083015261484e81614320565b9050919050565b6000602082019050818103600083015261486e81614343565b9050919050565b6000602082019050818103600083015261488e81614366565b9050919050565b600060208201905081810360008301526148ae81614389565b9050919050565b600060208201905081810360008301526148ce816143ac565b9050919050565b600060208201905081810360008301526148ee816143cf565b9050919050565b6000602082019050818103600083015261490e816143f2565b9050919050565b6000602082019050818103600083015261492e81614438565b9050919050565b6000602082019050818103600083015261494e8161445b565b9050919050565b6000602082019050818103600083015261496e8161447e565b9050919050565b6000602082019050818103600083015261498e816144a1565b9050919050565b600060208201905081810360008301526149ae816144c4565b9050919050565b600060208201905081810360008301526149ce816144e7565b9050919050565b600060208201905081810360008301526149ee8161450a565b9050919050565b60006020820190508181036000830152614a0e8161452d565b9050919050565b6000602082019050614a2a600083018461455f565b92915050565b6000614a3a614a4b565b9050614a468282614d75565b919050565b6000604051905090565b600067ffffffffffffffff821115614a7057614a6f614f0b565b5b614a7982614f58565b9050602081019050919050565b600067ffffffffffffffff821115614aa157614aa0614f0b565b5b614aaa82614f58565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614b5e82614ce5565b9150614b6983614ce5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b9e57614b9d614e20565b5b828201905092915050565b6000614bb482614ce5565b9150614bbf83614ce5565b925082614bcf57614bce614e4f565b5b828204905092915050565b6000614be582614ce5565b9150614bf083614ce5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614c2957614c28614e20565b5b828202905092915050565b6000614c3f82614ce5565b9150614c4a83614ce5565b925082821015614c5d57614c5c614e20565b5b828203905092915050565b6000614c7382614cc5565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050614cc082615694565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614cfa82614cb2565b9050919050565b82818337600083830152505050565b60005b83811015614d2e578082015181840152602081019050614d13565b83811115614d3d576000848401525b50505050565b60006002820490506001821680614d5b57607f821691505b60208210811415614d6f57614d6e614ead565b5b50919050565b614d7e82614f58565b810181811067ffffffffffffffff82111715614d9d57614d9c614f0b565b5b80604052505050565b6000614db182614ce5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614de457614de3614e20565b5b600182019050919050565b6000614dfa82614ce5565b9150614e0583614ce5565b925082614e1557614e14614e4f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e4f545f5055424c49435f53414c450000000000000000000000000000000000600082015250565b7f4d696e696d756d2031204e46542068617320746f206265206d696e746564207060008201527f6572207472616e73616374696f6e000000000000000000000000000000000000602082015250565b7f4e6f206d6f726500000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f55736572206973206e6f742077686974656c6973746564000000000000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f4e4f545f57484954454c4953545f53414c450000000000000000000000000000600082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f4d6178204e465420706572206164647265737320657863656564656400000000600082015250565b7f506c656173652073656e642074686520657861637420616d6f756e742e000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b7f4d61782070657220545820726561636865642e00000000000000000000000000600082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b600381106156a5576156a4614e7e565b5b50565b6156b181614c68565b81146156bc57600080fd5b50565b6156c881614c7a565b81146156d357600080fd5b50565b6156df81614c86565b81146156ea57600080fd5b50565b600381106156fa57600080fd5b50565b61570681614ce5565b811461571157600080fd5b5056fea2646970667358221220940292608e5f7928dbd53f931870662accca0d645883eb96c3fdbcca598def8064736f6c63430008070033

Deployed Bytecode Sourcemap

68638:6348:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54589:422;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56631:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58336:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57857:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69121:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74759:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52756:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74368:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59363:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69924:660;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53469:1048;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73154:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69690:206;;;;;;;;;;;;;:::i;:::-;;59596:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71680:735;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73698:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74085:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52941:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74476:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69285:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69470:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68913:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73598:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69589:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56440:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55075:258;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18482:148;;;;;;;;;;;;;:::i;:::-;;74645:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73981:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70615:1057;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17831:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56800:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69504:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58700:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59844:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69545:37;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69399;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72423:723;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74201:159;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69345:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69178:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73886:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59082:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73436:154;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73788:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18785:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69235:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54589:422;54736:4;54793:25;54778:40;;;:11;:40;;;;:105;;;;54850:33;54835:48;;;:11;:48;;;;54778:105;:172;;;;54915:35;54900:50;;;:11;:50;;;;54778:172;:225;;;;54967:36;54991:11;54967:23;:36::i;:::-;54778:225;54758:245;;54589:422;;;:::o;56631:100::-;56685:13;56718:5;56711:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56631:100;:::o;58336:292::-;58440:7;58487:16;58495:7;58487;:16::i;:::-;58465:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;58596:15;:24;58612:7;58596:24;;;;;;;;;;;;;;;;;;;;;58589:31;;58336:292;;;:::o;57857:413::-;57930:13;57946:24;57962:7;57946:15;:24::i;:::-;57930:40;;57995:5;57989:11;;:2;:11;;;;57981:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;58090:5;58074:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;58099:37;58116:5;58123:12;:10;:12::i;:::-;58099:16;:37::i;:::-;58074:62;58052:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;58234:28;58243:2;58247:7;58256:5;58234:8;:28::i;:::-;57919:351;57857:413;;:::o;69121:34::-;;;;:::o;74759:106::-;18062:12;:10;:12::i;:::-;18051:23;;:7;:5;:7::i;:::-;:23;;;18043:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74847:10:::1;74835:9;:22;;;;;;;;;;;;:::i;:::-;;74759:106:::0;:::o;52756:108::-;52817:7;52844:12;;52837:19;;52756:108;:::o;74368:100::-;18062:12;:10;:12::i;:::-;18051:23;;:7;:5;:7::i;:::-;:23;;;18043:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74450:10:::1;74438:9;:22;;;;74368:100:::0;:::o;59363:162::-;59489:28;59499:4;59505:2;59509:7;59489:9;:28::i;:::-;59363:162;;;:::o;69924:660::-;69988:14;70005:13;:11;:13::i;:::-;69988:30;;70050:21;70037:34;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:34;;;;;;;;:::i;:::-;;;70029:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;70119:1;70110:6;:10;70102:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;70200:8;;70190:6;:18;;70182:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;70270:9;;70260:6;70251;:15;;;;:::i;:::-;:28;;70243:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;70322:7;:5;:7::i;:::-;70308:21;;:10;:21;;;70304:231;;70383:6;70346:21;:33;70368:10;70346:33;;;;;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;;;;;;;70454:4;;70445:6;:13;;;;:::i;:::-;70432:9;:26;;70406:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;70304:231;70547:29;70557:10;70569:6;70547:9;:29::i;:::-;69977:607;69924:660;:::o;53469:1048::-;53594:7;53635:16;53645:5;53635:9;:16::i;:::-;53627:5;:24;53619:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;53701:22;53726:13;:11;:13::i;:::-;53701:38;;53750:19;53780:25;53969:9;53964:466;53984:14;53980:1;:18;53964:466;;;54024:31;54058:11;:14;54070:1;54058:14;;;;;;;;;;;54024:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54121:1;54095:28;;:9;:14;;;:28;;;54091:111;;54168:9;:14;;;54148:34;;54091:111;54245:5;54224:26;;:17;:26;;;54220:195;;;54294:5;54279:11;:20;54275:85;;;54335:1;54328:8;;;;;;;;;54275:85;54382:13;;;;;;;54220:195;54005:425;54000:3;;;;;;;53964:466;;;;54453:56;;;;;;;;;;:::i;:::-;;;;;;;;53469:1048;;;;;:::o;73154:274::-;73213:4;73235:9;73247:1;73235:13;;73230:168;73254:20;:27;;;;73250:1;:31;73230:168;;;73334:5;73307:32;;:20;73328:1;73307:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:32;;;73303:84;;;73367:4;73360:11;;;;;73303:84;73283:3;;;;;:::i;:::-;;;;73230:168;;;;73415:5;73408:12;;73154:274;;;;:::o;69690:206::-;18062:12;:10;:12::i;:::-;18051:23;;:7;:5;:7::i;:::-;:23;;;18043:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69741:12:::1;69767:10;69759:24;;69805:21;69759:82;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69740:101;;;69860:7;69852:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;69729:167;69690:206::o:0;59596:177::-;59726:39;59743:4;59749:2;59753:7;59726:39;;;;;;;;;;;;:16;:39::i;:::-;59596:177;;;:::o;71680:735::-;71767:16;71801:23;71827:17;71837:6;71827:9;:17::i;:::-;71801:43;;71855:30;71902:15;71888:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71855:63;;71929:22;71954:1;71929:26;;71966:23;72006:371;72045:15;72027;:33;:64;;;;;72082:9;;72064:14;:27;;72027:64;72006:371;;;72118:25;72146:23;72154:14;72146:7;:23::i;:::-;72118:51;;72209:6;72188:27;;:17;:27;;;72184:151;;;72269:14;72236:13;72250:15;72236:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;72302:17;;;;;:::i;:::-;;;;72184:151;72349:16;;;;;:::i;:::-;;;;72103:274;72006:371;;;72394:13;72387:20;;;;;;71680:735;;;:::o;73698:82::-;18062:12;:10;:12::i;:::-;18051:23;;:7;:5;:7::i;:::-;:23;;;18043:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73767:5:::1;73760:4;:12;;;;73698:82:::0;:::o;74085:108::-;18062:12;:10;:12::i;:::-;18051:23;;:7;:5;:7::i;:::-;:23;;;18043:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74173:12:::1;74159:11;:26;;;;74085:108:::0;:::o;52941:228::-;53044:7;53085:13;:11;:13::i;:::-;53077:5;:21;53069:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;53156:5;53149:12;;52941:228;;;:::o;74476:161::-;18062:12;:10;:12::i;:::-;18051:23;;:7;:5;:7::i;:::-;:23;;;18043:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74611:18:::1;74591:17;:38;;;;;;;;;;;;:::i;:::-;;74476:161:::0;:::o;69285:33::-;;;;:::o;69470:27::-;;;;;;;;;;;;;:::o;68913:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;73598:92::-;18062:12;:10;:12::i;:::-;18051:23;;:7;:5;:7::i;:::-;:23;;;18043:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73676:6:::1;73664:9;;:18;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;73598:92:::0;:::o;69589:26::-;;;;;;;;;;;;;:::o;56440:124::-;56504:7;56531:20;56543:7;56531:11;:20::i;:::-;:25;;;56524:32;;56440:124;;;:::o;55075:258::-;55139:7;55198:1;55181:19;;:5;:19;;;;55159:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;55297:12;:19;55310:5;55297:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;55289:36;;55282:43;;55075:258;;;:::o;18482:148::-;18062:12;:10;:12::i;:::-;18051:23;;:7;:5;:7::i;:::-;:23;;;18043:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18589:1:::1;18552:40;;18573:6;;;;;;;;;;;18552:40;;;;;;;;;;;;18620:1;18603:6;;:19;;;;;;;;;;;;;;;;;;18482:148::o:0;74645:106::-;18062:12;:10;:12::i;:::-;18051:23;;:7;:5;:7::i;:::-;:23;;;18043:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74733:10:::1;74721:9;:22;;;;;;;;;;;;:::i;:::-;;74645:106:::0;:::o;73981:96::-;18062:12;:10;:12::i;:::-;18051:23;;:7;:5;:7::i;:::-;:23;;;18043:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74060:9:::1;74049:8;:20;;;;73981:96:::0;:::o;70615:1057::-;70682:14;70699:13;:11;:13::i;:::-;70682:30;;70744:24;70731:37;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:37;;;;;;;;:::i;:::-;;;70723:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70819:1;70810:6;:10;70802:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;70900:8;;70890:6;:18;;70882:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;70970:11;;70960:6;70951;:15;;;;:::i;:::-;:30;;70943:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;71024:7;:5;:7::i;:::-;71010:21;;:10;:21;;;71006:617;;71071:4;71052:23;;:15;;;;;;;;;;;:23;;;71048:372;;;71104:25;71118:10;71104:13;:25::i;:::-;71096:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;71176:24;71203:21;:33;71225:10;71203:33;;;;;;;;;;;;;;;;71176:60;;71314:18;;71304:6;71285:16;:25;;;;:::i;:::-;:47;;71255:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;71077:343;71048:372;71471:6;71434:21;:33;71456:10;71434:33;;;;;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;;;;;;;71540:6;;71531;:15;;;;:::i;:::-;71518:9;:28;;71492:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;71006:617;71635:29;71645:10;71657:6;71635:9;:29::i;:::-;70671:1001;70615:1057;:::o;17831:87::-;17877:7;17904:6;;;;;;;;;;;17897:13;;17831:87;:::o;56800:104::-;56856:13;56889:7;56882:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56800:104;:::o;69504:34::-;;;;;;;;;;;;;:::o;58700:311::-;58830:12;:10;:12::i;:::-;58818:24;;:8;:24;;;;58810:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;58931:8;58886:18;:32;58905:12;:10;:12::i;:::-;58886:32;;;;;;;;;;;;;;;:42;58919:8;58886:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;58984:8;58955:48;;58970:12;:10;:12::i;:::-;58955:48;;;58994:8;58955:48;;;;;;:::i;:::-;;;;;;;;58700:311;;:::o;59844:355::-;60003:28;60013:4;60019:2;60023:7;60003:9;:28::i;:::-;60064:48;60087:4;60093:2;60097:7;60106:5;60064:22;:48::i;:::-;60042:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;59844:355;;;;:::o;69545:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;69399:::-;;;;:::o;72423:723::-;72542:13;72595:17;72603:8;72595:7;:17::i;:::-;72573:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;72714:5;72702:17;;:8;;;;;;;;;;;:17;;;72698:74;;;72743:17;72736:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72698:74;72782:28;72813:10;:8;:10::i;:::-;72782:41;;72885:1;72860:14;72854:28;:32;:284;;;;;;;;;;;;;;;;;72978:14;73019:19;:8;:17;:19::i;:::-;73065:9;72935:162;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;72854:284;72834:304;;;72423:723;;;;:::o;74201:159::-;18062:12;:10;:12::i;:::-;18051:23;;:7;:5;:7::i;:::-;:23;;;18043:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74333:19:::1;74312:18;:40;;;;74201:159:::0;:::o;69345:31::-;;;;:::o;69178:25::-;;;;:::o;73886:87::-;18062:12;:10;:12::i;:::-;18051:23;;:7;:5;:7::i;:::-;:23;;;18043:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73959:6:::1;73948:8;;:17;;;;;;;;;;;;;;;;;;73886:87:::0;:::o;59082:214::-;59224:4;59253:18;:25;59272:5;59253:25;;;;;;;;;;;;;;;:35;59279:8;59253:35;;;;;;;;;;;;;;;;;;;;;;;;;59246:42;;59082:214;;;;:::o;73436:154::-;18062:12;:10;:12::i;:::-;18051:23;;:7;:5;:7::i;:::-;:23;;;18043:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73522:20:::1;;73515:27;;;;:::i;:::-;73576:6;;73553:20;:29;;;;;;;:::i;:::-;;73436:154:::0;;:::o;73788:90::-;18062:12;:10;:12::i;:::-;18051:23;;:7;:5;:7::i;:::-;:23;;;18043:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73863:7:::1;73854:6;:16;;;;73788:90:::0;:::o;18785:281::-;18062:12;:10;:12::i;:::-;18051:23;;:7;:5;:7::i;:::-;:23;;;18043:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18908:1:::1;18888:22;;:8;:22;;;;18866:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;19021:8;18992:38;;19013:6;;;;;;;;;;;18992:38;;;;;;;;;;;;19050:8;19041:6;;:17;;;;;;;;;;;;;;;;;;18785:281:::0;:::o;69235:28::-;;;;:::o;26369:207::-;26499:4;26543:25;26528:40;;;:11;:40;;;;26521:47;;26369:207;;;:::o;60454:111::-;60511:4;60545:12;;60535:7;:22;60528:29;;60454:111;;;:::o;12809:98::-;12862:7;12889:10;12882:17;;12809:98;:::o;65617:196::-;65759:2;65732:15;:24;65748:7;65732:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;65797:7;65793:2;65777:28;;65786:5;65777:28;;;;;;;;;;;;65617:196;;;:::o;63397:2102::-;63512:35;63550:20;63562:7;63550:11;:20::i;:::-;63512:58;;63583:22;63625:13;:18;;;63609:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;63684:12;:10;:12::i;:::-;63660:36;;:20;63672:7;63660:11;:20::i;:::-;:36;;;63609:87;:154;;;;63713:50;63730:13;:18;;;63750:12;:10;:12::i;:::-;63713:16;:50::i;:::-;63609:154;63583:181;;63799:17;63777:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;63951:4;63929:26;;:13;:18;;;:26;;;63907:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;64054:1;64040:16;;:2;:16;;;;64032:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;64111:43;64133:4;64139:2;64143:7;64152:1;64111:21;:43::i;:::-;64219:49;64236:1;64240:7;64249:13;:18;;;64219:8;:49::i;:::-;64594:1;64564:12;:18;64577:4;64564:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64638:1;64610:12;:16;64623:2;64610:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64684:2;64656:11;:20;64668:7;64656:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;64746:15;64701:11;:20;64713:7;64701:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;65014:19;65046:1;65036:7;:11;65014:33;;65107:1;65066:43;;:11;:24;65078:11;65066:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;65062:321;;;65134:20;65142:11;65134:7;:20::i;:::-;65130:238;;;65211:13;:18;;;65179:11;:24;65191:11;65179:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;65294:13;:54;;;65252:11;:24;65264:11;65252:24;;;;;;;;;;;:39;;;:96;;;;;;;;;;;;;;;;;;65130:238;65062:321;64539:855;65430:7;65426:2;65411:27;;65420:4;65411:27;;;;;;;;;;;;65449:42;65470:4;65476:2;65480:7;65489:1;65449:20;:42::i;:::-;63501:1998;;63397:2102;;;:::o;60573:104::-;60642:27;60652:2;60656:8;60642:27;;;;;;;;;;;;:9;:27::i;:::-;60573:104;;:::o;55809:569::-;55897:21;;:::i;:::-;55944:16;55952:7;55944;:16::i;:::-;55936:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;56050:12;56065:7;56050:22;;56045:245;56082:1;56074:4;:9;56045:245;;56112:31;56146:11;:17;56158:4;56146:17;;;;;;;;;;;56112:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56212:1;56186:28;;:9;:14;;;:28;;;56182:93;;56246:9;56239:16;;;;;;56182:93;56093:197;56085:6;;;;;;;;56045:245;;;;56313:57;;;;;;;;;;:::i;:::-;;;;;;;;55809:569;;;;:::o;66378:985::-;66533:4;66554:15;:2;:13;;;:15::i;:::-;66550:806;;;66623:2;66607:36;;;66666:12;:10;:12::i;:::-;66701:4;66728:7;66758:5;66607:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;66586:715;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66986:1;66969:6;:13;:18;66965:321;;;67012:109;;;;;;;;;;:::i;:::-;;;;;;;;66965:321;67236:6;67230:13;67221:6;67217:2;67213:15;67206:38;66586:715;66856:45;;;66846:55;;;:6;:55;;;;66839:62;;;;;66550:806;67340:4;67333:11;;66378:985;;;;;;;:::o;74873:110::-;74933:13;74966:9;74959:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74873:110;:::o;13492:723::-;13548:13;13778:1;13769:5;:10;13765:53;;;13796:10;;;;;;;;;;;;;;;;;;;;;13765:53;13828:12;13843:5;13828:20;;13859:14;13884:78;13899:1;13891:4;:9;13884:78;;13917:8;;;;;:::i;:::-;;;;13948:2;13940:10;;;;;:::i;:::-;;;13884:78;;;13972:19;14004:6;13994:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13972:39;;14022:154;14038:1;14029:5;:10;14022:154;;14066:1;14056:11;;;;;:::i;:::-;;;14133:2;14125:5;:10;;;;:::i;:::-;14112:2;:24;;;;:::i;:::-;14099:39;;14082:6;14089;14082:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;14162:2;14153:11;;;;;:::i;:::-;;;14022:154;;;14200:6;14186:21;;;;;13492:723;;;;:::o;67851:159::-;;;;;:::o;68422:158::-;;;;;:::o;61040:163::-;61163:32;61169:2;61173:8;61183:5;61190:4;61163:5;:32::i;:::-;61040:163;;;:::o;1725:326::-;1785:4;2042:1;2020:7;:19;;;:23;2013:30;;1725:326;;;:::o;61462:1681::-;61601:20;61624:12;;61601:35;;61669:1;61655:16;;:2;:16;;;;61647:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;61740:1;61728:8;:13;;61720:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;61799:61;61829:1;61833:2;61837:12;61851:8;61799:21;:61::i;:::-;62174:8;62138:12;:16;62151:2;62138:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62239:8;62198:12;:16;62211:2;62198:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62298:2;62265:11;:25;62277:12;62265:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;62365:15;62315:11;:25;62327:12;62315:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;62398:20;62421:12;62398:35;;62455:9;62450:558;62470:8;62466:1;:12;62450:558;;;62534:12;62530:2;62509:38;;62526:1;62509:38;;;;;;;;;;;;62570:4;62566:392;;;62633:202;62694:1;62727:2;62760:12;62803:5;62633:22;:202::i;:::-;62599:339;;;;;;;;;;;;:::i;:::-;;;;;;;;;62566:392;62978:14;;;;;;;62480:3;;;;;;;62450:558;;;;63039:12;63024;:27;;;;62113:950;63075:60;63104:1;63108:2;63112:12;63126:8;63075:20;:60::i;:::-;61590:1553;61462:1681;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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;2363:167::-;2423:5;2461:6;2448:20;2439:29;;2477:47;2518:5;2477:47;:::i;:::-;2363:167;;;;:::o;2550:340::-;2606:5;2655:3;2648:4;2640:6;2636:17;2632:27;2622:122;;2663:79;;:::i;:::-;2622:122;2780:6;2767:20;2805:79;2880:3;2872:6;2865:4;2857:6;2853:17;2805:79;:::i;:::-;2796:88;;2612:278;2550:340;;;;:::o;2896:139::-;2942:5;2980:6;2967:20;2958:29;;2996:33;3023:5;2996:33;:::i;:::-;2896:139;;;;:::o;3041:329::-;3100:6;3149:2;3137:9;3128:7;3124:23;3120:32;3117:119;;;3155:79;;:::i;:::-;3117:119;3275:1;3300:53;3345:7;3336:6;3325:9;3321:22;3300:53;:::i;:::-;3290:63;;3246:117;3041:329;;;;:::o;3376:474::-;3444:6;3452;3501:2;3489:9;3480:7;3476:23;3472:32;3469:119;;;3507:79;;:::i;:::-;3469:119;3627:1;3652:53;3697:7;3688:6;3677:9;3673:22;3652:53;:::i;:::-;3642:63;;3598:117;3754:2;3780:53;3825:7;3816:6;3805:9;3801:22;3780:53;:::i;:::-;3770:63;;3725:118;3376:474;;;;;:::o;3856:619::-;3933:6;3941;3949;3998:2;3986:9;3977:7;3973:23;3969:32;3966:119;;;4004:79;;:::i;:::-;3966:119;4124:1;4149:53;4194:7;4185:6;4174:9;4170:22;4149:53;:::i;:::-;4139:63;;4095:117;4251:2;4277:53;4322:7;4313:6;4302:9;4298:22;4277:53;:::i;:::-;4267:63;;4222:118;4379:2;4405:53;4450:7;4441:6;4430:9;4426:22;4405:53;:::i;:::-;4395:63;;4350:118;3856:619;;;;;:::o;4481:943::-;4576:6;4584;4592;4600;4649:3;4637:9;4628:7;4624:23;4620:33;4617:120;;;4656:79;;:::i;:::-;4617:120;4776:1;4801:53;4846:7;4837:6;4826:9;4822:22;4801:53;:::i;:::-;4791:63;;4747:117;4903:2;4929:53;4974:7;4965:6;4954:9;4950:22;4929:53;:::i;:::-;4919:63;;4874:118;5031:2;5057:53;5102:7;5093:6;5082:9;5078:22;5057:53;:::i;:::-;5047:63;;5002:118;5187:2;5176:9;5172:18;5159:32;5218:18;5210:6;5207:30;5204:117;;;5240:79;;:::i;:::-;5204:117;5345:62;5399:7;5390:6;5379:9;5375:22;5345:62;:::i;:::-;5335:72;;5130:287;4481:943;;;;;;;:::o;5430:468::-;5495:6;5503;5552:2;5540:9;5531:7;5527:23;5523:32;5520:119;;;5558:79;;:::i;:::-;5520:119;5678:1;5703:53;5748:7;5739:6;5728:9;5724:22;5703:53;:::i;:::-;5693:63;;5649:117;5805:2;5831:50;5873:7;5864:6;5853:9;5849:22;5831:50;:::i;:::-;5821:60;;5776:115;5430:468;;;;;:::o;5904:474::-;5972:6;5980;6029:2;6017:9;6008:7;6004:23;6000:32;5997:119;;;6035:79;;:::i;:::-;5997:119;6155:1;6180:53;6225:7;6216:6;6205:9;6201:22;6180:53;:::i;:::-;6170:63;;6126:117;6282:2;6308:53;6353:7;6344:6;6333:9;6329:22;6308:53;:::i;:::-;6298:63;;6253:118;5904:474;;;;;:::o;6384:559::-;6470:6;6478;6527:2;6515:9;6506:7;6502:23;6498:32;6495:119;;;6533:79;;:::i;:::-;6495:119;6681:1;6670:9;6666:17;6653:31;6711:18;6703:6;6700:30;6697:117;;;6733:79;;:::i;:::-;6697:117;6846:80;6918:7;6909:6;6898:9;6894:22;6846:80;:::i;:::-;6828:98;;;;6624:312;6384:559;;;;;:::o;6949:323::-;7005:6;7054:2;7042:9;7033:7;7029:23;7025:32;7022:119;;;7060:79;;:::i;:::-;7022:119;7180:1;7205:50;7247:7;7238:6;7227:9;7223:22;7205:50;:::i;:::-;7195:60;;7151:114;6949:323;;;;:::o;7278:327::-;7336:6;7385:2;7373:9;7364:7;7360:23;7356:32;7353:119;;;7391:79;;:::i;:::-;7353:119;7511:1;7536:52;7580:7;7571:6;7560:9;7556:22;7536:52;:::i;:::-;7526:62;;7482:116;7278:327;;;;:::o;7611:349::-;7680:6;7729:2;7717:9;7708:7;7704:23;7700:32;7697:119;;;7735:79;;:::i;:::-;7697:119;7855:1;7880:63;7935:7;7926:6;7915:9;7911:22;7880:63;:::i;:::-;7870:73;;7826:127;7611:349;;;;:::o;7966:357::-;8039:6;8088:2;8076:9;8067:7;8063:23;8059:32;8056:119;;;8094:79;;:::i;:::-;8056:119;8214:1;8239:67;8298:7;8289:6;8278:9;8274:22;8239:67;:::i;:::-;8229:77;;8185:131;7966:357;;;;:::o;8329:509::-;8398:6;8447:2;8435:9;8426:7;8422:23;8418:32;8415:119;;;8453:79;;:::i;:::-;8415:119;8601:1;8590:9;8586:17;8573:31;8631:18;8623:6;8620:30;8617:117;;;8653:79;;:::i;:::-;8617:117;8758:63;8813:7;8804:6;8793:9;8789:22;8758:63;:::i;:::-;8748:73;;8544:287;8329:509;;;;:::o;8844:329::-;8903:6;8952:2;8940:9;8931:7;8927:23;8923:32;8920:119;;;8958:79;;:::i;:::-;8920:119;9078:1;9103:53;9148:7;9139:6;9128:9;9124:22;9103:53;:::i;:::-;9093:63;;9049:117;8844:329;;;;:::o;9179:179::-;9248:10;9269:46;9311:3;9303:6;9269:46;:::i;:::-;9347:4;9342:3;9338:14;9324:28;;9179:179;;;;:::o;9364:118::-;9451:24;9469:5;9451:24;:::i;:::-;9446:3;9439:37;9364:118;;:::o;9518:732::-;9637:3;9666:54;9714:5;9666:54;:::i;:::-;9736:86;9815:6;9810:3;9736:86;:::i;:::-;9729:93;;9846:56;9896:5;9846:56;:::i;:::-;9925:7;9956:1;9941:284;9966:6;9963:1;9960:13;9941:284;;;10042:6;10036:13;10069:63;10128:3;10113:13;10069:63;:::i;:::-;10062:70;;10155:60;10208:6;10155:60;:::i;:::-;10145:70;;10001:224;9988:1;9985;9981:9;9976:14;;9941:284;;;9945:14;10241:3;10234:10;;9642:608;;;9518:732;;;;:::o;10256:109::-;10337:21;10352:5;10337:21;:::i;:::-;10332:3;10325:34;10256:109;;:::o;10371:360::-;10457:3;10485:38;10517:5;10485:38;:::i;:::-;10539:70;10602:6;10597:3;10539:70;:::i;:::-;10532:77;;10618:52;10663:6;10658:3;10651:4;10644:5;10640:16;10618:52;:::i;:::-;10695:29;10717:6;10695:29;:::i;:::-;10690:3;10686:39;10679:46;;10461:270;10371:360;;;;:::o;10737:155::-;10836:49;10879:5;10836:49;:::i;:::-;10831:3;10824:62;10737:155;;:::o;10898:364::-;10986:3;11014:39;11047:5;11014:39;:::i;:::-;11069:71;11133:6;11128:3;11069:71;:::i;:::-;11062:78;;11149:52;11194:6;11189:3;11182:4;11175:5;11171:16;11149:52;:::i;:::-;11226:29;11248:6;11226:29;:::i;:::-;11221:3;11217:39;11210:46;;10990:272;10898:364;;;;:::o;11268:377::-;11374:3;11402:39;11435:5;11402:39;:::i;:::-;11457:89;11539:6;11534:3;11457:89;:::i;:::-;11450:96;;11555:52;11600:6;11595:3;11588:4;11581:5;11577:16;11555:52;:::i;:::-;11632:6;11627:3;11623:16;11616:23;;11378:267;11268:377;;;;:::o;11675:845::-;11778:3;11815:5;11809:12;11844:36;11870:9;11844:36;:::i;:::-;11896:89;11978:6;11973:3;11896:89;:::i;:::-;11889:96;;12016:1;12005:9;12001:17;12032:1;12027:137;;;;12178:1;12173:341;;;;11994:520;;12027:137;12111:4;12107:9;12096;12092:25;12087:3;12080:38;12147:6;12142:3;12138:16;12131:23;;12027:137;;12173:341;12240:38;12272:5;12240:38;:::i;:::-;12300:1;12314:154;12328:6;12325:1;12322:13;12314:154;;;12402:7;12396:14;12392:1;12387:3;12383:11;12376:35;12452:1;12443:7;12439:15;12428:26;;12350:4;12347:1;12343:12;12338:17;;12314:154;;;12497:6;12492:3;12488:16;12481:23;;12180:334;;11994:520;;11782:738;;11675:845;;;;:::o;12526:366::-;12668:3;12689:67;12753:2;12748:3;12689:67;:::i;:::-;12682:74;;12765:93;12854:3;12765:93;:::i;:::-;12883:2;12878:3;12874:12;12867:19;;12526:366;;;:::o;12898:::-;13040:3;13061:67;13125:2;13120:3;13061:67;:::i;:::-;13054:74;;13137:93;13226:3;13137:93;:::i;:::-;13255:2;13250:3;13246:12;13239:19;;12898:366;;;:::o;13270:::-;13412:3;13433:67;13497:2;13492:3;13433:67;:::i;:::-;13426:74;;13509:93;13598:3;13509:93;:::i;:::-;13627:2;13622:3;13618:12;13611:19;;13270:366;;;:::o;13642:365::-;13784:3;13805:66;13869:1;13864:3;13805:66;:::i;:::-;13798:73;;13880:93;13969:3;13880:93;:::i;:::-;13998:2;13993:3;13989:12;13982:19;;13642:365;;;:::o;14013:366::-;14155:3;14176:67;14240:2;14235:3;14176:67;:::i;:::-;14169:74;;14252:93;14341:3;14252:93;:::i;:::-;14370:2;14365:3;14361:12;14354:19;;14013:366;;;:::o;14385:::-;14527:3;14548:67;14612:2;14607:3;14548:67;:::i;:::-;14541:74;;14624:93;14713:3;14624:93;:::i;:::-;14742:2;14737:3;14733:12;14726:19;;14385:366;;;:::o;14757:::-;14899:3;14920:67;14984:2;14979:3;14920:67;:::i;:::-;14913:74;;14996:93;15085:3;14996:93;:::i;:::-;15114:2;15109:3;15105:12;15098:19;;14757:366;;;:::o;15129:::-;15271:3;15292:67;15356:2;15351:3;15292:67;:::i;:::-;15285:74;;15368:93;15457:3;15368:93;:::i;:::-;15486:2;15481:3;15477:12;15470:19;;15129:366;;;:::o;15501:::-;15643:3;15664:67;15728:2;15723:3;15664:67;:::i;:::-;15657:74;;15740:93;15829:3;15740:93;:::i;:::-;15858:2;15853:3;15849:12;15842:19;;15501:366;;;:::o;15873:::-;16015:3;16036:67;16100:2;16095:3;16036:67;:::i;:::-;16029:74;;16112:93;16201:3;16112:93;:::i;:::-;16230:2;16225:3;16221:12;16214:19;;15873:366;;;:::o;16245:::-;16387:3;16408:67;16472:2;16467:3;16408:67;:::i;:::-;16401:74;;16484:93;16573:3;16484:93;:::i;:::-;16602:2;16597:3;16593:12;16586:19;;16245:366;;;:::o;16617:::-;16759:3;16780:67;16844:2;16839:3;16780:67;:::i;:::-;16773:74;;16856:93;16945:3;16856:93;:::i;:::-;16974:2;16969:3;16965:12;16958:19;;16617:366;;;:::o;16989:::-;17131:3;17152:67;17216:2;17211:3;17152:67;:::i;:::-;17145:74;;17228:93;17317:3;17228:93;:::i;:::-;17346:2;17341:3;17337:12;17330:19;;16989:366;;;:::o;17361:::-;17503:3;17524:67;17588:2;17583:3;17524:67;:::i;:::-;17517:74;;17600:93;17689:3;17600:93;:::i;:::-;17718:2;17713:3;17709:12;17702:19;;17361:366;;;:::o;17733:::-;17875:3;17896:67;17960:2;17955:3;17896:67;:::i;:::-;17889:74;;17972:93;18061:3;17972:93;:::i;:::-;18090:2;18085:3;18081:12;18074:19;;17733:366;;;:::o;18105:::-;18247:3;18268:67;18332:2;18327:3;18268:67;:::i;:::-;18261:74;;18344:93;18433:3;18344:93;:::i;:::-;18462:2;18457:3;18453:12;18446:19;;18105:366;;;:::o;18477:::-;18619:3;18640:67;18704:2;18699:3;18640:67;:::i;:::-;18633:74;;18716:93;18805:3;18716:93;:::i;:::-;18834:2;18829:3;18825:12;18818:19;;18477:366;;;:::o;18849:::-;18991:3;19012:67;19076:2;19071:3;19012:67;:::i;:::-;19005:74;;19088:93;19177:3;19088:93;:::i;:::-;19206:2;19201:3;19197:12;19190:19;;18849:366;;;:::o;19221:::-;19363:3;19384:67;19448:2;19443:3;19384:67;:::i;:::-;19377:74;;19460:93;19549:3;19460:93;:::i;:::-;19578:2;19573:3;19569:12;19562:19;;19221:366;;;:::o;19593:::-;19735:3;19756:67;19820:2;19815:3;19756:67;:::i;:::-;19749:74;;19832:93;19921:3;19832:93;:::i;:::-;19950:2;19945:3;19941:12;19934:19;;19593:366;;;:::o;19965:398::-;20124:3;20145:83;20226:1;20221:3;20145:83;:::i;:::-;20138:90;;20237:93;20326:3;20237:93;:::i;:::-;20355:1;20350:3;20346:11;20339:18;;19965:398;;;:::o;20369:366::-;20511:3;20532:67;20596:2;20591:3;20532:67;:::i;:::-;20525:74;;20608:93;20697:3;20608:93;:::i;:::-;20726:2;20721:3;20717:12;20710:19;;20369:366;;;:::o;20741:::-;20883:3;20904:67;20968:2;20963:3;20904:67;:::i;:::-;20897:74;;20980:93;21069:3;20980:93;:::i;:::-;21098:2;21093:3;21089:12;21082:19;;20741:366;;;:::o;21113:::-;21255:3;21276:67;21340:2;21335:3;21276:67;:::i;:::-;21269:74;;21352:93;21441:3;21352:93;:::i;:::-;21470:2;21465:3;21461:12;21454:19;;21113:366;;;:::o;21485:::-;21627:3;21648:67;21712:2;21707:3;21648:67;:::i;:::-;21641:74;;21724:93;21813:3;21724:93;:::i;:::-;21842:2;21837:3;21833:12;21826:19;;21485:366;;;:::o;21857:::-;21999:3;22020:67;22084:2;22079:3;22020:67;:::i;:::-;22013:74;;22096:93;22185:3;22096:93;:::i;:::-;22214:2;22209:3;22205:12;22198:19;;21857:366;;;:::o;22229:::-;22371:3;22392:67;22456:2;22451:3;22392:67;:::i;:::-;22385:74;;22468:93;22557:3;22468:93;:::i;:::-;22586:2;22581:3;22577:12;22570:19;;22229:366;;;:::o;22601:::-;22743:3;22764:67;22828:2;22823:3;22764:67;:::i;:::-;22757:74;;22840:93;22929:3;22840:93;:::i;:::-;22958:2;22953:3;22949:12;22942:19;;22601:366;;;:::o;22973:::-;23115:3;23136:67;23200:2;23195:3;23136:67;:::i;:::-;23129:74;;23212:93;23301:3;23212:93;:::i;:::-;23330:2;23325:3;23321:12;23314:19;;22973:366;;;:::o;23345:108::-;23422:24;23440:5;23422:24;:::i;:::-;23417:3;23410:37;23345:108;;:::o;23459:118::-;23546:24;23564:5;23546:24;:::i;:::-;23541:3;23534:37;23459:118;;:::o;23583:589::-;23808:3;23830:95;23921:3;23912:6;23830:95;:::i;:::-;23823:102;;23942:95;24033:3;24024:6;23942:95;:::i;:::-;23935:102;;24054:92;24142:3;24133:6;24054:92;:::i;:::-;24047:99;;24163:3;24156:10;;23583:589;;;;;;:::o;24178:379::-;24362:3;24384:147;24527:3;24384:147;:::i;:::-;24377:154;;24548:3;24541:10;;24178:379;;;:::o;24563:222::-;24656:4;24694:2;24683:9;24679:18;24671:26;;24707:71;24775:1;24764:9;24760:17;24751:6;24707:71;:::i;:::-;24563:222;;;;:::o;24791:640::-;24986:4;25024:3;25013:9;25009:19;25001:27;;25038:71;25106:1;25095:9;25091:17;25082:6;25038:71;:::i;:::-;25119:72;25187:2;25176:9;25172:18;25163:6;25119:72;:::i;:::-;25201;25269:2;25258:9;25254:18;25245:6;25201:72;:::i;:::-;25320:9;25314:4;25310:20;25305:2;25294:9;25290:18;25283:48;25348:76;25419:4;25410:6;25348:76;:::i;:::-;25340:84;;24791:640;;;;;;;:::o;25437:373::-;25580:4;25618:2;25607:9;25603:18;25595:26;;25667:9;25661:4;25657:20;25653:1;25642:9;25638:17;25631:47;25695:108;25798:4;25789:6;25695:108;:::i;:::-;25687:116;;25437:373;;;;:::o;25816:210::-;25903:4;25941:2;25930:9;25926:18;25918:26;;25954:65;26016:1;26005:9;26001:17;25992:6;25954:65;:::i;:::-;25816:210;;;;:::o;26032:246::-;26137:4;26175:2;26164:9;26160:18;26152:26;;26188:83;26268:1;26257:9;26253:17;26244:6;26188:83;:::i;:::-;26032:246;;;;:::o;26284:313::-;26397:4;26435:2;26424:9;26420:18;26412:26;;26484:9;26478:4;26474:20;26470:1;26459:9;26455:17;26448:47;26512:78;26585:4;26576:6;26512:78;:::i;:::-;26504:86;;26284:313;;;;:::o;26603:419::-;26769:4;26807:2;26796:9;26792:18;26784:26;;26856:9;26850:4;26846:20;26842:1;26831:9;26827:17;26820:47;26884:131;27010:4;26884:131;:::i;:::-;26876:139;;26603:419;;;:::o;27028:::-;27194:4;27232:2;27221:9;27217:18;27209:26;;27281:9;27275:4;27271:20;27267:1;27256:9;27252:17;27245:47;27309:131;27435:4;27309:131;:::i;:::-;27301:139;;27028:419;;;:::o;27453:::-;27619:4;27657:2;27646:9;27642:18;27634:26;;27706:9;27700:4;27696:20;27692:1;27681:9;27677:17;27670:47;27734:131;27860:4;27734:131;:::i;:::-;27726:139;;27453:419;;;:::o;27878:::-;28044:4;28082:2;28071:9;28067:18;28059:26;;28131:9;28125:4;28121:20;28117:1;28106:9;28102:17;28095:47;28159:131;28285:4;28159:131;:::i;:::-;28151:139;;27878:419;;;:::o;28303:::-;28469:4;28507:2;28496:9;28492:18;28484:26;;28556:9;28550:4;28546:20;28542:1;28531:9;28527:17;28520:47;28584:131;28710:4;28584:131;:::i;:::-;28576:139;;28303:419;;;:::o;28728:::-;28894:4;28932:2;28921:9;28917:18;28909:26;;28981:9;28975:4;28971:20;28967:1;28956:9;28952:17;28945:47;29009:131;29135:4;29009:131;:::i;:::-;29001:139;;28728:419;;;:::o;29153:::-;29319:4;29357:2;29346:9;29342:18;29334:26;;29406:9;29400:4;29396:20;29392:1;29381:9;29377:17;29370:47;29434:131;29560:4;29434:131;:::i;:::-;29426:139;;29153:419;;;:::o;29578:::-;29744:4;29782:2;29771:9;29767:18;29759:26;;29831:9;29825:4;29821:20;29817:1;29806:9;29802:17;29795:47;29859:131;29985:4;29859:131;:::i;:::-;29851:139;;29578:419;;;:::o;30003:::-;30169:4;30207:2;30196:9;30192:18;30184:26;;30256:9;30250:4;30246:20;30242:1;30231:9;30227:17;30220:47;30284:131;30410:4;30284:131;:::i;:::-;30276:139;;30003:419;;;:::o;30428:::-;30594:4;30632:2;30621:9;30617:18;30609:26;;30681:9;30675:4;30671:20;30667:1;30656:9;30652:17;30645:47;30709:131;30835:4;30709:131;:::i;:::-;30701:139;;30428:419;;;:::o;30853:::-;31019:4;31057:2;31046:9;31042:18;31034:26;;31106:9;31100:4;31096:20;31092:1;31081:9;31077:17;31070:47;31134:131;31260:4;31134:131;:::i;:::-;31126:139;;30853:419;;;:::o;31278:::-;31444:4;31482:2;31471:9;31467:18;31459:26;;31531:9;31525:4;31521:20;31517:1;31506:9;31502:17;31495:47;31559:131;31685:4;31559:131;:::i;:::-;31551:139;;31278:419;;;:::o;31703:::-;31869:4;31907:2;31896:9;31892:18;31884:26;;31956:9;31950:4;31946:20;31942:1;31931:9;31927:17;31920:47;31984:131;32110:4;31984:131;:::i;:::-;31976:139;;31703:419;;;:::o;32128:::-;32294:4;32332:2;32321:9;32317:18;32309:26;;32381:9;32375:4;32371:20;32367:1;32356:9;32352:17;32345:47;32409:131;32535:4;32409:131;:::i;:::-;32401:139;;32128:419;;;:::o;32553:::-;32719:4;32757:2;32746:9;32742:18;32734:26;;32806:9;32800:4;32796:20;32792:1;32781:9;32777:17;32770:47;32834:131;32960:4;32834:131;:::i;:::-;32826:139;;32553:419;;;:::o;32978:::-;33144:4;33182:2;33171:9;33167:18;33159:26;;33231:9;33225:4;33221:20;33217:1;33206:9;33202:17;33195:47;33259:131;33385:4;33259:131;:::i;:::-;33251:139;;32978:419;;;:::o;33403:::-;33569:4;33607:2;33596:9;33592:18;33584:26;;33656:9;33650:4;33646:20;33642:1;33631:9;33627:17;33620:47;33684:131;33810:4;33684:131;:::i;:::-;33676:139;;33403:419;;;:::o;33828:::-;33994:4;34032:2;34021:9;34017:18;34009:26;;34081:9;34075:4;34071:20;34067:1;34056:9;34052:17;34045:47;34109:131;34235:4;34109:131;:::i;:::-;34101:139;;33828:419;;;:::o;34253:::-;34419:4;34457:2;34446:9;34442:18;34434:26;;34506:9;34500:4;34496:20;34492:1;34481:9;34477:17;34470:47;34534:131;34660:4;34534:131;:::i;:::-;34526:139;;34253:419;;;:::o;34678:::-;34844:4;34882:2;34871:9;34867:18;34859:26;;34931:9;34925:4;34921:20;34917:1;34906:9;34902:17;34895:47;34959:131;35085:4;34959:131;:::i;:::-;34951:139;;34678:419;;;:::o;35103:::-;35269:4;35307:2;35296:9;35292:18;35284:26;;35356:9;35350:4;35346:20;35342:1;35331:9;35327:17;35320:47;35384:131;35510:4;35384:131;:::i;:::-;35376:139;;35103:419;;;:::o;35528:::-;35694:4;35732:2;35721:9;35717:18;35709:26;;35781:9;35775:4;35771:20;35767:1;35756:9;35752:17;35745:47;35809:131;35935:4;35809:131;:::i;:::-;35801:139;;35528:419;;;:::o;35953:::-;36119:4;36157:2;36146:9;36142:18;36134:26;;36206:9;36200:4;36196:20;36192:1;36181:9;36177:17;36170:47;36234:131;36360:4;36234:131;:::i;:::-;36226:139;;35953:419;;;:::o;36378:::-;36544:4;36582:2;36571:9;36567:18;36559:26;;36631:9;36625:4;36621:20;36617:1;36606:9;36602:17;36595:47;36659:131;36785:4;36659:131;:::i;:::-;36651:139;;36378:419;;;:::o;36803:::-;36969:4;37007:2;36996:9;36992:18;36984:26;;37056:9;37050:4;37046:20;37042:1;37031:9;37027:17;37020:47;37084:131;37210:4;37084:131;:::i;:::-;37076:139;;36803:419;;;:::o;37228:::-;37394:4;37432:2;37421:9;37417:18;37409:26;;37481:9;37475:4;37471:20;37467:1;37456:9;37452:17;37445:47;37509:131;37635:4;37509:131;:::i;:::-;37501:139;;37228:419;;;:::o;37653:::-;37819:4;37857:2;37846:9;37842:18;37834:26;;37906:9;37900:4;37896:20;37892:1;37881:9;37877:17;37870:47;37934:131;38060:4;37934:131;:::i;:::-;37926:139;;37653:419;;;:::o;38078:::-;38244:4;38282:2;38271:9;38267:18;38259:26;;38331:9;38325:4;38321:20;38317:1;38306:9;38302:17;38295:47;38359:131;38485:4;38359:131;:::i;:::-;38351:139;;38078:419;;;:::o;38503:222::-;38596:4;38634:2;38623:9;38619:18;38611:26;;38647:71;38715:1;38704:9;38700:17;38691:6;38647:71;:::i;:::-;38503:222;;;;:::o;38731:129::-;38765:6;38792:20;;:::i;:::-;38782:30;;38821:33;38849:4;38841:6;38821:33;:::i;:::-;38731:129;;;:::o;38866:75::-;38899:6;38932:2;38926:9;38916:19;;38866:75;:::o;38947:307::-;39008:4;39098:18;39090:6;39087:30;39084:56;;;39120:18;;:::i;:::-;39084:56;39158:29;39180:6;39158:29;:::i;:::-;39150:37;;39242:4;39236;39232:15;39224:23;;38947:307;;;:::o;39260:308::-;39322:4;39412:18;39404:6;39401:30;39398:56;;;39434:18;;:::i;:::-;39398:56;39472:29;39494:6;39472:29;:::i;:::-;39464:37;;39556:4;39550;39546:15;39538:23;;39260:308;;;:::o;39574:132::-;39641:4;39664:3;39656:11;;39694:4;39689:3;39685:14;39677:22;;39574:132;;;:::o;39712:141::-;39761:4;39784:3;39776:11;;39807:3;39804:1;39797:14;39841:4;39838:1;39828:18;39820:26;;39712:141;;;:::o;39859:114::-;39926:6;39960:5;39954:12;39944:22;;39859:114;;;:::o;39979:98::-;40030:6;40064:5;40058:12;40048:22;;39979:98;;;:::o;40083:99::-;40135:6;40169:5;40163:12;40153:22;;40083:99;;;:::o;40188:113::-;40258:4;40290;40285:3;40281:14;40273:22;;40188:113;;;:::o;40307:184::-;40406:11;40440:6;40435:3;40428:19;40480:4;40475:3;40471:14;40456:29;;40307:184;;;;:::o;40497:168::-;40580:11;40614:6;40609:3;40602:19;40654:4;40649:3;40645:14;40630:29;;40497:168;;;;:::o;40671:147::-;40772:11;40809:3;40794:18;;40671:147;;;;:::o;40824:169::-;40908:11;40942:6;40937:3;40930:19;40982:4;40977:3;40973:14;40958:29;;40824:169;;;;:::o;40999:148::-;41101:11;41138:3;41123:18;;40999:148;;;;:::o;41153:305::-;41193:3;41212:20;41230:1;41212:20;:::i;:::-;41207:25;;41246:20;41264:1;41246:20;:::i;:::-;41241:25;;41400:1;41332:66;41328:74;41325:1;41322:81;41319:107;;;41406:18;;:::i;:::-;41319:107;41450:1;41447;41443:9;41436:16;;41153:305;;;;:::o;41464:185::-;41504:1;41521:20;41539:1;41521:20;:::i;:::-;41516:25;;41555:20;41573:1;41555:20;:::i;:::-;41550:25;;41594:1;41584:35;;41599:18;;:::i;:::-;41584:35;41641:1;41638;41634:9;41629:14;;41464:185;;;;:::o;41655:348::-;41695:7;41718:20;41736:1;41718:20;:::i;:::-;41713:25;;41752:20;41770:1;41752:20;:::i;:::-;41747:25;;41940:1;41872:66;41868:74;41865:1;41862:81;41857:1;41850:9;41843:17;41839:105;41836:131;;;41947:18;;:::i;:::-;41836:131;41995:1;41992;41988:9;41977:20;;41655:348;;;;:::o;42009:191::-;42049:4;42069:20;42087:1;42069:20;:::i;:::-;42064:25;;42103:20;42121:1;42103:20;:::i;:::-;42098:25;;42142:1;42139;42136:8;42133:34;;;42147:18;;:::i;:::-;42133:34;42192:1;42189;42185:9;42177:17;;42009:191;;;;:::o;42206:96::-;42243:7;42272:24;42290:5;42272:24;:::i;:::-;42261:35;;42206:96;;;:::o;42308:90::-;42342:7;42385:5;42378:13;42371:21;42360:32;;42308:90;;;:::o;42404:149::-;42440:7;42480:66;42473:5;42469:78;42458:89;;42404:149;;;:::o;42559:139::-;42610:7;42639:5;42628:16;;42645:47;42686:5;42645:47;:::i;:::-;42559:139;;;:::o;42704:126::-;42741:7;42781:42;42774:5;42770:54;42759:65;;42704:126;;;:::o;42836:77::-;42873:7;42902:5;42891:16;;42836:77;;;:::o;42919:139::-;42981:9;43014:38;43046:5;43014:38;:::i;:::-;43001:51;;42919:139;;;:::o;43064:154::-;43148:6;43143:3;43138;43125:30;43210:1;43201:6;43196:3;43192:16;43185:27;43064:154;;;:::o;43224:307::-;43292:1;43302:113;43316:6;43313:1;43310:13;43302:113;;;43401:1;43396:3;43392:11;43386:18;43382:1;43377:3;43373:11;43366:39;43338:2;43335:1;43331:10;43326:15;;43302:113;;;43433:6;43430:1;43427:13;43424:101;;;43513:1;43504:6;43499:3;43495:16;43488:27;43424:101;43273:258;43224:307;;;:::o;43537:320::-;43581:6;43618:1;43612:4;43608:12;43598:22;;43665:1;43659:4;43655:12;43686:18;43676:81;;43742:4;43734:6;43730:17;43720:27;;43676:81;43804:2;43796:6;43793:14;43773:18;43770:38;43767:84;;;43823:18;;:::i;:::-;43767:84;43588:269;43537:320;;;:::o;43863:281::-;43946:27;43968:4;43946:27;:::i;:::-;43938:6;43934:40;44076:6;44064:10;44061:22;44040:18;44028:10;44025:34;44022:62;44019:88;;;44087:18;;:::i;:::-;44019:88;44127:10;44123:2;44116:22;43906:238;43863:281;;:::o;44150:233::-;44189:3;44212:24;44230:5;44212:24;:::i;:::-;44203:33;;44258:66;44251:5;44248:77;44245:103;;;44328:18;;:::i;:::-;44245:103;44375:1;44368:5;44364:13;44357:20;;44150:233;;;:::o;44389:176::-;44421:1;44438:20;44456:1;44438:20;:::i;:::-;44433:25;;44472:20;44490:1;44472:20;:::i;:::-;44467:25;;44511:1;44501:35;;44516:18;;:::i;:::-;44501:35;44557:1;44554;44550:9;44545:14;;44389:176;;;;:::o;44571:180::-;44619:77;44616:1;44609:88;44716:4;44713:1;44706:15;44740:4;44737:1;44730:15;44757:180;44805:77;44802:1;44795:88;44902:4;44899:1;44892:15;44926:4;44923:1;44916:15;44943:180;44991:77;44988:1;44981:88;45088:4;45085:1;45078:15;45112:4;45109:1;45102:15;45129:180;45177:77;45174:1;45167:88;45274:4;45271:1;45264:15;45298:4;45295:1;45288:15;45315:180;45363:77;45360:1;45353:88;45460:4;45457:1;45450:15;45484:4;45481:1;45474:15;45501:180;45549:77;45546:1;45539:88;45646:4;45643:1;45636:15;45670:4;45667:1;45660:15;45687:117;45796:1;45793;45786:12;45810:117;45919:1;45916;45909:12;45933:117;46042:1;46039;46032:12;46056:117;46165:1;46162;46155:12;46179:117;46288:1;46285;46278:12;46302:117;46411:1;46408;46401:12;46425:102;46466:6;46517:2;46513:7;46508:2;46501:5;46497:14;46493:28;46483:38;;46425:102;;;:::o;46533:221::-;46673:34;46669:1;46661:6;46657:14;46650:58;46742:4;46737:2;46729:6;46725:15;46718:29;46533:221;:::o;46760:165::-;46900:17;46896:1;46888:6;46884:14;46877:41;46760:165;:::o;46931:233::-;47071:34;47067:1;47059:6;47055:14;47048:58;47140:16;47135:2;47127:6;47123:15;47116:41;46931:233;:::o;47170:157::-;47310:9;47306:1;47298:6;47294:14;47287:33;47170:157;:::o;47333:225::-;47473:34;47469:1;47461:6;47457:14;47450:58;47542:8;47537:2;47529:6;47525:15;47518:33;47333:225;:::o;47564:229::-;47704:34;47700:1;47692:6;47688:14;47681:58;47773:12;47768:2;47760:6;47756:15;47749:37;47564:229;:::o;47799:222::-;47939:34;47935:1;47927:6;47923:14;47916:58;48008:5;48003:2;47995:6;47991:15;47984:30;47799:222;:::o;48027:224::-;48167:34;48163:1;48155:6;48151:14;48144:58;48236:7;48231:2;48223:6;48219:15;48212:32;48027:224;:::o;48257:173::-;48397:25;48393:1;48385:6;48381:14;48374:49;48257:173;:::o;48436:244::-;48576:34;48572:1;48564:6;48560:14;48553:58;48645:27;48640:2;48632:6;48628:15;48621:52;48436:244;:::o;48686:168::-;48826:20;48822:1;48814:6;48810:14;48803:44;48686:168;:::o;48860:230::-;49000:34;48996:1;48988:6;48984:14;48977:58;49069:13;49064:2;49056:6;49052:15;49045:38;48860:230;:::o;49096:225::-;49236:34;49232:1;49224:6;49220:14;49213:58;49305:8;49300:2;49292:6;49288:15;49281:33;49096:225;:::o;49327:182::-;49467:34;49463:1;49455:6;49451:14;49444:58;49327:182;:::o;49515:234::-;49655:34;49651:1;49643:6;49639:14;49632:58;49724:17;49719:2;49711:6;49707:15;49700:42;49515:234;:::o;49755:176::-;49895:28;49891:1;49883:6;49879:14;49872:52;49755:176;:::o;49937:237::-;50077:34;50073:1;50065:6;50061:14;50054:58;50146:20;50141:2;50133:6;50129:15;50122:45;49937:237;:::o;50180:178::-;50320:30;50316:1;50308:6;50304:14;50297:54;50180:178;:::o;50364:179::-;50504:31;50500:1;50492:6;50488:14;50481:55;50364:179;:::o;50549:221::-;50689:34;50685:1;50677:6;50673:14;50666:58;50758:4;50753:2;50745:6;50741:15;50734:29;50549:221;:::o;50776:114::-;;:::o;50896:166::-;51036:18;51032:1;51024:6;51020:14;51013:42;50896:166;:::o;51068:238::-;51208:34;51204:1;51196:6;51192:14;51185:58;51277:21;51272:2;51264:6;51260:15;51253:46;51068:238;:::o;51312:220::-;51452:34;51448:1;51440:6;51436:14;51429:58;51521:3;51516:2;51508:6;51504:15;51497:28;51312:220;:::o;51538:227::-;51678:34;51674:1;51666:6;51662:14;51655:58;51747:10;51742:2;51734:6;51730:15;51723:35;51538:227;:::o;51771:169::-;51911:21;51907:1;51899:6;51895:14;51888:45;51771:169;:::o;51946:233::-;52086:34;52082:1;52074:6;52070:14;52063:58;52155:16;52150:2;52142:6;52138:15;52131:41;51946:233;:::o;52185:234::-;52325:34;52321:1;52313:6;52309:14;52302:58;52394:17;52389:2;52381:6;52377:15;52370:42;52185:234;:::o;52425:232::-;52565:34;52561:1;52553:6;52549:14;52542:58;52634:15;52629:2;52621:6;52617:15;52610:40;52425:232;:::o;52663:119::-;52750:1;52743:5;52740:12;52730:46;;52756:18;;:::i;:::-;52730:46;52663:119;:::o;52788:122::-;52861:24;52879:5;52861:24;:::i;:::-;52854:5;52851:35;52841:63;;52900:1;52897;52890:12;52841:63;52788:122;:::o;52916:116::-;52986:21;53001:5;52986:21;:::i;:::-;52979:5;52976:32;52966:60;;53022:1;53019;53012:12;52966:60;52916:116;:::o;53038:120::-;53110:23;53127:5;53110:23;:::i;:::-;53103:5;53100:34;53090:62;;53148:1;53145;53138:12;53090:62;53038:120;:::o;53164:113::-;53251:1;53244:5;53241:12;53231:40;;53267:1;53264;53257:12;53231:40;53164:113;:::o;53283:122::-;53356:24;53374:5;53356:24;:::i;:::-;53349:5;53346:35;53336:63;;53395:1;53392;53385:12;53336:63;53283:122;:::o

Swarm Source

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