ETH Price: $3,317.35 (-2.97%)

Token

MetaPartyHub Genesis (MPH)
 

Overview

Max Total Supply

0 MPH

Holders

64

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
sybilian.eth
Balance
1 MPH
0x08c4e146e9e0935c627049cc21dfefbe9e384004
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
MPH

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-03-18
*/

// SPDX-License-Identifier: GPL-3.0

// File: @openzeppelin/contracts/utils/math/Math.sol


// OpenZeppelin Contracts (last updated v4.8.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) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 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 10, 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 * 8) < value ? 1 : 0);
        }
    }
}

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


// OpenZeppelin Contracts (last updated v4.8.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 `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);
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts (last updated v4.8.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/contracts/token/ERC721/extensions/IERC721Metadata.sol


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

pragma solidity ^0.8.0;


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

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

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

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


// OpenZeppelin Contracts (last updated v4.8.2) (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/contracts/token/ERC721/extensions/ERC721URIStorage.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

        return super.tokenURI(tokenId);
    }

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

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

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

// File: contracts/NFT.sol



pragma solidity >=0.8.2 <0.9.0;




contract MPH is Ownable, ERC721URIStorage {

    uint MAX_TOKEN_SUPPLY = 690;
    uint MAX_TOKENS_PER_ADDRESS = 1;
    uint MINT_PRICE = 6900000 gwei;
    string METADATA_URI = "QmbQaToGD648Zid4CgMe7JDocfYcGkaGgX4hpc64vDoqKL";
    uint totalSupply = 0;

    modifier supplyAvailable(){
    require(totalSupply < MAX_TOKEN_SUPPLY, "Max token supply has been reached.");
    
    _;}

    event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId);

constructor() ERC721("MetaPartyHub Genesis","MPH") {
        
    }

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

    function mint() public supplyAvailable payable{
        require(msg.value == MINT_PRICE,"Not correct payment amount.");
        address to = msg.sender;
        uint tokenId = totalSupply;
    
        require(balanceOf(to) < MAX_TOKENS_PER_ADDRESS, "Max tokens for this address has been reached.");

        _mint(to,tokenId);

_setTokenURI(tokenId, METADATA_URI);

        totalSupply += 1;

    }

    function setTokenMetaData(string memory uri) onlyOwner public {
        METADATA_URI = uri;
        emit BatchMetadataUpdate(0, type(uint256).max);
    }

    function setMaxTokenSupply(uint newMaxTokenSupply) public onlyOwner{
        MAX_TOKEN_SUPPLY = newMaxTokenSupply;
    }

        function setMaxTokensPerAddress(uint newMaxTokensPerAddres) public onlyOwner{
        MAX_TOKENS_PER_ADDRESS = newMaxTokensPerAddres;
    }

    function withdraw() public onlyOwner {
        uint amount = address(this).balance;
        (bool success, ) = owner().call{value: amount}("");
        require(success, "Failed to send Ether");
    }



