ETH Price: $3,280.25 (-3.82%)
Gas: 15 Gwei

Token

HuevosClub (HUEVOS)
 

Overview

Max Total Supply

1,110 HUEVOS

Holders

451

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 HUEVOS
0xe215cabe3e0e598a4f4b5de954088689a95c7420
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

1111 Huevos Collection done by a nurse!

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
HuevosClub

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

pragma solidity ^0.8.0;

// File @openzeppelin/contracts/utils/cryptography/[email protected]

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol)

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }
        return computedHash;
    }
}

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



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

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


// File @openzeppelin/contracts/access/[email protected]


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)



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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File @openzeppelin/contracts/utils/[email protected]


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



/**
 * @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/introspection/[email protected]


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



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


// File @openzeppelin/contracts/token/ERC721/[email protected]


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)



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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC721/[email protected]


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)



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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


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



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

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

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


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



/**
 * @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 @openzeppelin/contracts/utils/[email protected]


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



/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 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/utils/introspection/[email protected]


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



/**
 * @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 contracts/ERC721A.sol


// Creator: Chiru Labs


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

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex = 0;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        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 = 0;
        address currOwnershipAddr = address(0);
        for (uint256 i = 0; 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);
    }

    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), 'ERC721A: owner query for nonexistent token');

        for (uint256 curr = tokenId; ; 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())) : '';
    }

    /**
     * @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 Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` cannot be larger than the max batch size.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), 'ERC721A: mint to the zero address');
        // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
        require(!_exists(startTokenId), 'ERC721A: token already minted');
        require(quantity > 0, 'ERC721A: quantity must be greater 0');

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

        AddressData memory addressData = _addressData[to];
        _addressData[to] = AddressData(
            addressData.balance + uint128(quantity),
            addressData.numberMinted + uint128(quantity)
        );
        _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

        uint256 updatedIndex = startTokenId;

        for (uint256 i = 0; i < quantity; i++) {
            emit Transfer(address(0), to, updatedIndex);
            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.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;
        }

        _ownerships[tokenId] = TokenOwnership(to, 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] = TokenOwnership(prevOwnership.addr, 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 {}
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

contract OwnableDelegateProxy { }
contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

//Huevos Club Genesis Contract

contract HuevosClub is ERC721A, Ownable, ReentrancyGuard  {

    address public constant proxyRegistryAddress = 0xa5409ec958C83C3f309868babACA7c86DCB077c1;

    struct PresaleData {
        uint256 price;
        bytes32 merkleroot;
    }

    using SafeMath for uint256;
    using MerkleProof for bytes32[];

    uint256 public saleState;
    uint256 public maxSupply;
    uint256 public maxMintPerTransaction;
    uint256 public price;
    uint256 public teamSupply;
    string public baseURI;
    string public baseExtension;
    PresaleData public presaleData;

    modifier whenPublicSaleStarted() {
        require(saleState==2,"Public Sale not active");
        _;
    }

     modifier whenSaleStarted() {
        require(saleState > 0,"Sale not active");
        _;
    }
    
    modifier whenSaleStopped() {
        require(saleState == 0,"Sale already started");
        _;
    }

    modifier whenWhiteListSaleActive() {
        require(saleState == 1, "White list Sale not active");
        _;
    }

    modifier whenMerklerootSet() {
        require(presaleData.merkleroot!=0,"Merkleroot not set for presale");
        _;
    }

    modifier whenAddressOnWhitelist(bytes32[] memory _merkleproof) {
        require(MerkleProof.verify(
            _merkleproof,
            presaleData.merkleroot,
            keccak256(abi.encodePacked(msg.sender))
            ),
            "Not on white list"
        );
        _;
    }

    constructor() ERC721A("HuevosClub", "HUEVOS") {
        
        baseURI = "ipfs://QmdVr8LfqASfSaM83FVkymTUQuZarhQ3YiFKKoVJAMbd8P/";
        baseExtension = ".json";
        price = 0.05 ether;
        saleState = 0;
        maxSupply = 1111;
        teamSupply = 180;
        maxMintPerTransaction = 5;
        presaleData.price = 0.045 ether;
        presaleData.merkleroot = 0x55ec3c6a9f4cbcae5fc2544b56d09805613f9e9095f2c894ffe5b20458bdaa9a;
    }

    function reservedTeamMint(uint256 _amount, address _to) external onlyOwner {
        require(teamSupply >= _amount, "Exceeds airdrop for team");
        teamSupply -= _amount;
        _safeMint(_to, _amount);
    }

    function isApprovedForAll(address owner, address operator)
        override
        public
        view
        returns (bool)
    {
        ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
        if (address(proxyRegistry.proxies(owner)) == operator) {
            return true;
        }
        return super.isApprovedForAll(owner, operator);
    }

    function startPublicSale() external onlyOwner() {
        require(saleState != 2, "Sale already started");
        saleState = 2;
    }

    function startWhitelistSale() external 
        whenSaleStopped()
        whenMerklerootSet()
        onlyOwner() 
    {
        saleState = 1;
    }
    
    function stopSale() external whenSaleStarted() onlyOwner() {
        saleState = 0;
    }

    function mintPublic(uint256 _numTokens) external payable whenPublicSaleStarted() {
        uint256 supply = totalSupply();
        require(_numTokens <= maxMintPerTransaction, "Minting too many Huevo tokens at once!");
        require(supply.add(_numTokens) + teamSupply <= maxSupply, "Not enough Huevo Tokens remaining.");
        require(_numTokens.mul(price) <= msg.value, "Incorrect amount sent!");
        _safeMint(msg.sender, _numTokens);
    }

    function mintWhitelist(uint256 _numTokens, bytes32[] calldata _merkleproof) external payable 
        whenWhiteListSaleActive()
        whenMerklerootSet()
        whenAddressOnWhitelist(_merkleproof)
    {
        uint256 supply = totalSupply();
        require(_numTokens <= maxMintPerTransaction, "Minting too many Huevo tokens at once!");
        require(supply.add(_numTokens) + teamSupply <= maxSupply, "Not enough Huevo Tokens remaining.");
        require(_numTokens.mul(presaleData.price) <= msg.value, "Incorrect amount sent!");
        _safeMint(msg.sender, _numTokens);
    }

    function setBaseURI(string memory _URI) external onlyOwner {
        baseURI = _URI;
    }

    function setBaseExtension(string memory _extension) external onlyOwner {
        baseExtension = _extension;
    }

    function setPrice(uint256 _price) external onlyOwner {
        price = _price;
    }

    function setMerkleroot(bytes32 _merkleRoot) public 
        whenSaleStopped() 
        onlyOwner 
    {
        presaleData.merkleroot = _merkleRoot;
    }

    function withdraw() external onlyOwner nonReentrant {
        uint256 balance = address(this).balance;
        (bool success, ) = _msgSender().call{value: balance}("");
        require(success, "Failed to send");
    }

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

    function tokensInWallet(address _owner) public view returns(uint256[] memory) {
        uint256 tokenCount = balanceOf(_owner);
        uint256[] memory tokensId = new uint256[](tokenCount);
        for(uint256 i; i < tokenCount; i++){
            tokensId[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokensId;
    }

    function tokenURI(uint256 _tokenId) public view override returns (string memory) {
        require(_exists(_tokenId), "Token does not exist.");
        return bytes(baseURI).length > 0 ? string(
            abi.encodePacked(
              baseURI,
              Strings.toString(_tokenId),
              baseExtension
            )
        ) : "";
    }

    function mintableCount() public view returns(uint256) {
        uint256 supply = totalSupply();
        return maxSupply.sub(supply).sub(teamSupply);
    }

    /*
    replacement for burn functionality as not in ERC721a, supply is only 
    alowed to be reduced 
    */
    function reduceSupplyEmergency(uint256 _maxSupply) external onlyOwner {
        require(_maxSupply < maxSupply);
        maxSupply = _maxSupply;
    }
}

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":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numTokens","type":"uint256"}],"name":"mintPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numTokens","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleproof","type":"bytes32[]"}],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintableCount","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":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleData","outputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bytes32","name":"merkleroot","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"reduceSupplyEmergency","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"reservedTeamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_extension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleroot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startWhitelistSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensInWallet","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":[{"internalType":"address","name":"owner","type":"address"}],"name":"walletMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600080553480156200001557600080fd5b506040518060400160405280600a81526020017f487565766f73436c7562000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f485545564f53000000000000000000000000000000000000000000000000000081525081600190805190602001906200009a9291906200029f565b508060029080519060200190620000b39291906200029f565b505050620000d6620000ca620001d160201b60201c565b620001d960201b60201c565b600160088190555060405180606001604052806036815260200162005b1a60369139600e90805190602001906200010f9291906200029f565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600f90805190602001906200015d9291906200029f565b5066b1a2bc2ec50000600c819055506000600981905550610457600a8190555060b4600d819055506005600b81905550669fdf42f6e480006010600001819055507f55ec3c6a9f4cbcae5fc2544b56d09805613f9e9095f2c894ffe5b20458bdaa9a60001b601060010181905550620003b4565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002ad906200034f565b90600052602060002090601f016020900481019282620002d157600085556200031d565b82601f10620002ec57805160ff19168380011785556200031d565b828001600101855582156200031d579182015b828111156200031c578251825591602001919060010190620002ff565b5b5090506200032c919062000330565b5090565b5b808211156200034b57600081600090555060010162000331565b5090565b600060028204905060018216806200036857607f821691505b602082108114156200037f576200037e62000385565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61575680620003c46000396000f3fe60806040526004361061025c5760003560e01c80636c0360eb11610144578063c6682862116100b6578063e36b0b371161007a578063e36b0b37146108c8578063e985e9c5146108df578063efd0cbf91461091c578063f0293fd314610938578063f2fde38b14610975578063ff44e9151461099e5761025c565b8063c6682862146107e1578063c87b56dd1461080c578063cd7c032614610849578063d5abeb0114610874578063da3ef23f1461089f5761025c565b806391b7f5ed1161010857806391b7f5ed146106e757806392f6c4391461071057806395d89b4114610739578063a035b1fe14610764578063a22cb4651461078f578063b88d4fde146107b85761025c565b80636c0360eb1461061457806370a082311461063f578063715018a61461067c578063877bc761146106935780638da5cb5b146106bc5761025c565b80632cfac6ec116101dd5780634f6ccce7116101a15780634f6ccce7146104dd57806355f804b31461051a5780635cb06d4c14610543578063603f4d521461056f57806361c5c9351461059a5780636352211e146105d75761025c565b80632cfac6ec1461040a5780632f745c59146104355780633ccfd60b146104725780634254337e1461048957806342842e0e146104b45761025c565b8063081812fc11610224578063081812fc14610339578063095ea7b3146103765780630c1c972a1461039f57806318160ddd146103b657806323b872dd146103e15761025c565b806301f569971461026157806301ffc9a71461028c57806303585e24146102c9578063061431a8146102f257806306fdde031461030e575b600080fd5b34801561026d57600080fd5b506102766109b5565b60405161028391906150fe565b60405180910390f35b34801561029857600080fd5b506102b360048036038101906102ae9190613d5b565b6109bb565b6040516102c09190614cc1565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190613e17565b610b05565b005b61030c60048036038101906103079190613e7c565b610b99565b005b34801561031a57600080fd5b50610323610e00565b6040516103309190614cdc565b60405180910390f35b34801561034557600080fd5b50610360600480360381019061035b9190613e17565b610e92565b60405161036d9190614c38565b60405180910390f35b34801561038257600080fd5b5061039d60048036038101906103989190613cf6565b610f17565b005b3480156103ab57600080fd5b506103b4611030565b005b3480156103c257600080fd5b506103cb6110fc565b6040516103d891906150fe565b60405180910390f35b3480156103ed57600080fd5b5061040860048036038101906104039190613bf0565b611105565b005b34801561041657600080fd5b5061041f611115565b60405161042c91906150fe565b60405180910390f35b34801561044157600080fd5b5061045c60048036038101906104579190613cf6565b61111b565b60405161046991906150fe565b60405180910390f35b34801561047e57600080fd5b50610487611319565b005b34801561049557600080fd5b5061049e6114a7565b6040516104ab91906150fe565b60405180910390f35b3480156104c057600080fd5b506104db60048036038101906104d69190613bf0565b6114e3565b005b3480156104e957600080fd5b5061050460048036038101906104ff9190613e17565b611503565b60405161051191906150fe565b60405180910390f35b34801561052657600080fd5b50610541600480360381019061053c9190613dd6565b611556565b005b34801561054f57600080fd5b506105586115ec565b604051610566929190615119565b60405180910390f35b34801561057b57600080fd5b506105846115fe565b60405161059191906150fe565b60405180910390f35b3480156105a657600080fd5b506105c160048036038101906105bc9190613b8b565b611604565b6040516105ce9190614c9f565b60405180910390f35b3480156105e357600080fd5b506105fe60048036038101906105f99190613e17565b6116fe565b60405161060b9190614c38565b60405180910390f35b34801561062057600080fd5b50610629611714565b6040516106369190614cdc565b60405180910390f35b34801561064b57600080fd5b5061066660048036038101906106619190613b8b565b6117a2565b60405161067391906150fe565b60405180910390f35b34801561068857600080fd5b5061069161188b565b005b34801561069f57600080fd5b506106ba60048036038101906106b59190613e40565b611913565b005b3480156106c857600080fd5b506106d16119fb565b6040516106de9190614c38565b60405180910390f35b3480156106f357600080fd5b5061070e60048036038101906107099190613e17565b611a25565b005b34801561071c57600080fd5b5061073760048036038101906107329190613d32565b611aab565b005b34801561074557600080fd5b5061074e611b79565b60405161075b9190614cdc565b60405180910390f35b34801561077057600080fd5b50610779611c0b565b60405161078691906150fe565b60405180910390f35b34801561079b57600080fd5b506107b660048036038101906107b19190613cba565b611c11565b005b3480156107c457600080fd5b506107df60048036038101906107da9190613c3f565b611d92565b005b3480156107ed57600080fd5b506107f6611dee565b6040516108039190614cdc565b60405180910390f35b34801561081857600080fd5b50610833600480360381019061082e9190613e17565b611e7c565b6040516108409190614cdc565b60405180910390f35b34801561085557600080fd5b5061085e611f27565b60405161086b9190614c38565b60405180910390f35b34801561088057600080fd5b50610889611f3f565b60405161089691906150fe565b60405180910390f35b3480156108ab57600080fd5b506108c660048036038101906108c19190613dd6565b611f45565b005b3480156108d457600080fd5b506108dd611fdb565b005b3480156108eb57600080fd5b5061090660048036038101906109019190613bb4565b6120a6565b6040516109139190614cc1565b60405180910390f35b61093660048036038101906109319190613e17565b61219a565b005b34801561094457600080fd5b5061095f600480360381019061095a9190613b8b565b6122f9565b60405161096c91906150fe565b60405180910390f35b34801561098157600080fd5b5061099c60048036038101906109979190613b8b565b61230b565b005b3480156109aa57600080fd5b506109b3612403565b005b600b5481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a8657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610aee57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610afe5750610afd82612519565b5b9050919050565b610b0d612583565b73ffffffffffffffffffffffffffffffffffffffff16610b2b6119fb565b73ffffffffffffffffffffffffffffffffffffffff1614610b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7890614efe565b60405180910390fd5b600a548110610b8f57600080fd5b80600a8190555050565b600160095414610bde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd5906150be565b60405180910390fd5b6000801b6010600101541415610c29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2090614e7e565b60405180910390fd5b818180806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050610ca18160106001015433604051602001610c869190614bab565b6040516020818303038152906040528051906020012061258b565b610ce0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd790614dfe565b60405180910390fd5b6000610cea6110fc565b9050600b54851115610d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2890614d7e565b60405180910390fd5b600a54600d54610d4a87846125a290919063ffffffff16565b610d5491906152b5565b1115610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c90614f9e565b60405180910390fd5b34610dae601060000154876125b890919063ffffffff16565b1115610def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de6906150de565b60405180910390fd5b610df933866125ce565b5050505050565b606060018054610e0f906154e2565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3b906154e2565b8015610e885780601f10610e5d57610100808354040283529160200191610e88565b820191906000526020600020905b815481529060010190602001808311610e6b57829003601f168201915b5050505050905090565b6000610e9d826125ec565b610edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed39061509e565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f22826116fe565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8a90614f5e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610fb2612583565b73ffffffffffffffffffffffffffffffffffffffff161480610fe15750610fe081610fdb612583565b6120a6565b5b611020576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101790614e5e565b60405180910390fd5b61102b8383836125f9565b505050565b611038612583565b73ffffffffffffffffffffffffffffffffffffffff166110566119fb565b73ffffffffffffffffffffffffffffffffffffffff16146110ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a390614efe565b60405180910390fd5b600260095414156110f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e99061507e565b60405180910390fd5b6002600981905550565b60008054905090565b6111108383836126ab565b505050565b600d5481565b6000611126836117a2565b8210611167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115e90614cfe565b60405180910390fd5b60006111716110fc565b905060008060005b838110156112d7576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461126b57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156112c357868414156112b4578195505050505050611313565b83806112bf90615514565b9450505b5080806112cf90615514565b915050611179565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130a9061503e565b60405180910390fd5b92915050565b611321612583565b73ffffffffffffffffffffffffffffffffffffffff1661133f6119fb565b73ffffffffffffffffffffffffffffffffffffffff1614611395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138c90614efe565b60405180910390fd5b600260085414156113db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d29061505e565b60405180910390fd5b6002600881905550600047905060006113f2612583565b73ffffffffffffffffffffffffffffffffffffffff168260405161141590614c23565b60006040518083038185875af1925050503d8060008114611452576040519150601f19603f3d011682016040523d82523d6000602084013e611457565b606091505b505090508061149b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114929061501e565b60405180910390fd5b50506001600881905550565b6000806114b26110fc565b90506114dd600d546114cf83600a54612c5290919063ffffffff16565b612c5290919063ffffffff16565b91505090565b6114fe83838360405180602001604052806000815250611d92565b505050565b600061150d6110fc565b821061154e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154590614d9e565b60405180910390fd5b819050919050565b61155e612583565b73ffffffffffffffffffffffffffffffffffffffff1661157c6119fb565b73ffffffffffffffffffffffffffffffffffffffff16146115d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c990614efe565b60405180910390fd5b80600e90805190602001906115e8929190613901565b5050565b60108060000154908060010154905082565b60095481565b60606000611611836117a2565b905060008167ffffffffffffffff811115611655577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156116835781602001602082028036833780820191505090505b50905060005b828110156116f35761169b858261111b565b8282815181106116d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080806116eb90615514565b915050611689565b508092505050919050565b600061170982612c68565b600001519050919050565b600e8054611721906154e2565b80601f016020809104026020016040519081016040528092919081815260200182805461174d906154e2565b801561179a5780601f1061176f5761010080835404028352916020019161179a565b820191906000526020600020905b81548152906001019060200180831161177d57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611813576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180a90614e9e565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611893612583565b73ffffffffffffffffffffffffffffffffffffffff166118b16119fb565b73ffffffffffffffffffffffffffffffffffffffff1614611907576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fe90614efe565b60405180910390fd5b6119116000612dc3565b565b61191b612583565b73ffffffffffffffffffffffffffffffffffffffff166119396119fb565b73ffffffffffffffffffffffffffffffffffffffff161461198f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198690614efe565b60405180910390fd5b81600d5410156119d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cb90614d5e565b60405180910390fd5b81600d60008282546119e69190615396565b925050819055506119f781836125ce565b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611a2d612583565b73ffffffffffffffffffffffffffffffffffffffff16611a4b6119fb565b73ffffffffffffffffffffffffffffffffffffffff1614611aa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9890614efe565b60405180910390fd5b80600c8190555050565b600060095414611af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae79061507e565b60405180910390fd5b611af8612583565b73ffffffffffffffffffffffffffffffffffffffff16611b166119fb565b73ffffffffffffffffffffffffffffffffffffffff1614611b6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6390614efe565b60405180910390fd5b8060106001018190555050565b606060028054611b88906154e2565b80601f0160208091040260200160405190810160405280929190818152602001828054611bb4906154e2565b8015611c015780601f10611bd657610100808354040283529160200191611c01565b820191906000526020600020905b815481529060010190602001808311611be457829003601f168201915b5050505050905090565b600c5481565b611c19612583565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7e90614f1e565b60405180910390fd5b8060066000611c94612583565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d41612583565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d869190614cc1565b60405180910390a35050565b611d9d8484846126ab565b611da984848484612e89565b611de8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddf90614fbe565b60405180910390fd5b50505050565b600f8054611dfb906154e2565b80601f0160208091040260200160405190810160405280929190818152602001828054611e27906154e2565b8015611e745780601f10611e4957610100808354040283529160200191611e74565b820191906000526020600020905b815481529060010190602001808311611e5757829003601f168201915b505050505081565b6060611e87826125ec565b611ec6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebd90614ebe565b60405180910390fd5b6000600e8054611ed5906154e2565b905011611ef15760405180602001604052806000815250611f20565b600e611efc83613020565b600f604051602001611f1093929190614bf2565b6040516020818303038152906040525b9050919050565b73a5409ec958c83c3f309868babaca7c86dcb077c181565b600a5481565b611f4d612583565b73ffffffffffffffffffffffffffffffffffffffff16611f6b6119fb565b73ffffffffffffffffffffffffffffffffffffffff1614611fc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb890614efe565b60405180910390fd5b80600f9080519060200190611fd7929190613901565b5050565b600060095411612020576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201790614e1e565b60405180910390fd5b612028612583565b73ffffffffffffffffffffffffffffffffffffffff166120466119fb565b73ffffffffffffffffffffffffffffffffffffffff161461209c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209390614efe565b60405180910390fd5b6000600981905550565b60008073a5409ec958c83c3f309868babaca7c86dcb077c190508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b81526004016121109190614c38565b60206040518083038186803b15801561212857600080fd5b505afa15801561213c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121609190613dad565b73ffffffffffffffffffffffffffffffffffffffff161415612186576001915050612194565b61219084846131cd565b9150505b92915050565b6002600954146121df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d690614e3e565b60405180910390fd5b60006121e96110fc565b9050600b54821115612230576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222790614d7e565b60405180910390fd5b600a54600d5461224984846125a290919063ffffffff16565b61225391906152b5565b1115612294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228b90614f9e565b60405180910390fd5b346122aa600c54846125b890919063ffffffff16565b11156122eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e2906150de565b60405180910390fd5b6122f533836125ce565b5050565b600061230482613261565b9050919050565b612313612583565b73ffffffffffffffffffffffffffffffffffffffff166123316119fb565b73ffffffffffffffffffffffffffffffffffffffff1614612387576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237e90614efe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ee90614d1e565b60405180910390fd5b61240081612dc3565b50565b600060095414612448576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243f9061507e565b60405180910390fd5b6000801b6010600101541415612493576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248a90614e7e565b60405180910390fd5b61249b612583565b73ffffffffffffffffffffffffffffffffffffffff166124b96119fb565b73ffffffffffffffffffffffffffffffffffffffff161461250f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250690614efe565b60405180910390fd5b6001600981905550565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600082612598858461334a565b1490509392505050565b600081836125b091906152b5565b905092915050565b600081836125c6919061533c565b905092915050565b6125e8828260405180602001604052806000815250613423565b5050565b6000805482109050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006126b682612c68565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166126dd612583565b73ffffffffffffffffffffffffffffffffffffffff1614806127395750612702612583565b73ffffffffffffffffffffffffffffffffffffffff1661272184610e92565b73ffffffffffffffffffffffffffffffffffffffff16145b806127555750612754826000015161274f612583565b6120a6565b5b905080612797576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278e90614f3e565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280090614ede565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612879576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287090614dbe565b60405180910390fd5b61288685858560016138e2565b61289660008484600001516125f9565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612a9c91906152b5565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612be257612b12816125ec565b15612be1576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c4a86868660016138e8565b505050505050565b60008183612c609190615396565b905092915050565b612c70613987565b612c79826125ec565b612cb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612caf90614d3e565b60405180910390fd5b60008290505b6000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612daa578092505050612dbe565b508080612db6906154b8565b915050612cbe565b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612eaa8473ffffffffffffffffffffffffffffffffffffffff166138ee565b15613013578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ed3612583565b8786866040518563ffffffff1660e01b8152600401612ef59493929190614c53565b602060405180830381600087803b158015612f0f57600080fd5b505af1925050508015612f4057506040513d601f19601f82011682018060405250810190612f3d9190613d84565b60015b612fc3573d8060008114612f70576040519150601f19603f3d011682016040523d82523d6000602084013e612f75565b606091505b50600081511415612fbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb290614fbe565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613018565b600190505b949350505050565b60606000821415613068576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506131c8565b600082905060005b6000821461309a57808061308390615514565b915050600a82613093919061530b565b9150613070565b60008167ffffffffffffffff8111156130dc577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561310e5781602001600182028036833780820191505090505b5090505b600085146131c1576001826131279190615396565b9150600a85613136919061558b565b603061314291906152b5565b60f81b81838151811061317e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131ba919061530b565b9450613112565b8093505050505b919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132c990614dde565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b60008082905060005b8451811015613418576000858281518110613397577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190508083116133d85782816040516020016133bb929190614bc6565b604051602081830303815290604052805190602001209250613404565b80836040516020016133eb929190614bc6565b6040516020818303038152906040528051906020012092505b50808061341090615514565b915050613353565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613499576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349090614ffe565b60405180910390fd5b6134a2816125ec565b156134e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134d990614fde565b60405180910390fd5b60008311613525576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351c90614f7e565b60405180910390fd5b61353260008583866138e2565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815250509050604051806040016040528085836000015161362f919061526f565b6fffffffffffffffffffffffffffffffff168152602001858360200151613656919061526f565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b858110156138c557818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46138656000888488612e89565b6138a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161389b90614fbe565b60405180910390fd5b81806138af90615514565b92505080806138bd90615514565b9150506137f4565b50806000819055506138da60008785886138e8565b505050505050565b50505050565b50505050565b600080823b905060008111915050919050565b82805461390d906154e2565b90600052602060002090601f01602090048101928261392f5760008555613976565b82601f1061394857805160ff1916838001178555613976565b82800160010185558215613976579182015b8281111561397557825182559160200191906001019061395a565b5b50905061398391906139c1565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156139da5760008160009055506001016139c2565b5090565b60006139f16139ec84615173565b615142565b905082815260208101848484011115613a0957600080fd5b613a14848285615476565b509392505050565b6000613a2f613a2a846151a3565b615142565b905082815260208101848484011115613a4757600080fd5b613a52848285615476565b509392505050565b600081359050613a6981615696565b92915050565b60008083601f840112613a8157600080fd5b8235905067ffffffffffffffff811115613a9a57600080fd5b602083019150836020820283011115613ab257600080fd5b9250929050565b600081359050613ac8816156ad565b92915050565b600081359050613add816156c4565b92915050565b600081359050613af2816156db565b92915050565b600081519050613b07816156db565b92915050565b600082601f830112613b1e57600080fd5b8135613b2e8482602086016139de565b91505092915050565b600081519050613b46816156f2565b92915050565b600082601f830112613b5d57600080fd5b8135613b6d848260208601613a1c565b91505092915050565b600081359050613b8581615709565b92915050565b600060208284031215613b9d57600080fd5b6000613bab84828501613a5a565b91505092915050565b60008060408385031215613bc757600080fd5b6000613bd585828601613a5a565b9250506020613be685828601613a5a565b9150509250929050565b600080600060608486031215613c0557600080fd5b6000613c1386828701613a5a565b9350506020613c2486828701613a5a565b9250506040613c3586828701613b76565b9150509250925092565b60008060008060808587031215613c5557600080fd5b6000613c6387828801613a5a565b9450506020613c7487828801613a5a565b9350506040613c8587828801613b76565b925050606085013567ffffffffffffffff811115613ca257600080fd5b613cae87828801613b0d565b91505092959194509250565b60008060408385031215613ccd57600080fd5b6000613cdb85828601613a5a565b9250506020613cec85828601613ab9565b9150509250929050565b60008060408385031215613d0957600080fd5b6000613d1785828601613a5a565b9250506020613d2885828601613b76565b9150509250929050565b600060208284031215613d4457600080fd5b6000613d5284828501613ace565b91505092915050565b600060208284031215613d6d57600080fd5b6000613d7b84828501613ae3565b91505092915050565b600060208284031215613d9657600080fd5b6000613da484828501613af8565b91505092915050565b600060208284031215613dbf57600080fd5b6000613dcd84828501613b37565b91505092915050565b600060208284031215613de857600080fd5b600082013567ffffffffffffffff811115613e0257600080fd5b613e0e84828501613b4c565b91505092915050565b600060208284031215613e2957600080fd5b6000613e3784828501613b76565b91505092915050565b60008060408385031215613e5357600080fd5b6000613e6185828601613b76565b9250506020613e7285828601613a5a565b9150509250929050565b600080600060408486031215613e9157600080fd5b6000613e9f86828701613b76565b935050602084013567ffffffffffffffff811115613ebc57600080fd5b613ec886828701613a6f565b92509250509250925092565b6000613ee08383614b8d565b60208301905092915050565b613ef5816153ca565b82525050565b613f0c613f07826153ca565b61555d565b82525050565b6000613f1d826151f8565b613f278185615226565b9350613f32836151d3565b8060005b83811015613f63578151613f4a8882613ed4565b9750613f5583615219565b925050600181019050613f36565b5085935050505092915050565b613f79816153dc565b82525050565b613f88816153e8565b82525050565b613f9f613f9a826153e8565b61556f565b82525050565b6000613fb082615203565b613fba8185615237565b9350613fca818560208601615485565b613fd381615678565b840191505092915050565b6000613fe98261520e565b613ff38185615253565b9350614003818560208601615485565b61400c81615678565b840191505092915050565b60006140228261520e565b61402c8185615264565b935061403c818560208601615485565b80840191505092915050565b60008154614055816154e2565b61405f8186615264565b9450600182166000811461407a576001811461408b576140be565b60ff198316865281860193506140be565b614094856151e3565b60005b838110156140b657815481890152600182019150602081019050614097565b838801955050505b50505092915050565b60006140d4602283615253565b91507f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061413a602683615253565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141a0602a83615253565b91507f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008301527f74656e7420746f6b656e000000000000000000000000000000000000000000006020830152604082019050919050565b6000614206601883615253565b91507f457863656564732061697264726f7020666f72207465616d00000000000000006000830152602082019050919050565b6000614246602683615253565b91507f4d696e74696e6720746f6f206d616e7920487565766f20746f6b656e7320617460008301527f206f6e63652100000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142ac602383615253565b91507f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008301527f6e647300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614312602583615253565b91507f455243373231413a207472616e7366657220746f20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614378603183615253565b91507f455243373231413a206e756d626572206d696e74656420717565727920666f7260008301527f20746865207a65726f20616464726573730000000000000000000000000000006020830152604082019050919050565b60006143de601183615253565b91507f4e6f74206f6e207768697465206c6973740000000000000000000000000000006000830152602082019050919050565b600061441e600f83615253565b91507f53616c65206e6f742061637469766500000000000000000000000000000000006000830152602082019050919050565b600061445e601683615253565b91507f5075626c69632053616c65206e6f7420616374697665000000000000000000006000830152602082019050919050565b600061449e603983615253565b91507f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006020830152604082019050919050565b6000614504601e83615253565b91507f4d65726b6c65726f6f74206e6f742073657420666f722070726573616c6500006000830152602082019050919050565b6000614544602b83615253565b91507f455243373231413a2062616c616e636520717565727920666f7220746865207a60008301527f65726f20616464726573730000000000000000000000000000000000000000006020830152604082019050919050565b60006145aa601583615253565b91507f546f6b656e20646f6573206e6f742065786973742e00000000000000000000006000830152602082019050919050565b60006145ea602683615253565b91507f455243373231413a207472616e736665722066726f6d20696e636f727265637460008301527f206f776e657200000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614650602083615253565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614690601a83615253565b91507f455243373231413a20617070726f766520746f2063616c6c65720000000000006000830152602082019050919050565b60006146d0603283615253565b91507f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008301527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006020830152604082019050919050565b6000614736602283615253565b91507f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008301527f65720000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061479c600083615248565b9150600082019050919050565b60006147b6602383615253565b91507f455243373231413a207175616e74697479206d7573742062652067726561746560008301527f72203000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061481c602283615253565b91507f4e6f7420656e6f75676820487565766f20546f6b656e732072656d61696e696e60008301527f672e0000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614882603383615253565b91507f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008301527f6563656976657220696d706c656d656e746572000000000000000000000000006020830152604082019050919050565b60006148e8601d83615253565b91507f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006000830152602082019050919050565b6000614928602183615253565b91507f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061498e600e83615253565b91507f4661696c656420746f2073656e640000000000000000000000000000000000006000830152602082019050919050565b60006149ce602e83615253565b91507f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008301527f6f776e657220627920696e6465780000000000000000000000000000000000006020830152604082019050919050565b6000614a34601f83615253565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b6000614a74601483615253565b91507f53616c6520616c726561647920737461727465640000000000000000000000006000830152602082019050919050565b6000614ab4602d83615253565b91507f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008301527f78697374656e7420746f6b656e000000000000000000000000000000000000006020830152604082019050919050565b6000614b1a601a83615253565b91507f5768697465206c6973742053616c65206e6f74206163746976650000000000006000830152602082019050919050565b6000614b5a601683615253565b91507f496e636f727265637420616d6f756e742073656e7421000000000000000000006000830152602082019050919050565b614b968161546c565b82525050565b614ba58161546c565b82525050565b6000614bb78284613efb565b60148201915081905092915050565b6000614bd28285613f8e565b602082019150614be28284613f8e565b6020820191508190509392505050565b6000614bfe8286614048565b9150614c0a8285614017565b9150614c168284614048565b9150819050949350505050565b6000614c2e8261478f565b9150819050919050565b6000602082019050614c4d6000830184613eec565b92915050565b6000608082019050614c686000830187613eec565b614c756020830186613eec565b614c826040830185614b9c565b8181036060830152614c948184613fa5565b905095945050505050565b60006020820190508181036000830152614cb98184613f12565b905092915050565b6000602082019050614cd66000830184613f70565b92915050565b60006020820190508181036000830152614cf68184613fde565b905092915050565b60006020820190508181036000830152614d17816140c7565b9050919050565b60006020820190508181036000830152614d378161412d565b9050919050565b60006020820190508181036000830152614d5781614193565b9050919050565b60006020820190508181036000830152614d77816141f9565b9050919050565b60006020820190508181036000830152614d9781614239565b9050919050565b60006020820190508181036000830152614db78161429f565b9050919050565b60006020820190508181036000830152614dd781614305565b9050919050565b60006020820190508181036000830152614df78161436b565b9050919050565b60006020820190508181036000830152614e17816143d1565b9050919050565b60006020820190508181036000830152614e3781614411565b9050919050565b60006020820190508181036000830152614e5781614451565b9050919050565b60006020820190508181036000830152614e7781614491565b9050919050565b60006020820190508181036000830152614e97816144f7565b9050919050565b60006020820190508181036000830152614eb781614537565b9050919050565b60006020820190508181036000830152614ed78161459d565b9050919050565b60006020820190508181036000830152614ef7816145dd565b9050919050565b60006020820190508181036000830152614f1781614643565b9050919050565b60006020820190508181036000830152614f3781614683565b9050919050565b60006020820190508181036000830152614f57816146c3565b9050919050565b60006020820190508181036000830152614f7781614729565b9050919050565b60006020820190508181036000830152614f97816147a9565b9050919050565b60006020820190508181036000830152614fb78161480f565b9050919050565b60006020820190508181036000830152614fd781614875565b9050919050565b60006020820190508181036000830152614ff7816148db565b9050919050565b600060208201905081810360008301526150178161491b565b9050919050565b6000602082019050818103600083015261503781614981565b9050919050565b60006020820190508181036000830152615057816149c1565b9050919050565b6000602082019050818103600083015261507781614a27565b9050919050565b6000602082019050818103600083015261509781614a67565b9050919050565b600060208201905081810360008301526150b781614aa7565b9050919050565b600060208201905081810360008301526150d781614b0d565b9050919050565b600060208201905081810360008301526150f781614b4d565b9050919050565b60006020820190506151136000830184614b9c565b92915050565b600060408201905061512e6000830185614b9c565b61513b6020830184613f7f565b9392505050565b6000604051905081810181811067ffffffffffffffff8211171561516957615168615649565b5b8060405250919050565b600067ffffffffffffffff82111561518e5761518d615649565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156151be576151bd615649565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061527a82615430565b915061528583615430565b9250826fffffffffffffffffffffffffffffffff038211156152aa576152a96155bc565b5b828201905092915050565b60006152c08261546c565b91506152cb8361546c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615300576152ff6155bc565b5b828201905092915050565b60006153168261546c565b91506153218361546c565b925082615331576153306155eb565b5b828204905092915050565b60006153478261546c565b91506153528361546c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561538b5761538a6155bc565b5b828202905092915050565b60006153a18261546c565b91506153ac8361546c565b9250828210156153bf576153be6155bc565b5b828203905092915050565b60006153d58261544c565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000615429826153ca565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156154a3578082015181840152602081019050615488565b838111156154b2576000848401525b50505050565b60006154c38261546c565b915060008214156154d7576154d66155bc565b5b600182039050919050565b600060028204905060018216806154fa57607f821691505b6020821081141561550e5761550d61561a565b5b50919050565b600061551f8261546c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615552576155516155bc565b5b600182019050919050565b600061556882615579565b9050919050565b6000819050919050565b600061558482615689565b9050919050565b60006155968261546c565b91506155a18361546c565b9250826155b1576155b06155eb565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b61569f816153ca565b81146156aa57600080fd5b50565b6156b6816153dc565b81146156c157600080fd5b50565b6156cd816153e8565b81146156d857600080fd5b50565b6156e4816153f2565b81146156ef57600080fd5b50565b6156fb8161541e565b811461570657600080fd5b50565b6157128161546c565b811461571d57600080fd5b5056fea264697066735822122050f3340ed445ecd67a5268689e9dd70e6653e5fb65ba9708c5ba95527ece775264736f6c63430008000033697066733a2f2f516d645672384c667141536653614d383346566b796d545551755a61726851335969464b4b6f564a414d626438502f

