S Price: $0.443503 (+1.68%)

Token

FlowerNFT (FLOWERNFT)

Overview

Max Total Supply

5 FLOWERNFT

Holders

1

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Balance
5 FLOWERNFT
0xb5bc83c9afc491410ba7ad688b2a4e7c52b98943
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
FlowerNFT

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at SonicScan.org on 2025-02-02
*/

// SPDX-License-Identifier: MIT

// File: @openzeppelin/[email protected]/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/[email protected]/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.9.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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * 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/[email protected]/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/[email protected]/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/[email protected]/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.9.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
     *
     * Furthermore, `isContract` will also return true if the target contract within
     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
     * which only has an effect at the end of a transaction.
     * ====
     *
     * [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://consensys.net/diligence/blog/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.8.0/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 functionCallWithValue(target, data, 0, "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");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or 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 {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // 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/[email protected]/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/[email protected]/utils/math/Math.sol


// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                // Solidity will revert if denominator == 0, unlike the div opcode on its own.
                // The surrounding unchecked block does not change this fact.
                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1, "Math: mulDiv overflow");

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10 ** 64) {
                value /= 10 ** 64;
                result += 64;
            }
            if (value >= 10 ** 32) {
                value /= 10 ** 32;
                result += 32;
            }
            if (value >= 10 ** 16) {
                value /= 10 ** 16;
                result += 16;
            }
            if (value >= 10 ** 8) {
                value /= 10 ** 8;
                result += 8;
            }
            if (value >= 10 ** 4) {
                value /= 10 ** 4;
                result += 4;
            }
            if (value >= 10 ** 2) {
                value /= 10 ** 2;
                result += 2;
            }
            if (value >= 10 ** 1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);
        }
    }
}

// File: @openzeppelin/[email protected]/utils/math/SignedMath.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard signed math utilities missing in the Solidity language.
 */
library SignedMath {
    /**
     * @dev Returns the largest of two signed numbers.
     */
    function max(int256 a, int256 b) internal pure returns (int256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two signed numbers.
     */
    function min(int256 a, int256 b) internal pure returns (int256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two signed numbers without overflow.
     * The result is rounded towards zero.
     */
    function average(int256 a, int256 b) internal pure returns (int256) {
        // Formula from the book "Hacker's Delight"
        int256 x = (a & b) + ((a ^ b) >> 1);
        return x + (int256(uint256(x) >> 255) & (a ^ b));
    }

    /**
     * @dev Returns the absolute unsigned value of a signed value.
     */
    function abs(int256 n) internal pure returns (uint256) {
        unchecked {
            // must be unchecked in order to support `n = type(int256).min`
            return uint256(n >= 0 ? n : -n);
        }
    }
}

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


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

pragma solidity ^0.8.0;



/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _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) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `int256` to its ASCII `string` decimal representation.
     */
    function toString(int256 value) internal pure returns (string memory) {
        return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value))));
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @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] = _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);
    }

    /**
     * @dev Returns true if the two strings are equal.
     */
    function equal(string memory a, string memory b) internal pure returns (bool) {
        return keccak256(bytes(a)) == keccak256(bytes(b));
    }
}

// File: @openzeppelin/[email protected]/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/[email protected]/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v4.9.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 = _ownerOf(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 or 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 or 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 or 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 the owner of the `tokenId`. Does NOT revert if token doesn't exist
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

    /**
     * @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 _ownerOf(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, 1);

        // Check that tokenId was not minted by `_beforeTokenTransfer` hook
        require(!_exists(tokenId), "ERC721: token already minted");

        unchecked {
            // Will not overflow unless all 2**256 token ids are minted to the same owner.
            // Given that tokens are minted one by one, it is impossible in practice that
            // this ever happens. Might change if we allow batch minting.
            // The ERC fails to describe this case.
            _balances[to] += 1;
        }

        _owners[tokenId] = to;

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

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

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     * This is an internal function that does not check if the sender is authorized to operate on the token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
        owner = ERC721.ownerOf(tokenId);

        // Clear approvals
        delete _tokenApprovals[tokenId];

        unchecked {
            // Cannot overflow, as that would require more tokens to be burned/transferred
            // out than the owner initially received through minting and transferring in.
            _balances[owner] -= 1;
        }
        delete _owners[tokenId];

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

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

    /**
     * @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, 1);

        // Check that tokenId was not transferred by `_beforeTokenTransfer` hook
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");

        // Clear approvals from the previous owner
        delete _tokenApprovals[tokenId];

        unchecked {
            // `_balances[from]` cannot overflow for the same reason as described in `_burn`:
            // `from`'s balance is the number of token held, which is at least one before the current
            // transfer.
            // `_balances[to]` could overflow in the conditions described in `_mint`. That would require
            // all 2**256 token ids to be minted, which in practice is impossible.
            _balances[from] -= 1;
            _balances[to] += 1;
        }
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId, 1);
    }

    /**
     * @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. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
     * - When `from` is zero, the tokens will be minted for `to`.
     * - When `to` is zero, ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
     * - When `from` is zero, the tokens were minted for `to`.
     * - When `to` is zero, ``from``'s tokens were burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {}

    /**
     * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override.
     *
     * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant
     * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such
     * that `ownerOf(tokenId)` is `a`.
     */
    // solhint-disable-next-line func-name-mixedcase
    function __unsafe_increaseBalance(address account, uint256 amount) internal {
        _balances[account] += amount;
    }
}

// File: @openzeppelin/[email protected]/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/[email protected]/token/ERC721/extensions/ERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.8.0) (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 See {ERC721-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, firstTokenId, batchSize);

        if (batchSize > 1) {
            // Will only trigger during construction. Batch transferring (minting) is not available afterwards.
            revert("ERC721Enumerable: consecutive transfers not supported");
        }

        uint256 tokenId = firstTokenId;

        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: @openzeppelin/[email protected]/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.9.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. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling 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/[email protected]/security/Pausable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// File: flowernft.sol


pragma solidity ^0.8.0;




interface IFlowerPower {
    function burn(uint256 tokenId) external;
    function ownerOf(uint256 tokenId) external view returns (address);
}