function tokenURI(uint256 _tokenId) public view override returns  (string memory) {
  return string(abi.encodePacked(_baseURI(),METADATA_URI,'/',Strings.toString(_tokenId)));
}

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_toTokenId","type":"uint256"}],"name":"BatchMetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"uint256","name":"newMaxTokenSupply","type":"uint256"}],"name":"setMaxTokenSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxTokensPerAddres","type":"uint256"}],"name":"setMaxTokensPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setTokenMetaData","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":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526102b260085560016009556618838370f34000600a556040518060600160405280602e8152602001620039ba602e9139600b908162000044919062000456565b506000600c553480156200005757600080fd5b506040518060400160405280601481526020017f4d65746150617274794875622047656e657369730000000000000000000000008152506040518060400160405280600381526020017f4d50480000000000000000000000000000000000000000000000000000000000815250620000e4620000d86200011060201b60201c565b6200011860201b60201c565b8160019081620000f5919062000456565b50806002908162000107919062000456565b5050506200053d565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200025e57607f821691505b60208210810362000274576200027362000216565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620002de7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200029f565b620002ea86836200029f565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000337620003316200032b8462000302565b6200030c565b62000302565b9050919050565b6000819050919050565b620003538362000316565b6200036b62000362826200033e565b848454620002ac565b825550505050565b600090565b6200038262000373565b6200038f81848462000348565b505050565b5b81811015620003b757620003ab60008262000378565b60018101905062000395565b5050565b601f8211156200040657620003d0816200027a565b620003db846200028f565b81016020851015620003eb578190505b62000403620003fa856200028f565b83018262000394565b50505b505050565b600082821c905092915050565b60006200042b600019846008026200040b565b1980831691505092915050565b600062000446838362000418565b9150826002028217905092915050565b6200046182620001dc565b67ffffffffffffffff8111156200047d576200047c620001e7565b5b62000489825462000245565b62000496828285620003bb565b600060209050601f831160018114620004ce5760008415620004b9578287015190505b620004c5858262000438565b86555062000535565b601f198416620004de866200027a565b60005b828110156200050857848901518255600182019150602085019450602081019050620004e1565b8683101562000528578489015162000524601f89168262000418565b8355505b6001600288020188555050505b505050505050565b61346d806200054d6000396000f3fe60806040526004361061012a5760003560e01c8063715018a6116100ab578063b1316d7b1161006f578063b1316d7b146103a9578063b88d4fde146103d2578063c87b56dd146103fb578063dbb84f1114610438578063e985e9c514610461578063f2fde38b1461049e5761012a565b8063715018a6146102ea5780638da5cb5b1461030157806395d89b411461032c578063a22cb46514610357578063b07ed982146103805761012a565b806323b872dd116100f257806323b872dd146102075780633ccfd60b1461023057806342842e0e146102475780636352211e1461027057806370a08231146102ad5761012a565b806301ffc9a71461012f57806306fdde031461016c578063081812fc14610197578063095ea7b3146101d45780631249c58b146101fd575b600080fd5b34801561013b57600080fd5b5061015660048036038101906101519190611e81565b6104c7565b6040516101639190611ec9565b60405180910390f35b34801561017857600080fd5b506101816105a9565b60405161018e9190611f74565b60405180910390f35b3480156101a357600080fd5b506101be60048036038101906101b99190611fcc565b61063b565b6040516101cb919061203a565b60405180910390f35b3480156101e057600080fd5b506101fb60048036038101906101f69190612081565b610681565b005b610205610798565b005b34801561021357600080fd5b5061022e600480360381019061022991906120c1565b610936565b005b34801561023c57600080fd5b50610245610996565b005b34801561025357600080fd5b5061026e600480360381019061026991906120c1565b610a5a565b005b34801561027c57600080fd5b5061029760048036038101906102929190611fcc565b610a7a565b6040516102a4919061203a565b60405180910390f35b3480156102b957600080fd5b506102d460048036038101906102cf9190612114565b610b00565b6040516102e19190612150565b60405180910390f35b3480156102f657600080fd5b506102ff610bb7565b005b34801561030d57600080fd5b50610316610bcb565b604051610323919061203a565b60405180910390f35b34801561033857600080fd5b50610341610bf4565b60405161034e9190611f74565b60405180910390f35b34801561036357600080fd5b5061037e60048036038101906103799190612197565b610c86565b005b34801561038c57600080fd5b506103a760048036038101906103a29190611fcc565b610c9c565b005b3480156103b557600080fd5b506103d060048036038101906103cb919061230c565b610cae565b005b3480156103de57600080fd5b506103f960048036038101906103f491906123f6565b610d23565b005b34801561040757600080fd5b50610422600480360381019061041d9190611fcc565b610d85565b60405161042f9190611f74565b60405180910390f35b34801561044457600080fd5b5061045f600480360381019061045a9190611fcc565b610dc2565b005b34801561046d57600080fd5b5061048860048036038101906104839190612479565b610dd4565b6040516104959190611ec9565b60405180910390f35b3480156104aa57600080fd5b506104c560048036038101906104c09190612114565b610e68565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061059257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105a257506105a182610eeb565b5b9050919050565b6060600180546105b8906124e8565b80601f01602080910402602001604051908101604052809291908181526020018280546105e4906124e8565b80156106315780601f1061060657610100808354040283529160200191610631565b820191906000526020600020905b81548152906001019060200180831161061457829003601f168201915b5050505050905090565b600061064682610f55565b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061068c82610a7a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036106fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106f39061258b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661071b610fa0565b73ffffffffffffffffffffffffffffffffffffffff16148061074a575061074981610744610fa0565b610dd4565b5b610789576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107809061261d565b60405180910390fd5b6107938383610fa8565b505050565b600854600c54106107de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d5906126af565b60405180910390fd5b600a543414610822576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108199061271b565b60405180910390fd5b60003390506000600c54905060095461083a83610b00565b1061087a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610871906127ad565b60405180910390fd5b6108848282611061565b61091881600b8054610895906124e8565b80601f01602080910402602001604051908101604052809291908181526020018280546108c1906124e8565b801561090e5780601f106108e35761010080835404028352916020019161090e565b820191906000526020600020905b8154815290600101906020018083116108f157829003601f168201915b505050505061127e565b6001600c600082825461092b91906127fc565b925050819055505050565b610947610941610fa0565b826112eb565b610986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097d906128a2565b60405180910390fd5b610991838383611380565b505050565b61099e611679565b600047905060006109ad610bcb565b73ffffffffffffffffffffffffffffffffffffffff16826040516109d0906128f3565b60006040518083038185875af1925050503d8060008114610a0d576040519150601f19603f3d011682016040523d82523d6000602084013e610a12565b606091505b5050905080610a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4d90612954565b60405180910390fd5b5050565b610a7583838360405180602001604052806000815250610d23565b505050565b600080610a86836116f7565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aee906129c0565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6790612a52565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610bbf611679565b610bc96000611734565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054610c03906124e8565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2f906124e8565b8015610c7c5780601f10610c5157610100808354040283529160200191610c7c565b820191906000526020600020905b815481529060010190602001808311610c5f57829003601f168201915b5050505050905090565b610c98610c91610fa0565b83836117f8565b5050565b610ca4611679565b8060088190555050565b610cb6611679565b80600b9081610cc59190612c1e565b507f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff604051610d18929190612d2b565b60405180910390a150565b610d34610d2e610fa0565b836112eb565b610d73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6a906128a2565b60405180910390fd5b610d7f84848484611964565b50505050565b6060610d8f6119c0565b600b610d9a846119fd565b604051602001610dac93929190612e5f565b6040516020818303038152906040529050919050565b610dca611679565b8060098190555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610e70611679565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed690612f0d565b60405180910390fd5b610ee881611734565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610f5e81611acb565b610f9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f94906129c0565b60405180910390fd5b50565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661101b83610a7a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c790612f79565b60405180910390fd5b6110d981611acb565b15611119576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111090612fe5565b60405180910390fd5b611127600083836001611b0c565b61113081611acb565b15611170576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116790612fe5565b60405180910390fd5b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461127a600083836001611b12565b5050565b61128782611acb565b6112c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bd90613077565b60405180910390fd5b806007600084815260200190815260200160002090816112e69190612c1e565b505050565b6000806112f783610a7a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061133957506113388185610dd4565b5b8061137757508373ffffffffffffffffffffffffffffffffffffffff1661135f8461063b565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166113a082610a7a565b73ffffffffffffffffffffffffffffffffffffffff16146113f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ed90613109565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145c9061319b565b60405180910390fd5b6114728383836001611b0c565b8273ffffffffffffffffffffffffffffffffffffffff1661149282610a7a565b73ffffffffffffffffffffffffffffffffffffffff16146114e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114df90613109565b60405180910390fd5b6005600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46116748383836001611b12565b505050565b611681610fa0565b73ffffffffffffffffffffffffffffffffffffffff1661169f610bcb565b73ffffffffffffffffffffffffffffffffffffffff16146116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec90613207565b60405180910390fd5b565b60006003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185d90613273565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119579190611ec9565b60405180910390a3505050565b61196f848484611380565b61197b84848484611b18565b6119ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b190613305565b60405180910390fd5b50505050565b60606040518060400160405280600781526020017f697066733a2f2f00000000000000000000000000000000000000000000000000815250905090565b606060006001611a0c84611c9f565b01905060008167ffffffffffffffff811115611a2b57611a2a6121e1565b5b6040519080825280601f01601f191660200182016040528015611a5d5781602001600182028036833780820191505090505b509050600082602001820190505b600115611ac0578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611ab457611ab3613325565b5b04945060008503611a6b575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff16611aed836116f7565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b6000611b398473ffffffffffffffffffffffffffffffffffffffff16611df2565b15611c92578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611b62610fa0565b8786866040518563ffffffff1660e01b8152600401611b8494939291906133a9565b6020604051808303816000875af1925050508015611bc057506040513d601f19601f82011682018060405250810190611bbd919061340a565b60015b611c42573d8060008114611bf0576040519150601f19603f3d011682016040523d82523d6000602084013e611bf5565b606091505b506000815103611c3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3190613305565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611c97565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611cfd577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611cf357611cf2613325565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611d3a576d04ee2d6d415b85acef81000000008381611d3057611d2f613325565b5b0492506020810190505b662386f26fc100008310611d6957662386f26fc100008381611d5f57611d5e613325565b5b0492506010810190505b6305f5e1008310611d92576305f5e1008381611d8857611d87613325565b5b0492506008810190505b6127108310611db7576127108381611dad57611dac613325565b5b0492506004810190505b60648310611dda5760648381611dd057611dcf613325565b5b0492506002810190505b600a8310611de9576001810190505b80915050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611e5e81611e29565b8114611e6957600080fd5b50565b600081359050611e7b81611e55565b92915050565b600060208284031215611e9757611e96611e1f565b5b6000611ea584828501611e6c565b91505092915050565b60008115159050919050565b611ec381611eae565b82525050565b6000602082019050611ede6000830184611eba565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611f1e578082015181840152602081019050611f03565b60008484015250505050565b6000601f19601f8301169050919050565b6000611f4682611ee4565b611f508185611eef565b9350611f60818560208601611f00565b611f6981611f2a565b840191505092915050565b60006020820190508181036000830152611f8e8184611f3b565b905092915050565b6000819050919050565b611fa981611f96565b8114611fb457600080fd5b50565b600081359050611fc681611fa0565b92915050565b600060208284031215611fe257611fe1611e1f565b5b6000611ff084828501611fb7565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061202482611ff9565b9050919050565b61203481612019565b82525050565b600060208201905061204f600083018461202b565b92915050565b61205e81612019565b811461206957600080fd5b50565b60008135905061207b81612055565b92915050565b6000806040838503121561209857612097611e1f565b5b60006120a68582860161206c565b92505060206120b785828601611fb7565b9150509250929050565b6000806000606084860312156120da576120d9611e1f565b5b60006120e88682870161206c565b93505060206120f98682870161206c565b925050604061210a86828701611fb7565b9150509250925092565b60006020828403121561212a57612129611e1f565b5b60006121388482850161206c565b91505092915050565b61214a81611f96565b82525050565b60006020820190506121656000830184612141565b92915050565b61217481611eae565b811461217f57600080fd5b50565b6000813590506121918161216b565b92915050565b600080604083850312156121ae576121ad611e1f565b5b60006121bc8582860161206c565b92505060206121cd85828601612182565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61221982611f2a565b810181811067ffffffffffffffff82111715612238576122376121e1565b5b80604052505050565b600061224b611e15565b90506122578282612210565b919050565b600067ffffffffffffffff821115612277576122766121e1565b5b61228082611f2a565b9050602081019050919050565b82818337600083830152505050565b60006122af6122aa8461225c565b612241565b9050828152602081018484840111156122cb576122ca6121dc565b5b6122d684828561228d565b509392505050565b600082601f8301126122f3576122f26121d7565b5b813561230384826020860161229c565b91505092915050565b60006020828403121561232257612321611e1f565b5b600082013567ffffffffffffffff8111156123405761233f611e24565b5b61234c848285016122de565b91505092915050565b600067ffffffffffffffff8211156123705761236f6121e1565b5b61237982611f2a565b9050602081019050919050565b600061239961239484612355565b612241565b9050828152602081018484840111156123b5576123b46121dc565b5b6123c084828561228d565b509392505050565b600082601f8301126123dd576123dc6121d7565b5b81356123ed848260208601612386565b91505092915050565b600080600080608085870312156124105761240f611e1f565b5b600061241e8782880161206c565b945050602061242f8782880161206c565b935050604061244087828801611fb7565b925050606085013567ffffffffffffffff81111561246157612460611e24565b5b61246d878288016123c8565b91505092959194509250565b600080604083850312156124905761248f611e1f565b5b600061249e8582860161206c565b92505060206124af8582860161206c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061250057607f821691505b602082108103612513576125126124b9565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612575602183611eef565b915061258082612519565b604082019050919050565b600060208201905081810360008301526125a481612568565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000612607603d83611eef565b9150612612826125ab565b604082019050919050565b60006020820190508181036000830152612636816125fa565b9050919050565b7f4d617820746f6b656e20737570706c7920686173206265656e2072656163686560008201527f642e000000000000000000000000000000000000000000000000000000000000602082015250565b6000612699602283611eef565b91506126a48261263d565b604082019050919050565b600060208201905081810360008301526126c88161268c565b9050919050565b7f4e6f7420636f7272656374207061796d656e7420616d6f756e742e0000000000600082015250565b6000612705601b83611eef565b9150612710826126cf565b602082019050919050565b60006020820190508181036000830152612734816126f8565b9050919050565b7f4d617820746f6b656e7320666f7220746869732061646472657373206861732060008201527f6265656e20726561636865642e00000000000000000000000000000000000000602082015250565b6000612797602d83611eef565b91506127a28261273b565b604082019050919050565b600060208201905081810360008301526127c68161278a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061280782611f96565b915061281283611f96565b925082820190508082111561282a576128296127cd565b5b92915050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b600061288c602d83611eef565b915061289782612830565b604082019050919050565b600060208201905081810360008301526128bb8161287f565b9050919050565b600081905092915050565b50565b60006128dd6000836128c2565b91506128e8826128cd565b600082019050919050565b60006128fe826128d0565b9150819050919050565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b600061293e601483611eef565b915061294982612908565b602082019050919050565b6000602082019050818103600083015261296d81612931565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006129aa601883611eef565b91506129b582612974565b602082019050919050565b600060208201905081810360008301526129d98161299d565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612a3c602983611eef565b9150612a47826129e0565b604082019050919050565b60006020820190508181036000830152612a6b81612a2f565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612ad47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612a97565b612ade8683612a97565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612b1b612b16612b1184611f96565b612af6565b611f96565b9050919050565b6000819050919050565b612b3583612b00565b612b49612b4182612b22565b848454612aa4565b825550505050565b600090565b612b5e612b51565b612b69818484612b2c565b505050565b5b81811015612b8d57612b82600082612b56565b600181019050612b6f565b5050565b601f821115612bd257612ba381612a72565b612bac84612a87565b81016020851015612bbb578190505b612bcf612bc785612a87565b830182612b6e565b50505b505050565b600082821c905092915050565b6000612bf560001984600802612bd7565b1980831691505092915050565b6000612c0e8383612be4565b9150826002028217905092915050565b612c2782611ee4565b67ffffffffffffffff811115612c4057612c3f6121e1565b5b612c4a82546124e8565b612c55828285612b91565b600060209050601f831160018114612c885760008415612c76578287015190505b612c808582612c02565b865550612ce8565b601f198416612c9686612a72565b60005b82811015612cbe57848901518255600182019150602085019450602081019050612c99565b86831015612cdb5784890151612cd7601f891682612be4565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b6000612d15612d10612d0b84612cf0565b612af6565b611f96565b9050919050565b612d2581612cfa565b82525050565b6000604082019050612d406000830185612d1c565b612d4d6020830184612141565b9392505050565b600081905092915050565b6000612d6a82611ee4565b612d748185612d54565b9350612d84818560208601611f00565b80840191505092915050565b60008154612d9d816124e8565b612da78186612d54565b94506001821660008114612dc25760018114612dd757612e0a565b60ff1983168652811515820286019350612e0a565b612de085612a72565b60005b83811015612e0257815481890152600182019150602081019050612de3565b838801955050505b50505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b6000612e49600183612d54565b9150612e5482612e13565b600182019050919050565b6000612e6b8286612d5f565b9150612e778285612d90565b9150612e8282612e3c565b9150612e8e8284612d5f565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612ef7602683611eef565b9150612f0282612e9b565b604082019050919050565b60006020820190508181036000830152612f2681612eea565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000612f63602083611eef565b9150612f6e82612f2d565b602082019050919050565b60006020820190508181036000830152612f9281612f56565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000612fcf601c83611eef565b9150612fda82612f99565b602082019050919050565b60006020820190508181036000830152612ffe81612fc2565b9050919050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b6000613061602e83611eef565b915061306c82613005565b604082019050919050565b6000602082019050818103600083015261309081613054565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006130f3602583611eef565b91506130fe82613097565b604082019050919050565b60006020820190508181036000830152613122816130e6565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613185602483611eef565b915061319082613129565b604082019050919050565b600060208201905081810360008301526131b481613178565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006131f1602083611eef565b91506131fc826131bb565b602082019050919050565b60006020820190508181036000830152613220816131e4565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061325d601983611eef565b915061326882613227565b602082019050919050565b6000602082019050818103600083015261328c81613250565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006132ef603283611eef565b91506132fa82613293565b604082019050919050565b6000602082019050818103600083015261331e816132e2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b600061337b82613354565b613385818561335f565b9350613395818560208601611f00565b61339e81611f2a565b840191505092915050565b60006080820190506133be600083018761202b565b6133cb602083018661202b565b6133d86040830185612141565b81810360608301526133ea8184613370565b905095945050505050565b60008151905061340481611e55565b92915050565b6000602082840312156134205761341f611e1f565b5b600061342e848285016133f5565b9150509291505056fea2646970667358221220ae45fddac03b1b89d109e3a20231140233df7a1775d4448a18ded3809039f05464736f6c63430008120033516d625161546f47443634385a69643443674d65374a446f63665963476b6147675834687063363476446f714b4c

