ETH Price: $3,295.07 (-3.66%)
 

Overview

Max Total Supply

500 BZ

Holders

326

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
spanevello.eth
Balance
1 BZ
0x52dE77d5443fe553cd0fa24B4A0f0d42Ab9FD3a8
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:
Brazuera

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-11-05
*/

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



pragma solidity 0.8.4;
pragma abicoder v2;








contract Brazuera 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 = 500;
    uint256 private maxMintAmount = 5;
    uint256 private FreeMintPerAddressLimit = 1;
    bool private paused = true;
    bool private onlyWhitelisted = false;
    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 private nftWhitelistDiscount = 14;

    mapping(address => uint256) private _addressLastMintedTokenId;

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

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

    constructor(
    string memory _initBaseURI,
    bytes32 _root,
    string memory _contractURI
    ) ERC721A("Brazuera - O Conselho", "BZ") {
        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);
    }

    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(address wallet, bytes32[] memory proof) public view returns (uint) {
        if( isValid( proof, keccak256( abi.encodePacked(wallet) ) ) ) {
            if (whitelistClaimed[wallet]) {
                return _nftEtherValue;
            }
            //uint256 amount = _nftEtherValue * nftWhitelistDiscount / 100;
            //uint256 amountPercent = _nftEtherValue - amount;
            return _nftEtherValue;
        } else {
            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 mint(
        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, proof);
            } else {
                uint tokensIds = walletOfOwner(endUser);
                if(tokensIds > 0){
                    split(_mintAmount, _recommendedBy, _indicationType, proof);
                }
            }
        }

        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, bytes32[] memory proof) public payable {
        uint256 _nftEtherValueTemp = _nftEtherValue;
        if( isValid( proof, keccak256( abi.encodePacked(msg.sender) ) ) ) {
            if (whitelistClaimed[msg.sender]) {
                _nftEtherValueTemp = _nftEtherValue;
            }
            //uint256 amount = _nftEtherValue * nftWhitelistDiscount / 100;
            //uint256 amountPercent = _nftEtherValue - amount;
            _nftEtherValueTemp = _nftEtherValue;
        } else {
            _nftEtherValueTemp = _nftEtherValue;
        }

        require(msg.value >= (_nftEtherValueTemp * _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":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"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"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mint","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"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"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"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d90805190602001906200005192919062000472565b5060405180602001604052806000815250600e90805190602001906200007992919062000472565b506101f4600f55600560105560016011556001601260006101000a81548160ff0219169083151502179055506000601260016101000a81548160ff0219169083151502179055506001601a60006101000a81548160ff021916908315150217905550600f601b556001601c60006101000a81548160ff021916908315150217905550600a601d55600a601e55600e601f556000602160006101000a81548160ff0219169083151502179055506658d15e176280006022553480156200013d57600080fd5b506040516200572d3803806200572d8339818101604052810190620001639190620005ab565b6040518060400160405280601581526020017f4272617a75657261202d204f20436f6e73656c686f00000000000000000000008152506040518060400160405280600281526020017f425a0000000000000000000000000000000000000000000000000000000000008152508160029080519060200190620001e792919062000472565b5080600390805190602001906200020092919062000472565b5062000211620002b460201b60201c565b6000819055505050620002396200022d620002bd60201b60201c565b620002c560201b60201c565b6200024a836200038b60201b60201c565b8160098190555080601790805190602001906200026992919062000472565b5033601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050506200084a565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200039b620003b760201b60201c565b80600c9080519060200190620003b392919062000472565b5050565b620003c7620002bd60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003ed6200044860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000446576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200043d906200065a565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b82805462000480906200072c565b90600052602060002090601f016020900481019282620004a45760008555620004f0565b82601f10620004bf57805160ff1916838001178555620004f0565b82800160010185558215620004f0579182015b82811115620004ef578251825591602001919060010190620004d2565b5b509050620004ff919062000503565b5090565b5b808211156200051e57600081600090555060010162000504565b5090565b6000620005396200053384620006a5565b6200067c565b9050828152602081018484840111156200055257600080fd5b6200055f848285620006f6565b509392505050565b600081519050620005788162000830565b92915050565b600082601f8301126200059057600080fd5b8151620005a284826020860162000522565b91505092915050565b600080600060608486031215620005c157600080fd5b600084015167ffffffffffffffff811115620005dc57600080fd5b620005ea868287016200057e565b9350506020620005fd8682870162000567565b925050604084015167ffffffffffffffff8111156200061b57600080fd5b62000629868287016200057e565b9150509250925092565b600062000642602083620006db565b91506200064f8262000807565b602082019050919050565b60006020820190508181036000830152620006758162000633565b9050919050565b6000620006886200069b565b905062000696828262000762565b919050565b6000604051905090565b600067ffffffffffffffff821115620006c357620006c2620007c7565b5b620006ce82620007f6565b9050602081019050919050565b600082825260208201905092915050565b6000819050919050565b60005b8381101562000716578082015181840152602081019050620006f9565b8381111562000726576000848401525b50505050565b600060028204905060018216806200074557607f821691505b602082108114156200075c576200075b62000798565b5b50919050565b6200076d82620007f6565b810181811067ffffffffffffffff821117156200078f576200078e620007c7565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6200083b81620006ec565b81146200084757600080fd5b50565b614ed3806200085a6000396000f3fe60806040526004361061034f5760003560e01c806370a08231116101c6578063b4ed16b3116100f7578063db4bec4411610095578063ebf0c7171161006f578063ebf0c71714610ca2578063ef5d87d714610ccd578063f2fde38b14610cf6578063fa9a309d14610d1f5761034f565b8063db4bec4414610bfd578063e8a3d48514610c3a578063e985e9c514610c655761034f565b8063ba4e5c49116100d1578063ba4e5c4914610b1b578063c87b56dd14610b58578063d6e7b8e414610b95578063d88343e214610bc05761034f565b8063b4ed16b314610a8a578063b88d4fde14610ab5578063b8a20ed014610ade5761034f565b80639293237d1161016457806395d89b411161013e57806395d89b41146109ce5780639b0e665d146109f9578063a22cb46514610a36578063b187bd2614610a5f5761034f565b80639293237d14610960578063938e3d7b1461097c57806394cf4b6a146109a55761034f565b806377dbd17f116101a057806377dbd17f146108b35780638863ebbb146108f05780638c584664146109195780638da5cb5b146109355761034f565b806370a0823114610834578063714c539814610871578063715018a61461089c5761034f565b80633ccfd60b116102a057806355f804b31161023e5780636c21fb00116102185780636c21fb001461077a5780636e17f797146107b75780636f50c93c146107e05780636f8b44b01461080b5761034f565b806355f804b3146106d75780635a23dd99146107005780636352211e1461073d5761034f565b8063438b63001161027a578063438b63001461061b578063474c68ec146106585780634c0f38c2146106815780634fc9f84a146106ac5761034f565b80633ccfd60b146105ab57806341dcf454146105b557806342842e0e146105f25761034f565b8063088a4ed01161030d57806318160ddd116102e757806318160ddd1461050557806323b872dd1461053057806330e0789e146105595780633c952764146105825761034f565b8063088a4ed014610488578063095ea7b3146104b157806312065fe0146104da5761034f565b8062621fda1461035457806301ffc9a71461039157806302329a29146103ce57806306fdde03146103f7578063081812fc14610422578063081818161461045f575b600080fd5b34801561036057600080fd5b5061037b60048036038101906103769190613e0a565b610d5c565b6040516103889190614482565b60405180910390f35b34801561039d57600080fd5b506103b860048036038101906103b39190613d77565b610d93565b6040516103c5919061444c565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f09190613d4e565b610e75565b005b34801561040357600080fd5b5061040c610e9a565b6040516104199190614482565b60405180910390f35b34801561042e57600080fd5b5061044960048036038101906104449190613e0a565b610f2c565b60405161045691906143ae565b60405180910390f35b34801561046b57600080fd5b5061048660048036038101906104819190613e0a565b610fa8565b005b34801561049457600080fd5b506104af60048036038101906104aa9190613e0a565b610fba565b005b3480156104bd57600080fd5b506104d860048036038101906104d39190613cbe565b610fcc565b005b3480156104e657600080fd5b506104ef6110d7565b6040516104fc9190614604565b60405180910390f35b34801561051157600080fd5b5061051a6110f6565b6040516105279190614604565b60405180910390f35b34801561053c57600080fd5b5061055760048036038101906105529190613b64565b61110d565b005b34801561056557600080fd5b50610580600480360381019061057b9190613b64565b61111d565b005b34801561058e57600080fd5b506105a960048036038101906105a49190613d4e565b6115d3565b005b6105b36115f8565b005b3480156105c157600080fd5b506105dc60048036038101906105d79190613f3d565b611680565b6040516105e99190614482565b60405180910390f35b3480156105fe57600080fd5b5061061960048036038101906106149190613b64565b611765565b005b34801561062757600080fd5b50610642600480360381019061063d9190613aff565b611785565b60405161064f9190614604565b60405180910390f35b34801561066457600080fd5b5061067f600480360381019061067a9190613e0a565b6117ce565b005b34801561068d57600080fd5b506106966117e0565b6040516106a39190614604565b60405180910390f35b3480156106b857600080fd5b506106c16117ea565b6040516106ce919061444c565b60405180910390f35b3480156106e357600080fd5b506106fe60048036038101906106f99190613dc9565b611801565b005b34801561070c57600080fd5b5061072760048036038101906107229190613c2e565b611823565b604051610734919061444c565b60405180910390f35b34801561074957600080fd5b50610764600480360381019061075f9190613e0a565b6118c9565b60405161077191906143ae565b60405180910390f35b34801561078657600080fd5b506107a1600480360381019061079c9190613aff565b6118df565b6040516107ae9190614604565b60405180910390f35b3480156107c357600080fd5b506107de60048036038101906107d99190613e0a565b611928565b005b3480156107ec57600080fd5b506107f561193a565b604051610802919061444c565b60405180910390f35b34801561081757600080fd5b50610832600480360381019061082d9190613e0a565b611951565b005b34801561084057600080fd5b5061085b60048036038101906108569190613aff565b611963565b6040516108689190614604565b60405180910390f35b34801561087d57600080fd5b50610886611a33565b6040516108939190614482565b60405180910390f35b3480156108a857600080fd5b506108b1611ac5565b005b3480156108bf57600080fd5b506108da60048036038101906108d59190613c2e565b611ad9565b6040516108e79190614604565b60405180910390f35b3480156108fc57600080fd5b5061091760048036038101906109129190613c82565b611b82565b005b610933600480360381019061092e9190613ec2565b611be5565b005b34801561094157600080fd5b5061094a611e86565b60405161095791906143ae565b60405180910390f35b61097a60048036038101906109759190613e33565b611eb0565b005b34801561098857600080fd5b506109a3600480360381019061099e9190613dc9565b612366565b005b3480156109b157600080fd5b506109cc60048036038101906109c79190613d4e565b612388565b005b3480156109da57600080fd5b506109e36123ad565b6040516109f09190614482565b60405180910390f35b348015610a0557600080fd5b50610a206004803603810190610a1b9190613aff565b61243f565b604051610a2d919061444c565b60405180910390f35b348015610a4257600080fd5b50610a5d6004803603810190610a589190613c82565b612495565b005b348015610a6b57600080fd5b50610a7461260d565b604051610a81919061444c565b60405180910390f35b348015610a9657600080fd5b50610a9f612624565b604051610aac9190614604565b60405180910390f35b348015610ac157600080fd5b50610adc6004803603810190610ad79190613bb3565b612643565b005b348015610aea57600080fd5b50610b056004803603810190610b009190613cfa565b61271a565b604051610b12919061444c565b60405180910390f35b348015610b2757600080fd5b50610b426004803603810190610b3d9190613e0a565b612731565b604051610b4f91906143ae565b60405180910390f35b348015610b6457600080fd5b50610b7f6004803603810190610b7a9190613e0a565b612770565b604051610b8c9190614482565b60405180910390f35b348015610ba157600080fd5b50610baa61281a565b604051610bb79190614604565b60405180910390f35b348015610bcc57600080fd5b50610be76004803603810190610be29190613bb3565b612824565b604051610bf4919061444c565b60405180910390f35b348015610c0957600080fd5b50610c246004803603810190610c1f9190613aff565b612984565b604051610c31919061444c565b60405180910390f35b348015610c4657600080fd5b50610c4f6129a4565b604051610c5c9190614482565b60405180910390f35b348015610c7157600080fd5b50610c8c6004803603810190610c879190613b28565b612a36565b604051610c99919061444c565b60405180910390f35b348015610cae57600080fd5b50610cb7612aca565b604051610cc49190614467565b60405180910390f35b348015610cd957600080fd5b50610cf46004803603810190610cef9190613d4e565b612ad0565b005b348015610d0257600080fd5b50610d1d6004803603810190610d189190613aff565b612af5565b005b348015610d2b57600080fd5b50610d466004803603810190610d419190613e0a565b612b79565b604051610d539190614467565b60405180910390f35b6060600c610d6983612b9d565b600d604051602001610d7d93929190614368565b6040516020818303038152906040529050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e5e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e6e5750610e6d82612d4a565b5b9050919050565b610e7d612db4565b80601260006101000a81548160ff02191690831515021790555050565b606060028054610ea99061497c565b80601f0160208091040260200160405190810160405280929190818152602001828054610ed59061497c565b8015610f225780601f10610ef757610100808354040283529160200191610f22565b820191906000526020600020905b815481529060010190602001808311610f0557829003601f168201915b5050505050905090565b6000610f3782612e32565b610f6d576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610fb0612db4565b8060118190555050565b610fc2612db4565b8060108190555050565b6000610fd7826118c9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561103f576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661105e612e80565b73ffffffffffffffffffffffffffffffffffffffff1614158015611090575061108e81611089612e80565b612a36565b155b156110c7576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110d2838383612e88565b505050565b60003373ffffffffffffffffffffffffffffffffffffffff1631905090565b6000611100612f3a565b6001546000540303905090565b61111883838361111d565b505050565b600061112882612f43565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611193576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166111b4612e80565b73ffffffffffffffffffffffffffffffffffffffff1614806111e357506111e2856111dd612e80565b612a36565b5b8061122857506111f1612e80565b73ffffffffffffffffffffffffffffffffffffffff1661121084610f2c565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611261576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156112c8576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112d585858560016131d2565b6112e160008487612e88565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561156157600054821461156057878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46115cc85858560016131d8565b5050505050565b6115db612db4565b80601260016101000a81548160ff02191690831515021790555050565b611600612db4565b600061160a611e86565b73ffffffffffffffffffffffffffffffffffffffff164760405161162d90614399565b60006040518083038185875af1925050503d806000811461166a576040519150601f19603f3d011682016040523d82523d6000602084013e61166f565b606091505b505090508061167d57600080fd5b50565b606061168b83612e32565b6116c1576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006116cb6131de565b90506116d684612e32565b1561170f57806116e585612b9d565b846040516020016116f893929190614306565b60405160208183030381529060405291505061175f565b60008151141561172e576040518060200160405280600081525061175b565b8061173885612b9d565b8460405160200161174b93929190614306565b6040516020818303038152906040525b9150505b92915050565b61178083838360405180602001604052806000815250612643565b505050565b6000601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117d6612db4565b80601b8190555050565b6000600f54905090565b6000602160009054906101000a900460ff16905090565b611809612db4565b80600c908051906020019061181f929190613820565b5050565b6000611855828460405160200161183a91906142d0565b6040516020818303038152906040528051906020012061271a565b156118be57600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156118b557600090506118c3565b600190506118c3565b600090505b92915050565b60006118d482612f43565b600001519050919050565b6000602060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611930612db4565b8060228190555050565b6000601260019054906101000a900460ff16905090565b611959612db4565b80600f8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119cb576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6060600c8054611a429061497c565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6e9061497c565b8015611abb5780601f10611a9057610100808354040283529160200191611abb565b820191906000526020600020905b815481529060010190602001808311611a9e57829003601f168201915b5050505050905090565b611acd612db4565b611ad76000613270565b565b6000611b0b8284604051602001611af091906142d0565b6040516020818303038152906040528051906020012061271a565b15611b7657600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611b6c576022549050611b7c565b6022549050611b7c565b60225490505b92915050565b611b8a612db4565b80601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60006022549050611c1c8233604051602001611c0191906142d0565b6040516020818303038152906040528051906020012061271a565b15611c8357600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611c795760225490505b6022549050611c89565b60225490505b8481611c9591906147bc565b341015611cd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cce90614524565b60405180910390fd5b60003490506001841115611e15576000601d549050600285148015611d085750601a60009054906101000a900460ff165b15611d6657601960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611d6557601b5490505b5b600060648234611d7691906147bc565b611d80919061478b565b90508034611d8e9190614816565b92507ff70a742b6ec5de639ce8e8d0df10a44a88c323ac660a09f1fc0c190e830aea74338883604051611dc3939291906143c9565b60405180910390a18673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611e11573d6000803e3d6000fd5b5050505b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611e7d573d6000803e3d6000fd5b50505050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601260009054906101000a900460ff1615611f00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef790614504565b60405180910390fd5b6000611f0a6110f6565b905060008611611f4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4690614584565b60405180910390fd5b601054611f5b84611963565b87611f669190614735565b1115611fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9e906144e4565b60405180910390fd5b600f548682611fb69190614735565b1115611ff7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fee906145c4565b60405180910390fd5b601260019054906101000a900460ff161561210957600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612099576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612090906144c4565b60405180910390fd5b6120c982846040516020016120ae91906142eb565b6040516020818303038152906040528051906020012061271a565b612108576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ff906145e4565b60405180910390fd5b5b600284141561216257601a60009054906101000a900460ff16612161576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612158906145a4565b60405180910390fd5b5b602160009054906101000a900460ff166121e1576121a6828460405160200161218b91906142eb565b6040516020818303038152906040528051906020012061271a565b6121bb576121b686868685611be5565b6121e0565b60006121c684611785565b905060008111156121de576121dd87878786611be5565b5b505b5b60006121eb6110f6565b600f546121f89190614816565b90506000600190505b8781116122e757601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190612258906149df565b9190505550612268856001613336565b60006001846122779190614735565b905061228281612770565b508261228d90614952565b925081602060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505080806122df906149df565b915050612201565b50601260019054906101000a900460ff1615612356576001600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b8060168190555050505050505050565b61236e612db4565b8060179080519060200190612384929190613820565b5050565b612390612db4565b80601a60006101000a81548160ff02191690831515021790555050565b6060600380546123bc9061497c565b80601f01602080910402602001604051908101604052809291908181526020018280546123e89061497c565b80156124355780601f1061240a57610100808354040283529160200191612435565b820191906000526020600020905b81548152906001019060200180831161241857829003601f168201915b5050505050905090565b6000601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b61249d612e80565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612502576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061250f612e80565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166125bc612e80565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612601919061444c565b60405180910390a35050565b6000601260009054906101000a900460ff16905090565b600080601654111561263a576016549050612640565b600f5490505b90565b61264e84848461111d565b61266d8373ffffffffffffffffffffffffffffffffffffffff16613354565b8015612682575061268084848484612824565b155b156126b9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b60006127298360095484613377565b905092915050565b6013818154811061274157600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606061277b82612e32565b6127ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b190614564565b60405180910390fd5b60006127c46131de565b905060008151116127e45760405180602001604052806000815250612812565b806127ee84612b9d565b600d60405160200161280293929190614337565b6040516020818303038152906040525b915050919050565b6000601054905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261284a612e80565b8786866040518563ffffffff1660e01b815260040161286c9493929190614400565b602060405180830381600087803b15801561288657600080fd5b505af19250505080156128b757506040513d601f19601f820116820180604052508101906128b49190613da0565b60015b612931573d80600081146128e7576040519150601f19603f3d011682016040523d82523d6000602084013e6128ec565b606091505b50600081511415612929576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600b6020528060005260406000206000915054906101000a900460ff1681565b6060601780546129b39061497c565b80601f01602080910402602001604051908101604052809291908181526020018280546129df9061497c565b8015612a2c5780601f10612a0157610100808354040283529160200191612a2c565b820191906000526020600020905b815481529060010190602001808311612a0f57829003601f168201915b5050505050905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60095481565b612ad8612db4565b80602160006101000a81548160ff02191690831515021790555050565b612afd612db4565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b64906144a4565b60405180910390fd5b612b7681613270565b50565b600a8181548110612b8957600080fd5b906000526020600020016000915090505481565b60606000821415612be5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d45565b600082905060005b60008214612c17578080612c00906149df565b915050600a82612c10919061478b565b9150612bed565b60008167ffffffffffffffff811115612c59577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612c8b5781602001600182028036833780820191505090505b5090505b60008514612d3e57600182612ca49190614816565b9150600a85612cb39190614a5e565b6030612cbf9190614735565b60f81b818381518110612cfb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d37919061478b565b9450612c8f565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612dbc612e80565b73ffffffffffffffffffffffffffffffffffffffff16612dda611e86565b73ffffffffffffffffffffffffffffffffffffffff1614612e30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e2790614544565b60405180910390fd5b565b600081612e3d612f3a565b11158015612e4c575060005482105b8015612e79575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b612f4b6138a6565b600082905080612f59612f3a565b11158015612f68575060005481105b1561319b576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161319957600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461307d5780925050506131cd565b5b60011561319857818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146131935780925050506131cd565b61307e565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b50505050565b50505050565b6060600c80546131ed9061497c565b80601f01602080910402602001604051908101604052809291908181526020018280546132199061497c565b80156132665780601f1061323b57610100808354040283529160200191613266565b820191906000526020600020905b81548152906001019060200180831161324957829003601f168201915b5050505050905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61335082826040518060200160405280600081525061338e565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008261338485846133a0565b1490509392505050565b61339b838383600161343b565b505050565b60008082905060005b84518110156134305760008582815181106133ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905080831161340f576134088382613809565b925061341c565b6134198184613809565b92505b508080613428906149df565b9150506133a9565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156134a8576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156134e3576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134f060008683876131d2565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156136ba57506136b98773ffffffffffffffffffffffffffffffffffffffff16613354565b5b15613780575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461372f6000888480600101955088612824565b613765576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156136c057826000541461377b57600080fd5b6137ec565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415613781575b81600081905550505061380260008683876131d8565b5050505050565b600082600052816020526040600020905092915050565b82805461382c9061497c565b90600052602060002090601f01602090048101928261384e5760008555613895565b82601f1061386757805160ff1916838001178555613895565b82800160010185558215613895579182015b82811115613894578251825591602001919060010190613879565b5b5090506138a291906138e9565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156139025760008160009055506001016138ea565b5090565b600061391961391484614644565b61461f565b9050808382526020820190508285602086028201111561393857600080fd5b60005b85811015613968578161394e8882613a57565b84526020840193506020830192505060018101905061393b565b5050509392505050565b600061398561398084614670565b61461f565b90508281526020810184848401111561399d57600080fd5b6139a8848285614910565b509392505050565b60006139c36139be846146a1565b61461f565b9050828152602081018484840111156139db57600080fd5b6139e6848285614910565b509392505050565b6000813590506139fd81614e13565b92915050565b600081359050613a1281614e2a565b92915050565b600082601f830112613a2957600080fd5b8135613a39848260208601613906565b91505092915050565b600081359050613a5181614e41565b92915050565b600081359050613a6681614e58565b92915050565b600081359050613a7b81614e6f565b92915050565b600081519050613a9081614e6f565b92915050565b600082601f830112613aa757600080fd5b8135613ab7848260208601613972565b91505092915050565b600082601f830112613ad157600080fd5b8135613ae18482602086016139b0565b91505092915050565b600081359050613af981614e86565b92915050565b600060208284031215613b1157600080fd5b6000613b1f848285016139ee565b91505092915050565b60008060408385031215613b3b57600080fd5b6000613b49858286016139ee565b9250506020613b5a858286016139ee565b9150509250929050565b600080600060608486031215613b7957600080fd5b6000613b87868287016139ee565b9350506020613b98868287016139ee565b9250506040613ba986828701613aea565b9150509250925092565b60008060008060808587031215613bc957600080fd5b6000613bd7878288016139ee565b9450506020613be8878288016139ee565b9350506040613bf987828801613aea565b925050606085013567ffffffffffffffff811115613c1657600080fd5b613c2287828801613a96565b91505092959194509250565b60008060408385031215613c4157600080fd5b6000613c4f858286016139ee565b925050602083013567ffffffffffffffff811115613c6c57600080fd5b613c7885828601613a18565b9150509250929050565b60008060408385031215613c9557600080fd5b6000613ca3858286016139ee565b9250506020613cb485828601613a42565b9150509250929050565b60008060408385031215613cd157600080fd5b6000613cdf858286016139ee565b9250506020613cf085828601613aea565b9150509250929050565b60008060408385031215613d0d57600080fd5b600083013567ffffffffffffffff811115613d2757600080fd5b613d3385828601613a18565b9250506020613d4485828601613a57565b9150509250929050565b600060208284031215613d6057600080fd5b6000613d6e84828501613a42565b91505092915050565b600060208284031215613d8957600080fd5b6000613d9784828501613a6c565b91505092915050565b600060208284031215613db257600080fd5b6000613dc084828501613a81565b91505092915050565b600060208284031215613ddb57600080fd5b600082013567ffffffffffffffff811115613df557600080fd5b613e0184828501613ac0565b91505092915050565b600060208284031215613e1c57600080fd5b6000613e2a84828501613aea565b91505092915050565b600080600080600060a08688031215613e4b57600080fd5b6000613e5988828901613aea565b9550506020613e6a88828901613a03565b9450506040613e7b88828901613aea565b9350506060613e8c88828901613a03565b925050608086013567ffffffffffffffff811115613ea957600080fd5b613eb588828901613a18565b9150509295509295909350565b60008060008060808587031215613ed857600080fd5b6000613ee687828801613aea565b9450506020613ef787828801613a03565b9350506040613f0887828801613aea565b925050606085013567ffffffffffffffff811115613f2557600080fd5b613f3187828801613a18565b91505092959194509250565b60008060408385031215613f5057600080fd5b6000613f5e85828601613aea565b925050602083013567ffffffffffffffff811115613f7b57600080fd5b613f8785828601613ac0565b9150509250929050565b613f9a816148da565b82525050565b613fb1613fac8261485c565b614a3a565b82525050565b613fc08161484a565b82525050565b613fd7613fd28261484a565b614a28565b82525050565b613fe68161486e565b82525050565b613ff58161487a565b82525050565b6000614006826146e7565b61401081856146fd565b935061402081856020860161491f565b61402981614b4b565b840191505092915050565b600061403f826146f2565b6140498185614719565b935061405981856020860161491f565b61406281614b4b565b840191505092915050565b6000614078826146f2565b614082818561472a565b935061409281856020860161491f565b80840191505092915050565b600081546140ab8161497c565b6140b5818661472a565b945060018216600081146140d057600181146140e157614114565b60ff19831686528186019350614114565b6140ea856146d2565b60005b8381101561410c578154818901526001820191506020810190506140ed565b838801955050505b50505092915050565b600061412a602683614719565b915061413582614b69565b604082019050919050565b600061414d601783614719565b915061415882614bb8565b602082019050919050565b6000614170602f83614719565b915061417b82614be1565b604082019050919050565b6000614193601283614719565b915061419e82614c30565b602082019050919050565b60006141b6603983614719565b91506141c182614c59565b604082019050919050565b60006141d9602083614719565b91506141e482614ca8565b602082019050919050565b60006141fc602f83614719565b915061420782614cd1565b604082019050919050565b600061421f601f83614719565b915061422a82614d20565b602082019050919050565b600061424260008361470e565b915061424d82614d49565b600082019050919050565b6000614265603983614719565b915061427082614d4c565b604082019050919050565b6000614288602183614719565b915061429382614d9b565b604082019050919050565b60006142ab601a83614719565b91506142b682614dea565b602082019050919050565b6142ca816148d0565b82525050565b60006142dc8284613fc6565b60148201915081905092915050565b60006142f78284613fa0565b60148201915081905092915050565b6000614312828661406d565b915061431e828561406d565b915061432a828461406d565b9150819050949350505050565b6000614343828661406d565b915061434f828561406d565b915061435b828461409e565b9150819050949350505050565b6000614374828661409e565b9150614380828561406d565b915061438c828461409e565b9150819050949350505050565b60006143a482614235565b9150819050919050565b60006020820190506143c36000830184613fb7565b92915050565b60006060820190506143de6000830186613fb7565b6143eb6020830185613f91565b6143f860408301846142c1565b949350505050565b60006080820190506144156000830187613fb7565b6144226020830186613fb7565b61442f60408301856142c1565b81810360608301526144418184613ffb565b905095945050505050565b60006020820190506144616000830184613fdd565b92915050565b600060208201905061447c6000830184613fec565b92915050565b6000602082019050818103600083015261449c8184614034565b905092915050565b600060208201905081810360008301526144bd8161411d565b9050919050565b600060208201905081810360008301526144dd81614140565b9050919050565b600060208201905081810360008301526144fd81614163565b9050919050565b6000602082019050818103600083015261451d81614186565b9050919050565b6000602082019050818103600083015261453d816141a9565b9050919050565b6000602082019050818103600083015261455d816141cc565b9050919050565b6000602082019050818103600083015261457d816141ef565b9050919050565b6000602082019050818103600083015261459d81614212565b9050919050565b600060208201905081810360008301526145bd81614258565b9050919050565b600060208201905081810360008301526145dd8161427b565b9050919050565b600060208201905081810360008301526145fd8161429e565b9050919050565b600060208201905061461960008301846142c1565b92915050565b600061462961463a565b905061463582826149ae565b919050565b6000604051905090565b600067ffffffffffffffff82111561465f5761465e614b1c565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561468b5761468a614b1c565b5b61469482614b4b565b9050602081019050919050565b600067ffffffffffffffff8211156146bc576146bb614b1c565b5b6146c582614b4b565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614740826148d0565b915061474b836148d0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156147805761477f614a8f565b5b828201905092915050565b6000614796826148d0565b91506147a1836148d0565b9250826147b1576147b0614abe565b5b828204905092915050565b60006147c7826148d0565b91506147d2836148d0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561480b5761480a614a8f565b5b828202905092915050565b6000614821826148d0565b915061482c836148d0565b92508282101561483f5761483e614a8f565b5b828203905092915050565b6000614855826148b0565b9050919050565b6000614867826148b0565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006148e5826148ec565b9050919050565b60006148f7826148fe565b9050919050565b6000614909826148b0565b9050919050565b82818337600083830152505050565b60005b8381101561493d578082015181840152602081019050614922565b8381111561494c576000848401525b50505050565b600061495d826148d0565b9150600082141561497157614970614a8f565b5b600182039050919050565b6000600282049050600182168061499457607f821691505b602082108114156149a8576149a7614aed565b5b50919050565b6149b782614b4b565b810181811067ffffffffffffffff821117156149d6576149d5614b1c565b5b80604052505050565b60006149ea826148d0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614a1d57614a1c614a8f565b5b600182019050919050565b6000614a3382614a4c565b9050919050565b6000614a4582614a4c565b9050919050565b6000614a5782614b5c565b9050919050565b6000614a69826148d0565b9150614a74836148d0565b925082614a8457614a83614abe565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f41646472657373206a612072656976696e64696361646f000000000000000000600082015250565b7f5175616e746964616465206c696d697465206465206d696e7420706f7220636160008201527f7274656972612065786365646964610000000000000000000000000000000000602082015250565b7f4f20636f6e747261746f207061757361646f0000000000000000000000000000600082015250565b7f56616c6f72206461206d696e746167656d206469666572656e746520646f207660008201527f616c6f7220646566696e69646f206e6f20636f6e747261746f00000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f50726563697361206d696e7461722070656c6f206d656e6f732031204e465400600082015250565b50565b7f4e6f206d6f6d656e746f206f2070726f6772616d61206465206166696c69616460008201527f6f7320736520656e636f6e747261206465736174697661646f00000000000000602082015250565b7f5175616e746964616465206c696d697465206465204e4654206578636564696460008201527f6100000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e616f2066617a2070617274652064612057686974656c697374000000000000600082015250565b614e1c8161484a565b8114614e2757600080fd5b50565b614e338161485c565b8114614e3e57600080fd5b50565b614e4a8161486e565b8114614e5557600080fd5b50565b614e618161487a565b8114614e6c57600080fd5b50565b614e7881614884565b8114614e8357600080fd5b50565b614e8f816148d0565b8114614e9a57600080fd5b5056fea26469706673582212202904f4555f7aa7b5cd652e78df9cbc3c1c08d295c48e836c0c5291484d5c136764736f6c6343000804003300000000000000000000000000000000000000000000000000000000000000605e1d85ea08b3d5b07f2cd296c95d8b42aaee0a40d71a4e608b40f60f8b877be800000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d575966487572357a736e38563634654676664473697247483965556933316f417331787a7562617547426e352f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004368747470733a2f2f697066732e696f2f697066732f516d63544b79673833786e4757784e46633658697362634b57713431477a70344363734d76515a4435626273474d0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061034f5760003560e01c806370a08231116101c6578063b4ed16b3116100f7578063db4bec4411610095578063ebf0c7171161006f578063ebf0c71714610ca2578063ef5d87d714610ccd578063f2fde38b14610cf6578063fa9a309d14610d1f5761034f565b8063db4bec4414610bfd578063e8a3d48514610c3a578063e985e9c514610c655761034f565b8063ba4e5c49116100d1578063ba4e5c4914610b1b578063c87b56dd14610b58578063d6e7b8e414610b95578063d88343e214610bc05761034f565b8063b4ed16b314610a8a578063b88d4fde14610ab5578063b8a20ed014610ade5761034f565b80639293237d1161016457806395d89b411161013e57806395d89b41146109ce5780639b0e665d146109f9578063a22cb46514610a36578063b187bd2614610a5f5761034f565b80639293237d14610960578063938e3d7b1461097c57806394cf4b6a146109a55761034f565b806377dbd17f116101a057806377dbd17f146108b35780638863ebbb146108f05780638c584664146109195780638da5cb5b146109355761034f565b806370a0823114610834578063714c539814610871578063715018a61461089c5761034f565b80633ccfd60b116102a057806355f804b31161023e5780636c21fb00116102185780636c21fb001461077a5780636e17f797146107b75780636f50c93c146107e05780636f8b44b01461080b5761034f565b806355f804b3146106d75780635a23dd99146107005780636352211e1461073d5761034f565b8063438b63001161027a578063438b63001461061b578063474c68ec146106585780634c0f38c2146106815780634fc9f84a146106ac5761034f565b80633ccfd60b146105ab57806341dcf454146105b557806342842e0e146105f25761034f565b8063088a4ed01161030d57806318160ddd116102e757806318160ddd1461050557806323b872dd1461053057806330e0789e146105595780633c952764146105825761034f565b8063088a4ed014610488578063095ea7b3146104b157806312065fe0146104da5761034f565b8062621fda1461035457806301ffc9a71461039157806302329a29146103ce57806306fdde03146103f7578063081812fc14610422578063081818161461045f575b600080fd5b34801561036057600080fd5b5061037b60048036038101906103769190613e0a565b610d5c565b6040516103889190614482565b60405180910390f35b34801561039d57600080fd5b506103b860048036038101906103b39190613d77565b610d93565b6040516103c5919061444c565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f09190613d4e565b610e75565b005b34801561040357600080fd5b5061040c610e9a565b6040516104199190614482565b60405180910390f35b34801561042e57600080fd5b5061044960048036038101906104449190613e0a565b610f2c565b60405161045691906143ae565b60405180910390f35b34801561046b57600080fd5b5061048660048036038101906104819190613e0a565b610fa8565b005b34801561049457600080fd5b506104af60048036038101906104aa9190613e0a565b610fba565b005b3480156104bd57600080fd5b506104d860048036038101906104d39190613cbe565b610fcc565b005b3480156104e657600080fd5b506104ef6110d7565b6040516104fc9190614604565b60405180910390f35b34801561051157600080fd5b5061051a6110f6565b6040516105279190614604565b60405180910390f35b34801561053c57600080fd5b5061055760048036038101906105529190613b64565b61110d565b005b34801561056557600080fd5b50610580600480360381019061057b9190613b64565b61111d565b005b34801561058e57600080fd5b506105a960048036038101906105a49190613d4e565b6115d3565b005b6105b36115f8565b005b3480156105c157600080fd5b506105dc60048036038101906105d79190613f3d565b611680565b6040516105e99190614482565b60405180910390f35b3480156105fe57600080fd5b5061061960048036038101906106149190613b64565b611765565b005b34801561062757600080fd5b50610642600480360381019061063d9190613aff565b611785565b60405161064f9190614604565b60405180910390f35b34801561066457600080fd5b5061067f600480360381019061067a9190613e0a565b6117ce565b005b34801561068d57600080fd5b506106966117e0565b6040516106a39190614604565b60405180910390f35b3480156106b857600080fd5b506106c16117ea565b6040516106ce919061444c565b60405180910390f35b3480156106e357600080fd5b506106fe60048036038101906106f99190613dc9565b611801565b005b34801561070c57600080fd5b5061072760048036038101906107229190613c2e565b611823565b604051610734919061444c565b60405180910390f35b34801561074957600080fd5b50610764600480360381019061075f9190613e0a565b6118c9565b60405161077191906143ae565b60405180910390f35b34801561078657600080fd5b506107a1600480360381019061079c9190613aff565b6118df565b6040516107ae9190614604565b60405180910390f35b3480156107c357600080fd5b506107de60048036038101906107d99190613e0a565b611928565b005b3480156107ec57600080fd5b506107f561193a565b604051610802919061444c565b60405180910390f35b34801561081757600080fd5b50610832600480360381019061082d9190613e0a565b611951565b005b34801561084057600080fd5b5061085b60048036038101906108569190613aff565b611963565b6040516108689190614604565b60405180910390f35b34801561087d57600080fd5b50610886611a33565b6040516108939190614482565b60405180910390f35b3480156108a857600080fd5b506108b1611ac5565b005b3480156108bf57600080fd5b506108da60048036038101906108d59190613c2e565b611ad9565b6040516108e79190614604565b60405180910390f35b3480156108fc57600080fd5b5061091760048036038101906109129190613c82565b611b82565b005b610933600480360381019061092e9190613ec2565b611be5565b005b34801561094157600080fd5b5061094a611e86565b60405161095791906143ae565b60405180910390f35b61097a60048036038101906109759190613e33565b611eb0565b005b34801561098857600080fd5b506109a3600480360381019061099e9190613dc9565b612366565b005b3480156109b157600080fd5b506109cc60048036038101906109c79190613d4e565b612388565b005b3480156109da57600080fd5b506109e36123ad565b6040516109f09190614482565b60405180910390f35b348015610a0557600080fd5b50610a206004803603810190610a1b9190613aff565b61243f565b604051610a2d919061444c565b60405180910390f35b348015610a4257600080fd5b50610a5d6004803603810190610a589190613c82565b612495565b005b348015610a6b57600080fd5b50610a7461260d565b604051610a81919061444c565b60405180910390f35b348015610a9657600080fd5b50610a9f612624565b604051610aac9190614604565b60405180910390f35b348015610ac157600080fd5b50610adc6004803603810190610ad79190613bb3565b612643565b005b348015610aea57600080fd5b50610b056004803603810190610b009190613cfa565b61271a565b604051610b12919061444c565b60405180910390f35b348015610b2757600080fd5b50610b426004803603810190610b3d9190613e0a565b612731565b604051610b4f91906143ae565b60405180910390f35b348015610b6457600080fd5b50610b7f6004803603810190610b7a9190613e0a565b612770565b604051610b8c9190614482565b60405180910390f35b348015610ba157600080fd5b50610baa61281a565b604051610bb79190614604565b60405180910390f35b348015610bcc57600080fd5b50610be76004803603810190610be29190613bb3565b612824565b604051610bf4919061444c565b60405180910390f35b348015610c0957600080fd5b50610c246004803603810190610c1f9190613aff565b612984565b604051610c31919061444c565b60405180910390f35b348015610c4657600080fd5b50610c4f6129a4565b604051610c5c9190614482565b60405180910390f35b348015610c7157600080fd5b50610c8c6004803603810190610c879190613b28565b612a36565b604051610c99919061444c565b60405180910390f35b348015610cae57600080fd5b50610cb7612aca565b604051610cc49190614467565b60405180910390f35b348015610cd957600080fd5b50610cf46004803603810190610cef9190613d4e565b612ad0565b005b348015610d0257600080fd5b50610d1d6004803603810190610d189190613aff565b612af5565b005b348015610d2b57600080fd5b50610d466004803603810190610d419190613e0a565b612b79565b604051610d539190614467565b60405180910390f35b6060600c610d6983612b9d565b600d604051602001610d7d93929190614368565b6040516020818303038152906040529050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e5e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e6e5750610e6d82612d4a565b5b9050919050565b610e7d612db4565b80601260006101000a81548160ff02191690831515021790555050565b606060028054610ea99061497c565b80601f0160208091040260200160405190810160405280929190818152602001828054610ed59061497c565b8015610f225780601f10610ef757610100808354040283529160200191610f22565b820191906000526020600020905b815481529060010190602001808311610f0557829003601f168201915b5050505050905090565b6000610f3782612e32565b610f6d576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610fb0612db4565b8060118190555050565b610fc2612db4565b8060108190555050565b6000610fd7826118c9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561103f576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661105e612e80565b73ffffffffffffffffffffffffffffffffffffffff1614158015611090575061108e81611089612e80565b612a36565b155b156110c7576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110d2838383612e88565b505050565b60003373ffffffffffffffffffffffffffffffffffffffff1631905090565b6000611100612f3a565b6001546000540303905090565b61111883838361111d565b505050565b600061112882612f43565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611193576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166111b4612e80565b73ffffffffffffffffffffffffffffffffffffffff1614806111e357506111e2856111dd612e80565b612a36565b5b8061122857506111f1612e80565b73ffffffffffffffffffffffffffffffffffffffff1661121084610f2c565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611261576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156112c8576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112d585858560016131d2565b6112e160008487612e88565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561156157600054821461156057878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46115cc85858560016131d8565b5050505050565b6115db612db4565b80601260016101000a81548160ff02191690831515021790555050565b611600612db4565b600061160a611e86565b73ffffffffffffffffffffffffffffffffffffffff164760405161162d90614399565b60006040518083038185875af1925050503d806000811461166a576040519150601f19603f3d011682016040523d82523d6000602084013e61166f565b606091505b505090508061167d57600080fd5b50565b606061168b83612e32565b6116c1576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006116cb6131de565b90506116d684612e32565b1561170f57806116e585612b9d565b846040516020016116f893929190614306565b60405160208183030381529060405291505061175f565b60008151141561172e576040518060200160405280600081525061175b565b8061173885612b9d565b8460405160200161174b93929190614306565b6040516020818303038152906040525b9150505b92915050565b61178083838360405180602001604052806000815250612643565b505050565b6000601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117d6612db4565b80601b8190555050565b6000600f54905090565b6000602160009054906101000a900460ff16905090565b611809612db4565b80600c908051906020019061181f929190613820565b5050565b6000611855828460405160200161183a91906142d0565b6040516020818303038152906040528051906020012061271a565b156118be57600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156118b557600090506118c3565b600190506118c3565b600090505b92915050565b60006118d482612f43565b600001519050919050565b6000602060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611930612db4565b8060228190555050565b6000601260019054906101000a900460ff16905090565b611959612db4565b80600f8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119cb576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6060600c8054611a429061497c565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6e9061497c565b8015611abb5780601f10611a9057610100808354040283529160200191611abb565b820191906000526020600020905b815481529060010190602001808311611a9e57829003601f168201915b5050505050905090565b611acd612db4565b611ad76000613270565b565b6000611b0b8284604051602001611af091906142d0565b6040516020818303038152906040528051906020012061271a565b15611b7657600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611b6c576022549050611b7c565b6022549050611b7c565b60225490505b92915050565b611b8a612db4565b80601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60006022549050611c1c8233604051602001611c0191906142d0565b6040516020818303038152906040528051906020012061271a565b15611c8357600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611c795760225490505b6022549050611c89565b60225490505b8481611c9591906147bc565b341015611cd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cce90614524565b60405180910390fd5b60003490506001841115611e15576000601d549050600285148015611d085750601a60009054906101000a900460ff165b15611d6657601960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611d6557601b5490505b5b600060648234611d7691906147bc565b611d80919061478b565b90508034611d8e9190614816565b92507ff70a742b6ec5de639ce8e8d0df10a44a88c323ac660a09f1fc0c190e830aea74338883604051611dc3939291906143c9565b60405180910390a18673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611e11573d6000803e3d6000fd5b5050505b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611e7d573d6000803e3d6000fd5b50505050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601260009054906101000a900460ff1615611f00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef790614504565b60405180910390fd5b6000611f0a6110f6565b905060008611611f4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4690614584565b60405180910390fd5b601054611f5b84611963565b87611f669190614735565b1115611fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9e906144e4565b60405180910390fd5b600f548682611fb69190614735565b1115611ff7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fee906145c4565b60405180910390fd5b601260019054906101000a900460ff161561210957600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612099576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612090906144c4565b60405180910390fd5b6120c982846040516020016120ae91906142eb565b6040516020818303038152906040528051906020012061271a565b612108576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ff906145e4565b60405180910390fd5b5b600284141561216257601a60009054906101000a900460ff16612161576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612158906145a4565b60405180910390fd5b5b602160009054906101000a900460ff166121e1576121a6828460405160200161218b91906142eb565b6040516020818303038152906040528051906020012061271a565b6121bb576121b686868685611be5565b6121e0565b60006121c684611785565b905060008111156121de576121dd87878786611be5565b5b505b5b60006121eb6110f6565b600f546121f89190614816565b90506000600190505b8781116122e757601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190612258906149df565b9190505550612268856001613336565b60006001846122779190614735565b905061228281612770565b508261228d90614952565b925081602060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505080806122df906149df565b915050612201565b50601260019054906101000a900460ff1615612356576001600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b8060168190555050505050505050565b61236e612db4565b8060179080519060200190612384929190613820565b5050565b612390612db4565b80601a60006101000a81548160ff02191690831515021790555050565b6060600380546123bc9061497c565b80601f01602080910402602001604051908101604052809291908181526020018280546123e89061497c565b80156124355780601f1061240a57610100808354040283529160200191612435565b820191906000526020600020905b81548152906001019060200180831161241857829003601f168201915b5050505050905090565b6000601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b61249d612e80565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612502576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061250f612e80565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166125bc612e80565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612601919061444c565b60405180910390a35050565b6000601260009054906101000a900460ff16905090565b600080601654111561263a576016549050612640565b600f5490505b90565b61264e84848461111d565b61266d8373ffffffffffffffffffffffffffffffffffffffff16613354565b8015612682575061268084848484612824565b155b156126b9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b60006127298360095484613377565b905092915050565b6013818154811061274157600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606061277b82612e32565b6127ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b190614564565b60405180910390fd5b60006127c46131de565b905060008151116127e45760405180602001604052806000815250612812565b806127ee84612b9d565b600d60405160200161280293929190614337565b6040516020818303038152906040525b915050919050565b6000601054905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261284a612e80565b8786866040518563ffffffff1660e01b815260040161286c9493929190614400565b602060405180830381600087803b15801561288657600080fd5b505af19250505080156128b757506040513d601f19601f820116820180604052508101906128b49190613da0565b60015b612931573d80600081146128e7576040519150601f19603f3d011682016040523d82523d6000602084013e6128ec565b606091505b50600081511415612929576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600b6020528060005260406000206000915054906101000a900460ff1681565b6060601780546129b39061497c565b80601f01602080910402602001604051908101604052809291908181526020018280546129df9061497c565b8015612a2c5780601f10612a0157610100808354040283529160200191612a2c565b820191906000526020600020905b815481529060010190602001808311612a0f57829003601f168201915b5050505050905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60095481565b612ad8612db4565b80602160006101000a81548160ff02191690831515021790555050565b612afd612db4565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b64906144a4565b60405180910390fd5b612b7681613270565b50565b600a8181548110612b8957600080fd5b906000526020600020016000915090505481565b60606000821415612be5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d45565b600082905060005b60008214612c17578080612c00906149df565b915050600a82612c10919061478b565b9150612bed565b60008167ffffffffffffffff811115612c59577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612c8b5781602001600182028036833780820191505090505b5090505b60008514612d3e57600182612ca49190614816565b9150600a85612cb39190614a5e565b6030612cbf9190614735565b60f81b818381518110612cfb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d37919061478b565b9450612c8f565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612dbc612e80565b73ffffffffffffffffffffffffffffffffffffffff16612dda611e86565b73ffffffffffffffffffffffffffffffffffffffff1614612e30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e2790614544565b60405180910390fd5b565b600081612e3d612f3a565b11158015612e4c575060005482105b8015612e79575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b612f4b6138a6565b600082905080612f59612f3a565b11158015612f68575060005481105b1561319b576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161319957600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461307d5780925050506131cd565b5b60011561319857818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146131935780925050506131cd565b61307e565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b50505050565b50505050565b6060600c80546131ed9061497c565b80601f01602080910402602001604051908101604052809291908181526020018280546132199061497c565b80156132665780601f1061323b57610100808354040283529160200191613266565b820191906000526020600020905b81548152906001019060200180831161324957829003601f168201915b5050505050905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61335082826040518060200160405280600081525061338e565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008261338485846133a0565b1490509392505050565b61339b838383600161343b565b505050565b60008082905060005b84518110156134305760008582815181106133ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905080831161340f576134088382613809565b925061341c565b6134198184613809565b92505b508080613428906149df565b9150506133a9565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156134a8576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156134e3576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134f060008683876131d2565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156136ba57506136b98773ffffffffffffffffffffffffffffffffffffffff16613354565b5b15613780575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461372f6000888480600101955088612824565b613765576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156136c057826000541461377b57600080fd5b6137ec565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415613781575b81600081905550505061380260008683876131d8565b5050505050565b600082600052816020526040600020905092915050565b82805461382c9061497c565b90600052602060002090601f01602090048101928261384e5760008555613895565b82601f1061386757805160ff1916838001178555613895565b82800160010185558215613895579182015b82811115613894578251825591602001919060010190613879565b5b5090506138a291906138e9565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156139025760008160009055506001016138ea565b5090565b600061391961391484614644565b61461f565b9050808382526020820190508285602086028201111561393857600080fd5b60005b85811015613968578161394e8882613a57565b84526020840193506020830192505060018101905061393b565b5050509392505050565b600061398561398084614670565b61461f565b90508281526020810184848401111561399d57600080fd5b6139a8848285614910565b509392505050565b60006139c36139be846146a1565b61461f565b9050828152602081018484840111156139db57600080fd5b6139e6848285614910565b509392505050565b6000813590506139fd81614e13565b92915050565b600081359050613a1281614e2a565b92915050565b600082601f830112613a2957600080fd5b8135613a39848260208601613906565b91505092915050565b600081359050613a5181614e41565b92915050565b600081359050613a6681614e58565b92915050565b600081359050613a7b81614e6f565b92915050565b600081519050613a9081614e6f565b92915050565b600082601f830112613aa757600080fd5b8135613ab7848260208601613972565b91505092915050565b600082601f830112613ad157600080fd5b8135613ae18482602086016139b0565b91505092915050565b600081359050613af981614e86565b92915050565b600060208284031215613b1157600080fd5b6000613b1f848285016139ee565b91505092915050565b60008060408385031215613b3b57600080fd5b6000613b49858286016139ee565b9250506020613b5a858286016139ee565b9150509250929050565b600080600060608486031215613b7957600080fd5b6000613b87868287016139ee565b9350506020613b98868287016139ee565b9250506040613ba986828701613aea565b9150509250925092565b60008060008060808587031215613bc957600080fd5b6000613bd7878288016139ee565b9450506020613be8878288016139ee565b9350506040613bf987828801613aea565b925050606085013567ffffffffffffffff811115613c1657600080fd5b613c2287828801613a96565b91505092959194509250565b60008060408385031215613c4157600080fd5b6000613c4f858286016139ee565b925050602083013567ffffffffffffffff811115613c6c57600080fd5b613c7885828601613a18565b9150509250929050565b60008060408385031215613c9557600080fd5b6000613ca3858286016139ee565b9250506020613cb485828601613a42565b9150509250929050565b60008060408385031215613cd157600080fd5b6000613cdf858286016139ee565b9250506020613cf085828601613aea565b9150509250929050565b60008060408385031215613d0d57600080fd5b600083013567ffffffffffffffff811115613d2757600080fd5b613d3385828601613a18565b9250506020613d4485828601613a57565b9150509250929050565b600060208284031215613d6057600080fd5b6000613d6e84828501613a42565b91505092915050565b600060208284031215613d8957600080fd5b6000613d9784828501613a6c565b91505092915050565b600060208284031215613db257600080fd5b6000613dc084828501613a81565b91505092915050565b600060208284031215613ddb57600080fd5b600082013567ffffffffffffffff811115613df557600080fd5b613e0184828501613ac0565b91505092915050565b600060208284031215613e1c57600080fd5b6000613e2a84828501613aea565b91505092915050565b600080600080600060a08688031215613e4b57600080fd5b6000613e5988828901613aea565b9550506020613e6a88828901613a03565b9450506040613e7b88828901613aea565b9350506060613e8c88828901613a03565b925050608086013567ffffffffffffffff811115613ea957600080fd5b613eb588828901613a18565b9150509295509295909350565b60008060008060808587031215613ed857600080fd5b6000613ee687828801613aea565b9450506020613ef787828801613a03565b9350506040613f0887828801613aea565b925050606085013567ffffffffffffffff811115613f2557600080fd5b613f3187828801613a18565b91505092959194509250565b60008060408385031215613f5057600080fd5b6000613f5e85828601613aea565b925050602083013567ffffffffffffffff811115613f7b57600080fd5b613f8785828601613ac0565b9150509250929050565b613f9a816148da565b82525050565b613fb1613fac8261485c565b614a3a565b82525050565b613fc08161484a565b82525050565b613fd7613fd28261484a565b614a28565b82525050565b613fe68161486e565b82525050565b613ff58161487a565b82525050565b6000614006826146e7565b61401081856146fd565b935061402081856020860161491f565b61402981614b4b565b840191505092915050565b600061403f826146f2565b6140498185614719565b935061405981856020860161491f565b61406281614b4b565b840191505092915050565b6000614078826146f2565b614082818561472a565b935061409281856020860161491f565b80840191505092915050565b600081546140ab8161497c565b6140b5818661472a565b945060018216600081146140d057600181146140e157614114565b60ff19831686528186019350614114565b6140ea856146d2565b60005b8381101561410c578154818901526001820191506020810190506140ed565b838801955050505b50505092915050565b600061412a602683614719565b915061413582614b69565b604082019050919050565b600061414d601783614719565b915061415882614bb8565b602082019050919050565b6000614170602f83614719565b915061417b82614be1565b604082019050919050565b6000614193601283614719565b915061419e82614c30565b602082019050919050565b60006141b6603983614719565b91506141c182614c59565b604082019050919050565b60006141d9602083614719565b91506141e482614ca8565b602082019050919050565b60006141fc602f83614719565b915061420782614cd1565b604082019050919050565b600061421f601f83614719565b915061422a82614d20565b602082019050919050565b600061424260008361470e565b915061424d82614d49565b600082019050919050565b6000614265603983614719565b915061427082614d4c565b604082019050919050565b6000614288602183614719565b915061429382614d9b565b604082019050919050565b60006142ab601a83614719565b91506142b682614dea565b602082019050919050565b6142ca816148d0565b82525050565b60006142dc8284613fc6565b60148201915081905092915050565b60006142f78284613fa0565b60148201915081905092915050565b6000614312828661406d565b915061431e828561406d565b915061432a828461406d565b9150819050949350505050565b6000614343828661406d565b915061434f828561406d565b915061435b828461409e565b9150819050949350505050565b6000614374828661409e565b9150614380828561406d565b915061438c828461409e565b9150819050949350505050565b60006143a482614235565b9150819050919050565b60006020820190506143c36000830184613fb7565b92915050565b60006060820190506143de6000830186613fb7565b6143eb6020830185613f91565b6143f860408301846142c1565b949350505050565b60006080820190506144156000830187613fb7565b6144226020830186613fb7565b61442f60408301856142c1565b81810360608301526144418184613ffb565b905095945050505050565b60006020820190506144616000830184613fdd565b92915050565b600060208201905061447c6000830184613fec565b92915050565b6000602082019050818103600083015261449c8184614034565b905092915050565b600060208201905081810360008301526144bd8161411d565b9050919050565b600060208201905081810360008301526144dd81614140565b9050919050565b600060208201905081810360008301526144fd81614163565b9050919050565b6000602082019050818103600083015261451d81614186565b9050919050565b6000602082019050818103600083015261453d816141a9565b9050919050565b6000602082019050818103600083015261455d816141cc565b9050919050565b6000602082019050818103600083015261457d816141ef565b9050919050565b6000602082019050818103600083015261459d81614212565b9050919050565b600060208201905081810360008301526145bd81614258565b9050919050565b600060208201905081810360008301526145dd8161427b565b9050919050565b600060208201905081810360008301526145fd8161429e565b9050919050565b600060208201905061461960008301846142c1565b92915050565b600061462961463a565b905061463582826149ae565b919050565b6000604051905090565b600067ffffffffffffffff82111561465f5761465e614b1c565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561468b5761468a614b1c565b5b61469482614b4b565b9050602081019050919050565b600067ffffffffffffffff8211156146bc576146bb614b1c565b5b6146c582614b4b565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614740826148d0565b915061474b836148d0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156147805761477f614a8f565b5b828201905092915050565b6000614796826148d0565b91506147a1836148d0565b9250826147b1576147b0614abe565b5b828204905092915050565b60006147c7826148d0565b91506147d2836148d0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561480b5761480a614a8f565b5b828202905092915050565b6000614821826148d0565b915061482c836148d0565b92508282101561483f5761483e614a8f565b5b828203905092915050565b6000614855826148b0565b9050919050565b6000614867826148b0565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006148e5826148ec565b9050919050565b60006148f7826148fe565b9050919050565b6000614909826148b0565b9050919050565b82818337600083830152505050565b60005b8381101561493d578082015181840152602081019050614922565b8381111561494c576000848401525b50505050565b600061495d826148d0565b9150600082141561497157614970614a8f565b5b600182039050919050565b6000600282049050600182168061499457607f821691505b602082108114156149a8576149a7614aed565b5b50919050565b6149b782614b4b565b810181811067ffffffffffffffff821117156149d6576149d5614b1c565b5b80604052505050565b60006149ea826148d0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614a1d57614a1c614a8f565b5b600182019050919050565b6000614a3382614a4c565b9050919050565b6000614a4582614a4c565b9050919050565b6000614a5782614b5c565b9050919050565b6000614a69826148d0565b9150614a74836148d0565b925082614a8457614a83614abe565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f41646472657373206a612072656976696e64696361646f000000000000000000600082015250565b7f5175616e746964616465206c696d697465206465206d696e7420706f7220636160008201527f7274656972612065786365646964610000000000000000000000000000000000602082015250565b7f4f20636f6e747261746f207061757361646f0000000000000000000000000000600082015250565b7f56616c6f72206461206d696e746167656d206469666572656e746520646f207660008201527f616c6f7220646566696e69646f206e6f20636f6e747261746f00000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f50726563697361206d696e7461722070656c6f206d656e6f732031204e465400600082015250565b50565b7f4e6f206d6f6d656e746f206f2070726f6772616d61206465206166696c69616460008201527f6f7320736520656e636f6e747261206465736174697661646f00000000000000602082015250565b7f5175616e746964616465206c696d697465206465204e4654206578636564696460008201527f6100000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e616f2066617a2070617274652064612057686974656c697374000000000000600082015250565b614e1c8161484a565b8114614e2757600080fd5b50565b614e338161485c565b8114614e3e57600080fd5b50565b614e4a8161486e565b8114614e5557600080fd5b50565b614e618161487a565b8114614e6c57600080fd5b50565b614e7881614884565b8114614e8357600080fd5b50565b614e8f816148d0565b8114614e9a57600080fd5b5056fea26469706673582212202904f4555f7aa7b5cd652e78df9cbc3c1c08d295c48e836c0c5291484d5c136764736f6c63430008040033

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

00000000000000000000000000000000000000000000000000000000000000605e1d85ea08b3d5b07f2cd296c95d8b42aaee0a40d71a4e608b40f60f8b877be800000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d575966487572357a736e38563634654676664473697247483965556933316f417331787a7562617547426e352f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004368747470733a2f2f697066732e696f2f697066732f516d63544b79673833786e4757784e46633658697362634b57713431477a70344363734d76515a4435626273474d0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _initBaseURI (string): https://ipfs.io/ipfs/QmWYfHur5zsn8V64eFvfDsirGH9eUi31oAs1xzubauGBn5/
Arg [1] : _root (bytes32): 0x5e1d85ea08b3d5b07f2cd296c95d8b42aaee0a40d71a4e608b40f60f8b877be8
Arg [2] : _contractURI (string): https://ipfs.io/ipfs/QmcTKyg83xnGWxNFc6XisbcKWq41Gzp4CcsMvQZD5bbsGM

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 5e1d85ea08b3d5b07f2cd296c95d8b42aaee0a40d71a4e608b40f60f8b877be8
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000044
Arg [4] : 68747470733a2f2f697066732e696f2f697066732f516d575966487572357a73
Arg [5] : 6e38563634654676664473697247483965556933316f417331787a7562617547
Arg [6] : 426e352f00000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [8] : 68747470733a2f2f697066732e696f2f697066732f516d63544b79673833786e
Arg [9] : 4757784e46633658697362634b57713431477a70344363734d76515a44356262
Arg [10] : 73474d0000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

66103:10932:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70920:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32516:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68683:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35629:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37269:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68219:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68559:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36832:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70720:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31765:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76127:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41422:2129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68347:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69035:155;;;:::i;:::-;;35955:473;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76366:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74447:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68892:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69847:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71218:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68107:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71407:341;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35437:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70465:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69306:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68456:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69198:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32885:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70821:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10187:103;;;;;;;;;;;;;:::i;:::-;;69941:516;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69429:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74607:1455;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9539:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71756:1986;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73857:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68770:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35789:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71099:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37545:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71320:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69650:189;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76620:412;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67838:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66689:37;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73982:457;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70615:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47166:666;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66277:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73750:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37903:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66214:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69552:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10445:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66240:28;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70920:171;70976:13;71032:7;71041:25;71058:7;71041:16;:25::i;:::-;71068:13;71015:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;71001:82;;70920:171;;;:::o;32516:305::-;32618:4;32670:25;32655:40;;;:11;:40;;;;:105;;;;32727:33;32712:48;;;:11;:48;;;;32655:105;:158;;;;32777:36;32801:11;32777:23;:36::i;:::-;32655:158;32635:178;;32516:305;;;:::o;68683:79::-;9425:13;:11;:13::i;:::-;68748:6:::1;68739;;:15;;;;;;;;;;;;;;;;;;68683:79:::0;:::o;35629:91::-;35674:13;35707:5;35700:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35629:91;:::o;37269:204::-;37337:7;37362:16;37370:7;37362;:16::i;:::-;37357:64;;37387:34;;;;;;;;;;;;;;37357:64;37441:15;:24;37457:7;37441:24;;;;;;;;;;;;;;;;;;;;;37434:31;;37269:204;;;:::o;68219:120::-;9425:13;:11;:13::i;:::-;68325:6:::1;68299:23;:32;;;;68219:120:::0;:::o;68559:116::-;9425:13;:11;:13::i;:::-;68653:14:::1;68637:13;:30;;;;68559:116:::0;:::o;36832:371::-;36905:13;36921:24;36937:7;36921:15;:24::i;:::-;36905:40;;36966:5;36960:11;;:2;:11;;;36956:48;;;36980:24;;;;;;;;;;;;;;36956:48;37037:5;37021:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;37047:37;37064:5;37071:12;:10;:12::i;:::-;37047:16;:37::i;:::-;37046:38;37021:63;37017:138;;;37108:35;;;;;;;;;;;;;;37017:138;37167:28;37176:2;37180:7;37189:5;37167:8;:28::i;:::-;36832:371;;;:::o;70720:93::-;70763:4;70787:10;:18;;;70780:25;;70720:93;:::o;31765:303::-;31809:7;32034:15;:13;:15::i;:::-;32019:12;;32003:13;;:28;:46;31996:53;;31765:303;:::o;76127:170::-;76261:28;76271:4;76277:2;76281:7;76261:9;:28::i;:::-;76127:170;;;:::o;41422:2129::-;41536:35;41574:21;41587:7;41574:12;:21::i;:::-;41536:59;;41634:4;41612:26;;:13;:18;;;:26;;;41608:67;;41647:28;;;;;;;;;;;;;;41608:67;41688:22;41730:4;41714:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;41751:36;41768:4;41774:12;:10;:12::i;:::-;41751:16;:36::i;:::-;41714:73;:126;;;;41828:12;:10;:12::i;:::-;41804:36;;:20;41816:7;41804:11;:20::i;:::-;:36;;;41714:126;41688:153;;41859:17;41854:66;;41885:35;;;;;;;;;;;;;;41854:66;41949:1;41935:16;;:2;:16;;;41931:52;;;41960:23;;;;;;;;;;;;;;41931:52;41996:43;42018:4;42024:2;42028:7;42037:1;41996:21;:43::i;:::-;42104:35;42121:1;42125:7;42134:4;42104:8;:35::i;:::-;42465:1;42435:12;:18;42448:4;42435:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42509:1;42481:12;:16;42494:2;42481:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42527:31;42561:11;:20;42573:7;42561:20;;;;;;;;;;;42527:54;;42612:2;42596:8;:13;;;:18;;;;;;;;;;;;;;;;;;42662:15;42629:8;:23;;;:49;;;;;;;;;;;;;;;;;;42930:19;42962:1;42952:7;:11;42930:33;;42978:31;43012:11;:24;43024:11;43012:24;;;;;;;;;;;42978:58;;43080:1;43055:27;;:8;:13;;;;;;;;;;;;:27;;;43051:384;;;43265:13;;43250:11;:28;43246:174;;43319:4;43303:8;:13;;;:20;;;;;;;;;;;;;;;;;;43372:13;:28;;;43346:8;:23;;;:54;;;;;;;;;;;;;;;;;;43246:174;43051:384;41422:2129;;;43482:7;43478:2;43463:27;;43472:4;43463:27;;;;;;;;;;;;43501:42;43522:4;43528:2;43532:7;43541:1;43501:20;:42::i;:::-;41422:2129;;;;;:::o;68347:101::-;9425:13;:11;:13::i;:::-;68434:6:::1;68416:15;;:24;;;;;;;;;;;;;;;;;;68347:101:::0;:::o;69035:155::-;9425:13;:11;:13::i;:::-;69092:7:::1;69113;:5;:7::i;:::-;69105:21;;69134;69105:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69091:69;;;69179:2;69171:11;;;::::0;::::1;;9449:1;69035:155::o:0;35955:473::-;36048:13;36079:16;36087:7;36079;:16::i;:::-;36074:59;;36104:29;;;;;;;;;;;;;;36074:59;36144:21;36168:10;:8;:10::i;:::-;36144:34;;36193:16;36201:7;36193;:16::i;:::-;36189:104;;;36242:7;36251:25;36268:7;36251:16;:25::i;:::-;36278:13;36225:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36211:82;;;;;36189:104;36336:1;36317:7;36311:21;:26;;:109;;;;;;;;;;;;;;;;;36364:7;36373:25;36390:7;36373:16;:25::i;:::-;36400:13;36347:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36311:109;36304:116;;;35955:473;;;;;:::o;76366:185::-;76504:39;76521:4;76527:2;76531:7;76504:39;;;;;;;;;;;;:16;:39::i;:::-;76366:185;;;:::o;74447:152::-;74534:4;74563:20;:28;74584:6;74563:28;;;;;;;;;;;;;;;;74556:35;;74447:152;;;:::o;68892:135::-;9425:13;:11;:13::i;:::-;69009:10:::1;68979:27;:40;;;;68892:135:::0;:::o;69847:86::-;69892:4;69916:9;;69909:16;;69847:86;:::o;71218:94::-;71269:4;71293:11;;;;;;;;;;;71286:18;;71218:94;:::o;68107:104::-;9425:13;:11;:13::i;:::-;68192:11:::1;68182:7;:21;;;;;;;;;;;;:::i;:::-;;68107:104:::0;:::o;71407:341::-;71490:4;71511:54;71520:5;71555;71538:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;71527:36;;;;;;71511:7;:54::i;:::-;71507:234;;;71587:16;:23;71604:5;71587:23;;;;;;;;;;;;;;;;;;;;;;;;;71583:76;;;71638:5;71631:12;;;;71583:76;71680:4;71673:11;;;;71507:234;71724:5;71717:12;;71407:341;;;;;:::o;35437:125::-;35501:7;35528:21;35541:7;35528:12;:21::i;:::-;:26;;;35521:33;;35437:125;;;:::o;70465:142::-;70539:7;70566:25;:33;70592:6;70566:33;;;;;;;;;;;;;;;;70559:40;;70465:142;;;:::o;69306:115::-;9425:13;:11;:13::i;:::-;69400::::1;69383:14;:30;;;;69306:115:::0;:::o;68456:95::-;68504:4;68528:15;;;;;;;;;;;68521:22;;68456:95;:::o;69198:100::-;9425:13;:11;:13::i;:::-;69280:10:::1;69268:9;:22;;;;69198:100:::0;:::o;32885:206::-;32949:7;32990:1;32973:19;;:5;:19;;;32969:60;;;33001:28;;;;;;;;;;;;;;32969:60;33055:12;:19;33068:5;33055:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;33047:36;;33040:43;;32885:206;;;:::o;70821:91::-;70864:13;70897:7;70890:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70821:91;:::o;10187:103::-;9425:13;:11;:13::i;:::-;10252:30:::1;10279:1;10252:18;:30::i;:::-;10187:103::o:0;69941:516::-;70028:4;70049:55;70058:5;70093:6;70076:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;70065:37;;;;;;70049:7;:55::i;:::-;70045:405;;;70126:16;:24;70143:6;70126:24;;;;;;;;;;;;;;;;;;;;;;;;;70122:86;;;70178:14;;70171:21;;;;70122:86;70370:14;;70363:21;;;;70045:405;70424:14;;70417:21;;69941:516;;;;;:::o;69429:115::-;9425:13;:11;:13::i;:::-;69531:5:::1;69508:11;:20;69520:7;69508:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;69429:115:::0;;:::o;74607:1455::-;74750:26;74779:14;;74750:43;;74808:59;74817:5;74852:10;74835:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;74824:41;;;;;;74808:7;:59::i;:::-;74804:455;;;74889:16;:28;74906:10;74889:28;;;;;;;;;;;;;;;;;;;;;;;;;74885:104;;;74959:14;;74938:35;;74885:104;75165:14;;75144:35;;74804:455;;;75233:14;;75212:35;;74804:455;75314:11;75293:18;:32;;;;:::i;:::-;75279:9;:47;;75271:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;75401:16;75420:9;75401:28;;75463:1;75445:15;:19;75442:557;;;75481:24;75508:25;;75481:52;;75570:1;75551:15;:20;:46;;;;;75575:22;;;;;;;;;;;75551:46;75548:208;;;75622:11;:27;75634:14;75622:27;;;;;;;;;;;;;;;;;;;;;;;;;75618:123;;;75694:27;;75675:46;;75618:123;75548:208;75772:14;75820:3;75801:16;75789:9;:28;;;;:::i;:::-;:34;;;;:::i;:::-;75772:51;;75864:6;75852:9;:18;;;;:::i;:::-;75838:32;;75892:49;75906:10;75918:14;75934:6;75892:49;;;;;;;;:::i;:::-;;;;;;;;75956:14;:23;;:31;75980:6;75956:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75442:557;;;76017:14;;;;;;;;;;;76009:32;;:45;76042:11;76009:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74607:1455;;;;;;:::o;9539:87::-;9585:7;9612:6;;;;;;;;;;;9605:13;;9539:87;:::o;71756:1986::-;72029:6;;;;;;;;;;;72028:7;72020:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;72069:14;72086:13;:11;:13::i;:::-;72069:30;;72132:1;72118:11;:15;72110:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;72224:13;;72202:18;72212:7;72202:9;:18::i;:::-;72188:11;:32;;;;:::i;:::-;:49;;72180:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;72332:9;;72317:11;72308:6;:20;;;;:::i;:::-;:33;;72300:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;72395:15;;;;;;;;;;;72392:215;;;72436:16;:25;72453:7;72436:25;;;;;;;;;;;;;;;;;;;;;;;;;72435:26;72427:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;72512:52;72520:5;72554:7;72537:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;72527:36;;;;;;72512:7;:52::i;:::-;72504:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;72392:215;72641:1;72622:15;:20;72619:144;;;72667:22;;;;;;;;;;;72659:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;72619:144;72779:11;;;;;;;;;;;72775:411;;72812:52;72820:5;72854:7;72837:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;72827:36;;;;;;72812:7;:52::i;:::-;72808:367;;72885:58;72891:11;72904:14;72920:15;72937:5;72885;:58::i;:::-;72808:367;;;72984:14;73001:22;73015:7;73001:13;:22::i;:::-;72984:39;;73057:1;73045:9;:13;73042:118;;;73082:58;73088:11;73101:14;73117:15;73134:5;73082;:58::i;:::-;73042:118;72808:367;;72775:411;73198:33;73246:13;:11;:13::i;:::-;73234:9;;:25;;;;:::i;:::-;73198:61;;73277:9;73289:1;73277:13;;73272:313;73297:11;73292:1;:16;73272:313;;73330:20;:29;73351:7;73330:29;;;;;;;;;;;;;;;;:31;;;;;;;;;:::i;:::-;;;;;;73376:21;73386:7;73395:1;73376:9;:21::i;:::-;73412:18;73442:1;73433:6;:10;;;;:::i;:::-;73412:31;;73458:20;73467:10;73458:8;:20::i;:::-;;73493:27;;;;:::i;:::-;;;73572:1;73535:25;:34;73561:7;73535:34;;;;;;;;;;;;;;;:38;;;;73272:313;73310:3;;;;;:::i;:::-;;;;73272:313;;;;73601:15;;;;;;;;;;;73597:80;;;73661:4;73633:16;:25;73650:7;73633:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;73597:80;73709:25;73687:19;:47;;;;71756:1986;;;;;;;:::o;73857:117::-;9425:13;:11;:13::i;:::-;73954:12:::1;73939;:27;;;;;;;;;;;;:::i;:::-;;73857:117:::0;:::o;68770:114::-;9425:13;:11;:13::i;:::-;68870:6:::1;68845:22;;:31;;;;;;;;;;;;;;;;;;68770:114:::0;:::o;35789:95::-;35836:13;35869:7;35862:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35789:95;:::o;71099:111::-;71159:4;71183:11;:19;71195:6;71183:19;;;;;;;;;;;;;;;;;;;;;;;;;71176:26;;71099:111;;;:::o;37545:287::-;37656:12;:10;:12::i;:::-;37644:24;;:8;:24;;;37640:54;;;37677:17;;;;;;;;;;;;;;37640:54;37752:8;37707:18;:32;37726:12;:10;:12::i;:::-;37707:32;;;;;;;;;;;;;;;:42;37740:8;37707:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;37805:8;37776:48;;37791:12;:10;:12::i;:::-;37776:48;;;37815:8;37776:48;;;;;;:::i;:::-;;;;;;;;37545:287;;:::o;71320:79::-;71361:4;71385:6;;;;;;;;;;;71378:13;;71320:79;:::o;69650:189::-;69704:7;69749:1;69727:19;;:23;69724:81;;;69774:19;;69767:26;;;;69724:81;69822:9;;69815:16;;69650:189;;:::o;76620:412::-;76787:28;76797:4;76803:2;76807:7;76787:9;:28::i;:::-;76830:15;:2;:13;;;:15::i;:::-;:76;;;;;76850:56;76881:4;76887:2;76891:7;76900:5;76850:30;:56::i;:::-;76849:57;76830:76;76826:156;;;76930:40;;;;;;;;;;;;;;76826:156;77016:7;77012:2;76997:27;;77006:4;76997:27;;;;;;;;;;;;76620:412;;;;:::o;67838:145::-;67914:4;67938:37;67957:5;67964:4;;67970;67938:18;:37::i;:::-;67931:44;;67838:145;;;;:::o;66689:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;73982:457::-;74082:13;74131:16;74139:7;74131;:16::i;:::-;74113:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;74231:28;74262:10;:8;:10::i;:::-;74231:41;;74321:1;74296:14;74290:28;:32;:141;;;;;;;;;;;;;;;;;74362:14;74378:18;:7;:16;:18::i;:::-;74398:13;74345:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;74290:141;74283:148;;;73982:457;;;:::o;70615:97::-;70664:7;70691:13;;70684:20;;70615:97;:::o;47166:666::-;47328:4;47365:2;47349:36;;;47386:12;:10;:12::i;:::-;47400:4;47406:7;47415:5;47349:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;47345:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47600:1;47583:6;:13;:18;47579:235;;;47629:40;;;;;;;;;;;;;;47579:235;47772:6;47766:13;47757:6;47753:2;47749:15;47742:38;47345:480;47478:45;;;47468:55;;;:6;:55;;;;47461:62;;;47166:666;;;;;;:::o;66277:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;73750:99::-;73796:13;73829:12;73822:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73750:99;:::o;37903:164::-;38000:4;38024:18;:25;38043:5;38024:25;;;;;;;;;;;;;;;:35;38050:8;38024:35;;;;;;;;;;;;;;;;;;;;;;;;;38017:42;;37903:164;;;;:::o;66214:19::-;;;;:::o;69552:90::-;9425:13;:11;:13::i;:::-;69629:5:::1;69615:11;;:19;;;;;;;;;;;;;;;;;;69552: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;66240: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;38322:174::-;38379:4;38422:7;38403:15;:13;:15::i;:::-;:26;;:53;;;;;38443:13;;38433:7;:23;38403:53;:85;;;;;38461:11;:20;38473:7;38461:20;;;;;;;;;;;:27;;;;;;;;;;;;38460:28;38403:85;38396:92;;38322:174;;;:::o;8090:98::-;8143:7;8170:10;8163:17;;8090:98;:::o;46478:196::-;46620:2;46593:15;:24;46609:7;46593:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;46658:7;46654:2;46638:28;;46647:5;46638:28;;;;;;;;;;;;46478:196;;;:::o;31539:92::-;31595:7;31622:1;31615:8;;31539:92;:::o;34266:1109::-;34328:21;;:::i;:::-;34362:12;34377:7;34362:22;;34445:4;34426:15;:13;:15::i;:::-;:23;;:47;;;;;34460:13;;34453:4;:20;34426:47;34422:886;;;34494:31;34528:11;:17;34540:4;34528:17;;;;;;;;;;;34494:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34569:9;:16;;;34564:729;;34640:1;34614:28;;:9;:14;;;:28;;;34610:101;;34678:9;34671:16;;;;;;34610:101;35013:261;35020:4;35013:261;;;35053:6;;;;;;;;35098:11;:17;35110:4;35098:17;;;;;;;;;;;35086:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35172:1;35146:28;;:9;:14;;;:28;;;35142:109;;35214:9;35207:16;;;;;;35142:109;35013:261;;;34564:729;34422:886;;35336:31;;;;;;;;;;;;;;34266:1109;;;;:::o;48480:159::-;;;;;:::o;49298:158::-;;;;;:::o;67991:108::-;68051:13;68084:7;68077:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67991:108;:::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;38504:104::-;38573:27;38583:2;38587:8;38573:27;;;;;;;;;;;;:9;:27::i;:::-;38504:104;;:::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;38971:163::-;39094:32;39100:2;39104:8;39114:5;39121:4;39094:5;:32::i;:::-;38971: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;39393:1775::-;39532:20;39555:13;;39532:36;;39597:1;39583:16;;:2;:16;;;39579:48;;;39608:19;;;;;;;;;;;;;;39579:48;39654:1;39642:8;:13;39638:44;;;39664:18;;;;;;;;;;;;;;39638:44;39695:61;39725:1;39729:2;39733:12;39747:8;39695:21;:61::i;:::-;40068:8;40033:12;:16;40046:2;40033:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40132:8;40092:12;:16;40105:2;40092:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40191:2;40158:11;:25;40170:12;40158:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;40258:15;40208:11;:25;40220:12;40208:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;40291:20;40314:12;40291:35;;40341:11;40370:8;40355:12;:23;40341:37;;40399:4;:23;;;;;40407:15;:2;:13;;;:15::i;:::-;40399:23;40395:641;;;40443:314;40499:12;40495:2;40474:38;;40491:1;40474:38;;;;;;;;;;;;40540:69;40579:1;40583:2;40587:14;;;;;;40603:5;40540:30;:69::i;:::-;40535:174;;40645:40;;;;;;;;;;;;;;40535:174;40752:3;40736:12;:19;;40443:314;;40838:12;40821:13;;:29;40817:43;;40852:8;;;40817:43;40395:641;;;40901:120;40957:14;;;;;;40953:2;40932:40;;40949:1;40932:40;;;;;;;;;;;;41016:3;41000:12;:19;;40901:120;;40395:641;41066:12;41050:13;:28;;;;39393:1775;;41100:60;41129:1;41133:2;41137:12;41151:8;41100:20;:60::i;:::-;39393: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:1019::-;8906:6;8914;8922;8930;8938;8987:3;8975:9;8966:7;8962:23;8958:33;8955:2;;;9004:1;9001;8994:12;8955:2;9047:1;9072:53;9117:7;9108:6;9097:9;9093:22;9072:53;:::i;:::-;9062:63;;9018:117;9174:2;9200:61;9253:7;9244:6;9233:9;9229:22;9200:61;:::i;:::-;9190:71;;9145:126;9310:2;9336:53;9381:7;9372:6;9361:9;9357:22;9336:53;:::i;:::-;9326:63;;9281:118;9438:2;9464:61;9517:7;9508:6;9497:9;9493:22;9464:61;:::i;:::-;9454:71;;9409:126;9602:3;9591:9;9587:19;9574:33;9634:18;9626:6;9623:30;9620:2;;;9666:1;9663;9656:12;9620:2;9694:78;9764:7;9755:6;9744:9;9740:22;9694:78;:::i;:::-;9684:88;;9545:237;8945:844;;;;;;;;:::o;9795:857::-;9914:6;9922;9930;9938;9987:3;9975:9;9966:7;9962:23;9958:33;9955:2;;;10004:1;10001;9994:12;9955:2;10047:1;10072:53;10117:7;10108:6;10097:9;10093:22;10072:53;:::i;:::-;10062:63;;10018:117;10174:2;10200:61;10253:7;10244:6;10233:9;10229:22;10200:61;:::i;:::-;10190:71;;10145:126;10310:2;10336:53;10381:7;10372:6;10361:9;10357:22;10336:53;:::i;:::-;10326:63;;10281:118;10466:2;10455:9;10451:18;10438:32;10497:18;10489:6;10486:30;10483:2;;;10529:1;10526;10519:12;10483:2;10557:78;10627:7;10618:6;10607:9;10603:22;10557:78;:::i;:::-;10547:88;;10409:236;9945:707;;;;;;;:::o;10658:520::-;10736:6;10744;10793:2;10781:9;10772:7;10768:23;10764:32;10761:2;;;10809:1;10806;10799:12;10761:2;10852:1;10877:53;10922:7;10913:6;10902:9;10898:22;10877:53;:::i;:::-;10867:63;;10823:117;11007:2;10996:9;10992:18;10979:32;11038:18;11030:6;11027:30;11024:2;;;11070:1;11067;11060:12;11024:2;11098:63;11153:7;11144:6;11133:9;11129:22;11098:63;:::i;:::-;11088:73;;10950:221;10751:427;;;;;:::o;11184:147::-;11279:45;11318:5;11279:45;:::i;:::-;11274:3;11267:58;11257:74;;:::o;11337:189::-;11458:61;11486:32;11512:5;11486:32;:::i;:::-;11458:61;:::i;:::-;11453:3;11446:74;11436:90;;:::o;11532:118::-;11619:24;11637:5;11619:24;:::i;:::-;11614:3;11607:37;11597:53;;:::o;11656:157::-;11761:45;11781:24;11799:5;11781:24;:::i;:::-;11761:45;:::i;:::-;11756:3;11749:58;11739:74;;:::o;11819:109::-;11900:21;11915:5;11900:21;:::i;:::-;11895:3;11888:34;11878:50;;:::o;11934:118::-;12021:24;12039:5;12021:24;:::i;:::-;12016:3;12009:37;11999:53;;:::o;12058:360::-;12144:3;12172:38;12204:5;12172:38;:::i;:::-;12226:70;12289:6;12284:3;12226:70;:::i;:::-;12219:77;;12305:52;12350:6;12345:3;12338:4;12331:5;12327:16;12305:52;:::i;:::-;12382:29;12404:6;12382:29;:::i;:::-;12377:3;12373:39;12366:46;;12148:270;;;;;:::o;12424:364::-;12512:3;12540:39;12573:5;12540:39;:::i;:::-;12595:71;12659:6;12654:3;12595:71;:::i;:::-;12588:78;;12675:52;12720:6;12715:3;12708:4;12701:5;12697:16;12675:52;:::i;:::-;12752:29;12774:6;12752:29;:::i;:::-;12747:3;12743:39;12736:46;;12516:272;;;;;:::o;12794:377::-;12900:3;12928:39;12961:5;12928:39;:::i;:::-;12983:89;13065:6;13060:3;12983:89;:::i;:::-;12976:96;;13081:52;13126:6;13121:3;13114:4;13107:5;13103:16;13081:52;:::i;:::-;13158:6;13153:3;13149:16;13142:23;;12904:267;;;;;:::o;13201:845::-;13304:3;13341:5;13335:12;13370:36;13396:9;13370:36;:::i;:::-;13422:89;13504:6;13499:3;13422:89;:::i;:::-;13415:96;;13542:1;13531:9;13527:17;13558:1;13553:137;;;;13704:1;13699:341;;;;13520:520;;13553:137;13637:4;13633:9;13622;13618:25;13613:3;13606:38;13673:6;13668:3;13664:16;13657:23;;13553:137;;13699:341;13766:38;13798:5;13766:38;:::i;:::-;13826:1;13840:154;13854:6;13851:1;13848:13;13840:154;;;13928:7;13922:14;13918:1;13913:3;13909:11;13902:35;13978:1;13969:7;13965:15;13954:26;;13876:4;13873:1;13869:12;13864:17;;13840:154;;;14023:6;14018:3;14014:16;14007:23;;13706:334;;13520:520;;13308:738;;;;;;:::o;14052:366::-;14194:3;14215:67;14279:2;14274:3;14215:67;:::i;:::-;14208:74;;14291:93;14380:3;14291:93;:::i;:::-;14409:2;14404:3;14400:12;14393:19;;14198:220;;;:::o;14424:366::-;14566:3;14587:67;14651:2;14646:3;14587:67;:::i;:::-;14580:74;;14663:93;14752:3;14663:93;:::i;:::-;14781:2;14776:3;14772:12;14765:19;;14570:220;;;:::o;14796:366::-;14938:3;14959:67;15023:2;15018:3;14959:67;:::i;:::-;14952:74;;15035:93;15124:3;15035:93;:::i;:::-;15153:2;15148:3;15144:12;15137:19;;14942:220;;;:::o;15168:366::-;15310:3;15331:67;15395:2;15390:3;15331:67;:::i;:::-;15324:74;;15407:93;15496:3;15407:93;:::i;:::-;15525:2;15520:3;15516:12;15509:19;;15314:220;;;:::o;15540:366::-;15682:3;15703:67;15767:2;15762:3;15703:67;:::i;:::-;15696:74;;15779:93;15868:3;15779:93;:::i;:::-;15897:2;15892:3;15888:12;15881:19;;15686:220;;;:::o;15912:366::-;16054:3;16075:67;16139:2;16134:3;16075:67;:::i;:::-;16068:74;;16151:93;16240:3;16151:93;:::i;:::-;16269:2;16264:3;16260:12;16253:19;;16058:220;;;:::o;16284:366::-;16426:3;16447:67;16511:2;16506:3;16447:67;:::i;:::-;16440:74;;16523:93;16612:3;16523:93;:::i;:::-;16641:2;16636:3;16632:12;16625:19;;16430:220;;;:::o;16656:366::-;16798:3;16819:67;16883:2;16878:3;16819:67;:::i;:::-;16812:74;;16895:93;16984:3;16895:93;:::i;:::-;17013:2;17008:3;17004:12;16997:19;;16802:220;;;:::o;17028:398::-;17187:3;17208:83;17289:1;17284:3;17208:83;:::i;:::-;17201:90;;17300:93;17389:3;17300:93;:::i;:::-;17418:1;17413:3;17409:11;17402:18;;17191:235;;;:::o;17432:366::-;17574:3;17595:67;17659:2;17654:3;17595:67;:::i;:::-;17588:74;;17671:93;17760:3;17671:93;:::i;:::-;17789:2;17784:3;17780:12;17773:19;;17578:220;;;:::o;17804:366::-;17946:3;17967:67;18031:2;18026:3;17967:67;:::i;:::-;17960:74;;18043:93;18132:3;18043:93;:::i;:::-;18161:2;18156:3;18152:12;18145:19;;17950:220;;;:::o;18176:366::-;18318:3;18339:67;18403:2;18398:3;18339:67;:::i;:::-;18332:74;;18415:93;18504:3;18415:93;:::i;:::-;18533:2;18528:3;18524:12;18517:19;;18322:220;;;:::o;18548:118::-;18635:24;18653:5;18635:24;:::i;:::-;18630:3;18623:37;18613:53;;:::o;18672:256::-;18784:3;18799:75;18870:3;18861:6;18799:75;:::i;:::-;18899:2;18894:3;18890:12;18883:19;;18919:3;18912:10;;18788:140;;;;:::o;18934:288::-;19062:3;19077:91;19164:3;19155:6;19077:91;:::i;:::-;19193:2;19188:3;19184:12;19177:19;;19213:3;19206:10;;19066:156;;;;:::o;19228:595::-;19456:3;19478:95;19569:3;19560:6;19478:95;:::i;:::-;19471:102;;19590:95;19681:3;19672:6;19590:95;:::i;:::-;19583:102;;19702:95;19793:3;19784:6;19702:95;:::i;:::-;19695:102;;19814:3;19807:10;;19460:363;;;;;;:::o;19829:589::-;20054:3;20076:95;20167:3;20158:6;20076:95;:::i;:::-;20069:102;;20188:95;20279:3;20270:6;20188:95;:::i;:::-;20181:102;;20300:92;20388:3;20379:6;20300:92;:::i;:::-;20293:99;;20409:3;20402:10;;20058:360;;;;;;:::o;20424:583::-;20646:3;20668:92;20756:3;20747:6;20668:92;:::i;:::-;20661:99;;20777:95;20868:3;20859:6;20777:95;:::i;:::-;20770:102;;20889:92;20977:3;20968:6;20889:92;:::i;:::-;20882:99;;20998:3;20991:10;;20650:357;;;;;;:::o;21013:379::-;21197:3;21219:147;21362:3;21219:147;:::i;:::-;21212:154;;21383:3;21376:10;;21201:191;;;:::o;21398:222::-;21491:4;21529:2;21518:9;21514:18;21506:26;;21542:71;21610:1;21599:9;21595:17;21586:6;21542:71;:::i;:::-;21496:124;;;;:::o;21626:458::-;21783:4;21821:2;21810:9;21806:18;21798:26;;21834:71;21902:1;21891:9;21887:17;21878:6;21834:71;:::i;:::-;21915:80;21991:2;21980:9;21976:18;21967:6;21915:80;:::i;:::-;22005:72;22073:2;22062:9;22058:18;22049:6;22005:72;:::i;:::-;21788:296;;;;;;:::o;22090:640::-;22285:4;22323:3;22312:9;22308:19;22300:27;;22337:71;22405:1;22394:9;22390:17;22381:6;22337:71;:::i;:::-;22418:72;22486:2;22475:9;22471:18;22462:6;22418:72;:::i;:::-;22500;22568:2;22557:9;22553:18;22544:6;22500:72;:::i;:::-;22619:9;22613:4;22609:20;22604:2;22593:9;22589:18;22582:48;22647:76;22718:4;22709:6;22647:76;:::i;:::-;22639:84;;22290:440;;;;;;;:::o;22736:210::-;22823:4;22861:2;22850:9;22846:18;22838:26;;22874:65;22936:1;22925:9;22921:17;22912:6;22874:65;:::i;:::-;22828:118;;;;:::o;22952:222::-;23045:4;23083:2;23072:9;23068:18;23060:26;;23096:71;23164:1;23153:9;23149:17;23140:6;23096:71;:::i;:::-;23050:124;;;;:::o;23180:313::-;23293:4;23331:2;23320:9;23316:18;23308:26;;23380:9;23374:4;23370:20;23366:1;23355:9;23351:17;23344:47;23408:78;23481:4;23472:6;23408:78;:::i;:::-;23400:86;;23298:195;;;;:::o;23499:419::-;23665:4;23703:2;23692:9;23688:18;23680:26;;23752:9;23746:4;23742:20;23738:1;23727:9;23723:17;23716:47;23780:131;23906:4;23780:131;:::i;:::-;23772:139;;23670:248;;;:::o;23924:419::-;24090:4;24128:2;24117:9;24113:18;24105:26;;24177:9;24171:4;24167:20;24163:1;24152:9;24148:17;24141:47;24205:131;24331:4;24205:131;:::i;:::-;24197:139;;24095:248;;;:::o;24349:419::-;24515:4;24553:2;24542:9;24538:18;24530:26;;24602:9;24596:4;24592:20;24588:1;24577:9;24573:17;24566:47;24630:131;24756:4;24630:131;:::i;:::-;24622:139;;24520:248;;;:::o;24774:419::-;24940:4;24978:2;24967:9;24963:18;24955:26;;25027:9;25021:4;25017:20;25013:1;25002:9;24998:17;24991:47;25055:131;25181:4;25055:131;:::i;:::-;25047:139;;24945:248;;;:::o;25199:419::-;25365:4;25403:2;25392:9;25388:18;25380:26;;25452:9;25446:4;25442:20;25438:1;25427:9;25423:17;25416:47;25480:131;25606:4;25480:131;:::i;:::-;25472:139;;25370:248;;;:::o;25624:419::-;25790:4;25828:2;25817:9;25813:18;25805:26;;25877:9;25871:4;25867:20;25863:1;25852:9;25848:17;25841:47;25905:131;26031:4;25905:131;:::i;:::-;25897:139;;25795:248;;;:::o;26049:419::-;26215:4;26253:2;26242:9;26238:18;26230:26;;26302:9;26296:4;26292:20;26288:1;26277:9;26273:17;26266:47;26330:131;26456:4;26330:131;:::i;:::-;26322:139;;26220:248;;;:::o;26474:419::-;26640:4;26678:2;26667:9;26663:18;26655:26;;26727:9;26721:4;26717:20;26713:1;26702:9;26698:17;26691:47;26755:131;26881:4;26755:131;:::i;:::-;26747:139;;26645:248;;;:::o;26899:419::-;27065:4;27103:2;27092:9;27088:18;27080:26;;27152:9;27146:4;27142:20;27138:1;27127:9;27123:17;27116:47;27180:131;27306:4;27180:131;:::i;:::-;27172:139;;27070:248;;;:::o;27324:419::-;27490:4;27528:2;27517:9;27513:18;27505:26;;27577:9;27571:4;27567:20;27563:1;27552:9;27548:17;27541:47;27605:131;27731:4;27605:131;:::i;:::-;27597:139;;27495:248;;;:::o;27749:419::-;27915:4;27953:2;27942:9;27938:18;27930:26;;28002:9;27996:4;27992:20;27988:1;27977:9;27973:17;27966:47;28030:131;28156:4;28030:131;:::i;:::-;28022:139;;27920:248;;;:::o;28174:222::-;28267:4;28305:2;28294:9;28290:18;28282:26;;28318:71;28386:1;28375:9;28371:17;28362:6;28318:71;:::i;:::-;28272:124;;;;:::o;28402:129::-;28436:6;28463:20;;:::i;:::-;28453:30;;28492:33;28520:4;28512:6;28492:33;:::i;:::-;28443:88;;;:::o;28537:75::-;28570:6;28603:2;28597:9;28587:19;;28577:35;:::o;28618:311::-;28695:4;28785:18;28777:6;28774:30;28771:2;;;28807:18;;:::i;:::-;28771:2;28857:4;28849:6;28845:17;28837:25;;28917:4;28911;28907:15;28899:23;;28700:229;;;:::o;28935:307::-;28996:4;29086:18;29078:6;29075:30;29072:2;;;29108:18;;:::i;:::-;29072:2;29146:29;29168:6;29146:29;:::i;:::-;29138:37;;29230:4;29224;29220:15;29212:23;;29001:241;;;:::o;29248:308::-;29310:4;29400:18;29392:6;29389:30;29386:2;;;29422:18;;:::i;:::-;29386:2;29460:29;29482:6;29460:29;:::i;:::-;29452:37;;29544:4;29538;29534:15;29526:23;;29315:241;;;:::o;29562:141::-;29611:4;29634:3;29626:11;;29657:3;29654:1;29647:14;29691:4;29688:1;29678:18;29670:26;;29616:87;;;:::o;29709:98::-;29760:6;29794:5;29788:12;29778:22;;29767:40;;;:::o;29813:99::-;29865:6;29899:5;29893:12;29883:22;;29872:40;;;:::o;29918:168::-;30001:11;30035:6;30030:3;30023:19;30075:4;30070:3;30066:14;30051:29;;30013:73;;;;:::o;30092:147::-;30193:11;30230:3;30215:18;;30205:34;;;;:::o;30245:169::-;30329:11;30363:6;30358:3;30351:19;30403:4;30398:3;30394:14;30379:29;;30341:73;;;;:::o;30420:148::-;30522:11;30559:3;30544:18;;30534:34;;;;:::o;30574:305::-;30614:3;30633:20;30651:1;30633:20;:::i;:::-;30628:25;;30667:20;30685:1;30667:20;:::i;:::-;30662:25;;30821:1;30753:66;30749:74;30746:1;30743:81;30740:2;;;30827:18;;:::i;:::-;30740:2;30871:1;30868;30864:9;30857:16;;30618:261;;;;:::o;30885:185::-;30925:1;30942:20;30960:1;30942:20;:::i;:::-;30937:25;;30976:20;30994:1;30976:20;:::i;:::-;30971:25;;31015:1;31005:2;;31020:18;;:::i;:::-;31005:2;31062:1;31059;31055:9;31050:14;;30927:143;;;;:::o;31076:348::-;31116:7;31139:20;31157:1;31139:20;:::i;:::-;31134:25;;31173:20;31191:1;31173:20;:::i;:::-;31168:25;;31361:1;31293:66;31289:74;31286:1;31283:81;31278:1;31271:9;31264:17;31260:105;31257:2;;;31368:18;;:::i;:::-;31257:2;31416:1;31413;31409:9;31398:20;;31124:300;;;;:::o;31430:191::-;31470:4;31490:20;31508:1;31490:20;:::i;:::-;31485:25;;31524:20;31542:1;31524:20;:::i;:::-;31519:25;;31563:1;31560;31557:8;31554:2;;;31568:18;;:::i;:::-;31554:2;31613:1;31610;31606:9;31598:17;;31475:146;;;;:::o;31627:96::-;31664:7;31693:24;31711:5;31693:24;:::i;:::-;31682:35;;31672:51;;;:::o;31729:104::-;31774:7;31803:24;31821:5;31803:24;:::i;:::-;31792:35;;31782:51;;;:::o;31839:90::-;31873:7;31916:5;31909:13;31902:21;31891:32;;31881:48;;;:::o;31935:77::-;31972:7;32001:5;31990:16;;31980:32;;;:::o;32018:149::-;32054:7;32094:66;32087:5;32083:78;32072:89;;32062:105;;;:::o;32173:126::-;32210:7;32250:42;32243:5;32239:54;32228:65;;32218:81;;;:::o;32305:77::-;32342:7;32371:5;32360:16;;32350:32;;;:::o;32388:134::-;32446:9;32479:37;32510:5;32479:37;:::i;:::-;32466:50;;32456:66;;;:::o;32528:126::-;32578:9;32611:37;32642:5;32611:37;:::i;:::-;32598:50;;32588:66;;;:::o;32660:113::-;32710:9;32743:24;32761:5;32743:24;:::i;:::-;32730:37;;32720:53;;;:::o;32779:154::-;32863:6;32858:3;32853;32840:30;32925:1;32916:6;32911:3;32907:16;32900:27;32830:103;;;:::o;32939:307::-;33007:1;33017:113;33031:6;33028:1;33025:13;33017:113;;;33116:1;33111:3;33107:11;33101:18;33097:1;33092:3;33088:11;33081:39;33053:2;33050:1;33046:10;33041:15;;33017:113;;;33148:6;33145:1;33142:13;33139:2;;;33228:1;33219:6;33214:3;33210:16;33203:27;33139:2;32988:258;;;;:::o;33252:171::-;33291:3;33314:24;33332:5;33314:24;:::i;:::-;33305:33;;33360:4;33353:5;33350:15;33347:2;;;33368:18;;:::i;:::-;33347:2;33415:1;33408:5;33404:13;33397:20;;33295:128;;;:::o;33429:320::-;33473:6;33510:1;33504:4;33500:12;33490:22;;33557:1;33551:4;33547:12;33578:18;33568:2;;33634:4;33626:6;33622:17;33612:27;;33568:2;33696;33688:6;33685:14;33665:18;33662:38;33659:2;;;33715:18;;:::i;:::-;33659:2;33480:269;;;;:::o;33755:281::-;33838:27;33860:4;33838:27;:::i;:::-;33830:6;33826:40;33968:6;33956:10;33953:22;33932:18;33920:10;33917:34;33914:62;33911:2;;;33979:18;;:::i;:::-;33911:2;34019:10;34015:2;34008:22;33798:238;;;:::o;34042:233::-;34081:3;34104:24;34122:5;34104:24;:::i;:::-;34095:33;;34150:66;34143:5;34140:77;34137:2;;;34220:18;;:::i;:::-;34137:2;34267:1;34260:5;34256:13;34249:20;;34085:190;;;:::o;34281:100::-;34320:7;34349:26;34369:5;34349:26;:::i;:::-;34338:37;;34328:53;;;:::o;34387:108::-;34434:7;34463:26;34483:5;34463:26;:::i;:::-;34452:37;;34442:53;;;:::o;34501:94::-;34540:7;34569:20;34583:5;34569:20;:::i;:::-;34558:31;;34548:47;;;:::o;34601:176::-;34633:1;34650:20;34668:1;34650:20;:::i;:::-;34645:25;;34684:20;34702:1;34684:20;:::i;:::-;34679:25;;34723:1;34713:2;;34728:18;;:::i;:::-;34713:2;34769:1;34766;34762:9;34757:14;;34635:142;;;;:::o;34783:180::-;34831:77;34828:1;34821:88;34928:4;34925:1;34918:15;34952:4;34949:1;34942:15;34969:180;35017:77;35014:1;35007:88;35114:4;35111:1;35104:15;35138:4;35135:1;35128:15;35155:180;35203:77;35200:1;35193:88;35300:4;35297:1;35290:15;35324:4;35321:1;35314:15;35341:180;35389:77;35386:1;35379:88;35486:4;35483:1;35476:15;35510:4;35507:1;35500:15;35527:102;35568:6;35619:2;35615:7;35610:2;35603:5;35599:14;35595:28;35585:38;;35575:54;;;:::o;35635:94::-;35668:8;35716:5;35712:2;35708:14;35687:35;;35677:52;;;:::o;35735:225::-;35875:34;35871:1;35863:6;35859:14;35852:58;35944:8;35939:2;35931:6;35927:15;35920:33;35841:119;:::o;35966:173::-;36106:25;36102:1;36094:6;36090:14;36083:49;36072:67;:::o;36145:234::-;36285:34;36281:1;36273:6;36269:14;36262:58;36354:17;36349:2;36341:6;36337:15;36330:42;36251:128;:::o;36385:168::-;36525:20;36521:1;36513:6;36509:14;36502:44;36491:62;:::o;36559:244::-;36699:34;36695:1;36687:6;36683:14;36676:58;36768:27;36763:2;36755:6;36751:15;36744:52;36665:138;:::o;36809:182::-;36949:34;36945:1;36937:6;36933:14;36926:58;36915:76;:::o;36997:234::-;37137:34;37133:1;37125:6;37121:14;37114:58;37206:17;37201:2;37193:6;37189:15;37182:42;37103:128;:::o;37237:181::-;37377:33;37373:1;37365:6;37361:14;37354:57;37343:75;:::o;37424:114::-;37530:8;:::o;37544:244::-;37684:34;37680:1;37672:6;37668:14;37661:58;37753:27;37748:2;37740:6;37736:15;37729:52;37650:138;:::o;37794:220::-;37934:34;37930:1;37922:6;37918:14;37911:58;38003:3;37998:2;37990:6;37986:15;37979:28;37900:114;:::o;38020:176::-;38160:28;38156:1;38148:6;38144:14;38137:52;38126:70;:::o;38202:122::-;38275:24;38293:5;38275:24;:::i;:::-;38268:5;38265:35;38255:2;;38314:1;38311;38304:12;38255:2;38245:79;:::o;38330:138::-;38411:32;38437:5;38411:32;:::i;:::-;38404:5;38401:43;38391:2;;38458:1;38455;38448:12;38391:2;38381:87;:::o;38474:116::-;38544:21;38559:5;38544:21;:::i;:::-;38537:5;38534:32;38524:2;;38580:1;38577;38570:12;38524:2;38514:76;:::o;38596:122::-;38669:24;38687:5;38669:24;:::i;:::-;38662:5;38659:35;38649:2;;38708:1;38705;38698:12;38649:2;38639:79;:::o;38724:120::-;38796:23;38813:5;38796:23;:::i;:::-;38789:5;38786:34;38776:2;;38834:1;38831;38824:12;38776:2;38766:78;:::o;38850:122::-;38923:24;38941:5;38923:24;:::i;:::-;38916:5;38913:35;38903:2;;38962:1;38959;38952:12;38903:2;38893:79;:::o

Swarm Source

ipfs://2904f4555f7aa7b5cd652e78df9cbc3c1c08d295c48e836c0c5291484d5c1367
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.