contract FlowerNFT is ERC721Enumerable, Ownable, Pausable {
    using Strings for uint256;

    uint256 public maxLevel = 10;  // Now changeable by the contract owner
    mapping(uint256 => uint256) public levels;

    IFlowerPower public FlowerPowerContract;
    string private baseURI;

    event Mint(address indexed to, uint256 tokenId);
    event LevelUp(address indexed user, uint256 tokenId, uint256 previousLevel, uint256 newLevel);
    event MaxLevelUpdated(uint256 newMaxLevel);
    event FlowerPowerContractUpdated(address newAddress);

    constructor(address POWERAddress, string memory baseURI_) ERC721("FlowerNFT", "FLOWERNFT") {
        require(POWERAddress != address(0), "FlowerPower contract address cannot be zero");
        FlowerPowerContract = IFlowerPower(POWERAddress);
        baseURI = baseURI_;
    }

    function setFlowerPowerAddress(address newAddress) external onlyOwner {
        require(newAddress != address(0), "Invalid address");
        FlowerPowerContract = IFlowerPower(newAddress);
        emit FlowerPowerContractUpdated(newAddress);
    }

    function setMaxLevel(uint256 newMaxLevel) external onlyOwner {
        require(newMaxLevel >= 1, "Max level must be at least 1");
        maxLevel = newMaxLevel;
        emit MaxLevelUpdated(newMaxLevel);
    }

    function mint(address to) external onlyOwner whenNotPaused {
        uint256 tokenId = totalSupply() + 1;
        _safeMint(to, tokenId);
        levels[tokenId] = 1;
        emit Mint(to, tokenId);
    }

    function levelUp(uint256 flowerTokenId, uint256 POWERTokenId) external whenNotPaused {
        require(ownerOf(flowerTokenId) == msg.sender, "You do not own this FlowerNFT");
        require(levels[flowerTokenId] < maxLevel, "Already at max level");
        require(address(FlowerPowerContract) != address(0), "FlowerPower contract not set");
        require(FlowerPowerContract.ownerOf(POWERTokenId) == msg.sender, "You do not own this FlowerPower NFT");

        uint256 previousLevel = levels[flowerTokenId];

        FlowerPowerContract.burn(POWERTokenId);
        levels[flowerTokenId] += 1;

        emit LevelUp(msg.sender, flowerTokenId, previousLevel, levels[flowerTokenId]);
    }

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

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

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        require(_exists(tokenId), "Token does not exist");
        uint256 currentLevel = levels[tokenId];
        return string(abi.encodePacked(baseURI, "/level_", currentLevel.toString(), ".json"));
    }

    function pause() external onlyOwner {
        _pause();
    }

    function unpause() external onlyOwner {
        _unpause();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"POWERAddress","type":"address"},{"internalType":"string","name":"baseURI_","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":false,"internalType":"address","name":"newAddress","type":"address"}],"name":"FlowerPowerContractUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"previousLevel","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newLevel","type":"uint256"}],"name":"LevelUp","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMaxLevel","type":"uint256"}],"name":"MaxLevelUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Mint","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"FlowerPowerContract","outputs":[{"internalType":"contract IFlowerPower","name":"","type":"address"}],"stateMutability":"view","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"flowerTokenId","type":"uint256"},{"internalType":"uint256","name":"POWERTokenId","type":"uint256"}],"name":"levelUp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"levels","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setFlowerPowerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxLevel","type":"uint256"}],"name":"setMaxLevel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600a600b553480156200001657600080fd5b5060405162004da338038062004da383398181016040528101906200003c91906200049c565b6040518060400160405280600981526020017f466c6f7765724e465400000000000000000000000000000000000000000000008152506040518060400160405280600981526020017f464c4f5745524e465400000000000000000000000000000000000000000000008152508160009081620000b991906200074d565b508060019081620000cb91906200074d565b505050620000ee620000e2620001d660201b60201c565b620001de60201b60201c565b6000600a60146101000a81548160ff021916908315150217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200017b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200017290620008bb565b60405180910390fd5b81600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600e9081620001cd91906200074d565b505050620008dd565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002e582620002b8565b9050919050565b620002f781620002d8565b81146200030357600080fd5b50565b6000815190506200031781620002ec565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620003728262000327565b810181811067ffffffffffffffff8211171562000394576200039362000338565b5b80604052505050565b6000620003a9620002a4565b9050620003b7828262000367565b919050565b600067ffffffffffffffff821115620003da57620003d962000338565b5b620003e58262000327565b9050602081019050919050565b60005b8381101562000412578082015181840152602081019050620003f5565b60008484015250505050565b6000620004356200042f84620003bc565b6200039d565b90508281526020810184848401111562000454576200045362000322565b5b62000461848285620003f2565b509392505050565b600082601f8301126200048157620004806200031d565b5b8151620004938482602086016200041e565b91505092915050565b60008060408385031215620004b657620004b5620002ae565b5b6000620004c68582860162000306565b925050602083015167ffffffffffffffff811115620004ea57620004e9620002b3565b5b620004f88582860162000469565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200055557607f821691505b6020821081036200056b576200056a6200050d565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005d57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000596565b620005e1868362000596565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200062e620006286200062284620005f9565b62000603565b620005f9565b9050919050565b6000819050919050565b6200064a836200060d565b62000662620006598262000635565b848454620005a3565b825550505050565b600090565b620006796200066a565b620006868184846200063f565b505050565b5b81811015620006ae57620006a26000826200066f565b6001810190506200068c565b5050565b601f821115620006fd57620006c78162000571565b620006d28462000586565b81016020851015620006e2578190505b620006fa620006f18562000586565b8301826200068b565b50505b505050565b600082821c905092915050565b6000620007226000198460080262000702565b1980831691505092915050565b60006200073d83836200070f565b9150826002028217905092915050565b620007588262000502565b67ffffffffffffffff81111562000774576200077362000338565b5b6200078082546200053c565b6200078d828285620006b2565b600060209050601f831160018114620007c55760008415620007b0578287015190505b620007bc85826200072f565b8655506200082c565b601f198416620007d58662000571565b60005b82811015620007ff57848901518255600182019150602085019450602081019050620007d8565b868310156200081f57848901516200081b601f8916826200070f565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f466c6f776572506f77657220636f6e747261637420616464726573732063616e60008201527f6e6f74206265207a65726f000000000000000000000000000000000000000000602082015250565b6000620008a3602b8362000834565b9150620008b08262000845565b604082019050919050565b60006020820190508181036000830152620008d68162000894565b9050919050565b6144b680620008ed6000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80636a62784211610104578063a22cb465116100a2578063c87b56dd11610071578063c87b56dd14610519578063cc06c35914610549578063e985e9c514610567578063f2fde38b14610597576101da565b8063a22cb46514610493578063a7b443bb146104af578063b2596a67146104cd578063b88d4fde146104fd576101da565b8063817731bb116100de578063817731bb146104315780638456cb591461044d5780638da5cb5b1461045757806395d89b4114610475576101da565b80636a627842146103db57806370a08231146103f7578063715018a614610427576101da565b8063344f1ba51161017c5780635226dc931161014b5780635226dc931461035557806355f804b3146103715780635c975abb1461038d5780636352211e146103ab576101da565b8063344f1ba5146102e35780633f4ba83a146102ff57806342842e0e146103095780634f6ccce714610325576101da565b8063095ea7b3116101b8578063095ea7b31461025d57806318160ddd1461027957806323b872dd146102975780632f745c59146102b3576101da565b806301ffc9a7146101df57806306fdde031461020f578063081812fc1461022d575b600080fd5b6101f960048036038101906101f49190612a55565b6105b3565b6040516102069190612a9d565b60405180910390f35b61021761062d565b6040516102249190612b48565b60405180910390f35b61024760048036038101906102429190612ba0565b6106bf565b6040516102549190612c0e565b60405180910390f35b61027760048036038101906102729190612c55565b610705565b005b61028161081c565b60405161028e9190612ca4565b60405180910390f35b6102b160048036038101906102ac9190612cbf565b610829565b005b6102cd60048036038101906102c89190612c55565b610889565b6040516102da9190612ca4565b60405180910390f35b6102fd60048036038101906102f89190612ba0565b61092e565b005b6103076109bb565b005b610323600480360381019061031e9190612cbf565b6109cd565b005b61033f600480360381019061033a9190612ba0565b6109ed565b60405161034c9190612ca4565b60405180910390f35b61036f600480360381019061036a9190612d12565b610a5e565b005b61038b60048036038101906103869190612e87565b610e07565b005b610395610e22565b6040516103a29190612a9d565b60405180910390f35b6103c560048036038101906103c09190612ba0565b610e39565b6040516103d29190612c0e565b60405180910390f35b6103f560048036038101906103f09190612ed0565b610ebf565b005b610411600480360381019061040c9190612ed0565b610f5c565b60405161041e9190612ca4565b60405180910390f35b61042f611013565b005b61044b60048036038101906104469190612ed0565b611027565b005b610455611119565b005b61045f61112b565b60405161046c9190612c0e565b60405180910390f35b61047d611155565b60405161048a9190612b48565b60405180910390f35b6104ad60048036038101906104a89190612f29565b6111e7565b005b6104b76111fd565b6040516104c49190612fc8565b60405180910390f35b6104e760048036038101906104e29190612ba0565b611223565b6040516104f49190612ca4565b60405180910390f35b61051760048036038101906105129190613084565b61123b565b005b610533600480360381019061052e9190612ba0565b61129d565b6040516105409190612b48565b60405180910390f35b610551611332565b60405161055e9190612ca4565b60405180910390f35b610581600480360381019061057c9190613107565b611338565b60405161058e9190612a9d565b60405180910390f35b6105b160048036038101906105ac9190612ed0565b6113cc565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061062657506106258261144f565b5b9050919050565b60606000805461063c90613176565b80601f016020809104026020016040519081016040528092919081815260200182805461066890613176565b80156106b55780601f1061068a576101008083540402835291602001916106b5565b820191906000526020600020905b81548152906001019060200180831161069857829003601f168201915b5050505050905090565b60006106ca82611531565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061071082610e39565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610780576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077790613219565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661079f61157c565b73ffffffffffffffffffffffffffffffffffffffff1614806107ce57506107cd816107c861157c565b611338565b5b61080d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610804906132ab565b60405180910390fd5b6108178383611584565b505050565b6000600880549050905090565b61083a61083461157c565b8261163d565b610879576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108709061333d565b60405180910390fd5b6108848383836116d2565b505050565b600061089483610f5c565b82106108d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cc906133cf565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6109366119cb565b600181101561097a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109719061343b565b60405180910390fd5b80600b819055507f208d11d52773c1d4fd0ee1d58ba297710cbb04e75e4ec24b4898f3745cce9bb3816040516109b09190612ca4565b60405180910390a150565b6109c36119cb565b6109cb611a49565b565b6109e88383836040518060200160405280600081525061123b565b505050565b60006109f761081c565b8210610a38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2f906134cd565b60405180910390fd5b60088281548110610a4c57610a4b6134ed565b5b90600052602060002001549050919050565b610a66611aac565b3373ffffffffffffffffffffffffffffffffffffffff16610a8683610e39565b73ffffffffffffffffffffffffffffffffffffffff1614610adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad390613568565b60405180910390fd5b600b54600c60008481526020019081526020016000205410610b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2a906135d4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbb90613640565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610c369190612ca4565b602060405180830381865afa158015610c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c779190613675565b73ffffffffffffffffffffffffffffffffffffffff1614610ccd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc490613714565b60405180910390fd5b6000600c6000848152602001908152602001600020549050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342966c68836040518263ffffffff1660e01b8152600401610d409190612ca4565b600060405180830381600087803b158015610d5a57600080fd5b505af1158015610d6e573d6000803e3d6000fd5b505050506001600c60008581526020019081526020016000206000828254610d969190613763565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167f0ee22ce17ae6ff55501ec7491afa3f5397a17ee7cd88fe56c39569e2c13bd9188483600c600088815260200190815260200160002054604051610dfa93929190613797565b60405180910390a2505050565b610e0f6119cb565b80600e9081610e1e9190613970565b5050565b6000600a60149054906101000a900460ff16905090565b600080610e4583611af6565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610eb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ead90613a8e565b60405180910390fd5b80915050919050565b610ec76119cb565b610ecf611aac565b60006001610edb61081c565b610ee59190613763565b9050610ef18282611b33565b6001600c6000838152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688582604051610f509190612ca4565b60405180910390a25050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610fcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc390613b20565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61101b6119cb565b6110256000611b51565b565b61102f6119cb565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361109e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109590613b8c565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f7c419c072016df3f812503da3d5f59c6d6058a69f9c01d9e6c7d187eb8b5c8f68160405161110e9190612c0e565b60405180910390a150565b6111216119cb565b611129611c17565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461116490613176565b80601f016020809104026020016040519081016040528092919081815260200182805461119090613176565b80156111dd5780601f106111b2576101008083540402835291602001916111dd565b820191906000526020600020905b8154815290600101906020018083116111c057829003601f168201915b5050505050905090565b6111f96111f261157c565b8383611c7a565b5050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c6020528060005260406000206000915090505481565b61124c61124661157c565b8361163d565b61128b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112829061333d565b60405180910390fd5b61129784848484611de6565b50505050565b60606112a882611e42565b6112e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112de90613bf8565b60405180910390fd5b6000600c6000848152602001908152602001600020549050600e61130a82611e83565b60405160200161131b929190613d6f565b604051602081830303815290604052915050919050565b600b5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6113d46119cb565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611443576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143a90613e1b565b60405180910390fd5b61144c81611b51565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061151a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061152a575061152982611f51565b5b9050919050565b61153a81611e42565b611579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157090613a8e565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166115f783610e39565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061164983610e39565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061168b575061168a8185611338565b5b806116c957508373ffffffffffffffffffffffffffffffffffffffff166116b1846106bf565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166116f282610e39565b73ffffffffffffffffffffffffffffffffffffffff1614611748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173f90613ead565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ae90613f3f565b60405180910390fd5b6117c48383836001611fbb565b8273ffffffffffffffffffffffffffffffffffffffff166117e482610e39565b73ffffffffffffffffffffffffffffffffffffffff161461183a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183190613ead565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46119c68383836001612119565b505050565b6119d361157c565b73ffffffffffffffffffffffffffffffffffffffff166119f161112b565b73ffffffffffffffffffffffffffffffffffffffff1614611a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3e90613fab565b60405180910390fd5b565b611a5161211f565b6000600a60146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611a9561157c565b604051611aa29190612c0e565b60405180910390a1565b611ab4610e22565b15611af4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aeb90614017565b60405180910390fd5b565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b611b4d828260405180602001604052806000815250612168565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611c1f611aac565b6001600a60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611c6361157c565b604051611c709190612c0e565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611ce8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdf90614083565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611dd99190612a9d565b60405180910390a3505050565b611df18484846116d2565b611dfd848484846121c3565b611e3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3390614115565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff16611e6483611af6565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b606060006001611e928461234a565b01905060008167ffffffffffffffff811115611eb157611eb0612d5c565b5b6040519080825280601f01601f191660200182016040528015611ee35781602001600182028036833780820191505090505b509050600082602001820190505b600115611f46578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611f3a57611f39614135565b5b04945060008503611ef1575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611fc78484848461249d565b600181111561200b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612002906141d6565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036120525761204d816124a3565b612091565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146120905761208f85826124ec565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036120d3576120ce81612659565b612112565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461211157612110848261272a565b5b5b5050505050565b50505050565b612127610e22565b612166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215d90614242565b60405180910390fd5b565b61217283836127a9565b61217f60008484846121c3565b6121be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b590614115565b60405180910390fd5b505050565b60006121e48473ffffffffffffffffffffffffffffffffffffffff166129c6565b1561233d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261220d61157c565b8786866040518563ffffffff1660e01b815260040161222f94939291906142b7565b6020604051808303816000875af192505050801561226b57506040513d601f19601f820116820180604052508101906122689190614318565b60015b6122ed573d806000811461229b576040519150601f19603f3d011682016040523d82523d6000602084013e6122a0565b606091505b5060008151036122e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122dc90614115565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612342565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106123a8577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161239e5761239d614135565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106123e5576d04ee2d6d415b85acef810000000083816123db576123da614135565b5b0492506020810190505b662386f26fc10000831061241457662386f26fc10000838161240a57612409614135565b5b0492506010810190505b6305f5e100831061243d576305f5e100838161243357612432614135565b5b0492506008810190505b612710831061246257612710838161245857612457614135565b5b0492506004810190505b60648310612485576064838161247b5761247a614135565b5b0492506002810190505b600a8310612494576001810190505b80915050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016124f984610f5c565b6125039190614345565b90506000600760008481526020019081526020016000205490508181146125e8576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061266d9190614345565b905060006009600084815260200190815260200160002054905060006008838154811061269d5761269c6134ed565b5b9060005260206000200154905080600883815481106126bf576126be6134ed565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061270e5761270d614379565b5b6001900381819060005260206000200160009055905550505050565b600061273583610f5c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612818576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280f906143f4565b60405180910390fd5b61282181611e42565b15612861576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285890614460565b60405180910390fd5b61286f600083836001611fbb565b61287881611e42565b156128b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128af90614460565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129c2600083836001612119565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612a32816129fd565b8114612a3d57600080fd5b50565b600081359050612a4f81612a29565b92915050565b600060208284031215612a6b57612a6a6129f3565b5b6000612a7984828501612a40565b91505092915050565b60008115159050919050565b612a9781612a82565b82525050565b6000602082019050612ab26000830184612a8e565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612af2578082015181840152602081019050612ad7565b60008484015250505050565b6000601f19601f8301169050919050565b6000612b1a82612ab8565b612b248185612ac3565b9350612b34818560208601612ad4565b612b3d81612afe565b840191505092915050565b60006020820190508181036000830152612b628184612b0f565b905092915050565b6000819050919050565b612b7d81612b6a565b8114612b8857600080fd5b50565b600081359050612b9a81612b74565b92915050565b600060208284031215612bb657612bb56129f3565b5b6000612bc484828501612b8b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612bf882612bcd565b9050919050565b612c0881612bed565b82525050565b6000602082019050612c236000830184612bff565b92915050565b612c3281612bed565b8114612c3d57600080fd5b50565b600081359050612c4f81612c29565b92915050565b60008060408385031215612c6c57612c6b6129f3565b5b6000612c7a85828601612c40565b9250506020612c8b85828601612b8b565b9150509250929050565b612c9e81612b6a565b82525050565b6000602082019050612cb96000830184612c95565b92915050565b600080600060608486031215612cd857612cd76129f3565b5b6000612ce686828701612c40565b9350506020612cf786828701612c40565b9250506040612d0886828701612b8b565b9150509250925092565b60008060408385031215612d2957612d286129f3565b5b6000612d3785828601612b8b565b9250506020612d4885828601612b8b565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612d9482612afe565b810181811067ffffffffffffffff82111715612db357612db2612d5c565b5b80604052505050565b6000612dc66129e9565b9050612dd28282612d8b565b919050565b600067ffffffffffffffff821115612df257612df1612d5c565b5b612dfb82612afe565b9050602081019050919050565b82818337600083830152505050565b6000612e2a612e2584612dd7565b612dbc565b905082815260208101848484011115612e4657612e45612d57565b5b612e51848285612e08565b509392505050565b600082601f830112612e6e57612e6d612d52565b5b8135612e7e848260208601612e17565b91505092915050565b600060208284031215612e9d57612e9c6129f3565b5b600082013567ffffffffffffffff811115612ebb57612eba6129f8565b5b612ec784828501612e59565b91505092915050565b600060208284031215612ee657612ee56129f3565b5b6000612ef484828501612c40565b91505092915050565b612f0681612a82565b8114612f1157600080fd5b50565b600081359050612f2381612efd565b92915050565b60008060408385031215612f4057612f3f6129f3565b5b6000612f4e85828601612c40565b9250506020612f5f85828601612f14565b9150509250929050565b6000819050919050565b6000612f8e612f89612f8484612bcd565b612f69565b612bcd565b9050919050565b6000612fa082612f73565b9050919050565b6000612fb282612f95565b9050919050565b612fc281612fa7565b82525050565b6000602082019050612fdd6000830184612fb9565b92915050565b600067ffffffffffffffff821115612ffe57612ffd612d5c565b5b61300782612afe565b9050602081019050919050565b600061302761302284612fe3565b612dbc565b90508281526020810184848401111561304357613042612d57565b5b61304e848285612e08565b509392505050565b600082601f83011261306b5761306a612d52565b5b813561307b848260208601613014565b91505092915050565b6000806000806080858703121561309e5761309d6129f3565b5b60006130ac87828801612c40565b94505060206130bd87828801612c40565b93505060406130ce87828801612b8b565b925050606085013567ffffffffffffffff8111156130ef576130ee6129f8565b5b6130fb87828801613056565b91505092959194509250565b6000806040838503121561311e5761311d6129f3565b5b600061312c85828601612c40565b925050602061313d85828601612c40565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061318e57607f821691505b6020821081036131a1576131a0613147565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613203602183612ac3565b915061320e826131a7565b604082019050919050565b60006020820190508181036000830152613232816131f6565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613295603d83612ac3565b91506132a082613239565b604082019050919050565b600060208201905081810360008301526132c481613288565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613327602d83612ac3565b9150613332826132cb565b604082019050919050565b600060208201905081810360008301526133568161331a565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006133b9602b83612ac3565b91506133c48261335d565b604082019050919050565b600060208201905081810360008301526133e8816133ac565b9050919050565b7f4d6178206c6576656c206d757374206265206174206c65617374203100000000600082015250565b6000613425601c83612ac3565b9150613430826133ef565b602082019050919050565b6000602082019050818103600083015261345481613418565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006134b7602c83612ac3565b91506134c28261345b565b604082019050919050565b600060208201905081810360008301526134e6816134aa565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f596f7520646f206e6f74206f776e207468697320466c6f7765724e4654000000600082015250565b6000613552601d83612ac3565b915061355d8261351c565b602082019050919050565b6000602082019050818103600083015261358181613545565b9050919050565b7f416c7265616479206174206d6178206c6576656c000000000000000000000000600082015250565b60006135be601483612ac3565b91506135c982613588565b602082019050919050565b600060208201905081810360008301526135ed816135b1565b9050919050565b7f466c6f776572506f77657220636f6e7472616374206e6f742073657400000000600082015250565b600061362a601c83612ac3565b9150613635826135f4565b602082019050919050565b600060208201905081810360008301526136598161361d565b9050919050565b60008151905061366f81612c29565b92915050565b60006020828403121561368b5761368a6129f3565b5b600061369984828501613660565b91505092915050565b7f596f7520646f206e6f74206f776e207468697320466c6f776572506f7765722060008201527f4e46540000000000000000000000000000000000000000000000000000000000602082015250565b60006136fe602383612ac3565b9150613709826136a2565b604082019050919050565b6000602082019050818103600083015261372d816136f1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061376e82612b6a565b915061377983612b6a565b925082820190508082111561379157613790613734565b5b92915050565b60006060820190506137ac6000830186612c95565b6137b96020830185612c95565b6137c66040830184612c95565b949350505050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026138307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826137f3565b61383a86836137f3565b95508019841693508086168417925050509392505050565b600061386d61386861386384612b6a565b612f69565b612b6a565b9050919050565b6000819050919050565b61388783613852565b61389b61389382613874565b848454613800565b825550505050565b600090565b6138b06138a3565b6138bb81848461387e565b505050565b5b818110156138df576138d46000826138a8565b6001810190506138c1565b5050565b601f821115613924576138f5816137ce565b6138fe846137e3565b8101602085101561390d578190505b613921613919856137e3565b8301826138c0565b50505b505050565b600082821c905092915050565b600061394760001984600802613929565b1980831691505092915050565b60006139608383613936565b9150826002028217905092915050565b61397982612ab8565b67ffffffffffffffff81111561399257613991612d5c565b5b61399c8254613176565b6139a78282856138e3565b600060209050601f8311600181146139da57600084156139c8578287015190505b6139d28582613954565b865550613a3a565b601f1984166139e8866137ce565b60005b82811015613a10578489015182556001820191506020850194506020810190506139eb565b86831015613a2d5784890151613a29601f891682613936565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613a78601883612ac3565b9150613a8382613a42565b602082019050919050565b60006020820190508181036000830152613aa781613a6b565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613b0a602983612ac3565b9150613b1582613aae565b604082019050919050565b60006020820190508181036000830152613b3981613afd565b9050919050565b7f496e76616c696420616464726573730000000000000000000000000000000000600082015250565b6000613b76600f83612ac3565b9150613b8182613b40565b602082019050919050565b60006020820190508181036000830152613ba581613b69565b9050919050565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b6000613be2601483612ac3565b9150613bed82613bac565b602082019050919050565b60006020820190508181036000830152613c1181613bd5565b9050919050565b600081905092915050565b60008154613c3081613176565b613c3a8186613c18565b94506001821660008114613c555760018114613c6a57613c9d565b60ff1983168652811515820286019350613c9d565b613c73856137ce565b60005b83811015613c9557815481890152600182019150602081019050613c76565b838801955050505b50505092915050565b7f2f6c6576656c5f00000000000000000000000000000000000000000000000000600082015250565b6000613cdc600783613c18565b9150613ce782613ca6565b600782019050919050565b6000613cfd82612ab8565b613d078185613c18565b9350613d17818560208601612ad4565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613d59600583613c18565b9150613d6482613d23565b600582019050919050565b6000613d7b8285613c23565b9150613d8682613ccf565b9150613d928284613cf2565b9150613d9d82613d4c565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613e05602683612ac3565b9150613e1082613da9565b604082019050919050565b60006020820190508181036000830152613e3481613df8565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613e97602583612ac3565b9150613ea282613e3b565b604082019050919050565b60006020820190508181036000830152613ec681613e8a565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613f29602483612ac3565b9150613f3482613ecd565b604082019050919050565b60006020820190508181036000830152613f5881613f1c565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613f95602083612ac3565b9150613fa082613f5f565b602082019050919050565b60006020820190508181036000830152613fc481613f88565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000614001601083612ac3565b915061400c82613fcb565b602082019050919050565b6000602082019050818103600083015261403081613ff4565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061406d601983612ac3565b915061407882614037565b602082019050919050565b6000602082019050818103600083015261409c81614060565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006140ff603283612ac3565b915061410a826140a3565b604082019050919050565b6000602082019050818103600083015261412e816140f2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b60006141c0603583612ac3565b91506141cb82614164565b604082019050919050565b600060208201905081810360008301526141ef816141b3565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b600061422c601483612ac3565b9150614237826141f6565b602082019050919050565b6000602082019050818103600083015261425b8161421f565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061428982614262565b614293818561426d565b93506142a3818560208601612ad4565b6142ac81612afe565b840191505092915050565b60006080820190506142cc6000830187612bff565b6142d96020830186612bff565b6142e66040830185612c95565b81810360608301526142f8818461427e565b905095945050505050565b60008151905061431281612a29565b92915050565b60006020828403121561432e5761432d6129f3565b5b600061433c84828501614303565b91505092915050565b600061435082612b6a565b915061435b83612b6a565b925082820390508181111561437357614372613734565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006143de602083612ac3565b91506143e9826143a8565b602082019050919050565b6000602082019050818103600083015261440d816143d1565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061444a601c83612ac3565b915061445582614414565b602082019050919050565b600060208201905081810360008301526144798161443d565b905091905056fea264697066735822122097acc55fd57d3a06dd82e177e6ab73ecc616bddfa524df8e5a5ff190e06ff34764736f6c63430008130033000000000000000000000000bdbc5db25ea27defced030b9fe78b7d43730b4fb00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000043697066733a2f2f626166796265696471786173786778756e6a376b6b6a363569636e74777662787374736e726c726c3436676b757561616e33776f73626433376a692f0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101da5760003560e01c80636a62784211610104578063a22cb465116100a2578063c87b56dd11610071578063c87b56dd14610519578063cc06c35914610549578063e985e9c514610567578063f2fde38b14610597576101da565b8063a22cb46514610493578063a7b443bb146104af578063b2596a67146104cd578063b88d4fde146104fd576101da565b8063817731bb116100de578063817731bb146104315780638456cb591461044d5780638da5cb5b1461045757806395d89b4114610475576101da565b80636a627842146103db57806370a08231146103f7578063715018a614610427576101da565b8063344f1ba51161017c5780635226dc931161014b5780635226dc931461035557806355f804b3146103715780635c975abb1461038d5780636352211e146103ab576101da565b8063344f1ba5146102e35780633f4ba83a146102ff57806342842e0e146103095780634f6ccce714610325576101da565b8063095ea7b3116101b8578063095ea7b31461025d57806318160ddd1461027957806323b872dd146102975780632f745c59146102b3576101da565b806301ffc9a7146101df57806306fdde031461020f578063081812fc1461022d575b600080fd5b6101f960048036038101906101f49190612a55565b6105b3565b6040516102069190612a9d565b60405180910390f35b61021761062d565b6040516102249190612b48565b60405180910390f35b61024760048036038101906102429190612ba0565b6106bf565b6040516102549190612c0e565b60405180910390f35b61027760048036038101906102729190612c55565b610705565b005b61028161081c565b60405161028e9190612ca4565b60405180910390f35b6102b160048036038101906102ac9190612cbf565b610829565b005b6102cd60048036038101906102c89190612c55565b610889565b6040516102da9190612ca4565b60405180910390f35b6102fd60048036038101906102f89190612ba0565b61092e565b005b6103076109bb565b005b610323600480360381019061031e9190612cbf565b6109cd565b005b61033f600480360381019061033a9190612ba0565b6109ed565b60405161034c9190612ca4565b60405180910390f35b61036f600480360381019061036a9190612d12565b610a5e565b005b61038b60048036038101906103869190612e87565b610e07565b005b610395610e22565b6040516103a29190612a9d565b60405180910390f35b6103c560048036038101906103c09190612ba0565b610e39565b6040516103d29190612c0e565b60405180910390f35b6103f560048036038101906103f09190612ed0565b610ebf565b005b610411600480360381019061040c9190612ed0565b610f5c565b60405161041e9190612ca4565b60405180910390f35b61042f611013565b005b61044b60048036038101906104469190612ed0565b611027565b005b610455611119565b005b61045f61112b565b60405161046c9190612c0e565b60405180910390f35b61047d611155565b60405161048a9190612b48565b60405180910390f35b6104ad60048036038101906104a89190612f29565b6111e7565b005b6104b76111fd565b6040516104c49190612fc8565b60405180910390f35b6104e760048036038101906104e29190612ba0565b611223565b6040516104f49190612ca4565b60405180910390f35b61051760048036038101906105129190613084565b61123b565b005b610533600480360381019061052e9190612ba0565b61129d565b6040516105409190612b48565b60405180910390f35b610551611332565b60405161055e9190612ca4565b60405180910390f35b610581600480360381019061057c9190613107565b611338565b60405161058e9190612a9d565b60405180910390f35b6105b160048036038101906105ac9190612ed0565b6113cc565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061062657506106258261144f565b5b9050919050565b60606000805461063c90613176565b80601f016020809104026020016040519081016040528092919081815260200182805461066890613176565b80156106b55780601f1061068a576101008083540402835291602001916106b5565b820191906000526020600020905b81548152906001019060200180831161069857829003601f168201915b5050505050905090565b60006106ca82611531565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061071082610e39565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610780576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077790613219565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661079f61157c565b73ffffffffffffffffffffffffffffffffffffffff1614806107ce57506107cd816107c861157c565b611338565b5b61080d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610804906132ab565b60405180910390fd5b6108178383611584565b505050565b6000600880549050905090565b61083a61083461157c565b8261163d565b610879576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108709061333d565b60405180910390fd5b6108848383836116d2565b505050565b600061089483610f5c565b82106108d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cc906133cf565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6109366119cb565b600181101561097a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109719061343b565b60405180910390fd5b80600b819055507f208d11d52773c1d4fd0ee1d58ba297710cbb04e75e4ec24b4898f3745cce9bb3816040516109b09190612ca4565b60405180910390a150565b6109c36119cb565b6109cb611a49565b565b6109e88383836040518060200160405280600081525061123b565b505050565b60006109f761081c565b8210610a38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2f906134cd565b60405180910390fd5b60088281548110610a4c57610a4b6134ed565b5b90600052602060002001549050919050565b610a66611aac565b3373ffffffffffffffffffffffffffffffffffffffff16610a8683610e39565b73ffffffffffffffffffffffffffffffffffffffff1614610adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad390613568565b60405180910390fd5b600b54600c60008481526020019081526020016000205410610b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2a906135d4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbb90613640565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610c369190612ca4565b602060405180830381865afa158015610c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c779190613675565b73ffffffffffffffffffffffffffffffffffffffff1614610ccd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc490613714565b60405180910390fd5b6000600c6000848152602001908152602001600020549050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342966c68836040518263ffffffff1660e01b8152600401610d409190612ca4565b600060405180830381600087803b158015610d5a57600080fd5b505af1158015610d6e573d6000803e3d6000fd5b505050506001600c60008581526020019081526020016000206000828254610d969190613763565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167f0ee22ce17ae6ff55501ec7491afa3f5397a17ee7cd88fe56c39569e2c13bd9188483600c600088815260200190815260200160002054604051610dfa93929190613797565b60405180910390a2505050565b610e0f6119cb565b80600e9081610e1e9190613970565b5050565b6000600a60149054906101000a900460ff16905090565b600080610e4583611af6565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610eb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ead90613a8e565b60405180910390fd5b80915050919050565b610ec76119cb565b610ecf611aac565b60006001610edb61081c565b610ee59190613763565b9050610ef18282611b33565b6001600c6000838152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688582604051610f509190612ca4565b60405180910390a25050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610fcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc390613b20565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61101b6119cb565b6110256000611b51565b565b61102f6119cb565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361109e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109590613b8c565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f7c419c072016df3f812503da3d5f59c6d6058a69f9c01d9e6c7d187eb8b5c8f68160405161110e9190612c0e565b60405180910390a150565b6111216119cb565b611129611c17565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461116490613176565b80601f016020809104026020016040519081016040528092919081815260200182805461119090613176565b80156111dd5780601f106111b2576101008083540402835291602001916111dd565b820191906000526020600020905b8154815290600101906020018083116111c057829003601f168201915b5050505050905090565b6111f96111f261157c565b8383611c7a565b5050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c6020528060005260406000206000915090505481565b61124c61124661157c565b8361163d565b61128b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112829061333d565b60405180910390fd5b61129784848484611de6565b50505050565b60606112a882611e42565b6112e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112de90613bf8565b60405180910390fd5b6000600c6000848152602001908152602001600020549050600e61130a82611e83565b60405160200161131b929190613d6f565b604051602081830303815290604052915050919050565b600b5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6113d46119cb565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611443576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143a90613e1b565b60405180910390fd5b61144c81611b51565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061151a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061152a575061152982611f51565b5b9050919050565b61153a81611e42565b611579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157090613a8e565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166115f783610e39565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061164983610e39565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061168b575061168a8185611338565b5b806116c957508373ffffffffffffffffffffffffffffffffffffffff166116b1846106bf565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166116f282610e39565b73ffffffffffffffffffffffffffffffffffffffff1614611748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173f90613ead565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ae90613f3f565b60405180910390fd5b6117c48383836001611fbb565b8273ffffffffffffffffffffffffffffffffffffffff166117e482610e39565b73ffffffffffffffffffffffffffffffffffffffff161461183a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183190613ead565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46119c68383836001612119565b505050565b6119d361157c565b73ffffffffffffffffffffffffffffffffffffffff166119f161112b565b73ffffffffffffffffffffffffffffffffffffffff1614611a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3e90613fab565b60405180910390fd5b565b611a5161211f565b6000600a60146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611a9561157c565b604051611aa29190612c0e565b60405180910390a1565b611ab4610e22565b15611af4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aeb90614017565b60405180910390fd5b565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b611b4d828260405180602001604052806000815250612168565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611c1f611aac565b6001600a60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611c6361157c565b604051611c709190612c0e565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611ce8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdf90614083565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611dd99190612a9d565b60405180910390a3505050565b611df18484846116d2565b611dfd848484846121c3565b611e3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3390614115565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff16611e6483611af6565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b606060006001611e928461234a565b01905060008167ffffffffffffffff811115611eb157611eb0612d5c565b5b6040519080825280601f01601f191660200182016040528015611ee35781602001600182028036833780820191505090505b509050600082602001820190505b600115611f46578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611f3a57611f39614135565b5b04945060008503611ef1575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611fc78484848461249d565b600181111561200b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612002906141d6565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036120525761204d816124a3565b612091565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146120905761208f85826124ec565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036120d3576120ce81612659565b612112565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461211157612110848261272a565b5b5b5050505050565b50505050565b612127610e22565b612166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215d90614242565b60405180910390fd5b565b61217283836127a9565b61217f60008484846121c3565b6121be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b590614115565b60405180910390fd5b505050565b60006121e48473ffffffffffffffffffffffffffffffffffffffff166129c6565b1561233d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261220d61157c565b8786866040518563ffffffff1660e01b815260040161222f94939291906142b7565b6020604051808303816000875af192505050801561226b57506040513d601f19601f820116820180604052508101906122689190614318565b60015b6122ed573d806000811461229b576040519150601f19603f3d011682016040523d82523d6000602084013e6122a0565b606091505b5060008151036122e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122dc90614115565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612342565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106123a8577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161239e5761239d614135565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106123e5576d04ee2d6d415b85acef810000000083816123db576123da614135565b5b0492506020810190505b662386f26fc10000831061241457662386f26fc10000838161240a57612409614135565b5b0492506010810190505b6305f5e100831061243d576305f5e100838161243357612432614135565b5b0492506008810190505b612710831061246257612710838161245857612457614135565b5b0492506004810190505b60648310612485576064838161247b5761247a614135565b5b0492506002810190505b600a8310612494576001810190505b80915050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016124f984610f5c565b6125039190614345565b90506000600760008481526020019081526020016000205490508181146125e8576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061266d9190614345565b905060006009600084815260200190815260200160002054905060006008838154811061269d5761269c6134ed565b5b9060005260206000200154905080600883815481106126bf576126be6134ed565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061270e5761270d614379565b5b6001900381819060005260206000200160009055905550505050565b600061273583610f5c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612818576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280f906143f4565b60405180910390fd5b61282181611e42565b15612861576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285890614460565b60405180910390fd5b61286f600083836001611fbb565b61287881611e42565b156128b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128af90614460565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129c2600083836001612119565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612a32816129fd565b8114612a3d57600080fd5b50565b600081359050612a4f81612a29565b92915050565b600060208284031215612a6b57612a6a6129f3565b5b6000612a7984828501612a40565b91505092915050565b60008115159050919050565b612a9781612a82565b82525050565b6000602082019050612ab26000830184612a8e565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612af2578082015181840152602081019050612ad7565b60008484015250505050565b6000601f19601f8301169050919050565b6000612b1a82612ab8565b612b248185612ac3565b9350612b34818560208601612ad4565b612b3d81612afe565b840191505092915050565b60006020820190508181036000830152612b628184612b0f565b905092915050565b6000819050919050565b612b7d81612b6a565b8114612b8857600080fd5b50565b600081359050612b9a81612b74565b92915050565b600060208284031215612bb657612bb56129f3565b5b6000612bc484828501612b8b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612bf882612bcd565b9050919050565b612c0881612bed565b82525050565b6000602082019050612c236000830184612bff565b92915050565b612c3281612bed565b8114612c3d57600080fd5b50565b600081359050612c4f81612c29565b92915050565b60008060408385031215612c6c57612c6b6129f3565b5b6000612c7a85828601612c40565b9250506020612c8b85828601612b8b565b9150509250929050565b612c9e81612b6a565b82525050565b6000602082019050612cb96000830184612c95565b92915050565b600080600060608486031215612cd857612cd76129f3565b5b6000612ce686828701612c40565b9350506020612cf786828701612c40565b9250506040612d0886828701612b8b565b9150509250925092565b60008060408385031215612d2957612d286129f3565b5b6000612d3785828601612b8b565b9250506020612d4885828601612b8b565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612d9482612afe565b810181811067ffffffffffffffff82111715612db357612db2612d5c565b5b80604052505050565b6000612dc66129e9565b9050612dd28282612d8b565b919050565b600067ffffffffffffffff821115612df257612df1612d5c565b5b612dfb82612afe565b9050602081019050919050565b82818337600083830152505050565b6000612e2a612e2584612dd7565b612dbc565b905082815260208101848484011115612e4657612e45612d57565b5b612e51848285612e08565b509392505050565b600082601f830112612e6e57612e6d612d52565b5b8135612e7e848260208601612e17565b91505092915050565b600060208284031215612e9d57612e9c6129f3565b5b600082013567ffffffffffffffff811115612ebb57612eba6129f8565b5b612ec784828501612e59565b91505092915050565b600060208284031215612ee657612ee56129f3565b5b6000612ef484828501612c40565b91505092915050565b612f0681612a82565b8114612f1157600080fd5b50565b600081359050612f2381612efd565b92915050565b60008060408385031215612f4057612f3f6129f3565b5b6000612f4e85828601612c40565b9250506020612f5f85828601612f14565b9150509250929050565b6000819050919050565b6000612f8e612f89612f8484612bcd565b612f69565b612bcd565b9050919050565b6000612fa082612f73565b9050919050565b6000612fb282612f95565b9050919050565b612fc281612fa7565b82525050565b6000602082019050612fdd6000830184612fb9565b92915050565b600067ffffffffffffffff821115612ffe57612ffd612d5c565b5b61300782612afe565b9050602081019050919050565b600061302761302284612fe3565b612dbc565b90508281526020810184848401111561304357613042612d57565b5b61304e848285612e08565b509392505050565b600082601f83011261306b5761306a612d52565b5b813561307b848260208601613014565b91505092915050565b6000806000806080858703121561309e5761309d6129f3565b5b60006130ac87828801612c40565b94505060206130bd87828801612c40565b93505060406130ce87828801612b8b565b925050606085013567ffffffffffffffff8111156130ef576130ee6129f8565b5b6130fb87828801613056565b91505092959194509250565b6000806040838503121561311e5761311d6129f3565b5b600061312c85828601612c40565b925050602061313d85828601612c40565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061318e57607f821691505b6020821081036131a1576131a0613147565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613203602183612ac3565b915061320e826131a7565b604082019050919050565b60006020820190508181036000830152613232816131f6565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613295603d83612ac3565b91506132a082613239565b604082019050919050565b600060208201905081810360008301526132c481613288565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613327602d83612ac3565b9150613332826132cb565b604082019050919050565b600060208201905081810360008301526133568161331a565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006133b9602b83612ac3565b91506133c48261335d565b604082019050919050565b600060208201905081810360008301526133e8816133ac565b9050919050565b7f4d6178206c6576656c206d757374206265206174206c65617374203100000000600082015250565b6000613425601c83612ac3565b9150613430826133ef565b602082019050919050565b6000602082019050818103600083015261345481613418565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006134b7602c83612ac3565b91506134c28261345b565b604082019050919050565b600060208201905081810360008301526134e6816134aa565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f596f7520646f206e6f74206f776e207468697320466c6f7765724e4654000000600082015250565b6000613552601d83612ac3565b915061355d8261351c565b602082019050919050565b6000602082019050818103600083015261358181613545565b9050919050565b7f416c7265616479206174206d6178206c6576656c000000000000000000000000600082015250565b60006135be601483612ac3565b91506135c982613588565b602082019050919050565b600060208201905081810360008301526135ed816135b1565b9050919050565b7f466c6f776572506f77657220636f6e7472616374206e6f742073657400000000600082015250565b600061362a601c83612ac3565b9150613635826135f4565b602082019050919050565b600060208201905081810360008301526136598161361d565b9050919050565b60008151905061366f81612c29565b92915050565b60006020828403121561368b5761368a6129f3565b5b600061369984828501613660565b91505092915050565b7f596f7520646f206e6f74206f776e207468697320466c6f776572506f7765722060008201527f4e46540000000000000000000000000000000000000000000000000000000000602082015250565b60006136fe602383612ac3565b9150613709826136a2565b604082019050919050565b6000602082019050818103600083015261372d816136f1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061376e82612b6a565b915061377983612b6a565b925082820190508082111561379157613790613734565b5b92915050565b60006060820190506137ac6000830186612c95565b6137b96020830185612c95565b6137c66040830184612c95565b949350505050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026138307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826137f3565b61383a86836137f3565b95508019841693508086168417925050509392505050565b600061386d61386861386384612b6a565b612f69565b612b6a565b9050919050565b6000819050919050565b61388783613852565b61389b61389382613874565b848454613800565b825550505050565b600090565b6138b06138a3565b6138bb81848461387e565b505050565b5b818110156138df576138d46000826138a8565b6001810190506138c1565b5050565b601f821115613924576138f5816137ce565b6138fe846137e3565b8101602085101561390d578190505b613921613919856137e3565b8301826138c0565b50505b505050565b600082821c905092915050565b600061394760001984600802613929565b1980831691505092915050565b60006139608383613936565b9150826002028217905092915050565b61397982612ab8565b67ffffffffffffffff81111561399257613991612d5c565b5b61399c8254613176565b6139a78282856138e3565b600060209050601f8311600181146139da57600084156139c8578287015190505b6139d28582613954565b865550613a3a565b601f1984166139e8866137ce565b60005b82811015613a10578489015182556001820191506020850194506020810190506139eb565b86831015613a2d5784890151613a29601f891682613936565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613a78601883612ac3565b9150613a8382613a42565b602082019050919050565b60006020820190508181036000830152613aa781613a6b565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613b0a602983612ac3565b9150613b1582613aae565b604082019050919050565b60006020820190508181036000830152613b3981613afd565b9050919050565b7f496e76616c696420616464726573730000000000000000000000000000000000600082015250565b6000613b76600f83612ac3565b9150613b8182613b40565b602082019050919050565b60006020820190508181036000830152613ba581613b69565b9050919050565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b6000613be2601483612ac3565b9150613bed82613bac565b602082019050919050565b60006020820190508181036000830152613c1181613bd5565b9050919050565b600081905092915050565b60008154613c3081613176565b613c3a8186613c18565b94506001821660008114613c555760018114613c6a57613c9d565b60ff1983168652811515820286019350613c9d565b613c73856137ce565b60005b83811015613c9557815481890152600182019150602081019050613c76565b838801955050505b50505092915050565b7f2f6c6576656c5f00000000000000000000000000000000000000000000000000600082015250565b6000613cdc600783613c18565b9150613ce782613ca6565b600782019050919050565b6000613cfd82612ab8565b613d078185613c18565b9350613d17818560208601612ad4565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613d59600583613c18565b9150613d6482613d23565b600582019050919050565b6000613d7b8285613c23565b9150613d8682613ccf565b9150613d928284613cf2565b9150613d9d82613d4c565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613e05602683612ac3565b9150613e1082613da9565b604082019050919050565b60006020820190508181036000830152613e3481613df8565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613e97602583612ac3565b9150613ea282613e3b565b604082019050919050565b60006020820190508181036000830152613ec681613e8a565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613f29602483612ac3565b9150613f3482613ecd565b604082019050919050565b60006020820190508181036000830152613f5881613f1c565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613f95602083612ac3565b9150613fa082613f5f565b602082019050919050565b60006020820190508181036000830152613fc481613f88565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000614001601083612ac3565b915061400c82613fcb565b602082019050919050565b6000602082019050818103600083015261403081613ff4565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061406d601983612ac3565b915061407882614037565b602082019050919050565b6000602082019050818103600083015261409c81614060565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006140ff603283612ac3565b915061410a826140a3565b604082019050919050565b6000602082019050818103600083015261412e816140f2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b60006141c0603583612ac3565b91506141cb82614164565b604082019050919050565b600060208201905081810360008301526141ef816141b3565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b600061422c601483612ac3565b9150614237826141f6565b602082019050919050565b6000602082019050818103600083015261425b8161421f565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061428982614262565b614293818561426d565b93506142a3818560208601612ad4565b6142ac81612afe565b840191505092915050565b60006080820190506142cc6000830187612bff565b6142d96020830186612bff565b6142e66040830185612c95565b81810360608301526142f8818461427e565b905095945050505050565b60008151905061431281612a29565b92915050565b60006020828403121561432e5761432d6129f3565b5b600061433c84828501614303565b91505092915050565b600061435082612b6a565b915061435b83612b6a565b925082820390508181111561437357614372613734565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006143de602083612ac3565b91506143e9826143a8565b602082019050919050565b6000602082019050818103600083015261440d816143d1565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061444a601c83612ac3565b915061445582614414565b602082019050919050565b600060208201905081810360008301526144798161443d565b905091905056fea264697066735822122097acc55fd57d3a06dd82e177e6ab73ecc616bddfa524df8e5a5ff190e06ff34764736f6c63430008130033

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

