ETH Price: $3,330.41 (-8.44%)

Token

Yield Hacker PASS (YHP)
 

Overview

Max Total Supply

2,000 YHP

Holders

1,928

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 YHP
0x0082d961dee0932a9c68564b14ddb4efec172055
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CaioVicentino

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: @openzeppelin/[email protected]/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @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 = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


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

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


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

pragma solidity ^0.8.0;


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

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

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

// File: contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;









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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId, string memory baseExtension) public view virtual returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();
        string memory baseURI = _baseURI();
        if (_exists(tokenId)) return string(abi.encodePacked(baseURI, Strings.toString(tokenId), baseExtension));
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, Strings.toString(tokenId), baseExtension)) : '';
    }

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

        address from = prevOwnership.addr;

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: address zero is not a valid owner");
        return _balances[owner];
    }

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");
        _safeTransfer(from, to, tokenId, data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721URIStorage.sol)

pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @dev See {ERC721-_burn}. This override additionally checks to see if a
     * token-specific URI was set for the token, and if so, it deletes the token URI from
     * the storage mapping.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

// File: CaioVicentino.sol



pragma solidity >=0.7.0 <0.9.0;








contract CaioVicentino is ERC721A, Ownable {
  using Address for address;
  using Strings for uint256;

  bytes32 public root;
  bytes32[] public merkleProof;

  mapping(address => bool) public whitelistClaimed;

  string private baseURI; //Deve ser a URL do json do pinata: 
  string private baseExtension = ".json";
  string private notRevealedUri = "";
  uint256 private maxSupply = 2000;
  uint256 private maxMintAmount = 5;
  uint256 private FreeMintPerAddressLimit = 1;
  bool private paused = true;
  bool private onlyWhitelisted = true;
  address[] public whitelistedAddresses;
  mapping(address => uint256) private addressMintedBalance;
  mapping(uint256 => uint) private _availableTokens;
  uint256 private _numAvailableTokens;

  string private _contractUri;

  address _contractOwner;

  mapping (address => bool) private _affiliates;
  bool private _allowAffiliateProgram = true;
  uint private _affiliateProgramPercentage = 15;

  bool private _allowRecommendation = true;
  uint256 private _recommendationPercentage = 10;
  uint256 private _royalties = 10;
  uint256 royaltiesSpender;

  mapping(address => uint256) private _addressLastMintedTokenId;

  bool private _isFreeMint = false;
  uint256 private _nftEtherValue = 250000000000000000;

  event _transferSend(address _from, address _to, uint _amount);

  constructor(
    string memory _initBaseURI,
    bytes32 _root,
    string memory _contractURI
  ) ERC721A("Yield Hacker PASS", "YHP") {
    setBaseURI(_initBaseURI);
    root = _root;
    _contractUri = _contractURI;
    _contractOwner = msg.sender;
  }

    function isValid(bytes32[] memory proof, bytes32 leaf) public view returns (bool) {
      return MerkleProof.verify(proof, root, leaf);
    }

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

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

    function setFreeMintPerAddressLimit(uint256 _limit) public onlyOwner {
      FreeMintPerAddressLimit = _limit;
    }

    function setOnlyWhitelisted(bool _state) public onlyOwner {
      onlyWhitelisted = _state;
    }

    function isOnlyWhitelist() public view returns (bool) {
      return onlyWhitelisted;
    }

    function setMaxMintAmount(uint256 _maxMintAmount) public onlyOwner {
      maxMintAmount = _maxMintAmount;
    }

    function pause(bool _state) public onlyOwner {
      paused = _state;
    }

    function setAllowAffiliateProgram(bool _state) public onlyOwner {
      _allowAffiliateProgram = _state;
    }

    function setAffiliateProgramPercentage(uint256 percentage) public onlyOwner {
      _affiliateProgramPercentage = percentage;
    }

    function withdraw() public payable onlyOwner {
      (bool os, ) = payable(owner()).call{value: address(this).balance}("");
      require(os);
    }

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

    function setNftEtherValue(uint256 nftEtherValue) public onlyOwner {
      _nftEtherValue = nftEtherValue;
    }

    function setAffiliate(address manager, bool state) public onlyOwner {
      _affiliates[manager] = state;
    }

    function setIsFreeMint(bool state) public onlyOwner {
        _isFreeMint = state;
    }

    function getQtdAvailableTokens() public view returns (uint256) {
      if(_numAvailableTokens > 0){
        return _numAvailableTokens;
      }
      return maxSupply;
    }

    function getMaxSupply() public view returns (uint) {
      return maxSupply;
    }

    function getNftEtherValue() public view returns (uint) {
      return _nftEtherValue;
    }

    function getAddressLastMintedTokenId(address wallet) public view returns (uint256) {
      return _addressLastMintedTokenId[wallet];
    }

    function getMaxMintAmount() public view returns (uint256) {
      return maxMintAmount;
    }

    function getBalance() public view returns (uint) {
     return msg.sender.balance;
    }

    function getBaseURI() public view returns (string memory) {
      return baseURI;
    }

    function getNFTURI(uint256 tokenId) public view returns(string memory){
      return string(abi.encodePacked(baseURI, Strings.toString(tokenId), baseExtension));
    }

    function isAffliliated(address wallet) public view returns (bool) {
     return _affiliates[wallet];
    }

    function contractIsFreeMint() public view returns (bool) {
     return _isFreeMint;
    }

    function isPaused() public view returns (bool) {
      return paused;
    }

    function isWhitelisted(address _user, bytes32[] memory proof) public view returns (bool) {
      if( isValid( proof, keccak256( abi.encodePacked(_user) ) ) ) {
        if (whitelistClaimed[_user]) {
          return false;
        }
        return true;
      } else {
        return false;
      }
    }

  
    function mintWhitelist(
      uint256 _mintAmount,
      address payable _recommendedBy,
      uint256 _indicationType, //1=directlink, 2=affiliate, 3=recomendation
      address payable endUser,
      bytes32[] memory proof
    ) public payable {
      require(!paused, "O contrato pausado");
      uint256 supply = totalSupply();
      require(_mintAmount > 0, "Precisa mintar pelo menos 1 NFT");
      require(_mintAmount + balanceOf(endUser) <= maxMintAmount, "Quantidade limite de mint por carteira excedida");
      require(supply + _mintAmount <= maxSupply, "Quantidade limite de NFT excedida");

      if(onlyWhitelisted) {
        require(!whitelistClaimed[endUser], "Address ja reivindicado");
        require(isValid(proof, keccak256(abi.encodePacked(endUser))), "Nao faz parte da Whitelist");
      }

      if(_indicationType == 2) {
        require(_allowAffiliateProgram, "No momento o programa de afiliados se encontra desativado");
      }

      if(!_isFreeMint ) {
        if(!isValid(proof, keccak256(abi.encodePacked(endUser)))) {
          split(_mintAmount, _recommendedBy, _indicationType);
        } else {
          uint tokensIds = walletOfOwner(endUser);
          if(tokensIds > 0){
            split(_mintAmount, _recommendedBy, _indicationType);
          }
        }
      }

      uint256 updatedNumAvailableTokens = maxSupply - totalSupply();
      
      for (uint256 i = 1; i <= _mintAmount; i++) {
        addressMintedBalance[endUser]++;
        _safeMint(endUser, 1);
        uint256 newIdToken = supply + 1;
        tokenURI(newIdToken);
        --updatedNumAvailableTokens;
        _addressLastMintedTokenId[endUser] = i;
      }

      if (onlyWhitelisted) {
        whitelistClaimed[endUser] = true;
      }
      _numAvailableTokens = updatedNumAvailableTokens;
    }

    function mint(
      uint256 _mintAmount,
      address payable _recommendedBy,
      uint256 _indicationType, //1=directlink, 2=affiliate, 3=recomendation
      address payable endUser
    ) public payable {
      require(!paused, "O contrato pausado");
      uint256 supply = totalSupply();
      require(_mintAmount > 0, "Precisa mintar pelo menos 1 NFT");
      require(_mintAmount + balanceOf(endUser) <= maxMintAmount, "Quantidade limite de mint por carteira excedida");
      require(supply + _mintAmount <= maxSupply, "Quantidade limite de NFT excedida");

      if(onlyWhitelisted) {
        require(!whitelistClaimed[endUser], "Address ja reivindicado");
      }

      if(_indicationType == 2) {
        require(_allowAffiliateProgram, "No momento o programa de afiliados se encontra desativado");
      }

      split(_mintAmount, _recommendedBy, _indicationType);

      uint256 updatedNumAvailableTokens = maxSupply - totalSupply();
      
      for (uint256 i = 1; i <= _mintAmount; i++) {
        addressMintedBalance[endUser]++;
        _safeMint(endUser, 1);
        uint256 newIdToken = supply + 1;
        tokenURI(newIdToken);
        --updatedNumAvailableTokens;
        _addressLastMintedTokenId[endUser] = i;
      }

      if (onlyWhitelisted) {
        whitelistClaimed[endUser] = true;
      }
      _numAvailableTokens = updatedNumAvailableTokens;
    }

    function contractURI() external view returns (string memory) {
      return _contractUri;
    }
  
    function setContractURI(string memory contractURI_) external onlyOwner {
      _contractUri = contractURI_;
    }

    function tokenURI(uint256 tokenId)
      public
      view
      virtual
      returns (string memory)
    {
      require(
        _exists(tokenId),
        "ERC721Metadata: URI query for nonexistent token"
      );

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

    function walletOfOwner(address _owner)
      public
      view
      returns (uint)
    {
      return addressMintedBalance[_owner];
    }

    function split(uint256 _mintAmount, address payable _recommendedBy, uint256 _indicationType ) public payable{
      require(msg.value >= (_nftEtherValue * _mintAmount), "Valor da mintagem diferente do valor definido no contrato");

      uint ownerAmount = msg.value;

      if(_indicationType > 1){

        uint256 _splitPercentage = _recommendationPercentage;
        if(_indicationType == 2 && _allowAffiliateProgram){
            if( _affiliates[_recommendedBy] ){
              _splitPercentage = _affiliateProgramPercentage;
            }
        }

        uint256 amount = msg.value * _splitPercentage / 100;
        ownerAmount = msg.value - amount;

        emit _transferSend(msg.sender, _recommendedBy, amount);
        _recommendedBy.transfer(amount);
      }
      payable(_contractOwner).transfer(ownerAmount);
    }

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"bytes32","name":"_root","type":"bytes32"},{"internalType":"string","name":"_contractURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"_transferSend","type":"event"},{"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":"_checkContractOnERC721Received","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"_transfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractIsFreeMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"getAddressLastMintedTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getNFTURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNftEtherValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getQtdAvailableTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"isAffliliated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOnlyWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"bytes32","name":"leaf","type":"bytes32"}],"name":"isValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"merkleProof","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address payable","name":"_recommendedBy","type":"address"},{"internalType":"uint256","name":"_indicationType","type":"uint256"},{"internalType":"address payable","name":"endUser","type":"address"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address payable","name":"_recommendedBy","type":"address"},{"internalType":"uint256","name":"_indicationType","type":"uint256"},{"internalType":"address payable","name":"endUser","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setAffiliate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"setAffiliateProgramPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setAllowAffiliateProgram","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"contractURI_","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setFreeMintPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"}],"name":"setIsFreeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmount","type":"uint256"}],"name":"setMaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftEtherValue","type":"uint256"}],"name":"setNftEtherValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address payable","name":"_recommendedBy","type":"address"},{"internalType":"uint256","name":"_indicationType","type":"uint256"}],"name":"split","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"baseExtension","type":"string"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistedAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d9080519060200190620000519291906200046e565b5060405180602001604052806000815250600e9080519060200190620000799291906200046e565b506107d0600f55600560105560016011556001601260006101000a81548160ff0219169083151502179055506001601260016101000a81548160ff0219169083151502179055506001601a60006101000a81548160ff021916908315150217905550600f601b556001601c60006101000a81548160ff021916908315150217905550600a601d55600a601e556000602160006101000a81548160ff0219169083151502179055506703782dace9d900006022553480156200013957600080fd5b5060405162005a1238038062005a1283398181016040528101906200015f9190620005a7565b6040518060400160405280601181526020017f5969656c64204861636b657220504153530000000000000000000000000000008152506040518060400160405280600381526020017f59485000000000000000000000000000000000000000000000000000000000008152508160029080519060200190620001e39291906200046e565b508060039080519060200190620001fc9291906200046e565b506200020d620002b060201b60201c565b60008190555050506200023562000229620002b960201b60201c565b620002c160201b60201c565b62000246836200038760201b60201c565b816009819055508060179080519060200190620002659291906200046e565b5033601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505062000846565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b62000397620003b360201b60201c565b80600c9080519060200190620003af9291906200046e565b5050565b620003c3620002b960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003e96200044460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000442576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004399062000656565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200047c9062000728565b90600052602060002090601f016020900481019282620004a05760008555620004ec565b82601f10620004bb57805160ff1916838001178555620004ec565b82800160010185558215620004ec579182015b82811115620004eb578251825591602001919060010190620004ce565b5b509050620004fb9190620004ff565b5090565b5b808211156200051a57600081600090555060010162000500565b5090565b6000620005356200052f84620006a1565b62000678565b9050828152602081018484840111156200054e57600080fd5b6200055b848285620006f2565b509392505050565b60008151905062000574816200082c565b92915050565b600082601f8301126200058c57600080fd5b81516200059e8482602086016200051e565b91505092915050565b600080600060608486031215620005bd57600080fd5b600084015167ffffffffffffffff811115620005d857600080fd5b620005e6868287016200057a565b9350506020620005f98682870162000563565b925050604084015167ffffffffffffffff8111156200061757600080fd5b62000625868287016200057a565b9150509250925092565b60006200063e602083620006d7565b91506200064b8262000803565b602082019050919050565b6000602082019050818103600083015262000671816200062f565b9050919050565b60006200068462000697565b90506200069282826200075e565b919050565b6000604051905090565b600067ffffffffffffffff821115620006bf57620006be620007c3565b5b620006ca82620007f2565b9050602081019050919050565b600082825260208201905092915050565b6000819050919050565b60005b8381101562000712578082015181840152602081019050620006f5565b8381111562000722576000848401525b50505050565b600060028204905060018216806200074157607f821691505b6020821081141562000758576200075762000794565b5b50919050565b6200076982620007f2565b810181811067ffffffffffffffff821117156200078b576200078a620007c3565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6200083781620006e8565b81146200084357600080fd5b50565b6151bc80620008566000396000f3fe60806040526004361061036a5760003560e01c806370a08231116101c6578063ba4e5c49116100f7578063e8a3d48511610095578063ebf0c7171161006f578063ebf0c71714610cc7578063ef5d87d714610cf2578063f2fde38b14610d1b578063fa9a309d14610d445761036a565b8063e8a3d48514610c43578063e985e9c514610c6e578063e9eb700814610cab5761036a565b8063d6e7b8e4116100d1578063d6e7b8e414610b82578063d88343e214610bad578063db4bec4414610bea578063e674b4c814610c275761036a565b8063ba4e5c4914610add578063c87b56dd14610b1a578063d03be3ec14610b575761036a565b806395d89b4111610164578063b187bd261161013e578063b187bd2614610a21578063b4ed16b314610a4c578063b88d4fde14610a77578063b8a20ed014610aa05761036a565b806395d89b41146109905780639b0e665d146109bb578063a22cb465146109f85761036a565b80638863ebbb116101a05780638863ebbb146108ea5780638da5cb5b14610913578063938e3d7b1461093e57806394cf4b6a146109675761036a565b806370a082311461086b578063714c5398146108a8578063715018a6146108d35761036a565b80633ccfd60b116102a057806355f804b31161023e5780636c21fb00116102185780636c21fb00146107b15780636e17f797146107ee5780636f50c93c146108175780636f8b44b0146108425761036a565b806355f804b31461070e5780635a23dd99146107375780636352211e146107745761036a565b8063438b63001161027a578063438b630014610652578063474c68ec1461068f5780634c0f38c2146106b85780634fc9f84a146106e35761036a565b80633ccfd60b146105e257806341dcf454146105ec57806342842e0e146106295761036a565b8063095ea7b31161030d57806323b872dd116102e757806323b872dd1461054b57806328fccf971461057457806330e0789e146105905780633c952764146105b95761036a565b8063095ea7b3146104cc57806312065fe0146104f557806318160ddd146105205761036a565b806306fdde031161034957806306fdde0314610412578063081812fc1461043d578063081818161461047a578063088a4ed0146104a35761036a565b8062621fda1461036f57806301ffc9a7146103ac57806302329a29146103e9575b600080fd5b34801561037b57600080fd5b50610396600480360381019061039191906140bc565b610d81565b6040516103a3919061476b565b60405180910390f35b3480156103b857600080fd5b506103d360048036038101906103ce9190614029565b610db8565b6040516103e09190614735565b60405180910390f35b3480156103f557600080fd5b50610410600480360381019061040b9190614000565b610e9a565b005b34801561041e57600080fd5b50610427610ebf565b604051610434919061476b565b60405180910390f35b34801561044957600080fd5b50610464600480360381019061045f91906140bc565b610f51565b6040516104719190614697565b60405180910390f35b34801561048657600080fd5b506104a1600480360381019061049c91906140bc565b610fcd565b005b3480156104af57600080fd5b506104ca60048036038101906104c591906140bc565b610fdf565b005b3480156104d857600080fd5b506104f360048036038101906104ee9190613f70565b610ff1565b005b34801561050157600080fd5b5061050a6110fc565b60405161051791906148ed565b60405180910390f35b34801561052c57600080fd5b5061053561111b565b60405161054291906148ed565b60405180910390f35b34801561055757600080fd5b50610572600480360381019061056d9190613e16565b611132565b005b61058e60048036038101906105899190614197565b611142565b005b34801561059c57600080fd5b506105b760048036038101906105b29190613e16565b6115f6565b005b3480156105c557600080fd5b506105e060048036038101906105db9190614000565b611aac565b005b6105ea611ad1565b005b3480156105f857600080fd5b50610613600480360381019061060e9190614226565b611b59565b604051610620919061476b565b60405180910390f35b34801561063557600080fd5b50610650600480360381019061064b9190613e16565b611c3e565b005b34801561065e57600080fd5b5061067960048036038101906106749190613db1565b611c5e565b60405161068691906148ed565b60405180910390f35b34801561069b57600080fd5b506106b660048036038101906106b191906140bc565b611ca7565b005b3480156106c457600080fd5b506106cd611cb9565b6040516106da91906148ed565b60405180910390f35b3480156106ef57600080fd5b506106f8611cc3565b6040516107059190614735565b60405180910390f35b34801561071a57600080fd5b506107356004803603810190610730919061407b565b611cda565b005b34801561074357600080fd5b5061075e60048036038101906107599190613ee0565b611cfc565b60405161076b9190614735565b60405180910390f35b34801561078057600080fd5b5061079b600480360381019061079691906140bc565b611da2565b6040516107a89190614697565b60405180910390f35b3480156107bd57600080fd5b506107d860048036038101906107d39190613db1565b611db8565b6040516107e591906148ed565b60405180910390f35b3480156107fa57600080fd5b50610815600480360381019061081091906140bc565b611e01565b005b34801561082357600080fd5b5061082c611e13565b6040516108399190614735565b60405180910390f35b34801561084e57600080fd5b50610869600480360381019061086491906140bc565b611e2a565b005b34801561087757600080fd5b50610892600480360381019061088d9190613db1565b611e3c565b60405161089f91906148ed565b60405180910390f35b3480156108b457600080fd5b506108bd611f0c565b6040516108ca919061476b565b60405180910390f35b3480156108df57600080fd5b506108e8611f9e565b005b3480156108f657600080fd5b50610911600480360381019061090c9190613f34565b611fb2565b005b34801561091f57600080fd5b50610928612015565b6040516109359190614697565b60405180910390f35b34801561094a57600080fd5b506109656004803603810190610960919061407b565b61203f565b005b34801561097357600080fd5b5061098e60048036038101906109899190614000565b612061565b005b34801561099c57600080fd5b506109a5612086565b6040516109b2919061476b565b60405180910390f35b3480156109c757600080fd5b506109e260048036038101906109dd9190613db1565b612118565b6040516109ef9190614735565b60405180910390f35b348015610a0457600080fd5b50610a1f6004803603810190610a1a9190613f34565b61216e565b005b348015610a2d57600080fd5b50610a366122e6565b604051610a439190614735565b60405180910390f35b348015610a5857600080fd5b50610a616122fd565b604051610a6e91906148ed565b60405180910390f35b348015610a8357600080fd5b50610a9e6004803603810190610a999190613e65565b61231c565b005b348015610aac57600080fd5b50610ac76004803603810190610ac29190613fac565b6123f3565b604051610ad49190614735565b60405180910390f35b348015610ae957600080fd5b50610b046004803603810190610aff91906140bc565b61240a565b604051610b119190614697565b60405180910390f35b348015610b2657600080fd5b50610b416004803603810190610b3c91906140bc565b612449565b604051610b4e919061476b565b60405180910390f35b348015610b6357600080fd5b50610b6c6124f3565b604051610b7991906148ed565b60405180910390f35b348015610b8e57600080fd5b50610b976124fd565b604051610ba491906148ed565b60405180910390f35b348015610bb957600080fd5b50610bd46004803603810190610bcf9190613e65565b612507565b604051610be19190614735565b60405180910390f35b348015610bf657600080fd5b50610c116004803603810190610c0c9190613db1565b612667565b604051610c1e9190614735565b60405180910390f35b610c416004803603810190610c3c91906140e5565b612687565b005b348015610c4f57600080fd5b50610c58612884565b604051610c65919061476b565b60405180910390f35b348015610c7a57600080fd5b50610c956004803603810190610c909190613dda565b612916565b604051610ca29190614735565b60405180910390f35b610cc56004803603810190610cc09190614134565b6129aa565b005b348015610cd357600080fd5b50610cdc612d7c565b604051610ce99190614750565b60405180910390f35b348015610cfe57600080fd5b50610d196004803603810190610d149190614000565b612d82565b005b348015610d2757600080fd5b50610d426004803603810190610d3d9190613db1565b612da7565b005b348015610d5057600080fd5b50610d6b6004803603810190610d6691906140bc565b612e2b565b604051610d789190614750565b60405180910390f35b6060600c610d8e83612e4f565b600d604051602001610da293929190614651565b6040516020818303038152906040529050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e8357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e935750610e9282612ffc565b5b9050919050565b610ea2613066565b80601260006101000a81548160ff02191690831515021790555050565b606060028054610ece90614c65565b80601f0160208091040260200160405190810160405280929190818152602001828054610efa90614c65565b8015610f475780601f10610f1c57610100808354040283529160200191610f47565b820191906000526020600020905b815481529060010190602001808311610f2a57829003601f168201915b5050505050905090565b6000610f5c826130e4565b610f92576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610fd5613066565b8060118190555050565b610fe7613066565b8060108190555050565b6000610ffc82611da2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611064576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611083613132565b73ffffffffffffffffffffffffffffffffffffffff16141580156110b557506110b3816110ae613132565b612916565b155b156110ec576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110f783838361313a565b505050565b60003373ffffffffffffffffffffffffffffffffffffffff1631905090565b60006111256131ec565b6001546000540303905090565b61113d8383836115f6565b505050565b601260009054906101000a900460ff1615611192576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611189906147ed565b60405180910390fd5b600061119c61111b565b9050600086116111e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d89061486d565b60405180910390fd5b6010546111ed84611e3c565b876111f89190614a1e565b1115611239576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611230906147cd565b60405180910390fd5b600f5486826112489190614a1e565b1115611289576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611280906148ad565b60405180910390fd5b601260019054906101000a900460ff161561139b57600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561132b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611322906147ad565b60405180910390fd5b61135b828460405160200161134091906145d4565b604051602081830303815290604052805190602001206123f3565b61139a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611391906148cd565b60405180910390fd5b5b60028414156113f457601a60009054906101000a900460ff166113f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ea9061488d565b60405180910390fd5b5b602160009054906101000a900460ff1661147157611438828460405160200161141d91906145d4565b604051602081830303815290604052805190602001206123f3565b61144c57611447868686612687565b611470565b600061145784611c5e565b9050600081111561146e5761146d878787612687565b5b505b5b600061147b61111b565b600f546114889190614aff565b90506000600190505b87811161157757601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906114e890614cc8565b91905055506114f88560016131f5565b60006001846115079190614a1e565b905061151281612449565b508261151d90614c3b565b925081602060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050808061156f90614cc8565b915050611491565b50601260019054906101000a900460ff16156115e6576001600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b8060168190555050505050505050565b600061160182613213565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461166c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661168d613132565b73ffffffffffffffffffffffffffffffffffffffff1614806116bc57506116bb856116b6613132565b612916565b5b8061170157506116ca613132565b73ffffffffffffffffffffffffffffffffffffffff166116e984610f51565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061173a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156117a1576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117ae85858560016134a2565b6117ba6000848761313a565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611a3a576000548214611a3957878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611aa585858560016134a8565b5050505050565b611ab4613066565b80601260016101000a81548160ff02191690831515021790555050565b611ad9613066565b6000611ae3612015565b73ffffffffffffffffffffffffffffffffffffffff1647604051611b0690614682565b60006040518083038185875af1925050503d8060008114611b43576040519150601f19603f3d011682016040523d82523d6000602084013e611b48565b606091505b5050905080611b5657600080fd5b50565b6060611b64836130e4565b611b9a576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611ba46134ae565b9050611baf846130e4565b15611be85780611bbe85612e4f565b84604051602001611bd1939291906145ef565b604051602081830303815290604052915050611c38565b600081511415611c075760405180602001604052806000815250611c34565b80611c1185612e4f565b84604051602001611c24939291906145ef565b6040516020818303038152906040525b9150505b92915050565b611c598383836040518060200160405280600081525061231c565b505050565b6000601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611caf613066565b80601b8190555050565b6000600f54905090565b6000602160009054906101000a900460ff16905090565b611ce2613066565b80600c9080519060200190611cf8929190613ad2565b5050565b6000611d2e8284604051602001611d1391906145b9565b604051602081830303815290604052805190602001206123f3565b15611d9757600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611d8e5760009050611d9c565b60019050611d9c565b600090505b92915050565b6000611dad82613213565b600001519050919050565b6000602060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611e09613066565b8060228190555050565b6000601260019054906101000a900460ff16905090565b611e32613066565b80600f8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ea4576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6060600c8054611f1b90614c65565b80601f0160208091040260200160405190810160405280929190818152602001828054611f4790614c65565b8015611f945780601f10611f6957610100808354040283529160200191611f94565b820191906000526020600020905b815481529060010190602001808311611f7757829003601f168201915b5050505050905090565b611fa6613066565b611fb06000613540565b565b611fba613066565b80601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b612047613066565b806017908051906020019061205d929190613ad2565b5050565b612069613066565b80601a60006101000a81548160ff02191690831515021790555050565b60606003805461209590614c65565b80601f01602080910402602001604051908101604052809291908181526020018280546120c190614c65565b801561210e5780601f106120e35761010080835404028352916020019161210e565b820191906000526020600020905b8154815290600101906020018083116120f157829003601f168201915b5050505050905090565b6000601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b612176613132565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121db576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006121e8613132565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612295613132565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122da9190614735565b60405180910390a35050565b6000601260009054906101000a900460ff16905090565b6000806016541115612313576016549050612319565b600f5490505b90565b6123278484846115f6565b6123468373ffffffffffffffffffffffffffffffffffffffff16613606565b801561235b575061235984848484612507565b155b15612392576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b60006124028360095484613629565b905092915050565b6013818154811061241a57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060612454826130e4565b612493576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248a9061484d565b60405180910390fd5b600061249d6134ae565b905060008151116124bd57604051806020016040528060008152506124eb565b806124c784612e4f565b600d6040516020016124db93929190614620565b6040516020818303038152906040525b915050919050565b6000602254905090565b6000601054905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261252d613132565b8786866040518563ffffffff1660e01b815260040161254f94939291906146e9565b602060405180830381600087803b15801561256957600080fd5b505af192505050801561259a57506040513d601f19601f820116820180604052508101906125979190614052565b60015b612614573d80600081146125ca576040519150601f19603f3d011682016040523d82523d6000602084013e6125cf565b606091505b5060008151141561260c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600b6020528060005260406000206000915054906101000a900460ff1681565b826022546126959190614aa5565b3410156126d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ce9061480d565b60405180910390fd5b60003490506001821115612815576000601d5490506002831480156127085750601a60009054906101000a900460ff165b1561276657601960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561276557601b5490505b5b6000606482346127769190614aa5565b6127809190614a74565b9050803461278e9190614aff565b92507ff70a742b6ec5de639ce8e8d0df10a44a88c323ac660a09f1fc0c190e830aea743386836040516127c3939291906146b2565b60405180910390a18473ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612811573d6000803e3d6000fd5b5050505b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561287d573d6000803e3d6000fd5b5050505050565b60606017805461289390614c65565b80601f01602080910402602001604051908101604052809291908181526020018280546128bf90614c65565b801561290c5780601f106128e15761010080835404028352916020019161290c565b820191906000526020600020905b8154815290600101906020018083116128ef57829003601f168201915b5050505050905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601260009054906101000a900460ff16156129fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f1906147ed565b60405180910390fd5b6000612a0461111b565b905060008511612a49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a409061486d565b60405180910390fd5b601054612a5583611e3c565b86612a609190614a1e565b1115612aa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a98906147cd565b60405180910390fd5b600f548582612ab09190614a1e565b1115612af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae8906148ad565b60405180910390fd5b601260019054906101000a900460ff1615612b9457600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8a906147ad565b60405180910390fd5b5b6002831415612bed57601a60009054906101000a900460ff16612bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be39061488d565b60405180910390fd5b5b612bf8858585612687565b6000612c0261111b565b600f54612c0f9190614aff565b90506000600190505b868111612cfe57601460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190612c6f90614cc8565b9190505550612c7f8460016131f5565b6000600184612c8e9190614a1e565b9050612c9981612449565b5082612ca490614c3b565b925081602060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550508080612cf690614cc8565b915050612c18565b50601260019054906101000a900460ff1615612d6d576001600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b80601681905550505050505050565b60095481565b612d8a613066565b80602160006101000a81548160ff02191690831515021790555050565b612daf613066565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e169061478d565b60405180910390fd5b612e2881613540565b50565b600a8181548110612e3b57600080fd5b906000526020600020016000915090505481565b60606000821415612e97576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ff7565b600082905060005b60008214612ec9578080612eb290614cc8565b915050600a82612ec29190614a74565b9150612e9f565b60008167ffffffffffffffff811115612f0b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612f3d5781602001600182028036833780820191505090505b5090505b60008514612ff057600182612f569190614aff565b9150600a85612f659190614d47565b6030612f719190614a1e565b60f81b818381518110612fad577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612fe99190614a74565b9450612f41565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61306e613132565b73ffffffffffffffffffffffffffffffffffffffff1661308c612015565b73ffffffffffffffffffffffffffffffffffffffff16146130e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130d99061482d565b60405180910390fd5b565b6000816130ef6131ec565b111580156130fe575060005482105b801561312b575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b61320f828260405180602001604052806000815250613640565b5050565b61321b613b58565b6000829050806132296131ec565b11158015613238575060005481105b1561346b576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161346957600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461334d57809250505061349d565b5b60011561346857818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461346357809250505061349d565b61334e565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b50505050565b50505050565b6060600c80546134bd90614c65565b80601f01602080910402602001604051908101604052809291908181526020018280546134e990614c65565b80156135365780601f1061350b57610100808354040283529160200191613536565b820191906000526020600020905b81548152906001019060200180831161351957829003601f168201915b5050505050905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000826136368584613652565b1490509392505050565b61364d83838360016136ed565b505050565b60008082905060005b84518110156136e257600085828151811061369f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190508083116136c1576136ba8382613abb565b92506136ce565b6136cb8184613abb565b92505b5080806136da90614cc8565b91505061365b565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561375a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613795576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6137a260008683876134a2565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561396c575061396b8773ffffffffffffffffffffffffffffffffffffffff16613606565b5b15613a32575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46139e16000888480600101955088612507565b613a17576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415613972578260005414613a2d57600080fd5b613a9e565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415613a33575b816000819055505050613ab460008683876134a8565b5050505050565b600082600052816020526040600020905092915050565b828054613ade90614c65565b90600052602060002090601f016020900481019282613b005760008555613b47565b82601f10613b1957805160ff1916838001178555613b47565b82800160010185558215613b47579182015b82811115613b46578251825591602001919060010190613b2b565b5b509050613b549190613b9b565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613bb4576000816000905550600101613b9c565b5090565b6000613bcb613bc68461492d565b614908565b90508083825260208201905082856020860282011115613bea57600080fd5b60005b85811015613c1a5781613c008882613d09565b845260208401935060208301925050600181019050613bed565b5050509392505050565b6000613c37613c3284614959565b614908565b905082815260208101848484011115613c4f57600080fd5b613c5a848285614bf9565b509392505050565b6000613c75613c708461498a565b614908565b905082815260208101848484011115613c8d57600080fd5b613c98848285614bf9565b509392505050565b600081359050613caf816150fc565b92915050565b600081359050613cc481615113565b92915050565b600082601f830112613cdb57600080fd5b8135613ceb848260208601613bb8565b91505092915050565b600081359050613d038161512a565b92915050565b600081359050613d1881615141565b92915050565b600081359050613d2d81615158565b92915050565b600081519050613d4281615158565b92915050565b600082601f830112613d5957600080fd5b8135613d69848260208601613c24565b91505092915050565b600082601f830112613d8357600080fd5b8135613d93848260208601613c62565b91505092915050565b600081359050613dab8161516f565b92915050565b600060208284031215613dc357600080fd5b6000613dd184828501613ca0565b91505092915050565b60008060408385031215613ded57600080fd5b6000613dfb85828601613ca0565b9250506020613e0c85828601613ca0565b9150509250929050565b600080600060608486031215613e2b57600080fd5b6000613e3986828701613ca0565b9350506020613e4a86828701613ca0565b9250506040613e5b86828701613d9c565b9150509250925092565b60008060008060808587031215613e7b57600080fd5b6000613e8987828801613ca0565b9450506020613e9a87828801613ca0565b9350506040613eab87828801613d9c565b925050606085013567ffffffffffffffff811115613ec857600080fd5b613ed487828801613d48565b91505092959194509250565b60008060408385031215613ef357600080fd5b6000613f0185828601613ca0565b925050602083013567ffffffffffffffff811115613f1e57600080fd5b613f2a85828601613cca565b9150509250929050565b60008060408385031215613f4757600080fd5b6000613f5585828601613ca0565b9250506020613f6685828601613cf4565b9150509250929050565b60008060408385031215613f8357600080fd5b6000613f9185828601613ca0565b9250506020613fa285828601613d9c565b9150509250929050565b60008060408385031215613fbf57600080fd5b600083013567ffffffffffffffff811115613fd957600080fd5b613fe585828601613cca565b9250506020613ff685828601613d09565b9150509250929050565b60006020828403121561401257600080fd5b600061402084828501613cf4565b91505092915050565b60006020828403121561403b57600080fd5b600061404984828501613d1e565b91505092915050565b60006020828403121561406457600080fd5b600061407284828501613d33565b91505092915050565b60006020828403121561408d57600080fd5b600082013567ffffffffffffffff8111156140a757600080fd5b6140b384828501613d72565b91505092915050565b6000602082840312156140ce57600080fd5b60006140dc84828501613d9c565b91505092915050565b6000806000606084860312156140fa57600080fd5b600061410886828701613d9c565b935050602061411986828701613cb5565b925050604061412a86828701613d9c565b9150509250925092565b6000806000806080858703121561414a57600080fd5b600061415887828801613d9c565b945050602061416987828801613cb5565b935050604061417a87828801613d9c565b925050606061418b87828801613cb5565b91505092959194509250565b600080600080600060a086880312156141af57600080fd5b60006141bd88828901613d9c565b95505060206141ce88828901613cb5565b94505060406141df88828901613d9c565b93505060606141f088828901613cb5565b925050608086013567ffffffffffffffff81111561420d57600080fd5b61421988828901613cca565b9150509295509295909350565b6000806040838503121561423957600080fd5b600061424785828601613d9c565b925050602083013567ffffffffffffffff81111561426457600080fd5b61427085828601613d72565b9150509250929050565b61428381614bc3565b82525050565b61429a61429582614b45565b614d23565b82525050565b6142a981614b33565b82525050565b6142c06142bb82614b33565b614d11565b82525050565b6142cf81614b57565b82525050565b6142de81614b63565b82525050565b60006142ef826149d0565b6142f981856149e6565b9350614309818560208601614c08565b61431281614e34565b840191505092915050565b6000614328826149db565b6143328185614a02565b9350614342818560208601614c08565b61434b81614e34565b840191505092915050565b6000614361826149db565b61436b8185614a13565b935061437b818560208601614c08565b80840191505092915050565b6000815461439481614c65565b61439e8186614a13565b945060018216600081146143b957600181146143ca576143fd565b60ff198316865281860193506143fd565b6143d3856149bb565b60005b838110156143f5578154818901526001820191506020810190506143d6565b838801955050505b50505092915050565b6000614413602683614a02565b915061441e82614e52565b604082019050919050565b6000614436601783614a02565b915061444182614ea1565b602082019050919050565b6000614459602f83614a02565b915061446482614eca565b604082019050919050565b600061447c601283614a02565b915061448782614f19565b602082019050919050565b600061449f603983614a02565b91506144aa82614f42565b604082019050919050565b60006144c2602083614a02565b91506144cd82614f91565b602082019050919050565b60006144e5602f83614a02565b91506144f082614fba565b604082019050919050565b6000614508601f83614a02565b915061451382615009565b602082019050919050565b600061452b6000836149f7565b915061453682615032565b600082019050919050565b600061454e603983614a02565b915061455982615035565b604082019050919050565b6000614571602183614a02565b915061457c82615084565b604082019050919050565b6000614594601a83614a02565b915061459f826150d3565b602082019050919050565b6145b381614bb9565b82525050565b60006145c582846142af565b60148201915081905092915050565b60006145e08284614289565b60148201915081905092915050565b60006145fb8286614356565b91506146078285614356565b91506146138284614356565b9150819050949350505050565b600061462c8286614356565b91506146388285614356565b91506146448284614387565b9150819050949350505050565b600061465d8286614387565b91506146698285614356565b91506146758284614387565b9150819050949350505050565b600061468d8261451e565b9150819050919050565b60006020820190506146ac60008301846142a0565b92915050565b60006060820190506146c760008301866142a0565b6146d4602083018561427a565b6146e160408301846145aa565b949350505050565b60006080820190506146fe60008301876142a0565b61470b60208301866142a0565b61471860408301856145aa565b818103606083015261472a81846142e4565b905095945050505050565b600060208201905061474a60008301846142c6565b92915050565b600060208201905061476560008301846142d5565b92915050565b60006020820190508181036000830152614785818461431d565b905092915050565b600060208201905081810360008301526147a681614406565b9050919050565b600060208201905081810360008301526147c681614429565b9050919050565b600060208201905081810360008301526147e68161444c565b9050919050565b600060208201905081810360008301526148068161446f565b9050919050565b6000602082019050818103600083015261482681614492565b9050919050565b60006020820190508181036000830152614846816144b5565b9050919050565b60006020820190508181036000830152614866816144d8565b9050919050565b60006020820190508181036000830152614886816144fb565b9050919050565b600060208201905081810360008301526148a681614541565b9050919050565b600060208201905081810360008301526148c681614564565b9050919050565b600060208201905081810360008301526148e681614587565b9050919050565b600060208201905061490260008301846145aa565b92915050565b6000614912614923565b905061491e8282614c97565b919050565b6000604051905090565b600067ffffffffffffffff82111561494857614947614e05565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561497457614973614e05565b5b61497d82614e34565b9050602081019050919050565b600067ffffffffffffffff8211156149a5576149a4614e05565b5b6149ae82614e34565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614a2982614bb9565b9150614a3483614bb9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614a6957614a68614d78565b5b828201905092915050565b6000614a7f82614bb9565b9150614a8a83614bb9565b925082614a9a57614a99614da7565b5b828204905092915050565b6000614ab082614bb9565b9150614abb83614bb9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614af457614af3614d78565b5b828202905092915050565b6000614b0a82614bb9565b9150614b1583614bb9565b925082821015614b2857614b27614d78565b5b828203905092915050565b6000614b3e82614b99565b9050919050565b6000614b5082614b99565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614bce82614bd5565b9050919050565b6000614be082614be7565b9050919050565b6000614bf282614b99565b9050919050565b82818337600083830152505050565b60005b83811015614c26578082015181840152602081019050614c0b565b83811115614c35576000848401525b50505050565b6000614c4682614bb9565b91506000821415614c5a57614c59614d78565b5b600182039050919050565b60006002820490506001821680614c7d57607f821691505b60208210811415614c9157614c90614dd6565b5b50919050565b614ca082614e34565b810181811067ffffffffffffffff82111715614cbf57614cbe614e05565b5b80604052505050565b6000614cd382614bb9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d0657614d05614d78565b5b600182019050919050565b6000614d1c82614d35565b9050919050565b6000614d2e82614d35565b9050919050565b6000614d4082614e45565b9050919050565b6000614d5282614bb9565b9150614d5d83614bb9565b925082614d6d57614d6c614da7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f41646472657373206a612072656976696e64696361646f000000000000000000600082015250565b7f5175616e746964616465206c696d697465206465206d696e7420706f7220636160008201527f7274656972612065786365646964610000000000000000000000000000000000602082015250565b7f4f20636f6e747261746f207061757361646f0000000000000000000000000000600082015250565b7f56616c6f72206461206d696e746167656d206469666572656e746520646f207660008201527f616c6f7220646566696e69646f206e6f20636f6e747261746f00000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f50726563697361206d696e7461722070656c6f206d656e6f732031204e465400600082015250565b50565b7f4e6f206d6f6d656e746f206f2070726f6772616d61206465206166696c69616460008201527f6f7320736520656e636f6e747261206465736174697661646f00000000000000602082015250565b7f5175616e746964616465206c696d697465206465204e4654206578636564696460008201527f6100000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e616f2066617a2070617274652064612057686974656c697374000000000000600082015250565b61510581614b33565b811461511057600080fd5b50565b61511c81614b45565b811461512757600080fd5b50565b61513381614b57565b811461513e57600080fd5b50565b61514a81614b63565b811461515557600080fd5b50565b61516181614b6d565b811461516c57600080fd5b50565b61517881614bb9565b811461518357600080fd5b5056fea264697066735822122059af8adca51c8f4b270096909ec63de0d267bc334bf967166874f5b7ba25f63364736f6c634300080400330000000000000000000000000000000000000000000000000000000000000060e0cd3bab91f3df64e95617464d392a0cb22e5389170259ee76d0a05e142ee92400000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d5752384c46774771486e5a7554444756777370476969614342756335686e5744354b5977426b56346556416f2f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d65444c366d393736364b52347135454663725a79544c635469514e4464794d4c32686131477838656b42734100000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061036a5760003560e01c806370a08231116101c6578063ba4e5c49116100f7578063e8a3d48511610095578063ebf0c7171161006f578063ebf0c71714610cc7578063ef5d87d714610cf2578063f2fde38b14610d1b578063fa9a309d14610d445761036a565b8063e8a3d48514610c43578063e985e9c514610c6e578063e9eb700814610cab5761036a565b8063d6e7b8e4116100d1578063d6e7b8e414610b82578063d88343e214610bad578063db4bec4414610bea578063e674b4c814610c275761036a565b8063ba4e5c4914610add578063c87b56dd14610b1a578063d03be3ec14610b575761036a565b806395d89b4111610164578063b187bd261161013e578063b187bd2614610a21578063b4ed16b314610a4c578063b88d4fde14610a77578063b8a20ed014610aa05761036a565b806395d89b41146109905780639b0e665d146109bb578063a22cb465146109f85761036a565b80638863ebbb116101a05780638863ebbb146108ea5780638da5cb5b14610913578063938e3d7b1461093e57806394cf4b6a146109675761036a565b806370a082311461086b578063714c5398146108a8578063715018a6146108d35761036a565b80633ccfd60b116102a057806355f804b31161023e5780636c21fb00116102185780636c21fb00146107b15780636e17f797146107ee5780636f50c93c146108175780636f8b44b0146108425761036a565b806355f804b31461070e5780635a23dd99146107375780636352211e146107745761036a565b8063438b63001161027a578063438b630014610652578063474c68ec1461068f5780634c0f38c2146106b85780634fc9f84a146106e35761036a565b80633ccfd60b146105e257806341dcf454146105ec57806342842e0e146106295761036a565b8063095ea7b31161030d57806323b872dd116102e757806323b872dd1461054b57806328fccf971461057457806330e0789e146105905780633c952764146105b95761036a565b8063095ea7b3146104cc57806312065fe0146104f557806318160ddd146105205761036a565b806306fdde031161034957806306fdde0314610412578063081812fc1461043d578063081818161461047a578063088a4ed0146104a35761036a565b8062621fda1461036f57806301ffc9a7146103ac57806302329a29146103e9575b600080fd5b34801561037b57600080fd5b50610396600480360381019061039191906140bc565b610d81565b6040516103a3919061476b565b60405180910390f35b3480156103b857600080fd5b506103d360048036038101906103ce9190614029565b610db8565b6040516103e09190614735565b60405180910390f35b3480156103f557600080fd5b50610410600480360381019061040b9190614000565b610e9a565b005b34801561041e57600080fd5b50610427610ebf565b604051610434919061476b565b60405180910390f35b34801561044957600080fd5b50610464600480360381019061045f91906140bc565b610f51565b6040516104719190614697565b60405180910390f35b34801561048657600080fd5b506104a1600480360381019061049c91906140bc565b610fcd565b005b3480156104af57600080fd5b506104ca60048036038101906104c591906140bc565b610fdf565b005b3480156104d857600080fd5b506104f360048036038101906104ee9190613f70565b610ff1565b005b34801561050157600080fd5b5061050a6110fc565b60405161051791906148ed565b60405180910390f35b34801561052c57600080fd5b5061053561111b565b60405161054291906148ed565b60405180910390f35b34801561055757600080fd5b50610572600480360381019061056d9190613e16565b611132565b005b61058e60048036038101906105899190614197565b611142565b005b34801561059c57600080fd5b506105b760048036038101906105b29190613e16565b6115f6565b005b3480156105c557600080fd5b506105e060048036038101906105db9190614000565b611aac565b005b6105ea611ad1565b005b3480156105f857600080fd5b50610613600480360381019061060e9190614226565b611b59565b604051610620919061476b565b60405180910390f35b34801561063557600080fd5b50610650600480360381019061064b9190613e16565b611c3e565b005b34801561065e57600080fd5b5061067960048036038101906106749190613db1565b611c5e565b60405161068691906148ed565b60405180910390f35b34801561069b57600080fd5b506106b660048036038101906106b191906140bc565b611ca7565b005b3480156106c457600080fd5b506106cd611cb9565b6040516106da91906148ed565b60405180910390f35b3480156106ef57600080fd5b506106f8611cc3565b6040516107059190614735565b60405180910390f35b34801561071a57600080fd5b506107356004803603810190610730919061407b565b611cda565b005b34801561074357600080fd5b5061075e60048036038101906107599190613ee0565b611cfc565b60405161076b9190614735565b60405180910390f35b34801561078057600080fd5b5061079b600480360381019061079691906140bc565b611da2565b6040516107a89190614697565b60405180910390f35b3480156107bd57600080fd5b506107d860048036038101906107d39190613db1565b611db8565b6040516107e591906148ed565b60405180910390f35b3480156107fa57600080fd5b50610815600480360381019061081091906140bc565b611e01565b005b34801561082357600080fd5b5061082c611e13565b6040516108399190614735565b60405180910390f35b34801561084e57600080fd5b50610869600480360381019061086491906140bc565b611e2a565b005b34801561087757600080fd5b50610892600480360381019061088d9190613db1565b611e3c565b60405161089f91906148ed565b60405180910390f35b3480156108b457600080fd5b506108bd611f0c565b6040516108ca919061476b565b60405180910390f35b3480156108df57600080fd5b506108e8611f9e565b005b3480156108f657600080fd5b50610911600480360381019061090c9190613f34565b611fb2565b005b34801561091f57600080fd5b50610928612015565b6040516109359190614697565b60405180910390f35b34801561094a57600080fd5b506109656004803603810190610960919061407b565b61203f565b005b34801561097357600080fd5b5061098e60048036038101906109899190614000565b612061565b005b34801561099c57600080fd5b506109a5612086565b6040516109b2919061476b565b60405180910390f35b3480156109c757600080fd5b506109e260048036038101906109dd9190613db1565b612118565b6040516109ef9190614735565b60405180910390f35b348015610a0457600080fd5b50610a1f6004803603810190610a1a9190613f34565b61216e565b005b348015610a2d57600080fd5b50610a366122e6565b604051610a439190614735565b60405180910390f35b348015610a5857600080fd5b50610a616122fd565b604051610a6e91906148ed565b60405180910390f35b348015610a8357600080fd5b50610a9e6004803603810190610a999190613e65565b61231c565b005b348015610aac57600080fd5b50610ac76004803603810190610ac29190613fac565b6123f3565b604051610ad49190614735565b60405180910390f35b348015610ae957600080fd5b50610b046004803603810190610aff91906140bc565b61240a565b604051610b119190614697565b60405180910390f35b348015610b2657600080fd5b50610b416004803603810190610b3c91906140bc565b612449565b604051610b4e919061476b565b60405180910390f35b348015610b6357600080fd5b50610b6c6124f3565b604051610b7991906148ed565b60405180910390f35b348015610b8e57600080fd5b50610b976124fd565b604051610ba491906148ed565b60405180910390f35b348015610bb957600080fd5b50610bd46004803603810190610bcf9190613e65565b612507565b604051610be19190614735565b60405180910390f35b348015610bf657600080fd5b50610c116004803603810190610c0c9190613db1565b612667565b604051610c1e9190614735565b60405180910390f35b610c416004803603810190610c3c91906140e5565b612687565b005b348015610c4f57600080fd5b50610c58612884565b604051610c65919061476b565b60405180910390f35b348015610c7a57600080fd5b50610c956004803603810190610c909190613dda565b612916565b604051610ca29190614735565b60405180910390f35b610cc56004803603810190610cc09190614134565b6129aa565b005b348015610cd357600080fd5b50610cdc612d7c565b604051610ce99190614750565b60405180910390f35b348015610cfe57600080fd5b50610d196004803603810190610d149190614000565b612d82565b005b348015610d2757600080fd5b50610d426004803603810190610d3d9190613db1565b612da7565b005b348015610d5057600080fd5b50610d6b6004803603810190610d6691906140bc565b612e2b565b604051610d789190614750565b60405180910390f35b6060600c610d8e83612e4f565b600d604051602001610da293929190614651565b6040516020818303038152906040529050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e8357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e935750610e9282612ffc565b5b9050919050565b610ea2613066565b80601260006101000a81548160ff02191690831515021790555050565b606060028054610ece90614c65565b80601f0160208091040260200160405190810160405280929190818152602001828054610efa90614c65565b8015610f475780601f10610f1c57610100808354040283529160200191610f47565b820191906000526020600020905b815481529060010190602001808311610f2a57829003601f168201915b5050505050905090565b6000610f5c826130e4565b610f92576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610fd5613066565b8060118190555050565b610fe7613066565b8060108190555050565b6000610ffc82611da2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611064576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611083613132565b73ffffffffffffffffffffffffffffffffffffffff16141580156110b557506110b3816110ae613132565b612916565b155b156110ec576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110f783838361313a565b505050565b60003373ffffffffffffffffffffffffffffffffffffffff1631905090565b60006111256131ec565b6001546000540303905090565b61113d8383836115f6565b505050565b601260009054906101000a900460ff1615611192576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611189906147ed565b60405180910390fd5b600061119c61111b565b9050600086116111e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d89061486d565b60405180910390fd5b6010546111ed84611e3c565b876111f89190614a1e565b1115611239576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611230906147cd565b60405180910390fd5b600f5486826112489190614a1e565b1115611289576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611280906148ad565b60405180910390fd5b601260019054906101000a900460ff161561139b57600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561132b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611322906147ad565b60405180910390fd5b61135b828460405160200161134091906145d4565b604051602081830303815290604052805190602001206123f3565b61139a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611391906148cd565b60405180910390fd5b5b60028414156113f457601a60009054906101000a900460ff166113f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ea9061488d565b60405180910390fd5b5b602160009054906101000a900460ff1661147157611438828460405160200161141d91906145d4565b604051602081830303815290604052805190602001206123f3565b61144c57611447868686612687565b611470565b600061145784611c5e565b9050600081111561146e5761146d878787612687565b5b505b5b600061147b61111b565b600f546114889190614aff565b90506000600190505b87811161157757601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906114e890614cc8565b91905055506114f88560016131f5565b60006001846115079190614a1e565b905061151281612449565b508261151d90614c3b565b925081602060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050808061156f90614cc8565b915050611491565b50601260019054906101000a900460ff16156115e6576001600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b8060168190555050505050505050565b600061160182613213565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461166c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661168d613132565b73ffffffffffffffffffffffffffffffffffffffff1614806116bc57506116bb856116b6613132565b612916565b5b8061170157506116ca613132565b73ffffffffffffffffffffffffffffffffffffffff166116e984610f51565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061173a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156117a1576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117ae85858560016134a2565b6117ba6000848761313a565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611a3a576000548214611a3957878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611aa585858560016134a8565b5050505050565b611ab4613066565b80601260016101000a81548160ff02191690831515021790555050565b611ad9613066565b6000611ae3612015565b73ffffffffffffffffffffffffffffffffffffffff1647604051611b0690614682565b60006040518083038185875af1925050503d8060008114611b43576040519150601f19603f3d011682016040523d82523d6000602084013e611b48565b606091505b5050905080611b5657600080fd5b50565b6060611b64836130e4565b611b9a576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611ba46134ae565b9050611baf846130e4565b15611be85780611bbe85612e4f565b84604051602001611bd1939291906145ef565b604051602081830303815290604052915050611c38565b600081511415611c075760405180602001604052806000815250611c34565b80611c1185612e4f565b84604051602001611c24939291906145ef565b6040516020818303038152906040525b9150505b92915050565b611c598383836040518060200160405280600081525061231c565b505050565b6000601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611caf613066565b80601b8190555050565b6000600f54905090565b6000602160009054906101000a900460ff16905090565b611ce2613066565b80600c9080519060200190611cf8929190613ad2565b5050565b6000611d2e8284604051602001611d1391906145b9565b604051602081830303815290604052805190602001206123f3565b15611d9757600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611d8e5760009050611d9c565b60019050611d9c565b600090505b92915050565b6000611dad82613213565b600001519050919050565b6000602060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611e09613066565b8060228190555050565b6000601260019054906101000a900460ff16905090565b611e32613066565b80600f8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ea4576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6060600c8054611f1b90614c65565b80601f0160208091040260200160405190810160405280929190818152602001828054611f4790614c65565b8015611f945780601f10611f6957610100808354040283529160200191611f94565b820191906000526020600020905b815481529060010190602001808311611f7757829003601f168201915b5050505050905090565b611fa6613066565b611fb06000613540565b565b611fba613066565b80601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b612047613066565b806017908051906020019061205d929190613ad2565b5050565b612069613066565b80601a60006101000a81548160ff02191690831515021790555050565b60606003805461209590614c65565b80601f01602080910402602001604051908101604052809291908181526020018280546120c190614c65565b801561210e5780601f106120e35761010080835404028352916020019161210e565b820191906000526020600020905b8154815290600101906020018083116120f157829003601f168201915b5050505050905090565b6000601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b612176613132565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121db576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006121e8613132565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612295613132565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122da9190614735565b60405180910390a35050565b6000601260009054906101000a900460ff16905090565b6000806016541115612313576016549050612319565b600f5490505b90565b6123278484846115f6565b6123468373ffffffffffffffffffffffffffffffffffffffff16613606565b801561235b575061235984848484612507565b155b15612392576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b60006124028360095484613629565b905092915050565b6013818154811061241a57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060612454826130e4565b612493576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248a9061484d565b60405180910390fd5b600061249d6134ae565b905060008151116124bd57604051806020016040528060008152506124eb565b806124c784612e4f565b600d6040516020016124db93929190614620565b6040516020818303038152906040525b915050919050565b6000602254905090565b6000601054905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261252d613132565b8786866040518563ffffffff1660e01b815260040161254f94939291906146e9565b602060405180830381600087803b15801561256957600080fd5b505af192505050801561259a57506040513d601f19601f820116820180604052508101906125979190614052565b60015b612614573d80600081146125ca576040519150601f19603f3d011682016040523d82523d6000602084013e6125cf565b606091505b5060008151141561260c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600b6020528060005260406000206000915054906101000a900460ff1681565b826022546126959190614aa5565b3410156126d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ce9061480d565b60405180910390fd5b60003490506001821115612815576000601d5490506002831480156127085750601a60009054906101000a900460ff165b1561276657601960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561276557601b5490505b5b6000606482346127769190614aa5565b6127809190614a74565b9050803461278e9190614aff565b92507ff70a742b6ec5de639ce8e8d0df10a44a88c323ac660a09f1fc0c190e830aea743386836040516127c3939291906146b2565b60405180910390a18473ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612811573d6000803e3d6000fd5b5050505b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561287d573d6000803e3d6000fd5b5050505050565b60606017805461289390614c65565b80601f01602080910402602001604051908101604052809291908181526020018280546128bf90614c65565b801561290c5780601f106128e15761010080835404028352916020019161290c565b820191906000526020600020905b8154815290600101906020018083116128ef57829003601f168201915b5050505050905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601260009054906101000a900460ff16156129fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f1906147ed565b60405180910390fd5b6000612a0461111b565b905060008511612a49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a409061486d565b60405180910390fd5b601054612a5583611e3c565b86612a609190614a1e565b1115612aa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a98906147cd565b60405180910390fd5b600f548582612ab09190614a1e565b1115612af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae8906148ad565b60405180910390fd5b601260019054906101000a900460ff1615612b9457600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8a906147ad565b60405180910390fd5b5b6002831415612bed57601a60009054906101000a900460ff16612bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be39061488d565b60405180910390fd5b5b612bf8858585612687565b6000612c0261111b565b600f54612c0f9190614aff565b90506000600190505b868111612cfe57601460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190612c6f90614cc8565b9190505550612c7f8460016131f5565b6000600184612c8e9190614a1e565b9050612c9981612449565b5082612ca490614c3b565b925081602060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550508080612cf690614cc8565b915050612c18565b50601260019054906101000a900460ff1615612d6d576001600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b80601681905550505050505050565b60095481565b612d8a613066565b80602160006101000a81548160ff02191690831515021790555050565b612daf613066565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e169061478d565b60405180910390fd5b612e2881613540565b50565b600a8181548110612e3b57600080fd5b906000526020600020016000915090505481565b60606000821415612e97576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ff7565b600082905060005b60008214612ec9578080612eb290614cc8565b915050600a82612ec29190614a74565b9150612e9f565b60008167ffffffffffffffff811115612f0b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612f3d5781602001600182028036833780820191505090505b5090505b60008514612ff057600182612f569190614aff565b9150600a85612f659190614d47565b6030612f719190614a1e565b60f81b818381518110612fad577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612fe99190614a74565b9450612f41565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61306e613132565b73ffffffffffffffffffffffffffffffffffffffff1661308c612015565b73ffffffffffffffffffffffffffffffffffffffff16146130e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130d99061482d565b60405180910390fd5b565b6000816130ef6131ec565b111580156130fe575060005482105b801561312b575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b61320f828260405180602001604052806000815250613640565b5050565b61321b613b58565b6000829050806132296131ec565b11158015613238575060005481105b1561346b576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161346957600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461334d57809250505061349d565b5b60011561346857818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461346357809250505061349d565b61334e565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b50505050565b50505050565b6060600c80546134bd90614c65565b80601f01602080910402602001604051908101604052809291908181526020018280546134e990614c65565b80156135365780601f1061350b57610100808354040283529160200191613536565b820191906000526020600020905b81548152906001019060200180831161351957829003601f168201915b5050505050905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000826136368584613652565b1490509392505050565b61364d83838360016136ed565b505050565b60008082905060005b84518110156136e257600085828151811061369f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190508083116136c1576136ba8382613abb565b92506136ce565b6136cb8184613abb565b92505b5080806136da90614cc8565b91505061365b565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561375a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613795576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6137a260008683876134a2565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561396c575061396b8773ffffffffffffffffffffffffffffffffffffffff16613606565b5b15613a32575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46139e16000888480600101955088612507565b613a17576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415613972578260005414613a2d57600080fd5b613a9e565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415613a33575b816000819055505050613ab460008683876134a8565b5050505050565b600082600052816020526040600020905092915050565b828054613ade90614c65565b90600052602060002090601f016020900481019282613b005760008555613b47565b82601f10613b1957805160ff1916838001178555613b47565b82800160010185558215613b47579182015b82811115613b46578251825591602001919060010190613b2b565b5b509050613b549190613b9b565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613bb4576000816000905550600101613b9c565b5090565b6000613bcb613bc68461492d565b614908565b90508083825260208201905082856020860282011115613bea57600080fd5b60005b85811015613c1a5781613c008882613d09565b845260208401935060208301925050600181019050613bed565b5050509392505050565b6000613c37613c3284614959565b614908565b905082815260208101848484011115613c4f57600080fd5b613c5a848285614bf9565b509392505050565b6000613c75613c708461498a565b614908565b905082815260208101848484011115613c8d57600080fd5b613c98848285614bf9565b509392505050565b600081359050613caf816150fc565b92915050565b600081359050613cc481615113565b92915050565b600082601f830112613cdb57600080fd5b8135613ceb848260208601613bb8565b91505092915050565b600081359050613d038161512a565b92915050565b600081359050613d1881615141565b92915050565b600081359050613d2d81615158565b92915050565b600081519050613d4281615158565b92915050565b600082601f830112613d5957600080fd5b8135613d69848260208601613c24565b91505092915050565b600082601f830112613d8357600080fd5b8135613d93848260208601613c62565b91505092915050565b600081359050613dab8161516f565b92915050565b600060208284031215613dc357600080fd5b6000613dd184828501613ca0565b91505092915050565b60008060408385031215613ded57600080fd5b6000613dfb85828601613ca0565b9250506020613e0c85828601613ca0565b9150509250929050565b600080600060608486031215613e2b57600080fd5b6000613e3986828701613ca0565b9350506020613e4a86828701613ca0565b9250506040613e5b86828701613d9c565b9150509250925092565b60008060008060808587031215613e7b57600080fd5b6000613e8987828801613ca0565b9450506020613e9a87828801613ca0565b9350506040613eab87828801613d9c565b925050606085013567ffffffffffffffff811115613ec857600080fd5b613ed487828801613d48565b91505092959194509250565b60008060408385031215613ef357600080fd5b6000613f0185828601613ca0565b925050602083013567ffffffffffffffff811115613f1e57600080fd5b613f2a85828601613cca565b9150509250929050565b60008060408385031215613f4757600080fd5b6000613f5585828601613ca0565b9250506020613f6685828601613cf4565b9150509250929050565b60008060408385031215613f8357600080fd5b6000613f9185828601613ca0565b9250506020613fa285828601613d9c565b9150509250929050565b60008060408385031215613fbf57600080fd5b600083013567ffffffffffffffff811115613fd957600080fd5b613fe585828601613cca565b9250506020613ff685828601613d09565b9150509250929050565b60006020828403121561401257600080fd5b600061402084828501613cf4565b91505092915050565b60006020828403121561403b57600080fd5b600061404984828501613d1e565b91505092915050565b60006020828403121561406457600080fd5b600061407284828501613d33565b91505092915050565b60006020828403121561408d57600080fd5b600082013567ffffffffffffffff8111156140a757600080fd5b6140b384828501613d72565b91505092915050565b6000602082840312156140ce57600080fd5b60006140dc84828501613d9c565b91505092915050565b6000806000606084860312156140fa57600080fd5b600061410886828701613d9c565b935050602061411986828701613cb5565b925050604061412a86828701613d9c565b9150509250925092565b6000806000806080858703121561414a57600080fd5b600061415887828801613d9c565b945050602061416987828801613cb5565b935050604061417a87828801613d9c565b925050606061418b87828801613cb5565b91505092959194509250565b600080600080600060a086880312156141af57600080fd5b60006141bd88828901613d9c565b95505060206141ce88828901613cb5565b94505060406141df88828901613d9c565b93505060606141f088828901613cb5565b925050608086013567ffffffffffffffff81111561420d57600080fd5b61421988828901613cca565b9150509295509295909350565b6000806040838503121561423957600080fd5b600061424785828601613d9c565b925050602083013567ffffffffffffffff81111561426457600080fd5b61427085828601613d72565b9150509250929050565b61428381614bc3565b82525050565b61429a61429582614b45565b614d23565b82525050565b6142a981614b33565b82525050565b6142c06142bb82614b33565b614d11565b82525050565b6142cf81614b57565b82525050565b6142de81614b63565b82525050565b60006142ef826149d0565b6142f981856149e6565b9350614309818560208601614c08565b61431281614e34565b840191505092915050565b6000614328826149db565b6143328185614a02565b9350614342818560208601614c08565b61434b81614e34565b840191505092915050565b6000614361826149db565b61436b8185614a13565b935061437b818560208601614c08565b80840191505092915050565b6000815461439481614c65565b61439e8186614a13565b945060018216600081146143b957600181146143ca576143fd565b60ff198316865281860193506143fd565b6143d3856149bb565b60005b838110156143f5578154818901526001820191506020810190506143d6565b838801955050505b50505092915050565b6000614413602683614a02565b915061441e82614e52565b604082019050919050565b6000614436601783614a02565b915061444182614ea1565b602082019050919050565b6000614459602f83614a02565b915061446482614eca565b604082019050919050565b600061447c601283614a02565b915061448782614f19565b602082019050919050565b600061449f603983614a02565b91506144aa82614f42565b604082019050919050565b60006144c2602083614a02565b91506144cd82614f91565b602082019050919050565b60006144e5602f83614a02565b91506144f082614fba565b604082019050919050565b6000614508601f83614a02565b915061451382615009565b602082019050919050565b600061452b6000836149f7565b915061453682615032565b600082019050919050565b600061454e603983614a02565b915061455982615035565b604082019050919050565b6000614571602183614a02565b915061457c82615084565b604082019050919050565b6000614594601a83614a02565b915061459f826150d3565b602082019050919050565b6145b381614bb9565b82525050565b60006145c582846142af565b60148201915081905092915050565b60006145e08284614289565b60148201915081905092915050565b60006145fb8286614356565b91506146078285614356565b91506146138284614356565b9150819050949350505050565b600061462c8286614356565b91506146388285614356565b91506146448284614387565b9150819050949350505050565b600061465d8286614387565b91506146698285614356565b91506146758284614387565b9150819050949350505050565b600061468d8261451e565b9150819050919050565b60006020820190506146ac60008301846142a0565b92915050565b60006060820190506146c760008301866142a0565b6146d4602083018561427a565b6146e160408301846145aa565b949350505050565b60006080820190506146fe60008301876142a0565b61470b60208301866142a0565b61471860408301856145aa565b818103606083015261472a81846142e4565b905095945050505050565b600060208201905061474a60008301846142c6565b92915050565b600060208201905061476560008301846142d5565b92915050565b60006020820190508181036000830152614785818461431d565b905092915050565b600060208201905081810360008301526147a681614406565b9050919050565b600060208201905081810360008301526147c681614429565b9050919050565b600060208201905081810360008301526147e68161444c565b9050919050565b600060208201905081810360008301526148068161446f565b9050919050565b6000602082019050818103600083015261482681614492565b9050919050565b60006020820190508181036000830152614846816144b5565b9050919050565b60006020820190508181036000830152614866816144d8565b9050919050565b60006020820190508181036000830152614886816144fb565b9050919050565b600060208201905081810360008301526148a681614541565b9050919050565b600060208201905081810360008301526148c681614564565b9050919050565b600060208201905081810360008301526148e681614587565b9050919050565b600060208201905061490260008301846145aa565b92915050565b6000614912614923565b905061491e8282614c97565b919050565b6000604051905090565b600067ffffffffffffffff82111561494857614947614e05565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561497457614973614e05565b5b61497d82614e34565b9050602081019050919050565b600067ffffffffffffffff8211156149a5576149a4614e05565b5b6149ae82614e34565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614a2982614bb9565b9150614a3483614bb9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614a6957614a68614d78565b5b828201905092915050565b6000614a7f82614bb9565b9150614a8a83614bb9565b925082614a9a57614a99614da7565b5b828204905092915050565b6000614ab082614bb9565b9150614abb83614bb9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614af457614af3614d78565b5b828202905092915050565b6000614b0a82614bb9565b9150614b1583614bb9565b925082821015614b2857614b27614d78565b5b828203905092915050565b6000614b3e82614b99565b9050919050565b6000614b5082614b99565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614bce82614bd5565b9050919050565b6000614be082614be7565b9050919050565b6000614bf282614b99565b9050919050565b82818337600083830152505050565b60005b83811015614c26578082015181840152602081019050614c0b565b83811115614c35576000848401525b50505050565b6000614c4682614bb9565b91506000821415614c5a57614c59614d78565b5b600182039050919050565b60006002820490506001821680614c7d57607f821691505b60208210811415614c9157614c90614dd6565b5b50919050565b614ca082614e34565b810181811067ffffffffffffffff82111715614cbf57614cbe614e05565b5b80604052505050565b6000614cd382614bb9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d0657614d05614d78565b5b600182019050919050565b6000614d1c82614d35565b9050919050565b6000614d2e82614d35565b9050919050565b6000614d4082614e45565b9050919050565b6000614d5282614bb9565b9150614d5d83614bb9565b925082614d6d57614d6c614da7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f41646472657373206a612072656976696e64696361646f000000000000000000600082015250565b7f5175616e746964616465206c696d697465206465206d696e7420706f7220636160008201527f7274656972612065786365646964610000000000000000000000000000000000602082015250565b7f4f20636f6e747261746f207061757361646f0000000000000000000000000000600082015250565b7f56616c6f72206461206d696e746167656d206469666572656e746520646f207660008201527f616c6f7220646566696e69646f206e6f20636f6e747261746f00000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f50726563697361206d696e7461722070656c6f206d656e6f732031204e465400600082015250565b50565b7f4e6f206d6f6d656e746f206f2070726f6772616d61206465206166696c69616460008201527f6f7320736520656e636f6e747261206465736174697661646f00000000000000602082015250565b7f5175616e746964616465206c696d697465206465204e4654206578636564696460008201527f6100000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e616f2066617a2070617274652064612057686974656c697374000000000000600082015250565b61510581614b33565b811461511057600080fd5b50565b61511c81614b45565b811461512757600080fd5b50565b61513381614b57565b811461513e57600080fd5b50565b61514a81614b63565b811461515557600080fd5b50565b61516181614b6d565b811461516c57600080fd5b50565b61517881614bb9565b811461518357600080fd5b5056fea264697066735822122059af8adca51c8f4b270096909ec63de0d267bc334bf967166874f5b7ba25f63364736f6c63430008040033

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

0000000000000000000000000000000000000000000000000000000000000060e0cd3bab91f3df64e95617464d392a0cb22e5389170259ee76d0a05e142ee92400000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d5752384c46774771486e5a7554444756777370476969614342756335686e5744354b5977426b56346556416f2f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d65444c366d393736364b52347135454663725a79544c635469514e4464794d4c32686131477838656b42734100000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _initBaseURI (string): https://gateway.pinata.cloud/ipfs/QmWR8LFwGqHnZuTDGVwspGiiaCBuc5hnWD5KYwBkV4eVAo/
Arg [1] : _root (bytes32): 0xe0cd3bab91f3df64e95617464d392a0cb22e5389170259ee76d0a05e142ee924
Arg [2] : _contractURI (string): https://gateway.pinata.cloud/ipfs/QmeDL6m9766KR4q5EFcrZyTLcTiQNDdyML2ha1Gx8ekBsA

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : e0cd3bab91f3df64e95617464d392a0cb22e5389170259ee76d0a05e142ee924
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000051
Arg [4] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [5] : 732f516d5752384c46774771486e5a7554444756777370476969614342756335
Arg [6] : 686e5744354b5977426b56346556416f2f000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000050
Arg [8] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [9] : 732f516d65444c366d393736364b52347135454663725a79544c635469514e44
Arg [10] : 64794d4c32686131477838656b42734100000000000000000000000000000000


Deployed Bytecode Sourcemap

66104:10998:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70368:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32526:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68592:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35639:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37279:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68136:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68470:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36842:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70173:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31775:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76210:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71170:1859;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41432:2129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68262:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68938:151;;;:::i;:::-;;35965:473;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76449:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75138:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68797:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69729:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70661:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68026:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70845:313;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35447:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69922:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69203:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68369:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69097:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32895:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70271:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10187:103;;;;;;;;;;;;;:::i;:::-;;69324:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9539:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74570:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68677:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35799:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70545:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37555:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70760:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69543:178;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76705:394;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67744:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66668:37;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74693:437;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69821:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70070:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47176:666;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66273:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75290:853;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74463:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37913:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73037:1418;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66214:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69445:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10445:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66238:28;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70368:169;70424:13;70478:7;70487:25;70504:7;70487:16;:25::i;:::-;70514:13;70461:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70447:82;;70368:169;;;:::o;32526:305::-;32628:4;32680:25;32665:40;;;:11;:40;;;;:105;;;;32737:33;32722:48;;;:11;:48;;;;32665:105;:158;;;;32787:36;32811:11;32787:23;:36::i;:::-;32665:158;32645:178;;32526:305;;;:::o;68592:77::-;9425:13;:11;:13::i;:::-;68655:6:::1;68646;;:15;;;;;;;;;;;;;;;;;;68592:77:::0;:::o;35639:91::-;35684:13;35717:5;35710:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35639:91;:::o;37279:204::-;37347:7;37372:16;37380:7;37372;:16::i;:::-;37367:64;;37397:34;;;;;;;;;;;;;;37367:64;37451:15;:24;37467:7;37451:24;;;;;;;;;;;;;;;;;;;;;37444:31;;37279:204;;;:::o;68136:118::-;9425:13;:11;:13::i;:::-;68240:6:::1;68214:23;:32;;;;68136:118:::0;:::o;68470:114::-;9425:13;:11;:13::i;:::-;68562:14:::1;68546:13;:30;;;;68470:114:::0;:::o;36842:371::-;36915:13;36931:24;36947:7;36931:15;:24::i;:::-;36915:40;;36976:5;36970:11;;:2;:11;;;36966:48;;;36990:24;;;;;;;;;;;;;;36966:48;37047:5;37031:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;37057:37;37074:5;37081:12;:10;:12::i;:::-;37057:16;:37::i;:::-;37056:38;37031:63;37027:138;;;37118:35;;;;;;;;;;;;;;37027:138;37177:28;37186:2;37190:7;37199:5;37177:8;:28::i;:::-;36842:371;;;:::o;70173:90::-;70216:4;70237:10;:18;;;70230:25;;70173:90;:::o;31775:303::-;31819:7;32044:15;:13;:15::i;:::-;32029:12;;32013:13;;:28;:46;32006:53;;31775:303;:::o;76210:168::-;76342:28;76352:4;76358:2;76362:7;76342:9;:28::i;:::-;76210:168;;;:::o;71170:1859::-;71440:6;;;;;;;;;;;71439:7;71431:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;71478:14;71495:13;:11;:13::i;:::-;71478:30;;71539:1;71525:11;:15;71517:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;71629:13;;71607:18;71617:7;71607:9;:18::i;:::-;71593:11;:32;;;;:::i;:::-;:49;;71585:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;71735:9;;71720:11;71711:6;:20;;;;:::i;:::-;:33;;71703:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;71796:15;;;;;;;;;;;71793:205;;;71833:16;:25;71850:7;71833:25;;;;;;;;;;;;;;;;;;;;;;;;;71832:26;71824:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;71905:52;71913:5;71947:7;71930:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;71920:36;;;;;;71905:7;:52::i;:::-;71897:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;71793:205;72030:1;72011:15;:20;72008:138;;;72052:22;;;;;;;;;;;72044:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;72008:138;72160:11;;;;;;;;;;;72156:351;;72189:52;72197:5;72231:7;72214:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;72204:36;;;;;;72189:7;:52::i;:::-;72185:313;;72256:51;72262:11;72275:14;72291:15;72256:5;:51::i;:::-;72185:313;;;72338:14;72355:22;72369:7;72355:13;:22::i;:::-;72338:39;;72405:1;72393:9;:13;72390:97;;;72422:51;72428:11;72441:14;72457:15;72422:5;:51::i;:::-;72390:97;72185:313;;72156:351;72517:33;72565:13;:11;:13::i;:::-;72553:9;;:25;;;;:::i;:::-;72517:61;;72600:9;72612:1;72600:13;;72595:287;72620:11;72615:1;:16;72595:287;;72649:20;:29;72670:7;72649:29;;;;;;;;;;;;;;;;:31;;;;;;;;;:::i;:::-;;;;;;72691:21;72701:7;72710:1;72691:9;:21::i;:::-;72723:18;72753:1;72744:6;:10;;;;:::i;:::-;72723:31;;72765:20;72774:10;72765:8;:20::i;:::-;;72796:27;;;;:::i;:::-;;;72871:1;72834:25;:34;72860:7;72834:34;;;;;;;;;;;;;;;:38;;;;72595:287;72633:3;;;;;:::i;:::-;;;;72595:287;;;;72896:15;;;;;;;;;;;72892:74;;;72952:4;72924:16;:25;72941:7;72924:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;72892:74;72996:25;72974:19;:47;;;;71170:1859;;;;;;;:::o;41432:2129::-;41546:35;41584:21;41597:7;41584:12;:21::i;:::-;41546:59;;41644:4;41622:26;;:13;:18;;;:26;;;41618:67;;41657:28;;;;;;;;;;;;;;41618:67;41698:22;41740:4;41724:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;41761:36;41778:4;41784:12;:10;:12::i;:::-;41761:16;:36::i;:::-;41724:73;:126;;;;41838:12;:10;:12::i;:::-;41814:36;;:20;41826:7;41814:11;:20::i;:::-;:36;;;41724:126;41698:153;;41869:17;41864:66;;41895:35;;;;;;;;;;;;;;41864:66;41959:1;41945:16;;:2;:16;;;41941:52;;;41970:23;;;;;;;;;;;;;;41941:52;42006:43;42028:4;42034:2;42038:7;42047:1;42006:21;:43::i;:::-;42114:35;42131:1;42135:7;42144:4;42114:8;:35::i;:::-;42475:1;42445:12;:18;42458:4;42445:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42519:1;42491:12;:16;42504:2;42491:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42537:31;42571:11;:20;42583:7;42571:20;;;;;;;;;;;42537:54;;42622:2;42606:8;:13;;;:18;;;;;;;;;;;;;;;;;;42672:15;42639:8;:23;;;:49;;;;;;;;;;;;;;;;;;42940:19;42972:1;42962:7;:11;42940:33;;42988:31;43022:11;:24;43034:11;43022:24;;;;;;;;;;;42988:58;;43090:1;43065:27;;:8;:13;;;;;;;;;;;;:27;;;43061:384;;;43275:13;;43260:11;:28;43256:174;;43329:4;43313:8;:13;;;:20;;;;;;;;;;;;;;;;;;43382:13;:28;;;43356:8;:23;;;:54;;;;;;;;;;;;;;;;;;43256:174;43061:384;41432:2129;;;43492:7;43488:2;43473:27;;43482:4;43473:27;;;;;;;;;;;;43511:42;43532:4;43538:2;43542:7;43551:1;43511:20;:42::i;:::-;41432:2129;;;;;:::o;68262:99::-;9425:13;:11;:13::i;:::-;68347:6:::1;68329:15;;:24;;;;;;;;;;;;;;;;;;68262:99:::0;:::o;68938:151::-;9425:13;:11;:13::i;:::-;68993:7:::1;69014;:5;:7::i;:::-;69006:21;;69035;69006:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68992:69;;;69078:2;69070:11;;;::::0;::::1;;9449:1;68938:151::o:0;35965:473::-;36058:13;36089:16;36097:7;36089;:16::i;:::-;36084:59;;36114:29;;;;;;;;;;;;;;36084:59;36154:21;36178:10;:8;:10::i;:::-;36154:34;;36203:16;36211:7;36203;:16::i;:::-;36199:104;;;36252:7;36261:25;36278:7;36261:16;:25::i;:::-;36288:13;36235:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36221:82;;;;;36199:104;36346:1;36327:7;36321:21;:26;;:109;;;;;;;;;;;;;;;;;36374:7;36383:25;36400:7;36383:16;:25::i;:::-;36410:13;36357:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36321:109;36314:116;;;35965:473;;;;;:::o;76449:185::-;76587:39;76604:4;76610:2;76614:7;76587:39;;;;;;;;;;;;:16;:39::i;:::-;76449:185;;;:::o;75138:144::-;75219:4;75246:20;:28;75267:6;75246:28;;;;;;;;;;;;;;;;75239:35;;75138:144;;;:::o;68797:133::-;9425:13;:11;:13::i;:::-;68912:10:::1;68882:27;:40;;;;68797:133:::0;:::o;69729:84::-;69774:4;69796:9;;69789:16;;69729:84;:::o;70661:91::-;70712:4;70733:11;;;;;;;;;;;70726:18;;70661:91;:::o;68026:102::-;9425:13;:11;:13::i;:::-;68109:11:::1;68099:7;:21;;;;;;;;;;;;:::i;:::-;;68026:102:::0;:::o;70845:313::-;70928:4;70947:54;70956:5;70991;70974:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;70963:36;;;;;;70947:7;:54::i;:::-;70943:208;;;71019:16;:23;71036:5;71019:23;;;;;;;;;;;;;;;;;;;;;;;;;71015:66;;;71064:5;71057:12;;;;71015:66;71098:4;71091:11;;;;70943:208;71136:5;71129:12;;70845:313;;;;;:::o;35447:125::-;35511:7;35538:21;35551:7;35538:12;:21::i;:::-;:26;;;35531:33;;35447:125;;;:::o;69922:140::-;69996:7;70021:25;:33;70047:6;70021:33;;;;;;;;;;;;;;;;70014:40;;69922:140;;;:::o;69203:113::-;9425:13;:11;:13::i;:::-;69295::::1;69278:14;:30;;;;69203:113:::0;:::o;68369:93::-;68417:4;68439:15;;;;;;;;;;;68432:22;;68369:93;:::o;69097:98::-;9425:13;:11;:13::i;:::-;69177:10:::1;69165:9;:22;;;;69097:98:::0;:::o;32895:206::-;32959:7;33000:1;32983:19;;:5;:19;;;32979:60;;;33011:28;;;;;;;;;;;;;;32979:60;33065:12;:19;33078:5;33065:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;33057:36;;33050:43;;32895:206;;;:::o;70271:89::-;70314:13;70345:7;70338:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70271:89;:::o;10187:103::-;9425:13;:11;:13::i;:::-;10252:30:::1;10279:1;10252:18;:30::i;:::-;10187:103::o:0;69324:113::-;9425:13;:11;:13::i;:::-;69424:5:::1;69401:11;:20;69413:7;69401:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;69324:113:::0;;:::o;9539:87::-;9585:7;9612:6;;;;;;;;;;;9605:13;;9539:87;:::o;74570:115::-;9425:13;:11;:13::i;:::-;74665:12:::1;74650;:27;;;;;;;;;;;;:::i;:::-;;74570:115:::0;:::o;68677:112::-;9425:13;:11;:13::i;:::-;68775:6:::1;68750:22;;:31;;;;;;;;;;;;;;;;;;68677:112:::0;:::o;35799:95::-;35846:13;35879:7;35872:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35799:95;:::o;70545:108::-;70605:4;70626:11;:19;70638:6;70626:19;;;;;;;;;;;;;;;;;;;;;;;;;70619:26;;70545:108;;;:::o;37555:287::-;37666:12;:10;:12::i;:::-;37654:24;;:8;:24;;;37650:54;;;37687:17;;;;;;;;;;;;;;37650:54;37762:8;37717:18;:32;37736:12;:10;:12::i;:::-;37717:32;;;;;;;;;;;;;;;:42;37750:8;37717:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;37815:8;37786:48;;37801:12;:10;:12::i;:::-;37786:48;;;37825:8;37786:48;;;;;;:::i;:::-;;;;;;;;37555:287;;:::o;70760:77::-;70801:4;70823:6;;;;;;;;;;;70816:13;;70760:77;:::o;69543:178::-;69597:7;69640:1;69618:19;;:23;69615:74;;;69660:19;;69653:26;;;;69615:74;69704:9;;69697:16;;69543:178;;:::o;76705:394::-;76862:28;76872:4;76878:2;76882:7;76862:9;:28::i;:::-;76903:15;:2;:13;;;:15::i;:::-;:76;;;;;76923:56;76954:4;76960:2;76964:7;76973:5;76923:30;:56::i;:::-;76922:57;76903:76;76899:152;;;77001:40;;;;;;;;;;;;;;76899:152;77083:7;77079:2;77064:27;;77073:4;77064:27;;;;;;;;;;;;76705:394;;;;:::o;67744:143::-;67820:4;67842:37;67861:5;67868:4;;67874;67842:18;:37::i;:::-;67835:44;;67744:143;;;;:::o;66668:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;74693:437::-;74785:13;74832:16;74840:7;74832;:16::i;:::-;74814:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;74928:28;74959:10;:8;:10::i;:::-;74928:41;;75016:1;74991:14;74985:28;:32;:137;;;;;;;;;;;;;;;;;75055:14;75071:18;:7;:16;:18::i;:::-;75091:13;75038:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;74985:137;74978:144;;;74693:437;;;:::o;69821:93::-;69870:4;69892:14;;69885:21;;69821:93;:::o;70070:95::-;70119:7;70144:13;;70137:20;;70070:95;:::o;47176:666::-;47338:4;47375:2;47359:36;;;47396:12;:10;:12::i;:::-;47410:4;47416:7;47425:5;47359:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;47355:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47610:1;47593:6;:13;:18;47589:235;;;47639:40;;;;;;;;;;;;;;47589:235;47782:6;47776:13;47767:6;47763:2;47759:15;47752:38;47355:480;47488:45;;;47478:55;;;:6;:55;;;;47471:62;;;47176:666;;;;;;:::o;66273:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;75290:853::-;75446:11;75429:14;;:28;;;;:::i;:::-;75415:9;:43;;75407:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;75531:16;75550:9;75531:28;;75591:1;75573:15;:19;75570:512;;;75606:24;75633:25;;75606:52;;75691:1;75672:15;:20;:46;;;;;75696:22;;;;;;;;;;;75672:46;75669:188;;;75738:11;:27;75750:14;75738:27;;;;;;;;;;;;;;;;;;;;;;;;;75734:112;;;75803:27;;75784:46;;75734:112;75669:188;75869:14;75917:3;75898:16;75886:9;:28;;;;:::i;:::-;:34;;;;:::i;:::-;75869:51;;75957:6;75945:9;:18;;;;:::i;:::-;75931:32;;75981:49;75995:10;76007:14;76023:6;75981:49;;;;;;;;:::i;:::-;;;;;;;;76041:14;:23;;:31;76065:6;76041:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75570:512;;;76098:14;;;;;;;;;;;76090:32;;:45;76123:11;76090:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75290:853;;;;:::o;74463:97::-;74509:13;74540:12;74533:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74463:97;:::o;37913:164::-;38010:4;38034:18;:25;38053:5;38034:25;;;;;;;;;;;;;;;:35;38060:8;38034:35;;;;;;;;;;;;;;;;;;;;;;;;;38027:42;;37913:164;;;;:::o;73037:1418::-;73267:6;;;;;;;;;;;73266:7;73258:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;73305:14;73322:13;:11;:13::i;:::-;73305:30;;73366:1;73352:11;:15;73344:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;73456:13;;73434:18;73444:7;73434:9;:18::i;:::-;73420:11;:32;;;;:::i;:::-;:49;;73412:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;73562:9;;73547:11;73538:6;:20;;;;:::i;:::-;:33;;73530:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;73623:15;;;;;;;;;;;73620:103;;;73660:16;:25;73677:7;73660:25;;;;;;;;;;;;;;;;;;;;;;;;;73659:26;73651:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;73620:103;73755:1;73736:15;:20;73733:138;;;73777:22;;;;;;;;;;;73769:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;73733:138;73881:51;73887:11;73900:14;73916:15;73881:5;:51::i;:::-;73943:33;73991:13;:11;:13::i;:::-;73979:9;;:25;;;;:::i;:::-;73943:61;;74026:9;74038:1;74026:13;;74021:287;74046:11;74041:1;:16;74021:287;;74075:20;:29;74096:7;74075:29;;;;;;;;;;;;;;;;:31;;;;;;;;;:::i;:::-;;;;;;74117:21;74127:7;74136:1;74117:9;:21::i;:::-;74149:18;74179:1;74170:6;:10;;;;:::i;:::-;74149:31;;74191:20;74200:10;74191:8;:20::i;:::-;;74222:27;;;;:::i;:::-;;;74297:1;74260:25;:34;74286:7;74260:34;;;;;;;;;;;;;;;:38;;;;74021:287;74059:3;;;;;:::i;:::-;;;;74021:287;;;;74322:15;;;;;;;;;;;74318:74;;;74378:4;74350:16;:25;74367:7;74350:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;74318:74;74422:25;74400:19;:47;;;;73037:1418;;;;;;:::o;66214:19::-;;;;:::o;69445:90::-;9425:13;:11;:13::i;:::-;69522:5:::1;69508:11;;:19;;;;;;;;;;;;;;;;;;69445:90:::0;:::o;10445:201::-;9425:13;:11;:13::i;:::-;10554:1:::1;10534:22;;:8;:22;;;;10526:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10610:28;10629:8;10610:18;:28::i;:::-;10445:201:::0;:::o;66238:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4290:723::-;4346:13;4576:1;4567:5;:10;4563:53;;;4594:10;;;;;;;;;;;;;;;;;;;;;4563:53;4626:12;4641:5;4626:20;;4657:14;4682:78;4697:1;4689:4;:9;4682:78;;4715:8;;;;;:::i;:::-;;;;4746:2;4738:10;;;;;:::i;:::-;;;4682:78;;;4770:19;4802:6;4792:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4770:39;;4820:154;4836:1;4827:5;:10;4820:154;;4864:1;4854:11;;;;;:::i;:::-;;;4931:2;4923:5;:10;;;;:::i;:::-;4910:2;:24;;;;:::i;:::-;4897:39;;4880:6;4887;4880:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;4960:2;4951:11;;;;;:::i;:::-;;;4820:154;;;4998:6;4984:21;;;;;4290:723;;;;:::o;21339:157::-;21424:4;21463:25;21448:40;;;:11;:40;;;;21441:47;;21339:157;;;:::o;9704:132::-;9779:12;:10;:12::i;:::-;9768:23;;:7;:5;:7::i;:::-;:23;;;9760:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9704:132::o;38332:174::-;38389:4;38432:7;38413:15;:13;:15::i;:::-;:26;;:53;;;;;38453:13;;38443:7;:23;38413:53;:85;;;;;38471:11;:20;38483:7;38471:20;;;;;;;;;;;:27;;;;;;;;;;;;38470:28;38413:85;38406:92;;38332:174;;;:::o;8090:98::-;8143:7;8170:10;8163:17;;8090:98;:::o;46488:196::-;46630:2;46603:15;:24;46619:7;46603:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;46668:7;46664:2;46648:28;;46657:5;46648:28;;;;;;;;;;;;46488:196;;;:::o;31549:92::-;31605:7;31632:1;31625:8;;31549:92;:::o;38514:104::-;38583:27;38593:2;38597:8;38583:27;;;;;;;;;;;;:9;:27::i;:::-;38514:104;;:::o;34276:1109::-;34338:21;;:::i;:::-;34372:12;34387:7;34372:22;;34455:4;34436:15;:13;:15::i;:::-;:23;;:47;;;;;34470:13;;34463:4;:20;34436:47;34432:886;;;34504:31;34538:11;:17;34550:4;34538:17;;;;;;;;;;;34504:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34579:9;:16;;;34574:729;;34650:1;34624:28;;:9;:14;;;:28;;;34620:101;;34688:9;34681:16;;;;;;34620:101;35023:261;35030:4;35023:261;;;35063:6;;;;;;;;35108:11;:17;35120:4;35108:17;;;;;;;;;;;35096:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35182:1;35156:28;;:9;:14;;;:28;;;35152:109;;35224:9;35217:16;;;;;;35152:109;35023:261;;;34574:729;34432:886;;35346:31;;;;;;;;;;;;;;34276:1109;;;;:::o;48490:159::-;;;;;:::o;49308:158::-;;;;;:::o;67912:106::-;67972:13;68003:7;67996:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67912:106;:::o;10806:191::-;10880:16;10899:6;;;;;;;;;;;10880:25;;10925:8;10916:6;;:17;;;;;;;;;;;;;;;;;;10980:8;10949:40;;10970:8;10949:40;;;;;;;;;;;;10806:191;;:::o;12237:326::-;12297:4;12554:1;12532:7;:19;;;:23;12525:30;;12237:326;;;:::o;929:190::-;1054:4;1107;1078:25;1091:5;1098:4;1078:12;:25::i;:::-;:33;1071:40;;929:190;;;;;:::o;38981:163::-;39104:32;39110:2;39114:8;39124:5;39131:4;39104:5;:32::i;:::-;38981:163;;;:::o;1481:675::-;1564:7;1584:20;1607:4;1584:27;;1627:9;1622:497;1646:5;:12;1642:1;:16;1622:497;;;1680:20;1703:5;1709:1;1703:8;;;;;;;;;;;;;;;;;;;;;;1680:31;;1746:12;1730;:28;1726:382;;1873:42;1888:12;1902;1873:14;:42::i;:::-;1858:57;;1726:382;;;2050:42;2065:12;2079;2050:14;:42::i;:::-;2035:57;;1726:382;1622:497;1660:3;;;;;:::i;:::-;;;;1622:497;;;;2136:12;2129:19;;;1481:675;;;;:::o;39403:1775::-;39542:20;39565:13;;39542:36;;39607:1;39593:16;;:2;:16;;;39589:48;;;39618:19;;;;;;;;;;;;;;39589:48;39664:1;39652:8;:13;39648:44;;;39674:18;;;;;;;;;;;;;;39648:44;39705:61;39735:1;39739:2;39743:12;39757:8;39705:21;:61::i;:::-;40078:8;40043:12;:16;40056:2;40043:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40142:8;40102:12;:16;40115:2;40102:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40201:2;40168:11;:25;40180:12;40168:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;40268:15;40218:11;:25;40230:12;40218:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;40301:20;40324:12;40301:35;;40351:11;40380:8;40365:12;:23;40351:37;;40409:4;:23;;;;;40417:15;:2;:13;;;:15::i;:::-;40409:23;40405:641;;;40453:314;40509:12;40505:2;40484:38;;40501:1;40484:38;;;;;;;;;;;;40550:69;40589:1;40593:2;40597:14;;;;;;40613:5;40550:30;:69::i;:::-;40545:174;;40655:40;;;;;;;;;;;;;;40545:174;40762:3;40746:12;:19;;40453:314;;40848:12;40831:13;;:29;40827:43;;40862:8;;;40827:43;40405:641;;;40911:120;40967:14;;;;;;40963:2;40942:40;;40959:1;40942:40;;;;;;;;;;;;41026:3;41010:12;:19;;40911:120;;40405:641;41076:12;41060:13;:28;;;;39403:1775;;41110:60;41139:1;41143:2;41147:12;41161:8;41110:20;:60::i;:::-;39403:1775;;;;;:::o;2164:224::-;2232:13;2295:1;2289:4;2282:15;2324:1;2318:4;2311:15;2365:4;2359;2349:21;2340:30;;2267:114;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:655:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;414:1;411;404:12;350:2;450:1;435:238;460:6;457:1;454:13;435:238;;;528:3;557:37;590:3;578:10;557:37;:::i;:::-;552:3;545:50;624:4;619:3;615:14;608:21;;658:4;653:3;649:14;642:21;;495:178;482:1;479;475:9;470:14;;435:238;;;439:14;126:553;;;;;;;:::o;685:343::-;762:5;787:65;803:48;844:6;803:48;:::i;:::-;787:65;:::i;:::-;778:74;;875:6;868:5;861:21;913:4;906:5;902:16;951:3;942:6;937:3;933:16;930:25;927:2;;;968:1;965;958:12;927:2;981:41;1015:6;1010:3;1005;981:41;:::i;:::-;768:260;;;;;;:::o;1034:345::-;1112:5;1137:66;1153:49;1195:6;1153:49;:::i;:::-;1137:66;:::i;:::-;1128:75;;1226:6;1219:5;1212:21;1264:4;1257:5;1253:16;1302:3;1293:6;1288:3;1284:16;1281:25;1278:2;;;1319:1;1316;1309:12;1278:2;1332:41;1366:6;1361:3;1356;1332:41;:::i;:::-;1118:261;;;;;;:::o;1385:139::-;1431:5;1469:6;1456:20;1447:29;;1485:33;1512:5;1485:33;:::i;:::-;1437:87;;;;:::o;1530:155::-;1584:5;1622:6;1609:20;1600:29;;1638:41;1673:5;1638:41;:::i;:::-;1590:95;;;;:::o;1708:303::-;1779:5;1828:3;1821:4;1813:6;1809:17;1805:27;1795:2;;1846:1;1843;1836:12;1795:2;1886:6;1873:20;1911:94;2001:3;1993:6;1986:4;1978:6;1974:17;1911:94;:::i;:::-;1902:103;;1785:226;;;;;:::o;2017:133::-;2060:5;2098:6;2085:20;2076:29;;2114:30;2138:5;2114:30;:::i;:::-;2066:84;;;;:::o;2156:139::-;2202:5;2240:6;2227:20;2218:29;;2256:33;2283:5;2256:33;:::i;:::-;2208:87;;;;:::o;2301:137::-;2346:5;2384:6;2371:20;2362:29;;2400:32;2426:5;2400:32;:::i;:::-;2352:86;;;;:::o;2444:141::-;2500:5;2531:6;2525:13;2516:22;;2547:32;2573:5;2547:32;:::i;:::-;2506:79;;;;:::o;2604:271::-;2659:5;2708:3;2701:4;2693:6;2689:17;2685:27;2675:2;;2726:1;2723;2716:12;2675:2;2766:6;2753:20;2791:78;2865:3;2857:6;2850:4;2842:6;2838:17;2791:78;:::i;:::-;2782:87;;2665:210;;;;;:::o;2895:273::-;2951:5;3000:3;2993:4;2985:6;2981:17;2977:27;2967:2;;3018:1;3015;3008:12;2967:2;3058:6;3045:20;3083:79;3158:3;3150:6;3143:4;3135:6;3131:17;3083:79;:::i;:::-;3074:88;;2957:211;;;;;:::o;3174:139::-;3220:5;3258:6;3245:20;3236:29;;3274:33;3301:5;3274:33;:::i;:::-;3226:87;;;;:::o;3319:262::-;3378:6;3427:2;3415:9;3406:7;3402:23;3398:32;3395:2;;;3443:1;3440;3433:12;3395:2;3486:1;3511:53;3556:7;3547:6;3536:9;3532:22;3511:53;:::i;:::-;3501:63;;3457:117;3385:196;;;;:::o;3587:407::-;3655:6;3663;3712:2;3700:9;3691:7;3687:23;3683:32;3680:2;;;3728:1;3725;3718:12;3680:2;3771:1;3796:53;3841:7;3832:6;3821:9;3817:22;3796:53;:::i;:::-;3786:63;;3742:117;3898:2;3924:53;3969:7;3960:6;3949:9;3945:22;3924:53;:::i;:::-;3914:63;;3869:118;3670:324;;;;;:::o;4000:552::-;4077:6;4085;4093;4142:2;4130:9;4121:7;4117:23;4113:32;4110:2;;;4158:1;4155;4148:12;4110:2;4201:1;4226:53;4271:7;4262:6;4251:9;4247:22;4226:53;:::i;:::-;4216:63;;4172:117;4328:2;4354:53;4399:7;4390:6;4379:9;4375:22;4354:53;:::i;:::-;4344:63;;4299:118;4456:2;4482:53;4527:7;4518:6;4507:9;4503:22;4482:53;:::i;:::-;4472:63;;4427:118;4100:452;;;;;:::o;4558:809::-;4653:6;4661;4669;4677;4726:3;4714:9;4705:7;4701:23;4697:33;4694:2;;;4743:1;4740;4733:12;4694:2;4786:1;4811:53;4856:7;4847:6;4836:9;4832:22;4811:53;:::i;:::-;4801:63;;4757:117;4913:2;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4884:118;5041:2;5067:53;5112:7;5103:6;5092:9;5088:22;5067:53;:::i;:::-;5057:63;;5012:118;5197:2;5186:9;5182:18;5169:32;5228:18;5220:6;5217:30;5214:2;;;5260:1;5257;5250:12;5214:2;5288:62;5342:7;5333:6;5322:9;5318:22;5288:62;:::i;:::-;5278:72;;5140:220;4684:683;;;;;;;:::o;5373:550::-;5466:6;5474;5523:2;5511:9;5502:7;5498:23;5494:32;5491:2;;;5539:1;5536;5529:12;5491:2;5582:1;5607:53;5652:7;5643:6;5632:9;5628:22;5607:53;:::i;:::-;5597:63;;5553:117;5737:2;5726:9;5722:18;5709:32;5768:18;5760:6;5757:30;5754:2;;;5800:1;5797;5790:12;5754:2;5828:78;5898:7;5889:6;5878:9;5874:22;5828:78;:::i;:::-;5818:88;;5680:236;5481:442;;;;;:::o;5929:401::-;5994:6;6002;6051:2;6039:9;6030:7;6026:23;6022:32;6019:2;;;6067:1;6064;6057:12;6019:2;6110:1;6135:53;6180:7;6171:6;6160:9;6156:22;6135:53;:::i;:::-;6125:63;;6081:117;6237:2;6263:50;6305:7;6296:6;6285:9;6281:22;6263:50;:::i;:::-;6253:60;;6208:115;6009:321;;;;;:::o;6336:407::-;6404:6;6412;6461:2;6449:9;6440:7;6436:23;6432:32;6429:2;;;6477:1;6474;6467:12;6429:2;6520:1;6545:53;6590:7;6581:6;6570:9;6566:22;6545:53;:::i;:::-;6535:63;;6491:117;6647:2;6673:53;6718:7;6709:6;6698:9;6694:22;6673:53;:::i;:::-;6663:63;;6618:118;6419:324;;;;;:::o;6749:550::-;6842:6;6850;6899:2;6887:9;6878:7;6874:23;6870:32;6867:2;;;6915:1;6912;6905:12;6867:2;6986:1;6975:9;6971:17;6958:31;7016:18;7008:6;7005:30;7002:2;;;7048:1;7045;7038:12;7002:2;7076:78;7146:7;7137:6;7126:9;7122:22;7076:78;:::i;:::-;7066:88;;6929:235;7203:2;7229:53;7274:7;7265:6;7254:9;7250:22;7229:53;:::i;:::-;7219:63;;7174:118;6857:442;;;;;:::o;7305:256::-;7361:6;7410:2;7398:9;7389:7;7385:23;7381:32;7378:2;;;7426:1;7423;7416:12;7378:2;7469:1;7494:50;7536:7;7527:6;7516:9;7512:22;7494:50;:::i;:::-;7484:60;;7440:114;7368:193;;;;:::o;7567:260::-;7625:6;7674:2;7662:9;7653:7;7649:23;7645:32;7642:2;;;7690:1;7687;7680:12;7642:2;7733:1;7758:52;7802:7;7793:6;7782:9;7778:22;7758:52;:::i;:::-;7748:62;;7704:116;7632:195;;;;:::o;7833:282::-;7902:6;7951:2;7939:9;7930:7;7926:23;7922:32;7919:2;;;7967:1;7964;7957:12;7919:2;8010:1;8035:63;8090:7;8081:6;8070:9;8066:22;8035:63;:::i;:::-;8025:73;;7981:127;7909:206;;;;:::o;8121:375::-;8190:6;8239:2;8227:9;8218:7;8214:23;8210:32;8207:2;;;8255:1;8252;8245:12;8207:2;8326:1;8315:9;8311:17;8298:31;8356:18;8348:6;8345:30;8342:2;;;8388:1;8385;8378:12;8342:2;8416:63;8471:7;8462:6;8451:9;8447:22;8416:63;:::i;:::-;8406:73;;8269:220;8197:299;;;;:::o;8502:262::-;8561:6;8610:2;8598:9;8589:7;8585:23;8581:32;8578:2;;;8626:1;8623;8616:12;8578:2;8669:1;8694:53;8739:7;8730:6;8719:9;8715:22;8694:53;:::i;:::-;8684:63;;8640:117;8568:196;;;;:::o;8770:568::-;8855:6;8863;8871;8920:2;8908:9;8899:7;8895:23;8891:32;8888:2;;;8936:1;8933;8926:12;8888:2;8979:1;9004:53;9049:7;9040:6;9029:9;9025:22;9004:53;:::i;:::-;8994:63;;8950:117;9106:2;9132:61;9185:7;9176:6;9165:9;9161:22;9132:61;:::i;:::-;9122:71;;9077:126;9242:2;9268:53;9313:7;9304:6;9293:9;9289:22;9268:53;:::i;:::-;9258:63;;9213:118;8878:460;;;;;:::o;9344:730::-;9446:6;9454;9462;9470;9519:3;9507:9;9498:7;9494:23;9490:33;9487:2;;;9536:1;9533;9526:12;9487:2;9579:1;9604:53;9649:7;9640:6;9629:9;9625:22;9604:53;:::i;:::-;9594:63;;9550:117;9706:2;9732:61;9785:7;9776:6;9765:9;9761:22;9732:61;:::i;:::-;9722:71;;9677:126;9842:2;9868:53;9913:7;9904:6;9893:9;9889:22;9868:53;:::i;:::-;9858:63;;9813:118;9970:2;9996:61;10049:7;10040:6;10029:9;10025:22;9996:61;:::i;:::-;9986:71;;9941:126;9477:597;;;;;;;:::o;10080:1019::-;10216:6;10224;10232;10240;10248;10297:3;10285:9;10276:7;10272:23;10268:33;10265:2;;;10314:1;10311;10304:12;10265:2;10357:1;10382:53;10427:7;10418:6;10407:9;10403:22;10382:53;:::i;:::-;10372:63;;10328:117;10484:2;10510:61;10563:7;10554:6;10543:9;10539:22;10510:61;:::i;:::-;10500:71;;10455:126;10620:2;10646:53;10691:7;10682:6;10671:9;10667:22;10646:53;:::i;:::-;10636:63;;10591:118;10748:2;10774:61;10827:7;10818:6;10807:9;10803:22;10774:61;:::i;:::-;10764:71;;10719:126;10912:3;10901:9;10897:19;10884:33;10944:18;10936:6;10933:30;10930:2;;;10976:1;10973;10966:12;10930:2;11004:78;11074:7;11065:6;11054:9;11050:22;11004:78;:::i;:::-;10994:88;;10855:237;10255:844;;;;;;;;:::o;11105:520::-;11183:6;11191;11240:2;11228:9;11219:7;11215:23;11211:32;11208:2;;;11256:1;11253;11246:12;11208:2;11299:1;11324:53;11369:7;11360:6;11349:9;11345:22;11324:53;:::i;:::-;11314:63;;11270:117;11454:2;11443:9;11439:18;11426:32;11485:18;11477:6;11474:30;11471:2;;;11517:1;11514;11507:12;11471:2;11545:63;11600:7;11591:6;11580:9;11576:22;11545:63;:::i;:::-;11535:73;;11397:221;11198:427;;;;;:::o;11631:147::-;11726:45;11765:5;11726:45;:::i;:::-;11721:3;11714:58;11704:74;;:::o;11784:189::-;11905:61;11933:32;11959:5;11933:32;:::i;:::-;11905:61;:::i;:::-;11900:3;11893:74;11883:90;;:::o;11979:118::-;12066:24;12084:5;12066:24;:::i;:::-;12061:3;12054:37;12044:53;;:::o;12103:157::-;12208:45;12228:24;12246:5;12228:24;:::i;:::-;12208:45;:::i;:::-;12203:3;12196:58;12186:74;;:::o;12266:109::-;12347:21;12362:5;12347:21;:::i;:::-;12342:3;12335:34;12325:50;;:::o;12381:118::-;12468:24;12486:5;12468:24;:::i;:::-;12463:3;12456:37;12446:53;;:::o;12505:360::-;12591:3;12619:38;12651:5;12619:38;:::i;:::-;12673:70;12736:6;12731:3;12673:70;:::i;:::-;12666:77;;12752:52;12797:6;12792:3;12785:4;12778:5;12774:16;12752:52;:::i;:::-;12829:29;12851:6;12829:29;:::i;:::-;12824:3;12820:39;12813:46;;12595:270;;;;;:::o;12871:364::-;12959:3;12987:39;13020:5;12987:39;:::i;:::-;13042:71;13106:6;13101:3;13042:71;:::i;:::-;13035:78;;13122:52;13167:6;13162:3;13155:4;13148:5;13144:16;13122:52;:::i;:::-;13199:29;13221:6;13199:29;:::i;:::-;13194:3;13190:39;13183:46;;12963:272;;;;;:::o;13241:377::-;13347:3;13375:39;13408:5;13375:39;:::i;:::-;13430:89;13512:6;13507:3;13430:89;:::i;:::-;13423:96;;13528:52;13573:6;13568:3;13561:4;13554:5;13550:16;13528:52;:::i;:::-;13605:6;13600:3;13596:16;13589:23;;13351:267;;;;;:::o;13648:845::-;13751:3;13788:5;13782:12;13817:36;13843:9;13817:36;:::i;:::-;13869:89;13951:6;13946:3;13869:89;:::i;:::-;13862:96;;13989:1;13978:9;13974:17;14005:1;14000:137;;;;14151:1;14146:341;;;;13967:520;;14000:137;14084:4;14080:9;14069;14065:25;14060:3;14053:38;14120:6;14115:3;14111:16;14104:23;;14000:137;;14146:341;14213:38;14245:5;14213:38;:::i;:::-;14273:1;14287:154;14301:6;14298:1;14295:13;14287:154;;;14375:7;14369:14;14365:1;14360:3;14356:11;14349:35;14425:1;14416:7;14412:15;14401:26;;14323:4;14320:1;14316:12;14311:17;;14287:154;;;14470:6;14465:3;14461:16;14454:23;;14153:334;;13967:520;;13755:738;;;;;;:::o;14499:366::-;14641:3;14662:67;14726:2;14721:3;14662:67;:::i;:::-;14655:74;;14738:93;14827:3;14738:93;:::i;:::-;14856:2;14851:3;14847:12;14840:19;;14645:220;;;:::o;14871:366::-;15013:3;15034:67;15098:2;15093:3;15034:67;:::i;:::-;15027:74;;15110:93;15199:3;15110:93;:::i;:::-;15228:2;15223:3;15219:12;15212:19;;15017:220;;;:::o;15243:366::-;15385:3;15406:67;15470:2;15465:3;15406:67;:::i;:::-;15399:74;;15482:93;15571:3;15482:93;:::i;:::-;15600:2;15595:3;15591:12;15584:19;;15389:220;;;:::o;15615:366::-;15757:3;15778:67;15842:2;15837:3;15778:67;:::i;:::-;15771:74;;15854:93;15943:3;15854:93;:::i;:::-;15972:2;15967:3;15963:12;15956:19;;15761:220;;;:::o;15987:366::-;16129:3;16150:67;16214:2;16209:3;16150:67;:::i;:::-;16143:74;;16226:93;16315:3;16226:93;:::i;:::-;16344:2;16339:3;16335:12;16328:19;;16133:220;;;:::o;16359:366::-;16501:3;16522:67;16586:2;16581:3;16522:67;:::i;:::-;16515:74;;16598:93;16687:3;16598:93;:::i;:::-;16716:2;16711:3;16707:12;16700:19;;16505:220;;;:::o;16731:366::-;16873:3;16894:67;16958:2;16953:3;16894:67;:::i;:::-;16887:74;;16970:93;17059:3;16970:93;:::i;:::-;17088:2;17083:3;17079:12;17072:19;;16877:220;;;:::o;17103:366::-;17245:3;17266:67;17330:2;17325:3;17266:67;:::i;:::-;17259:74;;17342:93;17431:3;17342:93;:::i;:::-;17460:2;17455:3;17451:12;17444:19;;17249:220;;;:::o;17475:398::-;17634:3;17655:83;17736:1;17731:3;17655:83;:::i;:::-;17648:90;;17747:93;17836:3;17747:93;:::i;:::-;17865:1;17860:3;17856:11;17849:18;;17638:235;;;:::o;17879:366::-;18021:3;18042:67;18106:2;18101:3;18042:67;:::i;:::-;18035:74;;18118:93;18207:3;18118:93;:::i;:::-;18236:2;18231:3;18227:12;18220:19;;18025:220;;;:::o;18251:366::-;18393:3;18414:67;18478:2;18473:3;18414:67;:::i;:::-;18407:74;;18490:93;18579:3;18490:93;:::i;:::-;18608:2;18603:3;18599:12;18592:19;;18397:220;;;:::o;18623:366::-;18765:3;18786:67;18850:2;18845:3;18786:67;:::i;:::-;18779:74;;18862:93;18951:3;18862:93;:::i;:::-;18980:2;18975:3;18971:12;18964:19;;18769:220;;;:::o;18995:118::-;19082:24;19100:5;19082:24;:::i;:::-;19077:3;19070:37;19060:53;;:::o;19119:256::-;19231:3;19246:75;19317:3;19308:6;19246:75;:::i;:::-;19346:2;19341:3;19337:12;19330:19;;19366:3;19359:10;;19235:140;;;;:::o;19381:288::-;19509:3;19524:91;19611:3;19602:6;19524:91;:::i;:::-;19640:2;19635:3;19631:12;19624:19;;19660:3;19653:10;;19513:156;;;;:::o;19675:595::-;19903:3;19925:95;20016:3;20007:6;19925:95;:::i;:::-;19918:102;;20037:95;20128:3;20119:6;20037:95;:::i;:::-;20030:102;;20149:95;20240:3;20231:6;20149:95;:::i;:::-;20142:102;;20261:3;20254:10;;19907:363;;;;;;:::o;20276:589::-;20501:3;20523:95;20614:3;20605:6;20523:95;:::i;:::-;20516:102;;20635:95;20726:3;20717:6;20635:95;:::i;:::-;20628:102;;20747:92;20835:3;20826:6;20747:92;:::i;:::-;20740:99;;20856:3;20849:10;;20505:360;;;;;;:::o;20871:583::-;21093:3;21115:92;21203:3;21194:6;21115:92;:::i;:::-;21108:99;;21224:95;21315:3;21306:6;21224:95;:::i;:::-;21217:102;;21336:92;21424:3;21415:6;21336:92;:::i;:::-;21329:99;;21445:3;21438:10;;21097:357;;;;;;:::o;21460:379::-;21644:3;21666:147;21809:3;21666:147;:::i;:::-;21659:154;;21830:3;21823:10;;21648:191;;;:::o;21845:222::-;21938:4;21976:2;21965:9;21961:18;21953:26;;21989:71;22057:1;22046:9;22042:17;22033:6;21989:71;:::i;:::-;21943:124;;;;:::o;22073:458::-;22230:4;22268:2;22257:9;22253:18;22245:26;;22281:71;22349:1;22338:9;22334:17;22325:6;22281:71;:::i;:::-;22362:80;22438:2;22427:9;22423:18;22414:6;22362:80;:::i;:::-;22452:72;22520:2;22509:9;22505:18;22496:6;22452:72;:::i;:::-;22235:296;;;;;;:::o;22537:640::-;22732:4;22770:3;22759:9;22755:19;22747:27;;22784:71;22852:1;22841:9;22837:17;22828:6;22784:71;:::i;:::-;22865:72;22933:2;22922:9;22918:18;22909:6;22865:72;:::i;:::-;22947;23015:2;23004:9;23000:18;22991:6;22947:72;:::i;:::-;23066:9;23060:4;23056:20;23051:2;23040:9;23036:18;23029:48;23094:76;23165:4;23156:6;23094:76;:::i;:::-;23086:84;;22737:440;;;;;;;:::o;23183:210::-;23270:4;23308:2;23297:9;23293:18;23285:26;;23321:65;23383:1;23372:9;23368:17;23359:6;23321:65;:::i;:::-;23275:118;;;;:::o;23399:222::-;23492:4;23530:2;23519:9;23515:18;23507:26;;23543:71;23611:1;23600:9;23596:17;23587:6;23543:71;:::i;:::-;23497:124;;;;:::o;23627:313::-;23740:4;23778:2;23767:9;23763:18;23755:26;;23827:9;23821:4;23817:20;23813:1;23802:9;23798:17;23791:47;23855:78;23928:4;23919:6;23855:78;:::i;:::-;23847:86;;23745:195;;;;:::o;23946:419::-;24112:4;24150:2;24139:9;24135:18;24127:26;;24199:9;24193:4;24189:20;24185:1;24174:9;24170:17;24163:47;24227:131;24353:4;24227:131;:::i;:::-;24219:139;;24117:248;;;:::o;24371:419::-;24537:4;24575:2;24564:9;24560:18;24552:26;;24624:9;24618:4;24614:20;24610:1;24599:9;24595:17;24588:47;24652:131;24778:4;24652:131;:::i;:::-;24644:139;;24542:248;;;:::o;24796:419::-;24962:4;25000:2;24989:9;24985:18;24977:26;;25049:9;25043:4;25039:20;25035:1;25024:9;25020:17;25013:47;25077:131;25203:4;25077:131;:::i;:::-;25069:139;;24967:248;;;:::o;25221:419::-;25387:4;25425:2;25414:9;25410:18;25402:26;;25474:9;25468:4;25464:20;25460:1;25449:9;25445:17;25438:47;25502:131;25628:4;25502:131;:::i;:::-;25494:139;;25392:248;;;:::o;25646:419::-;25812:4;25850:2;25839:9;25835:18;25827:26;;25899:9;25893:4;25889:20;25885:1;25874:9;25870:17;25863:47;25927:131;26053:4;25927:131;:::i;:::-;25919:139;;25817:248;;;:::o;26071:419::-;26237:4;26275:2;26264:9;26260:18;26252:26;;26324:9;26318:4;26314:20;26310:1;26299:9;26295:17;26288:47;26352:131;26478:4;26352:131;:::i;:::-;26344:139;;26242:248;;;:::o;26496:419::-;26662:4;26700:2;26689:9;26685:18;26677:26;;26749:9;26743:4;26739:20;26735:1;26724:9;26720:17;26713:47;26777:131;26903:4;26777:131;:::i;:::-;26769:139;;26667:248;;;:::o;26921:419::-;27087:4;27125:2;27114:9;27110:18;27102:26;;27174:9;27168:4;27164:20;27160:1;27149:9;27145:17;27138:47;27202:131;27328:4;27202:131;:::i;:::-;27194:139;;27092:248;;;:::o;27346:419::-;27512:4;27550:2;27539:9;27535:18;27527:26;;27599:9;27593:4;27589:20;27585:1;27574:9;27570:17;27563:47;27627:131;27753:4;27627:131;:::i;:::-;27619:139;;27517:248;;;:::o;27771:419::-;27937:4;27975:2;27964:9;27960:18;27952:26;;28024:9;28018:4;28014:20;28010:1;27999:9;27995:17;27988:47;28052:131;28178:4;28052:131;:::i;:::-;28044:139;;27942:248;;;:::o;28196:419::-;28362:4;28400:2;28389:9;28385:18;28377:26;;28449:9;28443:4;28439:20;28435:1;28424:9;28420:17;28413:47;28477:131;28603:4;28477:131;:::i;:::-;28469:139;;28367:248;;;:::o;28621:222::-;28714:4;28752:2;28741:9;28737:18;28729:26;;28765:71;28833:1;28822:9;28818:17;28809:6;28765:71;:::i;:::-;28719:124;;;;:::o;28849:129::-;28883:6;28910:20;;:::i;:::-;28900:30;;28939:33;28967:4;28959:6;28939:33;:::i;:::-;28890:88;;;:::o;28984:75::-;29017:6;29050:2;29044:9;29034:19;;29024:35;:::o;29065:311::-;29142:4;29232:18;29224:6;29221:30;29218:2;;;29254:18;;:::i;:::-;29218:2;29304:4;29296:6;29292:17;29284:25;;29364:4;29358;29354:15;29346:23;;29147:229;;;:::o;29382:307::-;29443:4;29533:18;29525:6;29522:30;29519:2;;;29555:18;;:::i;:::-;29519:2;29593:29;29615:6;29593:29;:::i;:::-;29585:37;;29677:4;29671;29667:15;29659:23;;29448:241;;;:::o;29695:308::-;29757:4;29847:18;29839:6;29836:30;29833:2;;;29869:18;;:::i;:::-;29833:2;29907:29;29929:6;29907:29;:::i;:::-;29899:37;;29991:4;29985;29981:15;29973:23;;29762:241;;;:::o;30009:141::-;30058:4;30081:3;30073:11;;30104:3;30101:1;30094:14;30138:4;30135:1;30125:18;30117:26;;30063:87;;;:::o;30156:98::-;30207:6;30241:5;30235:12;30225:22;;30214:40;;;:::o;30260:99::-;30312:6;30346:5;30340:12;30330:22;;30319:40;;;:::o;30365:168::-;30448:11;30482:6;30477:3;30470:19;30522:4;30517:3;30513:14;30498:29;;30460:73;;;;:::o;30539:147::-;30640:11;30677:3;30662:18;;30652:34;;;;:::o;30692:169::-;30776:11;30810:6;30805:3;30798:19;30850:4;30845:3;30841:14;30826:29;;30788:73;;;;:::o;30867:148::-;30969:11;31006:3;30991:18;;30981:34;;;;:::o;31021:305::-;31061:3;31080:20;31098:1;31080:20;:::i;:::-;31075:25;;31114:20;31132:1;31114:20;:::i;:::-;31109:25;;31268:1;31200:66;31196:74;31193:1;31190:81;31187:2;;;31274:18;;:::i;:::-;31187:2;31318:1;31315;31311:9;31304:16;;31065:261;;;;:::o;31332:185::-;31372:1;31389:20;31407:1;31389:20;:::i;:::-;31384:25;;31423:20;31441:1;31423:20;:::i;:::-;31418:25;;31462:1;31452:2;;31467:18;;:::i;:::-;31452:2;31509:1;31506;31502:9;31497:14;;31374:143;;;;:::o;31523:348::-;31563:7;31586:20;31604:1;31586:20;:::i;:::-;31581:25;;31620:20;31638:1;31620:20;:::i;:::-;31615:25;;31808:1;31740:66;31736:74;31733:1;31730:81;31725:1;31718:9;31711:17;31707:105;31704:2;;;31815:18;;:::i;:::-;31704:2;31863:1;31860;31856:9;31845:20;;31571:300;;;;:::o;31877:191::-;31917:4;31937:20;31955:1;31937:20;:::i;:::-;31932:25;;31971:20;31989:1;31971:20;:::i;:::-;31966:25;;32010:1;32007;32004:8;32001:2;;;32015:18;;:::i;:::-;32001:2;32060:1;32057;32053:9;32045:17;;31922:146;;;;:::o;32074:96::-;32111:7;32140:24;32158:5;32140:24;:::i;:::-;32129:35;;32119:51;;;:::o;32176:104::-;32221:7;32250:24;32268:5;32250:24;:::i;:::-;32239:35;;32229:51;;;:::o;32286:90::-;32320:7;32363:5;32356:13;32349:21;32338:32;;32328:48;;;:::o;32382:77::-;32419:7;32448:5;32437:16;;32427:32;;;:::o;32465:149::-;32501:7;32541:66;32534:5;32530:78;32519:89;;32509:105;;;:::o;32620:126::-;32657:7;32697:42;32690:5;32686:54;32675:65;;32665:81;;;:::o;32752:77::-;32789:7;32818:5;32807:16;;32797:32;;;:::o;32835:134::-;32893:9;32926:37;32957:5;32926:37;:::i;:::-;32913:50;;32903:66;;;:::o;32975:126::-;33025:9;33058:37;33089:5;33058:37;:::i;:::-;33045:50;;33035:66;;;:::o;33107:113::-;33157:9;33190:24;33208:5;33190:24;:::i;:::-;33177:37;;33167:53;;;:::o;33226:154::-;33310:6;33305:3;33300;33287:30;33372:1;33363:6;33358:3;33354:16;33347:27;33277:103;;;:::o;33386:307::-;33454:1;33464:113;33478:6;33475:1;33472:13;33464:113;;;33563:1;33558:3;33554:11;33548:18;33544:1;33539:3;33535:11;33528:39;33500:2;33497:1;33493:10;33488:15;;33464:113;;;33595:6;33592:1;33589:13;33586:2;;;33675:1;33666:6;33661:3;33657:16;33650:27;33586:2;33435:258;;;;:::o;33699:171::-;33738:3;33761:24;33779:5;33761:24;:::i;:::-;33752:33;;33807:4;33800:5;33797:15;33794:2;;;33815:18;;:::i;:::-;33794:2;33862:1;33855:5;33851:13;33844:20;;33742:128;;;:::o;33876:320::-;33920:6;33957:1;33951:4;33947:12;33937:22;;34004:1;33998:4;33994:12;34025:18;34015:2;;34081:4;34073:6;34069:17;34059:27;;34015:2;34143;34135:6;34132:14;34112:18;34109:38;34106:2;;;34162:18;;:::i;:::-;34106:2;33927:269;;;;:::o;34202:281::-;34285:27;34307:4;34285:27;:::i;:::-;34277:6;34273:40;34415:6;34403:10;34400:22;34379:18;34367:10;34364:34;34361:62;34358:2;;;34426:18;;:::i;:::-;34358:2;34466:10;34462:2;34455:22;34245:238;;;:::o;34489:233::-;34528:3;34551:24;34569:5;34551:24;:::i;:::-;34542:33;;34597:66;34590:5;34587:77;34584:2;;;34667:18;;:::i;:::-;34584:2;34714:1;34707:5;34703:13;34696:20;;34532:190;;;:::o;34728:100::-;34767:7;34796:26;34816:5;34796:26;:::i;:::-;34785:37;;34775:53;;;:::o;34834:108::-;34881:7;34910:26;34930:5;34910:26;:::i;:::-;34899:37;;34889:53;;;:::o;34948:94::-;34987:7;35016:20;35030:5;35016:20;:::i;:::-;35005:31;;34995:47;;;:::o;35048:176::-;35080:1;35097:20;35115:1;35097:20;:::i;:::-;35092:25;;35131:20;35149:1;35131:20;:::i;:::-;35126:25;;35170:1;35160:2;;35175:18;;:::i;:::-;35160:2;35216:1;35213;35209:9;35204:14;;35082:142;;;;:::o;35230:180::-;35278:77;35275:1;35268:88;35375:4;35372:1;35365:15;35399:4;35396:1;35389:15;35416:180;35464:77;35461:1;35454:88;35561:4;35558:1;35551:15;35585:4;35582:1;35575:15;35602:180;35650:77;35647:1;35640:88;35747:4;35744:1;35737:15;35771:4;35768:1;35761:15;35788:180;35836:77;35833:1;35826:88;35933:4;35930:1;35923:15;35957:4;35954:1;35947:15;35974:102;36015:6;36066:2;36062:7;36057:2;36050:5;36046:14;36042:28;36032:38;;36022:54;;;:::o;36082:94::-;36115:8;36163:5;36159:2;36155:14;36134:35;;36124:52;;;:::o;36182:225::-;36322:34;36318:1;36310:6;36306:14;36299:58;36391:8;36386:2;36378:6;36374:15;36367:33;36288:119;:::o;36413:173::-;36553:25;36549:1;36541:6;36537:14;36530:49;36519:67;:::o;36592:234::-;36732:34;36728:1;36720:6;36716:14;36709:58;36801:17;36796:2;36788:6;36784:15;36777:42;36698:128;:::o;36832:168::-;36972:20;36968:1;36960:6;36956:14;36949:44;36938:62;:::o;37006:244::-;37146:34;37142:1;37134:6;37130:14;37123:58;37215:27;37210:2;37202:6;37198:15;37191:52;37112:138;:::o;37256:182::-;37396:34;37392:1;37384:6;37380:14;37373:58;37362:76;:::o;37444:234::-;37584:34;37580:1;37572:6;37568:14;37561:58;37653:17;37648:2;37640:6;37636:15;37629:42;37550:128;:::o;37684:181::-;37824:33;37820:1;37812:6;37808:14;37801:57;37790:75;:::o;37871:114::-;37977:8;:::o;37991:244::-;38131:34;38127:1;38119:6;38115:14;38108:58;38200:27;38195:2;38187:6;38183:15;38176:52;38097:138;:::o;38241:220::-;38381:34;38377:1;38369:6;38365:14;38358:58;38450:3;38445:2;38437:6;38433:15;38426:28;38347:114;:::o;38467:176::-;38607:28;38603:1;38595:6;38591:14;38584:52;38573:70;:::o;38649:122::-;38722:24;38740:5;38722:24;:::i;:::-;38715:5;38712:35;38702:2;;38761:1;38758;38751:12;38702:2;38692:79;:::o;38777:138::-;38858:32;38884:5;38858:32;:::i;:::-;38851:5;38848:43;38838:2;;38905:1;38902;38895:12;38838:2;38828:87;:::o;38921:116::-;38991:21;39006:5;38991:21;:::i;:::-;38984:5;38981:32;38971:2;;39027:1;39024;39017:12;38971:2;38961:76;:::o;39043:122::-;39116:24;39134:5;39116:24;:::i;:::-;39109:5;39106:35;39096:2;;39155:1;39152;39145:12;39096:2;39086:79;:::o;39171:120::-;39243:23;39260:5;39243:23;:::i;:::-;39236:5;39233:34;39223:2;;39281:1;39278;39271:12;39223:2;39213:78;:::o;39297:122::-;39370:24;39388:5;39370:24;:::i;:::-;39363:5;39360:35;39350:2;;39409:1;39406;39399:12;39350:2;39340:79;:::o

Swarm Source

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