ETH Price: $3,249.70 (+2.10%)
Gas: 2 Gwei

Token

MOONGRASS (BBC)
 

Overview

Max Total Supply

65 BBC

Holders

42

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
gentletornado.eth
Balance
1 BBC
0x6147ce9d03895f9157bbbc95d197a58ea1ce7b33
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:
MOONGRASS

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

// File: @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/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/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/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/interfaces/IERC2981.sol


// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

// 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/common/ERC2981.sol


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

pragma solidity ^0.8.0;



/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

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


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

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/moongrass.sol


/*
 * ███╗░░░███╗░█████╗░░█████╗░███╗░░██╗░██████╗░██████╗░░█████╗░░██████╗░██████╗
 * ████╗░████║██╔══██╗██╔══██╗████╗░██║██╔════╝░██╔══██╗██╔══██╗██╔════╝██╔════╝
 * ██╔████╔██║██║░░██║██║░░██║██╔██╗██║██║░░██╗░██████╔╝███████║╚█████╗░╚█████╗░
 * ██║╚██╔╝██║██║░░██║██║░░██║██║╚████║██║░░╚██╗██╔══██╗██╔══██║░╚═══██╗░╚═══██╗
 * ██║░╚═╝░██║╚█████╔╝╚█████╔╝██║░╚███║╚██████╔╝██║░░██║██║░░██║██████╔╝██████╔╝
 * ╚═╝░░░░░╚═╝░╚════╝░░╚════╝░╚═╝░░╚══╝░╚═════╝░╚═╝░░╚═╝╚═╝░░╚═╝╚═════╝░╚═════╝░
*/
pragma solidity >=0.4.22 <0.9.0;






    contract MOONGRASS is ERC721, ERC2981, ERC721Enumerable, Ownable, ReentrancyGuard {
        using Strings for uint256;
        string private baseURI = "";
        string private contractURI = "ipfs://QmYQeD6fy5cvfBonbMU4vMApy4H6NEX868i78vE8nnSuQG";
        string public baseExt=".json";
        uint256 public maxSupply = 10000;
        uint256 public mintPrice=0.12 ether;
        uint256 public giveawayAmount=5 ether;
        uint256 public maxMintsPerWallet = 3;
        bool public isMintEnabled = false;
        bool public isGiveawayEnabled = false;
        bool public revealed = false;
        uint256 public tokenIndex = 0;

    constructor(uint96 _royaltyFeesInBips, string memory _contractURI) ERC721('MOONGRASS', 'BBC'){ 
       contractURI = _contractURI;
       setRoyaltyInfo(msg.sender,  _royaltyFeesInBips);
    }

     function toggleIsMintEnabled() external onlyOwner {
        isMintEnabled = !isMintEnabled;
    }

    function toggleIsRevealed() external onlyOwner {
        revealed = !revealed;
    }

    function toggleisGiveawayEnabled() external onlyOwner {
        isGiveawayEnabled = !isGiveawayEnabled;
    }   
  
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

    function setContractURI(string memory _contractURI) public onlyOwner {
        contractURI = _contractURI;
    }

    function setGiveawayAmount(uint256 _giveawayAmount) external onlyOwner {
        giveawayAmount = _giveawayAmount;
    }

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

    function setMintPrice(uint256 _mintPrice) external onlyOwner {
        mintPrice = _mintPrice;
    }

    function setMaxMintsPerWallet(uint256 _newmaxMintAmount) external onlyOwner {
        maxMintsPerWallet = _newmaxMintAmount;
    }

    function setMaxSupply(uint256 _maxSupply) external onlyOwner {
        maxSupply = _maxSupply;
    }
      
    function setBaseExtension(string memory _newBaseExt) public onlyOwner {
        baseExt = _newBaseExt;
    }

    function tokensOfOwner(address _owner) external view returns (uint256[] memory) {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = tokenOfOwnerByIndex(_owner, index);
            }
            return result;
        }
    }    

    function exists(uint256 _tokenId) external view returns (bool) {
        return _exists(_tokenId);
    }

    function isApprovedOrOwner(address _spender, uint256 _tokenId) external view returns (bool) {
        return _isApprovedOrOwner(_spender, _tokenId);
    }

    function tokenURI(uint256 _tokenId)
    public
    view
    override returns (string memory) 
    {
        require(_exists(_tokenId), 
            "ERC721Metadata: URI query for nonexistent token");
    if(revealed == false) {
        return contractURI;
    }

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

    function LFG(uint256 _mintAmount) public payable nonReentrant {
        require(isMintEnabled, 'Minting is not enabled');
        require(_mintAmount > 0, 'Mint amount must be at least one');
        require(_mintAmount <= maxSupply - tokenIndex, 'Mint amount exceeds maximum supply');

        if (msg.sender != owner()) {
            require(_mintAmount <= maxMintsPerWallet, 'Exceeds maximum mint amount');
            require(balanceOf(msg.sender) < maxMintsPerWallet, 'Each address may only own 3 NFTs');           
            require(msg.value >= mintPrice * _mintAmount, 'Invalid value');
        }

        for (uint256 i = 1; i <= _mintAmount; i++) {
          _letsMint(msg.sender);
        }
    }

    function _letsMint(address userWallet) private {
        tokenIndex++;
        require(!_exists(tokenIndex), 'Token exist');
        _mint(userWallet, tokenIndex);
    }
  
    function withdraw() public payable onlyOwner {
        {
            payable(owner()).transfer(address(this).balance);
        }  
    }

    function _beforeTokenTransfer(address from, address to, uint256 tokenId)
        internal
        override(ERC721, ERC721Enumerable)
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC2981, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }

    function setRoyaltyInfo(address _receiver, uint96 _royaltyFeesInBips) public onlyOwner{
       _setDefaultRoyalty( _receiver, _royaltyFeesInBips);
    }

    function getBalance() public view returns(uint){
        return address(this).balance;
    }

    function random() private view returns (uint) {
        uint selectRandom = uint(keccak256(abi.encodePacked(block.difficulty, block.timestamp, tokenIndex)));
        return selectRandom % tokenIndex;
    }

    function selectAWinner() public payable onlyOwner{
        require(tokenIndex >= 2000, 'not enough holders to run the draw');
        require(isGiveawayEnabled, 'Giveaway is not enabled');
        uint winner = random();
        if (ownerOf(winner) != owner()){
        payable(ownerOf(winner)).transfer(giveawayAmount);
        } 
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint96","name":"_royaltyFeesInBips","type":"uint96"},{"internalType":"string","name":"_contractURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"LFG","outputs":[],"stateMutability":"payable","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":"baseExt","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"giveawayAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"isApprovedOrOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isGiveawayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintsPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"selectAWinner","outputs":[],"stateMutability":"payable","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":"_newBaseExt","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newuri","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":"_giveawayAmount","type":"uint256"}],"name":"setGiveawayAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setMaxMintsPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint96","name":"_royaltyFeesInBips","type":"uint96"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleIsMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleIsRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleisGiveawayEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

608060405260405180602001604052806000815250600e90805190602001906200002b929190620005b0565b506040518060600160405280603581526020016200598560359139600f90805190602001906200005d929190620005b0565b506040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060109080519060200190620000ab929190620005b0565b506127106011556701aa535d3d0c0000601255674563918244f4000060135560036014556000601560006101000a81548160ff0219169083151502179055506000601560016101000a81548160ff0219169083151502179055506000601560026101000a81548160ff02191690831515021790555060006016553480156200013257600080fd5b50604051620059ba380380620059ba8339818101604052810190620001589190620006f5565b6040518060400160405280600981526020017f4d4f4f4e475241535300000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f42424300000000000000000000000000000000000000000000000000000000008152508160009080519060200190620001dc929190620005b0565b508060019080519060200190620001f5929190620005b0565b505050620002186200020c6200025360201b60201c565b6200025b60201b60201c565b6001600d8190555080600f908051906020019062000238929190620005b0565b506200024b33836200032160201b60201c565b505062000a9e565b600033905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003316200034760201b60201c565b620003438282620003d860201b60201c565b5050565b620003576200025360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200037d6200057c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003d6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003cd90620007d0565b60405180910390fd5b565b620003e8620005a660201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111562000449576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200044090620007f2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620004bc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004b39062000814565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600660008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000612710905090565b828054620005be90620008f4565b90600052602060002090601f016020900481019282620005e257600085556200062e565b82601f10620005fd57805160ff19168380011785556200062e565b828001600101855582156200062e579182015b828111156200062d57825182559160200191906001019062000610565b5b5090506200063d919062000641565b5090565b5b808211156200065c57600081600090555060010162000642565b5090565b60006200067762000671846200085f565b62000836565b905082815260208101848484011115620006965762000695620009c3565b5b620006a3848285620008be565b509392505050565b600082601f830112620006c357620006c2620009be565b5b8151620006d584826020860162000660565b91505092915050565b600081519050620006ef8162000a84565b92915050565b600080604083850312156200070f576200070e620009cd565b5b60006200071f85828601620006de565b925050602083015167ffffffffffffffff811115620007435762000742620009c8565b5b6200075185828601620006ab565b9150509250929050565b60006200076a60208362000895565b91506200077782620009e3565b602082019050919050565b600062000791602a8362000895565b91506200079e8262000a0c565b604082019050919050565b6000620007b860198362000895565b9150620007c58262000a5b565b602082019050919050565b60006020820190508181036000830152620007eb816200075b565b9050919050565b600060208201905081810360008301526200080d8162000782565b9050919050565b600060208201905081810360008301526200082f81620007a9565b9050919050565b60006200084262000855565b90506200085082826200092a565b919050565b6000604051905090565b600067ffffffffffffffff8211156200087d576200087c6200098f565b5b6200088882620009d2565b9050602081019050919050565b600082825260208201905092915050565b60006bffffffffffffffffffffffff82169050919050565b60005b83811015620008de578082015181840152602081019050620008c1565b83811115620008ee576000848401525b50505050565b600060028204905060018216806200090d57607f821691505b6020821081141562000924576200092362000960565b5b50919050565b6200093582620009d2565b810181811067ffffffffffffffff821117156200095757620009566200098f565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b62000a8f81620008a6565b811462000a9b57600080fd5b50565b614ed78062000aae6000396000f3fe6080604052600436106102885760003560e01c80636817c76c1161015a578063b88d4fde116100c1578063e36f97a51161007a578063e36f97a514610980578063e985e9c5146109ab578063e9a062d0146109e8578063f2fde38b14610a11578063f4a0a52814610a3a578063f516a2e614610a6357610288565b8063b88d4fde14610884578063c4073217146108ad578063c87b56dd146108c4578063d55f927314610901578063d5abeb011461092c578063da3ef23f1461095757610288565b80638da5cb5b116101135780638da5cb5b146107a9578063921a5879146107d4578063938e3d7b146107de57806395d89b4114610807578063963c354614610832578063a22cb4651461085b57610288565b80636817c76c146106ad5780636f8b44b0146106d857806370a0823114610701578063715018a61461073e578063785d5c49146107555780638462151c1461076c57610288565b80632a55205a116101fe578063430c2081116101b7578063430c2081146105655780634f558e79146105a25780634f6ccce7146105df578063518302271461061c57806355f804b3146106475780636352211e1461067057610288565b80632a55205a146104615780632f745c591461049f57806330eaa6e5146104dc578063346de50a146105075780633ccfd60b1461053257806342842e0e1461053c57610288565b8063095ea7b311610250578063095ea7b31461038657806312065fe0146103af57806318160ddd146103da5780631ad154bf1461040557806321b804201461042157806323b872dd1461043857610288565b806301ffc9a71461028d57806302fa7c47146102ca57806306fdde03146102f3578063077fc0401461031e578063081812fc14610349575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af91906136b6565b610a8e565b6040516102c19190613ea5565b60405180910390f35b3480156102d657600080fd5b506102f160048036038101906102ec9190613676565b610aa0565b005b3480156102ff57600080fd5b50610308610ab6565b6040516103159190613ec0565b60405180910390f35b34801561032a57600080fd5b50610333610b48565b6040516103409190613ec0565b60405180910390f35b34801561035557600080fd5b50610370600480360381019061036b9190613759565b610bd6565b60405161037d9190613df3565b60405180910390f35b34801561039257600080fd5b506103ad60048036038101906103a89190613636565b610c1c565b005b3480156103bb57600080fd5b506103c4610d34565b6040516103d19190614262565b60405180910390f35b3480156103e657600080fd5b506103ef610d3c565b6040516103fc9190614262565b60405180910390f35b61041f600480360381019061041a9190613759565b610d49565b005b34801561042d57600080fd5b50610436610fcd565b005b34801561044457600080fd5b5061045f600480360381019061045a9190613520565b611001565b005b34801561046d57600080fd5b5061048860048036038101906104839190613786565b611061565b604051610496929190613e5a565b60405180910390f35b3480156104ab57600080fd5b506104c660048036038101906104c19190613636565b61124c565b6040516104d39190614262565b60405180910390f35b3480156104e857600080fd5b506104f16112f1565b6040516104fe9190613ea5565b60405180910390f35b34801561051357600080fd5b5061051c611304565b6040516105299190613ea5565b60405180910390f35b61053a611317565b005b34801561054857600080fd5b50610563600480360381019061055e9190613520565b61136f565b005b34801561057157600080fd5b5061058c60048036038101906105879190613636565b61138f565b6040516105999190613ea5565b60405180910390f35b3480156105ae57600080fd5b506105c960048036038101906105c49190613759565b6113a3565b6040516105d69190613ea5565b60405180910390f35b3480156105eb57600080fd5b5061060660048036038101906106019190613759565b6113b5565b6040516106139190614262565b60405180910390f35b34801561062857600080fd5b50610631611426565b60405161063e9190613ea5565b60405180910390f35b34801561065357600080fd5b5061066e60048036038101906106699190613710565b611439565b005b34801561067c57600080fd5b5061069760048036038101906106929190613759565b61145b565b6040516106a49190613df3565b60405180910390f35b3480156106b957600080fd5b506106c261150d565b6040516106cf9190614262565b60405180910390f35b3480156106e457600080fd5b506106ff60048036038101906106fa9190613759565b611513565b005b34801561070d57600080fd5b50610728600480360381019061072391906134b3565b611525565b6040516107359190614262565b60405180910390f35b34801561074a57600080fd5b506107536115dd565b005b34801561076157600080fd5b5061076a6115f1565b005b34801561077857600080fd5b50610793600480360381019061078e91906134b3565b611625565b6040516107a09190613e83565b60405180910390f35b3480156107b557600080fd5b506107be61172f565b6040516107cb9190613df3565b60405180910390f35b6107dc611759565b005b3480156107ea57600080fd5b5061080560048036038101906108009190613710565b61189a565b005b34801561081357600080fd5b5061081c6118bc565b6040516108299190613ec0565b60405180910390f35b34801561083e57600080fd5b5061085960048036038101906108549190613759565b61194e565b005b34801561086757600080fd5b50610882600480360381019061087d91906135f6565b611960565b005b34801561089057600080fd5b506108ab60048036038101906108a69190613573565b611976565b005b3480156108b957600080fd5b506108c26119d8565b005b3480156108d057600080fd5b506108eb60048036038101906108e69190613759565b611a0c565b6040516108f89190613ec0565b60405180910390f35b34801561090d57600080fd5b50610916611b65565b6040516109239190614262565b60405180910390f35b34801561093857600080fd5b50610941611b6b565b60405161094e9190614262565b60405180910390f35b34801561096357600080fd5b5061097e60048036038101906109799190613710565b611b71565b005b34801561098c57600080fd5b50610995611b93565b6040516109a29190614262565b60405180910390f35b3480156109b757600080fd5b506109d260048036038101906109cd91906134e0565b611b99565b6040516109df9190613ea5565b60405180910390f35b3480156109f457600080fd5b50610a0f6004803603810190610a0a9190613759565b611c2d565b005b348015610a1d57600080fd5b50610a386004803603810190610a3391906134b3565b611c3f565b005b348015610a4657600080fd5b50610a616004803603810190610a5c9190613759565b611cc3565b005b348015610a6f57600080fd5b50610a78611cd5565b604051610a859190614262565b60405180910390f35b6000610a9982611cdb565b9050919050565b610aa8611d55565b610ab28282611dd3565b5050565b606060008054610ac590614578565b80601f0160208091040260200160405190810160405280929190818152602001828054610af190614578565b8015610b3e5780601f10610b1357610100808354040283529160200191610b3e565b820191906000526020600020905b815481529060010190602001808311610b2157829003601f168201915b5050505050905090565b60108054610b5590614578565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8190614578565b8015610bce5780601f10610ba357610100808354040283529160200191610bce565b820191906000526020600020905b815481529060010190602001808311610bb157829003601f168201915b505050505081565b6000610be182611f69565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c278261145b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8f90614162565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cb7611fb4565b73ffffffffffffffffffffffffffffffffffffffff161480610ce65750610ce581610ce0611fb4565b611b99565b5b610d25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1c906140a2565b60405180910390fd5b610d2f8383611fbc565b505050565b600047905090565b6000600a80549050905090565b6002600d541415610d8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8690614222565b60405180910390fd5b6002600d81905550601560009054906101000a900460ff16610de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddd90613f02565b60405180910390fd5b60008111610e29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2090614182565b60405180910390fd5b601654601154610e399190614476565b811115610e7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7290613fe2565b60405180910390fd5b610e8361172f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f9757601454811115610efa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef1906141a2565b60405180910390fd5b601454610f0633611525565b10610f46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3d90613f22565b60405180910390fd5b80601254610f54919061441c565b341015610f96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8d90614102565b60405180910390fd5b5b6000600190505b818111610fc157610fae33612075565b8080610fb9906145db565b915050610f9e565b506001600d8190555050565b610fd5611d55565b601560029054906101000a900460ff1615601560026101000a81548160ff021916908315150217905550565b61101261100c611fb4565b826120e7565b611051576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104890614202565b60405180910390fd5b61105c83838361217c565b505050565b6000806000600760008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614156111f75760066040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b60006112016123e3565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661122d919061441c565b61123791906143eb565b90508160000151819350935050509250929050565b600061125783611525565b8210611298576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128f90613f42565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b601560019054906101000a900460ff1681565b601560009054906101000a900460ff1681565b61131f611d55565b61132761172f565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561136c573d6000803e3d6000fd5b50565b61138a83838360405180602001604052806000815250611976565b505050565b600061139b83836120e7565b905092915050565b60006113ae826123ed565b9050919050565b60006113bf610d3c565b8210611400576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f7906141c2565b60405180910390fd5b600a82815481106114145761141361471b565b5b90600052602060002001549050919050565b601560029054906101000a900460ff1681565b611441611d55565b80600e90805190602001906114579291906132b2565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611504576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fb90614142565b60405180910390fd5b80915050919050565b60125481565b61151b611d55565b8060118190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158d90614062565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115e5611d55565b6115ef6000612459565b565b6115f9611d55565b601560019054906101000a900460ff1615601560016101000a81548160ff021916908315150217905550565b6060600061163283611525565b9050600081141561168f57600067ffffffffffffffff8111156116585761165761474a565b5b6040519080825280602002602001820160405280156116865781602001602082028036833780820191505090505b5091505061172a565b60008167ffffffffffffffff8111156116ab576116aa61474a565b5b6040519080825280602002602001820160405280156116d95781602001602082028036833780820191505090505b50905060005b82811015611723576116f1858261124c565b8282815181106117045761170361471b565b5b602002602001018181525050808061171b906145db565b9150506116df565b8193505050505b919050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611761611d55565b6107d060165410156117a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179f90614082565b60405180910390fd5b601560019054906101000a900460ff166117f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ee90613ee2565b60405180910390fd5b600061180161251f565b905061180b61172f565b73ffffffffffffffffffffffffffffffffffffffff1661182a8261145b565b73ffffffffffffffffffffffffffffffffffffffff16146118975761184e8161145b565b73ffffffffffffffffffffffffffffffffffffffff166108fc6013549081150290604051600060405180830381858888f19350505050158015611895573d6000803e3d6000fd5b505b50565b6118a2611d55565b80600f90805190602001906118b89291906132b2565b5050565b6060600180546118cb90614578565b80601f01602080910402602001604051908101604052809291908181526020018280546118f790614578565b80156119445780601f1061191957610100808354040283529160200191611944565b820191906000526020600020905b81548152906001019060200180831161192757829003601f168201915b5050505050905090565b611956611d55565b8060148190555050565b61197261196b611fb4565b8383612568565b5050565b611987611981611fb4565b836120e7565b6119c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bd90614202565b60405180910390fd5b6119d2848484846126d5565b50505050565b6119e0611d55565b601560009054906101000a900460ff1615601560006101000a81548160ff021916908315150217905550565b6060611a17826123ed565b611a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4d90614122565b60405180910390fd5b60001515601560029054906101000a900460ff1615151415611b0457600f8054611a7f90614578565b80601f0160208091040260200160405190810160405280929190818152602001828054611aab90614578565b8015611af85780601f10611acd57610100808354040283529160200191611af8565b820191906000526020600020905b815481529060010190602001808311611adb57829003601f168201915b50505050509050611b60565b6000611b0e612731565b90506000815111611b2e5760405180602001604052806000815250611b5c565b80611b38846127c3565b6010604051602001611b4c93929190613d85565b6040516020818303038152906040525b9150505b919050565b60165481565b60115481565b611b79611d55565b8060109080519060200190611b8f9291906132b2565b5050565b60135481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c35611d55565b8060138190555050565b611c47611d55565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cae90613f82565b60405180910390fd5b611cc081612459565b50565b611ccb611d55565b8060128190555050565b60145481565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d4e5750611d4d82612924565b5b9050919050565b611d5d611fb4565b73ffffffffffffffffffffffffffffffffffffffff16611d7b61172f565b73ffffffffffffffffffffffffffffffffffffffff1614611dd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc8906140e2565b60405180910390fd5b565b611ddb6123e3565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115611e39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e30906141e2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ea9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea090614242565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600660008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b611f72816123ed565b611fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa890614142565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661202f8361145b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60166000815480929190612088906145db565b91905055506120986016546123ed565b156120d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cf90614042565b60405180910390fd5b6120e48160165461299e565b50565b6000806120f38361145b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061213557506121348185611b99565b5b8061217357508373ffffffffffffffffffffffffffffffffffffffff1661215b84610bd6565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661219c8261145b565b73ffffffffffffffffffffffffffffffffffffffff16146121f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e990613fa2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225990614002565b60405180910390fd5b61226d838383612b78565b612278600082611fbc565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122c89190614476565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461231f9190614395565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123de838383612b88565b505050565b6000612710905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080444260165460405160200161253993929190613db6565b6040516020818303038152906040528051906020012060001c905060165481612562919061462e565b91505090565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ce90614022565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516126c89190613ea5565b60405180910390a3505050565b6126e084848461217c565b6126ec84848484612b8d565b61272b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272290613f62565b60405180910390fd5b50505050565b6060600e805461274090614578565b80601f016020809104026020016040519081016040528092919081815260200182805461276c90614578565b80156127b95780601f1061278e576101008083540402835291602001916127b9565b820191906000526020600020905b81548152906001019060200180831161279c57829003601f168201915b5050505050905090565b6060600082141561280b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061291f565b600082905060005b6000821461283d578080612826906145db565b915050600a8261283691906143eb565b9150612813565b60008167ffffffffffffffff8111156128595761285861474a565b5b6040519080825280601f01601f19166020018201604052801561288b5781602001600182028036833780820191505090505b5090505b60008514612918576001826128a49190614476565b9150600a856128b3919061462e565b60306128bf9190614395565b60f81b8183815181106128d5576128d461471b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561291191906143eb565b945061288f565b8093505050505b919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612997575061299682612d24565b5b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a05906140c2565b60405180910390fd5b612a17816123ed565b15612a57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4e90613fc2565b60405180910390fd5b612a6360008383612b78565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ab39190614395565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b7460008383612b88565b5050565b612b83838383612e06565b505050565b505050565b6000612bae8473ffffffffffffffffffffffffffffffffffffffff16612f1a565b15612d17578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612bd7611fb4565b8786866040518563ffffffff1660e01b8152600401612bf99493929190613e0e565b602060405180830381600087803b158015612c1357600080fd5b505af1925050508015612c4457506040513d601f19601f82011682018060405250810190612c4191906136e3565b60015b612cc7573d8060008114612c74576040519150601f19603f3d011682016040523d82523d6000602084013e612c79565b606091505b50600081511415612cbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb690613f62565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d1c565b600190505b949350505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612def57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612dff5750612dfe82612f3d565b5b9050919050565b612e11838383612fa7565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612e5457612e4f81612fac565b612e93565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612e9257612e918382612ff5565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ed657612ed181613162565b612f15565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612f1457612f138282613233565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161300284611525565b61300c9190614476565b90506000600960008481526020019081526020016000205490508181146130f1576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a805490506131769190614476565b90506000600b60008481526020019081526020016000205490506000600a83815481106131a6576131a561471b565b5b9060005260206000200154905080600a83815481106131c8576131c761471b565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a805480613217576132166146ec565b5b6001900381819060005260206000200160009055905550505050565b600061323e83611525565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b8280546132be90614578565b90600052602060002090601f0160209004810192826132e05760008555613327565b82601f106132f957805160ff1916838001178555613327565b82800160010185558215613327579182015b8281111561332657825182559160200191906001019061330b565b5b5090506133349190613338565b5090565b5b80821115613351576000816000905550600101613339565b5090565b6000613368613363846142a2565b61427d565b9050828152602081018484840111156133845761338361477e565b5b61338f848285614536565b509392505050565b60006133aa6133a5846142d3565b61427d565b9050828152602081018484840111156133c6576133c561477e565b5b6133d1848285614536565b509392505050565b6000813590506133e881614e2e565b92915050565b6000813590506133fd81614e45565b92915050565b60008135905061341281614e5c565b92915050565b60008151905061342781614e5c565b92915050565b600082601f83011261344257613441614779565b5b8135613452848260208601613355565b91505092915050565b600082601f8301126134705761346f614779565b5b8135613480848260208601613397565b91505092915050565b60008135905061349881614e73565b92915050565b6000813590506134ad81614e8a565b92915050565b6000602082840312156134c9576134c8614788565b5b60006134d7848285016133d9565b91505092915050565b600080604083850312156134f7576134f6614788565b5b6000613505858286016133d9565b9250506020613516858286016133d9565b9150509250929050565b60008060006060848603121561353957613538614788565b5b6000613547868287016133d9565b9350506020613558868287016133d9565b925050604061356986828701613489565b9150509250925092565b6000806000806080858703121561358d5761358c614788565b5b600061359b878288016133d9565b94505060206135ac878288016133d9565b93505060406135bd87828801613489565b925050606085013567ffffffffffffffff8111156135de576135dd614783565b5b6135ea8782880161342d565b91505092959194509250565b6000806040838503121561360d5761360c614788565b5b600061361b858286016133d9565b925050602061362c858286016133ee565b9150509250929050565b6000806040838503121561364d5761364c614788565b5b600061365b858286016133d9565b925050602061366c85828601613489565b9150509250929050565b6000806040838503121561368d5761368c614788565b5b600061369b858286016133d9565b92505060206136ac8582860161349e565b9150509250929050565b6000602082840312156136cc576136cb614788565b5b60006136da84828501613403565b91505092915050565b6000602082840312156136f9576136f8614788565b5b600061370784828501613418565b91505092915050565b60006020828403121561372657613725614788565b5b600082013567ffffffffffffffff81111561374457613743614783565b5b6137508482850161345b565b91505092915050565b60006020828403121561376f5761376e614788565b5b600061377d84828501613489565b91505092915050565b6000806040838503121561379d5761379c614788565b5b60006137ab85828601613489565b92505060206137bc85828601613489565b9150509250929050565b60006137d28383613d50565b60208301905092915050565b6137e7816144aa565b82525050565b60006137f882614329565b6138028185614357565b935061380d83614304565b8060005b8381101561383e57815161382588826137c6565b97506138308361434a565b925050600181019050613811565b5085935050505092915050565b613854816144bc565b82525050565b600061386582614334565b61386f8185614368565b935061387f818560208601614545565b6138888161478d565b840191505092915050565b600061389e8261433f565b6138a88185614379565b93506138b8818560208601614545565b6138c18161478d565b840191505092915050565b60006138d78261433f565b6138e1818561438a565b93506138f1818560208601614545565b80840191505092915050565b6000815461390a81614578565b613914818661438a565b9450600182166000811461392f576001811461394057613973565b60ff19831686528186019350613973565b61394985614314565b60005b8381101561396b5781548189015260018201915060208101905061394c565b838801955050505b50505092915050565b6000613989601783614379565b91506139948261479e565b602082019050919050565b60006139ac601683614379565b91506139b7826147c7565b602082019050919050565b60006139cf602083614379565b91506139da826147f0565b602082019050919050565b60006139f2602b83614379565b91506139fd82614819565b604082019050919050565b6000613a15603283614379565b9150613a2082614868565b604082019050919050565b6000613a38602683614379565b9150613a43826148b7565b604082019050919050565b6000613a5b602583614379565b9150613a6682614906565b604082019050919050565b6000613a7e601c83614379565b9150613a8982614955565b602082019050919050565b6000613aa1602283614379565b9150613aac8261497e565b604082019050919050565b6000613ac4602483614379565b9150613acf826149cd565b604082019050919050565b6000613ae7601983614379565b9150613af282614a1c565b602082019050919050565b6000613b0a600b83614379565b9150613b1582614a45565b602082019050919050565b6000613b2d602983614379565b9150613b3882614a6e565b604082019050919050565b6000613b50602283614379565b9150613b5b82614abd565b604082019050919050565b6000613b73603e83614379565b9150613b7e82614b0c565b604082019050919050565b6000613b96602083614379565b9150613ba182614b5b565b602082019050919050565b6000613bb9602083614379565b9150613bc482614b84565b602082019050919050565b6000613bdc600d83614379565b9150613be782614bad565b602082019050919050565b6000613bff602f83614379565b9150613c0a82614bd6565b604082019050919050565b6000613c22601883614379565b9150613c2d82614c25565b602082019050919050565b6000613c45602183614379565b9150613c5082614c4e565b604082019050919050565b6000613c68602083614379565b9150613c7382614c9d565b602082019050919050565b6000613c8b601b83614379565b9150613c9682614cc6565b602082019050919050565b6000613cae602c83614379565b9150613cb982614cef565b604082019050919050565b6000613cd1602a83614379565b9150613cdc82614d3e565b604082019050919050565b6000613cf4602e83614379565b9150613cff82614d8d565b604082019050919050565b6000613d17601f83614379565b9150613d2282614ddc565b602082019050919050565b6000613d3a601983614379565b9150613d4582614e05565b602082019050919050565b613d5981614514565b82525050565b613d6881614514565b82525050565b613d7f613d7a82614514565b614624565b82525050565b6000613d9182866138cc565b9150613d9d82856138cc565b9150613da982846138fd565b9150819050949350505050565b6000613dc28286613d6e565b602082019150613dd28285613d6e565b602082019150613de28284613d6e565b602082019150819050949350505050565b6000602082019050613e0860008301846137de565b92915050565b6000608082019050613e2360008301876137de565b613e3060208301866137de565b613e3d6040830185613d5f565b8181036060830152613e4f818461385a565b905095945050505050565b6000604082019050613e6f60008301856137de565b613e7c6020830184613d5f565b9392505050565b60006020820190508181036000830152613e9d81846137ed565b905092915050565b6000602082019050613eba600083018461384b565b92915050565b60006020820190508181036000830152613eda8184613893565b905092915050565b60006020820190508181036000830152613efb8161397c565b9050919050565b60006020820190508181036000830152613f1b8161399f565b9050919050565b60006020820190508181036000830152613f3b816139c2565b9050919050565b60006020820190508181036000830152613f5b816139e5565b9050919050565b60006020820190508181036000830152613f7b81613a08565b9050919050565b60006020820190508181036000830152613f9b81613a2b565b9050919050565b60006020820190508181036000830152613fbb81613a4e565b9050919050565b60006020820190508181036000830152613fdb81613a71565b9050919050565b60006020820190508181036000830152613ffb81613a94565b9050919050565b6000602082019050818103600083015261401b81613ab7565b9050919050565b6000602082019050818103600083015261403b81613ada565b9050919050565b6000602082019050818103600083015261405b81613afd565b9050919050565b6000602082019050818103600083015261407b81613b20565b9050919050565b6000602082019050818103600083015261409b81613b43565b9050919050565b600060208201905081810360008301526140bb81613b66565b9050919050565b600060208201905081810360008301526140db81613b89565b9050919050565b600060208201905081810360008301526140fb81613bac565b9050919050565b6000602082019050818103600083015261411b81613bcf565b9050919050565b6000602082019050818103600083015261413b81613bf2565b9050919050565b6000602082019050818103600083015261415b81613c15565b9050919050565b6000602082019050818103600083015261417b81613c38565b9050919050565b6000602082019050818103600083015261419b81613c5b565b9050919050565b600060208201905081810360008301526141bb81613c7e565b9050919050565b600060208201905081810360008301526141db81613ca1565b9050919050565b600060208201905081810360008301526141fb81613cc4565b9050919050565b6000602082019050818103600083015261421b81613ce7565b9050919050565b6000602082019050818103600083015261423b81613d0a565b9050919050565b6000602082019050818103600083015261425b81613d2d565b9050919050565b60006020820190506142776000830184613d5f565b92915050565b6000614287614298565b905061429382826145aa565b919050565b6000604051905090565b600067ffffffffffffffff8211156142bd576142bc61474a565b5b6142c68261478d565b9050602081019050919050565b600067ffffffffffffffff8211156142ee576142ed61474a565b5b6142f78261478d565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006143a082614514565b91506143ab83614514565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143e0576143df61465f565b5b828201905092915050565b60006143f682614514565b915061440183614514565b9250826144115761441061468e565b5b828204905092915050565b600061442782614514565b915061443283614514565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561446b5761446a61465f565b5b828202905092915050565b600061448182614514565b915061448c83614514565b92508282101561449f5761449e61465f565b5b828203905092915050565b60006144b5826144f4565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015614563578082015181840152602081019050614548565b83811115614572576000848401525b50505050565b6000600282049050600182168061459057607f821691505b602082108114156145a4576145a36146bd565b5b50919050565b6145b38261478d565b810181811067ffffffffffffffff821117156145d2576145d161474a565b5b80604052505050565b60006145e682614514565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156146195761461861465f565b5b600182019050919050565b6000819050919050565b600061463982614514565b915061464483614514565b9250826146545761465361468e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4769766561776179206973206e6f7420656e61626c6564000000000000000000600082015250565b7f4d696e74696e67206973206e6f7420656e61626c656400000000000000000000600082015250565b7f456163682061646472657373206d6179206f6e6c79206f776e2033204e465473600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4d696e7420616d6f756e742065786365656473206d6178696d756d207375707060008201527f6c79000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f546f6b656e206578697374000000000000000000000000000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f6e6f7420656e6f75676820686f6c6465727320746f2072756e2074686520647260008201527f6177000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e76616c69642076616c756500000000000000000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e7420616d6f756e74206d757374206265206174206c65617374206f6e65600082015250565b7f45786365656473206d6178696d756d206d696e7420616d6f756e740000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b614e37816144aa565b8114614e4257600080fd5b50565b614e4e816144bc565b8114614e5957600080fd5b50565b614e65816144c8565b8114614e7057600080fd5b50565b614e7c81614514565b8114614e8757600080fd5b50565b614e938161451e565b8114614e9e57600080fd5b5056fea264697066735822122036b5ff519170ad3298ecdca1deb071c9d67998ecc305f79a7e53caa039489b8664736f6c63430008070033697066733a2f2f516d5951654436667935637666426f6e624d5534764d4170793448364e45583836386937387645386e6e5375514700000000000000000000000000000000000000000000000000000000000000fa00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d5951654436667935637666426f6e624d5534764d4170793448364e45583836386937387645386e6e537551470000000000000000000000

Deployed Bytecode

0x6080604052600436106102885760003560e01c80636817c76c1161015a578063b88d4fde116100c1578063e36f97a51161007a578063e36f97a514610980578063e985e9c5146109ab578063e9a062d0146109e8578063f2fde38b14610a11578063f4a0a52814610a3a578063f516a2e614610a6357610288565b8063b88d4fde14610884578063c4073217146108ad578063c87b56dd146108c4578063d55f927314610901578063d5abeb011461092c578063da3ef23f1461095757610288565b80638da5cb5b116101135780638da5cb5b146107a9578063921a5879146107d4578063938e3d7b146107de57806395d89b4114610807578063963c354614610832578063a22cb4651461085b57610288565b80636817c76c146106ad5780636f8b44b0146106d857806370a0823114610701578063715018a61461073e578063785d5c49146107555780638462151c1461076c57610288565b80632a55205a116101fe578063430c2081116101b7578063430c2081146105655780634f558e79146105a25780634f6ccce7146105df578063518302271461061c57806355f804b3146106475780636352211e1461067057610288565b80632a55205a146104615780632f745c591461049f57806330eaa6e5146104dc578063346de50a146105075780633ccfd60b1461053257806342842e0e1461053c57610288565b8063095ea7b311610250578063095ea7b31461038657806312065fe0146103af57806318160ddd146103da5780631ad154bf1461040557806321b804201461042157806323b872dd1461043857610288565b806301ffc9a71461028d57806302fa7c47146102ca57806306fdde03146102f3578063077fc0401461031e578063081812fc14610349575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af91906136b6565b610a8e565b6040516102c19190613ea5565b60405180910390f35b3480156102d657600080fd5b506102f160048036038101906102ec9190613676565b610aa0565b005b3480156102ff57600080fd5b50610308610ab6565b6040516103159190613ec0565b60405180910390f35b34801561032a57600080fd5b50610333610b48565b6040516103409190613ec0565b60405180910390f35b34801561035557600080fd5b50610370600480360381019061036b9190613759565b610bd6565b60405161037d9190613df3565b60405180910390f35b34801561039257600080fd5b506103ad60048036038101906103a89190613636565b610c1c565b005b3480156103bb57600080fd5b506103c4610d34565b6040516103d19190614262565b60405180910390f35b3480156103e657600080fd5b506103ef610d3c565b6040516103fc9190614262565b60405180910390f35b61041f600480360381019061041a9190613759565b610d49565b005b34801561042d57600080fd5b50610436610fcd565b005b34801561044457600080fd5b5061045f600480360381019061045a9190613520565b611001565b005b34801561046d57600080fd5b5061048860048036038101906104839190613786565b611061565b604051610496929190613e5a565b60405180910390f35b3480156104ab57600080fd5b506104c660048036038101906104c19190613636565b61124c565b6040516104d39190614262565b60405180910390f35b3480156104e857600080fd5b506104f16112f1565b6040516104fe9190613ea5565b60405180910390f35b34801561051357600080fd5b5061051c611304565b6040516105299190613ea5565b60405180910390f35b61053a611317565b005b34801561054857600080fd5b50610563600480360381019061055e9190613520565b61136f565b005b34801561057157600080fd5b5061058c60048036038101906105879190613636565b61138f565b6040516105999190613ea5565b60405180910390f35b3480156105ae57600080fd5b506105c960048036038101906105c49190613759565b6113a3565b6040516105d69190613ea5565b60405180910390f35b3480156105eb57600080fd5b5061060660048036038101906106019190613759565b6113b5565b6040516106139190614262565b60405180910390f35b34801561062857600080fd5b50610631611426565b60405161063e9190613ea5565b60405180910390f35b34801561065357600080fd5b5061066e60048036038101906106699190613710565b611439565b005b34801561067c57600080fd5b5061069760048036038101906106929190613759565b61145b565b6040516106a49190613df3565b60405180910390f35b3480156106b957600080fd5b506106c261150d565b6040516106cf9190614262565b60405180910390f35b3480156106e457600080fd5b506106ff60048036038101906106fa9190613759565b611513565b005b34801561070d57600080fd5b50610728600480360381019061072391906134b3565b611525565b6040516107359190614262565b60405180910390f35b34801561074a57600080fd5b506107536115dd565b005b34801561076157600080fd5b5061076a6115f1565b005b34801561077857600080fd5b50610793600480360381019061078e91906134b3565b611625565b6040516107a09190613e83565b60405180910390f35b3480156107b557600080fd5b506107be61172f565b6040516107cb9190613df3565b60405180910390f35b6107dc611759565b005b3480156107ea57600080fd5b5061080560048036038101906108009190613710565b61189a565b005b34801561081357600080fd5b5061081c6118bc565b6040516108299190613ec0565b60405180910390f35b34801561083e57600080fd5b5061085960048036038101906108549190613759565b61194e565b005b34801561086757600080fd5b50610882600480360381019061087d91906135f6565b611960565b005b34801561089057600080fd5b506108ab60048036038101906108a69190613573565b611976565b005b3480156108b957600080fd5b506108c26119d8565b005b3480156108d057600080fd5b506108eb60048036038101906108e69190613759565b611a0c565b6040516108f89190613ec0565b60405180910390f35b34801561090d57600080fd5b50610916611b65565b6040516109239190614262565b60405180910390f35b34801561093857600080fd5b50610941611b6b565b60405161094e9190614262565b60405180910390f35b34801561096357600080fd5b5061097e60048036038101906109799190613710565b611b71565b005b34801561098c57600080fd5b50610995611b93565b6040516109a29190614262565b60405180910390f35b3480156109b757600080fd5b506109d260048036038101906109cd91906134e0565b611b99565b6040516109df9190613ea5565b60405180910390f35b3480156109f457600080fd5b50610a0f6004803603810190610a0a9190613759565b611c2d565b005b348015610a1d57600080fd5b50610a386004803603810190610a3391906134b3565b611c3f565b005b348015610a4657600080fd5b50610a616004803603810190610a5c9190613759565b611cc3565b005b348015610a6f57600080fd5b50610a78611cd5565b604051610a859190614262565b60405180910390f35b6000610a9982611cdb565b9050919050565b610aa8611d55565b610ab28282611dd3565b5050565b606060008054610ac590614578565b80601f0160208091040260200160405190810160405280929190818152602001828054610af190614578565b8015610b3e5780601f10610b1357610100808354040283529160200191610b3e565b820191906000526020600020905b815481529060010190602001808311610b2157829003601f168201915b5050505050905090565b60108054610b5590614578565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8190614578565b8015610bce5780601f10610ba357610100808354040283529160200191610bce565b820191906000526020600020905b815481529060010190602001808311610bb157829003601f168201915b505050505081565b6000610be182611f69565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c278261145b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8f90614162565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cb7611fb4565b73ffffffffffffffffffffffffffffffffffffffff161480610ce65750610ce581610ce0611fb4565b611b99565b5b610d25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1c906140a2565b60405180910390fd5b610d2f8383611fbc565b505050565b600047905090565b6000600a80549050905090565b6002600d541415610d8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8690614222565b60405180910390fd5b6002600d81905550601560009054906101000a900460ff16610de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddd90613f02565b60405180910390fd5b60008111610e29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2090614182565b60405180910390fd5b601654601154610e399190614476565b811115610e7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7290613fe2565b60405180910390fd5b610e8361172f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f9757601454811115610efa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef1906141a2565b60405180910390fd5b601454610f0633611525565b10610f46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3d90613f22565b60405180910390fd5b80601254610f54919061441c565b341015610f96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8d90614102565b60405180910390fd5b5b6000600190505b818111610fc157610fae33612075565b8080610fb9906145db565b915050610f9e565b506001600d8190555050565b610fd5611d55565b601560029054906101000a900460ff1615601560026101000a81548160ff021916908315150217905550565b61101261100c611fb4565b826120e7565b611051576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104890614202565b60405180910390fd5b61105c83838361217c565b505050565b6000806000600760008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614156111f75760066040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b60006112016123e3565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661122d919061441c565b61123791906143eb565b90508160000151819350935050509250929050565b600061125783611525565b8210611298576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128f90613f42565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b601560019054906101000a900460ff1681565b601560009054906101000a900460ff1681565b61131f611d55565b61132761172f565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561136c573d6000803e3d6000fd5b50565b61138a83838360405180602001604052806000815250611976565b505050565b600061139b83836120e7565b905092915050565b60006113ae826123ed565b9050919050565b60006113bf610d3c565b8210611400576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f7906141c2565b60405180910390fd5b600a82815481106114145761141361471b565b5b90600052602060002001549050919050565b601560029054906101000a900460ff1681565b611441611d55565b80600e90805190602001906114579291906132b2565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611504576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fb90614142565b60405180910390fd5b80915050919050565b60125481565b61151b611d55565b8060118190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158d90614062565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115e5611d55565b6115ef6000612459565b565b6115f9611d55565b601560019054906101000a900460ff1615601560016101000a81548160ff021916908315150217905550565b6060600061163283611525565b9050600081141561168f57600067ffffffffffffffff8111156116585761165761474a565b5b6040519080825280602002602001820160405280156116865781602001602082028036833780820191505090505b5091505061172a565b60008167ffffffffffffffff8111156116ab576116aa61474a565b5b6040519080825280602002602001820160405280156116d95781602001602082028036833780820191505090505b50905060005b82811015611723576116f1858261124c565b8282815181106117045761170361471b565b5b602002602001018181525050808061171b906145db565b9150506116df565b8193505050505b919050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611761611d55565b6107d060165410156117a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179f90614082565b60405180910390fd5b601560019054906101000a900460ff166117f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ee90613ee2565b60405180910390fd5b600061180161251f565b905061180b61172f565b73ffffffffffffffffffffffffffffffffffffffff1661182a8261145b565b73ffffffffffffffffffffffffffffffffffffffff16146118975761184e8161145b565b73ffffffffffffffffffffffffffffffffffffffff166108fc6013549081150290604051600060405180830381858888f19350505050158015611895573d6000803e3d6000fd5b505b50565b6118a2611d55565b80600f90805190602001906118b89291906132b2565b5050565b6060600180546118cb90614578565b80601f01602080910402602001604051908101604052809291908181526020018280546118f790614578565b80156119445780601f1061191957610100808354040283529160200191611944565b820191906000526020600020905b81548152906001019060200180831161192757829003601f168201915b5050505050905090565b611956611d55565b8060148190555050565b61197261196b611fb4565b8383612568565b5050565b611987611981611fb4565b836120e7565b6119c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bd90614202565b60405180910390fd5b6119d2848484846126d5565b50505050565b6119e0611d55565b601560009054906101000a900460ff1615601560006101000a81548160ff021916908315150217905550565b6060611a17826123ed565b611a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4d90614122565b60405180910390fd5b60001515601560029054906101000a900460ff1615151415611b0457600f8054611a7f90614578565b80601f0160208091040260200160405190810160405280929190818152602001828054611aab90614578565b8015611af85780601f10611acd57610100808354040283529160200191611af8565b820191906000526020600020905b815481529060010190602001808311611adb57829003601f168201915b50505050509050611b60565b6000611b0e612731565b90506000815111611b2e5760405180602001604052806000815250611b5c565b80611b38846127c3565b6010604051602001611b4c93929190613d85565b6040516020818303038152906040525b9150505b919050565b60165481565b60115481565b611b79611d55565b8060109080519060200190611b8f9291906132b2565b5050565b60135481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c35611d55565b8060138190555050565b611c47611d55565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cae90613f82565b60405180910390fd5b611cc081612459565b50565b611ccb611d55565b8060128190555050565b60145481565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d4e5750611d4d82612924565b5b9050919050565b611d5d611fb4565b73ffffffffffffffffffffffffffffffffffffffff16611d7b61172f565b73ffffffffffffffffffffffffffffffffffffffff1614611dd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc8906140e2565b60405180910390fd5b565b611ddb6123e3565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115611e39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e30906141e2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ea9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea090614242565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600660008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b611f72816123ed565b611fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa890614142565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661202f8361145b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60166000815480929190612088906145db565b91905055506120986016546123ed565b156120d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cf90614042565b60405180910390fd5b6120e48160165461299e565b50565b6000806120f38361145b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061213557506121348185611b99565b5b8061217357508373ffffffffffffffffffffffffffffffffffffffff1661215b84610bd6565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661219c8261145b565b73ffffffffffffffffffffffffffffffffffffffff16146121f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e990613fa2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225990614002565b60405180910390fd5b61226d838383612b78565b612278600082611fbc565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122c89190614476565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461231f9190614395565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123de838383612b88565b505050565b6000612710905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080444260165460405160200161253993929190613db6565b6040516020818303038152906040528051906020012060001c905060165481612562919061462e565b91505090565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ce90614022565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516126c89190613ea5565b60405180910390a3505050565b6126e084848461217c565b6126ec84848484612b8d565b61272b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272290613f62565b60405180910390fd5b50505050565b6060600e805461274090614578565b80601f016020809104026020016040519081016040528092919081815260200182805461276c90614578565b80156127b95780601f1061278e576101008083540402835291602001916127b9565b820191906000526020600020905b81548152906001019060200180831161279c57829003601f168201915b5050505050905090565b6060600082141561280b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061291f565b600082905060005b6000821461283d578080612826906145db565b915050600a8261283691906143eb565b9150612813565b60008167ffffffffffffffff8111156128595761285861474a565b5b6040519080825280601f01601f19166020018201604052801561288b5781602001600182028036833780820191505090505b5090505b60008514612918576001826128a49190614476565b9150600a856128b3919061462e565b60306128bf9190614395565b60f81b8183815181106128d5576128d461471b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561291191906143eb565b945061288f565b8093505050505b919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612997575061299682612d24565b5b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a05906140c2565b60405180910390fd5b612a17816123ed565b15612a57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4e90613fc2565b60405180910390fd5b612a6360008383612b78565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ab39190614395565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b7460008383612b88565b5050565b612b83838383612e06565b505050565b505050565b6000612bae8473ffffffffffffffffffffffffffffffffffffffff16612f1a565b15612d17578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612bd7611fb4565b8786866040518563ffffffff1660e01b8152600401612bf99493929190613e0e565b602060405180830381600087803b158015612c1357600080fd5b505af1925050508015612c4457506040513d601f19601f82011682018060405250810190612c4191906136e3565b60015b612cc7573d8060008114612c74576040519150601f19603f3d011682016040523d82523d6000602084013e612c79565b606091505b50600081511415612cbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb690613f62565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d1c565b600190505b949350505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612def57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612dff5750612dfe82612f3d565b5b9050919050565b612e11838383612fa7565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612e5457612e4f81612fac565b612e93565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612e9257612e918382612ff5565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ed657612ed181613162565b612f15565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612f1457612f138282613233565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161300284611525565b61300c9190614476565b90506000600960008481526020019081526020016000205490508181146130f1576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a805490506131769190614476565b90506000600b60008481526020019081526020016000205490506000600a83815481106131a6576131a561471b565b5b9060005260206000200154905080600a83815481106131c8576131c761471b565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a805480613217576132166146ec565b5b6001900381819060005260206000200160009055905550505050565b600061323e83611525565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b8280546132be90614578565b90600052602060002090601f0160209004810192826132e05760008555613327565b82601f106132f957805160ff1916838001178555613327565b82800160010185558215613327579182015b8281111561332657825182559160200191906001019061330b565b5b5090506133349190613338565b5090565b5b80821115613351576000816000905550600101613339565b5090565b6000613368613363846142a2565b61427d565b9050828152602081018484840111156133845761338361477e565b5b61338f848285614536565b509392505050565b60006133aa6133a5846142d3565b61427d565b9050828152602081018484840111156133c6576133c561477e565b5b6133d1848285614536565b509392505050565b6000813590506133e881614e2e565b92915050565b6000813590506133fd81614e45565b92915050565b60008135905061341281614e5c565b92915050565b60008151905061342781614e5c565b92915050565b600082601f83011261344257613441614779565b5b8135613452848260208601613355565b91505092915050565b600082601f8301126134705761346f614779565b5b8135613480848260208601613397565b91505092915050565b60008135905061349881614e73565b92915050565b6000813590506134ad81614e8a565b92915050565b6000602082840312156134c9576134c8614788565b5b60006134d7848285016133d9565b91505092915050565b600080604083850312156134f7576134f6614788565b5b6000613505858286016133d9565b9250506020613516858286016133d9565b9150509250929050565b60008060006060848603121561353957613538614788565b5b6000613547868287016133d9565b9350506020613558868287016133d9565b925050604061356986828701613489565b9150509250925092565b6000806000806080858703121561358d5761358c614788565b5b600061359b878288016133d9565b94505060206135ac878288016133d9565b93505060406135bd87828801613489565b925050606085013567ffffffffffffffff8111156135de576135dd614783565b5b6135ea8782880161342d565b91505092959194509250565b6000806040838503121561360d5761360c614788565b5b600061361b858286016133d9565b925050602061362c858286016133ee565b9150509250929050565b6000806040838503121561364d5761364c614788565b5b600061365b858286016133d9565b925050602061366c85828601613489565b9150509250929050565b6000806040838503121561368d5761368c614788565b5b600061369b858286016133d9565b92505060206136ac8582860161349e565b9150509250929050565b6000602082840312156136cc576136cb614788565b5b60006136da84828501613403565b91505092915050565b6000602082840312156136f9576136f8614788565b5b600061370784828501613418565b91505092915050565b60006020828403121561372657613725614788565b5b600082013567ffffffffffffffff81111561374457613743614783565b5b6137508482850161345b565b91505092915050565b60006020828403121561376f5761376e614788565b5b600061377d84828501613489565b91505092915050565b6000806040838503121561379d5761379c614788565b5b60006137ab85828601613489565b92505060206137bc85828601613489565b9150509250929050565b60006137d28383613d50565b60208301905092915050565b6137e7816144aa565b82525050565b60006137f882614329565b6138028185614357565b935061380d83614304565b8060005b8381101561383e57815161382588826137c6565b97506138308361434a565b925050600181019050613811565b5085935050505092915050565b613854816144bc565b82525050565b600061386582614334565b61386f8185614368565b935061387f818560208601614545565b6138888161478d565b840191505092915050565b600061389e8261433f565b6138a88185614379565b93506138b8818560208601614545565b6138c18161478d565b840191505092915050565b60006138d78261433f565b6138e1818561438a565b93506138f1818560208601614545565b80840191505092915050565b6000815461390a81614578565b613914818661438a565b9450600182166000811461392f576001811461394057613973565b60ff19831686528186019350613973565b61394985614314565b60005b8381101561396b5781548189015260018201915060208101905061394c565b838801955050505b50505092915050565b6000613989601783614379565b91506139948261479e565b602082019050919050565b60006139ac601683614379565b91506139b7826147c7565b602082019050919050565b60006139cf602083614379565b91506139da826147f0565b602082019050919050565b60006139f2602b83614379565b91506139fd82614819565b604082019050919050565b6000613a15603283614379565b9150613a2082614868565b604082019050919050565b6000613a38602683614379565b9150613a43826148b7565b604082019050919050565b6000613a5b602583614379565b9150613a6682614906565b604082019050919050565b6000613a7e601c83614379565b9150613a8982614955565b602082019050919050565b6000613aa1602283614379565b9150613aac8261497e565b604082019050919050565b6000613ac4602483614379565b9150613acf826149cd565b604082019050919050565b6000613ae7601983614379565b9150613af282614a1c565b602082019050919050565b6000613b0a600b83614379565b9150613b1582614a45565b602082019050919050565b6000613b2d602983614379565b9150613b3882614a6e565b604082019050919050565b6000613b50602283614379565b9150613b5b82614abd565b604082019050919050565b6000613b73603e83614379565b9150613b7e82614b0c565b604082019050919050565b6000613b96602083614379565b9150613ba182614b5b565b602082019050919050565b6000613bb9602083614379565b9150613bc482614b84565b602082019050919050565b6000613bdc600d83614379565b9150613be782614bad565b602082019050919050565b6000613bff602f83614379565b9150613c0a82614bd6565b604082019050919050565b6000613c22601883614379565b9150613c2d82614c25565b602082019050919050565b6000613c45602183614379565b9150613c5082614c4e565b604082019050919050565b6000613c68602083614379565b9150613c7382614c9d565b602082019050919050565b6000613c8b601b83614379565b9150613c9682614cc6565b602082019050919050565b6000613cae602c83614379565b9150613cb982614cef565b604082019050919050565b6000613cd1602a83614379565b9150613cdc82614d3e565b604082019050919050565b6000613cf4602e83614379565b9150613cff82614d8d565b604082019050919050565b6000613d17601f83614379565b9150613d2282614ddc565b602082019050919050565b6000613d3a601983614379565b9150613d4582614e05565b602082019050919050565b613d5981614514565b82525050565b613d6881614514565b82525050565b613d7f613d7a82614514565b614624565b82525050565b6000613d9182866138cc565b9150613d9d82856138cc565b9150613da982846138fd565b9150819050949350505050565b6000613dc28286613d6e565b602082019150613dd28285613d6e565b602082019150613de28284613d6e565b602082019150819050949350505050565b6000602082019050613e0860008301846137de565b92915050565b6000608082019050613e2360008301876137de565b613e3060208301866137de565b613e3d6040830185613d5f565b8181036060830152613e4f818461385a565b905095945050505050565b6000604082019050613e6f60008301856137de565b613e7c6020830184613d5f565b9392505050565b60006020820190508181036000830152613e9d81846137ed565b905092915050565b6000602082019050613eba600083018461384b565b92915050565b60006020820190508181036000830152613eda8184613893565b905092915050565b60006020820190508181036000830152613efb8161397c565b9050919050565b60006020820190508181036000830152613f1b8161399f565b9050919050565b60006020820190508181036000830152613f3b816139c2565b9050919050565b60006020820190508181036000830152613f5b816139e5565b9050919050565b60006020820190508181036000830152613f7b81613a08565b9050919050565b60006020820190508181036000830152613f9b81613a2b565b9050919050565b60006020820190508181036000830152613fbb81613a4e565b9050919050565b60006020820190508181036000830152613fdb81613a71565b9050919050565b60006020820190508181036000830152613ffb81613a94565b9050919050565b6000602082019050818103600083015261401b81613ab7565b9050919050565b6000602082019050818103600083015261403b81613ada565b9050919050565b6000602082019050818103600083015261405b81613afd565b9050919050565b6000602082019050818103600083015261407b81613b20565b9050919050565b6000602082019050818103600083015261409b81613b43565b9050919050565b600060208201905081810360008301526140bb81613b66565b9050919050565b600060208201905081810360008301526140db81613b89565b9050919050565b600060208201905081810360008301526140fb81613bac565b9050919050565b6000602082019050818103600083015261411b81613bcf565b9050919050565b6000602082019050818103600083015261413b81613bf2565b9050919050565b6000602082019050818103600083015261415b81613c15565b9050919050565b6000602082019050818103600083015261417b81613c38565b9050919050565b6000602082019050818103600083015261419b81613c5b565b9050919050565b600060208201905081810360008301526141bb81613c7e565b9050919050565b600060208201905081810360008301526141db81613ca1565b9050919050565b600060208201905081810360008301526141fb81613cc4565b9050919050565b6000602082019050818103600083015261421b81613ce7565b9050919050565b6000602082019050818103600083015261423b81613d0a565b9050919050565b6000602082019050818103600083015261425b81613d2d565b9050919050565b60006020820190506142776000830184613d5f565b92915050565b6000614287614298565b905061429382826145aa565b919050565b6000604051905090565b600067ffffffffffffffff8211156142bd576142bc61474a565b5b6142c68261478d565b9050602081019050919050565b600067ffffffffffffffff8211156142ee576142ed61474a565b5b6142f78261478d565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006143a082614514565b91506143ab83614514565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143e0576143df61465f565b5b828201905092915050565b60006143f682614514565b915061440183614514565b9250826144115761441061468e565b5b828204905092915050565b600061442782614514565b915061443283614514565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561446b5761446a61465f565b5b828202905092915050565b600061448182614514565b915061448c83614514565b92508282101561449f5761449e61465f565b5b828203905092915050565b60006144b5826144f4565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015614563578082015181840152602081019050614548565b83811115614572576000848401525b50505050565b6000600282049050600182168061459057607f821691505b602082108114156145a4576145a36146bd565b5b50919050565b6145b38261478d565b810181811067ffffffffffffffff821117156145d2576145d161474a565b5b80604052505050565b60006145e682614514565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156146195761461861465f565b5b600182019050919050565b6000819050919050565b600061463982614514565b915061464483614514565b9250826146545761465361468e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4769766561776179206973206e6f7420656e61626c6564000000000000000000600082015250565b7f4d696e74696e67206973206e6f7420656e61626c656400000000000000000000600082015250565b7f456163682061646472657373206d6179206f6e6c79206f776e2033204e465473600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4d696e7420616d6f756e742065786365656473206d6178696d756d207375707060008201527f6c79000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f546f6b656e206578697374000000000000000000000000000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f6e6f7420656e6f75676820686f6c6465727320746f2072756e2074686520647260008201527f6177000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e76616c69642076616c756500000000000000000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e7420616d6f756e74206d757374206265206174206c65617374206f6e65600082015250565b7f45786365656473206d6178696d756d206d696e7420616d6f756e740000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b614e37816144aa565b8114614e4257600080fd5b50565b614e4e816144bc565b8114614e5957600080fd5b50565b614e65816144c8565b8114614e7057600080fd5b50565b614e7c81614514565b8114614e8757600080fd5b50565b614e938161451e565b8114614e9e57600080fd5b5056fea264697066735822122036b5ff519170ad3298ecdca1deb071c9d67998ecc305f79a7e53caa039489b8664736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000fa00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d5951654436667935637666426f6e624d5534764d4170793448364e45583836386937387645386e6e537551470000000000000000000000

-----Decoded View---------------
Arg [0] : _royaltyFeesInBips (uint96): 250
Arg [1] : _contractURI (string): ipfs://QmYQeD6fy5cvfBonbMU4vMApy4H6NEX868i78vE8nnSuQG

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000fa
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [3] : 697066733a2f2f516d5951654436667935637666426f6e624d5534764d417079
Arg [4] : 3448364e45583836386937387645386e6e537551470000000000000000000000


Deployed Bytecode Sourcemap

55515:5745:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60202:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60431:154;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34589:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55777:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36102:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35619:417;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60593:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48495:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58928:723;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56481:86;;;;;;;;;;;;;:::i;:::-;;36802:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22991:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;48163:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56045:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56001:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59842:140;;;:::i;:::-;;37209:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58287:156;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58173:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48685:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56093:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57067:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34300:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55860:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57425:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34031:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8067:103;;;;;;;;;;;;;:::i;:::-;;56575:111;;;;;;;;;;;;;:::i;:::-;;57659:502;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7419:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60911:344;;;:::i;:::-;;56815:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34758:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57285:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36345:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37465:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56374:99;;;;;;;;;;;;;:::i;:::-;;58451:469;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56132:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55817:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57541:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55906:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36571:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56937:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8325:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57175:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55954:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60202:221;60350:4;60379:36;60403:11;60379:23;:36::i;:::-;60372:43;;60202:221;;;:::o;60431:154::-;7305:13;:11;:13::i;:::-;60527:50:::1;60547:9;60558:18;60527;:50::i;:::-;60431:154:::0;;:::o;34589:100::-;34643:13;34676:5;34669:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34589:100;:::o;55777:29::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36102:171::-;36178:7;36198:23;36213:7;36198:14;:23::i;:::-;36241:15;:24;36257:7;36241:24;;;;;;;;;;;;;;;;;;;;;36234:31;;36102:171;;;:::o;35619:417::-;35700:13;35716:23;35731:7;35716:14;:23::i;:::-;35700:39;;35764:5;35758:11;;:2;:11;;;;35750:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;35858:5;35842:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;35867:37;35884:5;35891:12;:10;:12::i;:::-;35867:16;:37::i;:::-;35842:62;35820:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;36007:21;36016:2;36020:7;36007:8;:21::i;:::-;35689:347;35619:417;;:::o;60593:94::-;60635:4;60658:21;60651:28;;60593:94;:::o;48495:113::-;48556:7;48583:10;:17;;;;48576:24;;48495:113;:::o;58928:723::-;1847:1;2445:7;;:19;;2437:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1847:1;2578:7;:18;;;;59009:13:::1;;;;;;;;;;;59001:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;59082:1;59068:11;:15;59060:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;59166:10;;59154:9;;:22;;;;:::i;:::-;59139:11;:37;;59131:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;59246:7;:5;:7::i;:::-;59232:21;;:10;:21;;;59228:315;;59293:17;;59278:11;:32;;59270:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;59389:17;;59365:21;59375:10;59365:9;:21::i;:::-;:41;59357:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;59502:11;59490:9;;:23;;;;:::i;:::-;59477:9;:36;;59469:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;59228:315;59560:9;59572:1;59560:13;;59555:89;59580:11;59575:1;:16;59555:89;;59611:21;59621:10;59611:9;:21::i;:::-;59593:3;;;;;:::i;:::-;;;;59555:89;;;;1803:1:::0;2757:7;:22;;;;58928:723;:::o;56481:86::-;7305:13;:11;:13::i;:::-;56551:8:::1;;;;;;;;;;;56550:9;56539:8;;:20;;;;;;;;;;;;;;;;;;56481:86::o:0;36802:336::-;36997:41;37016:12;:10;:12::i;:::-;37030:7;36997:18;:41::i;:::-;36989:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;37102:28;37112:4;37118:2;37122:7;37102:9;:28::i;:::-;36802:336;;;:::o;22991:442::-;23088:7;23097;23117:26;23146:17;:27;23164:8;23146:27;;;;;;;;;;;23117:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23218:1;23190:30;;:7;:16;;;:30;;;23186:92;;;23247:19;23237:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23186:92;23290:21;23355:17;:15;:17::i;:::-;23314:58;;23328:7;:23;;;23315:36;;:10;:36;;;;:::i;:::-;23314:58;;;;:::i;:::-;23290:82;;23393:7;:16;;;23411:13;23385:40;;;;;;22991:442;;;;;:::o;48163:256::-;48260:7;48296:23;48313:5;48296:16;:23::i;:::-;48288:5;:31;48280:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;48385:12;:19;48398:5;48385:19;;;;;;;;;;;;;;;:26;48405:5;48385:26;;;;;;;;;;;;48378:33;;48163:256;;;;:::o;56045:37::-;;;;;;;;;;;;;:::o;56001:33::-;;;;;;;;;;;;;:::o;59842:140::-;7305:13;:11;:13::i;:::-;59921:7:::1;:5;:7::i;:::-;59913:25;;:48;59939:21;59913:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;59842:140::o:0;37209:185::-;37347:39;37364:4;37370:2;37374:7;37347:39;;;;;;;;;;;;:16;:39::i;:::-;37209:185;;;:::o;58287:156::-;58373:4;58397:38;58416:8;58426;58397:18;:38::i;:::-;58390:45;;58287:156;;;;:::o;58173:106::-;58230:4;58254:17;58262:8;58254:7;:17::i;:::-;58247:24;;58173:106;;;:::o;48685:233::-;48760:7;48796:30;:28;:30::i;:::-;48788:5;:38;48780:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;48893:10;48904:5;48893:17;;;;;;;;:::i;:::-;;;;;;;;;;48886:24;;48685:233;;;:::o;56093:28::-;;;;;;;;;;;;;:::o;57067:99::-;7305:13;:11;:13::i;:::-;57151:7:::1;57140;:18;;;;;;;;;;;;:::i;:::-;;57067:99:::0;:::o;34300:222::-;34372:7;34392:13;34408:7;:16;34416:7;34408:16;;;;;;;;;;;;;;;;;;;;;34392:32;;34460:1;34443:19;;:5;:19;;;;34435:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;34509:5;34502:12;;;34300:222;;;:::o;55860:35::-;;;;:::o;57425:102::-;7305:13;:11;:13::i;:::-;57509:10:::1;57497:9;:22;;;;57425:102:::0;:::o;34031:207::-;34103:7;34148:1;34131:19;;:5;:19;;;;34123:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34214:9;:16;34224:5;34214:16;;;;;;;;;;;;;;;;34207:23;;34031:207;;;:::o;8067:103::-;7305:13;:11;:13::i;:::-;8132:30:::1;8159:1;8132:18;:30::i;:::-;8067:103::o:0;56575:111::-;7305:13;:11;:13::i;:::-;56661:17:::1;;;;;;;;;;;56660:18;56640:17;;:38;;;;;;;;;;;;;;;;;;56575:111::o:0;57659:502::-;57721:16;57750:18;57771:17;57781:6;57771:9;:17::i;:::-;57750:38;;57817:1;57803:10;:15;57799:355;;;57856:1;57842:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57835:23;;;;;57799:355;57891:23;57931:10;57917:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57891:51;;57957:13;57985:130;58009:10;58001:5;:18;57985:130;;;58065:34;58085:6;58093:5;58065:19;:34::i;:::-;58049:6;58056:5;58049:13;;;;;;;;:::i;:::-;;;;;;;:50;;;;;58021:7;;;;;:::i;:::-;;;;57985:130;;;58136:6;58129:13;;;;;57659:502;;;;:::o;7419:87::-;7465:7;7492:6;;;;;;;;;;;7485:13;;7419:87;:::o;60911:344::-;7305:13;:11;:13::i;:::-;60993:4:::1;60979:10;;:18;;60971:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;61055:17;;;;;;;;;;;61047:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;61111:11;61125:8;:6;:8::i;:::-;61111:22;;61167:7;:5;:7::i;:::-;61148:26;;:15;61156:6;61148:7;:15::i;:::-;:26;;;61144:103;;61194:15;61202:6;61194:7;:15::i;:::-;61186:33;;:49;61220:14;;61186:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;61144:103;60960:295;60911:344::o:0;56815:114::-;7305:13;:11;:13::i;:::-;56909:12:::1;56895:11;:26;;;;;;;;;;;;:::i;:::-;;56815:114:::0;:::o;34758:104::-;34814:13;34847:7;34840:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34758:104;:::o;57285:132::-;7305:13;:11;:13::i;:::-;57392:17:::1;57372;:37;;;;57285:132:::0;:::o;36345:155::-;36440:52;36459:12;:10;:12::i;:::-;36473:8;36483;36440:18;:52::i;:::-;36345:155;;:::o;37465:323::-;37639:41;37658:12;:10;:12::i;:::-;37672:7;37639:18;:41::i;:::-;37631:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;37742:38;37756:4;37762:2;37766:7;37775:4;37742:13;:38::i;:::-;37465:323;;;;:::o;56374:99::-;7305:13;:11;:13::i;:::-;56452::::1;;;;;;;;;;;56451:14;56435:13;;:30;;;;;;;;;;;;;;;;;;56374:99::o:0;58451:469::-;58532:13;58572:17;58580:8;58572:7;:17::i;:::-;58564:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;58677:5;58665:17;;:8;;;;;;;;;;;:17;;;58662:59;;;58702:11;58695:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58662:59;58729:28;58760:10;:8;:10::i;:::-;58729:41;;58815:1;58790:14;58784:28;:32;:128;;;;;;;;;;;;;;;;;58852:14;58868:19;:8;:17;:19::i;:::-;58889:7;58835:62;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58784:128;58777:135;;;58451:469;;;;:::o;56132:29::-;;;;:::o;55817:32::-;;;;:::o;57541:110::-;7305:13;:11;:13::i;:::-;57632:11:::1;57622:7;:21;;;;;;;;;;;;:::i;:::-;;57541:110:::0;:::o;55906:37::-;;;;:::o;36571:164::-;36668:4;36692:18;:25;36711:5;36692:25;;;;;;;;;;;;;;;:35;36718:8;36692:35;;;;;;;;;;;;;;;;;;;;;;;;;36685:42;;36571:164;;;;:::o;56937:122::-;7305:13;:11;:13::i;:::-;57036:15:::1;57019:14;:32;;;;56937:122:::0;:::o;8325:201::-;7305:13;:11;:13::i;:::-;8434:1:::1;8414:22;;:8;:22;;;;8406:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;8490:28;8509:8;8490:18;:28::i;:::-;8325:201:::0;:::o;57175:102::-;7305:13;:11;:13::i;:::-;57259:10:::1;57247:9;:22;;;;57175:102:::0;:::o;55954:36::-;;;;:::o;47855:224::-;47957:4;47996:35;47981:50;;;:11;:50;;;;:90;;;;48035:36;48059:11;48035:23;:36::i;:::-;47981:90;47974:97;;47855:224;;;:::o;7584:132::-;7659:12;:10;:12::i;:::-;7648:23;;:7;:5;:7::i;:::-;:23;;;7640:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7584:132::o;24083:332::-;24202:17;:15;:17::i;:::-;24186:33;;:12;:33;;;;24178:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;24305:1;24285:22;;:8;:22;;;;24277:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;24372:35;;;;;;;;24384:8;24372:35;;;;;;24394:12;24372:35;;;;;24350:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24083:332;;:::o;44077:135::-;44159:16;44167:7;44159;:16::i;:::-;44151:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;44077:135;:::o;5970:98::-;6023:7;6050:10;6043:17;;5970:98;:::o;43356:174::-;43458:2;43431:15;:24;43447:7;43431:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;43514:7;43510:2;43476:46;;43485:23;43500:7;43485:14;:23::i;:::-;43476:46;;;;;;;;;;;;43356:174;;:::o;59659:173::-;59717:10;;:12;;;;;;;;;:::i;:::-;;;;;;59749:19;59757:10;;59749:7;:19::i;:::-;59748:20;59740:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;59795:29;59801:10;59813;;59795:5;:29::i;:::-;59659:173;:::o;39589:264::-;39682:4;39699:13;39715:23;39730:7;39715:14;:23::i;:::-;39699:39;;39768:5;39757:16;;:7;:16;;;:52;;;;39777:32;39794:5;39801:7;39777:16;:32::i;:::-;39757:52;:87;;;;39837:7;39813:31;;:20;39825:7;39813:11;:20::i;:::-;:31;;;39757:87;39749:96;;;39589:264;;;;:::o;42612:625::-;42771:4;42744:31;;:23;42759:7;42744:14;:23::i;:::-;:31;;;42736:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;42850:1;42836:16;;:2;:16;;;;42828:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;42906:39;42927:4;42933:2;42937:7;42906:20;:39::i;:::-;43010:29;43027:1;43031:7;43010:8;:29::i;:::-;43071:1;43052:9;:15;43062:4;43052:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;43100:1;43083:9;:13;43093:2;43083:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;43131:2;43112:7;:16;43120:7;43112:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;43170:7;43166:2;43151:27;;43160:4;43151:27;;;;;;;;;;;;43191:38;43211:4;43217:2;43221:7;43191:19;:38::i;:::-;42612:625;;;:::o;23715:97::-;23773:6;23799:5;23792:12;;23715:97;:::o;39295:127::-;39360:4;39412:1;39384:30;;:7;:16;39392:7;39384:16;;;;;;;;;;;;;;;;;;;;;:30;;;;39377:37;;39295:127;;;:::o;8686:191::-;8760:16;8779:6;;;;;;;;;;;8760:25;;8805:8;8796:6;;:17;;;;;;;;;;;;;;;;;;8860:8;8829:40;;8850:8;8829:40;;;;;;;;;;;;8749:128;8686:191;:::o;60695:208::-;60735:4;60752:17;60804:16;60822:15;60839:10;;60787:63;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60777:74;;;;;;60772:80;;60752:100;;60885:10;;60870:12;:25;;;;:::i;:::-;60863:32;;;60695:208;:::o;43673:315::-;43828:8;43819:17;;:5;:17;;;;43811:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;43915:8;43877:18;:25;43896:5;43877:25;;;;;;;;;;;;;;;:35;43903:8;43877:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;43961:8;43939:41;;43954:5;43939:41;;;43971:8;43939:41;;;;;;:::i;:::-;;;;;;;;43673:315;;;:::o;38669:313::-;38825:28;38835:4;38841:2;38845:7;38825:9;:28::i;:::-;38872:47;38895:4;38901:2;38905:7;38914:4;38872:22;:47::i;:::-;38864:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;38669:313;;;;:::o;56699:108::-;56759:13;56792:7;56785:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56699:108;:::o;3224:723::-;3280:13;3510:1;3501:5;:10;3497:53;;;3528:10;;;;;;;;;;;;;;;;;;;;;3497:53;3560:12;3575:5;3560:20;;3591:14;3616:78;3631:1;3623:4;:9;3616:78;;3649:8;;;;;:::i;:::-;;;;3680:2;3672:10;;;;;:::i;:::-;;;3616:78;;;3704:19;3736:6;3726:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3704:39;;3754:154;3770:1;3761:5;:10;3754:154;;3798:1;3788:11;;;;;:::i;:::-;;;3865:2;3857:5;:10;;;;:::i;:::-;3844:2;:24;;;;:::i;:::-;3831:39;;3814:6;3821;3814:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3894:2;3885:11;;;;;:::i;:::-;;;3754:154;;;3932:6;3918:21;;;;;3224:723;;;;:::o;22721:215::-;22823:4;22862:26;22847:41;;;:11;:41;;;;:81;;;;22892:36;22916:11;22892:23;:36::i;:::-;22847:81;22840:88;;22721:215;;;:::o;41187:439::-;41281:1;41267:16;;:2;:16;;;;41259:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;41340:16;41348:7;41340;:16::i;:::-;41339:17;41331:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;41402:45;41431:1;41435:2;41439:7;41402:20;:45::i;:::-;41477:1;41460:9;:13;41470:2;41460:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;41508:2;41489:7;:16;41497:7;41489:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;41553:7;41549:2;41528:33;;41545:1;41528:33;;;;;;;;;;;;41574:44;41602:1;41606:2;41610:7;41574:19;:44::i;:::-;41187:439;;:::o;59990:204::-;60141:45;60168:4;60174:2;60178:7;60141:26;:45::i;:::-;59990:204;;;:::o;46712:125::-;;;;:::o;44776:853::-;44930:4;44951:15;:2;:13;;;:15::i;:::-;44947:675;;;45003:2;44987:36;;;45024:12;:10;:12::i;:::-;45038:4;45044:7;45053:4;44987:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;44983:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45245:1;45228:6;:13;:18;45224:328;;;45271:60;;;;;;;;;;:::i;:::-;;;;;;;;45224:328;45502:6;45496:13;45487:6;45483:2;45479:15;45472:38;44983:584;45119:41;;;45109:51;;;:6;:51;;;;45102:58;;;;;44947:675;45606:4;45599:11;;44776:853;;;;;;;:::o;33662:305::-;33764:4;33816:25;33801:40;;;:11;:40;;;;:105;;;;33873:33;33858:48;;;:11;:48;;;;33801:105;:158;;;;33923:36;33947:11;33923:23;:36::i;:::-;33801:158;33781:178;;33662:305;;;:::o;49531:589::-;49675:45;49702:4;49708:2;49712:7;49675:26;:45::i;:::-;49753:1;49737:18;;:4;:18;;;49733:187;;;49772:40;49804:7;49772:31;:40::i;:::-;49733:187;;;49842:2;49834:10;;:4;:10;;;49830:90;;49861:47;49894:4;49900:7;49861:32;:47::i;:::-;49830:90;49733:187;49948:1;49934:16;;:2;:16;;;49930:183;;;49967:45;50004:7;49967:36;:45::i;:::-;49930:183;;;50040:4;50034:10;;:2;:10;;;50030:83;;50061:40;50089:2;50093:7;50061:27;:40::i;:::-;50030:83;49930:183;49531:589;;;:::o;10117:326::-;10177:4;10434:1;10412:7;:19;;;:23;10405:30;;10117:326;;;:::o;21171:157::-;21256:4;21295:25;21280:40;;;:11;:40;;;;21273:47;;21171:157;;;:::o;46201:126::-;;;;:::o;50843:164::-;50947:10;:17;;;;50920:15;:24;50936:7;50920:24;;;;;;;;;;;:44;;;;50975:10;50991:7;50975:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50843:164;:::o;51634:988::-;51900:22;51950:1;51925:22;51942:4;51925:16;:22::i;:::-;:26;;;;:::i;:::-;51900:51;;51962:18;51983:17;:26;52001:7;51983:26;;;;;;;;;;;;51962:47;;52130:14;52116:10;:28;52112:328;;52161:19;52183:12;:18;52196:4;52183:18;;;;;;;;;;;;;;;:34;52202:14;52183:34;;;;;;;;;;;;52161:56;;52267:11;52234:12;:18;52247:4;52234:18;;;;;;;;;;;;;;;:30;52253:10;52234:30;;;;;;;;;;;:44;;;;52384:10;52351:17;:30;52369:11;52351:30;;;;;;;;;;;:43;;;;52146:294;52112:328;52536:17;:26;52554:7;52536:26;;;;;;;;;;;52529:33;;;52580:12;:18;52593:4;52580:18;;;;;;;;;;;;;;;:34;52599:14;52580:34;;;;;;;;;;;52573:41;;;51715:907;;51634:988;;:::o;52917:1079::-;53170:22;53215:1;53195:10;:17;;;;:21;;;;:::i;:::-;53170:46;;53227:18;53248:15;:24;53264:7;53248:24;;;;;;;;;;;;53227:45;;53599:19;53621:10;53632:14;53621:26;;;;;;;;:::i;:::-;;;;;;;;;;53599:48;;53685:11;53660:10;53671;53660:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;53796:10;53765:15;:28;53781:11;53765:28;;;;;;;;;;;:41;;;;53937:15;:24;53953:7;53937:24;;;;;;;;;;;53930:31;;;53972:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;52988:1008;;;52917:1079;:::o;50421:221::-;50506:14;50523:20;50540:2;50523:16;:20::i;:::-;50506:37;;50581:7;50554:12;:16;50567:2;50554:16;;;;;;;;;;;;;;;:24;50571:6;50554:24;;;;;;;;;;;:34;;;;50628:6;50599:17;:26;50617:7;50599:26;;;;;;;;;;;:35;;;;50495:147;50421:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:137::-;2322:5;2360:6;2347:20;2338:29;;2376:32;2402:5;2376:32;:::i;:::-;2277:137;;;;:::o;2420:329::-;2479:6;2528:2;2516:9;2507:7;2503:23;2499:32;2496:119;;;2534:79;;:::i;:::-;2496:119;2654:1;2679:53;2724:7;2715:6;2704:9;2700:22;2679:53;:::i;:::-;2669:63;;2625:117;2420:329;;;;:::o;2755:474::-;2823:6;2831;2880:2;2868:9;2859:7;2855:23;2851:32;2848:119;;;2886:79;;:::i;:::-;2848:119;3006:1;3031:53;3076:7;3067:6;3056:9;3052:22;3031:53;:::i;:::-;3021:63;;2977:117;3133:2;3159:53;3204:7;3195:6;3184:9;3180:22;3159:53;:::i;:::-;3149:63;;3104:118;2755:474;;;;;:::o;3235:619::-;3312:6;3320;3328;3377:2;3365:9;3356:7;3352:23;3348:32;3345:119;;;3383:79;;:::i;:::-;3345:119;3503:1;3528:53;3573:7;3564:6;3553:9;3549:22;3528:53;:::i;:::-;3518:63;;3474:117;3630:2;3656:53;3701:7;3692:6;3681:9;3677:22;3656:53;:::i;:::-;3646:63;;3601:118;3758:2;3784:53;3829:7;3820:6;3809:9;3805:22;3784:53;:::i;:::-;3774:63;;3729:118;3235:619;;;;;:::o;3860:943::-;3955:6;3963;3971;3979;4028:3;4016:9;4007:7;4003:23;3999:33;3996:120;;;4035:79;;:::i;:::-;3996:120;4155:1;4180:53;4225:7;4216:6;4205:9;4201:22;4180:53;:::i;:::-;4170:63;;4126:117;4282:2;4308:53;4353:7;4344:6;4333:9;4329:22;4308:53;:::i;:::-;4298:63;;4253:118;4410:2;4436:53;4481:7;4472:6;4461:9;4457:22;4436:53;:::i;:::-;4426:63;;4381:118;4566:2;4555:9;4551:18;4538:32;4597:18;4589:6;4586:30;4583:117;;;4619:79;;:::i;:::-;4583:117;4724:62;4778:7;4769:6;4758:9;4754:22;4724:62;:::i;:::-;4714:72;;4509:287;3860:943;;;;;;;:::o;4809:468::-;4874:6;4882;4931:2;4919:9;4910:7;4906:23;4902:32;4899:119;;;4937:79;;:::i;:::-;4899:119;5057:1;5082:53;5127:7;5118:6;5107:9;5103:22;5082:53;:::i;:::-;5072:63;;5028:117;5184:2;5210:50;5252:7;5243:6;5232:9;5228:22;5210:50;:::i;:::-;5200:60;;5155:115;4809:468;;;;;:::o;5283:474::-;5351:6;5359;5408:2;5396:9;5387:7;5383:23;5379:32;5376:119;;;5414:79;;:::i;:::-;5376:119;5534:1;5559:53;5604:7;5595:6;5584:9;5580:22;5559:53;:::i;:::-;5549:63;;5505:117;5661:2;5687:53;5732:7;5723:6;5712:9;5708:22;5687:53;:::i;:::-;5677:63;;5632:118;5283:474;;;;;:::o;5763:472::-;5830:6;5838;5887:2;5875:9;5866:7;5862:23;5858:32;5855:119;;;5893:79;;:::i;:::-;5855:119;6013:1;6038:53;6083:7;6074:6;6063:9;6059:22;6038:53;:::i;:::-;6028:63;;5984:117;6140:2;6166:52;6210:7;6201:6;6190:9;6186:22;6166:52;:::i;:::-;6156:62;;6111:117;5763:472;;;;;:::o;6241:327::-;6299:6;6348:2;6336:9;6327:7;6323:23;6319:32;6316:119;;;6354:79;;:::i;:::-;6316:119;6474:1;6499:52;6543:7;6534:6;6523:9;6519:22;6499:52;:::i;:::-;6489:62;;6445:116;6241:327;;;;:::o;6574:349::-;6643:6;6692:2;6680:9;6671:7;6667:23;6663:32;6660:119;;;6698:79;;:::i;:::-;6660:119;6818:1;6843:63;6898:7;6889:6;6878:9;6874:22;6843:63;:::i;:::-;6833:73;;6789:127;6574:349;;;;:::o;6929:509::-;6998:6;7047:2;7035:9;7026:7;7022:23;7018:32;7015:119;;;7053:79;;:::i;:::-;7015:119;7201:1;7190:9;7186:17;7173:31;7231:18;7223:6;7220:30;7217:117;;;7253:79;;:::i;:::-;7217:117;7358:63;7413:7;7404:6;7393:9;7389:22;7358:63;:::i;:::-;7348:73;;7144:287;6929:509;;;;:::o;7444:329::-;7503:6;7552:2;7540:9;7531:7;7527:23;7523:32;7520:119;;;7558:79;;:::i;:::-;7520:119;7678:1;7703:53;7748:7;7739:6;7728:9;7724:22;7703:53;:::i;:::-;7693:63;;7649:117;7444:329;;;;:::o;7779:474::-;7847:6;7855;7904:2;7892:9;7883:7;7879:23;7875:32;7872:119;;;7910:79;;:::i;:::-;7872:119;8030:1;8055:53;8100:7;8091:6;8080:9;8076:22;8055:53;:::i;:::-;8045:63;;8001:117;8157:2;8183:53;8228:7;8219:6;8208:9;8204:22;8183:53;:::i;:::-;8173:63;;8128:118;7779:474;;;;;:::o;8259:179::-;8328:10;8349:46;8391:3;8383:6;8349:46;:::i;:::-;8427:4;8422:3;8418:14;8404:28;;8259:179;;;;:::o;8444:118::-;8531:24;8549:5;8531:24;:::i;:::-;8526:3;8519:37;8444:118;;:::o;8598:732::-;8717:3;8746:54;8794:5;8746:54;:::i;:::-;8816:86;8895:6;8890:3;8816:86;:::i;:::-;8809:93;;8926:56;8976:5;8926:56;:::i;:::-;9005:7;9036:1;9021:284;9046:6;9043:1;9040:13;9021:284;;;9122:6;9116:13;9149:63;9208:3;9193:13;9149:63;:::i;:::-;9142:70;;9235:60;9288:6;9235:60;:::i;:::-;9225:70;;9081:224;9068:1;9065;9061:9;9056:14;;9021:284;;;9025:14;9321:3;9314:10;;8722:608;;;8598:732;;;;:::o;9336:109::-;9417:21;9432:5;9417:21;:::i;:::-;9412:3;9405:34;9336:109;;:::o;9451:360::-;9537:3;9565:38;9597:5;9565:38;:::i;:::-;9619:70;9682:6;9677:3;9619:70;:::i;:::-;9612:77;;9698:52;9743:6;9738:3;9731:4;9724:5;9720:16;9698:52;:::i;:::-;9775:29;9797:6;9775:29;:::i;:::-;9770:3;9766:39;9759:46;;9541:270;9451:360;;;;:::o;9817:364::-;9905:3;9933:39;9966:5;9933:39;:::i;:::-;9988:71;10052:6;10047:3;9988:71;:::i;:::-;9981:78;;10068:52;10113:6;10108:3;10101:4;10094:5;10090:16;10068:52;:::i;:::-;10145:29;10167:6;10145:29;:::i;:::-;10140:3;10136:39;10129:46;;9909:272;9817:364;;;;:::o;10187:377::-;10293:3;10321:39;10354:5;10321:39;:::i;:::-;10376:89;10458:6;10453:3;10376:89;:::i;:::-;10369:96;;10474:52;10519:6;10514:3;10507:4;10500:5;10496:16;10474:52;:::i;:::-;10551:6;10546:3;10542:16;10535:23;;10297:267;10187:377;;;;:::o;10594:845::-;10697:3;10734:5;10728:12;10763:36;10789:9;10763:36;:::i;:::-;10815:89;10897:6;10892:3;10815:89;:::i;:::-;10808:96;;10935:1;10924:9;10920:17;10951:1;10946:137;;;;11097:1;11092:341;;;;10913:520;;10946:137;11030:4;11026:9;11015;11011:25;11006:3;10999:38;11066:6;11061:3;11057:16;11050:23;;10946:137;;11092:341;11159:38;11191:5;11159:38;:::i;:::-;11219:1;11233:154;11247:6;11244:1;11241:13;11233:154;;;11321:7;11315:14;11311:1;11306:3;11302:11;11295:35;11371:1;11362:7;11358:15;11347:26;;11269:4;11266:1;11262:12;11257:17;;11233:154;;;11416:6;11411:3;11407:16;11400:23;;11099:334;;10913:520;;10701:738;;10594:845;;;;:::o;11445:366::-;11587:3;11608:67;11672:2;11667:3;11608:67;:::i;:::-;11601:74;;11684:93;11773:3;11684:93;:::i;:::-;11802:2;11797:3;11793:12;11786:19;;11445:366;;;:::o;11817:::-;11959:3;11980:67;12044:2;12039:3;11980:67;:::i;:::-;11973:74;;12056:93;12145:3;12056:93;:::i;:::-;12174:2;12169:3;12165:12;12158:19;;11817:366;;;:::o;12189:::-;12331:3;12352:67;12416:2;12411:3;12352:67;:::i;:::-;12345:74;;12428:93;12517:3;12428:93;:::i;:::-;12546:2;12541:3;12537:12;12530:19;;12189:366;;;:::o;12561:::-;12703:3;12724:67;12788:2;12783:3;12724:67;:::i;:::-;12717:74;;12800:93;12889:3;12800:93;:::i;:::-;12918:2;12913:3;12909:12;12902:19;;12561:366;;;:::o;12933:::-;13075:3;13096:67;13160:2;13155:3;13096:67;:::i;:::-;13089:74;;13172:93;13261:3;13172:93;:::i;:::-;13290:2;13285:3;13281:12;13274:19;;12933:366;;;:::o;13305:::-;13447:3;13468:67;13532:2;13527:3;13468:67;:::i;:::-;13461:74;;13544:93;13633:3;13544:93;:::i;:::-;13662:2;13657:3;13653:12;13646:19;;13305:366;;;:::o;13677:::-;13819:3;13840:67;13904:2;13899:3;13840:67;:::i;:::-;13833:74;;13916:93;14005:3;13916:93;:::i;:::-;14034:2;14029:3;14025:12;14018:19;;13677:366;;;:::o;14049:::-;14191:3;14212:67;14276:2;14271:3;14212:67;:::i;:::-;14205:74;;14288:93;14377:3;14288:93;:::i;:::-;14406:2;14401:3;14397:12;14390:19;;14049:366;;;:::o;14421:::-;14563:3;14584:67;14648:2;14643:3;14584:67;:::i;:::-;14577:74;;14660:93;14749:3;14660:93;:::i;:::-;14778:2;14773:3;14769:12;14762:19;;14421:366;;;:::o;14793:::-;14935:3;14956:67;15020:2;15015:3;14956:67;:::i;:::-;14949:74;;15032:93;15121:3;15032:93;:::i;:::-;15150:2;15145:3;15141:12;15134:19;;14793:366;;;:::o;15165:::-;15307:3;15328:67;15392:2;15387:3;15328:67;:::i;:::-;15321:74;;15404:93;15493:3;15404:93;:::i;:::-;15522:2;15517:3;15513:12;15506:19;;15165:366;;;:::o;15537:::-;15679:3;15700:67;15764:2;15759:3;15700:67;:::i;:::-;15693:74;;15776:93;15865:3;15776:93;:::i;:::-;15894:2;15889:3;15885:12;15878:19;;15537:366;;;:::o;15909:::-;16051:3;16072:67;16136:2;16131:3;16072:67;:::i;:::-;16065:74;;16148:93;16237:3;16148:93;:::i;:::-;16266:2;16261:3;16257:12;16250:19;;15909:366;;;:::o;16281:::-;16423:3;16444:67;16508:2;16503:3;16444:67;:::i;:::-;16437:74;;16520:93;16609:3;16520:93;:::i;:::-;16638:2;16633:3;16629:12;16622:19;;16281:366;;;:::o;16653:::-;16795:3;16816:67;16880:2;16875:3;16816:67;:::i;:::-;16809:74;;16892:93;16981:3;16892:93;:::i;:::-;17010:2;17005:3;17001:12;16994:19;;16653:366;;;:::o;17025:::-;17167:3;17188:67;17252:2;17247:3;17188:67;:::i;:::-;17181:74;;17264:93;17353:3;17264:93;:::i;:::-;17382:2;17377:3;17373:12;17366:19;;17025:366;;;:::o;17397:::-;17539:3;17560:67;17624:2;17619:3;17560:67;:::i;:::-;17553:74;;17636:93;17725:3;17636:93;:::i;:::-;17754:2;17749:3;17745:12;17738:19;;17397:366;;;:::o;17769:::-;17911:3;17932:67;17996:2;17991:3;17932:67;:::i;:::-;17925:74;;18008:93;18097:3;18008:93;:::i;:::-;18126:2;18121:3;18117:12;18110:19;;17769:366;;;:::o;18141:::-;18283:3;18304:67;18368:2;18363:3;18304:67;:::i;:::-;18297:74;;18380:93;18469:3;18380:93;:::i;:::-;18498:2;18493:3;18489:12;18482:19;;18141:366;;;:::o;18513:::-;18655:3;18676:67;18740:2;18735:3;18676:67;:::i;:::-;18669:74;;18752:93;18841:3;18752:93;:::i;:::-;18870:2;18865:3;18861:12;18854:19;;18513:366;;;:::o;18885:::-;19027:3;19048:67;19112:2;19107:3;19048:67;:::i;:::-;19041:74;;19124:93;19213:3;19124:93;:::i;:::-;19242:2;19237:3;19233:12;19226:19;;18885:366;;;:::o;19257:::-;19399:3;19420:67;19484:2;19479:3;19420:67;:::i;:::-;19413:74;;19496:93;19585:3;19496:93;:::i;:::-;19614:2;19609:3;19605:12;19598:19;;19257:366;;;:::o;19629:::-;19771:3;19792:67;19856:2;19851:3;19792:67;:::i;:::-;19785:74;;19868:93;19957:3;19868:93;:::i;:::-;19986:2;19981:3;19977:12;19970:19;;19629:366;;;:::o;20001:::-;20143:3;20164:67;20228:2;20223:3;20164:67;:::i;:::-;20157:74;;20240:93;20329:3;20240:93;:::i;:::-;20358:2;20353:3;20349:12;20342:19;;20001:366;;;:::o;20373:::-;20515:3;20536:67;20600:2;20595:3;20536:67;:::i;:::-;20529:74;;20612:93;20701:3;20612:93;:::i;:::-;20730:2;20725:3;20721:12;20714:19;;20373:366;;;:::o;20745:::-;20887:3;20908:67;20972:2;20967:3;20908:67;:::i;:::-;20901:74;;20984:93;21073:3;20984:93;:::i;:::-;21102:2;21097:3;21093:12;21086:19;;20745:366;;;:::o;21117:::-;21259:3;21280:67;21344:2;21339:3;21280:67;:::i;:::-;21273:74;;21356:93;21445:3;21356:93;:::i;:::-;21474:2;21469:3;21465:12;21458:19;;21117:366;;;:::o;21489:::-;21631:3;21652:67;21716:2;21711:3;21652:67;:::i;:::-;21645:74;;21728:93;21817:3;21728:93;:::i;:::-;21846:2;21841:3;21837:12;21830:19;;21489:366;;;:::o;21861:108::-;21938:24;21956:5;21938:24;:::i;:::-;21933:3;21926:37;21861:108;;:::o;21975:118::-;22062:24;22080:5;22062:24;:::i;:::-;22057:3;22050:37;21975:118;;:::o;22099:157::-;22204:45;22224:24;22242:5;22224:24;:::i;:::-;22204:45;:::i;:::-;22199:3;22192:58;22099:157;;:::o;22262:589::-;22487:3;22509:95;22600:3;22591:6;22509:95;:::i;:::-;22502:102;;22621:95;22712:3;22703:6;22621:95;:::i;:::-;22614:102;;22733:92;22821:3;22812:6;22733:92;:::i;:::-;22726:99;;22842:3;22835:10;;22262:589;;;;;;:::o;22857:538::-;23025:3;23040:75;23111:3;23102:6;23040:75;:::i;:::-;23140:2;23135:3;23131:12;23124:19;;23153:75;23224:3;23215:6;23153:75;:::i;:::-;23253:2;23248:3;23244:12;23237:19;;23266:75;23337:3;23328:6;23266:75;:::i;:::-;23366:2;23361:3;23357:12;23350:19;;23386:3;23379:10;;22857:538;;;;;;:::o;23401:222::-;23494:4;23532:2;23521:9;23517:18;23509:26;;23545:71;23613:1;23602:9;23598:17;23589:6;23545:71;:::i;:::-;23401:222;;;;:::o;23629:640::-;23824:4;23862:3;23851:9;23847:19;23839:27;;23876:71;23944:1;23933:9;23929:17;23920:6;23876:71;:::i;:::-;23957:72;24025:2;24014:9;24010:18;24001:6;23957:72;:::i;:::-;24039;24107:2;24096:9;24092:18;24083:6;24039:72;:::i;:::-;24158:9;24152:4;24148:20;24143:2;24132:9;24128:18;24121:48;24186:76;24257:4;24248:6;24186:76;:::i;:::-;24178:84;;23629:640;;;;;;;:::o;24275:332::-;24396:4;24434:2;24423:9;24419:18;24411:26;;24447:71;24515:1;24504:9;24500:17;24491:6;24447:71;:::i;:::-;24528:72;24596:2;24585:9;24581:18;24572:6;24528:72;:::i;:::-;24275:332;;;;;:::o;24613:373::-;24756:4;24794:2;24783:9;24779:18;24771:26;;24843:9;24837:4;24833:20;24829:1;24818:9;24814:17;24807:47;24871:108;24974:4;24965:6;24871:108;:::i;:::-;24863:116;;24613:373;;;;:::o;24992:210::-;25079:4;25117:2;25106:9;25102:18;25094:26;;25130:65;25192:1;25181:9;25177:17;25168:6;25130:65;:::i;:::-;24992:210;;;;:::o;25208:313::-;25321:4;25359:2;25348:9;25344:18;25336:26;;25408:9;25402:4;25398:20;25394:1;25383:9;25379:17;25372:47;25436:78;25509:4;25500:6;25436:78;:::i;:::-;25428:86;;25208:313;;;;:::o;25527:419::-;25693:4;25731:2;25720:9;25716:18;25708:26;;25780:9;25774:4;25770:20;25766:1;25755:9;25751:17;25744:47;25808:131;25934:4;25808:131;:::i;:::-;25800:139;;25527:419;;;:::o;25952:::-;26118:4;26156:2;26145:9;26141:18;26133:26;;26205:9;26199:4;26195:20;26191:1;26180:9;26176:17;26169:47;26233:131;26359:4;26233:131;:::i;:::-;26225:139;;25952:419;;;:::o;26377:::-;26543:4;26581:2;26570:9;26566:18;26558:26;;26630:9;26624:4;26620:20;26616:1;26605:9;26601:17;26594:47;26658:131;26784:4;26658:131;:::i;:::-;26650:139;;26377:419;;;:::o;26802:::-;26968:4;27006:2;26995:9;26991:18;26983:26;;27055:9;27049:4;27045:20;27041:1;27030:9;27026:17;27019:47;27083:131;27209:4;27083:131;:::i;:::-;27075:139;;26802:419;;;:::o;27227:::-;27393:4;27431:2;27420:9;27416:18;27408:26;;27480:9;27474:4;27470:20;27466:1;27455:9;27451:17;27444:47;27508:131;27634:4;27508:131;:::i;:::-;27500:139;;27227:419;;;:::o;27652:::-;27818:4;27856:2;27845:9;27841:18;27833:26;;27905:9;27899:4;27895:20;27891:1;27880:9;27876:17;27869:47;27933:131;28059:4;27933:131;:::i;:::-;27925:139;;27652:419;;;:::o;28077:::-;28243:4;28281:2;28270:9;28266:18;28258:26;;28330:9;28324:4;28320:20;28316:1;28305:9;28301:17;28294:47;28358:131;28484:4;28358:131;:::i;:::-;28350:139;;28077:419;;;:::o;28502:::-;28668:4;28706:2;28695:9;28691:18;28683:26;;28755:9;28749:4;28745:20;28741:1;28730:9;28726:17;28719:47;28783:131;28909:4;28783:131;:::i;:::-;28775:139;;28502:419;;;:::o;28927:::-;29093:4;29131:2;29120:9;29116:18;29108:26;;29180:9;29174:4;29170:20;29166:1;29155:9;29151:17;29144:47;29208:131;29334:4;29208:131;:::i;:::-;29200:139;;28927:419;;;:::o;29352:::-;29518:4;29556:2;29545:9;29541:18;29533:26;;29605:9;29599:4;29595:20;29591:1;29580:9;29576:17;29569:47;29633:131;29759:4;29633:131;:::i;:::-;29625:139;;29352:419;;;:::o;29777:::-;29943:4;29981:2;29970:9;29966:18;29958:26;;30030:9;30024:4;30020:20;30016:1;30005:9;30001:17;29994:47;30058:131;30184:4;30058:131;:::i;:::-;30050:139;;29777:419;;;:::o;30202:::-;30368:4;30406:2;30395:9;30391:18;30383:26;;30455:9;30449:4;30445:20;30441:1;30430:9;30426:17;30419:47;30483:131;30609:4;30483:131;:::i;:::-;30475:139;;30202:419;;;:::o;30627:::-;30793:4;30831:2;30820:9;30816:18;30808:26;;30880:9;30874:4;30870:20;30866:1;30855:9;30851:17;30844:47;30908:131;31034:4;30908:131;:::i;:::-;30900:139;;30627:419;;;:::o;31052:::-;31218:4;31256:2;31245:9;31241:18;31233:26;;31305:9;31299:4;31295:20;31291:1;31280:9;31276:17;31269:47;31333:131;31459:4;31333:131;:::i;:::-;31325:139;;31052:419;;;:::o;31477:::-;31643:4;31681:2;31670:9;31666:18;31658:26;;31730:9;31724:4;31720:20;31716:1;31705:9;31701:17;31694:47;31758:131;31884:4;31758:131;:::i;:::-;31750:139;;31477:419;;;:::o;31902:::-;32068:4;32106:2;32095:9;32091:18;32083:26;;32155:9;32149:4;32145:20;32141:1;32130:9;32126:17;32119:47;32183:131;32309:4;32183:131;:::i;:::-;32175:139;;31902:419;;;:::o;32327:::-;32493:4;32531:2;32520:9;32516:18;32508:26;;32580:9;32574:4;32570:20;32566:1;32555:9;32551:17;32544:47;32608:131;32734:4;32608:131;:::i;:::-;32600:139;;32327:419;;;:::o;32752:::-;32918:4;32956:2;32945:9;32941:18;32933:26;;33005:9;32999:4;32995:20;32991:1;32980:9;32976:17;32969:47;33033:131;33159:4;33033:131;:::i;:::-;33025:139;;32752:419;;;:::o;33177:::-;33343:4;33381:2;33370:9;33366:18;33358:26;;33430:9;33424:4;33420:20;33416:1;33405:9;33401:17;33394:47;33458:131;33584:4;33458:131;:::i;:::-;33450:139;;33177:419;;;:::o;33602:::-;33768:4;33806:2;33795:9;33791:18;33783:26;;33855:9;33849:4;33845:20;33841:1;33830:9;33826:17;33819:47;33883:131;34009:4;33883:131;:::i;:::-;33875:139;;33602:419;;;:::o;34027:::-;34193:4;34231:2;34220:9;34216:18;34208:26;;34280:9;34274:4;34270:20;34266:1;34255:9;34251:17;34244:47;34308:131;34434:4;34308:131;:::i;:::-;34300:139;;34027:419;;;:::o;34452:::-;34618:4;34656:2;34645:9;34641:18;34633:26;;34705:9;34699:4;34695:20;34691:1;34680:9;34676:17;34669:47;34733:131;34859:4;34733:131;:::i;:::-;34725:139;;34452:419;;;:::o;34877:::-;35043:4;35081:2;35070:9;35066:18;35058:26;;35130:9;35124:4;35120:20;35116:1;35105:9;35101:17;35094:47;35158:131;35284:4;35158:131;:::i;:::-;35150:139;;34877:419;;;:::o;35302:::-;35468:4;35506:2;35495:9;35491:18;35483:26;;35555:9;35549:4;35545:20;35541:1;35530:9;35526:17;35519:47;35583:131;35709:4;35583:131;:::i;:::-;35575:139;;35302:419;;;:::o;35727:::-;35893:4;35931:2;35920:9;35916:18;35908:26;;35980:9;35974:4;35970:20;35966:1;35955:9;35951:17;35944:47;36008:131;36134:4;36008:131;:::i;:::-;36000:139;;35727:419;;;:::o;36152:::-;36318:4;36356:2;36345:9;36341:18;36333:26;;36405:9;36399:4;36395:20;36391:1;36380:9;36376:17;36369:47;36433:131;36559:4;36433:131;:::i;:::-;36425:139;;36152:419;;;:::o;36577:::-;36743:4;36781:2;36770:9;36766:18;36758:26;;36830:9;36824:4;36820:20;36816:1;36805:9;36801:17;36794:47;36858:131;36984:4;36858:131;:::i;:::-;36850:139;;36577:419;;;:::o;37002:::-;37168:4;37206:2;37195:9;37191:18;37183:26;;37255:9;37249:4;37245:20;37241:1;37230:9;37226:17;37219:47;37283:131;37409:4;37283:131;:::i;:::-;37275:139;;37002:419;;;:::o;37427:222::-;37520:4;37558:2;37547:9;37543:18;37535:26;;37571:71;37639:1;37628:9;37624:17;37615:6;37571:71;:::i;:::-;37427:222;;;;:::o;37655:129::-;37689:6;37716:20;;:::i;:::-;37706:30;;37745:33;37773:4;37765:6;37745:33;:::i;:::-;37655:129;;;:::o;37790:75::-;37823:6;37856:2;37850:9;37840:19;;37790:75;:::o;37871:307::-;37932:4;38022:18;38014:6;38011:30;38008:56;;;38044:18;;:::i;:::-;38008:56;38082:29;38104:6;38082:29;:::i;:::-;38074:37;;38166:4;38160;38156:15;38148:23;;37871:307;;;:::o;38184:308::-;38246:4;38336:18;38328:6;38325:30;38322:56;;;38358:18;;:::i;:::-;38322:56;38396:29;38418:6;38396:29;:::i;:::-;38388:37;;38480:4;38474;38470:15;38462:23;;38184:308;;;:::o;38498:132::-;38565:4;38588:3;38580:11;;38618:4;38613:3;38609:14;38601:22;;38498:132;;;:::o;38636:141::-;38685:4;38708:3;38700:11;;38731:3;38728:1;38721:14;38765:4;38762:1;38752:18;38744:26;;38636:141;;;:::o;38783:114::-;38850:6;38884:5;38878:12;38868:22;;38783:114;;;:::o;38903:98::-;38954:6;38988:5;38982:12;38972:22;;38903:98;;;:::o;39007:99::-;39059:6;39093:5;39087:12;39077:22;;39007:99;;;:::o;39112:113::-;39182:4;39214;39209:3;39205:14;39197:22;;39112:113;;;:::o;39231:184::-;39330:11;39364:6;39359:3;39352:19;39404:4;39399:3;39395:14;39380:29;;39231:184;;;;:::o;39421:168::-;39504:11;39538:6;39533:3;39526:19;39578:4;39573:3;39569:14;39554:29;;39421:168;;;;:::o;39595:169::-;39679:11;39713:6;39708:3;39701:19;39753:4;39748:3;39744:14;39729:29;;39595:169;;;;:::o;39770:148::-;39872:11;39909:3;39894:18;;39770:148;;;;:::o;39924:305::-;39964:3;39983:20;40001:1;39983:20;:::i;:::-;39978:25;;40017:20;40035:1;40017:20;:::i;:::-;40012:25;;40171:1;40103:66;40099:74;40096:1;40093:81;40090:107;;;40177:18;;:::i;:::-;40090:107;40221:1;40218;40214:9;40207:16;;39924:305;;;;:::o;40235:185::-;40275:1;40292:20;40310:1;40292:20;:::i;:::-;40287:25;;40326:20;40344:1;40326:20;:::i;:::-;40321:25;;40365:1;40355:35;;40370:18;;:::i;:::-;40355:35;40412:1;40409;40405:9;40400:14;;40235:185;;;;:::o;40426:348::-;40466:7;40489:20;40507:1;40489:20;:::i;:::-;40484:25;;40523:20;40541:1;40523:20;:::i;:::-;40518:25;;40711:1;40643:66;40639:74;40636:1;40633:81;40628:1;40621:9;40614:17;40610:105;40607:131;;;40718:18;;:::i;:::-;40607:131;40766:1;40763;40759:9;40748:20;;40426:348;;;;:::o;40780:191::-;40820:4;40840:20;40858:1;40840:20;:::i;:::-;40835:25;;40874:20;40892:1;40874:20;:::i;:::-;40869:25;;40913:1;40910;40907:8;40904:34;;;40918:18;;:::i;:::-;40904:34;40963:1;40960;40956:9;40948:17;;40780:191;;;;:::o;40977:96::-;41014:7;41043:24;41061:5;41043:24;:::i;:::-;41032:35;;40977:96;;;:::o;41079:90::-;41113:7;41156:5;41149:13;41142:21;41131:32;;41079:90;;;:::o;41175:149::-;41211:7;41251:66;41244:5;41240:78;41229:89;;41175:149;;;:::o;41330:126::-;41367:7;41407:42;41400:5;41396:54;41385:65;;41330:126;;;:::o;41462:77::-;41499:7;41528:5;41517:16;;41462:77;;;:::o;41545:109::-;41581:7;41621:26;41614:5;41610:38;41599:49;;41545:109;;;:::o;41660:154::-;41744:6;41739:3;41734;41721:30;41806:1;41797:6;41792:3;41788:16;41781:27;41660:154;;;:::o;41820:307::-;41888:1;41898:113;41912:6;41909:1;41906:13;41898:113;;;41997:1;41992:3;41988:11;41982:18;41978:1;41973:3;41969:11;41962:39;41934:2;41931:1;41927:10;41922:15;;41898:113;;;42029:6;42026:1;42023:13;42020:101;;;42109:1;42100:6;42095:3;42091:16;42084:27;42020:101;41869:258;41820:307;;;:::o;42133:320::-;42177:6;42214:1;42208:4;42204:12;42194:22;;42261:1;42255:4;42251:12;42282:18;42272:81;;42338:4;42330:6;42326:17;42316:27;;42272:81;42400:2;42392:6;42389:14;42369:18;42366:38;42363:84;;;42419:18;;:::i;:::-;42363:84;42184:269;42133:320;;;:::o;42459:281::-;42542:27;42564:4;42542:27;:::i;:::-;42534:6;42530:40;42672:6;42660:10;42657:22;42636:18;42624:10;42621:34;42618:62;42615:88;;;42683:18;;:::i;:::-;42615:88;42723:10;42719:2;42712:22;42502:238;42459:281;;:::o;42746:233::-;42785:3;42808:24;42826:5;42808:24;:::i;:::-;42799:33;;42854:66;42847:5;42844:77;42841:103;;;42924:18;;:::i;:::-;42841:103;42971:1;42964:5;42960:13;42953:20;;42746:233;;;:::o;42985:79::-;43024:7;43053:5;43042:16;;42985:79;;;:::o;43070:176::-;43102:1;43119:20;43137:1;43119:20;:::i;:::-;43114:25;;43153:20;43171:1;43153:20;:::i;:::-;43148:25;;43192:1;43182:35;;43197:18;;:::i;:::-;43182:35;43238:1;43235;43231:9;43226:14;;43070:176;;;;:::o;43252:180::-;43300:77;43297:1;43290:88;43397:4;43394:1;43387:15;43421:4;43418:1;43411:15;43438:180;43486:77;43483:1;43476:88;43583:4;43580:1;43573:15;43607:4;43604:1;43597:15;43624:180;43672:77;43669:1;43662:88;43769:4;43766:1;43759:15;43793:4;43790:1;43783:15;43810:180;43858:77;43855:1;43848:88;43955:4;43952:1;43945:15;43979:4;43976:1;43969:15;43996:180;44044:77;44041:1;44034:88;44141:4;44138:1;44131:15;44165:4;44162:1;44155:15;44182:180;44230:77;44227:1;44220:88;44327:4;44324:1;44317:15;44351:4;44348:1;44341:15;44368:117;44477:1;44474;44467:12;44491:117;44600:1;44597;44590:12;44614:117;44723:1;44720;44713:12;44737:117;44846:1;44843;44836:12;44860:102;44901:6;44952:2;44948:7;44943:2;44936:5;44932:14;44928:28;44918:38;;44860:102;;;:::o;44968:173::-;45108:25;45104:1;45096:6;45092:14;45085:49;44968:173;:::o;45147:172::-;45287:24;45283:1;45275:6;45271:14;45264:48;45147:172;:::o;45325:182::-;45465:34;45461:1;45453:6;45449:14;45442:58;45325:182;:::o;45513:230::-;45653:34;45649:1;45641:6;45637:14;45630:58;45722:13;45717:2;45709:6;45705:15;45698:38;45513:230;:::o;45749:237::-;45889:34;45885:1;45877:6;45873:14;45866:58;45958:20;45953:2;45945:6;45941:15;45934:45;45749:237;:::o;45992:225::-;46132:34;46128:1;46120:6;46116:14;46109:58;46201:8;46196:2;46188:6;46184:15;46177:33;45992:225;:::o;46223:224::-;46363:34;46359:1;46351:6;46347:14;46340:58;46432:7;46427:2;46419:6;46415:15;46408:32;46223:224;:::o;46453:178::-;46593:30;46589:1;46581:6;46577:14;46570:54;46453:178;:::o;46637:221::-;46777:34;46773:1;46765:6;46761:14;46754:58;46846:4;46841:2;46833:6;46829:15;46822:29;46637:221;:::o;46864:223::-;47004:34;47000:1;46992:6;46988:14;46981:58;47073:6;47068:2;47060:6;47056:15;47049:31;46864:223;:::o;47093:175::-;47233:27;47229:1;47221:6;47217:14;47210:51;47093:175;:::o;47274:161::-;47414:13;47410:1;47402:6;47398:14;47391:37;47274:161;:::o;47441:228::-;47581:34;47577:1;47569:6;47565:14;47558:58;47650:11;47645:2;47637:6;47633:15;47626:36;47441:228;:::o;47675:221::-;47815:34;47811:1;47803:6;47799:14;47792:58;47884:4;47879:2;47871:6;47867:15;47860:29;47675:221;:::o;47902:249::-;48042:34;48038:1;48030:6;48026:14;48019:58;48111:32;48106:2;48098:6;48094:15;48087:57;47902:249;:::o;48157:182::-;48297:34;48293:1;48285:6;48281:14;48274:58;48157:182;:::o;48345:::-;48485:34;48481:1;48473:6;48469:14;48462:58;48345:182;:::o;48533:163::-;48673:15;48669:1;48661:6;48657:14;48650:39;48533:163;:::o;48702:234::-;48842:34;48838:1;48830:6;48826:14;48819:58;48911:17;48906:2;48898:6;48894:15;48887:42;48702:234;:::o;48942:174::-;49082:26;49078:1;49070:6;49066:14;49059:50;48942:174;:::o;49122:220::-;49262:34;49258:1;49250:6;49246:14;49239:58;49331:3;49326:2;49318:6;49314:15;49307:28;49122:220;:::o;49348:182::-;49488:34;49484:1;49476:6;49472:14;49465:58;49348:182;:::o;49536:177::-;49676:29;49672:1;49664:6;49660:14;49653:53;49536:177;:::o;49719:231::-;49859:34;49855:1;49847:6;49843:14;49836:58;49928:14;49923:2;49915:6;49911:15;49904:39;49719:231;:::o;49956:229::-;50096:34;50092:1;50084:6;50080:14;50073:58;50165:12;50160:2;50152:6;50148:15;50141:37;49956:229;:::o;50191:233::-;50331:34;50327:1;50319:6;50315:14;50308:58;50400:16;50395:2;50387:6;50383:15;50376:41;50191:233;:::o;50430:181::-;50570:33;50566:1;50558:6;50554:14;50547:57;50430:181;:::o;50617:175::-;50757:27;50753:1;50745:6;50741:14;50734:51;50617:175;:::o;50798:122::-;50871:24;50889:5;50871:24;:::i;:::-;50864:5;50861:35;50851:63;;50910:1;50907;50900:12;50851:63;50798:122;:::o;50926:116::-;50996:21;51011:5;50996:21;:::i;:::-;50989:5;50986:32;50976:60;;51032:1;51029;51022:12;50976:60;50926:116;:::o;51048:120::-;51120:23;51137:5;51120:23;:::i;:::-;51113:5;51110:34;51100:62;;51158:1;51155;51148:12;51100:62;51048:120;:::o;51174:122::-;51247:24;51265:5;51247:24;:::i;:::-;51240:5;51237:35;51227:63;;51286:1;51283;51276:12;51227:63;51174:122;:::o;51302:120::-;51374:23;51391:5;51374:23;:::i;:::-;51367:5;51364:34;51354:62;;51412:1;51409;51402:12;51354:62;51302:120;:::o

Swarm Source

ipfs://36b5ff519170ad3298ecdca1deb071c9d67998ecc305f79a7e53caa039489b86
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.