000000000000000000000000bdbc5db25ea27defced030b9fe78b7d43730b4fb00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000043697066733a2f2f626166796265696471786173786778756e6a376b6b6a363569636e74777662787374736e726c726c3436676b757561616e33776f73626433376a692f0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : POWERAddress (address): 0xBDbC5db25ea27dEFCeD030b9fE78b7D43730B4fB
Arg [1] : baseURI_ (string): ipfs://bafybeidqxasxgxunj7kkj65icntwvbxstsnrlrl46gkuuaan3wosbd37ji/

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000bdbc5db25ea27defced030b9fe78b7d43730b4fb
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [3] : 697066733a2f2f626166796265696471786173786778756e6a376b6b6a363569
Arg [4] : 636e74777662787374736e726c726c3436676b757561616e33776f7362643337
Arg [5] : 6a692f0000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

67637:2925:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56132:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39089:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40601:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40119:416;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56772:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41301:301;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56440:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68751:214;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70492:67;;;:::i;:::-;;41673:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56962:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69190:702;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69900:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66445:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38799:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68973:209;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38530:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63949:103;;;:::i;:::-;;68491:252;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70421:63;;;:::i;:::-;;63308:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39258:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40844:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67862:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67812:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41895:279;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70120:293;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67736:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41070:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64207:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56132:224;56234:4;56273:35;56258:50;;;:11;:50;;;;:90;;;;56312:36;56336:11;56312:23;:36::i;:::-;56258:90;56251:97;;56132:224;;;:::o;39089:100::-;39143:13;39176:5;39169:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39089:100;:::o;40601:171::-;40677:7;40697:23;40712:7;40697:14;:23::i;:::-;40740:15;:24;40756:7;40740:24;;;;;;;;;;;;;;;;;;;;;40733:31;;40601:171;;;:::o;40119:416::-;40200:13;40216:23;40231:7;40216:14;:23::i;:::-;40200:39;;40264:5;40258:11;;:2;:11;;;40250:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;40358:5;40342:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;40367:37;40384:5;40391:12;:10;:12::i;:::-;40367:16;:37::i;:::-;40342:62;40320:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;40506:21;40515:2;40519:7;40506:8;:21::i;:::-;40189:346;40119:416;;:::o;56772:113::-;56833:7;56860:10;:17;;;;56853:24;;56772:113;:::o;41301:301::-;41462:41;41481:12;:10;:12::i;:::-;41495:7;41462:18;:41::i;:::-;41454:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;41566:28;41576:4;41582:2;41586:7;41566:9;:28::i;:::-;41301:301;;;:::o;56440:256::-;56537:7;56573:23;56590:5;56573:16;:23::i;:::-;56565:5;:31;56557:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;56662:12;:19;56675:5;56662:19;;;;;;;;;;;;;;;:26;56682:5;56662:26;;;;;;;;;;;;56655:33;;56440:256;;;;:::o;68751:214::-;63194:13;:11;:13::i;:::-;68846:1:::1;68831:11;:16;;68823:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;68902:11;68891:8;:22;;;;68929:28;68945:11;68929:28;;;;;;:::i;:::-;;;;;;;;68751:214:::0;:::o;70492:67::-;63194:13;:11;:13::i;:::-;70541:10:::1;:8;:10::i;:::-;70492:67::o:0;41673:151::-;41777:39;41794:4;41800:2;41804:7;41777:39;;;;;;;;;;;;:16;:39::i;:::-;41673:151;;;:::o;56962:233::-;57037:7;57073:30;:28;:30::i;:::-;57065:5;:38;57057:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;57170:10;57181:5;57170:17;;;;;;;;:::i;:::-;;;;;;;;;;57163:24;;56962:233;;;:::o;69190:702::-;66050:19;:17;:19::i;:::-;69320:10:::1;69294:36;;:22;69302:13;69294:7;:22::i;:::-;:36;;;69286:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;69407:8;;69383:6;:21;69390:13;69383:21;;;;;;;;;;;;:32;69375:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;69499:1;69459:42;;69467:19;;;;;;;;;;;69459:42;;::::0;69451:83:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;69598:10;69553:55;;:19;;;;;;;;;;;:27;;;69581:12;69553:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:55;;;69545:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;69661:21;69685:6;:21;69692:13;69685:21;;;;;;;;;;;;69661:45;;69719:19;;;;;;;;;;;:24;;;69744:12;69719:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;69793:1;69768:6;:21;69775:13;69768:21;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;69820:10;69812:72;;;69832:13;69847;69862:6;:21;69869:13;69862:21;;;;;;;;;;;;69812:72;;;;;;;;:::i;:::-;;;;;;;;69275:617;69190:702:::0;;:::o;69900:104::-;63194:13;:11;:13::i;:::-;69986:10:::1;69976:7;:20;;;;;;:::i;:::-;;69900:104:::0;:::o;66445:86::-;66492:4;66516:7;;;;;;;;;;;66509:14;;66445:86;:::o;38799:223::-;38871:7;38891:13;38907:17;38916:7;38907:8;:17::i;:::-;38891:33;;38960:1;38943:19;;:5;:19;;;38935:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;39009:5;39002:12;;;38799:223;;;:::o;68973:209::-;63194:13;:11;:13::i;:::-;66050:19:::1;:17;:19::i;:::-;69043:15:::2;69077:1;69061:13;:11;:13::i;:::-;:17;;;;:::i;:::-;69043:35;;69089:22;69099:2;69103:7;69089:9;:22::i;:::-;69140:1;69122:6;:15;69129:7;69122:15;;;;;;;;;;;:19;;;;69162:2;69157:17;;;69166:7;69157:17;;;;;;:::i;:::-;;;;;;;;69032:150;68973:209:::0;:::o;38530:207::-;38602:7;38647:1;38630:19;;:5;:19;;;38622:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38713:9;:16;38723:5;38713:16;;;;;;;;;;;;;;;;38706:23;;38530:207;;;:::o;63949:103::-;63194:13;:11;:13::i;:::-;64014:30:::1;64041:1;64014:18;:30::i;:::-;63949:103::o:0;68491:252::-;63194:13;:11;:13::i;:::-;68602:1:::1;68580:24;;:10;:24;;::::0;68572:52:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;68670:10;68635:19;;:46;;;;;;;;;;;;;;;;;;68697:38;68724:10;68697:38;;;;;;:::i;:::-;;;;;;;;68491:252:::0;:::o;70421:63::-;63194:13;:11;:13::i;:::-;70468:8:::1;:6;:8::i;:::-;70421:63::o:0;63308:87::-;63354:7;63381:6;;;;;;;;;;;63374:13;;63308:87;:::o;39258:104::-;39314:13;39347:7;39340:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39258:104;:::o;40844:155::-;40939:52;40958:12;:10;:12::i;:::-;40972:8;40982;40939:18;:52::i;:::-;40844:155;;:::o;67862:39::-;;;;;;;;;;;;;:::o;67812:41::-;;;;;;;;;;;;;;;;;:::o;41895:279::-;42026:41;42045:12;:10;:12::i;:::-;42059:7;42026:18;:41::i;:::-;42018:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;42128:38;42142:4;42148:2;42152:7;42161:4;42128:13;:38::i;:::-;41895:279;;;;:::o;70120:293::-;70185:13;70219:16;70227:7;70219;:16::i;:::-;70211:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;70271:20;70294:6;:15;70301:7;70294:15;;;;;;;;;;;;70271:38;;70351:7;70371:23;:12;:21;:23::i;:::-;70334:70;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70320:85;;;70120:293;;;:::o;67736:28::-;;;;:::o;41070:164::-;41167:4;41191:18;:25;41210:5;41191:25;;;;;;;;;;;;;;;:35;41217:8;41191:35;;;;;;;;;;;;;;;;;;;;;;;;;41184:42;;41070:164;;;;:::o;64207:201::-;63194:13;:11;:13::i;:::-;64316:1:::1;64296:22;;:8;:22;;::::0;64288:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;64372:28;64391:8;64372:18;:28::i;:::-;64207:201:::0;:::o;38161:305::-;38263:4;38315:25;38300:40;;;:11;:40;;;;:105;;;;38372:33;38357:48;;;:11;:48;;;;38300:105;:158;;;;38422:36;38446:11;38422:23;:36::i;:::-;38300:158;38280:178;;38161:305;;;:::o;50164:135::-;50246:16;50254:7;50246;:16::i;:::-;50238:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;50164:135;:::o;18159:98::-;18212:7;18239:10;18232:17;;18159:98;:::o;49477:174::-;49579:2;49552:15;:24;49568:7;49552:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;49635:7;49631:2;49597:46;;49606:23;49621:7;49606:14;:23::i;:::-;49597:46;;;;;;;;;;;;49477:174;;:::o;44164:264::-;44257:4;44274:13;44290:23;44305:7;44290:14;:23::i;:::-;44274:39;;44343:5;44332:16;;:7;:16;;;:52;;;;44352:32;44369:5;44376:7;44352:16;:32::i;:::-;44332:52;:87;;;;44412:7;44388:31;;:20;44400:7;44388:11;:20::i;:::-;:31;;;44332:87;44324:96;;;44164:264;;;;:::o;48129:1229::-;48254:4;48227:31;;:23;48242:7;48227:14;:23::i;:::-;:31;;;48219:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;48333:1;48319:16;;:2;:16;;;48311:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;48389:42;48410:4;48416:2;48420:7;48429:1;48389:20;:42::i;:::-;48561:4;48534:31;;:23;48549:7;48534:14;:23::i;:::-;:31;;;48526:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;48679:15;:24;48695:7;48679:24;;;;;;;;;;;;48672:31;;;;;;;;;;;49174:1;49155:9;:15;49165:4;49155:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;49207:1;49190:9;:13;49200:2;49190:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;49249:2;49230:7;:16;49238:7;49230:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;49288:7;49284:2;49269:27;;49278:4;49269:27;;;;;;;;;;;;49309:41;49329:4;49335:2;49339:7;49348:1;49309:19;:41::i;:::-;48129:1229;;;:::o;63473:132::-;63548:12;:10;:12::i;:::-;63537:23;;:7;:5;:7::i;:::-;:23;;;63529:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63473:132::o;67300:120::-;66309:16;:14;:16::i;:::-;67369:5:::1;67359:7;;:15;;;;;;;;;;;;;;;;;;67390:22;67399:12;:10;:12::i;:::-;67390:22;;;;;;:::i;:::-;;;;;;;;67300:120::o:0;66604:108::-;66675:8;:6;:8::i;:::-;66674:9;66666:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;66604:108::o;43439:117::-;43505:7;43532;:16;43540:7;43532:16;;;;;;;;;;;;;;;;;;;;;43525:23;;43439:117;;;:::o;44770:110::-;44846:26;44856:2;44860:7;44846:26;;;;;;;;;;;;:9;:26::i;:::-;44770:110;;:::o;64568:191::-;64642:16;64661:6;;;;;;;;;;;64642:25;;64687:8;64678:6;;:17;;;;;;;;;;;;;;;;;;64742:8;64711:40;;64732:8;64711:40;;;;;;;;;;;;64631:128;64568:191;:::o;67041:118::-;66050:19;:17;:19::i;:::-;67111:4:::1;67101:7;;:14;;;;;;;;;;;;;;;;;;67131:20;67138:12;:10;:12::i;:::-;67131:20;;;;;;:::i;:::-;;;;;;;;67041:118::o:0;49794:281::-;49915:8;49906:17;;:5;:17;;;49898:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;50002:8;49964:18;:25;49983:5;49964:25;;;;;;;;;;;;;;;:35;49990:8;49964:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;50048:8;50026:41;;50041:5;50026:41;;;50058:8;50026:41;;;;;;:::i;:::-;;;;;;;;49794:281;;;:::o;43055:270::-;43168:28;43178:4;43184:2;43188:7;43168:9;:28::i;:::-;43215:47;43238:4;43244:2;43248:7;43257:4;43215:22;:47::i;:::-;43207:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;43055:270;;;;:::o;43869:128::-;43934:4;43987:1;43958:31;;:17;43967:7;43958:8;:17::i;:::-;:31;;;;43951:38;;43869:128;;;:::o;33311:716::-;33367:13;33418:14;33455:1;33435:17;33446:5;33435:10;:17::i;:::-;:21;33418:38;;33471:20;33505:6;33494:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33471:41;;33527:11;33656:6;33652:2;33648:15;33640:6;33636:28;33629:35;;33693:288;33700:4;33693:288;;;33725:5;;;;;;;;33867:8;33862:2;33855:5;33851:14;33846:30;33841:3;33833:44;33923:2;33914:11;;;;;;:::i;:::-;;;;;33957:1;33948:5;:10;33693:288;33944:21;33693:288;34002:6;33995:13;;;;;33311:716;;;:::o;36584:157::-;36669:4;36708:25;36693:40;;;:11;:40;;;;36686:47;;36584:157;;;:::o;57269:915::-;57446:61;57473:4;57479:2;57483:12;57497:9;57446:26;:61::i;:::-;57536:1;57524:9;:13;57520:222;;;57667:63;;;;;;;;;;:::i;:::-;;;;;;;;57520:222;57754:15;57772:12;57754:30;;57817:1;57801:18;;:4;:18;;;57797:187;;57836:40;57868:7;57836:31;:40::i;:::-;57797:187;;;57906:2;57898:10;;:4;:10;;;57894:90;;57925:47;57958:4;57964:7;57925:32;:47::i;:::-;57894:90;57797:187;58012:1;57998:16;;:2;:16;;;57994:183;;58031:45;58068:7;58031:36;:45::i;:::-;57994:183;;;58104:4;58098:10;;:2;:10;;;58094:83;;58125:40;58153:2;58157:7;58125:27;:40::i;:::-;58094:83;57994:183;57435:749;57269:915;;;;:::o;53286:115::-;;;;;:::o;66789:108::-;66856:8;:6;:8::i;:::-;66848:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;66789:108::o;45107:285::-;45202:18;45208:2;45212:7;45202:5;:18::i;:::-;45253:53;45284:1;45288:2;45292:7;45301:4;45253:22;:53::i;:::-;45231:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;45107:285;;;:::o;50863:853::-;51017:4;51038:15;:2;:13;;;:15::i;:::-;51034:675;;;51090:2;51074:36;;;51111:12;:10;:12::i;:::-;51125:4;51131:7;51140:4;51074:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;51070:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51332:1;51315:6;:13;:18;51311:328;;51358:60;;;;;;;;;;:::i;:::-;;;;;;;;51311:328;51589:6;51583:13;51574:6;51570:2;51566:15;51559:38;51070:584;51206:41;;;51196:51;;;:6;:51;;;;51189:58;;;;;51034:675;51693:4;51686:11;;50863:853;;;;;;;:::o;28794:948::-;28847:7;28867:14;28884:1;28867:18;;28934:8;28925:5;:17;28921:106;;28972:8;28963:17;;;;;;:::i;:::-;;;;;29009:2;28999:12;;;;28921:106;29054:8;29045:5;:17;29041:106;;29092:8;29083:17;;;;;;:::i;:::-;;;;;29129:2;29119:12;;;;29041:106;29174:8;29165:5;:17;29161:106;;29212:8;29203:17;;;;;;:::i;:::-;;;;;29249:2;29239:12;;;;29161:106;29294:7;29285:5;:16;29281:103;;29331:7;29322:16;;;;;;:::i;:::-;;;;;29367:1;29357:11;;;;29281:103;29411:7;29402:5;:16;29398:103;;29448:7;29439:16;;;;;;:::i;:::-;;;;;29484:1;29474:11;;;;29398:103;29528:7;29519:5;:16;29515:103;;29565:7;29556:16;;;;;;:::i;:::-;;;;;29601:1;29591:11;;;;29515:103;29645:7;29636:5;:16;29632:68;;29683:1;29673:11;;;;29632:68;29728:6;29721:13;;;28794:948;;;:::o;52448:116::-;;;;;:::o;58907:164::-;59011:10;:17;;;;58984:15;:24;59000:7;58984:24;;;;;;;;;;;:44;;;;59039:10;59055:7;59039:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58907:164;:::o;59698:988::-;59964:22;60014:1;59989:22;60006:4;59989:16;:22::i;:::-;:26;;;;:::i;:::-;59964:51;;60026:18;60047:17;:26;60065:7;60047:26;;;;;;;;;;;;60026:47;;60194:14;60180:10;:28;60176:328;;60225:19;60247:12;:18;60260:4;60247:18;;;;;;;;;;;;;;;:34;60266:14;60247:34;;;;;;;;;;;;60225:56;;60331:11;60298:12;:18;60311:4;60298:18;;;;;;;;;;;;;;;:30;60317:10;60298:30;;;;;;;;;;;:44;;;;60448:10;60415:17;:30;60433:11;60415:30;;;;;;;;;;;:43;;;;60210:294;60176:328;60600:17;:26;60618:7;60600:26;;;;;;;;;;;60593:33;;;60644:12;:18;60657:4;60644:18;;;;;;;;;;;;;;;:34;60663:14;60644:34;;;;;;;;;;;60637:41;;;59779:907;;59698:988;;:::o;60981:1079::-;61234:22;61279:1;61259:10;:17;;;;:21;;;;:::i;:::-;61234:46;;61291:18;61312:15;:24;61328:7;61312:24;;;;;;;;;;;;61291:45;;61663:19;61685:10;61696:14;61685:26;;;;;;;;:::i;:::-;;;;;;;;;;61663:48;;61749:11;61724:10;61735;61724:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;61860:10;61829:15;:28;61845:11;61829:28;;;;;;;;;;;:41;;;;62001:15;:24;62017:7;62001:24;;;;;;;;;;;61994:31;;;62036:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;61052:1008;;;60981:1079;:::o;58485:221::-;58570:14;58587:20;58604:2;58587:16;:20::i;:::-;58570:37;;58645:7;58618:12;:16;58631:2;58618:16;;;;;;;;;;;;;;;:24;58635:6;58618:24;;;;;;;;;;;:34;;;;58692:6;58663:17;:26;58681:7;58663:26;;;;;;;;;;;:35;;;;58559:147;58485:221;;:::o;45728:942::-;45822:1;45808:16;;:2;:16;;;45800:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;45881:16;45889:7;45881;:16::i;:::-;45880:17;45872:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;45943:48;45972:1;45976:2;45980:7;45989:1;45943:20;:48::i;:::-;46090:16;46098:7;46090;:16::i;:::-;46089:17;46081:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;46505:1;46488:9;:13;46498:2;46488:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;46549:2;46530:7;:16;46538:7;46530:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;46594:7;46590:2;46569:33;;46586:1;46569:33;;;;;;;;;;;;46615:47;46643:1;46647:2;46651:7;46660:1;46615:19;:47::i;:::-;45728:942;;:::o;9315:326::-;9375:4;9632:1;9610:7;:19;;;:23;9603:30;;9315:326;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:474::-;5935:6;5943;5992:2;5980:9;5971:7;5967:23;5963:32;5960:119;;;5998:79;;:::i;:::-;5960:119;6118:1;6143:53;6188:7;6179:6;6168:9;6164:22;6143:53;:::i;:::-;6133:63;;6089:117;6245:2;6271:53;6316:7;6307:6;6296:9;6292:22;6271:53;:::i;:::-;6261:63;;6216:118;5867:474;;;;;:::o;6347:117::-;6456:1;6453;6446:12;6470:117;6579:1;6576;6569:12;6593:180;6641:77;6638:1;6631:88;6738:4;6735:1;6728:15;6762:4;6759:1;6752:15;6779:281;6862:27;6884:4;6862:27;:::i;:::-;6854:6;6850:40;6992:6;6980:10;6977:22;6956:18;6944:10;6941:34;6938:62;6935:88;;;7003:18;;:::i;:::-;6935:88;7043:10;7039:2;7032:22;6822:238;6779:281;;:::o;7066:129::-;7100:6;7127:20;;:::i;:::-;7117:30;;7156:33;7184:4;7176:6;7156:33;:::i;:::-;7066:129;;;:::o;7201:308::-;7263:4;7353:18;7345:6;7342:30;7339:56;;;7375:18;;:::i;:::-;7339:56;7413:29;7435:6;7413:29;:::i;:::-;7405:37;;7497:4;7491;7487:15;7479:23;;7201:308;;;:::o;7515:146::-;7612:6;7607:3;7602;7589:30;7653:1;7644:6;7639:3;7635:16;7628:27;7515:146;;;:::o;7667:425::-;7745:5;7770:66;7786:49;7828:6;7786:49;:::i;:::-;7770:66;:::i;:::-;7761:75;;7859:6;7852:5;7845:21;7897:4;7890:5;7886:16;7935:3;7926:6;7921:3;7917:16;7914:25;7911:112;;;7942:79;;:::i;:::-;7911:112;8032:54;8079:6;8074:3;8069;8032:54;:::i;:::-;7751:341;7667:425;;;;;:::o;8112:340::-;8168:5;8217:3;8210:4;8202:6;8198:17;8194:27;8184:122;;8225:79;;:::i;:::-;8184:122;8342:6;8329:20;8367:79;8442:3;8434:6;8427:4;8419:6;8415:17;8367:79;:::i;:::-;8358:88;;8174:278;8112:340;;;;:::o;8458:509::-;8527:6;8576:2;8564:9;8555:7;8551:23;8547:32;8544:119;;;8582:79;;:::i;:::-;8544:119;8730:1;8719:9;8715:17;8702:31;8760:18;8752:6;8749:30;8746:117;;;8782:79;;:::i;:::-;8746:117;8887:63;8942:7;8933:6;8922:9;8918:22;8887:63;:::i;:::-;8877:73;;8673:287;8458:509;;;;:::o;8973:329::-;9032:6;9081:2;9069:9;9060:7;9056:23;9052:32;9049:119;;;9087:79;;:::i;:::-;9049:119;9207:1;9232:53;9277:7;9268:6;9257:9;9253:22;9232:53;:::i;:::-;9222:63;;9178:117;8973:329;;;;:::o;9308:116::-;9378:21;9393:5;9378:21;:::i;:::-;9371:5;9368:32;9358:60;;9414:1;9411;9404:12;9358:60;9308:116;:::o;9430:133::-;9473:5;9511:6;9498:20;9489:29;;9527:30;9551:5;9527:30;:::i;:::-;9430:133;;;;:::o;9569:468::-;9634:6;9642;9691:2;9679:9;9670:7;9666:23;9662:32;9659:119;;;9697:79;;:::i;:::-;9659:119;9817:1;9842:53;9887:7;9878:6;9867:9;9863:22;9842:53;:::i;:::-;9832:63;;9788:117;9944:2;9970:50;10012:7;10003:6;9992:9;9988:22;9970:50;:::i;:::-;9960:60;;9915:115;9569:468;;;;;:::o;10043:60::-;10071:3;10092:5;10085:12;;10043:60;;;:::o;10109:142::-;10159:9;10192:53;10210:34;10219:24;10237:5;10219:24;:::i;:::-;10210:34;:::i;:::-;10192:53;:::i;:::-;10179:66;;10109:142;;;:::o;10257:126::-;10307:9;10340:37;10371:5;10340:37;:::i;:::-;10327:50;;10257:126;;;:::o;10389:147::-;10460:9;10493:37;10524:5;10493:37;:::i;:::-;10480:50;;10389:147;;;:::o;10542:173::-;10650:58;10702:5;10650:58;:::i;:::-;10645:3;10638:71;10542:173;;:::o;10721:264::-;10835:4;10873:2;10862:9;10858:18;10850:26;;10886:92;10975:1;10964:9;10960:17;10951:6;10886:92;:::i;:::-;10721:264;;;;:::o;10991:307::-;11052:4;11142:18;11134:6;11131:30;11128:56;;;11164:18;;:::i;:::-;11128:56;11202:29;11224:6;11202:29;:::i;:::-;11194:37;;11286:4;11280;11276:15;11268:23;;10991:307;;;:::o;11304:423::-;11381:5;11406:65;11422:48;11463:6;11422:48;:::i;:::-;11406:65;:::i;:::-;11397:74;;11494:6;11487:5;11480:21;11532:4;11525:5;11521:16;11570:3;11561:6;11556:3;11552:16;11549:25;11546:112;;;11577:79;;:::i;:::-;11546:112;11667:54;11714:6;11709:3;11704;11667:54;:::i;:::-;11387:340;11304:423;;;;;:::o;11746:338::-;11801:5;11850:3;11843:4;11835:6;11831:17;11827:27;11817:122;;11858:79;;:::i;:::-;11817:122;11975:6;11962:20;12000:78;12074:3;12066:6;12059:4;12051:6;12047:17;12000:78;:::i;:::-;11991:87;;11807:277;11746:338;;;;:::o;12090:943::-;12185:6;12193;12201;12209;12258:3;12246:9;12237:7;12233:23;12229:33;12226:120;;;12265:79;;:::i;:::-;12226:120;12385:1;12410:53;12455:7;12446:6;12435:9;12431:22;12410:53;:::i;:::-;12400:63;;12356:117;12512:2;12538:53;12583:7;12574:6;12563:9;12559:22;12538:53;:::i;:::-;12528:63;;12483:118;12640:2;12666:53;12711:7;12702:6;12691:9;12687:22;12666:53;:::i;:::-;12656:63;;12611:118;12796:2;12785:9;12781:18;12768:32;12827:18;12819:6;12816:30;12813:117;;;12849:79;;:::i;:::-;12813:117;12954:62;13008:7;12999:6;12988:9;12984:22;12954:62;:::i;:::-;12944:72;;12739:287;12090:943;;;;;;;:::o;13039:474::-;13107:6;13115;13164:2;13152:9;13143:7;13139:23;13135:32;13132:119;;;13170:79;;:::i;:::-;13132:119;13290:1;13315:53;13360:7;13351:6;13340:9;13336:22;13315:53;:::i;:::-;13305:63;;13261:117;13417:2;13443:53;13488:7;13479:6;13468:9;13464:22;13443:53;:::i;:::-;13433:63;;13388:118;13039:474;;;;;:::o;13519:180::-;13567:77;13564:1;13557:88;13664:4;13661:1;13654:15;13688:4;13685:1;13678:15;13705:320;13749:6;13786:1;13780:4;13776:12;13766:22;;13833:1;13827:4;13823:12;13854:18;13844:81;;13910:4;13902:6;13898:17;13888:27;;13844:81;13972:2;13964:6;13961:14;13941:18;13938:38;13935:84;;13991:18;;:::i;:::-;13935:84;13756:269;13705:320;;;:::o;14031:220::-;14171:34;14167:1;14159:6;14155:14;14148:58;14240:3;14235:2;14227:6;14223:15;14216:28;14031:220;:::o;14257:366::-;14399:3;14420:67;14484:2;14479:3;14420:67;:::i;:::-;14413:74;;14496:93;14585:3;14496:93;:::i;:::-;14614:2;14609:3;14605:12;14598:19;;14257:366;;;:::o;14629:419::-;14795:4;14833:2;14822:9;14818:18;14810:26;;14882:9;14876:4;14872:20;14868:1;14857:9;14853:17;14846:47;14910:131;15036:4;14910:131;:::i;:::-;14902:139;;14629:419;;;:::o;15054:248::-;15194:34;15190:1;15182:6;15178:14;15171:58;15263:31;15258:2;15250:6;15246:15;15239:56;15054:248;:::o;15308:366::-;15450:3;15471:67;15535:2;15530:3;15471:67;:::i;:::-;15464:74;;15547:93;15636:3;15547:93;:::i;:::-;15665:2;15660:3;15656:12;15649:19;;15308:366;;;:::o;15680:419::-;15846:4;15884:2;15873:9;15869:18;15861:26;;15933:9;15927:4;15923:20;15919:1;15908:9;15904:17;15897:47;15961:131;16087:4;15961:131;:::i;:::-;15953:139;;15680:419;;;:::o;16105:232::-;16245:34;16241:1;16233:6;16229:14;16222:58;16314:15;16309:2;16301:6;16297:15;16290:40;16105:232;:::o;16343:366::-;16485:3;16506:67;16570:2;16565:3;16506:67;:::i;:::-;16499:74;;16582:93;16671:3;16582:93;:::i;:::-;16700:2;16695:3;16691:12;16684:19;;16343:366;;;:::o;16715:419::-;16881:4;16919:2;16908:9;16904:18;16896:26;;16968:9;16962:4;16958:20;16954:1;16943:9;16939:17;16932:47;16996:131;17122:4;16996:131;:::i;:::-;16988:139;;16715:419;;;:::o;17140:230::-;17280:34;17276:1;17268:6;17264:14;17257:58;17349:13;17344:2;17336:6;17332:15;17325:38;17140:230;:::o;17376:366::-;17518:3;17539:67;17603:2;17598:3;17539:67;:::i;:::-;17532:74;;17615:93;17704:3;17615:93;:::i;:::-;17733:2;17728:3;17724:12;17717:19;;17376:366;;;:::o;17748:419::-;17914:4;17952:2;17941:9;17937:18;17929:26;;18001:9;17995:4;17991:20;17987:1;17976:9;17972:17;17965:47;18029:131;18155:4;18029:131;:::i;:::-;18021:139;;17748:419;;;:::o;18173:178::-;18313:30;18309:1;18301:6;18297:14;18290:54;18173:178;:::o;18357:366::-;18499:3;18520:67;18584:2;18579:3;18520:67;:::i;:::-;18513:74;;18596:93;18685:3;18596:93;:::i;:::-;18714:2;18709:3;18705:12;18698:19;;18357:366;;;:::o;18729:419::-;18895:4;18933:2;18922:9;18918:18;18910:26;;18982:9;18976:4;18972:20;18968:1;18957:9;18953:17;18946:47;19010:131;19136:4;19010:131;:::i;:::-;19002:139;;18729:419;;;:::o;19154:231::-;19294:34;19290:1;19282:6;19278:14;19271:58;19363:14;19358:2;19350:6;19346:15;19339:39;19154:231;:::o;19391:366::-;19533:3;19554:67;19618:2;19613:3;19554:67;:::i;:::-;19547:74;;19630:93;19719:3;19630:93;:::i;:::-;19748:2;19743:3;19739:12;19732:19;;19391:366;;;:::o;19763:419::-;19929:4;19967:2;19956:9;19952:18;19944:26;;20016:9;20010:4;20006:20;20002:1;19991:9;19987:17;19980:47;20044:131;20170:4;20044:131;:::i;:::-;20036:139;;19763:419;;;:::o;20188:180::-;20236:77;20233:1;20226:88;20333:4;20330:1;20323:15;20357:4;20354:1;20347:15;20374:179;20514:31;20510:1;20502:6;20498:14;20491:55;20374:179;:::o;20559:366::-;20701:3;20722:67;20786:2;20781:3;20722:67;:::i;:::-;20715:74;;20798:93;20887:3;20798:93;:::i;:::-;20916:2;20911:3;20907:12;20900:19;;20559:366;;;:::o;20931:419::-;21097:4;21135:2;21124:9;21120:18;21112:26;;21184:9;21178:4;21174:20;21170:1;21159:9;21155:17;21148:47;21212:131;21338:4;21212:131;:::i;:::-;21204:139;;20931:419;;;:::o;21356:170::-;21496:22;21492:1;21484:6;21480:14;21473:46;21356:170;:::o;21532:366::-;21674:3;21695:67;21759:2;21754:3;21695:67;:::i;:::-;21688:74;;21771:93;21860:3;21771:93;:::i;:::-;21889:2;21884:3;21880:12;21873:19;;21532:366;;;:::o;21904:419::-;22070:4;22108:2;22097:9;22093:18;22085:26;;22157:9;22151:4;22147:20;22143:1;22132:9;22128:17;22121:47;22185:131;22311:4;22185:131;:::i;:::-;22177:139;;21904:419;;;:::o;22329:178::-;22469:30;22465:1;22457:6;22453:14;22446:54;22329:178;:::o;22513:366::-;22655:3;22676:67;22740:2;22735:3;22676:67;:::i;:::-;22669:74;;22752:93;22841:3;22752:93;:::i;:::-;22870:2;22865:3;22861:12;22854:19;;22513:366;;;:::o;22885:419::-;23051:4;23089:2;23078:9;23074:18;23066:26;;23138:9;23132:4;23128:20;23124:1;23113:9;23109:17;23102:47;23166:131;23292:4;23166:131;:::i;:::-;23158:139;;22885:419;;;:::o;23310:143::-;23367:5;23398:6;23392:13;23383:22;;23414:33;23441:5;23414:33;:::i;:::-;23310:143;;;;:::o;23459:351::-;23529:6;23578:2;23566:9;23557:7;23553:23;23549:32;23546:119;;;23584:79;;:::i;:::-;23546:119;23704:1;23729:64;23785:7;23776:6;23765:9;23761:22;23729:64;:::i;:::-;23719:74;;23675:128;23459:351;;;;:::o;23816:222::-;23956:34;23952:1;23944:6;23940:14;23933:58;24025:5;24020:2;24012:6;24008:15;24001:30;23816:222;:::o;24044:366::-;24186:3;24207:67;24271:2;24266:3;24207:67;:::i;:::-;24200:74;;24283:93;24372:3;24283:93;:::i;:::-;24401:2;24396:3;24392:12;24385:19;;24044:366;;;:::o;24416:419::-;24582:4;24620:2;24609:9;24605:18;24597:26;;24669:9;24663:4;24659:20;24655:1;24644:9;24640:17;24633:47;24697:131;24823:4;24697:131;:::i;:::-;24689:139;;24416:419;;;:::o;24841:180::-;24889:77;24886:1;24879:88;24986:4;24983:1;24976:15;25010:4;25007:1;25000:15;25027:191;25067:3;25086:20;25104:1;25086:20;:::i;:::-;25081:25;;25120:20;25138:1;25120:20;:::i;:::-;25115:25;;25163:1;25160;25156:9;25149:16;;25184:3;25181:1;25178:10;25175:36;;;25191:18;;:::i;:::-;25175:36;25027:191;;;;:::o;25224:442::-;25373:4;25411:2;25400:9;25396:18;25388:26;;25424:71;25492:1;25481:9;25477:17;25468:6;25424:71;:::i;:::-;25505:72;25573:2;25562:9;25558:18;25549:6;25505:72;:::i;:::-;25587;25655:2;25644:9;25640:18;25631:6;25587:72;:::i;:::-;25224:442;;;;;;:::o;25672:141::-;25721:4;25744:3;25736:11;;25767:3;25764:1;25757:14;25801:4;25798:1;25788:18;25780:26;;25672:141;;;:::o;25819:93::-;25856:6;25903:2;25898;25891:5;25887:14;25883:23;25873:33;;25819:93;;;:::o;25918:107::-;25962:8;26012:5;26006:4;26002:16;25981:37;;25918:107;;;;:::o;26031:393::-;26100:6;26150:1;26138:10;26134:18;26173:97;26203:66;26192:9;26173:97;:::i;:::-;26291:39;26321:8;26310:9;26291:39;:::i;:::-;26279:51;;26363:4;26359:9;26352:5;26348:21;26339:30;;26412:4;26402:8;26398:19;26391:5;26388:30;26378:40;;26107:317;;26031:393;;;;;:::o;26430:142::-;26480:9;26513:53;26531:34;26540:24;26558:5;26540:24;:::i;:::-;26531:34;:::i;:::-;26513:53;:::i;:::-;26500:66;;26430:142;;;:::o;26578:75::-;26621:3;26642:5;26635:12;;26578:75;;;:::o;26659:269::-;26769:39;26800:7;26769:39;:::i;:::-;26830:91;26879:41;26903:16;26879:41;:::i;:::-;26871:6;26864:4;26858:11;26830:91;:::i;:::-;26824:4;26817:105;26735:193;26659:269;;;:::o;26934:73::-;26979:3;26934:73;:::o;27013:189::-;27090:32;;:::i;:::-;27131:65;27189:6;27181;27175:4;27131:65;:::i;:::-;27066:136;27013:189;;:::o;27208:186::-;27268:120;27285:3;27278:5;27275:14;27268:120;;;27339:39;27376:1;27369:5;27339:39;:::i;:::-;27312:1;27305:5;27301:13;27292:22;;27268:120;;;27208:186;;:::o;27400:543::-;27501:2;27496:3;27493:11;27490:446;;;27535:38;27567:5;27535:38;:::i;:::-;27619:29;27637:10;27619:29;:::i;:::-;27609:8;27605:44;27802:2;27790:10;27787:18;27784:49;;;27823:8;27808:23;;27784:49;27846:80;27902:22;27920:3;27902:22;:::i;:::-;27892:8;27888:37;27875:11;27846:80;:::i;:::-;27505:431;;27490:446;27400:543;;;:::o;27949:117::-;28003:8;28053:5;28047:4;28043:16;28022:37;;27949:117;;;;:::o;28072:169::-;28116:6;28149:51;28197:1;28193:6;28185:5;28182:1;28178:13;28149:51;:::i;:::-;28145:56;28230:4;28224;28220:15;28210:25;;28123:118;28072:169;;;;:::o;28246:295::-;28322:4;28468:29;28493:3;28487:4;28468:29;:::i;:::-;28460:37;;28530:3;28527:1;28523:11;28517:4;28514:21;28506:29;;28246:295;;;;:::o;28546:1395::-;28663:37;28696:3;28663:37;:::i;:::-;28765:18;28757:6;28754:30;28751:56;;;28787:18;;:::i;:::-;28751:56;28831:38;28863:4;28857:11;28831:38;:::i;:::-;28916:67;28976:6;28968;28962:4;28916:67;:::i;:::-;29010:1;29034:4;29021:17;;29066:2;29058:6;29055:14;29083:1;29078:618;;;;29740:1;29757:6;29754:77;;;29806:9;29801:3;29797:19;29791:26;29782:35;;29754:77;29857:67;29917:6;29910:5;29857:67;:::i;:::-;29851:4;29844:81;29713:222;29048:887;;29078:618;29130:4;29126:9;29118:6;29114:22;29164:37;29196:4;29164:37;:::i;:::-;29223:1;29237:208;29251:7;29248:1;29245:14;29237:208;;;29330:9;29325:3;29321:19;29315:26;29307:6;29300:42;29381:1;29373:6;29369:14;29359:24;;29428:2;29417:9;29413:18;29400:31;;29274:4;29271:1;29267:12;29262:17;;29237:208;;;29473:6;29464:7;29461:19;29458:179;;;29531:9;29526:3;29522:19;29516:26;29574:48;29616:4;29608:6;29604:17;29593:9;29574:48;:::i;:::-;29566:6;29559:64;29481:156;29458:179;29683:1;29679;29671:6;29667:14;29663:22;29657:4;29650:36;29085:611;;;29048:887;;28638:1303;;;28546:1395;;:::o;29947:174::-;30087:26;30083:1;30075:6;30071:14;30064:50;29947:174;:::o;30127:366::-;30269:3;30290:67;30354:2;30349:3;30290:67;:::i;:::-;30283:74;;30366:93;30455:3;30366:93;:::i;:::-;30484:2;30479:3;30475:12;30468:19;;30127:366;;;:::o;30499:419::-;30665:4;30703:2;30692:9;30688:18;30680:26;;30752:9;30746:4;30742:20;30738:1;30727:9;30723:17;30716:47;30780:131;30906:4;30780:131;:::i;:::-;30772:139;;30499:419;;;:::o;30924:228::-;31064:34;31060:1;31052:6;31048:14;31041:58;31133:11;31128:2;31120:6;31116:15;31109:36;30924:228;:::o;31158:366::-;31300:3;31321:67;31385:2;31380:3;31321:67;:::i;:::-;31314:74;;31397:93;31486:3;31397:93;:::i;:::-;31515:2;31510:3;31506:12;31499:19;;31158:366;;;:::o;31530:419::-;31696:4;31734:2;31723:9;31719:18;31711:26;;31783:9;31777:4;31773:20;31769:1;31758:9;31754:17;31747:47;31811:131;31937:4;31811:131;:::i;:::-;31803:139;;31530:419;;;:::o;31955:165::-;32095:17;32091:1;32083:6;32079:14;32072:41;31955:165;:::o;32126:366::-;32268:3;32289:67;32353:2;32348:3;32289:67;:::i;:::-;32282:74;;32365:93;32454:3;32365:93;:::i;:::-;32483:2;32478:3;32474:12;32467:19;;32126:366;;;:::o;32498:419::-;32664:4;32702:2;32691:9;32687:18;32679:26;;32751:9;32745:4;32741:20;32737:1;32726:9;32722:17;32715:47;32779:131;32905:4;32779:131;:::i;:::-;32771:139;;32498:419;;;:::o;32923:170::-;33063:22;33059:1;33051:6;33047:14;33040:46;32923:170;:::o;33099:366::-;33241:3;33262:67;33326:2;33321:3;33262:67;:::i;:::-;33255:74;;33338:93;33427:3;33338:93;:::i;:::-;33456:2;33451:3;33447:12;33440:19;;33099:366;;;:::o;33471:419::-;33637:4;33675:2;33664:9;33660:18;33652:26;;33724:9;33718:4;33714:20;33710:1;33699:9;33695:17;33688:47;33752:131;33878:4;33752:131;:::i;:::-;33744:139;;33471:419;;;:::o;33896:148::-;33998:11;34035:3;34020:18;;33896:148;;;;:::o;34074:874::-;34177:3;34214:5;34208:12;34243:36;34269:9;34243:36;:::i;:::-;34295:89;34377:6;34372:3;34295:89;:::i;:::-;34288:96;;34415:1;34404:9;34400:17;34431:1;34426:166;;;;34606:1;34601:341;;;;34393:549;;34426:166;34510:4;34506:9;34495;34491:25;34486:3;34479:38;34572:6;34565:14;34558:22;34550:6;34546:35;34541:3;34537:45;34530:52;;34426:166;;34601:341;34668:38;34700:5;34668:38;:::i;:::-;34728:1;34742:154;34756:6;34753:1;34750:13;34742:154;;;34830:7;34824:14;34820:1;34815:3;34811:11;34804:35;34880:1;34871:7;34867:15;34856:26;;34778:4;34775:1;34771:12;34766:17;;34742:154;;;34925:6;34920:3;34916:16;34909:23;;34608:334;;34393:549;;34181:767;;34074:874;;;;:::o;34954:157::-;35094:9;35090:1;35082:6;35078:14;35071:33;34954:157;:::o;35117:400::-;35277:3;35298:84;35380:1;35375:3;35298:84;:::i;:::-;35291:91;;35391:93;35480:3;35391:93;:::i;:::-;35509:1;35504:3;35500:11;35493:18;;35117:400;;;:::o;35523:390::-;35629:3;35657:39;35690:5;35657:39;:::i;:::-;35712:89;35794:6;35789:3;35712:89;:::i;:::-;35705:96;;35810:65;35868:6;35863:3;35856:4;35849:5;35845:16;35810:65;:::i;:::-;35900:6;35895:3;35891:16;35884:23;;35633:280;35523:390;;;;:::o;35919:155::-;36059:7;36055:1;36047:6;36043:14;36036:31;35919:155;:::o;36080:400::-;36240:3;36261:84;36343:1;36338:3;36261:84;:::i;:::-;36254:91;;36354:93;36443:3;36354:93;:::i;:::-;36472:1;36467:3;36463:11;36456:18;;36080:400;;;:::o;36486:961::-;36865:3;36887:92;36975:3;36966:6;36887:92;:::i;:::-;36880:99;;36996:148;37140:3;36996:148;:::i;:::-;36989:155;;37161:95;37252:3;37243:6;37161:95;:::i;:::-;37154:102;;37273:148;37417:3;37273:148;:::i;:::-;37266:155;;37438:3;37431:10;;36486:961;;;;;:::o;37453:225::-;37593:34;37589:1;37581:6;37577:14;37570:58;37662:8;37657:2;37649:6;37645:15;37638:33;37453:225;:::o;37684:366::-;37826:3;37847:67;37911:2;37906:3;37847:67;:::i;:::-;37840:74;;37923:93;38012:3;37923:93;:::i;:::-;38041:2;38036:3;38032:12;38025:19;;37684:366;;;:::o;38056:419::-;38222:4;38260:2;38249:9;38245:18;38237:26;;38309:9;38303:4;38299:20;38295:1;38284:9;38280:17;38273:47;38337:131;38463:4;38337:131;:::i;:::-;38329:139;;38056:419;;;:::o;38481:224::-;38621:34;38617:1;38609:6;38605:14;38598:58;38690:7;38685:2;38677:6;38673:15;38666:32;38481:224;:::o;38711:366::-;38853:3;38874:67;38938:2;38933:3;38874:67;:::i;:::-;38867:74;;38950:93;39039:3;38950:93;:::i;:::-;39068:2;39063:3;39059:12;39052:19;;38711:366;;;:::o;39083:419::-;39249:4;39287:2;39276:9;39272:18;39264:26;;39336:9;39330:4;39326:20;39322:1;39311:9;39307:17;39300:47;39364:131;39490:4;39364:131;:::i;:::-;39356:139;;39083:419;;;:::o;39508:223::-;39648:34;39644:1;39636:6;39632:14;39625:58;39717:6;39712:2;39704:6;39700:15;39693:31;39508:223;:::o;39737:366::-;39879:3;39900:67;39964:2;39959:3;39900:67;:::i;:::-;39893:74;;39976:93;40065:3;39976:93;:::i;:::-;40094:2;40089:3;40085:12;40078:19;;39737:366;;;:::o;40109:419::-;40275:4;40313:2;40302:9;40298:18;40290:26;;40362:9;40356:4;40352:20;40348:1;40337:9;40333:17;40326:47;40390:131;40516:4;40390:131;:::i;:::-;40382:139;;40109:419;;;:::o;40534:182::-;40674:34;40670:1;40662:6;40658:14;40651:58;40534:182;:::o;40722:366::-;40864:3;40885:67;40949:2;40944:3;40885:67;:::i;:::-;40878:74;;40961:93;41050:3;40961:93;:::i;:::-;41079:2;41074:3;41070:12;41063:19;;40722:366;;;:::o;41094:419::-;41260:4;41298:2;41287:9;41283:18;41275:26;;41347:9;41341:4;41337:20;41333:1;41322:9;41318:17;41311:47;41375:131;41501:4;41375:131;:::i;:::-;41367:139;;41094:419;;;:::o;41519:166::-;41659:18;41655:1;41647:6;41643:14;41636:42;41519:166;:::o;41691:366::-;41833:3;41854:67;41918:2;41913:3;41854:67;:::i;:::-;41847:74;;41930:93;42019:3;41930:93;:::i;:::-;42048:2;42043:3;42039:12;42032:19;;41691:366;;;:::o;42063:419::-;42229:4;42267:2;42256:9;42252:18;42244:26;;42316:9;42310:4;42306:20;42302:1;42291:9;42287:17;42280:47;42344:131;42470:4;42344:131;:::i;:::-;42336:139;;42063:419;;;:::o;42488:175::-;42628:27;42624:1;42616:6;42612:14;42605:51;42488:175;:::o;42669:366::-;42811:3;42832:67;42896:2;42891:3;42832:67;:::i;:::-;42825:74;;42908:93;42997:3;42908:93;:::i;:::-;43026:2;43021:3;43017:12;43010:19;;42669:366;;;:::o;43041:419::-;43207:4;43245:2;43234:9;43230:18;43222:26;;43294:9;43288:4;43284:20;43280:1;43269:9;43265:17;43258:47;43322:131;43448:4;43322:131;:::i;:::-;43314:139;;43041:419;;;:::o;43466:237::-;43606:34;43602:1;43594:6;43590:14;43583:58;43675:20;43670:2;43662:6;43658:15;43651:45;43466:237;:::o;43709:366::-;43851:3;43872:67;43936:2;43931:3;43872:67;:::i;:::-;43865:74;;43948:93;44037:3;43948:93;:::i;:::-;44066:2;44061:3;44057:12;44050:19;;43709:366;;;:::o;44081:419::-;44247:4;44285:2;44274:9;44270:18;44262:26;;44334:9;44328:4;44324:20;44320:1;44309:9;44305:17;44298:47;44362:131;44488:4;44362:131;:::i;:::-;44354:139;;44081:419;;;:::o;44506:180::-;44554:77;44551:1;44544:88;44651:4;44648:1;44641:15;44675:4;44672:1;44665:15;44692:240;44832:34;44828:1;44820:6;44816:14;44809:58;44901:23;44896:2;44888:6;44884:15;44877:48;44692:240;:::o;44938:366::-;45080:3;45101:67;45165:2;45160:3;45101:67;:::i;:::-;45094:74;;45177:93;45266:3;45177:93;:::i;:::-;45295:2;45290:3;45286:12;45279:19;;44938:366;;;:::o;45310:419::-;45476:4;45514:2;45503:9;45499:18;45491:26;;45563:9;45557:4;45553:20;45549:1;45538:9;45534:17;45527:47;45591:131;45717:4;45591:131;:::i;:::-;45583:139;;45310:419;;;:::o;45735:170::-;45875:22;45871:1;45863:6;45859:14;45852:46;45735:170;:::o;45911:366::-;46053:3;46074:67;46138:2;46133:3;46074:67;:::i;:::-;46067:74;;46150:93;46239:3;46150:93;:::i;:::-;46268:2;46263:3;46259:12;46252:19;;45911:366;;;:::o;46283:419::-;46449:4;46487:2;46476:9;46472:18;46464:26;;46536:9;46530:4;46526:20;46522:1;46511:9;46507:17;46500:47;46564:131;46690:4;46564:131;:::i;:::-;46556:139;;46283:419;;;:::o;46708:98::-;46759:6;46793:5;46787:12;46777:22;;46708:98;;;:::o;46812:168::-;46895:11;46929:6;46924:3;46917:19;46969:4;46964:3;46960:14;46945:29;;46812:168;;;;:::o;46986:373::-;47072:3;47100:38;47132:5;47100:38;:::i;:::-;47154:70;47217:6;47212:3;47154:70;:::i;:::-;47147:77;;47233:65;47291:6;47286:3;47279:4;47272:5;47268:16;47233:65;:::i;:::-;47323:29;47345:6;47323:29;:::i;:::-;47318:3;47314:39;47307:46;;47076:283;46986:373;;;;:::o;47365:640::-;47560:4;47598:3;47587:9;47583:19;47575:27;;47612:71;47680:1;47669:9;47665:17;47656:6;47612:71;:::i;:::-;47693:72;47761:2;47750:9;47746:18;47737:6;47693:72;:::i;:::-;47775;47843:2;47832:9;47828:18;47819:6;47775:72;:::i;:::-;47894:9;47888:4;47884:20;47879:2;47868:9;47864:18;47857:48;47922:76;47993:4;47984:6;47922:76;:::i;:::-;47914:84;;47365:640;;;;;;;:::o;48011:141::-;48067:5;48098:6;48092:13;48083:22;;48114:32;48140:5;48114:32;:::i;:::-;48011:141;;;;:::o;48158:349::-;48227:6;48276:2;48264:9;48255:7;48251:23;48247:32;48244:119;;;48282:79;;:::i;:::-;48244:119;48402:1;48427:63;48482:7;48473:6;48462:9;48458:22;48427:63;:::i;:::-;48417:73;;48373:127;48158:349;;;;:::o;48513:194::-;48553:4;48573:20;48591:1;48573:20;:::i;:::-;48568:25;;48607:20;48625:1;48607:20;:::i;:::-;48602:25;;48651:1;48648;48644:9;48636:17;;48675:1;48669:4;48666:11;48663:37;;;48680:18;;:::i;:::-;48663:37;48513:194;;;;:::o;48713:180::-;48761:77;48758:1;48751:88;48858:4;48855:1;48848:15;48882:4;48879:1;48872:15;48899:182;49039:34;49035:1;49027:6;49023:14;49016:58;48899:182;:::o;49087:366::-;49229:3;49250:67;49314:2;49309:3;49250:67;:::i;:::-;49243:74;;49326:93;49415:3;49326:93;:::i;:::-;49444:2;49439:3;49435:12;49428:19;;49087:366;;;:::o;49459:419::-;49625:4;49663:2;49652:9;49648:18;49640:26;;49712:9;49706:4;49702:20;49698:1;49687:9;49683:17;49676:47;49740:131;49866:4;49740:131;:::i;:::-;49732:139;;49459:419;;;:::o;49884:178::-;50024:30;50020:1;50012:6;50008:14;50001:54;49884:178;:::o;50068:366::-;50210:3;50231:67;50295:2;50290:3;50231:67;:::i;:::-;50224:74;;50307:93;50396:3;50307:93;:::i;:::-;50425:2;50420:3;50416:12;50409:19;;50068:366;;;:::o;50440:419::-;50606:4;50644:2;50633:9;50629:18;50621:26;;50693:9;50687:4;50683:20;50679:1;50668:9;50664:17;50657:47;50721:131;50847:4;50721:131;:::i;:::-;50713:139;;50440:419;;;:::o

Swarm Source

ipfs://97acc55fd57d3a06dd82e177e6ab73ecc616bddfa524df8e5a5ff190e06ff347
[ 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.