Deployed Bytecode

0x60806040526004361061012a5760003560e01c8063715018a6116100ab578063b1316d7b1161006f578063b1316d7b146103a9578063b88d4fde146103d2578063c87b56dd146103fb578063dbb84f1114610438578063e985e9c514610461578063f2fde38b1461049e5761012a565b8063715018a6146102ea5780638da5cb5b1461030157806395d89b411461032c578063a22cb46514610357578063b07ed982146103805761012a565b806323b872dd116100f257806323b872dd146102075780633ccfd60b1461023057806342842e0e146102475780636352211e1461027057806370a08231146102ad5761012a565b806301ffc9a71461012f57806306fdde031461016c578063081812fc14610197578063095ea7b3146101d45780631249c58b146101fd575b600080fd5b34801561013b57600080fd5b5061015660048036038101906101519190611e81565b6104c7565b6040516101639190611ec9565b60405180910390f35b34801561017857600080fd5b506101816105a9565b60405161018e9190611f74565b60405180910390f35b3480156101a357600080fd5b506101be60048036038101906101b99190611fcc565b61063b565b6040516101cb919061203a565b60405180910390f35b3480156101e057600080fd5b506101fb60048036038101906101f69190612081565b610681565b005b610205610798565b005b34801561021357600080fd5b5061022e600480360381019061022991906120c1565b610936565b005b34801561023c57600080fd5b50610245610996565b005b34801561025357600080fd5b5061026e600480360381019061026991906120c1565b610a5a565b005b34801561027c57600080fd5b5061029760048036038101906102929190611fcc565b610a7a565b6040516102a4919061203a565b60405180910390f35b3480156102b957600080fd5b506102d460048036038101906102cf9190612114565b610b00565b6040516102e19190612150565b60405180910390f35b3480156102f657600080fd5b506102ff610bb7565b005b34801561030d57600080fd5b50610316610bcb565b604051610323919061203a565b60405180910390f35b34801561033857600080fd5b50610341610bf4565b60405161034e9190611f74565b60405180910390f35b34801561036357600080fd5b5061037e60048036038101906103799190612197565b610c86565b005b34801561038c57600080fd5b506103a760048036038101906103a29190611fcc565b610c9c565b005b3480156103b557600080fd5b506103d060048036038101906103cb919061230c565b610cae565b005b3480156103de57600080fd5b506103f960048036038101906103f491906123f6565b610d23565b005b34801561040757600080fd5b50610422600480360381019061041d9190611fcc565b610d85565b60405161042f9190611f74565b60405180910390f35b34801561044457600080fd5b5061045f600480360381019061045a9190611fcc565b610dc2565b005b34801561046d57600080fd5b5061048860048036038101906104839190612479565b610dd4565b6040516104959190611ec9565b60405180910390f35b3480156104aa57600080fd5b506104c560048036038101906104c09190612114565b610e68565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061059257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105a257506105a182610eeb565b5b9050919050565b6060600180546105b8906124e8565b80601f01602080910402602001604051908101604052809291908181526020018280546105e4906124e8565b80156106315780601f1061060657610100808354040283529160200191610631565b820191906000526020600020905b81548152906001019060200180831161061457829003601f168201915b5050505050905090565b600061064682610f55565b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061068c82610a7a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036106fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106f39061258b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661071b610fa0565b73ffffffffffffffffffffffffffffffffffffffff16148061074a575061074981610744610fa0565b610dd4565b5b610789576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107809061261d565b60405180910390fd5b6107938383610fa8565b505050565b600854600c54106107de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d5906126af565b60405180910390fd5b600a543414610822576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108199061271b565b60405180910390fd5b60003390506000600c54905060095461083a83610b00565b1061087a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610871906127ad565b60405180910390fd5b6108848282611061565b61091881600b8054610895906124e8565b80601f01602080910402602001604051908101604052809291908181526020018280546108c1906124e8565b801561090e5780601f106108e35761010080835404028352916020019161090e565b820191906000526020600020905b8154815290600101906020018083116108f157829003601f168201915b505050505061127e565b6001600c600082825461092b91906127fc565b925050819055505050565b610947610941610fa0565b826112eb565b610986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097d906128a2565b60405180910390fd5b610991838383611380565b505050565b61099e611679565b600047905060006109ad610bcb565b73ffffffffffffffffffffffffffffffffffffffff16826040516109d0906128f3565b60006040518083038185875af1925050503d8060008114610a0d576040519150601f19603f3d011682016040523d82523d6000602084013e610a12565b606091505b5050905080610a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4d90612954565b60405180910390fd5b5050565b610a7583838360405180602001604052806000815250610d23565b505050565b600080610a86836116f7565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aee906129c0565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6790612a52565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610bbf611679565b610bc96000611734565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054610c03906124e8565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2f906124e8565b8015610c7c5780601f10610c5157610100808354040283529160200191610c7c565b820191906000526020600020905b815481529060010190602001808311610c5f57829003601f168201915b5050505050905090565b610c98610c91610fa0565b83836117f8565b5050565b610ca4611679565b8060088190555050565b610cb6611679565b80600b9081610cc59190612c1e565b507f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff604051610d18929190612d2b565b60405180910390a150565b610d34610d2e610fa0565b836112eb565b610d73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6a906128a2565b60405180910390fd5b610d7f84848484611964565b50505050565b6060610d8f6119c0565b600b610d9a846119fd565b604051602001610dac93929190612e5f565b6040516020818303038152906040529050919050565b610dca611679565b8060098190555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610e70611679565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed690612f0d565b60405180910390fd5b610ee881611734565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610f5e81611acb565b610f9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f94906129c0565b60405180910390fd5b50565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661101b83610a7a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c790612f79565b60405180910390fd5b6110d981611acb565b15611119576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111090612fe5565b60405180910390fd5b611127600083836001611b0c565b61113081611acb565b15611170576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116790612fe5565b60405180910390fd5b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461127a600083836001611b12565b5050565b61128782611acb565b6112c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bd90613077565b60405180910390fd5b806007600084815260200190815260200160002090816112e69190612c1e565b505050565b6000806112f783610a7a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061133957506113388185610dd4565b5b8061137757508373ffffffffffffffffffffffffffffffffffffffff1661135f8461063b565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166113a082610a7a565b73ffffffffffffffffffffffffffffffffffffffff16146113f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ed90613109565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145c9061319b565b60405180910390fd5b6114728383836001611b0c565b8273ffffffffffffffffffffffffffffffffffffffff1661149282610a7a565b73ffffffffffffffffffffffffffffffffffffffff16146114e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114df90613109565b60405180910390fd5b6005600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46116748383836001611b12565b505050565b611681610fa0565b73ffffffffffffffffffffffffffffffffffffffff1661169f610bcb565b73ffffffffffffffffffffffffffffffffffffffff16146116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec90613207565b60405180910390fd5b565b60006003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185d90613273565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119579190611ec9565b60405180910390a3505050565b61196f848484611380565b61197b84848484611b18565b6119ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b190613305565b60405180910390fd5b50505050565b60606040518060400160405280600781526020017f697066733a2f2f00000000000000000000000000000000000000000000000000815250905090565b606060006001611a0c84611c9f565b01905060008167ffffffffffffffff811115611a2b57611a2a6121e1565b5b6040519080825280601f01601f191660200182016040528015611a5d5781602001600182028036833780820191505090505b509050600082602001820190505b600115611ac0578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611ab457611ab3613325565b5b04945060008503611a6b575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff16611aed836116f7565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b6000611b398473ffffffffffffffffffffffffffffffffffffffff16611df2565b15611c92578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611b62610fa0565b8786866040518563ffffffff1660e01b8152600401611b8494939291906133a9565b6020604051808303816000875af1925050508015611bc057506040513d601f19601f82011682018060405250810190611bbd919061340a565b60015b611c42573d8060008114611bf0576040519150601f19603f3d011682016040523d82523d6000602084013e611bf5565b606091505b506000815103611c3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3190613305565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611c97565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611cfd577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611cf357611cf2613325565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611d3a576d04ee2d6d415b85acef81000000008381611d3057611d2f613325565b5b0492506020810190505b662386f26fc100008310611d6957662386f26fc100008381611d5f57611d5e613325565b5b0492506010810190505b6305f5e1008310611d92576305f5e1008381611d8857611d87613325565b5b0492506008810190505b6127108310611db7576127108381611dad57611dac613325565b5b0492506004810190505b60648310611dda5760648381611dd057611dcf613325565b5b0492506002810190505b600a8310611de9576001810190505b80915050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611e5e81611e29565b8114611e6957600080fd5b50565b600081359050611e7b81611e55565b92915050565b600060208284031215611e9757611e96611e1f565b5b6000611ea584828501611e6c565b91505092915050565b60008115159050919050565b611ec381611eae565b82525050565b6000602082019050611ede6000830184611eba565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611f1e578082015181840152602081019050611f03565b60008484015250505050565b6000601f19601f8301169050919050565b6000611f4682611ee4565b611f508185611eef565b9350611f60818560208601611f00565b611f6981611f2a565b840191505092915050565b60006020820190508181036000830152611f8e8184611f3b565b905092915050565b6000819050919050565b611fa981611f96565b8114611fb457600080fd5b50565b600081359050611fc681611fa0565b92915050565b600060208284031215611fe257611fe1611e1f565b5b6000611ff084828501611fb7565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061202482611ff9565b9050919050565b61203481612019565b82525050565b600060208201905061204f600083018461202b565b92915050565b61205e81612019565b811461206957600080fd5b50565b60008135905061207b81612055565b92915050565b6000806040838503121561209857612097611e1f565b5b60006120a68582860161206c565b92505060206120b785828601611fb7565b9150509250929050565b6000806000606084860312156120da576120d9611e1f565b5b60006120e88682870161206c565b93505060206120f98682870161206c565b925050604061210a86828701611fb7565b9150509250925092565b60006020828403121561212a57612129611e1f565b5b60006121388482850161206c565b91505092915050565b61214a81611f96565b82525050565b60006020820190506121656000830184612141565b92915050565b61217481611eae565b811461217f57600080fd5b50565b6000813590506121918161216b565b92915050565b600080604083850312156121ae576121ad611e1f565b5b60006121bc8582860161206c565b92505060206121cd85828601612182565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61221982611f2a565b810181811067ffffffffffffffff82111715612238576122376121e1565b5b80604052505050565b600061224b611e15565b90506122578282612210565b919050565b600067ffffffffffffffff821115612277576122766121e1565b5b61228082611f2a565b9050602081019050919050565b82818337600083830152505050565b60006122af6122aa8461225c565b612241565b9050828152602081018484840111156122cb576122ca6121dc565b5b6122d684828561228d565b509392505050565b600082601f8301126122f3576122f26121d7565b5b813561230384826020860161229c565b91505092915050565b60006020828403121561232257612321611e1f565b5b600082013567ffffffffffffffff8111156123405761233f611e24565b5b61234c848285016122de565b91505092915050565b600067ffffffffffffffff8211156123705761236f6121e1565b5b61237982611f2a565b9050602081019050919050565b600061239961239484612355565b612241565b9050828152602081018484840111156123b5576123b46121dc565b5b6123c084828561228d565b509392505050565b600082601f8301126123dd576123dc6121d7565b5b81356123ed848260208601612386565b91505092915050565b600080600080608085870312156124105761240f611e1f565b5b600061241e8782880161206c565b945050602061242f8782880161206c565b935050604061244087828801611fb7565b925050606085013567ffffffffffffffff81111561246157612460611e24565b5b61246d878288016123c8565b91505092959194509250565b600080604083850312156124905761248f611e1f565b5b600061249e8582860161206c565b92505060206124af8582860161206c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061250057607f821691505b602082108103612513576125126124b9565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612575602183611eef565b915061258082612519565b604082019050919050565b600060208201905081810360008301526125a481612568565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000612607603d83611eef565b9150612612826125ab565b604082019050919050565b60006020820190508181036000830152612636816125fa565b9050919050565b7f4d617820746f6b656e20737570706c7920686173206265656e2072656163686560008201527f642e000000000000000000000000000000000000000000000000000000000000602082015250565b6000612699602283611eef565b91506126a48261263d565b604082019050919050565b600060208201905081810360008301526126c88161268c565b9050919050565b7f4e6f7420636f7272656374207061796d656e7420616d6f756e742e0000000000600082015250565b6000612705601b83611eef565b9150612710826126cf565b602082019050919050565b60006020820190508181036000830152612734816126f8565b9050919050565b7f4d617820746f6b656e7320666f7220746869732061646472657373206861732060008201527f6265656e20726561636865642e00000000000000000000000000000000000000602082015250565b6000612797602d83611eef565b91506127a28261273b565b604082019050919050565b600060208201905081810360008301526127c68161278a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061280782611f96565b915061281283611f96565b925082820190508082111561282a576128296127cd565b5b92915050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b600061288c602d83611eef565b915061289782612830565b604082019050919050565b600060208201905081810360008301526128bb8161287f565b9050919050565b600081905092915050565b50565b60006128dd6000836128c2565b91506128e8826128cd565b600082019050919050565b60006128fe826128d0565b9150819050919050565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b600061293e601483611eef565b915061294982612908565b602082019050919050565b6000602082019050818103600083015261296d81612931565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006129aa601883611eef565b91506129b582612974565b602082019050919050565b600060208201905081810360008301526129d98161299d565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612a3c602983611eef565b9150612a47826129e0565b604082019050919050565b60006020820190508181036000830152612a6b81612a2f565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612ad47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612a97565b612ade8683612a97565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612b1b612b16612b1184611f96565b612af6565b611f96565b9050919050565b6000819050919050565b612b3583612b00565b612b49612b4182612b22565b848454612aa4565b825550505050565b600090565b612b5e612b51565b612b69818484612b2c565b505050565b5b81811015612b8d57612b82600082612b56565b600181019050612b6f565b5050565b601f821115612bd257612ba381612a72565b612bac84612a87565b81016020851015612bbb578190505b612bcf612bc785612a87565b830182612b6e565b50505b505050565b600082821c905092915050565b6000612bf560001984600802612bd7565b1980831691505092915050565b6000612c0e8383612be4565b9150826002028217905092915050565b612c2782611ee4565b67ffffffffffffffff811115612c4057612c3f6121e1565b5b612c4a82546124e8565b612c55828285612b91565b600060209050601f831160018114612c885760008415612c76578287015190505b612c808582612c02565b865550612ce8565b601f198416612c9686612a72565b60005b82811015612cbe57848901518255600182019150602085019450602081019050612c99565b86831015612cdb5784890151612cd7601f891682612be4565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b6000612d15612d10612d0b84612cf0565b612af6565b611f96565b9050919050565b612d2581612cfa565b82525050565b6000604082019050612d406000830185612d1c565b612d4d6020830184612141565b9392505050565b600081905092915050565b6000612d6a82611ee4565b612d748185612d54565b9350612d84818560208601611f00565b80840191505092915050565b60008154612d9d816124e8565b612da78186612d54565b94506001821660008114612dc25760018114612dd757612e0a565b60ff1983168652811515820286019350612e0a565b612de085612a72565b60005b83811015612e0257815481890152600182019150602081019050612de3565b838801955050505b50505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b6000612e49600183612d54565b9150612e5482612e13565b600182019050919050565b6000612e6b8286612d5f565b9150612e778285612d90565b9150612e8282612e3c565b9150612e8e8284612d5f565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612ef7602683611eef565b9150612f0282612e9b565b604082019050919050565b60006020820190508181036000830152612f2681612eea565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000612f63602083611eef565b9150612f6e82612f2d565b602082019050919050565b60006020820190508181036000830152612f9281612f56565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000612fcf601c83611eef565b9150612fda82612f99565b602082019050919050565b60006020820190508181036000830152612ffe81612fc2565b9050919050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b6000613061602e83611eef565b915061306c82613005565b604082019050919050565b6000602082019050818103600083015261309081613054565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006130f3602583611eef565b91506130fe82613097565b604082019050919050565b60006020820190508181036000830152613122816130e6565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613185602483611eef565b915061319082613129565b604082019050919050565b600060208201905081810360008301526131b481613178565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006131f1602083611eef565b91506131fc826131bb565b602082019050919050565b60006020820190508181036000830152613220816131e4565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061325d601983611eef565b915061326882613227565b602082019050919050565b6000602082019050818103600083015261328c81613250565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006132ef603283611eef565b91506132fa82613293565b604082019050919050565b6000602082019050818103600083015261331e816132e2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b600061337b82613354565b613385818561335f565b9350613395818560208601611f00565b61339e81611f2a565b840191505092915050565b60006080820190506133be600083018761202b565b6133cb602083018661202b565b6133d86040830185612141565b81810360608301526133ea8184613370565b905095945050505050565b60008151905061340481611e55565b92915050565b6000602082840312156134205761341f611e1f565b5b600061342e848285016133f5565b9150509291505056fea2646970667358221220ae45fddac03b1b89d109e3a20231140233df7a1775d4448a18ded3809039f05464736f6c63430008120033