Deployed Bytecode

0x60806040526004361061025c5760003560e01c80636c0360eb11610144578063c6682862116100b6578063e36b0b371161007a578063e36b0b37146108c8578063e985e9c5146108df578063efd0cbf91461091c578063f0293fd314610938578063f2fde38b14610975578063ff44e9151461099e5761025c565b8063c6682862146107e1578063c87b56dd1461080c578063cd7c032614610849578063d5abeb0114610874578063da3ef23f1461089f5761025c565b806391b7f5ed1161010857806391b7f5ed146106e757806392f6c4391461071057806395d89b4114610739578063a035b1fe14610764578063a22cb4651461078f578063b88d4fde146107b85761025c565b80636c0360eb1461061457806370a082311461063f578063715018a61461067c578063877bc761146106935780638da5cb5b146106bc5761025c565b80632cfac6ec116101dd5780634f6ccce7116101a15780634f6ccce7146104dd57806355f804b31461051a5780635cb06d4c14610543578063603f4d521461056f57806361c5c9351461059a5780636352211e146105d75761025c565b80632cfac6ec1461040a5780632f745c59146104355780633ccfd60b146104725780634254337e1461048957806342842e0e146104b45761025c565b8063081812fc11610224578063081812fc14610339578063095ea7b3146103765780630c1c972a1461039f57806318160ddd146103b657806323b872dd146103e15761025c565b806301f569971461026157806301ffc9a71461028c57806303585e24146102c9578063061431a8146102f257806306fdde031461030e575b600080fd5b34801561026d57600080fd5b506102766109b5565b60405161028391906150fe565b60405180910390f35b34801561029857600080fd5b506102b360048036038101906102ae9190613d5b565b6109bb565b6040516102c09190614cc1565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190613e17565b610b05565b005b61030c60048036038101906103079190613e7c565b610b99565b005b34801561031a57600080fd5b50610323610e00565b6040516103309190614cdc565b60405180910390f35b34801561034557600080fd5b50610360600480360381019061035b9190613e17565b610e92565b60405161036d9190614c38565b60405180910390f35b34801561038257600080fd5b5061039d60048036038101906103989190613cf6565b610f17565b005b3480156103ab57600080fd5b506103b4611030565b005b3480156103c257600080fd5b506103cb6110fc565b6040516103d891906150fe565b60405180910390f35b3480156103ed57600080fd5b5061040860048036038101906104039190613bf0565b611105565b005b34801561041657600080fd5b5061041f611115565b60405161042c91906150fe565b60405180910390f35b34801561044157600080fd5b5061045c60048036038101906104579190613cf6565b61111b565b60405161046991906150fe565b60405180910390f35b34801561047e57600080fd5b50610487611319565b005b34801561049557600080fd5b5061049e6114a7565b6040516104ab91906150fe565b60405180910390f35b3480156104c057600080fd5b506104db60048036038101906104d69190613bf0565b6114e3565b005b3480156104e957600080fd5b5061050460048036038101906104ff9190613e17565b611503565b60405161051191906150fe565b60405180910390f35b34801561052657600080fd5b50610541600480360381019061053c9190613dd6565b611556565b005b34801561054f57600080fd5b506105586115ec565b604051610566929190615119565b60405180910390f35b34801561057b57600080fd5b506105846115fe565b60405161059191906150fe565b60405180910390f35b3480156105a657600080fd5b506105c160048036038101906105bc9190613b8b565b611604565b6040516105ce9190614c9f565b60405180910390f35b3480156105e357600080fd5b506105fe60048036038101906105f99190613e17565b6116fe565b60405161060b9190614c38565b60405180910390f35b34801561062057600080fd5b50610629611714565b6040516106369190614cdc565b60405180910390f35b34801561064b57600080fd5b5061066660048036038101906106619190613b8b565b6117a2565b60405161067391906150fe565b60405180910390f35b34801561068857600080fd5b5061069161188b565b005b34801561069f57600080fd5b506106ba60048036038101906106b59190613e40565b611913565b005b3480156106c857600080fd5b506106d16119fb565b6040516106de9190614c38565b60405180910390f35b3480156106f357600080fd5b5061070e60048036038101906107099190613e17565b611a25565b005b34801561071c57600080fd5b5061073760048036038101906107329190613d32565b611aab565b005b34801561074557600080fd5b5061074e611b79565b60405161075b9190614cdc565b60405180910390f35b34801561077057600080fd5b50610779611c0b565b60405161078691906150fe565b60405180910390f35b34801561079b57600080fd5b506107b660048036038101906107b19190613cba565b611c11565b005b3480156107c457600080fd5b506107df60048036038101906107da9190613c3f565b611d92565b005b3480156107ed57600080fd5b506107f6611dee565b6040516108039190614cdc565b60405180910390f35b34801561081857600080fd5b50610833600480360381019061082e9190613e17565b611e7c565b6040516108409190614cdc565b60405180910390f35b34801561085557600080fd5b5061085e611f27565b60405161086b9190614c38565b60405180910390f35b34801561088057600080fd5b50610889611f3f565b60405161089691906150fe565b60405180910390f35b3480156108ab57600080fd5b506108c660048036038101906108c19190613dd6565b611f45565b005b3480156108d457600080fd5b506108dd611fdb565b005b3480156108eb57600080fd5b5061090660048036038101906109019190613bb4565b6120a6565b6040516109139190614cc1565b60405180910390f35b61093660048036038101906109319190613e17565b61219a565b005b34801561094457600080fd5b5061095f600480360381019061095a9190613b8b565b6122f9565b60405161096c91906150fe565b60405180910390f35b34801561098157600080fd5b5061099c60048036038101906109979190613b8b565b61230b565b005b3480156109aa57600080fd5b506109b3612403565b005b600b5481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a8657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610aee57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610afe5750610afd82612519565b5b9050919050565b610b0d612583565b73ffffffffffffffffffffffffffffffffffffffff16610b2b6119fb565b73ffffffffffffffffffffffffffffffffffffffff1614610b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7890614efe565b60405180910390fd5b600a548110610b8f57600080fd5b80600a8190555050565b600160095414610bde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd5906150be565b60405180910390fd5b6000801b6010600101541415610c29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2090614e7e565b60405180910390fd5b818180806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050610ca18160106001015433604051602001610c869190614bab565b6040516020818303038152906040528051906020012061258b565b610ce0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd790614dfe565b60405180910390fd5b6000610cea6110fc565b9050600b54851115610d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2890614d7e565b60405180910390fd5b600a54600d54610d4a87846125a290919063ffffffff16565b610d5491906152b5565b1115610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c90614f9e565b60405180910390fd5b34610dae601060000154876125b890919063ffffffff16565b1115610def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de6906150de565b60405180910390fd5b610df933866125ce565b5050505050565b606060018054610e0f906154e2565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3b906154e2565b8015610e885780601f10610e5d57610100808354040283529160200191610e88565b820191906000526020600020905b815481529060010190602001808311610e6b57829003601f168201915b5050505050905090565b6000610e9d826125ec565b610edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed39061509e565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f22826116fe565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8a90614f5e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610fb2612583565b73ffffffffffffffffffffffffffffffffffffffff161480610fe15750610fe081610fdb612583565b6120a6565b5b611020576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101790614e5e565b60405180910390fd5b61102b8383836125f9565b505050565b611038612583565b73ffffffffffffffffffffffffffffffffffffffff166110566119fb565b73ffffffffffffffffffffffffffffffffffffffff16146110ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a390614efe565b60405180910390fd5b600260095414156110f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e99061507e565b60405180910390fd5b6002600981905550565b60008054905090565b6111108383836126ab565b505050565b600d5481565b6000611126836117a2565b8210611167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115e90614cfe565b60405180910390fd5b60006111716110fc565b905060008060005b838110156112d7576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461126b57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156112c357868414156112b4578195505050505050611313565b83806112bf90615514565b9450505b5080806112cf90615514565b915050611179565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130a9061503e565b60405180910390fd5b92915050565b611321612583565b73ffffffffffffffffffffffffffffffffffffffff1661133f6119fb565b73ffffffffffffffffffffffffffffffffffffffff1614611395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138c90614efe565b60405180910390fd5b600260085414156113db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d29061505e565b60405180910390fd5b6002600881905550600047905060006113f2612583565b73ffffffffffffffffffffffffffffffffffffffff168260405161141590614c23565b60006040518083038185875af1925050503d8060008114611452576040519150601f19603f3d011682016040523d82523d6000602084013e611457565b606091505b505090508061149b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114929061501e565b60405180910390fd5b50506001600881905550565b6000806114b26110fc565b90506114dd600d546114cf83600a54612c5290919063ffffffff16565b612c5290919063ffffffff16565b91505090565b6114fe83838360405180602001604052806000815250611d92565b505050565b600061150d6110fc565b821061154e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154590614d9e565b60405180910390fd5b819050919050565b61155e612583565b73ffffffffffffffffffffffffffffffffffffffff1661157c6119fb565b73ffffffffffffffffffffffffffffffffffffffff16146115d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c990614efe565b60405180910390fd5b80600e90805190602001906115e8929190613901565b5050565b60108060000154908060010154905082565b60095481565b60606000611611836117a2565b905060008167ffffffffffffffff811115611655577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156116835781602001602082028036833780820191505090505b50905060005b828110156116f35761169b858261111b565b8282815181106116d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080806116eb90615514565b915050611689565b508092505050919050565b600061170982612c68565b600001519050919050565b600e8054611721906154e2565b80601f016020809104026020016040519081016040528092919081815260200182805461174d906154e2565b801561179a5780601f1061176f5761010080835404028352916020019161179a565b820191906000526020600020905b81548152906001019060200180831161177d57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611813576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180a90614e9e565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611893612583565b73ffffffffffffffffffffffffffffffffffffffff166118b16119fb565b73ffffffffffffffffffffffffffffffffffffffff1614611907576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fe90614efe565b60405180910390fd5b6119116000612dc3565b565b61191b612583565b73ffffffffffffffffffffffffffffffffffffffff166119396119fb565b73ffffffffffffffffffffffffffffffffffffffff161461198f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198690614efe565b60405180910390fd5b81600d5410156119d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cb90614d5e565b60405180910390fd5b81600d60008282546119e69190615396565b925050819055506119f781836125ce565b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611a2d612583565b73ffffffffffffffffffffffffffffffffffffffff16611a4b6119fb565b73ffffffffffffffffffffffffffffffffffffffff1614611aa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9890614efe565b60405180910390fd5b80600c8190555050565b600060095414611af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae79061507e565b60405180910390fd5b611af8612583565b73ffffffffffffffffffffffffffffffffffffffff16611b166119fb565b73ffffffffffffffffffffffffffffffffffffffff1614611b6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6390614efe565b60405180910390fd5b8060106001018190555050565b606060028054611b88906154e2565b80601f0160208091040260200160405190810160405280929190818152602001828054611bb4906154e2565b8015611c015780601f10611bd657610100808354040283529160200191611c01565b820191906000526020600020905b815481529060010190602001808311611be457829003601f168201915b5050505050905090565b600c5481565b611c19612583565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7e90614f1e565b60405180910390fd5b8060066000611c94612583565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d41612583565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d869190614cc1565b60405180910390a35050565b611d9d8484846126ab565b611da984848484612e89565b611de8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddf90614fbe565b60405180910390fd5b50505050565b600f8054611dfb906154e2565b80601f0160208091040260200160405190810160405280929190818152602001828054611e27906154e2565b8015611e745780601f10611e4957610100808354040283529160200191611e74565b820191906000526020600020905b815481529060010190602001808311611e5757829003601f168201915b505050505081565b6060611e87826125ec565b611ec6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebd90614ebe565b60405180910390fd5b6000600e8054611ed5906154e2565b905011611ef15760405180602001604052806000815250611f20565b600e611efc83613020565b600f604051602001611f1093929190614bf2565b6040516020818303038152906040525b9050919050565b73a5409ec958c83c3f309868babaca7c86dcb077c181565b600a5481565b611f4d612583565b73ffffffffffffffffffffffffffffffffffffffff16611f6b6119fb565b73ffffffffffffffffffffffffffffffffffffffff1614611fc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb890614efe565b60405180910390fd5b80600f9080519060200190611fd7929190613901565b5050565b600060095411612020576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201790614e1e565b60405180910390fd5b612028612583565b73ffffffffffffffffffffffffffffffffffffffff166120466119fb565b73ffffffffffffffffffffffffffffffffffffffff161461209c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209390614efe565b60405180910390fd5b6000600981905550565b60008073a5409ec958c83c3f309868babaca7c86dcb077c190508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b81526004016121109190614c38565b60206040518083038186803b15801561212857600080fd5b505afa15801561213c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121609190613dad565b73ffffffffffffffffffffffffffffffffffffffff161415612186576001915050612194565b61219084846131cd565b9150505b92915050565b6002600954146121df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d690614e3e565b60405180910390fd5b60006121e96110fc565b9050600b54821115612230576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222790614d7e565b60405180910390fd5b600a54600d5461224984846125a290919063ffffffff16565b61225391906152b5565b1115612294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228b90614f9e565b60405180910390fd5b346122aa600c54846125b890919063ffffffff16565b11156122eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e2906150de565b60405180910390fd5b6122f533836125ce565b5050565b600061230482613261565b9050919050565b612313612583565b73ffffffffffffffffffffffffffffffffffffffff166123316119fb565b73ffffffffffffffffffffffffffffffffffffffff1614612387576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237e90614efe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ee90614d1e565b60405180910390fd5b61240081612dc3565b50565b600060095414612448576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243f9061507e565b60405180910390fd5b6000801b6010600101541415612493576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248a90614e7e565b60405180910390fd5b61249b612583565b73ffffffffffffffffffffffffffffffffffffffff166124b96119fb565b73ffffffffffffffffffffffffffffffffffffffff161461250f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250690614efe565b60405180910390fd5b6001600981905550565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600082612598858461334a565b1490509392505050565b600081836125b091906152b5565b905092915050565b600081836125c6919061533c565b905092915050565b6125e8828260405180602001604052806000815250613423565b5050565b6000805482109050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006126b682612c68565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166126dd612583565b73ffffffffffffffffffffffffffffffffffffffff1614806127395750612702612583565b73ffffffffffffffffffffffffffffffffffffffff1661272184610e92565b73ffffffffffffffffffffffffffffffffffffffff16145b806127555750612754826000015161274f612583565b6120a6565b5b905080612797576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278e90614f3e565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280090614ede565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612879576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287090614dbe565b60405180910390fd5b61288685858560016138e2565b61289660008484600001516125f9565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612a9c91906152b5565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612be257612b12816125ec565b15612be1576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c4a86868660016138e8565b505050505050565b60008183612c609190615396565b905092915050565b612c70613987565b612c79826125ec565b612cb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612caf90614d3e565b60405180910390fd5b60008290505b6000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612daa578092505050612dbe565b508080612db6906154b8565b915050612cbe565b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612eaa8473ffffffffffffffffffffffffffffffffffffffff166138ee565b15613013578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ed3612583565b8786866040518563ffffffff1660e01b8152600401612ef59493929190614c53565b602060405180830381600087803b158015612f0f57600080fd5b505af1925050508015612f4057506040513d601f19601f82011682018060405250810190612f3d9190613d84565b60015b612fc3573d8060008114612f70576040519150601f19603f3d011682016040523d82523d6000602084013e612f75565b606091505b50600081511415612fbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb290614fbe565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613018565b600190505b949350505050565b60606000821415613068576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506131c8565b600082905060005b6000821461309a57808061308390615514565b915050600a82613093919061530b565b9150613070565b60008167ffffffffffffffff8111156130dc577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561310e5781602001600182028036833780820191505090505b5090505b600085146131c1576001826131279190615396565b9150600a85613136919061558b565b603061314291906152b5565b60f81b81838151811061317e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131ba919061530b565b9450613112565b8093505050505b919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132c990614dde565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b60008082905060005b8451811015613418576000858281518110613397577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190508083116133d85782816040516020016133bb929190614bc6565b604051602081830303815290604052805190602001209250613404565b80836040516020016133eb929190614bc6565b6040516020818303038152906040528051906020012092505b50808061341090615514565b915050613353565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613499576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349090614ffe565b60405180910390fd5b6134a2816125ec565b156134e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134d990614fde565b60405180910390fd5b60008311613525576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351c90614f7e565b60405180910390fd5b61353260008583866138e2565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815250509050604051806040016040528085836000015161362f919061526f565b6fffffffffffffffffffffffffffffffff168152602001858360200151613656919061526f565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b858110156138c557818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46138656000888488612e89565b6138a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161389b90614fbe565b60405180910390fd5b81806138af90615514565b92505080806138bd90615514565b9150506137f4565b50806000819055506138da60008785886138e8565b505050505050565b50505050565b50505050565b600080823b905060008111915050919050565b82805461390d906154e2565b90600052602060002090601f01602090048101928261392f5760008555613976565b82601f1061394857805160ff1916838001178555613976565b82800160010185558215613976579182015b8281111561397557825182559160200191906001019061395a565b5b50905061398391906139c1565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156139da5760008160009055506001016139c2565b5090565b60006139f16139ec84615173565b615142565b905082815260208101848484011115613a0957600080fd5b613a14848285615476565b509392505050565b6000613a2f613a2a846151a3565b615142565b905082815260208101848484011115613a4757600080fd5b613a52848285615476565b509392505050565b600081359050613a6981615696565b92915050565b60008083601f840112613a8157600080fd5b8235905067ffffffffffffffff811115613a9a57600080fd5b602083019150836020820283011115613ab257600080fd5b9250929050565b600081359050613ac8816156ad565b92915050565b600081359050613add816156c4565b92915050565b600081359050613af2816156db565b92915050565b600081519050613b07816156db565b92915050565b600082601f830112613b1e57600080fd5b8135613b2e8482602086016139de565b91505092915050565b600081519050613b46816156f2565b92915050565b600082601f830112613b5d57600080fd5b8135613b6d848260208601613a1c565b91505092915050565b600081359050613b8581615709565b92915050565b600060208284031215613b9d57600080fd5b6000613bab84828501613a5a565b91505092915050565b60008060408385031215613bc757600080fd5b6000613bd585828601613a5a565b9250506020613be685828601613a5a565b9150509250929050565b600080600060608486031215613c0557600080fd5b6000613c1386828701613a5a565b9350506020613c2486828701613a5a565b9250506040613c3586828701613b76565b9150509250925092565b60008060008060808587031215613c5557600080fd5b6000613c6387828801613a5a565b9450506020613c7487828801613a5a565b9350506040613c8587828801613b76565b925050606085013567ffffffffffffffff811115613ca257600080fd5b613cae87828801613b0d565b91505092959194509250565b60008060408385031215613ccd57600080fd5b6000613cdb85828601613a5a565b9250506020613cec85828601613ab9565b9150509250929050565b60008060408385031215613d0957600080fd5b6000613d1785828601613a5a565b9250506020613d2885828601613b76565b9150509250929050565b600060208284031215613d4457600080fd5b6000613d5284828501613ace565b91505092915050565b600060208284031215613d6d57600080fd5b6000613d7b84828501613ae3565b91505092915050565b600060208284031215613d9657600080fd5b6000613da484828501613af8565b91505092915050565b600060208284031215613dbf57600080fd5b6000613dcd84828501613b37565b91505092915050565b600060208284031215613de857600080fd5b600082013567ffffffffffffffff811115613e0257600080fd5b613e0e84828501613b4c565b91505092915050565b600060208284031215613e2957600080fd5b6000613e3784828501613b76565b91505092915050565b60008060408385031215613e5357600080fd5b6000613e6185828601613b76565b9250506020613e7285828601613a5a565b9150509250929050565b600080600060408486031215613e9157600080fd5b6000613e9f86828701613b76565b935050602084013567ffffffffffffffff811115613ebc57600080fd5b613ec886828701613a6f565b92509250509250925092565b6000613ee08383614b8d565b60208301905092915050565b613ef5816153ca565b82525050565b613f0c613f07826153ca565b61555d565b82525050565b6000613f1d826151f8565b613f278185615226565b9350613f32836151d3565b8060005b83811015613f63578151613f4a8882613ed4565b9750613f5583615219565b925050600181019050613f36565b5085935050505092915050565b613f79816153dc565b82525050565b613f88816153e8565b82525050565b613f9f613f9a826153e8565b61556f565b82525050565b6000613fb082615203565b613fba8185615237565b9350613fca818560208601615485565b613fd381615678565b840191505092915050565b6000613fe98261520e565b613ff38185615253565b9350614003818560208601615485565b61400c81615678565b840191505092915050565b60006140228261520e565b61402c8185615264565b935061403c818560208601615485565b80840191505092915050565b60008154614055816154e2565b61405f8186615264565b9450600182166000811461407a576001811461408b576140be565b60ff198316865281860193506140be565b614094856151e3565b60005b838110156140b657815481890152600182019150602081019050614097565b838801955050505b50505092915050565b60006140d4602283615253565b91507f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061413a602683615253565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141a0602a83615253565b91507f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008301527f74656e7420746f6b656e000000000000000000000000000000000000000000006020830152604082019050919050565b6000614206601883615253565b91507f457863656564732061697264726f7020666f72207465616d00000000000000006000830152602082019050919050565b6000614246602683615253565b91507f4d696e74696e6720746f6f206d616e7920487565766f20746f6b656e7320617460008301527f206f6e63652100000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142ac602383615253565b91507f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008301527f6e647300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614312602583615253565b91507f455243373231413a207472616e7366657220746f20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614378603183615253565b91507f455243373231413a206e756d626572206d696e74656420717565727920666f7260008301527f20746865207a65726f20616464726573730000000000000000000000000000006020830152604082019050919050565b60006143de601183615253565b91507f4e6f74206f6e207768697465206c6973740000000000000000000000000000006000830152602082019050919050565b600061441e600f83615253565b91507f53616c65206e6f742061637469766500000000000000000000000000000000006000830152602082019050919050565b600061445e601683615253565b91507f5075626c69632053616c65206e6f7420616374697665000000000000000000006000830152602082019050919050565b600061449e603983615253565b91507f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006020830152604082019050919050565b6000614504601e83615253565b91507f4d65726b6c65726f6f74206e6f742073657420666f722070726573616c6500006000830152602082019050919050565b6000614544602b83615253565b91507f455243373231413a2062616c616e636520717565727920666f7220746865207a60008301527f65726f20616464726573730000000000000000000000000000000000000000006020830152604082019050919050565b60006145aa601583615253565b91507f546f6b656e20646f6573206e6f742065786973742e00000000000000000000006000830152602082019050919050565b60006145ea602683615253565b91507f455243373231413a207472616e736665722066726f6d20696e636f727265637460008301527f206f776e657200000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614650602083615253565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614690601a83615253565b91507f455243373231413a20617070726f766520746f2063616c6c65720000000000006000830152602082019050919050565b60006146d0603283615253565b91507f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008301527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006020830152604082019050919050565b6000614736602283615253565b91507f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008301527f65720000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061479c600083615248565b9150600082019050919050565b60006147b6602383615253565b91507f455243373231413a207175616e74697479206d7573742062652067726561746560008301527f72203000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061481c602283615253565b91507f4e6f7420656e6f75676820487565766f20546f6b656e732072656d61696e696e60008301527f672e0000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614882603383615253565b91507f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008301527f6563656976657220696d706c656d656e746572000000000000000000000000006020830152604082019050919050565b60006148e8601d83615253565b91507f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006000830152602082019050919050565b6000614928602183615253565b91507f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061498e600e83615253565b91507f4661696c656420746f2073656e640000000000000000000000000000000000006000830152602082019050919050565b60006149ce602e83615253565b91507f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008301527f6f776e657220627920696e6465780000000000000000000000000000000000006020830152604082019050919050565b6000614a34601f83615253565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b6000614a74601483615253565b91507f53616c6520616c726561647920737461727465640000000000000000000000006000830152602082019050919050565b6000614ab4602d83615253565b91507f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008301527f78697374656e7420746f6b656e000000000000000000000000000000000000006020830152604082019050919050565b6000614b1a601a83615253565b91507f5768697465206c6973742053616c65206e6f74206163746976650000000000006000830152602082019050919050565b6000614b5a601683615253565b91507f496e636f727265637420616d6f756e742073656e7421000000000000000000006000830152602082019050919050565b614b968161546c565b82525050565b614ba58161546c565b82525050565b6000614bb78284613efb565b60148201915081905092915050565b6000614bd28285613f8e565b602082019150614be28284613f8e565b6020820191508190509392505050565b6000614bfe8286614048565b9150614c0a8285614017565b9150614c168284614048565b9150819050949350505050565b6000614c2e8261478f565b9150819050919050565b6000602082019050614c4d6000830184613eec565b92915050565b6000608082019050614c686000830187613eec565b614c756020830186613eec565b614c826040830185614b9c565b8181036060830152614c948184613fa5565b905095945050505050565b60006020820190508181036000830152614cb98184613f12565b905092915050565b6000602082019050614cd66000830184613f70565b92915050565b60006020820190508181036000830152614cf68184613fde565b905092915050565b60006020820190508181036000830152614d17816140c7565b9050919050565b60006020820190508181036000830152614d378161412d565b9050919050565b60006020820190508181036000830152614d5781614193565b9050919050565b60006020820190508181036000830152614d77816141f9565b9050919050565b60006020820190508181036000830152614d9781614239565b9050919050565b60006020820190508181036000830152614db78161429f565b9050919050565b60006020820190508181036000830152614dd781614305565b9050919050565b60006020820190508181036000830152614df78161436b565b9050919050565b60006020820190508181036000830152614e17816143d1565b9050919050565b60006020820190508181036000830152614e3781614411565b9050919050565b60006020820190508181036000830152614e5781614451565b9050919050565b60006020820190508181036000830152614e7781614491565b9050919050565b60006020820190508181036000830152614e97816144f7565b9050919050565b60006020820190508181036000830152614eb781614537565b9050919050565b60006020820190508181036000830152614ed78161459d565b9050919050565b60006020820190508181036000830152614ef7816145dd565b9050919050565b60006020820190508181036000830152614f1781614643565b9050919050565b60006020820190508181036000830152614f3781614683565b9050919050565b60006020820190508181036000830152614f57816146c3565b9050919050565b60006020820190508181036000830152614f7781614729565b9050919050565b60006020820190508181036000830152614f97816147a9565b9050919050565b60006020820190508181036000830152614fb78161480f565b9050919050565b60006020820190508181036000830152614fd781614875565b9050919050565b60006020820190508181036000830152614ff7816148db565b9050919050565b600060208201905081810360008301526150178161491b565b9050919050565b6000602082019050818103600083015261503781614981565b9050919050565b60006020820190508181036000830152615057816149c1565b9050919050565b6000602082019050818103600083015261507781614a27565b9050919050565b6000602082019050818103600083015261509781614a67565b9050919050565b600060208201905081810360008301526150b781614aa7565b9050919050565b600060208201905081810360008301526150d781614b0d565b9050919050565b600060208201905081810360008301526150f781614b4d565b9050919050565b60006020820190506151136000830184614b9c565b92915050565b600060408201905061512e6000830185614b9c565b61513b6020830184613f7f565b9392505050565b6000604051905081810181811067ffffffffffffffff8211171561516957615168615649565b5b8060405250919050565b600067ffffffffffffffff82111561518e5761518d615649565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156151be576151bd615649565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061527a82615430565b915061528583615430565b9250826fffffffffffffffffffffffffffffffff038211156152aa576152a96155bc565b5b828201905092915050565b60006152c08261546c565b91506152cb8361546c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615300576152ff6155bc565b5b828201905092915050565b60006153168261546c565b91506153218361546c565b925082615331576153306155eb565b5b828204905092915050565b60006153478261546c565b91506153528361546c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561538b5761538a6155bc565b5b828202905092915050565b60006153a18261546c565b91506153ac8361546c565b9250828210156153bf576153be6155bc565b5b828203905092915050565b60006153d58261544c565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000615429826153ca565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156154a3578082015181840152602081019050615488565b838111156154b2576000848401525b50505050565b60006154c38261546c565b915060008214156154d7576154d66155bc565b5b600182039050919050565b600060028204905060018216806154fa57607f821691505b6020821081141561550e5761550d61561a565b5b50919050565b600061551f8261546c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615552576155516155bc565b5b600182019050919050565b600061556882615579565b9050919050565b6000819050919050565b600061558482615689565b9050919050565b60006155968261546c565b91506155a18361546c565b9250826155b1576155b06155eb565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b61569f816153ca565b81146156aa57600080fd5b50565b6156b6816153dc565b81146156c157600080fd5b50565b6156cd816153e8565b81146156d857600080fd5b50565b6156e4816153f2565b81146156ef57600080fd5b50565b6156fb8161541e565b811461570657600080fd5b50565b6157128161546c565b811461571d57600080fd5b5056fea264697066735822122050f3340ed445ecd67a5268689e9dd70e6653e5fb65ba9708c5ba95527ece775264736f6c63430008000033