Deployed Bytecode Sourcemap

56814:1924:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38583:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39511:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41023:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40541:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57477:412;;;:::i;:::-;;41723:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58344:203;;;;;;;;;;;;;:::i;:::-;;42129:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39221:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38952:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18014:103;;;;;;;;;;;;;:::i;:::-;;17366:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39680:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41266:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58061:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57897:156;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42385:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58555:178;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58195:141;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41492:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18272:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38583:305;38685:4;38737:25;38722:40;;;:11;:40;;;;:105;;;;38794:33;38779:48;;;:11;:48;;;;38722:105;:158;;;;38844:36;38868:11;38844:23;:36::i;:::-;38722:158;38702:178;;38583:305;;;:::o;39511:100::-;39565:13;39598:5;39591:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39511:100;:::o;41023:171::-;41099:7;41119:23;41134:7;41119:14;:23::i;:::-;41162:15;:24;41178:7;41162:24;;;;;;;;;;;;;;;;;;;;;41155:31;;41023:171;;;:::o;40541:416::-;40622:13;40638:23;40653:7;40638:14;:23::i;:::-;40622:39;;40686:5;40680:11;;:2;:11;;;40672:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;40780:5;40764:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;40789:37;40806:5;40813:12;:10;:12::i;:::-;40789:16;:37::i;:::-;40764:62;40742:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;40928:21;40937:2;40941:7;40928:8;:21::i;:::-;40611:346;40541:416;;:::o;57477:412::-;57135:16;;57121:11;;:30;57113:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;57555:10:::1;;57542:9;:23;57534:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;57607:10;57620;57607:23;;57641:12;57656:11;;57641:26;;57708:22;;57692:13;57702:2;57692:9;:13::i;:::-;:38;57684:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;57793:17;57799:2;57802:7;57793:5;:17::i;:::-;57815:35;57828:7;57837:12;57815:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;:35::i;:::-;57878:1;57863:11;;:16;;;;;;;:::i;:::-;;;;;;;;57523:366;;57477:412::o:0;41723:335::-;41918:41;41937:12;:10;:12::i;:::-;41951:7;41918:18;:41::i;:::-;41910:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;42022:28;42032:4;42038:2;42042:7;42022:9;:28::i;:::-;41723:335;;;:::o;58344:203::-;17252:13;:11;:13::i;:::-;58392:11:::1;58406:21;58392:35;;58439:12;58457:7;:5;:7::i;:::-;:12;;58477:6;58457:31;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58438:50;;;58507:7;58499:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;58381:166;;58344:203::o:0;42129:185::-;42267:39;42284:4;42290:2;42294:7;42267:39;;;;;;;;;;;;:16;:39::i;:::-;42129:185;;;:::o;39221:223::-;39293:7;39313:13;39329:17;39338:7;39329:8;:17::i;:::-;39313:33;;39382:1;39365:19;;:5;:19;;;39357:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;39431:5;39424:12;;;39221:223;;;:::o;38952:207::-;39024:7;39069:1;39052:19;;:5;:19;;;39044:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;39135:9;:16;39145:5;39135:16;;;;;;;;;;;;;;;;39128:23;;38952:207;;;:::o;18014:103::-;17252:13;:11;:13::i;:::-;18079:30:::1;18106:1;18079:18;:30::i;:::-;18014:103::o:0;17366:87::-;17412:7;17439:6;;;;;;;;;;;17432:13;;17366:87;:::o;39680:104::-;39736:13;39769:7;39762:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39680:104;:::o;41266:155::-;41361:52;41380:12;:10;:12::i;:::-;41394:8;41404;41361:18;:52::i;:::-;41266:155;;:::o;58061:122::-;17252:13;:11;:13::i;:::-;58158:17:::1;58139:16;:36;;;;58061:122:::0;:::o;57897:156::-;17252:13;:11;:13::i;:::-;57985:3:::1;57970:12;:18;;;;;;:::i;:::-;;58004:41;58024:1;58027:17;58004:41;;;;;;;:::i;:::-;;;;;;;;57897:156:::0;:::o;42385:322::-;42559:41;42578:12;:10;:12::i;:::-;42592:7;42559:18;:41::i;:::-;42551:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;42661:38;42675:4;42681:2;42685:7;42694:4;42661:13;:38::i;:::-;42385:322;;;;:::o;58555:178::-;58622:13;58673:10;:8;:10::i;:::-;58684:12;58701:26;58718:8;58701:16;:26::i;:::-;58656:72;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58642:87;;58555:178;;;:::o;58195:141::-;17252:13;:11;:13::i;:::-;58307:21:::1;58282:22;:46;;;;58195:141:::0;:::o;41492:164::-;41589:4;41613:18;:25;41632:5;41613:25;;;;;;;;;;;;;;;:35;41639:8;41613:35;;;;;;;;;;;;;;;;;;;;;;;;;41606:42;;41492:164;;;;:::o;18272:201::-;17252:13;:11;:13::i;:::-;18381:1:::1;18361:22;;:8;:22;;::::0;18353:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;18437:28;18456:8;18437:18;:28::i;:::-;18272:201:::0;:::o;31095:157::-;31180:4;31219:25;31204:40;;;:11;:40;;;;31197:47;;31095:157;;;:::o;50842:135::-;50924:16;50932:7;50924;:16::i;:::-;50916:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;50842:135;:::o;15917:98::-;15970:7;15997:10;15990:17;;15917:98;:::o;50121:174::-;50223:2;50196:15;:24;50212:7;50196:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;50279:7;50275:2;50241:46;;50250:23;50265:7;50250:14;:23::i;:::-;50241:46;;;;;;;;;;;;50121:174;;:::o;46338:942::-;46432:1;46418:16;;:2;:16;;;46410:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;46491:16;46499:7;46491;:16::i;:::-;46490:17;46482:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;46553:48;46582:1;46586:2;46590:7;46599:1;46553:20;:48::i;:::-;46700:16;46708:7;46700;:16::i;:::-;46699:17;46691:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;47115:1;47098:9;:13;47108:2;47098:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;47159:2;47140:7;:16;47148:7;47140:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;47204:7;47200:2;47179:33;;47196:1;47179:33;;;;;;;;;;;;47225:47;47253:1;47257:2;47261:7;47270:1;47225:19;:47::i;:::-;46338:942;;:::o;56084:217::-;56184:16;56192:7;56184;:16::i;:::-;56176:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;56284:9;56262:10;:19;56273:7;56262:19;;;;;;;;;;;:31;;;;;;:::i;:::-;;56084:217;;:::o;44740:264::-;44833:4;44850:13;44866:23;44881:7;44866:14;:23::i;:::-;44850:39;;44919:5;44908:16;;:7;:16;;;:52;;;;44928:32;44945:5;44952:7;44928:16;:32::i;:::-;44908:52;:87;;;;44988:7;44964:31;;:20;44976:7;44964:11;:20::i;:::-;:31;;;44908:87;44900:96;;;44740:264;;;;:::o;48739:1263::-;48898:4;48871:31;;:23;48886:7;48871:14;:23::i;:::-;:31;;;48863:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;48977:1;48963:16;;:2;:16;;;48955:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;49033:42;49054:4;49060:2;49064:7;49073:1;49033:20;:42::i;:::-;49205:4;49178:31;;:23;49193:7;49178:14;:23::i;:::-;:31;;;49170:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;49323:15;:24;49339:7;49323:24;;;;;;;;;;;;49316:31;;;;;;;;;;;49818:1;49799:9;:15;49809:4;49799:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;49851:1;49834:9;:13;49844:2;49834:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;49893:2;49874:7;:16;49882:7;49874:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;49932:7;49928:2;49913:27;;49922:4;49913:27;;;;;;;;;;;;49953:41;49973:4;49979:2;49983:7;49992:1;49953:19;:41::i;:::-;48739:1263;;;:::o;17531:132::-;17606:12;:10;:12::i;:::-;17595:23;;:7;:5;:7::i;:::-;:23;;;17587:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17531:132::o;44015:117::-;44081:7;44108;:16;44116:7;44108:16;;;;;;;;;;;;;;;;;;;;;44101:23;;44015:117;;;:::o;18633:191::-;18707:16;18726:6;;;;;;;;;;;18707:25;;18752:8;18743:6;;:17;;;;;;;;;;;;;;;;;;18807:8;18776:40;;18797:8;18776:40;;;;;;;;;;;;18696:128;18633:191;:::o;50438:315::-;50593:8;50584:17;;:5;:17;;;50576:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;50680:8;50642:18;:25;50661:5;50642:25;;;;;;;;;;;;;;;:35;50668:8;50642:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;50726:8;50704:41;;50719:5;50704:41;;;50736:8;50704:41;;;;;;:::i;:::-;;;;;;;;50438:315;;;:::o;43588:313::-;43744:28;43754:4;43760:2;43764:7;43744:9;:28::i;:::-;43791:47;43814:4;43820:2;43824:7;43833:4;43791:22;:47::i;:::-;43783:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;43588:313;;;;:::o;57359:110::-;57419:13;57445:16;;;;;;;;;;;;;;;;;;;57359:110;:::o;13344:716::-;13400:13;13451:14;13488:1;13468:17;13479:5;13468:10;:17::i;:::-;:21;13451:38;;13504:20;13538:6;13527:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13504:41;;13560:11;13689:6;13685:2;13681:15;13673:6;13669:28;13662:35;;13726:288;13733:4;13726:288;;;13758:5;;;;;;;;13900:8;13895:2;13888:5;13884:14;13879:30;13874:3;13866:44;13956:2;13947:11;;;;;;:::i;:::-;;;;;13990:1;13981:5;:10;13726:288;13977:21;13726:288;14035:6;14028:13;;;;;13344:716;;;:::o;44445:128::-;44510:4;44563:1;44534:31;;:17;44543:7;44534:8;:17::i;:::-;:31;;;;44527:38;;44445:128;;;:::o;53126:159::-;;;;;:::o;54007:158::-;;;;;:::o;51541:853::-;51695:4;51716:15;:2;:13;;;:15::i;:::-;51712:675;;;51768:2;51752:36;;;51789:12;:10;:12::i;:::-;51803:4;51809:7;51818:4;51752:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;51748:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52010:1;51993:6;:13;:18;51989:328;;52036:60;;;;;;;;;;:::i;:::-;;;;;;;;51989:328;52267:6;52261:13;52252:6;52248:2;52244:15;52237:38;51748:584;51884:41;;;51874:51;;;:6;:51;;;;51867:58;;;;;51712:675;52371:4;52364:11;;51541:853;;;;;;;:::o;10210:922::-;10263:7;10283:14;10300:1;10283:18;;10350:6;10341:5;:15;10337:102;;10386:6;10377:15;;;;;;:::i;:::-;;;;;10421:2;10411:12;;;;10337:102;10466:6;10457:5;:15;10453:102;;10502:6;10493:15;;;;;;:::i;:::-;;;;;10537:2;10527:12;;;;10453:102;10582:6;10573:5;:15;10569:102;;10618:6;10609:15;;;;;;:::i;:::-;;;;;10653:2;10643:12;;;;10569:102;10698:5;10689;:14;10685:99;;10733:5;10724:14;;;;;;:::i;:::-;;;;;10767:1;10757:11;;;;10685:99;10811:5;10802;:14;10798:99;;10846:5;10837:14;;;;;;:::i;:::-;;;;;10880:1;10870:11;;;;10798:99;10924:5;10915;:14;10911:99;;10959:5;10950:14;;;;;;:::i;:::-;;;;;10993:1;10983:11;;;;10911:99;11037:5;11028;:14;11024:66;;11073:1;11063:11;;;;11024:66;11118:6;11111:13;;;10210:922;;;:::o;20064:326::-;20124:4;20381:1;20359:7;:19;;;:23;20352:30;;20064: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:619::-;4967:6;4975;4983;5032:2;5020:9;5011:7;5007:23;5003:32;5000:119;;;5038:79;;:::i;:::-;5000:119;5158:1;5183:53;5228:7;5219:6;5208:9;5204:22;5183:53;:::i;:::-;5173:63;;5129:117;5285:2;5311:53;5356:7;5347:6;5336:9;5332:22;5311:53;:::i;:::-;5301:63;;5256:118;5413:2;5439:53;5484:7;5475:6;5464:9;5460:22;5439:53;:::i;:::-;5429:63;;5384:118;4890:619;;;;;:::o;5515:329::-;5574:6;5623:2;5611:9;5602:7;5598:23;5594:32;5591:119;;;5629:79;;:::i;:::-;5591:119;5749:1;5774:53;5819:7;5810:6;5799:9;5795:22;5774:53;:::i;:::-;5764:63;;5720:117;5515:329;;;;:::o;5850:118::-;5937:24;5955:5;5937:24;:::i;:::-;5932:3;5925:37;5850:118;;:::o;5974:222::-;6067:4;6105:2;6094:9;6090:18;6082:26;;6118:71;6186:1;6175:9;6171:17;6162:6;6118:71;:::i;:::-;5974:222;;;;:::o;6202:116::-;6272:21;6287:5;6272:21;:::i;:::-;6265:5;6262:32;6252:60;;6308:1;6305;6298:12;6252:60;6202:116;:::o;6324:133::-;6367:5;6405:6;6392:20;6383:29;;6421:30;6445:5;6421:30;:::i;:::-;6324:133;;;;:::o;6463:468::-;6528:6;6536;6585:2;6573:9;6564:7;6560:23;6556:32;6553:119;;;6591:79;;:::i;:::-;6553:119;6711:1;6736:53;6781:7;6772:6;6761:9;6757:22;6736:53;:::i;:::-;6726:63;;6682:117;6838:2;6864:50;6906:7;6897:6;6886:9;6882:22;6864:50;:::i;:::-;6854:60;;6809:115;6463:468;;;;;:::o;6937:117::-;7046:1;7043;7036:12;7060:117;7169:1;7166;7159:12;7183:180;7231:77;7228:1;7221:88;7328:4;7325:1;7318:15;7352:4;7349:1;7342:15;7369:281;7452:27;7474:4;7452:27;:::i;:::-;7444:6;7440:40;7582:6;7570:10;7567:22;7546:18;7534:10;7531:34;7528:62;7525:88;;;7593:18;;:::i;:::-;7525:88;7633:10;7629:2;7622:22;7412:238;7369:281;;:::o;7656:129::-;7690:6;7717:20;;:::i;:::-;7707:30;;7746:33;7774:4;7766:6;7746:33;:::i;:::-;7656:129;;;:::o;7791:308::-;7853:4;7943:18;7935:6;7932:30;7929:56;;;7965:18;;:::i;:::-;7929:56;8003:29;8025:6;8003:29;:::i;:::-;7995:37;;8087:4;8081;8077:15;8069:23;;7791:308;;;:::o;8105:146::-;8202:6;8197:3;8192;8179:30;8243:1;8234:6;8229:3;8225:16;8218:27;8105:146;;;:::o;8257:425::-;8335:5;8360:66;8376:49;8418:6;8376:49;:::i;:::-;8360:66;:::i;:::-;8351:75;;8449:6;8442:5;8435:21;8487:4;8480:5;8476:16;8525:3;8516:6;8511:3;8507:16;8504:25;8501:112;;;8532:79;;:::i;:::-;8501:112;8622:54;8669:6;8664:3;8659;8622:54;:::i;:::-;8341:341;8257:425;;;;;:::o;8702:340::-;8758:5;8807:3;8800:4;8792:6;8788:17;8784:27;8774:122;;8815:79;;:::i;:::-;8774:122;8932:6;8919:20;8957:79;9032:3;9024:6;9017:4;9009:6;9005:17;8957:79;:::i;:::-;8948:88;;8764:278;8702:340;;;;:::o;9048:509::-;9117:6;9166:2;9154:9;9145:7;9141:23;9137:32;9134:119;;;9172:79;;:::i;:::-;9134:119;9320:1;9309:9;9305:17;9292:31;9350:18;9342:6;9339:30;9336:117;;;9372:79;;:::i;:::-;9336:117;9477:63;9532:7;9523:6;9512:9;9508:22;9477:63;:::i;:::-;9467:73;;9263:287;9048:509;;;;:::o;9563:307::-;9624:4;9714:18;9706:6;9703:30;9700:56;;;9736:18;;:::i;:::-;9700:56;9774:29;9796:6;9774:29;:::i;:::-;9766:37;;9858:4;9852;9848:15;9840:23;;9563:307;;;:::o;9876:423::-;9953:5;9978:65;9994:48;10035:6;9994:48;:::i;:::-;9978:65;:::i;:::-;9969:74;;10066:6;10059:5;10052:21;10104:4;10097:5;10093:16;10142:3;10133:6;10128:3;10124:16;10121:25;10118:112;;;10149:79;;:::i;:::-;10118:112;10239:54;10286:6;10281:3;10276;10239:54;:::i;:::-;9959:340;9876:423;;;;;:::o;10318:338::-;10373:5;10422:3;10415:4;10407:6;10403:17;10399:27;10389:122;;10430:79;;:::i;:::-;10389:122;10547:6;10534:20;10572:78;10646:3;10638:6;10631:4;10623:6;10619:17;10572:78;:::i;:::-;10563:87;;10379:277;10318:338;;;;:::o;10662:943::-;10757:6;10765;10773;10781;10830:3;10818:9;10809:7;10805:23;10801:33;10798:120;;;10837:79;;:::i;:::-;10798:120;10957:1;10982:53;11027:7;11018:6;11007:9;11003:22;10982:53;:::i;:::-;10972:63;;10928:117;11084:2;11110:53;11155:7;11146:6;11135:9;11131:22;11110:53;:::i;:::-;11100:63;;11055:118;11212:2;11238:53;11283:7;11274:6;11263:9;11259:22;11238:53;:::i;:::-;11228:63;;11183:118;11368:2;11357:9;11353:18;11340:32;11399:18;11391:6;11388:30;11385:117;;;11421:79;;:::i;:::-;11385:117;11526:62;11580:7;11571:6;11560:9;11556:22;11526:62;:::i;:::-;11516:72;;11311:287;10662:943;;;;;;;:::o;11611:474::-;11679:6;11687;11736:2;11724:9;11715:7;11711:23;11707:32;11704:119;;;11742:79;;:::i;:::-;11704:119;11862:1;11887:53;11932:7;11923:6;11912:9;11908:22;11887:53;:::i;:::-;11877:63;;11833:117;11989:2;12015:53;12060:7;12051:6;12040:9;12036:22;12015:53;:::i;:::-;12005:63;;11960:118;11611:474;;;;;:::o;12091:180::-;12139:77;12136:1;12129:88;12236:4;12233:1;12226:15;12260:4;12257:1;12250:15;12277:320;12321:6;12358:1;12352:4;12348:12;12338:22;;12405:1;12399:4;12395:12;12426:18;12416:81;;12482:4;12474:6;12470:17;12460:27;;12416:81;12544:2;12536:6;12533:14;12513:18;12510:38;12507:84;;12563:18;;:::i;:::-;12507:84;12328:269;12277:320;;;:::o;12603:220::-;12743:34;12739:1;12731:6;12727:14;12720:58;12812:3;12807:2;12799:6;12795:15;12788:28;12603:220;:::o;12829:366::-;12971:3;12992:67;13056:2;13051:3;12992:67;:::i;:::-;12985:74;;13068:93;13157:3;13068:93;:::i;:::-;13186:2;13181:3;13177:12;13170:19;;12829:366;;;:::o;13201:419::-;13367:4;13405:2;13394:9;13390:18;13382:26;;13454:9;13448:4;13444:20;13440:1;13429:9;13425:17;13418:47;13482:131;13608:4;13482:131;:::i;:::-;13474:139;;13201:419;;;:::o;13626:248::-;13766:34;13762:1;13754:6;13750:14;13743:58;13835:31;13830:2;13822:6;13818:15;13811:56;13626:248;:::o;13880:366::-;14022:3;14043:67;14107:2;14102:3;14043:67;:::i;:::-;14036:74;;14119:93;14208:3;14119:93;:::i;:::-;14237:2;14232:3;14228:12;14221:19;;13880:366;;;:::o;14252:419::-;14418:4;14456:2;14445:9;14441:18;14433:26;;14505:9;14499:4;14495:20;14491:1;14480:9;14476:17;14469:47;14533:131;14659:4;14533:131;:::i;:::-;14525:139;;14252:419;;;:::o;14677:221::-;14817:34;14813:1;14805:6;14801:14;14794:58;14886:4;14881:2;14873:6;14869:15;14862:29;14677:221;:::o;14904:366::-;15046:3;15067:67;15131:2;15126:3;15067:67;:::i;:::-;15060:74;;15143:93;15232:3;15143:93;:::i;:::-;15261:2;15256:3;15252:12;15245:19;;14904:366;;;:::o;15276:419::-;15442:4;15480:2;15469:9;15465:18;15457:26;;15529:9;15523:4;15519:20;15515:1;15504:9;15500:17;15493:47;15557:131;15683:4;15557:131;:::i;:::-;15549:139;;15276:419;;;:::o;15701:177::-;15841:29;15837:1;15829:6;15825:14;15818:53;15701:177;:::o;15884:366::-;16026:3;16047:67;16111:2;16106:3;16047:67;:::i;:::-;16040:74;;16123:93;16212:3;16123:93;:::i;:::-;16241:2;16236:3;16232:12;16225:19;;15884:366;;;:::o;16256:419::-;16422:4;16460:2;16449:9;16445:18;16437:26;;16509:9;16503:4;16499:20;16495:1;16484:9;16480:17;16473:47;16537:131;16663:4;16537:131;:::i;:::-;16529:139;;16256:419;;;:::o;16681:232::-;16821:34;16817:1;16809:6;16805:14;16798:58;16890:15;16885:2;16877:6;16873:15;16866:40;16681:232;:::o;16919:366::-;17061:3;17082:67;17146:2;17141:3;17082:67;:::i;:::-;17075:74;;17158:93;17247:3;17158:93;:::i;:::-;17276:2;17271:3;17267:12;17260:19;;16919:366;;;:::o;17291:419::-;17457:4;17495:2;17484:9;17480:18;17472:26;;17544:9;17538:4;17534:20;17530:1;17519:9;17515:17;17508:47;17572:131;17698:4;17572:131;:::i;:::-;17564:139;;17291:419;;;:::o;17716:180::-;17764:77;17761:1;17754:88;17861:4;17858:1;17851:15;17885:4;17882:1;17875:15;17902:191;17942:3;17961:20;17979:1;17961:20;:::i;:::-;17956:25;;17995:20;18013:1;17995:20;:::i;:::-;17990:25;;18038:1;18035;18031:9;18024:16;;18059:3;18056:1;18053:10;18050:36;;;18066:18;;:::i;:::-;18050:36;17902:191;;;;:::o;18099:232::-;18239:34;18235:1;18227:6;18223:14;18216:58;18308:15;18303:2;18295:6;18291:15;18284:40;18099:232;:::o;18337:366::-;18479:3;18500:67;18564:2;18559:3;18500:67;:::i;:::-;18493:74;;18576:93;18665:3;18576:93;:::i;:::-;18694:2;18689:3;18685:12;18678:19;;18337:366;;;:::o;18709:419::-;18875:4;18913:2;18902:9;18898:18;18890:26;;18962:9;18956:4;18952:20;18948:1;18937:9;18933:17;18926:47;18990:131;19116:4;18990:131;:::i;:::-;18982:139;;18709:419;;;:::o;19134:147::-;19235:11;19272:3;19257:18;;19134:147;;;;:::o;19287:114::-;;:::o;19407:398::-;19566:3;19587:83;19668:1;19663:3;19587:83;:::i;:::-;19580:90;;19679:93;19768:3;19679:93;:::i;:::-;19797:1;19792:3;19788:11;19781:18;;19407:398;;;:::o;19811:379::-;19995:3;20017:147;20160:3;20017:147;:::i;:::-;20010:154;;20181:3;20174:10;;19811:379;;;:::o;20196:170::-;20336:22;20332:1;20324:6;20320:14;20313:46;20196:170;:::o;20372:366::-;20514:3;20535:67;20599:2;20594:3;20535:67;:::i;:::-;20528:74;;20611:93;20700:3;20611:93;:::i;:::-;20729:2;20724:3;20720:12;20713:19;;20372:366;;;:::o;20744:419::-;20910:4;20948:2;20937:9;20933:18;20925:26;;20997:9;20991:4;20987:20;20983:1;20972:9;20968:17;20961:47;21025:131;21151:4;21025:131;:::i;:::-;21017:139;;20744:419;;;:::o;21169:174::-;21309:26;21305:1;21297:6;21293:14;21286:50;21169:174;:::o;21349:366::-;21491:3;21512:67;21576:2;21571:3;21512:67;:::i;:::-;21505:74;;21588:93;21677:3;21588:93;:::i;:::-;21706:2;21701:3;21697:12;21690:19;;21349:366;;;:::o;21721:419::-;21887:4;21925:2;21914:9;21910:18;21902:26;;21974:9;21968:4;21964:20;21960:1;21949:9;21945:17;21938:47;22002:131;22128:4;22002:131;:::i;:::-;21994:139;;21721:419;;;:::o;22146:228::-;22286:34;22282:1;22274:6;22270:14;22263:58;22355:11;22350:2;22342:6;22338:15;22331:36;22146:228;:::o;22380:366::-;22522:3;22543:67;22607:2;22602:3;22543:67;:::i;:::-;22536:74;;22619:93;22708:3;22619:93;:::i;:::-;22737:2;22732:3;22728:12;22721:19;;22380:366;;;:::o;22752:419::-;22918:4;22956:2;22945:9;22941:18;22933:26;;23005:9;22999:4;22995:20;22991:1;22980:9;22976:17;22969:47;23033:131;23159:4;23033:131;:::i;:::-;23025:139;;22752:419;;;:::o;23177:141::-;23226:4;23249:3;23241:11;;23272:3;23269:1;23262:14;23306:4;23303:1;23293:18;23285:26;;23177:141;;;:::o;23324:93::-;23361:6;23408:2;23403;23396:5;23392:14;23388:23;23378:33;;23324:93;;;:::o;23423:107::-;23467:8;23517:5;23511:4;23507:16;23486:37;;23423:107;;;;:::o;23536:393::-;23605:6;23655:1;23643:10;23639:18;23678:97;23708:66;23697:9;23678:97;:::i;:::-;23796:39;23826:8;23815:9;23796:39;:::i;:::-;23784:51;;23868:4;23864:9;23857:5;23853:21;23844:30;;23917:4;23907:8;23903:19;23896:5;23893:30;23883:40;;23612:317;;23536:393;;;;;:::o;23935:60::-;23963:3;23984:5;23977:12;;23935:60;;;:::o;24001:142::-;24051:9;24084:53;24102:34;24111:24;24129:5;24111:24;:::i;:::-;24102:34;:::i;:::-;24084:53;:::i;:::-;24071:66;;24001:142;;;:::o;24149:75::-;24192:3;24213:5;24206:12;;24149:75;;;:::o;24230:269::-;24340:39;24371:7;24340:39;:::i;:::-;24401:91;24450:41;24474:16;24450:41;:::i;:::-;24442:6;24435:4;24429:11;24401:91;:::i;:::-;24395:4;24388:105;24306:193;24230:269;;;:::o;24505:73::-;24550:3;24505:73;:::o;24584:189::-;24661:32;;:::i;:::-;24702:65;24760:6;24752;24746:4;24702:65;:::i;:::-;24637:136;24584:189;;:::o;24779:186::-;24839:120;24856:3;24849:5;24846:14;24839:120;;;24910:39;24947:1;24940:5;24910:39;:::i;:::-;24883:1;24876:5;24872:13;24863:22;;24839:120;;;24779:186;;:::o;24971:543::-;25072:2;25067:3;25064:11;25061:446;;;25106:38;25138:5;25106:38;:::i;:::-;25190:29;25208:10;25190:29;:::i;:::-;25180:8;25176:44;25373:2;25361:10;25358:18;25355:49;;;25394:8;25379:23;;25355:49;25417:80;25473:22;25491:3;25473:22;:::i;:::-;25463:8;25459:37;25446:11;25417:80;:::i;:::-;25076:431;;25061:446;24971:543;;;:::o;25520:117::-;25574:8;25624:5;25618:4;25614:16;25593:37;;25520:117;;;;:::o;25643:169::-;25687:6;25720:51;25768:1;25764:6;25756:5;25753:1;25749:13;25720:51;:::i;:::-;25716:56;25801:4;25795;25791:15;25781:25;;25694:118;25643:169;;;;:::o;25817:295::-;25893:4;26039:29;26064:3;26058:4;26039:29;:::i;:::-;26031:37;;26101:3;26098:1;26094:11;26088:4;26085:21;26077:29;;25817:295;;;;:::o;26117:1395::-;26234:37;26267:3;26234:37;:::i;:::-;26336:18;26328:6;26325:30;26322:56;;;26358:18;;:::i;:::-;26322:56;26402:38;26434:4;26428:11;26402:38;:::i;:::-;26487:67;26547:6;26539;26533:4;26487:67;:::i;:::-;26581:1;26605:4;26592:17;;26637:2;26629:6;26626:14;26654:1;26649:618;;;;27311:1;27328:6;27325:77;;;27377:9;27372:3;27368:19;27362:26;27353:35;;27325:77;27428:67;27488:6;27481:5;27428:67;:::i;:::-;27422:4;27415:81;27284:222;26619:887;;26649:618;26701:4;26697:9;26689:6;26685:22;26735:37;26767:4;26735:37;:::i;:::-;26794:1;26808:208;26822:7;26819:1;26816:14;26808:208;;;26901:9;26896:3;26892:19;26886:26;26878:6;26871:42;26952:1;26944:6;26940:14;26930:24;;26999:2;26988:9;26984:18;26971:31;;26845:4;26842:1;26838:12;26833:17;;26808:208;;;27044:6;27035:7;27032:19;27029:179;;;27102:9;27097:3;27093:19;27087:26;27145:48;27187:4;27179:6;27175:17;27164:9;27145:48;:::i;:::-;27137:6;27130:64;27052:156;27029:179;27254:1;27250;27242:6;27238:14;27234:22;27228:4;27221:36;26656:611;;;26619:887;;26209:1303;;;26117:1395;;:::o;27518:85::-;27563:7;27592:5;27581:16;;27518:85;;;:::o;27609:158::-;27667:9;27700:61;27718:42;27727:32;27753:5;27727:32;:::i;:::-;27718:42;:::i;:::-;27700:61;:::i;:::-;27687:74;;27609:158;;;:::o;27773:147::-;27868:45;27907:5;27868:45;:::i;:::-;27863:3;27856:58;27773:147;;:::o;27926:348::-;28055:4;28093:2;28082:9;28078:18;28070:26;;28106:79;28182:1;28171:9;28167:17;28158:6;28106:79;:::i;:::-;28195:72;28263:2;28252:9;28248:18;28239:6;28195:72;:::i;:::-;27926:348;;;;;:::o;28280:148::-;28382:11;28419:3;28404:18;;28280:148;;;;:::o;28434:390::-;28540:3;28568:39;28601:5;28568:39;:::i;:::-;28623:89;28705:6;28700:3;28623:89;:::i;:::-;28616:96;;28721:65;28779:6;28774:3;28767:4;28760:5;28756:16;28721:65;:::i;:::-;28811:6;28806:3;28802:16;28795:23;;28544:280;28434:390;;;;:::o;28854:874::-;28957:3;28994:5;28988:12;29023:36;29049:9;29023:36;:::i;:::-;29075:89;29157:6;29152:3;29075:89;:::i;:::-;29068:96;;29195:1;29184:9;29180:17;29211:1;29206:166;;;;29386:1;29381:341;;;;29173:549;;29206:166;29290:4;29286:9;29275;29271:25;29266:3;29259:38;29352:6;29345:14;29338:22;29330:6;29326:35;29321:3;29317:45;29310:52;;29206:166;;29381:341;29448:38;29480:5;29448:38;:::i;:::-;29508:1;29522:154;29536:6;29533:1;29530:13;29522:154;;;29610:7;29604:14;29600:1;29595:3;29591:11;29584:35;29660:1;29651:7;29647:15;29636:26;;29558:4;29555:1;29551:12;29546:17;;29522:154;;;29705:6;29700:3;29696:16;29689:23;;29388:334;;29173:549;;28961:767;;28854:874;;;;:::o;29734:151::-;29874:3;29870:1;29862:6;29858:14;29851:27;29734:151;:::o;29891:400::-;30051:3;30072:84;30154:1;30149:3;30072:84;:::i;:::-;30065:91;;30165:93;30254:3;30165:93;:::i;:::-;30283:1;30278:3;30274:11;30267:18;;29891:400;;;:::o;30297:855::-;30623:3;30645:95;30736:3;30727:6;30645:95;:::i;:::-;30638:102;;30757:92;30845:3;30836:6;30757:92;:::i;:::-;30750:99;;30866:148;31010:3;30866:148;:::i;:::-;30859:155;;31031:95;31122:3;31113:6;31031:95;:::i;:::-;31024:102;;31143:3;31136:10;;30297:855;;;;;;:::o;31158:225::-;31298:34;31294:1;31286:6;31282:14;31275:58;31367:8;31362:2;31354:6;31350:15;31343:33;31158:225;:::o;31389:366::-;31531:3;31552:67;31616:2;31611:3;31552:67;:::i;:::-;31545:74;;31628:93;31717:3;31628:93;:::i;:::-;31746:2;31741:3;31737:12;31730:19;;31389:366;;;:::o;31761:419::-;31927:4;31965:2;31954:9;31950:18;31942:26;;32014:9;32008:4;32004:20;32000:1;31989:9;31985:17;31978:47;32042:131;32168:4;32042:131;:::i;:::-;32034:139;;31761:419;;;:::o;32186:182::-;32326:34;32322:1;32314:6;32310:14;32303:58;32186:182;:::o;32374:366::-;32516:3;32537:67;32601:2;32596:3;32537:67;:::i;:::-;32530:74;;32613:93;32702:3;32613:93;:::i;:::-;32731:2;32726:3;32722:12;32715:19;;32374:366;;;:::o;32746:419::-;32912:4;32950:2;32939:9;32935:18;32927:26;;32999:9;32993:4;32989:20;32985:1;32974:9;32970:17;32963:47;33027:131;33153:4;33027:131;:::i;:::-;33019:139;;32746:419;;;:::o;33171:178::-;33311:30;33307:1;33299:6;33295:14;33288:54;33171:178;:::o;33355:366::-;33497:3;33518:67;33582:2;33577:3;33518:67;:::i;:::-;33511:74;;33594:93;33683:3;33594:93;:::i;:::-;33712:2;33707:3;33703:12;33696:19;;33355:366;;;:::o;33727:419::-;33893:4;33931:2;33920:9;33916:18;33908:26;;33980:9;33974:4;33970:20;33966:1;33955:9;33951:17;33944:47;34008:131;34134:4;34008:131;:::i;:::-;34000:139;;33727:419;;;:::o;34152:233::-;34292:34;34288:1;34280:6;34276:14;34269:58;34361:16;34356:2;34348:6;34344:15;34337:41;34152:233;:::o;34391:366::-;34533:3;34554:67;34618:2;34613:3;34554:67;:::i;:::-;34547:74;;34630:93;34719:3;34630:93;:::i;:::-;34748:2;34743:3;34739:12;34732:19;;34391:366;;;:::o;34763:419::-;34929:4;34967:2;34956:9;34952:18;34944:26;;35016:9;35010:4;35006:20;35002:1;34991:9;34987:17;34980:47;35044:131;35170:4;35044:131;:::i;:::-;35036:139;;34763:419;;;:::o;35188:224::-;35328:34;35324:1;35316:6;35312:14;35305:58;35397:7;35392:2;35384:6;35380:15;35373:32;35188:224;:::o;35418:366::-;35560:3;35581:67;35645:2;35640:3;35581:67;:::i;:::-;35574:74;;35657:93;35746:3;35657:93;:::i;:::-;35775:2;35770:3;35766:12;35759:19;;35418:366;;;:::o;35790:419::-;35956:4;35994:2;35983:9;35979:18;35971:26;;36043:9;36037:4;36033:20;36029:1;36018:9;36014:17;36007:47;36071:131;36197:4;36071:131;:::i;:::-;36063:139;;35790:419;;;:::o;36215:223::-;36355:34;36351:1;36343:6;36339:14;36332:58;36424:6;36419:2;36411:6;36407:15;36400:31;36215:223;:::o;36444:366::-;36586:3;36607:67;36671:2;36666:3;36607:67;:::i;:::-;36600:74;;36683:93;36772:3;36683:93;:::i;:::-;36801:2;36796:3;36792:12;36785:19;;36444:366;;;:::o;36816:419::-;36982:4;37020:2;37009:9;37005:18;36997:26;;37069:9;37063:4;37059:20;37055:1;37044:9;37040:17;37033:47;37097:131;37223:4;37097:131;:::i;:::-;37089:139;;36816:419;;;:::o;37241:182::-;37381:34;37377:1;37369:6;37365:14;37358:58;37241:182;:::o;37429:366::-;37571:3;37592:67;37656:2;37651:3;37592:67;:::i;:::-;37585:74;;37668:93;37757:3;37668:93;:::i;:::-;37786:2;37781:3;37777:12;37770:19;;37429:366;;;:::o;37801:419::-;37967:4;38005:2;37994:9;37990:18;37982:26;;38054:9;38048:4;38044:20;38040:1;38029:9;38025:17;38018:47;38082:131;38208:4;38082:131;:::i;:::-;38074:139;;37801:419;;;:::o;38226:175::-;38366:27;38362:1;38354:6;38350:14;38343:51;38226:175;:::o;38407:366::-;38549:3;38570:67;38634:2;38629:3;38570:67;:::i;:::-;38563:74;;38646:93;38735:3;38646:93;:::i;:::-;38764:2;38759:3;38755:12;38748:19;;38407:366;;;:::o;38779:419::-;38945:4;38983:2;38972:9;38968:18;38960:26;;39032:9;39026:4;39022:20;39018:1;39007:9;39003:17;38996:47;39060:131;39186:4;39060:131;:::i;:::-;39052:139;;38779:419;;;:::o;39204:237::-;39344:34;39340:1;39332:6;39328:14;39321:58;39413:20;39408:2;39400:6;39396:15;39389:45;39204:237;:::o;39447:366::-;39589:3;39610:67;39674:2;39669:3;39610:67;:::i;:::-;39603:74;;39686:93;39775:3;39686:93;:::i;:::-;39804:2;39799:3;39795:12;39788:19;;39447:366;;;:::o;39819:419::-;39985:4;40023:2;40012:9;40008:18;40000:26;;40072:9;40066:4;40062:20;40058:1;40047:9;40043:17;40036:47;40100:131;40226:4;40100:131;:::i;:::-;40092:139;;39819:419;;;:::o;40244:180::-;40292:77;40289:1;40282:88;40389:4;40386:1;40379:15;40413:4;40410:1;40403:15;40430:98;40481:6;40515:5;40509:12;40499:22;;40430:98;;;:::o;40534:168::-;40617:11;40651:6;40646:3;40639:19;40691:4;40686:3;40682:14;40667:29;;40534:168;;;;:::o;40708:373::-;40794:3;40822:38;40854:5;40822:38;:::i;:::-;40876:70;40939:6;40934:3;40876:70;:::i;:::-;40869:77;;40955:65;41013:6;41008:3;41001:4;40994:5;40990:16;40955:65;:::i;:::-;41045:29;41067:6;41045:29;:::i;:::-;41040:3;41036:39;41029:46;;40798:283;40708:373;;;;:::o;41087:640::-;41282:4;41320:3;41309:9;41305:19;41297:27;;41334:71;41402:1;41391:9;41387:17;41378:6;41334:71;:::i;:::-;41415:72;41483:2;41472:9;41468:18;41459:6;41415:72;:::i;:::-;41497;41565:2;41554:9;41550:18;41541:6;41497:72;:::i;:::-;41616:9;41610:4;41606:20;41601:2;41590:9;41586:18;41579:48;41644:76;41715:4;41706:6;41644:76;:::i;:::-;41636:84;;41087:640;;;;;;;:::o;41733:141::-;41789:5;41820:6;41814:13;41805:22;;41836:32;41862:5;41836:32;:::i;:::-;41733:141;;;;:::o;41880:349::-;41949:6;41998:2;41986:9;41977:7;41973:23;41969:32;41966:119;;;42004:79;;:::i;:::-;41966:119;42124:1;42149:63;42204:7;42195:6;42184:9;42180:22;42149:63;:::i;:::-;42139:73;;42095:127;41880:349;;;;:::o

Swarm Source

ipfs://ae45fddac03b1b89d109e3a20231140233df7a1775d4448a18ded3809039f054
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.