Deployed Bytecode Sourcemap

50304:6059:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50692:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31278:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56207:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53765:597;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32905:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34466:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33987:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52888:138;;;;;;;;;;;;;:::i;:::-;;29719:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35342:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50762:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30383:823;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54856:222;;;;;;;;;;;;;:::i;:::-;;55923:158;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35575:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29896:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54370:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50856:30;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;50630:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55204:341;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32714:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50794:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31714:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7257:103;;;;;;;;;;;;;:::i;:::-;;52274:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6606:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54594:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54688:160;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33074:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50735:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34752:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35823:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50822:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55553:362;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50371:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50661:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54470:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53201:91;;;;;;;;;;;;;:::i;:::-;;52500:380;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53300:457;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55086:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7515:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53034:155;;;;;;;;;;;;;:::i;:::-;;50692:36;;;;:::o;31278:372::-;31380:4;31432:25;31417:40;;;:11;:40;;;;:105;;;;31489:33;31474:48;;;:11;:48;;;;31417:105;:172;;;;31554:35;31539:50;;;:11;:50;;;;31417:172;:225;;;;31606:36;31630:11;31606:23;:36::i;:::-;31417:225;31397:245;;31278:372;;;:::o;56207:153::-;6837:12;:10;:12::i;:::-;6826:23;;:7;:5;:7::i;:::-;:23;;;6818:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56309:9:::1;;56296:10;:22;56288:31;;;::::0;::::1;;56342:10;56330:9;:22;;;;56207:153:::0;:::o;53765:597::-;51303:1;51290:9;;:14;51282:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;51435:1:::1;51411:25:::0;::::1;:11;:22;;;:25;;51403:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;53955:12:::2;;51498:298;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51580:151;51613:12;51640:11;:22;;;51704:10;51687:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;51677:39;;;;;;51580:18;:151::i;:::-;51572:204;;;;;;;;;;;;:::i;:::-;;;;;;;;;53985:14:::3;54002:13;:11;:13::i;:::-;53985:30;;54048:21;;54034:10;:35;;54026:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;54170:9;;54156:10;;54131:22;54142:10;54131:6;:10;;:22;;;;:::i;:::-;:35;;;;:::i;:::-;:48;;54123:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;54274:9;54237:33;54252:11;:17;;;54237:10;:14;;:33;;;;:::i;:::-;:46;;54229:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;54321:33;54331:10;54343;54321:9;:33::i;:::-;51787:1;51481::::2;53765:597:::0;;;:::o;32905:100::-;32959:13;32992:5;32985:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32905:100;:::o;34466:214::-;34534:7;34562:16;34570:7;34562;:16::i;:::-;34554:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;34648:15;:24;34664:7;34648:24;;;;;;;;;;;;;;;;;;;;;34641:31;;34466:214;;;:::o;33987:413::-;34060:13;34076:24;34092:7;34076:15;:24::i;:::-;34060:40;;34125:5;34119:11;;:2;:11;;;;34111:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;34220:5;34204:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;34229:37;34246:5;34253:12;:10;:12::i;:::-;34229:16;:37::i;:::-;34204:62;34182:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;34364:28;34373:2;34377:7;34386:5;34364:8;:28::i;:::-;33987:413;;;:::o;52888:138::-;6837:12;:10;:12::i;:::-;6826:23;;:7;:5;:7::i;:::-;:23;;;6818:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52968:1:::1;52955:9;;:14;;52947:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;53017:1;53005:9;:13;;;;52888:138::o:0;29719:100::-;29772:7;29799:12;;29792:19;;29719:100;:::o;35342:162::-;35468:28;35478:4;35484:2;35488:7;35468:9;:28::i;:::-;35342:162;;;:::o;50762:25::-;;;;:::o;30383:823::-;30472:7;30508:16;30518:5;30508:9;:16::i;:::-;30500:5;:24;30492:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;30574:22;30599:13;:11;:13::i;:::-;30574:38;;30623:19;30657:25;30711:9;30706:426;30730:14;30726:1;:18;30706:426;;;30766:31;30800:11;:14;30812:1;30800:14;;;;;;;;;;;30766:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30859:1;30833:28;;:9;:14;;;:28;;;30829:103;;30902:9;:14;;;30882:34;;30829:103;30971:5;30950:26;;:17;:26;;;30946:175;;;31016:5;31001:11;:20;30997:77;;;31053:1;31046:8;;;;;;;;;30997:77;31092:13;;;;;:::i;:::-;;;;30946:175;30706:426;30746:3;;;;;:::i;:::-;;;;30706:426;;;;31142:56;;;;;;;;;;:::i;:::-;;;;;;;;30383:823;;;;;:::o;54856:222::-;6837:12;:10;:12::i;:::-;6826:23;;:7;:5;:7::i;:::-;:23;;;6818:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3856:1:::1;4454:7;;:19;;4446:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;3856:1;4587:7;:18;;;;54919:15:::2;54937:21;54919:39;;54970:12;54988;:10;:12::i;:::-;:17;;55013:7;54988:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54969:56;;;55044:7;55036:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;4618:1;;3812::::1;4766:7;:22;;;;54856:222::o:0;55923:158::-;55968:7;55988:14;56005:13;:11;:13::i;:::-;55988:30;;56036:37;56062:10;;56036:21;56050:6;56036:9;;:13;;:21;;;;:::i;:::-;:25;;:37;;;;:::i;:::-;56029:44;;;55923:158;:::o;35575:177::-;35705:39;35722:4;35728:2;35732:7;35705:39;;;;;;;;;;;;:16;:39::i;:::-;35575:177;;;:::o;29896:187::-;29963:7;29999:13;:11;:13::i;:::-;29991:5;:21;29983:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;30070:5;30063:12;;29896:187;;;:::o;54370:92::-;6837:12;:10;:12::i;:::-;6826:23;;:7;:5;:7::i;:::-;:23;;;6818:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54450:4:::1;54440:7;:14;;;;;;;;;;;;:::i;:::-;;54370:92:::0;:::o;50856:30::-;;;;;;;;;;;;;;:::o;50630:24::-;;;;:::o;55204:341::-;55264:16;55293:18;55314:17;55324:6;55314:9;:17::i;:::-;55293:38;;55342:25;55384:10;55370:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55342:53;;55410:9;55406:106;55425:10;55421:1;:14;55406:106;;;55470:30;55490:6;55498:1;55470:19;:30::i;:::-;55456:8;55465:1;55456:11;;;;;;;;;;;;;;;;;;;;;:44;;;;;55437:3;;;;;:::i;:::-;;;;55406:106;;;;55529:8;55522:15;;;;55204:341;;;:::o;32714:124::-;32778:7;32805:20;32817:7;32805:11;:20::i;:::-;:25;;;32798:32;;32714:124;;;:::o;50794:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31714:221::-;31778:7;31823:1;31806:19;;:5;:19;;;;31798:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;31899:12;:19;31912:5;31899:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;31891:36;;31884:43;;31714:221;;;:::o;7257:103::-;6837:12;:10;:12::i;:::-;6826:23;;:7;:5;:7::i;:::-;:23;;;6818:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7322:30:::1;7349:1;7322:18;:30::i;:::-;7257:103::o:0;52274:218::-;6837:12;:10;:12::i;:::-;6826:23;;:7;:5;:7::i;:::-;:23;;;6818:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52382:7:::1;52368:10;;:21;;52360:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;52443:7;52429:10;;:21;;;;;;;:::i;:::-;;;;;;;;52461:23;52471:3;52476:7;52461:9;:23::i;:::-;52274:218:::0;;:::o;6606:87::-;6652:7;6679:6;;;;;;;;;;;6672:13;;6606:87;:::o;54594:86::-;6837:12;:10;:12::i;:::-;6826:23;;:7;:5;:7::i;:::-;:23;;;6818:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54666:6:::1;54658:5;:14;;;;54594:86:::0;:::o;54688:160::-;51183:1;51170:9;;:14;51162:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;6837:12:::1;:10;:12::i;:::-;6826:23;;:7;:5;:7::i;:::-;:23;;;6818:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54829:11:::2;54804;:22;;:36;;;;54688:160:::0;:::o;33074:104::-;33130:13;33163:7;33156:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33074:104;:::o;50735:20::-;;;;:::o;34752:288::-;34859:12;:10;:12::i;:::-;34847:24;;:8;:24;;;;34839:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;34960:8;34915:18;:32;34934:12;:10;:12::i;:::-;34915:32;;;;;;;;;;;;;;;:42;34948:8;34915:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;35013:8;34984:48;;34999:12;:10;:12::i;:::-;34984:48;;;35023:8;34984:48;;;;;;:::i;:::-;;;;;;;;34752:288;;:::o;35823:355::-;35982:28;35992:4;35998:2;36002:7;35982:9;:28::i;:::-;36043:48;36066:4;36072:2;36076:7;36085:5;36043:22;:48::i;:::-;36021:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;35823:355;;;;:::o;50822:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55553:362::-;55619:13;55653:17;55661:8;55653:7;:17::i;:::-;55645:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;55738:1;55720:7;55714:21;;;;;:::i;:::-;;;:25;:193;;;;;;;;;;;;;;;;;55796:7;55820:26;55837:8;55820:16;:26::i;:::-;55863:13;55763:128;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55714:193;55707:200;;55553:362;;;:::o;50371:89::-;50418:42;50371:89;:::o;50661:24::-;;;;:::o;54470:116::-;6837:12;:10;:12::i;:::-;6826:23;;:7;:5;:7::i;:::-;:23;;;6818:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54568:10:::1;54552:13;:26;;;;;;;;;;;;:::i;:::-;;54470:116:::0;:::o;53201:91::-;51072:1;51060:9;;:13;51052:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;6837:12:::1;:10;:12::i;:::-;6826:23;;:7;:5;:7::i;:::-;:23;;;6818:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53283:1:::2;53271:9;:13;;;;53201:91::o:0;52500:380::-;52625:4;52647:27;50418:42;52647:65;;52768:8;52727:49;;52735:13;:21;;;52757:5;52735:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52727:49;;;52723:93;;;52800:4;52793:11;;;;;52723:93;52833:39;52856:5;52863:8;52833:22;:39::i;:::-;52826:46;;;52500:380;;;;;:::o;53300:457::-;50958:1;50947:9;;:12;50939:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;53392:14:::1;53409:13;:11;:13::i;:::-;53392:30;;53455:21;;53441:10;:35;;53433:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;53577:9;;53563:10;;53538:22;53549:10;53538:6;:10;;:22;;;;:::i;:::-;:35;;;;:::i;:::-;:48;;53530:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;53669:9;53644:21;53659:5;;53644:10;:14;;:21;;;;:::i;:::-;:34;;53636:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;53716:33;53726:10;53738;53716:9;:33::i;:::-;50996:1;53300:457:::0;:::o;55086:110::-;55142:7;55168:20;55182:5;55168:13;:20::i;:::-;55161:27;;55086:110;;;:::o;7515:201::-;6837:12;:10;:12::i;:::-;6826:23;;:7;:5;:7::i;:::-;:23;;;6818:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7624:1:::1;7604:22;;:8;:22;;;;7596:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7680:28;7699:8;7680:18;:28::i;:::-;7515:201:::0;:::o;53034:155::-;51183:1;51170:9;;:14;51162:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;51435:1:::1;51411:25:::0;::::1;:11;:22;;;:25;;51403:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;6837:12:::2;:10;:12::i;:::-;6826:23;;:7;:5;:7::i;:::-;:23;;;6818:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53180:1:::3;53168:9;:13;;;;53034:155::o:0;27782:157::-;27867:4;27906:25;27891:40;;;:11;:40;;;;27884:47;;27782:157;;;:::o;5347:98::-;5400:7;5427:10;5420:17;;5347:98;:::o;945:190::-;1070:4;1123;1094:25;1107:5;1114:4;1094:12;:25::i;:::-;:33;1087:40;;945:190;;;;;:::o;45977:98::-;46035:7;46066:1;46062;:5;;;;:::i;:::-;46055:12;;45977:98;;;;:::o;46715:::-;46773:7;46804:1;46800;:5;;;;:::i;:::-;46793:12;;46715:98;;;;:::o;36552:104::-;36621:27;36631:2;36635:8;36621:27;;;;;;;;;;;;:9;:27::i;:::-;36552:104;;:::o;36433:111::-;36490:4;36524:12;;36514:7;:22;36507:29;;36433:111;;;:::o;40477:196::-;40619:2;40592:15;:24;40608:7;40592:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;40657:7;40653:2;40637:28;;40646:5;40637:28;;;;;;;;;;;;40477:196;;;:::o;38576:1783::-;38691:35;38729:20;38741:7;38729:11;:20::i;:::-;38691:58;;38762:22;38804:13;:18;;;38788:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;38863:12;:10;:12::i;:::-;38839:36;;:20;38851:7;38839:11;:20::i;:::-;:36;;;38788:87;:154;;;;38892:50;38909:13;:18;;;38929:12;:10;:12::i;:::-;38892:16;:50::i;:::-;38788:154;38762:181;;38964:17;38956:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;39079:4;39057:26;;:13;:18;;;:26;;;39049:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;39159:1;39145:16;;:2;:16;;;;39137:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;39216:43;39238:4;39244:2;39248:7;39257:1;39216:21;:43::i;:::-;39324:49;39341:1;39345:7;39354:13;:18;;;39324:8;:49::i;:::-;39608:1;39578:12;:18;39591:4;39578:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39652:1;39624:12;:16;39637:2;39624:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39700:43;;;;;;;;39715:2;39700:43;;;;;;39726:15;39700:43;;;;;39677:11;:20;39689:7;39677:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39983:19;40015:1;40005:7;:11;;;;:::i;:::-;39983:33;;40072:1;40031:43;;:11;:24;40043:11;40031:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;40027:227;;;40095:20;40103:11;40095:7;:20::i;:::-;40091:152;;;40163:64;;;;;;;;40178:13;:18;;;40163:64;;;;;;40198:13;:28;;;40163:64;;;;;40136:11;:24;40148:11;40136:24;;;;;;;;;;;:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40091:152;40027:227;40290:7;40286:2;40271:27;;40280:4;40271:27;;;;;;;;;;;;40309:42;40330:4;40336:2;40340:7;40349:1;40309:20;:42::i;:::-;38576:1783;;;;;;:::o;46358:98::-;46416:7;46447:1;46443;:5;;;;:::i;:::-;46436:12;;46358:98;;;;:::o;32180:472::-;32241:21;;:::i;:::-;32283:16;32291:7;32283;:16::i;:::-;32275:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;32364:12;32379:7;32364:22;;32359:216;32413:31;32447:11;:17;32459:4;32447:17;;;;;;;;;;;32413:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32509:1;32483:28;;:9;:14;;;:28;;;32479:85;;32539:9;32532:16;;;;;;32479:85;32359:216;32390:6;;;;;:::i;:::-;;;;32359:216;;32180:472;;;;:::o;7876:191::-;7950:16;7969:6;;;;;;;;;;;7950:25;;7995:8;7986:6;;:17;;;;;;;;;;;;;;;;;;8050:8;8019:40;;8040:8;8019:40;;;;;;;;;;;;7876:191;;:::o;41238:804::-;41393:4;41414:15;:2;:13;;;:15::i;:::-;41410:625;;;41466:2;41450:36;;;41487:12;:10;:12::i;:::-;41501:4;41507:7;41516:5;41450:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41446:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41713:1;41696:6;:13;:18;41692:273;;;41739:61;;;;;;;;;;:::i;:::-;;;;;;;;41692:273;41915:6;41909:13;41900:6;41896:2;41892:15;41885:38;41446:534;41583:45;;;41573:55;;;:6;:55;;;;41566:62;;;;;41410:625;42019:4;42012:11;;41238:804;;;;;;;:::o;8424:723::-;8480:13;8710:1;8701:5;:10;8697:53;;;8728:10;;;;;;;;;;;;;;;;;;;;;8697:53;8760:12;8775:5;8760:20;;8791:14;8816:78;8831:1;8823:4;:9;8816:78;;8849:8;;;;;:::i;:::-;;;;8880:2;8872:10;;;;;:::i;:::-;;;8816:78;;;8904:19;8936:6;8926:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8904:39;;8954:154;8970:1;8961:5;:10;8954:154;;8998:1;8988:11;;;;;:::i;:::-;;;9065:2;9057:5;:10;;;;:::i;:::-;9044:2;:24;;;;:::i;:::-;9031:39;;9014:6;9021;9014:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;9094:2;9085:11;;;;;:::i;:::-;;;8954:154;;;9132:6;9118:21;;;;;8424:723;;;;:::o;35111:164::-;35208:4;35232:18;:25;35251:5;35232:25;;;;;;;;;;;;;;;:35;35258:8;35232:35;;;;;;;;;;;;;;;;;;;;;;;;;35225:42;;35111:164;;;;:::o;31943:229::-;32004:7;32049:1;32032:19;;:5;:19;;;;32024:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;32131:12;:19;32144:5;32131:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;32123:41;;32116:48;;31943:229;;;:::o;1497:701::-;1580:7;1600:20;1623:4;1600:27;;1643:9;1638:523;1662:5;:12;1658:1;:16;1638:523;;;1696:20;1719:5;1725:1;1719:8;;;;;;;;;;;;;;;;;;;;;;1696:31;;1762:12;1746;:28;1742:408;;1916:12;1930;1899:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1889:55;;;;;;1874:70;;1742:408;;;2106:12;2120;2089:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2079:55;;;;;;2064:70;;1742:408;1638:523;1676:3;;;;;:::i;:::-;;;;1638:523;;;;2178:12;2171:19;;;1497:701;;;;:::o;36933:1389::-;37056:20;37079:12;;37056:35;;37124:1;37110:16;;:2;:16;;;;37102:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;37309:21;37317:12;37309:7;:21::i;:::-;37308:22;37300:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;37394:1;37383:8;:12;37375:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;37448:61;37478:1;37482:2;37486:12;37500:8;37448:21;:61::i;:::-;37522:30;37555:12;:16;37568:2;37555:16;;;;;;;;;;;;;;;37522:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37601:135;;;;;;;;37657:8;37627:11;:19;;;:39;;;;:::i;:::-;37601:135;;;;;;37716:8;37681:11;:24;;;:44;;;;:::i;:::-;37601:135;;;;;37582:12;:16;37595:2;37582:16;;;;;;;;;;;;;;;:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37775:43;;;;;;;;37790:2;37775:43;;;;;;37801:15;37775:43;;;;;37747:11;:25;37759:12;37747:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37831:20;37854:12;37831:35;;37884:9;37879:325;37903:8;37899:1;:12;37879:325;;;37963:12;37959:2;37938:38;;37955:1;37938:38;;;;;;;;;;;;38017:59;38048:1;38052:2;38056:12;38070:5;38017:22;:59::i;:::-;37991:172;;;;;;;;;;;;:::i;:::-;;;;;;;;;38178:14;;;;;:::i;:::-;;;;37913:3;;;;;:::i;:::-;;;;37879:325;;;;38231:12;38216;:27;;;;38254:60;38283:1;38287:2;38291:12;38305:8;38254:20;:60::i;:::-;36933:1389;;;;;;:::o;42530:159::-;;;;;:::o;43101:158::-;;;;;:::o;19603:387::-;19663:4;19871:12;19938:7;19926:20;19918:28;;19981:1;19974:4;:8;19967:15;;;19603:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;867:367::-;;;1000:3;993:4;985:6;981:17;977:27;967:2;;1018:1;1015;1008:12;967:2;1054:6;1041:20;1031:30;;1084:18;1076:6;1073:30;1070:2;;;1116:1;1113;1106:12;1070:2;1153:4;1145:6;1141:17;1129:29;;1207:3;1199:4;1191:6;1187:17;1177:8;1173:32;1170:41;1167:2;;;1224:1;1221;1214:12;1167:2;957:277;;;;;:::o;1240:133::-;;1321:6;1308:20;1299:29;;1337:30;1361:5;1337:30;:::i;:::-;1289:84;;;;:::o;1379:139::-;;1463:6;1450:20;1441:29;;1479:33;1506:5;1479:33;:::i;:::-;1431:87;;;;:::o;1524:137::-;;1607:6;1594:20;1585:29;;1623:32;1649:5;1623:32;:::i;:::-;1575:86;;;;:::o;1667:141::-;;1754:6;1748:13;1739:22;;1770:32;1796:5;1770:32;:::i;:::-;1729:79;;;;:::o;1827:271::-;;1931:3;1924:4;1916:6;1912:17;1908:27;1898:2;;1949:1;1946;1939:12;1898:2;1989:6;1976:20;2014:78;2088:3;2080:6;2073:4;2065:6;2061:17;2014:78;:::i;:::-;2005:87;;1888:210;;;;;:::o;2104:201::-;;2221:6;2215:13;2206:22;;2237:62;2293:5;2237:62;:::i;:::-;2196:109;;;;:::o;2325:273::-;;2430:3;2423:4;2415:6;2411:17;2407:27;2397:2;;2448:1;2445;2438:12;2397:2;2488:6;2475:20;2513:79;2588:3;2580:6;2573:4;2565:6;2561:17;2513:79;:::i;:::-;2504:88;;2387:211;;;;;:::o;2604:139::-;;2688:6;2675:20;2666:29;;2704:33;2731:5;2704:33;:::i;:::-;2656:87;;;;:::o;2749:262::-;;2857:2;2845:9;2836:7;2832:23;2828:32;2825:2;;;2873:1;2870;2863:12;2825:2;2916:1;2941:53;2986:7;2977:6;2966:9;2962:22;2941:53;:::i;:::-;2931:63;;2887:117;2815:196;;;;:::o;3017:407::-;;;3142:2;3130:9;3121:7;3117:23;3113:32;3110:2;;;3158:1;3155;3148:12;3110:2;3201:1;3226:53;3271:7;3262:6;3251:9;3247:22;3226:53;:::i;:::-;3216:63;;3172:117;3328:2;3354:53;3399:7;3390:6;3379:9;3375:22;3354:53;:::i;:::-;3344:63;;3299:118;3100:324;;;;;:::o;3430:552::-;;;;3572:2;3560:9;3551:7;3547:23;3543:32;3540:2;;;3588:1;3585;3578:12;3540:2;3631:1;3656:53;3701:7;3692:6;3681:9;3677:22;3656:53;:::i;:::-;3646:63;;3602:117;3758:2;3784:53;3829:7;3820:6;3809:9;3805:22;3784:53;:::i;:::-;3774:63;;3729:118;3886:2;3912:53;3957:7;3948:6;3937:9;3933:22;3912:53;:::i;:::-;3902:63;;3857:118;3530:452;;;;;:::o;3988:809::-;;;;;4156:3;4144:9;4135:7;4131:23;4127:33;4124:2;;;4173:1;4170;4163:12;4124:2;4216:1;4241:53;4286:7;4277:6;4266:9;4262:22;4241:53;:::i;:::-;4231:63;;4187:117;4343:2;4369:53;4414:7;4405:6;4394:9;4390:22;4369:53;:::i;:::-;4359:63;;4314:118;4471:2;4497:53;4542:7;4533:6;4522:9;4518:22;4497:53;:::i;:::-;4487:63;;4442:118;4627:2;4616:9;4612:18;4599:32;4658:18;4650:6;4647:30;4644:2;;;4690:1;4687;4680:12;4644:2;4718:62;4772:7;4763:6;4752:9;4748:22;4718:62;:::i;:::-;4708:72;;4570:220;4114:683;;;;;;;:::o;4803:401::-;;;4925:2;4913:9;4904:7;4900:23;4896:32;4893:2;;;4941:1;4938;4931:12;4893:2;4984:1;5009:53;5054:7;5045:6;5034:9;5030:22;5009:53;:::i;:::-;4999:63;;4955:117;5111:2;5137:50;5179:7;5170:6;5159:9;5155:22;5137:50;:::i;:::-;5127:60;;5082:115;4883:321;;;;;:::o;5210:407::-;;;5335:2;5323:9;5314:7;5310:23;5306:32;5303:2;;;5351:1;5348;5341:12;5303:2;5394:1;5419:53;5464:7;5455:6;5444:9;5440:22;5419:53;:::i;:::-;5409:63;;5365:117;5521:2;5547:53;5592:7;5583:6;5572:9;5568:22;5547:53;:::i;:::-;5537:63;;5492:118;5293:324;;;;;:::o;5623:262::-;;5731:2;5719:9;5710:7;5706:23;5702:32;5699:2;;;5747:1;5744;5737:12;5699:2;5790:1;5815:53;5860:7;5851:6;5840:9;5836:22;5815:53;:::i;:::-;5805:63;;5761:117;5689:196;;;;:::o;5891:260::-;;5998:2;5986:9;5977:7;5973:23;5969:32;5966:2;;;6014:1;6011;6004:12;5966:2;6057:1;6082:52;6126:7;6117:6;6106:9;6102:22;6082:52;:::i;:::-;6072:62;;6028:116;5956:195;;;;:::o;6157:282::-;;6275:2;6263:9;6254:7;6250:23;6246:32;6243:2;;;6291:1;6288;6281:12;6243:2;6334:1;6359:63;6414:7;6405:6;6394:9;6390:22;6359:63;:::i;:::-;6349:73;;6305:127;6233:206;;;;:::o;6445:342::-;;6593:2;6581:9;6572:7;6568:23;6564:32;6561:2;;;6609:1;6606;6599:12;6561:2;6652:1;6677:93;6762:7;6753:6;6742:9;6738:22;6677:93;:::i;:::-;6667:103;;6623:157;6551:236;;;;:::o;6793:375::-;;6911:2;6899:9;6890:7;6886:23;6882:32;6879:2;;;6927:1;6924;6917:12;6879:2;6998:1;6987:9;6983:17;6970:31;7028:18;7020:6;7017:30;7014:2;;;7060:1;7057;7050:12;7014:2;7088:63;7143:7;7134:6;7123:9;7119:22;7088:63;:::i;:::-;7078:73;;6941:220;6869:299;;;;:::o;7174:262::-;;7282:2;7270:9;7261:7;7257:23;7253:32;7250:2;;;7298:1;7295;7288:12;7250:2;7341:1;7366:53;7411:7;7402:6;7391:9;7387:22;7366:53;:::i;:::-;7356:63;;7312:117;7240:196;;;;:::o;7442:407::-;;;7567:2;7555:9;7546:7;7542:23;7538:32;7535:2;;;7583:1;7580;7573:12;7535:2;7626:1;7651:53;7696:7;7687:6;7676:9;7672:22;7651:53;:::i;:::-;7641:63;;7597:117;7753:2;7779:53;7824:7;7815:6;7804:9;7800:22;7779:53;:::i;:::-;7769:63;;7724:118;7525:324;;;;;:::o;7855:570::-;;;;8015:2;8003:9;7994:7;7990:23;7986:32;7983:2;;;8031:1;8028;8021:12;7983:2;8074:1;8099:53;8144:7;8135:6;8124:9;8120:22;8099:53;:::i;:::-;8089:63;;8045:117;8229:2;8218:9;8214:18;8201:32;8260:18;8252:6;8249:30;8246:2;;;8292:1;8289;8282:12;8246:2;8328:80;8400:7;8391:6;8380:9;8376:22;8328:80;:::i;:::-;8310:98;;;;8172:246;7973:452;;;;;:::o;8431:179::-;;8521:46;8563:3;8555:6;8521:46;:::i;:::-;8599:4;8594:3;8590:14;8576:28;;8511:99;;;;:::o;8616:118::-;8703:24;8721:5;8703:24;:::i;:::-;8698:3;8691:37;8681:53;;:::o;8740:157::-;8845:45;8865:24;8883:5;8865:24;:::i;:::-;8845:45;:::i;:::-;8840:3;8833:58;8823:74;;:::o;8933:732::-;;9081:54;9129:5;9081:54;:::i;:::-;9151:86;9230:6;9225:3;9151:86;:::i;:::-;9144:93;;9261:56;9311:5;9261:56;:::i;:::-;9340:7;9371:1;9356:284;9381:6;9378:1;9375:13;9356:284;;;9457:6;9451:13;9484:63;9543:3;9528:13;9484:63;:::i;:::-;9477:70;;9570:60;9623:6;9570:60;:::i;:::-;9560:70;;9416:224;9403:1;9400;9396:9;9391:14;;9356:284;;;9360:14;9656:3;9649:10;;9057:608;;;;;;;:::o;9671:109::-;9752:21;9767:5;9752:21;:::i;:::-;9747:3;9740:34;9730:50;;:::o;9786:118::-;9873:24;9891:5;9873:24;:::i;:::-;9868:3;9861:37;9851:53;;:::o;9910:157::-;10015:45;10035:24;10053:5;10035:24;:::i;:::-;10015:45;:::i;:::-;10010:3;10003:58;9993:74;;:::o;10073:360::-;;10187:38;10219:5;10187:38;:::i;:::-;10241:70;10304:6;10299:3;10241:70;:::i;:::-;10234:77;;10320:52;10365:6;10360:3;10353:4;10346:5;10342:16;10320:52;:::i;:::-;10397:29;10419:6;10397:29;:::i;:::-;10392:3;10388:39;10381:46;;10163:270;;;;;:::o;10439:364::-;;10555:39;10588:5;10555:39;:::i;:::-;10610:71;10674:6;10669:3;10610:71;:::i;:::-;10603:78;;10690:52;10735:6;10730:3;10723:4;10716:5;10712:16;10690:52;:::i;:::-;10767:29;10789:6;10767:29;:::i;:::-;10762:3;10758:39;10751:46;;10531:272;;;;;:::o;10809:377::-;;10943:39;10976:5;10943:39;:::i;:::-;10998:89;11080:6;11075:3;10998:89;:::i;:::-;10991:96;;11096:52;11141:6;11136:3;11129:4;11122:5;11118:16;11096:52;:::i;:::-;11173:6;11168:3;11164:16;11157:23;;10919:267;;;;;:::o;11216:845::-;;11356:5;11350:12;11385:36;11411:9;11385:36;:::i;:::-;11437:89;11519:6;11514:3;11437:89;:::i;:::-;11430:96;;11557:1;11546:9;11542:17;11573:1;11568:137;;;;11719:1;11714:341;;;;11535:520;;11568:137;11652:4;11648:9;11637;11633:25;11628:3;11621:38;11688:6;11683:3;11679:16;11672:23;;11568:137;;11714:341;11781:38;11813:5;11781:38;:::i;:::-;11841:1;11855:154;11869:6;11866:1;11863:13;11855:154;;;11943:7;11937:14;11933:1;11928:3;11924:11;11917:35;11993:1;11984:7;11980:15;11969:26;;11891:4;11888:1;11884:12;11879:17;;11855:154;;;12038:6;12033:3;12029:16;12022:23;;11721:334;;11535:520;;11323:738;;;;;;:::o;12067:366::-;;12230:67;12294:2;12289:3;12230:67;:::i;:::-;12223:74;;12327:34;12323:1;12318:3;12314:11;12307:55;12393:4;12388:2;12383:3;12379:12;12372:26;12424:2;12419:3;12415:12;12408:19;;12213:220;;;:::o;12439:370::-;;12602:67;12666:2;12661:3;12602:67;:::i;:::-;12595:74;;12699:34;12695:1;12690:3;12686:11;12679:55;12765:8;12760:2;12755:3;12751:12;12744:30;12800:2;12795:3;12791:12;12784:19;;12585:224;;;:::o;12815:374::-;;12978:67;13042:2;13037:3;12978:67;:::i;:::-;12971:74;;13075:34;13071:1;13066:3;13062:11;13055:55;13141:12;13136:2;13131:3;13127:12;13120:34;13180:2;13175:3;13171:12;13164:19;;12961:228;;;:::o;13195:322::-;;13358:67;13422:2;13417:3;13358:67;:::i;:::-;13351:74;;13455:26;13451:1;13446:3;13442:11;13435:47;13508:2;13503:3;13499:12;13492:19;;13341:176;;;:::o;13523:370::-;;13686:67;13750:2;13745:3;13686:67;:::i;:::-;13679:74;;13783:34;13779:1;13774:3;13770:11;13763:55;13849:8;13844:2;13839:3;13835:12;13828:30;13884:2;13879:3;13875:12;13868:19;;13669:224;;;:::o;13899:367::-;;14062:67;14126:2;14121:3;14062:67;:::i;:::-;14055:74;;14159:34;14155:1;14150:3;14146:11;14139:55;14225:5;14220:2;14215:3;14211:12;14204:27;14257:2;14252:3;14248:12;14241:19;;14045:221;;;:::o;14272:369::-;;14435:67;14499:2;14494:3;14435:67;:::i;:::-;14428:74;;14532:34;14528:1;14523:3;14519:11;14512:55;14598:7;14593:2;14588:3;14584:12;14577:29;14632:2;14627:3;14623:12;14616:19;;14418:223;;;:::o;14647:381::-;;14810:67;14874:2;14869:3;14810:67;:::i;:::-;14803:74;;14907:34;14903:1;14898:3;14894:11;14887:55;14973:19;14968:2;14963:3;14959:12;14952:41;15019:2;15014:3;15010:12;15003:19;;14793:235;;;:::o;15034:315::-;;15197:67;15261:2;15256:3;15197:67;:::i;:::-;15190:74;;15294:19;15290:1;15285:3;15281:11;15274:40;15340:2;15335:3;15331:12;15324:19;;15180:169;;;:::o;15355:313::-;;15518:67;15582:2;15577:3;15518:67;:::i;:::-;15511:74;;15615:17;15611:1;15606:3;15602:11;15595:38;15659:2;15654:3;15650:12;15643:19;;15501:167;;;:::o;15674:320::-;;15837:67;15901:2;15896:3;15837:67;:::i;:::-;15830:74;;15934:24;15930:1;15925:3;15921:11;15914:45;15985:2;15980:3;15976:12;15969:19;;15820:174;;;:::o;16000:389::-;;16163:67;16227:2;16222:3;16163:67;:::i;:::-;16156:74;;16260:34;16256:1;16251:3;16247:11;16240:55;16326:27;16321:2;16316:3;16312:12;16305:49;16380:2;16375:3;16371:12;16364:19;;16146:243;;;:::o;16395:328::-;;16558:67;16622:2;16617:3;16558:67;:::i;:::-;16551:74;;16655:32;16651:1;16646:3;16642:11;16635:53;16714:2;16709:3;16705:12;16698:19;;16541:182;;;:::o;16729:375::-;;16892:67;16956:2;16951:3;16892:67;:::i;:::-;16885:74;;16989:34;16985:1;16980:3;16976:11;16969:55;17055:13;17050:2;17045:3;17041:12;17034:35;17095:2;17090:3;17086:12;17079:19;;16875:229;;;:::o;17110:319::-;;17273:67;17337:2;17332:3;17273:67;:::i;:::-;17266:74;;17370:23;17366:1;17361:3;17357:11;17350:44;17420:2;17415:3;17411:12;17404:19;;17256:173;;;:::o;17435:370::-;;17598:67;17662:2;17657:3;17598:67;:::i;:::-;17591:74;;17695:34;17691:1;17686:3;17682:11;17675:55;17761:8;17756:2;17751:3;17747:12;17740:30;17796:2;17791:3;17787:12;17780:19;;17581:224;;;:::o;17811:330::-;;17974:67;18038:2;18033:3;17974:67;:::i;:::-;17967:74;;18071:34;18067:1;18062:3;18058:11;18051:55;18132:2;18127:3;18123:12;18116:19;;17957:184;;;:::o;18147:324::-;;18310:67;18374:2;18369:3;18310:67;:::i;:::-;18303:74;;18407:28;18403:1;18398:3;18394:11;18387:49;18462:2;18457:3;18453:12;18446:19;;18293:178;;;:::o;18477:382::-;;18640:67;18704:2;18699:3;18640:67;:::i;:::-;18633:74;;18737:34;18733:1;18728:3;18724:11;18717:55;18803:20;18798:2;18793:3;18789:12;18782:42;18850:2;18845:3;18841:12;18834:19;;18623:236;;;:::o;18865:366::-;;19028:67;19092:2;19087:3;19028:67;:::i;:::-;19021:74;;19125:34;19121:1;19116:3;19112:11;19105:55;19191:4;19186:2;19181:3;19177:12;19170:26;19222:2;19217:3;19213:12;19206:19;;19011:220;;;:::o;19237:297::-;;19417:83;19498:1;19493:3;19417:83;:::i;:::-;19410:90;;19526:1;19521:3;19517:11;19510:18;;19400:134;;;:::o;19540:367::-;;19703:67;19767:2;19762:3;19703:67;:::i;:::-;19696:74;;19800:34;19796:1;19791:3;19787:11;19780:55;19866:5;19861:2;19856:3;19852:12;19845:27;19898:2;19893:3;19889:12;19882:19;;19686:221;;;:::o;19913:366::-;;20076:67;20140:2;20135:3;20076:67;:::i;:::-;20069:74;;20173:34;20169:1;20164:3;20160:11;20153:55;20239:4;20234:2;20229:3;20225:12;20218:26;20270:2;20265:3;20261:12;20254:19;;20059:220;;;:::o;20285:383::-;;20448:67;20512:2;20507:3;20448:67;:::i;:::-;20441:74;;20545:34;20541:1;20536:3;20532:11;20525:55;20611:21;20606:2;20601:3;20597:12;20590:43;20659:2;20654:3;20650:12;20643:19;;20431:237;;;:::o;20674:327::-;;20837:67;20901:2;20896:3;20837:67;:::i;:::-;20830:74;;20934:31;20930:1;20925:3;20921:11;20914:52;20992:2;20987:3;20983:12;20976:19;;20820:181;;;:::o;21007:365::-;;21170:67;21234:2;21229:3;21170:67;:::i;:::-;21163:74;;21267:34;21263:1;21258:3;21254:11;21247:55;21333:3;21328:2;21323:3;21319:12;21312:25;21363:2;21358:3;21354:12;21347:19;;21153:219;;;:::o;21378:312::-;;21541:67;21605:2;21600:3;21541:67;:::i;:::-;21534:74;;21638:16;21634:1;21629:3;21625:11;21618:37;21681:2;21676:3;21672:12;21665:19;;21524:166;;;:::o;21696:378::-;;21859:67;21923:2;21918:3;21859:67;:::i;:::-;21852:74;;21956:34;21952:1;21947:3;21943:11;21936:55;22022:16;22017:2;22012:3;22008:12;22001:38;22065:2;22060:3;22056:12;22049:19;;21842:232;;;:::o;22080:329::-;;22243:67;22307:2;22302:3;22243:67;:::i;:::-;22236:74;;22340:33;22336:1;22331:3;22327:11;22320:54;22400:2;22395:3;22391:12;22384:19;;22226:183;;;:::o;22800:318::-;;22963:67;23027:2;23022:3;22963:67;:::i;:::-;22956:74;;23060:22;23056:1;23051:3;23047:11;23040:43;23109:2;23104:3;23100:12;23093:19;;22946:172;;;:::o;23124:377::-;;23287:67;23351:2;23346:3;23287:67;:::i;:::-;23280:74;;23384:34;23380:1;23375:3;23371:11;23364:55;23450:15;23445:2;23440:3;23436:12;23429:37;23492:2;23487:3;23483:12;23476:19;;23270:231;;;:::o;23507:324::-;;23670:67;23734:2;23729:3;23670:67;:::i;:::-;23663:74;;23767:28;23763:1;23758:3;23754:11;23747:49;23822:2;23817:3;23813:12;23806:19;;23653:178;;;:::o;23837:320::-;;24000:67;24064:2;24059:3;24000:67;:::i;:::-;23993:74;;24097:24;24093:1;24088:3;24084:11;24077:45;24148:2;24143:3;24139:12;24132:19;;23983:174;;;:::o;24163:108::-;24240:24;24258:5;24240:24;:::i;:::-;24235:3;24228:37;24218:53;;:::o;24277:118::-;24364:24;24382:5;24364:24;:::i;:::-;24359:3;24352:37;24342:53;;:::o;24401:256::-;;24528:75;24599:3;24590:6;24528:75;:::i;:::-;24628:2;24623:3;24619:12;24612:19;;24648:3;24641:10;;24517:140;;;;:::o;24663:397::-;;24818:75;24889:3;24880:6;24818:75;:::i;:::-;24918:2;24913:3;24909:12;24902:19;;24931:75;25002:3;24993:6;24931:75;:::i;:::-;25031:2;25026:3;25022:12;25015:19;;25051:3;25044:10;;24807:253;;;;;:::o;25066:583::-;;25310:92;25398:3;25389:6;25310:92;:::i;:::-;25303:99;;25419:95;25510:3;25501:6;25419:95;:::i;:::-;25412:102;;25531:92;25619:3;25610:6;25531:92;:::i;:::-;25524:99;;25640:3;25633:10;;25292:357;;;;;;:::o;25655:379::-;;25861:147;26004:3;25861:147;:::i;:::-;25854:154;;26025:3;26018:10;;25843:191;;;:::o;26040:222::-;;26171:2;26160:9;26156:18;26148:26;;26184:71;26252:1;26241:9;26237:17;26228:6;26184:71;:::i;:::-;26138:124;;;;:::o;26268:640::-;;26501:3;26490:9;26486:19;26478:27;;26515:71;26583:1;26572:9;26568:17;26559:6;26515:71;:::i;:::-;26596:72;26664:2;26653:9;26649:18;26640:6;26596:72;:::i;:::-;26678;26746:2;26735:9;26731:18;26722:6;26678:72;:::i;:::-;26797:9;26791:4;26787:20;26782:2;26771:9;26767:18;26760:48;26825:76;26896:4;26887:6;26825:76;:::i;:::-;26817:84;;26468:440;;;;;;;:::o;26914:373::-;;27095:2;27084:9;27080:18;27072:26;;27144:9;27138:4;27134:20;27130:1;27119:9;27115:17;27108:47;27172:108;27275:4;27266:6;27172:108;:::i;:::-;27164:116;;27062:225;;;;:::o;27293:210::-;;27418:2;27407:9;27403:18;27395:26;;27431:65;27493:1;27482:9;27478:17;27469:6;27431:65;:::i;:::-;27385:118;;;;:::o;27509:313::-;;27660:2;27649:9;27645:18;27637:26;;27709:9;27703:4;27699:20;27695:1;27684:9;27680:17;27673:47;27737:78;27810:4;27801:6;27737:78;:::i;:::-;27729:86;;27627:195;;;;:::o;27828:419::-;;28032:2;28021:9;28017:18;28009:26;;28081:9;28075:4;28071:20;28067:1;28056:9;28052:17;28045:47;28109:131;28235:4;28109:131;:::i;:::-;28101:139;;27999:248;;;:::o;28253:419::-;;28457:2;28446:9;28442:18;28434:26;;28506:9;28500:4;28496:20;28492:1;28481:9;28477:17;28470:47;28534:131;28660:4;28534:131;:::i;:::-;28526:139;;28424:248;;;:::o;28678:419::-;;28882:2;28871:9;28867:18;28859:26;;28931:9;28925:4;28921:20;28917:1;28906:9;28902:17;28895:47;28959:131;29085:4;28959:131;:::i;:::-;28951:139;;28849:248;;;:::o;29103:419::-;;29307:2;29296:9;29292:18;29284:26;;29356:9;29350:4;29346:20;29342:1;29331:9;29327:17;29320:47;29384:131;29510:4;29384:131;:::i;:::-;29376:139;;29274:248;;;:::o;29528:419::-;;29732:2;29721:9;29717:18;29709:26;;29781:9;29775:4;29771:20;29767:1;29756:9;29752:17;29745:47;29809:131;29935:4;29809:131;:::i;:::-;29801:139;;29699:248;;;:::o;29953:419::-;;30157:2;30146:9;30142:18;30134:26;;30206:9;30200:4;30196:20;30192:1;30181:9;30177:17;30170:47;30234:131;30360:4;30234:131;:::i;:::-;30226:139;;30124:248;;;:::o;30378:419::-;;30582:2;30571:9;30567:18;30559:26;;30631:9;30625:4;30621:20;30617:1;30606:9;30602:17;30595:47;30659:131;30785:4;30659:131;:::i;:::-;30651:139;;30549:248;;;:::o;30803:419::-;;31007:2;30996:9;30992:18;30984:26;;31056:9;31050:4;31046:20;31042:1;31031:9;31027:17;31020:47;31084:131;31210:4;31084:131;:::i;:::-;31076:139;;30974:248;;;:::o;31228:419::-;;31432:2;31421:9;31417:18;31409:26;;31481:9;31475:4;31471:20;31467:1;31456:9;31452:17;31445:47;31509:131;31635:4;31509:131;:::i;:::-;31501:139;;31399:248;;;:::o;31653:419::-;;31857:2;31846:9;31842:18;31834:26;;31906:9;31900:4;31896:20;31892:1;31881:9;31877:17;31870:47;31934:131;32060:4;31934:131;:::i;:::-;31926:139;;31824:248;;;:::o;32078:419::-;;32282:2;32271:9;32267:18;32259:26;;32331:9;32325:4;32321:20;32317:1;32306:9;32302:17;32295:47;32359:131;32485:4;32359:131;:::i;:::-;32351:139;;32249:248;;;:::o;32503:419::-;;32707:2;32696:9;32692:18;32684:26;;32756:9;32750:4;32746:20;32742:1;32731:9;32727:17;32720:47;32784:131;32910:4;32784:131;:::i;:::-;32776:139;;32674:248;;;:::o;32928:419::-;;33132:2;33121:9;33117:18;33109:26;;33181:9;33175:4;33171:20;33167:1;33156:9;33152:17;33145:47;33209:131;33335:4;33209:131;:::i;:::-;33201:139;;33099:248;;;:::o;33353:419::-;;33557:2;33546:9;33542:18;33534:26;;33606:9;33600:4;33596:20;33592:1;33581:9;33577:17;33570:47;33634:131;33760:4;33634:131;:::i;:::-;33626:139;;33524:248;;;:::o;33778:419::-;;33982:2;33971:9;33967:18;33959:26;;34031:9;34025:4;34021:20;34017:1;34006:9;34002:17;33995:47;34059:131;34185:4;34059:131;:::i;:::-;34051:139;;33949:248;;;:::o;34203:419::-;;34407:2;34396:9;34392:18;34384:26;;34456:9;34450:4;34446:20;34442:1;34431:9;34427:17;34420:47;34484:131;34610:4;34484:131;:::i;:::-;34476:139;;34374:248;;;:::o;34628:419::-;;34832:2;34821:9;34817:18;34809:26;;34881:9;34875:4;34871:20;34867:1;34856:9;34852:17;34845:47;34909:131;35035:4;34909:131;:::i;:::-;34901:139;;34799:248;;;:::o;35053:419::-;;35257:2;35246:9;35242:18;35234:26;;35306:9;35300:4;35296:20;35292:1;35281:9;35277:17;35270:47;35334:131;35460:4;35334:131;:::i;:::-;35326:139;;35224:248;;;:::o;35478:419::-;;35682:2;35671:9;35667:18;35659:26;;35731:9;35725:4;35721:20;35717:1;35706:9;35702:17;35695:47;35759:131;35885:4;35759:131;:::i;:::-;35751:139;;35649:248;;;:::o;35903:419::-;;36107:2;36096:9;36092:18;36084:26;;36156:9;36150:4;36146:20;36142:1;36131:9;36127:17;36120:47;36184:131;36310:4;36184:131;:::i;:::-;36176:139;;36074:248;;;:::o;36328:419::-;;36532:2;36521:9;36517:18;36509:26;;36581:9;36575:4;36571:20;36567:1;36556:9;36552:17;36545:47;36609:131;36735:4;36609:131;:::i;:::-;36601:139;;36499:248;;;:::o;36753:419::-;;36957:2;36946:9;36942:18;36934:26;;37006:9;37000:4;36996:20;36992:1;36981:9;36977:17;36970:47;37034:131;37160:4;37034:131;:::i;:::-;37026:139;;36924:248;;;:::o;37178:419::-;;37382:2;37371:9;37367:18;37359:26;;37431:9;37425:4;37421:20;37417:1;37406:9;37402:17;37395:47;37459:131;37585:4;37459:131;:::i;:::-;37451:139;;37349:248;;;:::o;37603:419::-;;37807:2;37796:9;37792:18;37784:26;;37856:9;37850:4;37846:20;37842:1;37831:9;37827:17;37820:47;37884:131;38010:4;37884:131;:::i;:::-;37876:139;;37774:248;;;:::o;38028:419::-;;38232:2;38221:9;38217:18;38209:26;;38281:9;38275:4;38271:20;38267:1;38256:9;38252:17;38245:47;38309:131;38435:4;38309:131;:::i;:::-;38301:139;;38199:248;;;:::o;38453:419::-;;38657:2;38646:9;38642:18;38634:26;;38706:9;38700:4;38696:20;38692:1;38681:9;38677:17;38670:47;38734:131;38860:4;38734:131;:::i;:::-;38726:139;;38624:248;;;:::o;38878:419::-;;39082:2;39071:9;39067:18;39059:26;;39131:9;39125:4;39121:20;39117:1;39106:9;39102:17;39095:47;39159:131;39285:4;39159:131;:::i;:::-;39151:139;;39049:248;;;:::o;39303:419::-;;39507:2;39496:9;39492:18;39484:26;;39556:9;39550:4;39546:20;39542:1;39531:9;39527:17;39520:47;39584:131;39710:4;39584:131;:::i;:::-;39576:139;;39474:248;;;:::o;40153:419::-;;40357:2;40346:9;40342:18;40334:26;;40406:9;40400:4;40396:20;40392:1;40381:9;40377:17;40370:47;40434:131;40560:4;40434:131;:::i;:::-;40426:139;;40324:248;;;:::o;40578:419::-;;40782:2;40771:9;40767:18;40759:26;;40831:9;40825:4;40821:20;40817:1;40806:9;40802:17;40795:47;40859:131;40985:4;40859:131;:::i;:::-;40851:139;;40749:248;;;:::o;41003:419::-;;41207:2;41196:9;41192:18;41184:26;;41256:9;41250:4;41246:20;41242:1;41231:9;41227:17;41220:47;41284:131;41410:4;41284:131;:::i;:::-;41276:139;;41174:248;;;:::o;41428:419::-;;41632:2;41621:9;41617:18;41609:26;;41681:9;41675:4;41671:20;41667:1;41656:9;41652:17;41645:47;41709:131;41835:4;41709:131;:::i;:::-;41701:139;;41599:248;;;:::o;41853:222::-;;41984:2;41973:9;41969:18;41961:26;;41997:71;42065:1;42054:9;42050:17;42041:6;41997:71;:::i;:::-;41951:124;;;;:::o;42081:332::-;;42240:2;42229:9;42225:18;42217:26;;42253:71;42321:1;42310:9;42306:17;42297:6;42253:71;:::i;:::-;42334:72;42402:2;42391:9;42387:18;42378:6;42334:72;:::i;:::-;42207:206;;;;;:::o;42419:283::-;;42485:2;42479:9;42469:19;;42527:4;42519:6;42515:17;42634:6;42622:10;42619:22;42598:18;42586:10;42583:34;42580:62;42577:2;;;42645:18;;:::i;:::-;42577:2;42685:10;42681:2;42674:22;42459:243;;;;:::o;42708:331::-;;42859:18;42851:6;42848:30;42845:2;;;42881:18;;:::i;:::-;42845:2;42966:4;42962:9;42955:4;42947:6;42943:17;42939:33;42931:41;;43027:4;43021;43017:15;43009:23;;42774:265;;;:::o;43045:332::-;;43197:18;43189:6;43186:30;43183:2;;;43219:18;;:::i;:::-;43183:2;43304:4;43300:9;43293:4;43285:6;43281:17;43277:33;43269:41;;43365:4;43359;43355:15;43347:23;;43112:265;;;:::o;43383:132::-;;43473:3;43465:11;;43503:4;43498:3;43494:14;43486:22;;43455:60;;;:::o;43521:141::-;;43593:3;43585:11;;43616:3;43613:1;43606:14;43650:4;43647:1;43637:18;43629:26;;43575:87;;;:::o;43668:114::-;;43769:5;43763:12;43753:22;;43742:40;;;:::o;43788:98::-;;43873:5;43867:12;43857:22;;43846:40;;;:::o;43892:99::-;;43978:5;43972:12;43962:22;;43951:40;;;:::o;43997:113::-;;44099:4;44094:3;44090:14;44082:22;;44072:38;;;:::o;44116:184::-;;44249:6;44244:3;44237:19;44289:4;44284:3;44280:14;44265:29;;44227:73;;;;:::o;44306:168::-;;44423:6;44418:3;44411:19;44463:4;44458:3;44454:14;44439:29;;44401:73;;;;:::o;44480:147::-;;44618:3;44603:18;;44593:34;;;;:::o;44633:169::-;;44751:6;44746:3;44739:19;44791:4;44786:3;44782:14;44767:29;;44729:73;;;;:::o;44808:148::-;;44947:3;44932:18;;44922:34;;;;:::o;44962:273::-;;45021:20;45039:1;45021:20;:::i;:::-;45016:25;;45055:20;45073:1;45055:20;:::i;:::-;45050:25;;45177:1;45141:34;45137:42;45134:1;45131:49;45128:2;;;45183:18;;:::i;:::-;45128:2;45227:1;45224;45220:9;45213:16;;45006:229;;;;:::o;45241:305::-;;45300:20;45318:1;45300:20;:::i;:::-;45295:25;;45334:20;45352:1;45334:20;:::i;:::-;45329:25;;45488:1;45420:66;45416:74;45413:1;45410:81;45407:2;;;45494:18;;:::i;:::-;45407:2;45538:1;45535;45531:9;45524:16;;45285:261;;;;:::o;45552:185::-;;45609:20;45627:1;45609:20;:::i;:::-;45604:25;;45643:20;45661:1;45643:20;:::i;:::-;45638:25;;45682:1;45672:2;;45687:18;;:::i;:::-;45672:2;45729:1;45726;45722:9;45717:14;;45594:143;;;;:::o;45743:348::-;;45806:20;45824:1;45806:20;:::i;:::-;45801:25;;45840:20;45858:1;45840:20;:::i;:::-;45835:25;;46028:1;45960:66;45956:74;45953:1;45950:81;45945:1;45938:9;45931:17;45927:105;45924:2;;;46035:18;;:::i;:::-;45924:2;46083:1;46080;46076:9;46065:20;;45791:300;;;;:::o;46097:191::-;;46157:20;46175:1;46157:20;:::i;:::-;46152:25;;46191:20;46209:1;46191:20;:::i;:::-;46186:25;;46230:1;46227;46224:8;46221:2;;;46235:18;;:::i;:::-;46221:2;46280:1;46277;46273:9;46265:17;;46142:146;;;;:::o;46294:96::-;;46360:24;46378:5;46360:24;:::i;:::-;46349:35;;46339:51;;;:::o;46396:90::-;;46473:5;46466:13;46459:21;46448:32;;46438:48;;;:::o;46492:77::-;;46558:5;46547:16;;46537:32;;;:::o;46575:149::-;;46651:66;46644:5;46640:78;46629:89;;46619:105;;;:::o;46730:125::-;;46825:24;46843:5;46825:24;:::i;:::-;46814:35;;46804:51;;;:::o;46861:118::-;;46938:34;46931:5;46927:46;46916:57;;46906:73;;;:::o;46985:126::-;;47062:42;47055:5;47051:54;47040:65;;47030:81;;;:::o;47117:77::-;;47183:5;47172:16;;47162:32;;;:::o;47200:154::-;47284:6;47279:3;47274;47261:30;47346:1;47337:6;47332:3;47328:16;47321:27;47251:103;;;:::o;47360:307::-;47428:1;47438:113;47452:6;47449:1;47446:13;47438:113;;;47537:1;47532:3;47528:11;47522:18;47518:1;47513:3;47509:11;47502:39;47474:2;47471:1;47467:10;47462:15;;47438:113;;;47569:6;47566:1;47563:13;47560:2;;;47649:1;47640:6;47635:3;47631:16;47624:27;47560:2;47409:258;;;;:::o;47673:171::-;;47735:24;47753:5;47735:24;:::i;:::-;47726:33;;47781:4;47774:5;47771:15;47768:2;;;47789:18;;:::i;:::-;47768:2;47836:1;47829:5;47825:13;47818:20;;47716:128;;;:::o;47850:320::-;;47931:1;47925:4;47921:12;47911:22;;47978:1;47972:4;47968:12;47999:18;47989:2;;48055:4;48047:6;48043:17;48033:27;;47989:2;48117;48109:6;48106:14;48086:18;48083:38;48080:2;;;48136:18;;:::i;:::-;48080:2;47901:269;;;;:::o;48176:233::-;;48238:24;48256:5;48238:24;:::i;:::-;48229:33;;48284:66;48277:5;48274:77;48271:2;;;48354:18;;:::i;:::-;48271:2;48401:1;48394:5;48390:13;48383:20;;48219:190;;;:::o;48415:100::-;;48483:26;48503:5;48483:26;:::i;:::-;48472:37;;48462:53;;;:::o;48521:79::-;;48589:5;48578:16;;48568:32;;;:::o;48606:94::-;;48674:20;48688:5;48674:20;:::i;:::-;48663:31;;48653:47;;;:::o;48706:176::-;;48755:20;48773:1;48755:20;:::i;:::-;48750:25;;48789:20;48807:1;48789:20;:::i;:::-;48784:25;;48828:1;48818:2;;48833:18;;:::i;:::-;48818:2;48874:1;48871;48867:9;48862:14;;48740:142;;;;:::o;48888:180::-;48936:77;48933:1;48926:88;49033:4;49030:1;49023:15;49057:4;49054:1;49047:15;49074:180;49122:77;49119:1;49112:88;49219:4;49216:1;49209:15;49243:4;49240:1;49233:15;49260:180;49308:77;49305:1;49298:88;49405:4;49402:1;49395:15;49429:4;49426:1;49419:15;49446:180;49494:77;49491:1;49484:88;49591:4;49588:1;49581:15;49615:4;49612:1;49605:15;49632:102;;49724:2;49720:7;49715:2;49708:5;49704:14;49700:28;49690:38;;49680:54;;;:::o;49740:94::-;;49821:5;49817:2;49813:14;49792:35;;49782:52;;;:::o;49840:122::-;49913:24;49931:5;49913:24;:::i;:::-;49906:5;49903:35;49893:2;;49952:1;49949;49942:12;49893:2;49883:79;:::o;49968:116::-;50038:21;50053:5;50038:21;:::i;:::-;50031:5;50028:32;50018:2;;50074:1;50071;50064:12;50018:2;50008:76;:::o;50090:122::-;50163:24;50181:5;50163:24;:::i;:::-;50156:5;50153:35;50143:2;;50202:1;50199;50192:12;50143:2;50133:79;:::o;50218:120::-;50290:23;50307:5;50290:23;:::i;:::-;50283:5;50280:34;50270:2;;50328:1;50325;50318:12;50270:2;50260:78;:::o;50344:180::-;50446:53;50493:5;50446:53;:::i;:::-;50439:5;50436:64;50426:2;;50514:1;50511;50504:12;50426:2;50416:108;:::o;50530:122::-;50603:24;50621:5;50603:24;:::i;:::-;50596:5;50593:35;50583:2;;50642:1;50639;50632:12;50583:2;50573:79;:::o

Swarm Source

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