ETH Price: $3,591.94 (-2.78%)

Token

ERC-20: MCVERSE TRUX (TRUX)
 

Overview

Max Total Supply

100 TRUX

Holders

32

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 TRUX
0x79d860858361577a4f2a33d83aac2299b6d77025
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:
Nfvs

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-04-19
*/

// Sources flattened with hardhat v2.22.2 https://hardhat.org

// SPDX-License-Identifier: MIT

// File @openzeppelin/contracts/access/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}


// File @openzeppelin/contracts/utils/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (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;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}


// File @openzeppelin/contracts/utils/introspection/[email protected]

// Original license: SPDX_License_Identifier: MIT
// 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/[email protected]

// Original license: SPDX_License_Identifier: MIT
// 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/utils/math/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/math/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)

pragma solidity ^0.8.0;

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)

pragma solidity ^0.8.0;


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

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

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

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

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

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

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


// File @openzeppelin/contracts/access/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControl.sol)

pragma solidity ^0.8.0;




/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```solidity
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```solidity
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}
 * to enforce additional security measures for this role.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role);
        _;
    }

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `_msgSender()` is missing `role`.
     * Overriding this function changes the behavior of the {onlyRole} modifier.
     *
     * Format of the revert message is described in {_checkRole}.
     *
     * _Available since v4.6._
     */
    function _checkRole(bytes32 role) internal view virtual {
        _checkRole(role, _msgSender());
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(account),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleGranted} event.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleRevoked} event.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     *
     * May emit a {RoleRevoked} event.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * May emit a {RoleGranted} event.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleGranted} event.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleRevoked} event.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}


// File @openzeppelin/contracts/interfaces/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/security/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;

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

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

    bool private _paused;

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/common/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

        return (royalty.receiver, royaltyAmount);
    }

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

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

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

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

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

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

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


// File @openzeppelin/contracts/token/ERC1155/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(
        address[] calldata accounts,
        uint256[] calldata ids
    ) external view returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}


// File @openzeppelin/contracts/token/ERC1155/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}


// File @openzeppelin/contracts/token/ERC1155/utils/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/utils/ERC1155Receiver.sol)

pragma solidity ^0.8.0;


/**
 * @dev _Available since v3.1._
 */
abstract contract ERC1155Receiver is ERC165, IERC1155Receiver {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);
    }
}


// File @openzeppelin/contracts/token/ERC1155/utils/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/utils/ERC1155Holder.sol)

pragma solidity ^0.8.0;

/**
 * Simple implementation of `ERC1155Receiver` that will allow a contract to hold ERC1155 tokens.
 *
 * IMPORTANT: When inheriting this contract, you must include a way to use the received tokens, otherwise they will be
 * stuck.
 *
 * @dev _Available since v3.1._
 */
contract ERC1155Holder is ERC1155Receiver {
    function onERC1155Received(
        address,
        address,
        uint256,
        uint256,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC1155Received.selector;
    }

    function onERC1155BatchReceived(
        address,
        address,
        uint256[] memory,
        uint256[] memory,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC1155BatchReceived.selector;
    }
}


// File @openzeppelin/contracts/token/ERC721/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 tokenId) external;

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

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

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

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

// Original license: SPDX_License_Identifier: MIT
// 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/[email protected]

// Original license: SPDX_License_Identifier: MIT
// 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/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}


// File @openzeppelin/contracts/token/ERC721/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

    /**
     * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

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

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

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

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

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

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

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

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

        _owners[tokenId] = to;

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

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

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

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

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

        // Clear approvals
        delete _tokenApprovals[tokenId];

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId, 1);

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

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

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

        emit Transfer(from, to, tokenId);

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, firstTokenId, batchSize);

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

        uint256 tokenId = firstTokenId;

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Royalty.sol)

pragma solidity ^0.8.0;



/**
 * @dev Extension of ERC721 with the ERC2981 NFT Royalty Standard, a standardized way to retrieve royalty payment
 * information.
 *
 * Royalty information can be specified globally for all token ids via {ERC2981-_setDefaultRoyalty}, and/or individually for
 * specific token ids via {ERC2981-_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC721Royalty is ERC2981, ERC721 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC2981) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {ERC721-_burn}. This override additionally clears the royalty information for the token.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);
        _resetTokenRoyalty(tokenId);
    }
}


// File @thetrees1529/solutils/contracts/gamefi/[email protected]

// Original license: SPDX_License_Identifier: MIT
pragma solidity ^0.8.0;


contract Nft is AccessControl, ERC721Enumerable {

    string private baseUri;
    uint private _nextTokenId;

    constructor(string memory uri, string memory name, string memory symbol) ERC721(name, symbol) {
        _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _setBaseURI(uri);
    }

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

    function mint(address to, uint numberOf) external onlyRole(DEFAULT_ADMIN_ROLE) returns(uint[] memory tokenIds){
        tokenIds = new uint[](numberOf);
        uint tokenId = _nextTokenId;
        _nextTokenId += numberOf;
        for(uint i; i < numberOf; i ++){
            _mint(to, tokenId);
            tokenIds[i] = tokenId;
            tokenId ++;
        }
    }

    function burn(uint[] calldata tokenIds) external onlyRole(DEFAULT_ADMIN_ROLE) {
        for(uint i; i < tokenIds.length; i ++) {
            _burn(tokenIds[i]);
        }
    }

    function burn(uint tokenId) external onlyRole(DEFAULT_ADMIN_ROLE) {
        _burn(tokenId);
    }

    function setBaseURI(string memory _newUri) external onlyRole(DEFAULT_ADMIN_ROLE) {
        _setBaseURI(_newUri);
    }

    function _setBaseURI(string memory _newUri) private {
        baseUri = _newUri;
    }

    // hooks / overrides

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

}


// File @openzeppelin/contracts/utils/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

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

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

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

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

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


// File contracts/Nfvs/NfvBase.sol

// Original license: SPDX_License_Identifier: MIT
pragma solidity 0.8.19;
// import "hardhat/console.sol";
abstract contract NfvBase is ERC721Royalty, Nft, ERC1155Holder, Pausable {

    struct Rent {
        bool inProgress;
        address owner;
        uint endsAt;
    }

    using Counters for Counters.Counter;

    bytes32 public constant RENTER_ROLE = keccak256("RENTER_ROLE");
    bytes32 public constant EQUIPPER_ROLE = keccak256("EQUIPPER_ROLE");
    Counters.Counter private tokenIdCounter;
    string private baseUri;

    string[] private attributeKeys;
    mapping(uint => Rent) private _rents;
    mapping(address => bool) public blacklisted;

    constructor() {
        
    }

    function setRoyalty(address receiver, uint96 feeNumerator) external onlyRole(DEFAULT_ADMIN_ROLE) {
        _setDefaultRoyalty(receiver, feeNumerator);
    }

    function setBlacklistStatus(address addr, bool status) external onlyRole(DEFAULT_ADMIN_ROLE) {
        blacklisted[addr] = status;
    }

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

    //renting
    function rentTo(uint tokenId, address to, uint period) external onlyRole(RENTER_ROLE) {
        Rent storage rent = _rents[tokenId];
        require(!rent.inProgress, "Currently rented.");
        address owner = ownerOf(tokenId);
        rent.owner = owner;
        rent.endsAt = block.timestamp + period;
        _transfer(owner, to, tokenId);
        rent.inProgress = true;
    }

    function cancelRent(uint tokenId) external onlyRole(RENTER_ROLE) {
        Rent storage rent = _rents[tokenId];
        require(rent.inProgress, "Not under rent.");
        rent.endsAt = block.timestamp;
    }

    function isUnderRent(uint tokenId) external view returns(bool) {
        return _rents[tokenId].inProgress;
    }

    function rentInfo(uint tokenId) external view returns(address originalOwner, uint endsAt) {
        Rent storage rent = _rents[tokenId];
        require(rent.inProgress, "Not rented currently.");
        return (rent.owner, rent.endsAt);
    }

    function returnRented(uint tokenId) external onlyRole(RENTER_ROLE) {
        Rent storage rent = _rents[tokenId];
        require(rent.inProgress, "Rent not in progress.");
        require(block.timestamp >= rent.endsAt, "Rent period not over.");
        rent.inProgress = false;
        _transfer(ownerOf(tokenId), rent.owner, tokenId);
    }


    function pause() public onlyRole(DEFAULT_ADMIN_ROLE) {
        _pause();
    }

    function unpause() public onlyRole(DEFAULT_ADMIN_ROLE) {
        _unpause();
    }


    // hooks / overrides

    function _baseURI() internal virtual override(ERC721, Nft) view returns(string memory) {
        return super._baseURI();
    }

    function _transfer(address from, address to, uint tokenId) internal virtual whenNotPaused override {
        super._transfer(from, to, tokenId);
    }

    function _beforeTokenTransfer(address from, address to, uint256 tokenId, uint batchSize)
        internal
        virtual
        override(ERC721, ERC721Enumerable)
    {
        require(!_rents[tokenId].inProgress, "Currently rented.");
        require(!blacklisted[from] && !blacklisted[to], "Blacklisted.");
        super._beforeTokenTransfer(from, to, tokenId, batchSize);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC721Royalty, ERC1155Receiver, Nft)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }

    function _burn(uint tokenId) internal virtual override(ERC721, ERC721Royalty) {
        return super._burn(tokenId);
    }

}


// File contracts/Nfvs/Nfvs.sol

// Original license: SPDX_License_Identifier: MIT
pragma solidity 0.8.19;
contract Nfvs is NfvBase {

    using Counters for Counters.Counter;

    uint256 constant public MAX_LAMBOS = 3333;

    constructor(string memory uri, string memory name, string memory symbol) Nft(uri, name, symbol) {
        _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
    }


    function _mint(address to, uint tokenId) internal override {
        super._mint(to, tokenId);
        require(totalSupply() <= MAX_LAMBOS, "Max supply reached.");
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"uri","type":"string"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EQUIPPER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_LAMBOS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RENTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"cancelRent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isUnderRent","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"numberOf","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"rentInfo","outputs":[{"internalType":"address","name":"originalOwner","type":"address"},{"internalType":"uint256","name":"endsAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"period","type":"uint256"}],"name":"rentTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"returnRented","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newUri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setBlacklistStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604051620063af380380620063af8339818101604052810190620000379190620003d1565b828282818181600390816200004d9190620006d5565b5080600490816200005f9190620006d5565b505050620000776000801b33620000c460201b60201c565b6200008883620001b660201b60201c565b5050506000600f60006101000a81548160ff021916908315150217905550620000bb6000801b33620000c460201b60201c565b505050620007bc565b620000d68282620001cb60201b60201c565b620001b25760016002600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620001576200023660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b80600d9081620001c79190620006d5565b5050565b60006002600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620002a7826200025c565b810181811067ffffffffffffffff82111715620002c957620002c86200026d565b5b80604052505050565b6000620002de6200023e565b9050620002ec82826200029c565b919050565b600067ffffffffffffffff8211156200030f576200030e6200026d565b5b6200031a826200025c565b9050602081019050919050565b60005b83811015620003475780820151818401526020810190506200032a565b60008484015250505050565b60006200036a6200036484620002f1565b620002d2565b90508281526020810184848401111562000389576200038862000257565b5b6200039684828562000327565b509392505050565b600082601f830112620003b657620003b562000252565b5b8151620003c884826020860162000353565b91505092915050565b600080600060608486031215620003ed57620003ec62000248565b5b600084015167ffffffffffffffff8111156200040e576200040d6200024d565b5b6200041c868287016200039e565b935050602084015167ffffffffffffffff81111562000440576200043f6200024d565b5b6200044e868287016200039e565b925050604084015167ffffffffffffffff8111156200047257620004716200024d565b5b62000480868287016200039e565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004dd57607f821691505b602082108103620004f357620004f262000495565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200055d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200051e565b6200056986836200051e565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005b6620005b0620005aa8462000581565b6200058b565b62000581565b9050919050565b6000819050919050565b620005d28362000595565b620005ea620005e182620005bd565b8484546200052b565b825550505050565b600090565b62000601620005f2565b6200060e818484620005c7565b505050565b5b8181101562000636576200062a600082620005f7565b60018101905062000614565b5050565b601f82111562000685576200064f81620004f9565b6200065a846200050e565b810160208510156200066a578190505b6200068262000679856200050e565b83018262000613565b50505b505050565b600082821c905092915050565b6000620006aa600019846008026200068a565b1980831691505092915050565b6000620006c5838362000697565b9150826002028217905092915050565b620006e0826200048a565b67ffffffffffffffff811115620006fc57620006fb6200026d565b5b620007088254620004c4565b620007158282856200063a565b600060209050601f8311600181146200074d576000841562000738578287015190505b620007448582620006b7565b865550620007b4565b601f1984166200075d86620004f9565b60005b82811015620007875784890151825560018201915060208501945060208101905062000760565b86831015620007a75784890151620007a3601f89168262000697565b8355505b6001600288020188555050505b505050505050565b615be380620007cc6000396000f3fe608060405234801561001057600080fd5b50600436106102745760003560e01c806370a0823111610151578063b3916fcf116100c3578063c5430a9d11610087578063c5430a9d14610792578063c87b56dd146107c3578063d547741f146107f3578063dbac26e91461080f578063e985e9c51461083f578063f23a6e611461086f57610274565b8063b3916fcf146106dc578063b80f55c91461070c578063b88d4fde14610728578063b97c9f7714610744578063bc197c811461076257610274565b806391d148541161011557806391d148541461061a57806395d89b411461064a578063a217fddf14610668578063a22cb46514610686578063a53bb990146106a2578063a55bb43b146106be57610274565b806370a08231146105785780638456cb59146105a85780638462151c146105b2578063857529f1146105e25780638f2fc60b146105fe57610274565b806336568abe116101ea57806342966c68116101ae57806342966c68146104a6578063475970d3146104c25780634f6ccce7146104de57806355f804b31461050e5780635c975abb1461052a5780636352211e1461054857610274565b806336568abe146104165780633bd70868146104325780633f4ba83a1461045057806340c10f191461045a57806342842e0e1461048a57610274565b806318160ddd1161023c57806318160ddd1461032f57806323b872dd1461034d578063248a9ca3146103695780632a55205a146103995780632f2ff15d146103ca5780632f745c59146103e657610274565b806301ffc9a71461027957806303d29d28146102a957806306fdde03146102c5578063081812fc146102e3578063095ea7b314610313575b600080fd5b610293600480360381019061028e9190613b61565b61089f565b6040516102a09190613ba9565b60405180910390f35b6102c360048036038101906102be9190613c4e565b6108b1565b005b6102cd61091a565b6040516102da9190613d1e565b60405180910390f35b6102fd60048036038101906102f89190613d76565b6109ac565b60405161030a9190613db2565b60405180910390f35b61032d60048036038101906103289190613dcd565b6109f2565b005b610337610b09565b6040516103449190613e1c565b60405180910390f35b61036760048036038101906103629190613e37565b610b16565b005b610383600480360381019061037e9190613ec0565b610b76565b6040516103909190613efc565b60405180910390f35b6103b360048036038101906103ae9190613f17565b610b96565b6040516103c1929190613f57565b60405180910390f35b6103e460048036038101906103df9190613f80565b610d80565b005b61040060048036038101906103fb9190613dcd565b610da1565b60405161040d9190613e1c565b60405180910390f35b610430600480360381019061042b9190613f80565b610e46565b005b61043a610ec9565b6040516104479190613efc565b60405180910390f35b610458610eed565b005b610474600480360381019061046f9190613dcd565b610f05565b604051610481919061407e565b60405180910390f35b6104a4600480360381019061049f9190613e37565b610fde565b005b6104c060048036038101906104bb9190613d76565b610ffe565b005b6104dc60048036038101906104d79190613d76565b611018565b005b6104f860048036038101906104f39190613d76565b61114a565b6040516105059190613e1c565b60405180910390f35b610528600480360381019061052391906141d5565b6111bb565b005b6105326111d5565b60405161053f9190613ba9565b60405180910390f35b610562600480360381019061055d9190613d76565b6111ec565b60405161056f9190613db2565b60405180910390f35b610592600480360381019061058d919061421e565b611272565b60405161059f9190613e1c565b60405180910390f35b6105b0611329565b005b6105cc60048036038101906105c7919061421e565b611341565b6040516105d9919061407e565b60405180910390f35b6105fc60048036038101906105f79190613d76565b61144a565b005b6106186004803603810190610613919061428f565b6114ea565b005b610634600480360381019061062f9190613f80565b611506565b6040516106419190613ba9565b60405180910390f35b610652611571565b60405161065f9190613d1e565b60405180910390f35b610670611603565b60405161067d9190613efc565b60405180910390f35b6106a0600480360381019061069b9190613c4e565b61160a565b005b6106bc60048036038101906106b791906142cf565b611620565b005b6106c6611747565b6040516106d39190613e1c565b60405180910390f35b6106f660048036038101906106f19190613d76565b61174d565b6040516107039190613ba9565b60405180910390f35b61072660048036038101906107219190614382565b61177a565b005b610742600480360381019061073d9190614470565b6117d0565b005b61074c611832565b6040516107599190613efc565b60405180910390f35b61077c600480360381019061077791906145b6565b611856565b6040516107899190614694565b60405180910390f35b6107ac60048036038101906107a79190613d76565b61186b565b6040516107ba929190613f57565b60405180910390f35b6107dd60048036038101906107d89190613d76565b61190a565b6040516107ea9190613d1e565b60405180910390f35b61080d60048036038101906108089190613f80565b611972565b005b6108296004803603810190610824919061421e565b611993565b6040516108369190613ba9565b60405180910390f35b610859600480360381019061085491906146af565b6119b3565b6040516108669190613ba9565b60405180910390f35b610889600480360381019061088491906146ef565b611a47565b6040516108969190614694565b60405180910390f35b60006108aa82611a5c565b9050919050565b6000801b6108be81611ad6565b81601460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b606060038054610929906147b5565b80601f0160208091040260200160405190810160405280929190818152602001828054610955906147b5565b80156109a25780601f10610977576101008083540402835291602001916109a2565b820191906000526020600020905b81548152906001019060200180831161098557829003601f168201915b5050505050905090565b60006109b782611aea565b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109fd826111ec565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6490614858565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a8c611b35565b73ffffffffffffffffffffffffffffffffffffffff161480610abb5750610aba81610ab5611b35565b6119b3565b5b610afa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af1906148ea565b60405180910390fd5b610b048383611b3d565b505050565b6000600b80549050905090565b610b27610b21611b35565b82611bf6565b610b66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5d9061497c565b60405180910390fd5b610b71838383611c8b565b505050565b600060026000838152602001908152602001600020600101549050919050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610d2b5760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610d35611ca3565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610d6191906149cb565b610d6b9190614a3c565b90508160000151819350935050509250929050565b610d8982610b76565b610d9281611ad6565b610d9c8383611cad565b505050565b6000610dac83611272565b8210610ded576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de490614adf565b60405180910390fd5b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e4e611b35565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ebb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb290614b71565b60405180910390fd5b610ec58282611d8e565b5050565b7fb379d9535b5ae7800ada8f473bd7d55f753e8023b1ed709eab5f121d2b9807be81565b6000801b610efa81611ad6565b610f02611e70565b50565b60606000801b610f1481611ad6565b8267ffffffffffffffff811115610f2e57610f2d6140aa565b5b604051908082528060200260200182016040528015610f5c5781602001602082028036833780820191505090505b5091506000600e54905083600e6000828254610f789190614b91565b9250508190555060005b84811015610fd557610f948683611ed3565b81848281518110610fa857610fa7614bc5565b5b6020026020010181815250508180610fbf90614bf4565b9250508080610fcd90614bf4565b915050610f82565b50505092915050565b610ff9838383604051806020016040528060008152506117d0565b505050565b6000801b61100b81611ad6565b61101482611f2d565b5050565b7f3b652633b3026fa70803ad50b58b0ae884cefe3497643f62c67c466f41a6e88d61104281611ad6565b60006013600084815260200190815260200160002090508060000160009054906101000a900460ff166110aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a190614c88565b60405180910390fd5b80600101544210156110f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e890614cf4565b60405180910390fd5b60008160000160006101000a81548160ff02191690831515021790555061114561111a846111ec565b8260000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685611c8b565b505050565b6000611154610b09565b8210611195576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118c90614d86565b60405180910390fd5b600b82815481106111a9576111a8614bc5565b5b90600052602060002001549050919050565b6000801b6111c881611ad6565b6111d182611f39565b5050565b6000600f60009054906101000a900460ff16905090565b6000806111f883611f4c565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611269576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126090614df2565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036112e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d990614e84565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000801b61133681611ad6565b61133e611f89565b50565b6060600061134e83611272565b9050600081036113aa57600067ffffffffffffffff811115611373576113726140aa565b5b6040519080825280602002602001820160405280156113a15781602001602082028036833780820191505090505b50915050611445565b60008167ffffffffffffffff8111156113c6576113c56140aa565b5b6040519080825280602002602001820160405280156113f45781602001602082028036833780820191505090505b50905060005b8281101561143e5761140c8582610da1565b82828151811061141f5761141e614bc5565b5b602002602001018181525050808061143690614bf4565b9150506113fa565b8193505050505b919050565b7f3b652633b3026fa70803ad50b58b0ae884cefe3497643f62c67c466f41a6e88d61147481611ad6565b60006013600084815260200190815260200160002090508060000160009054906101000a900460ff166114dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d390614ef0565b60405180910390fd5b428160010181905550505050565b6000801b6114f781611ad6565b6115018383611fec565b505050565b60006002600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060048054611580906147b5565b80601f01602080910402602001604051908101604052809291908181526020018280546115ac906147b5565b80156115f95780601f106115ce576101008083540402835291602001916115f9565b820191906000526020600020905b8154815290600101906020018083116115dc57829003601f168201915b5050505050905090565b6000801b81565b61161c611615611b35565b8383612180565b5050565b7f3b652633b3026fa70803ad50b58b0ae884cefe3497643f62c67c466f41a6e88d61164a81611ad6565b60006013600086815260200190815260200160002090508060000160009054906101000a900460ff16156116b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116aa90614f5c565b60405180910390fd5b60006116be866111ec565b9050808260000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550834261170f9190614b91565b8260010181905550611722818688611c8b565b60018260000160006101000a81548160ff021916908315150217905550505050505050565b610d0581565b60006013600083815260200190815260200160002060000160009054906101000a900460ff169050919050565b6000801b61178781611ad6565b60005b838390508110156117ca576117b78484838181106117ab576117aa614bc5565b5b90506020020135611f2d565b80806117c290614bf4565b91505061178a565b50505050565b6117e16117db611b35565b83611bf6565b611820576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118179061497c565b60405180910390fd5b61182c848484846122ec565b50505050565b7f3b652633b3026fa70803ad50b58b0ae884cefe3497643f62c67c466f41a6e88d81565b600063bc197c8160e01b905095945050505050565b60008060006013600085815260200190815260200160002090508060000160009054906101000a900460ff166118d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cd90614fc8565b60405180910390fd5b8060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600101549250925050915091565b606061191582611aea565b600061191f612348565b9050600081511161193f576040518060200160405280600081525061196a565b8061194984612357565b60405160200161195a929190615024565b6040516020818303038152906040525b915050919050565b61197b82610b76565b61198481611ad6565b61198e8383611d8e565b505050565b60146020528060005260406000206000915054906101000a900460ff1681565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600063f23a6e6160e01b905095945050505050565b60007f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611acf5750611ace82612425565b5b9050919050565b611ae781611ae2611b35565b612437565b50565b611af3816124bc565b611b32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2990614df2565b60405180910390fd5b50565b600033905090565b816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611bb0836111ec565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611c02836111ec565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c445750611c4381856119b3565b5b80611c8257508373ffffffffffffffffffffffffffffffffffffffff16611c6a846109ac565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b611c936124fd565b611c9e838383612547565b505050565b6000612710905090565b611cb78282611506565b611d8a5760016002600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611d2f611b35565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611d988282611506565b15611e6c5760006002600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611e11611b35565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b611e78612840565b6000600f60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611ebc611b35565b604051611ec99190613db2565b60405180910390a1565b611edd8282612889565b610d05611ee8610b09565b1115611f29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2090615094565b60405180910390fd5b5050565b611f3681612aa6565b50565b80600d9081611f489190615260565b5050565b60006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b611f916124fd565b6001600f60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611fd5611b35565b604051611fe29190613db2565b60405180910390a1565b611ff4611ca3565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612052576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612049906153a4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036120c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b890615410565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506000808201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036121ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e59061547c565b60405180910390fd5b80600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122df9190613ba9565b60405180910390a3505050565b6122f7848484611c8b565b61230384848484612abb565b612342576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123399061550e565b60405180910390fd5b50505050565b6060612352612c42565b905090565b60606000600161236684612cd4565b01905060008167ffffffffffffffff811115612385576123846140aa565b5b6040519080825280601f01601f1916602001820160405280156123b75781602001600182028036833780820191505090505b509050600082602001820190505b60011561241a578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161240e5761240d614a0d565b5b049450600085036123c5575b819350505050919050565b600061243082612e27565b9050919050565b6124418282611506565b6124b85761244e81612ea1565b61245c8360001c6020612ece565b60405160200161246d9291906155c6565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124af9190613d1e565b60405180910390fd5b5050565b60008073ffffffffffffffffffffffffffffffffffffffff166124de83611f4c565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6125056111d5565b15612545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253c9061564c565b60405180910390fd5b565b8273ffffffffffffffffffffffffffffffffffffffff16612567826111ec565b73ffffffffffffffffffffffffffffffffffffffff16146125bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b4906156de565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361262c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262390615770565b60405180910390fd5b612639838383600161310a565b8273ffffffffffffffffffffffffffffffffffffffff16612659826111ec565b73ffffffffffffffffffffffffffffffffffffffff16146126af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a6906156de565b60405180910390fd5b6007600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461283b8383836001613263565b505050565b6128486111d5565b612887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287e906157dc565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036128f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ef90615848565b60405180910390fd5b612901816124bc565b15612941576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612938906158b4565b60405180910390fd5b61294f60008383600161310a565b612958816124bc565b15612998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298f906158b4565b60405180910390fd5b6001600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612aa2600083836001613263565b5050565b612aaf81613269565b612ab8816133b7565b50565b6000612adc8473ffffffffffffffffffffffffffffffffffffffff16613416565b15612c35578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b05611b35565b8786866040518563ffffffff1660e01b8152600401612b279493929190615929565b6020604051808303816000875af1925050508015612b6357506040513d601f19601f82011682018060405250810190612b60919061598a565b60015b612be5573d8060008114612b93576040519150601f19603f3d011682016040523d82523d6000602084013e612b98565b606091505b506000815103612bdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd49061550e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c3a565b600190505b949350505050565b6060600d8054612c51906147b5565b80601f0160208091040260200160405190810160405280929190818152602001828054612c7d906147b5565b8015612cca5780601f10612c9f57610100808354040283529160200191612cca565b820191906000526020600020905b815481529060010190602001808311612cad57829003601f168201915b5050505050905090565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612d32577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612d2857612d27614a0d565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612d6f576d04ee2d6d415b85acef81000000008381612d6557612d64614a0d565b5b0492506020810190505b662386f26fc100008310612d9e57662386f26fc100008381612d9457612d93614a0d565b5b0492506010810190505b6305f5e1008310612dc7576305f5e1008381612dbd57612dbc614a0d565b5b0492506008810190505b6127108310612dec576127108381612de257612de1614a0d565b5b0492506004810190505b60648310612e0f5760648381612e0557612e04614a0d565b5b0492506002810190505b600a8310612e1e576001810190505b80915050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612e9a5750612e9982613439565b5b9050919050565b6060612ec78273ffffffffffffffffffffffffffffffffffffffff16601460ff16612ece565b9050919050565b606060006002836002612ee191906149cb565b612eeb9190614b91565b67ffffffffffffffff811115612f0457612f036140aa565b5b6040519080825280601f01601f191660200182016040528015612f365781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612f6e57612f6d614bc5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612fd257612fd1614bc5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261301291906149cb565b61301c9190614b91565b90505b60018111156130bc577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061305e5761305d614bc5565b5b1a60f81b82828151811061307557613074614bc5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806130b5906159b7565b905061301f565b5060008414613100576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f790615a2c565b60405180910390fd5b8091505092915050565b6013600083815260200190815260200160002060000160009054906101000a900460ff161561316e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161316590614f5c565b60405180910390fd5b601460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156132125750601460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b613251576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161324890615a98565b60405180910390fd5b61325d8484848461344b565b50505050565b50505050565b6000613274826111ec565b905061328481600084600161310a565b61328d826111ec565b90506007600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506005600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46133b3816000846001613263565b5050565b60016000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a8154906bffffffffffffffffffffffff0219169055505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000613444826135a9565b9050919050565b6134578484848461368b565b600181111561349b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349290615b2a565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036134e2576134dd81613691565b613521565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146135205761351f85826136da565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036135635761355e81613847565b6135a2565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146135a1576135a08482613918565b5b5b5050505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061367457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80613684575061368382613997565b5b9050919050565b50505050565b600b80549050600c600083815260200190815260200160002081905550600b81908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016136e784611272565b6136f19190615b4a565b90506000600a60008481526020019081526020016000205490508181146137d6576000600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000208190555081600a600083815260200190815260200160002081905550505b600a600084815260200190815260200160002060009055600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600b8054905061385b9190615b4a565b90506000600c60008481526020019081526020016000205490506000600b838154811061388b5761388a614bc5565b5b9060005260206000200154905080600b83815481106138ad576138ac614bc5565b5b906000526020600020018190555081600c600083815260200190815260200160002081905550600c600085815260200190815260200160002060009055600b8054806138fc576138fb615b7e565b5b6001900381819060005260206000200160009055905550505050565b600061392383611272565b905081600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000208190555080600a600084815260200190815260200160002081905550505050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613a0a5750613a0982613a11565b5b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613a845750613a8382613a8b565b5b9050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613b3e81613b09565b8114613b4957600080fd5b50565b600081359050613b5b81613b35565b92915050565b600060208284031215613b7757613b76613aff565b5b6000613b8584828501613b4c565b91505092915050565b60008115159050919050565b613ba381613b8e565b82525050565b6000602082019050613bbe6000830184613b9a565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613bef82613bc4565b9050919050565b613bff81613be4565b8114613c0a57600080fd5b50565b600081359050613c1c81613bf6565b92915050565b613c2b81613b8e565b8114613c3657600080fd5b50565b600081359050613c4881613c22565b92915050565b60008060408385031215613c6557613c64613aff565b5b6000613c7385828601613c0d565b9250506020613c8485828601613c39565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613cc8578082015181840152602081019050613cad565b60008484015250505050565b6000601f19601f8301169050919050565b6000613cf082613c8e565b613cfa8185613c99565b9350613d0a818560208601613caa565b613d1381613cd4565b840191505092915050565b60006020820190508181036000830152613d388184613ce5565b905092915050565b6000819050919050565b613d5381613d40565b8114613d5e57600080fd5b50565b600081359050613d7081613d4a565b92915050565b600060208284031215613d8c57613d8b613aff565b5b6000613d9a84828501613d61565b91505092915050565b613dac81613be4565b82525050565b6000602082019050613dc76000830184613da3565b92915050565b60008060408385031215613de457613de3613aff565b5b6000613df285828601613c0d565b9250506020613e0385828601613d61565b9150509250929050565b613e1681613d40565b82525050565b6000602082019050613e316000830184613e0d565b92915050565b600080600060608486031215613e5057613e4f613aff565b5b6000613e5e86828701613c0d565b9350506020613e6f86828701613c0d565b9250506040613e8086828701613d61565b9150509250925092565b6000819050919050565b613e9d81613e8a565b8114613ea857600080fd5b50565b600081359050613eba81613e94565b92915050565b600060208284031215613ed657613ed5613aff565b5b6000613ee484828501613eab565b91505092915050565b613ef681613e8a565b82525050565b6000602082019050613f116000830184613eed565b92915050565b60008060408385031215613f2e57613f2d613aff565b5b6000613f3c85828601613d61565b9250506020613f4d85828601613d61565b9150509250929050565b6000604082019050613f6c6000830185613da3565b613f796020830184613e0d565b9392505050565b60008060408385031215613f9757613f96613aff565b5b6000613fa585828601613eab565b9250506020613fb685828601613c0d565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613ff581613d40565b82525050565b60006140078383613fec565b60208301905092915050565b6000602082019050919050565b600061402b82613fc0565b6140358185613fcb565b935061404083613fdc565b8060005b838110156140715781516140588882613ffb565b975061406383614013565b925050600181019050614044565b5085935050505092915050565b600060208201905081810360008301526140988184614020565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6140e282613cd4565b810181811067ffffffffffffffff82111715614101576141006140aa565b5b80604052505050565b6000614114613af5565b905061412082826140d9565b919050565b600067ffffffffffffffff8211156141405761413f6140aa565b5b61414982613cd4565b9050602081019050919050565b82818337600083830152505050565b600061417861417384614125565b61410a565b905082815260208101848484011115614194576141936140a5565b5b61419f848285614156565b509392505050565b600082601f8301126141bc576141bb6140a0565b5b81356141cc848260208601614165565b91505092915050565b6000602082840312156141eb576141ea613aff565b5b600082013567ffffffffffffffff81111561420957614208613b04565b5b614215848285016141a7565b91505092915050565b60006020828403121561423457614233613aff565b5b600061424284828501613c0d565b91505092915050565b60006bffffffffffffffffffffffff82169050919050565b61426c8161424b565b811461427757600080fd5b50565b60008135905061428981614263565b92915050565b600080604083850312156142a6576142a5613aff565b5b60006142b485828601613c0d565b92505060206142c58582860161427a565b9150509250929050565b6000806000606084860312156142e8576142e7613aff565b5b60006142f686828701613d61565b935050602061430786828701613c0d565b925050604061431886828701613d61565b9150509250925092565b600080fd5b600080fd5b60008083601f840112614342576143416140a0565b5b8235905067ffffffffffffffff81111561435f5761435e614322565b5b60208301915083602082028301111561437b5761437a614327565b5b9250929050565b6000806020838503121561439957614398613aff565b5b600083013567ffffffffffffffff8111156143b7576143b6613b04565b5b6143c38582860161432c565b92509250509250929050565b600067ffffffffffffffff8211156143ea576143e96140aa565b5b6143f382613cd4565b9050602081019050919050565b600061441361440e846143cf565b61410a565b90508281526020810184848401111561442f5761442e6140a5565b5b61443a848285614156565b509392505050565b600082601f830112614457576144566140a0565b5b8135614467848260208601614400565b91505092915050565b6000806000806080858703121561448a57614489613aff565b5b600061449887828801613c0d565b94505060206144a987828801613c0d565b93505060406144ba87828801613d61565b925050606085013567ffffffffffffffff8111156144db576144da613b04565b5b6144e787828801614442565b91505092959194509250565b600067ffffffffffffffff82111561450e5761450d6140aa565b5b602082029050602081019050919050565b600061453261452d846144f3565b61410a565b9050808382526020820190506020840283018581111561455557614554614327565b5b835b8181101561457e578061456a8882613d61565b845260208401935050602081019050614557565b5050509392505050565b600082601f83011261459d5761459c6140a0565b5b81356145ad84826020860161451f565b91505092915050565b600080600080600060a086880312156145d2576145d1613aff565b5b60006145e088828901613c0d565b95505060206145f188828901613c0d565b945050604086013567ffffffffffffffff81111561461257614611613b04565b5b61461e88828901614588565b935050606086013567ffffffffffffffff81111561463f5761463e613b04565b5b61464b88828901614588565b925050608086013567ffffffffffffffff81111561466c5761466b613b04565b5b61467888828901614442565b9150509295509295909350565b61468e81613b09565b82525050565b60006020820190506146a96000830184614685565b92915050565b600080604083850312156146c6576146c5613aff565b5b60006146d485828601613c0d565b92505060206146e585828601613c0d565b9150509250929050565b600080600080600060a0868803121561470b5761470a613aff565b5b600061471988828901613c0d565b955050602061472a88828901613c0d565b945050604061473b88828901613d61565b935050606061474c88828901613d61565b925050608086013567ffffffffffffffff81111561476d5761476c613b04565b5b61477988828901614442565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806147cd57607f821691505b6020821081036147e0576147df614786565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614842602183613c99565b915061484d826147e6565b604082019050919050565b6000602082019050818103600083015261487181614835565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b60006148d4603d83613c99565b91506148df82614878565b604082019050919050565b60006020820190508181036000830152614903816148c7565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000614966602d83613c99565b91506149718261490a565b604082019050919050565b6000602082019050818103600083015261499581614959565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006149d682613d40565b91506149e183613d40565b92508282026149ef81613d40565b91508282048414831517614a0657614a0561499c565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614a4782613d40565b9150614a5283613d40565b925082614a6257614a61614a0d565b5b828204905092915050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614ac9602b83613c99565b9150614ad482614a6d565b604082019050919050565b60006020820190508181036000830152614af881614abc565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000614b5b602f83613c99565b9150614b6682614aff565b604082019050919050565b60006020820190508181036000830152614b8a81614b4e565b9050919050565b6000614b9c82613d40565b9150614ba783613d40565b9250828201905080821115614bbf57614bbe61499c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614bff82613d40565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614c3157614c3061499c565b5b600182019050919050565b7f52656e74206e6f7420696e2070726f67726573732e0000000000000000000000600082015250565b6000614c72601583613c99565b9150614c7d82614c3c565b602082019050919050565b60006020820190508181036000830152614ca181614c65565b9050919050565b7f52656e7420706572696f64206e6f74206f7665722e0000000000000000000000600082015250565b6000614cde601583613c99565b9150614ce982614ca8565b602082019050919050565b60006020820190508181036000830152614d0d81614cd1565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614d70602c83613c99565b9150614d7b82614d14565b604082019050919050565b60006020820190508181036000830152614d9f81614d63565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000614ddc601883613c99565b9150614de782614da6565b602082019050919050565b60006020820190508181036000830152614e0b81614dcf565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000614e6e602983613c99565b9150614e7982614e12565b604082019050919050565b60006020820190508181036000830152614e9d81614e61565b9050919050565b7f4e6f7420756e6465722072656e742e0000000000000000000000000000000000600082015250565b6000614eda600f83613c99565b9150614ee582614ea4565b602082019050919050565b60006020820190508181036000830152614f0981614ecd565b9050919050565b7f43757272656e746c792072656e7465642e000000000000000000000000000000600082015250565b6000614f46601183613c99565b9150614f5182614f10565b602082019050919050565b60006020820190508181036000830152614f7581614f39565b9050919050565b7f4e6f742072656e7465642063757272656e746c792e0000000000000000000000600082015250565b6000614fb2601583613c99565b9150614fbd82614f7c565b602082019050919050565b60006020820190508181036000830152614fe181614fa5565b9050919050565b600081905092915050565b6000614ffe82613c8e565b6150088185614fe8565b9350615018818560208601613caa565b80840191505092915050565b60006150308285614ff3565b915061503c8284614ff3565b91508190509392505050565b7f4d617820737570706c7920726561636865642e00000000000000000000000000600082015250565b600061507e601383613c99565b915061508982615048565b602082019050919050565b600060208201905081810360008301526150ad81615071565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826150d9565b61512086836150d9565b95508019841693508086168417925050509392505050565b6000819050919050565b600061515d61515861515384613d40565b615138565b613d40565b9050919050565b6000819050919050565b61517783615142565b61518b61518382615164565b8484546150e6565b825550505050565b600090565b6151a0615193565b6151ab81848461516e565b505050565b5b818110156151cf576151c4600082615198565b6001810190506151b1565b5050565b601f821115615214576151e5816150b4565b6151ee846150c9565b810160208510156151fd578190505b615211615209856150c9565b8301826151b0565b50505b505050565b600082821c905092915050565b600061523760001984600802615219565b1980831691505092915050565b60006152508383615226565b9150826002028217905092915050565b61526982613c8e565b67ffffffffffffffff811115615282576152816140aa565b5b61528c82546147b5565b6152978282856151d3565b600060209050601f8311600181146152ca57600084156152b8578287015190505b6152c28582615244565b86555061532a565b601f1984166152d8866150b4565b60005b82811015615300578489015182556001820191506020850194506020810190506152db565b8683101561531d5784890151615319601f891682615226565b8355505b6001600288020188555050505b505050505050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600061538e602a83613c99565b915061539982615332565b604082019050919050565b600060208201905081810360008301526153bd81615381565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b60006153fa601983613c99565b9150615405826153c4565b602082019050919050565b60006020820190508181036000830152615429816153ed565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615466601983613c99565b915061547182615430565b602082019050919050565b6000602082019050818103600083015261549581615459565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006154f8603283613c99565b91506155038261549c565b604082019050919050565b60006020820190508181036000830152615527816154eb565b9050919050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000615564601783614fe8565b915061556f8261552e565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b60006155b0601183614fe8565b91506155bb8261557a565b601182019050919050565b60006155d182615557565b91506155dd8285614ff3565b91506155e8826155a3565b91506155f48284614ff3565b91508190509392505050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000615636601083613c99565b915061564182615600565b602082019050919050565b6000602082019050818103600083015261566581615629565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006156c8602583613c99565b91506156d38261566c565b604082019050919050565b600060208201905081810360008301526156f7816156bb565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061575a602483613c99565b9150615765826156fe565b604082019050919050565b600060208201905081810360008301526157898161574d565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006157c6601483613c99565b91506157d182615790565b602082019050919050565b600060208201905081810360008301526157f5816157b9565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615832602083613c99565b915061583d826157fc565b602082019050919050565b6000602082019050818103600083015261586181615825565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061589e601c83613c99565b91506158a982615868565b602082019050919050565b600060208201905081810360008301526158cd81615891565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006158fb826158d4565b61590581856158df565b9350615915818560208601613caa565b61591e81613cd4565b840191505092915050565b600060808201905061593e6000830187613da3565b61594b6020830186613da3565b6159586040830185613e0d565b818103606083015261596a81846158f0565b905095945050505050565b60008151905061598481613b35565b92915050565b6000602082840312156159a05761599f613aff565b5b60006159ae84828501615975565b91505092915050565b60006159c282613d40565b9150600082036159d5576159d461499c565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000615a16602083613c99565b9150615a21826159e0565b602082019050919050565b60006020820190508181036000830152615a4581615a09565b9050919050565b7f426c61636b6c69737465642e0000000000000000000000000000000000000000600082015250565b6000615a82600c83613c99565b9150615a8d82615a4c565b602082019050919050565b60006020820190508181036000830152615ab181615a75565b9050919050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000615b14603583613c99565b9150615b1f82615ab8565b604082019050919050565b60006020820190508181036000830152615b4381615b07565b9050919050565b6000615b5582613d40565b9150615b6083613d40565b9250828203905081811115615b7857615b7761499c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220fbeec9fe1e3fb04b58a5011d5e8cdf4a1f5b32295ffb5ddbd00eb84007cb0b4364736f6c63430008130033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000003568747470733a2f2f6d6376657273656170692e6d6376657273652e6f6e652f6d6574613f636f6c3d7472757826746f6b656e49643d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000c4d4356455253452054525558000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045452555800000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102745760003560e01c806370a0823111610151578063b3916fcf116100c3578063c5430a9d11610087578063c5430a9d14610792578063c87b56dd146107c3578063d547741f146107f3578063dbac26e91461080f578063e985e9c51461083f578063f23a6e611461086f57610274565b8063b3916fcf146106dc578063b80f55c91461070c578063b88d4fde14610728578063b97c9f7714610744578063bc197c811461076257610274565b806391d148541161011557806391d148541461061a57806395d89b411461064a578063a217fddf14610668578063a22cb46514610686578063a53bb990146106a2578063a55bb43b146106be57610274565b806370a08231146105785780638456cb59146105a85780638462151c146105b2578063857529f1146105e25780638f2fc60b146105fe57610274565b806336568abe116101ea57806342966c68116101ae57806342966c68146104a6578063475970d3146104c25780634f6ccce7146104de57806355f804b31461050e5780635c975abb1461052a5780636352211e1461054857610274565b806336568abe146104165780633bd70868146104325780633f4ba83a1461045057806340c10f191461045a57806342842e0e1461048a57610274565b806318160ddd1161023c57806318160ddd1461032f57806323b872dd1461034d578063248a9ca3146103695780632a55205a146103995780632f2ff15d146103ca5780632f745c59146103e657610274565b806301ffc9a71461027957806303d29d28146102a957806306fdde03146102c5578063081812fc146102e3578063095ea7b314610313575b600080fd5b610293600480360381019061028e9190613b61565b61089f565b6040516102a09190613ba9565b60405180910390f35b6102c360048036038101906102be9190613c4e565b6108b1565b005b6102cd61091a565b6040516102da9190613d1e565b60405180910390f35b6102fd60048036038101906102f89190613d76565b6109ac565b60405161030a9190613db2565b60405180910390f35b61032d60048036038101906103289190613dcd565b6109f2565b005b610337610b09565b6040516103449190613e1c565b60405180910390f35b61036760048036038101906103629190613e37565b610b16565b005b610383600480360381019061037e9190613ec0565b610b76565b6040516103909190613efc565b60405180910390f35b6103b360048036038101906103ae9190613f17565b610b96565b6040516103c1929190613f57565b60405180910390f35b6103e460048036038101906103df9190613f80565b610d80565b005b61040060048036038101906103fb9190613dcd565b610da1565b60405161040d9190613e1c565b60405180910390f35b610430600480360381019061042b9190613f80565b610e46565b005b61043a610ec9565b6040516104479190613efc565b60405180910390f35b610458610eed565b005b610474600480360381019061046f9190613dcd565b610f05565b604051610481919061407e565b60405180910390f35b6104a4600480360381019061049f9190613e37565b610fde565b005b6104c060048036038101906104bb9190613d76565b610ffe565b005b6104dc60048036038101906104d79190613d76565b611018565b005b6104f860048036038101906104f39190613d76565b61114a565b6040516105059190613e1c565b60405180910390f35b610528600480360381019061052391906141d5565b6111bb565b005b6105326111d5565b60405161053f9190613ba9565b60405180910390f35b610562600480360381019061055d9190613d76565b6111ec565b60405161056f9190613db2565b60405180910390f35b610592600480360381019061058d919061421e565b611272565b60405161059f9190613e1c565b60405180910390f35b6105b0611329565b005b6105cc60048036038101906105c7919061421e565b611341565b6040516105d9919061407e565b60405180910390f35b6105fc60048036038101906105f79190613d76565b61144a565b005b6106186004803603810190610613919061428f565b6114ea565b005b610634600480360381019061062f9190613f80565b611506565b6040516106419190613ba9565b60405180910390f35b610652611571565b60405161065f9190613d1e565b60405180910390f35b610670611603565b60405161067d9190613efc565b60405180910390f35b6106a0600480360381019061069b9190613c4e565b61160a565b005b6106bc60048036038101906106b791906142cf565b611620565b005b6106c6611747565b6040516106d39190613e1c565b60405180910390f35b6106f660048036038101906106f19190613d76565b61174d565b6040516107039190613ba9565b60405180910390f35b61072660048036038101906107219190614382565b61177a565b005b610742600480360381019061073d9190614470565b6117d0565b005b61074c611832565b6040516107599190613efc565b60405180910390f35b61077c600480360381019061077791906145b6565b611856565b6040516107899190614694565b60405180910390f35b6107ac60048036038101906107a79190613d76565b61186b565b6040516107ba929190613f57565b60405180910390f35b6107dd60048036038101906107d89190613d76565b61190a565b6040516107ea9190613d1e565b60405180910390f35b61080d60048036038101906108089190613f80565b611972565b005b6108296004803603810190610824919061421e565b611993565b6040516108369190613ba9565b60405180910390f35b610859600480360381019061085491906146af565b6119b3565b6040516108669190613ba9565b60405180910390f35b610889600480360381019061088491906146ef565b611a47565b6040516108969190614694565b60405180910390f35b60006108aa82611a5c565b9050919050565b6000801b6108be81611ad6565b81601460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b606060038054610929906147b5565b80601f0160208091040260200160405190810160405280929190818152602001828054610955906147b5565b80156109a25780601f10610977576101008083540402835291602001916109a2565b820191906000526020600020905b81548152906001019060200180831161098557829003601f168201915b5050505050905090565b60006109b782611aea565b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109fd826111ec565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6490614858565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a8c611b35565b73ffffffffffffffffffffffffffffffffffffffff161480610abb5750610aba81610ab5611b35565b6119b3565b5b610afa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af1906148ea565b60405180910390fd5b610b048383611b3d565b505050565b6000600b80549050905090565b610b27610b21611b35565b82611bf6565b610b66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5d9061497c565b60405180910390fd5b610b71838383611c8b565b505050565b600060026000838152602001908152602001600020600101549050919050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610d2b5760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610d35611ca3565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610d6191906149cb565b610d6b9190614a3c565b90508160000151819350935050509250929050565b610d8982610b76565b610d9281611ad6565b610d9c8383611cad565b505050565b6000610dac83611272565b8210610ded576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de490614adf565b60405180910390fd5b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e4e611b35565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ebb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb290614b71565b60405180910390fd5b610ec58282611d8e565b5050565b7fb379d9535b5ae7800ada8f473bd7d55f753e8023b1ed709eab5f121d2b9807be81565b6000801b610efa81611ad6565b610f02611e70565b50565b60606000801b610f1481611ad6565b8267ffffffffffffffff811115610f2e57610f2d6140aa565b5b604051908082528060200260200182016040528015610f5c5781602001602082028036833780820191505090505b5091506000600e54905083600e6000828254610f789190614b91565b9250508190555060005b84811015610fd557610f948683611ed3565b81848281518110610fa857610fa7614bc5565b5b6020026020010181815250508180610fbf90614bf4565b9250508080610fcd90614bf4565b915050610f82565b50505092915050565b610ff9838383604051806020016040528060008152506117d0565b505050565b6000801b61100b81611ad6565b61101482611f2d565b5050565b7f3b652633b3026fa70803ad50b58b0ae884cefe3497643f62c67c466f41a6e88d61104281611ad6565b60006013600084815260200190815260200160002090508060000160009054906101000a900460ff166110aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a190614c88565b60405180910390fd5b80600101544210156110f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e890614cf4565b60405180910390fd5b60008160000160006101000a81548160ff02191690831515021790555061114561111a846111ec565b8260000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685611c8b565b505050565b6000611154610b09565b8210611195576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118c90614d86565b60405180910390fd5b600b82815481106111a9576111a8614bc5565b5b90600052602060002001549050919050565b6000801b6111c881611ad6565b6111d182611f39565b5050565b6000600f60009054906101000a900460ff16905090565b6000806111f883611f4c565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611269576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126090614df2565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036112e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d990614e84565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000801b61133681611ad6565b61133e611f89565b50565b6060600061134e83611272565b9050600081036113aa57600067ffffffffffffffff811115611373576113726140aa565b5b6040519080825280602002602001820160405280156113a15781602001602082028036833780820191505090505b50915050611445565b60008167ffffffffffffffff8111156113c6576113c56140aa565b5b6040519080825280602002602001820160405280156113f45781602001602082028036833780820191505090505b50905060005b8281101561143e5761140c8582610da1565b82828151811061141f5761141e614bc5565b5b602002602001018181525050808061143690614bf4565b9150506113fa565b8193505050505b919050565b7f3b652633b3026fa70803ad50b58b0ae884cefe3497643f62c67c466f41a6e88d61147481611ad6565b60006013600084815260200190815260200160002090508060000160009054906101000a900460ff166114dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d390614ef0565b60405180910390fd5b428160010181905550505050565b6000801b6114f781611ad6565b6115018383611fec565b505050565b60006002600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060048054611580906147b5565b80601f01602080910402602001604051908101604052809291908181526020018280546115ac906147b5565b80156115f95780601f106115ce576101008083540402835291602001916115f9565b820191906000526020600020905b8154815290600101906020018083116115dc57829003601f168201915b5050505050905090565b6000801b81565b61161c611615611b35565b8383612180565b5050565b7f3b652633b3026fa70803ad50b58b0ae884cefe3497643f62c67c466f41a6e88d61164a81611ad6565b60006013600086815260200190815260200160002090508060000160009054906101000a900460ff16156116b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116aa90614f5c565b60405180910390fd5b60006116be866111ec565b9050808260000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550834261170f9190614b91565b8260010181905550611722818688611c8b565b60018260000160006101000a81548160ff021916908315150217905550505050505050565b610d0581565b60006013600083815260200190815260200160002060000160009054906101000a900460ff169050919050565b6000801b61178781611ad6565b60005b838390508110156117ca576117b78484838181106117ab576117aa614bc5565b5b90506020020135611f2d565b80806117c290614bf4565b91505061178a565b50505050565b6117e16117db611b35565b83611bf6565b611820576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118179061497c565b60405180910390fd5b61182c848484846122ec565b50505050565b7f3b652633b3026fa70803ad50b58b0ae884cefe3497643f62c67c466f41a6e88d81565b600063bc197c8160e01b905095945050505050565b60008060006013600085815260200190815260200160002090508060000160009054906101000a900460ff166118d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cd90614fc8565b60405180910390fd5b8060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600101549250925050915091565b606061191582611aea565b600061191f612348565b9050600081511161193f576040518060200160405280600081525061196a565b8061194984612357565b60405160200161195a929190615024565b6040516020818303038152906040525b915050919050565b61197b82610b76565b61198481611ad6565b61198e8383611d8e565b505050565b60146020528060005260406000206000915054906101000a900460ff1681565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600063f23a6e6160e01b905095945050505050565b60007f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611acf5750611ace82612425565b5b9050919050565b611ae781611ae2611b35565b612437565b50565b611af3816124bc565b611b32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2990614df2565b60405180910390fd5b50565b600033905090565b816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611bb0836111ec565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611c02836111ec565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c445750611c4381856119b3565b5b80611c8257508373ffffffffffffffffffffffffffffffffffffffff16611c6a846109ac565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b611c936124fd565b611c9e838383612547565b505050565b6000612710905090565b611cb78282611506565b611d8a5760016002600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611d2f611b35565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611d988282611506565b15611e6c5760006002600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611e11611b35565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b611e78612840565b6000600f60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611ebc611b35565b604051611ec99190613db2565b60405180910390a1565b611edd8282612889565b610d05611ee8610b09565b1115611f29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2090615094565b60405180910390fd5b5050565b611f3681612aa6565b50565b80600d9081611f489190615260565b5050565b60006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b611f916124fd565b6001600f60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611fd5611b35565b604051611fe29190613db2565b60405180910390a1565b611ff4611ca3565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612052576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612049906153a4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036120c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b890615410565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506000808201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036121ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e59061547c565b60405180910390fd5b80600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122df9190613ba9565b60405180910390a3505050565b6122f7848484611c8b565b61230384848484612abb565b612342576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123399061550e565b60405180910390fd5b50505050565b6060612352612c42565b905090565b60606000600161236684612cd4565b01905060008167ffffffffffffffff811115612385576123846140aa565b5b6040519080825280601f01601f1916602001820160405280156123b75781602001600182028036833780820191505090505b509050600082602001820190505b60011561241a578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161240e5761240d614a0d565b5b049450600085036123c5575b819350505050919050565b600061243082612e27565b9050919050565b6124418282611506565b6124b85761244e81612ea1565b61245c8360001c6020612ece565b60405160200161246d9291906155c6565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124af9190613d1e565b60405180910390fd5b5050565b60008073ffffffffffffffffffffffffffffffffffffffff166124de83611f4c565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6125056111d5565b15612545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253c9061564c565b60405180910390fd5b565b8273ffffffffffffffffffffffffffffffffffffffff16612567826111ec565b73ffffffffffffffffffffffffffffffffffffffff16146125bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b4906156de565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361262c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262390615770565b60405180910390fd5b612639838383600161310a565b8273ffffffffffffffffffffffffffffffffffffffff16612659826111ec565b73ffffffffffffffffffffffffffffffffffffffff16146126af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a6906156de565b60405180910390fd5b6007600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461283b8383836001613263565b505050565b6128486111d5565b612887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287e906157dc565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036128f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ef90615848565b60405180910390fd5b612901816124bc565b15612941576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612938906158b4565b60405180910390fd5b61294f60008383600161310a565b612958816124bc565b15612998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298f906158b4565b60405180910390fd5b6001600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612aa2600083836001613263565b5050565b612aaf81613269565b612ab8816133b7565b50565b6000612adc8473ffffffffffffffffffffffffffffffffffffffff16613416565b15612c35578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b05611b35565b8786866040518563ffffffff1660e01b8152600401612b279493929190615929565b6020604051808303816000875af1925050508015612b6357506040513d601f19601f82011682018060405250810190612b60919061598a565b60015b612be5573d8060008114612b93576040519150601f19603f3d011682016040523d82523d6000602084013e612b98565b606091505b506000815103612bdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd49061550e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c3a565b600190505b949350505050565b6060600d8054612c51906147b5565b80601f0160208091040260200160405190810160405280929190818152602001828054612c7d906147b5565b8015612cca5780601f10612c9f57610100808354040283529160200191612cca565b820191906000526020600020905b815481529060010190602001808311612cad57829003601f168201915b5050505050905090565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612d32577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612d2857612d27614a0d565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612d6f576d04ee2d6d415b85acef81000000008381612d6557612d64614a0d565b5b0492506020810190505b662386f26fc100008310612d9e57662386f26fc100008381612d9457612d93614a0d565b5b0492506010810190505b6305f5e1008310612dc7576305f5e1008381612dbd57612dbc614a0d565b5b0492506008810190505b6127108310612dec576127108381612de257612de1614a0d565b5b0492506004810190505b60648310612e0f5760648381612e0557612e04614a0d565b5b0492506002810190505b600a8310612e1e576001810190505b80915050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612e9a5750612e9982613439565b5b9050919050565b6060612ec78273ffffffffffffffffffffffffffffffffffffffff16601460ff16612ece565b9050919050565b606060006002836002612ee191906149cb565b612eeb9190614b91565b67ffffffffffffffff811115612f0457612f036140aa565b5b6040519080825280601f01601f191660200182016040528015612f365781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612f6e57612f6d614bc5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612fd257612fd1614bc5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261301291906149cb565b61301c9190614b91565b90505b60018111156130bc577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061305e5761305d614bc5565b5b1a60f81b82828151811061307557613074614bc5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806130b5906159b7565b905061301f565b5060008414613100576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f790615a2c565b60405180910390fd5b8091505092915050565b6013600083815260200190815260200160002060000160009054906101000a900460ff161561316e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161316590614f5c565b60405180910390fd5b601460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156132125750601460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b613251576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161324890615a98565b60405180910390fd5b61325d8484848461344b565b50505050565b50505050565b6000613274826111ec565b905061328481600084600161310a565b61328d826111ec565b90506007600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506005600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46133b3816000846001613263565b5050565b60016000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a8154906bffffffffffffffffffffffff0219169055505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000613444826135a9565b9050919050565b6134578484848461368b565b600181111561349b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349290615b2a565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036134e2576134dd81613691565b613521565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146135205761351f85826136da565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036135635761355e81613847565b6135a2565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146135a1576135a08482613918565b5b5b5050505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061367457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80613684575061368382613997565b5b9050919050565b50505050565b600b80549050600c600083815260200190815260200160002081905550600b81908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016136e784611272565b6136f19190615b4a565b90506000600a60008481526020019081526020016000205490508181146137d6576000600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000208190555081600a600083815260200190815260200160002081905550505b600a600084815260200190815260200160002060009055600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600b8054905061385b9190615b4a565b90506000600c60008481526020019081526020016000205490506000600b838154811061388b5761388a614bc5565b5b9060005260206000200154905080600b83815481106138ad576138ac614bc5565b5b906000526020600020018190555081600c600083815260200190815260200160002081905550600c600085815260200190815260200160002060009055600b8054806138fc576138fb615b7e565b5b6001900381819060005260206000200160009055905550505050565b600061392383611272565b905081600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000208190555080600a600084815260200190815260200160002081905550505050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613a0a5750613a0982613a11565b5b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613a845750613a8382613a8b565b5b9050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613b3e81613b09565b8114613b4957600080fd5b50565b600081359050613b5b81613b35565b92915050565b600060208284031215613b7757613b76613aff565b5b6000613b8584828501613b4c565b91505092915050565b60008115159050919050565b613ba381613b8e565b82525050565b6000602082019050613bbe6000830184613b9a565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613bef82613bc4565b9050919050565b613bff81613be4565b8114613c0a57600080fd5b50565b600081359050613c1c81613bf6565b92915050565b613c2b81613b8e565b8114613c3657600080fd5b50565b600081359050613c4881613c22565b92915050565b60008060408385031215613c6557613c64613aff565b5b6000613c7385828601613c0d565b9250506020613c8485828601613c39565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613cc8578082015181840152602081019050613cad565b60008484015250505050565b6000601f19601f8301169050919050565b6000613cf082613c8e565b613cfa8185613c99565b9350613d0a818560208601613caa565b613d1381613cd4565b840191505092915050565b60006020820190508181036000830152613d388184613ce5565b905092915050565b6000819050919050565b613d5381613d40565b8114613d5e57600080fd5b50565b600081359050613d7081613d4a565b92915050565b600060208284031215613d8c57613d8b613aff565b5b6000613d9a84828501613d61565b91505092915050565b613dac81613be4565b82525050565b6000602082019050613dc76000830184613da3565b92915050565b60008060408385031215613de457613de3613aff565b5b6000613df285828601613c0d565b9250506020613e0385828601613d61565b9150509250929050565b613e1681613d40565b82525050565b6000602082019050613e316000830184613e0d565b92915050565b600080600060608486031215613e5057613e4f613aff565b5b6000613e5e86828701613c0d565b9350506020613e6f86828701613c0d565b9250506040613e8086828701613d61565b9150509250925092565b6000819050919050565b613e9d81613e8a565b8114613ea857600080fd5b50565b600081359050613eba81613e94565b92915050565b600060208284031215613ed657613ed5613aff565b5b6000613ee484828501613eab565b91505092915050565b613ef681613e8a565b82525050565b6000602082019050613f116000830184613eed565b92915050565b60008060408385031215613f2e57613f2d613aff565b5b6000613f3c85828601613d61565b9250506020613f4d85828601613d61565b9150509250929050565b6000604082019050613f6c6000830185613da3565b613f796020830184613e0d565b9392505050565b60008060408385031215613f9757613f96613aff565b5b6000613fa585828601613eab565b9250506020613fb685828601613c0d565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613ff581613d40565b82525050565b60006140078383613fec565b60208301905092915050565b6000602082019050919050565b600061402b82613fc0565b6140358185613fcb565b935061404083613fdc565b8060005b838110156140715781516140588882613ffb565b975061406383614013565b925050600181019050614044565b5085935050505092915050565b600060208201905081810360008301526140988184614020565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6140e282613cd4565b810181811067ffffffffffffffff82111715614101576141006140aa565b5b80604052505050565b6000614114613af5565b905061412082826140d9565b919050565b600067ffffffffffffffff8211156141405761413f6140aa565b5b61414982613cd4565b9050602081019050919050565b82818337600083830152505050565b600061417861417384614125565b61410a565b905082815260208101848484011115614194576141936140a5565b5b61419f848285614156565b509392505050565b600082601f8301126141bc576141bb6140a0565b5b81356141cc848260208601614165565b91505092915050565b6000602082840312156141eb576141ea613aff565b5b600082013567ffffffffffffffff81111561420957614208613b04565b5b614215848285016141a7565b91505092915050565b60006020828403121561423457614233613aff565b5b600061424284828501613c0d565b91505092915050565b60006bffffffffffffffffffffffff82169050919050565b61426c8161424b565b811461427757600080fd5b50565b60008135905061428981614263565b92915050565b600080604083850312156142a6576142a5613aff565b5b60006142b485828601613c0d565b92505060206142c58582860161427a565b9150509250929050565b6000806000606084860312156142e8576142e7613aff565b5b60006142f686828701613d61565b935050602061430786828701613c0d565b925050604061431886828701613d61565b9150509250925092565b600080fd5b600080fd5b60008083601f840112614342576143416140a0565b5b8235905067ffffffffffffffff81111561435f5761435e614322565b5b60208301915083602082028301111561437b5761437a614327565b5b9250929050565b6000806020838503121561439957614398613aff565b5b600083013567ffffffffffffffff8111156143b7576143b6613b04565b5b6143c38582860161432c565b92509250509250929050565b600067ffffffffffffffff8211156143ea576143e96140aa565b5b6143f382613cd4565b9050602081019050919050565b600061441361440e846143cf565b61410a565b90508281526020810184848401111561442f5761442e6140a5565b5b61443a848285614156565b509392505050565b600082601f830112614457576144566140a0565b5b8135614467848260208601614400565b91505092915050565b6000806000806080858703121561448a57614489613aff565b5b600061449887828801613c0d565b94505060206144a987828801613c0d565b93505060406144ba87828801613d61565b925050606085013567ffffffffffffffff8111156144db576144da613b04565b5b6144e787828801614442565b91505092959194509250565b600067ffffffffffffffff82111561450e5761450d6140aa565b5b602082029050602081019050919050565b600061453261452d846144f3565b61410a565b9050808382526020820190506020840283018581111561455557614554614327565b5b835b8181101561457e578061456a8882613d61565b845260208401935050602081019050614557565b5050509392505050565b600082601f83011261459d5761459c6140a0565b5b81356145ad84826020860161451f565b91505092915050565b600080600080600060a086880312156145d2576145d1613aff565b5b60006145e088828901613c0d565b95505060206145f188828901613c0d565b945050604086013567ffffffffffffffff81111561461257614611613b04565b5b61461e88828901614588565b935050606086013567ffffffffffffffff81111561463f5761463e613b04565b5b61464b88828901614588565b925050608086013567ffffffffffffffff81111561466c5761466b613b04565b5b61467888828901614442565b9150509295509295909350565b61468e81613b09565b82525050565b60006020820190506146a96000830184614685565b92915050565b600080604083850312156146c6576146c5613aff565b5b60006146d485828601613c0d565b92505060206146e585828601613c0d565b9150509250929050565b600080600080600060a0868803121561470b5761470a613aff565b5b600061471988828901613c0d565b955050602061472a88828901613c0d565b945050604061473b88828901613d61565b935050606061474c88828901613d61565b925050608086013567ffffffffffffffff81111561476d5761476c613b04565b5b61477988828901614442565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806147cd57607f821691505b6020821081036147e0576147df614786565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614842602183613c99565b915061484d826147e6565b604082019050919050565b6000602082019050818103600083015261487181614835565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b60006148d4603d83613c99565b91506148df82614878565b604082019050919050565b60006020820190508181036000830152614903816148c7565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000614966602d83613c99565b91506149718261490a565b604082019050919050565b6000602082019050818103600083015261499581614959565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006149d682613d40565b91506149e183613d40565b92508282026149ef81613d40565b91508282048414831517614a0657614a0561499c565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614a4782613d40565b9150614a5283613d40565b925082614a6257614a61614a0d565b5b828204905092915050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614ac9602b83613c99565b9150614ad482614a6d565b604082019050919050565b60006020820190508181036000830152614af881614abc565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000614b5b602f83613c99565b9150614b6682614aff565b604082019050919050565b60006020820190508181036000830152614b8a81614b4e565b9050919050565b6000614b9c82613d40565b9150614ba783613d40565b9250828201905080821115614bbf57614bbe61499c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614bff82613d40565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614c3157614c3061499c565b5b600182019050919050565b7f52656e74206e6f7420696e2070726f67726573732e0000000000000000000000600082015250565b6000614c72601583613c99565b9150614c7d82614c3c565b602082019050919050565b60006020820190508181036000830152614ca181614c65565b9050919050565b7f52656e7420706572696f64206e6f74206f7665722e0000000000000000000000600082015250565b6000614cde601583613c99565b9150614ce982614ca8565b602082019050919050565b60006020820190508181036000830152614d0d81614cd1565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614d70602c83613c99565b9150614d7b82614d14565b604082019050919050565b60006020820190508181036000830152614d9f81614d63565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000614ddc601883613c99565b9150614de782614da6565b602082019050919050565b60006020820190508181036000830152614e0b81614dcf565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000614e6e602983613c99565b9150614e7982614e12565b604082019050919050565b60006020820190508181036000830152614e9d81614e61565b9050919050565b7f4e6f7420756e6465722072656e742e0000000000000000000000000000000000600082015250565b6000614eda600f83613c99565b9150614ee582614ea4565b602082019050919050565b60006020820190508181036000830152614f0981614ecd565b9050919050565b7f43757272656e746c792072656e7465642e000000000000000000000000000000600082015250565b6000614f46601183613c99565b9150614f5182614f10565b602082019050919050565b60006020820190508181036000830152614f7581614f39565b9050919050565b7f4e6f742072656e7465642063757272656e746c792e0000000000000000000000600082015250565b6000614fb2601583613c99565b9150614fbd82614f7c565b602082019050919050565b60006020820190508181036000830152614fe181614fa5565b9050919050565b600081905092915050565b6000614ffe82613c8e565b6150088185614fe8565b9350615018818560208601613caa565b80840191505092915050565b60006150308285614ff3565b915061503c8284614ff3565b91508190509392505050565b7f4d617820737570706c7920726561636865642e00000000000000000000000000600082015250565b600061507e601383613c99565b915061508982615048565b602082019050919050565b600060208201905081810360008301526150ad81615071565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826150d9565b61512086836150d9565b95508019841693508086168417925050509392505050565b6000819050919050565b600061515d61515861515384613d40565b615138565b613d40565b9050919050565b6000819050919050565b61517783615142565b61518b61518382615164565b8484546150e6565b825550505050565b600090565b6151a0615193565b6151ab81848461516e565b505050565b5b818110156151cf576151c4600082615198565b6001810190506151b1565b5050565b601f821115615214576151e5816150b4565b6151ee846150c9565b810160208510156151fd578190505b615211615209856150c9565b8301826151b0565b50505b505050565b600082821c905092915050565b600061523760001984600802615219565b1980831691505092915050565b60006152508383615226565b9150826002028217905092915050565b61526982613c8e565b67ffffffffffffffff811115615282576152816140aa565b5b61528c82546147b5565b6152978282856151d3565b600060209050601f8311600181146152ca57600084156152b8578287015190505b6152c28582615244565b86555061532a565b601f1984166152d8866150b4565b60005b82811015615300578489015182556001820191506020850194506020810190506152db565b8683101561531d5784890151615319601f891682615226565b8355505b6001600288020188555050505b505050505050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600061538e602a83613c99565b915061539982615332565b604082019050919050565b600060208201905081810360008301526153bd81615381565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b60006153fa601983613c99565b9150615405826153c4565b602082019050919050565b60006020820190508181036000830152615429816153ed565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615466601983613c99565b915061547182615430565b602082019050919050565b6000602082019050818103600083015261549581615459565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006154f8603283613c99565b91506155038261549c565b604082019050919050565b60006020820190508181036000830152615527816154eb565b9050919050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000615564601783614fe8565b915061556f8261552e565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b60006155b0601183614fe8565b91506155bb8261557a565b601182019050919050565b60006155d182615557565b91506155dd8285614ff3565b91506155e8826155a3565b91506155f48284614ff3565b91508190509392505050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000615636601083613c99565b915061564182615600565b602082019050919050565b6000602082019050818103600083015261566581615629565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006156c8602583613c99565b91506156d38261566c565b604082019050919050565b600060208201905081810360008301526156f7816156bb565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061575a602483613c99565b9150615765826156fe565b604082019050919050565b600060208201905081810360008301526157898161574d565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006157c6601483613c99565b91506157d182615790565b602082019050919050565b600060208201905081810360008301526157f5816157b9565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615832602083613c99565b915061583d826157fc565b602082019050919050565b6000602082019050818103600083015261586181615825565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061589e601c83613c99565b91506158a982615868565b602082019050919050565b600060208201905081810360008301526158cd81615891565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006158fb826158d4565b61590581856158df565b9350615915818560208601613caa565b61591e81613cd4565b840191505092915050565b600060808201905061593e6000830187613da3565b61594b6020830186613da3565b6159586040830185613e0d565b818103606083015261596a81846158f0565b905095945050505050565b60008151905061598481613b35565b92915050565b6000602082840312156159a05761599f613aff565b5b60006159ae84828501615975565b91505092915050565b60006159c282613d40565b9150600082036159d5576159d461499c565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000615a16602083613c99565b9150615a21826159e0565b602082019050919050565b60006020820190508181036000830152615a4581615a09565b9050919050565b7f426c61636b6c69737465642e0000000000000000000000000000000000000000600082015250565b6000615a82600c83613c99565b9150615a8d82615a4c565b602082019050919050565b60006020820190508181036000830152615ab181615a75565b9050919050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000615b14603583613c99565b9150615b1f82615ab8565b604082019050919050565b60006020820190508181036000830152615b4381615b07565b9050919050565b6000615b5582613d40565b9150615b6083613d40565b9250828203905081811115615b7857615b7761499c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220fbeec9fe1e3fb04b58a5011d5e8cdf4a1f5b32295ffb5ddbd00eb84007cb0b4364736f6c63430008130033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000003568747470733a2f2f6d6376657273656170692e6d6376657273652e6f6e652f6d6574613f636f6c3d7472757826746f6b656e49643d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000c4d4356455253452054525558000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045452555800000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : uri (string): https://mcverseapi.mcverse.one/meta?col=trux&tokenId=
Arg [1] : name (string): MCVERSE TRUX
Arg [2] : symbol (string): TRUX

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [4] : 68747470733a2f2f6d6376657273656170692e6d6376657273652e6f6e652f6d
Arg [5] : 6574613f636f6c3d7472757826746f6b656e49643d0000000000000000000000
Arg [6] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [7] : 4d43564552534520545255580000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [9] : 5452555800000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

99977:472:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;99483:240;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;96512:138;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67700:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69212:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68730:416;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85481:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69912:301;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28399:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37617:438;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;28840:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85149:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29984:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;96024:66;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;98666:84;;;:::i;:::-;;93006:380;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70284:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;93582:99;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;98219:349;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85671:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93689:120;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34924:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67410:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67141:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;98578:80;;;:::i;:::-;;96658:540;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;97620:213;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;96346:158;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26872:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67869:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25977:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69455:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;97221:391;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100055:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;97841:115;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93394:180;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70506:279;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;95955:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48332:255;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;97964:247;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;68044:281;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29280:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;96254:43;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69681:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48097:227;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99483:240;99650:4;99679:36;99703:11;99679:23;:36::i;:::-;99672:43;;99483:240;;;:::o;96512:138::-;26022:4;96585:18;;26468:16;26479:4;26468:10;:16::i;:::-;96636:6:::1;96616:11;:17;96628:4;96616:17;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;96512:138:::0;;;:::o;67700:100::-;67754:13;67787:5;67780:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67700:100;:::o;69212:171::-;69288:7;69308:23;69323:7;69308:14;:23::i;:::-;69351:15;:24;69367:7;69351:24;;;;;;;;;;;;;;;;;;;;;69344:31;;69212:171;;;:::o;68730:416::-;68811:13;68827:23;68842:7;68827:14;:23::i;:::-;68811:39;;68875:5;68869:11;;:2;:11;;;68861:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;68969:5;68953:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;68978:37;68995:5;69002:12;:10;:12::i;:::-;68978:16;:37::i;:::-;68953:62;68931:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;69117:21;69126:2;69130:7;69117:8;:21::i;:::-;68800:346;68730:416;;:::o;85481:113::-;85542:7;85569:10;:17;;;;85562:24;;85481:113;:::o;69912:301::-;70073:41;70092:12;:10;:12::i;:::-;70106:7;70073:18;:41::i;:::-;70065:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;70177:28;70187:4;70193:2;70197:7;70177:9;:28::i;:::-;69912:301;;;:::o;28399:131::-;28473:7;28500:6;:12;28507:4;28500:12;;;;;;;;;;;:22;;;28493:29;;28399:131;;;:::o;37617:438::-;37712:7;37721;37741:26;37770:17;:26;37788:7;37770:26;;;;;;;;;;;37741:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37841:1;37813:30;;:7;:16;;;:30;;;37809:92;;37870:19;37860:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37809:92;37913:21;37977:17;:15;:17::i;:::-;37937:57;;37950:7;:23;;;37938:35;;:9;:35;;;;:::i;:::-;37937:57;;;;:::i;:::-;37913:81;;38015:7;:16;;;38033:13;38007:40;;;;;;37617:438;;;;;:::o;28840:147::-;28923:18;28936:4;28923:12;:18::i;:::-;26468:16;26479:4;26468:10;:16::i;:::-;28954:25:::1;28965:4;28971:7;28954:10;:25::i;:::-;28840:147:::0;;;:::o;85149:256::-;85246:7;85282:23;85299:5;85282:16;:23::i;:::-;85274:5;:31;85266:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;85371:12;:19;85384:5;85371:19;;;;;;;;;;;;;;;:26;85391:5;85371:26;;;;;;;;;;;;85364:33;;85149:256;;;;:::o;29984:218::-;30091:12;:10;:12::i;:::-;30080:23;;:7;:23;;;30072:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;30168:26;30180:4;30186:7;30168:11;:26::i;:::-;29984:218;;:::o;96024:66::-;96064:26;96024:66;:::o;98666:84::-;26022:4;98701:18;;26468:16;26479:4;26468:10;:16::i;:::-;98732:10:::1;:8;:10::i;:::-;98666:84:::0;:::o;93006:380::-;93093:22;26022:4;93065:18;;26468:16;26479:4;26468:10;:16::i;:::-;93149:8:::1;93138:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;93127:31;;93169:12;93184;;93169:27;;93223:8;93207:12;;:24;;;;;;;:::i;:::-;;;;;;;;93246:6;93242:137;93258:8;93254:1;:12;93242:137;;;93288:18;93294:2;93298:7;93288:5;:18::i;:::-;93335:7;93321:8;93330:1;93321:11;;;;;;;;:::i;:::-;;;;;;;:21;;;::::0;::::1;93357:10;;;;;:::i;:::-;;;;93268:4;;;;;:::i;:::-;;;;93242:137;;;;93116:270;93006:380:::0;;;;;:::o;70284:151::-;70388:39;70405:4;70411:2;70415:7;70388:39;;;;;;;;;;;;:16;:39::i;:::-;70284:151;;;:::o;93582:99::-;26022:4;93628:18;;26468:16;26479:4;26468:10;:16::i;:::-;93659:14:::1;93665:7;93659:5;:14::i;:::-;93582:99:::0;;:::o;98219:349::-;95993:24;26468:16;26479:4;26468:10;:16::i;:::-;98297:17:::1;98317:6;:15;98324:7;98317:15;;;;;;;;;;;98297:35;;98351:4;:15;;;;;;;;;;;;98343:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;98430:4;:11;;;98411:15;:30;;98403:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;98496:5;98478:4;:15;;;:23;;;;;;;;;;;;;;;;;;98512:48;98522:16;98530:7;98522;:16::i;:::-;98540:4;:10;;;;;;;;;;;;98552:7;98512:9;:48::i;:::-;98286:282;98219:349:::0;;:::o;85671:233::-;85746:7;85782:30;:28;:30::i;:::-;85774:5;:38;85766:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;85879:10;85890:5;85879:17;;;;;;;;:::i;:::-;;;;;;;;;;85872:24;;85671:233;;;:::o;93689:120::-;26022:4;93750:18;;26468:16;26479:4;26468:10;:16::i;:::-;93781:20:::1;93793:7;93781:11;:20::i;:::-;93689:120:::0;;:::o;34924:86::-;34971:4;34995:7;;;;;;;;;;;34988:14;;34924:86;:::o;67410:223::-;67482:7;67502:13;67518:17;67527:7;67518:8;:17::i;:::-;67502:33;;67571:1;67554:19;;:5;:19;;;67546:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;67620:5;67613:12;;;67410:223;;;:::o;67141:207::-;67213:7;67258:1;67241:19;;:5;:19;;;67233:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;67324:9;:16;67334:5;67324:16;;;;;;;;;;;;;;;;67317:23;;67141:207;;;:::o;98578:80::-;26022:4;98611:18;;26468:16;26479:4;26468:10;:16::i;:::-;98642:8:::1;:6;:8::i;:::-;98578:80:::0;:::o;96658:540::-;96720:16;96749:18;96770:17;96780:6;96770:9;:17::i;:::-;96749:38;;96816:1;96802:10;:15;96798:393;;96893:1;96879:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96872:23;;;;;96798:393;96928:23;96968:10;96954:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96928:51;;96994:13;97022:130;97046:10;97038:5;:18;97022:130;;;97102:34;97122:6;97130:5;97102:19;:34::i;:::-;97086:6;97093:5;97086:13;;;;;;;;:::i;:::-;;;;;;;:50;;;;;97058:7;;;;;:::i;:::-;;;;97022:130;;;97173:6;97166:13;;;;;96658:540;;;;:::o;97620:213::-;95993:24;26468:16;26479:4;26468:10;:16::i;:::-;97696:17:::1;97716:6;:15;97723:7;97716:15;;;;;;;;;;;97696:35;;97750:4;:15;;;;;;;;;;;;97742:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;97810:15;97796:4;:11;;:29;;;;97685:148;97620:213:::0;;:::o;96346:158::-;26022:4;96423:18;;26468:16;26479:4;26468:10;:16::i;:::-;96454:42:::1;96473:8;96483:12;96454:18;:42::i;:::-;96346:158:::0;;;:::o;26872:147::-;26958:4;26982:6;:12;26989:4;26982:12;;;;;;;;;;;:20;;:29;27003:7;26982:29;;;;;;;;;;;;;;;;;;;;;;;;;26975:36;;26872:147;;;;:::o;67869:104::-;67925:13;67958:7;67951:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67869:104;:::o;25977:49::-;26022:4;25977:49;;;:::o;69455:155::-;69550:52;69569:12;:10;:12::i;:::-;69583:8;69593;69550:18;:52::i;:::-;69455:155;;:::o;97221:391::-;95993:24;26468:16;26479:4;26468:10;:16::i;:::-;97318:17:::1;97338:6;:15;97345:7;97338:15;;;;;;;;;;;97318:35;;97373:4;:15;;;;;;;;;;;;97372:16;97364:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;97421:13;97437:16;97445:7;97437;:16::i;:::-;97421:32;;97477:5;97464:4;:10;;;:18;;;;;;;;;;;;;;;;;;97525:6;97507:15;:24;;;;:::i;:::-;97493:4;:11;;:38;;;;97542:29;97552:5;97559:2;97563:7;97542:9;:29::i;:::-;97600:4;97582;:15;;;:22;;;;;;;;;;;;;;;;;;97307:305;;97221:391:::0;;;;:::o;100055:41::-;100092:4;100055:41;:::o;97841:115::-;97898:4;97922:6;:15;97929:7;97922:15;;;;;;;;;;;:26;;;;;;;;;;;;97915:33;;97841:115;;;:::o;93394:180::-;26022:4;93452:18;;26468:16;26479:4;26468:10;:16::i;:::-;93487:6:::1;93483:84;93499:8;;:15;;93495:1;:19;93483:84;;;93537:18;93543:8;;93552:1;93543:11;;;;;;;:::i;:::-;;;;;;;;93537:5;:18::i;:::-;93516:4;;;;;:::i;:::-;;;;93483:84;;;;93394:180:::0;;;:::o;70506:279::-;70637:41;70656:12;:10;:12::i;:::-;70670:7;70637:18;:41::i;:::-;70629:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;70739:38;70753:4;70759:2;70763:7;70772:4;70739:13;:38::i;:::-;70506:279;;;;:::o;95955:62::-;95993:24;95955:62;:::o;48332:255::-;48517:6;48543:36;;;48536:43;;48332:255;;;;;;;:::o;97964:247::-;98018:21;98041:11;98065:17;98085:6;:15;98092:7;98085:15;;;;;;;;;;;98065:35;;98119:4;:15;;;;;;;;;;;;98111:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;98179:4;:10;;;;;;;;;;;;98191:4;:11;;;98171:32;;;;;97964:247;;;:::o;68044:281::-;68117:13;68143:23;68158:7;68143:14;:23::i;:::-;68179:21;68203:10;:8;:10::i;:::-;68179:34;;68255:1;68237:7;68231:21;:25;:86;;;;;;;;;;;;;;;;;68283:7;68292:18;:7;:16;:18::i;:::-;68266:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;68231:86;68224:93;;;68044:281;;;:::o;29280:149::-;29364:18;29377:4;29364:12;:18::i;:::-;26468:16;26479:4;26468:10;:16::i;:::-;29395:26:::1;29407:4;29413:7;29395:11;:26::i;:::-;29280:149:::0;;;:::o;96254:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;69681:164::-;69778:4;69802:18;:25;69821:5;69802:25;;;;;;;;;;;;;;;:35;69828:8;69802:35;;;;;;;;;;;;;;;;;;;;;;;;;69795:42;;69681:164;;;;:::o;48097:227::-;48259:6;48285:31;;;48278:38;;48097:227;;;;;;;:::o;47287:223::-;47389:4;47428:34;47413:49;;;:11;:49;;;;:89;;;;47466:36;47490:11;47466:23;:36::i;:::-;47413:89;47406:96;;47287:223;;;:::o;27323:105::-;27390:30;27401:4;27407:12;:10;:12::i;:::-;27390:10;:30::i;:::-;27323:105;:::o;78775:135::-;78857:16;78865:7;78857;:16::i;:::-;78849:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;78775:135;:::o;3947:98::-;4000:7;4027:10;4020:17;;3947:98;:::o;78088:174::-;78190:2;78163:15;:24;78179:7;78163:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;78246:7;78242:2;78208:46;;78217:23;78232:7;78217:14;:23::i;:::-;78208:46;;;;;;;;;;;;78088:174;;:::o;72775:264::-;72868:4;72885:13;72901:23;72916:7;72901:14;:23::i;:::-;72885:39;;72954:5;72943:16;;:7;:16;;;:52;;;;72963:32;72980:5;72987:7;72963:16;:32::i;:::-;72943:52;:87;;;;73023:7;72999:31;;:20;73011:7;72999:11;:20::i;:::-;:31;;;72943:87;72935:96;;;72775:264;;;;:::o;98925:152::-;34529:19;:17;:19::i;:::-;99035:34:::1;99051:4;99057:2;99061:7;99035:15;:34::i;:::-;98925:152:::0;;;:::o;38337:97::-;38395:6;38421:5;38414:12;;38337:97;:::o;31581:238::-;31665:22;31673:4;31679:7;31665;:22::i;:::-;31660:152;;31736:4;31704:6;:12;31711:4;31704:12;;;;;;;;;;;:20;;:29;31725:7;31704:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;31787:12;:10;:12::i;:::-;31760:40;;31778:7;31760:40;;31772:4;31760:40;;;;;;;;;;31660:152;31581:238;;:::o;31999:239::-;32083:22;32091:4;32097:7;32083;:22::i;:::-;32079:152;;;32154:5;32122:6;:12;32129:4;32122:12;;;;;;;;;;;:20;;:29;32143:7;32122:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;32206:12;:10;:12::i;:::-;32179:40;;32197:7;32179:40;;32191:4;32179:40;;;;;;;;;;32079:152;31999:239;;:::o;35779:120::-;34788:16;:14;:16::i;:::-;35848:5:::1;35838:7;;:15;;;;;;;;;;;;;;;;;;35869:22;35878:12;:10;:12::i;:::-;35869:22;;;;;;:::i;:::-;;;;;;;;35779:120::o:0;100272:172::-;100342:24;100354:2;100358:7;100342:11;:24::i;:::-;100092:4;100385:13;:11;:13::i;:::-;:27;;100377:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;100272:172;;:::o;99731:124::-;99827:20;99839:7;99827:11;:20::i;:::-;99731:124;:::o;93817:88::-;93890:7;93880;:17;;;;;;:::i;:::-;;93817:88;:::o;72050:117::-;72116:7;72143;:16;72151:7;72143:16;;;;;;;;;;;;;;;;;;;;;72136:23;;72050:117;;;:::o;35520:118::-;34529:19;:17;:19::i;:::-;35590:4:::1;35580:7;;:14;;;;;;;;;;;;;;;;;;35610:20;35617:12;:10;:12::i;:::-;35610:20;;;;;;:::i;:::-;;;;;;;;35520:118::o:0;38705:332::-;38824:17;:15;:17::i;:::-;38808:33;;:12;:33;;;;38800:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;38927:1;38907:22;;:8;:22;;;38899:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;38994:35;;;;;;;;39006:8;38994:35;;;;;;39016:12;38994:35;;;;;38972:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38705:332;;:::o;78405:281::-;78526:8;78517:17;;:5;:17;;;78509:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;78613:8;78575:18;:25;78594:5;78575:25;;;;;;;;;;;;;;;:35;78601:8;78575:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;78659:8;78637:41;;78652:5;78637:41;;;78669:8;78637:41;;;;;;:::i;:::-;;;;;;;;78405:281;;;:::o;71666:270::-;71779:28;71789:4;71795:2;71799:7;71779:9;:28::i;:::-;71826:47;71849:4;71855:2;71859:7;71868:4;71826:22;:47::i;:::-;71818:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;71666:270;;;;:::o;98788:129::-;98860:13;98893:16;:14;:16::i;:::-;98886:23;;98788:129;:::o;21415:716::-;21471:13;21522:14;21559:1;21539:17;21550:5;21539:10;:17::i;:::-;:21;21522:38;;21575:20;21609:6;21598:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21575:41;;21631:11;21760:6;21756:2;21752:15;21744:6;21740:28;21733:35;;21797:288;21804:4;21797:288;;;21829:5;;;;;;;;21971:8;21966:2;21959:5;21955:14;21950:30;21945:3;21937:44;22027:2;22018:11;;;;;;:::i;:::-;;;;;22061:1;22052:5;:10;21797:288;22048:21;21797:288;22106:6;22099:13;;;;;21415:716;;;:::o;92813:185::-;92930:4;92954:36;92978:11;92954:23;:36::i;:::-;92947:43;;92813:185;;;:::o;27718:492::-;27807:22;27815:4;27821:7;27807;:22::i;:::-;27802:401;;27995:28;28015:7;27995:19;:28::i;:::-;28096:38;28124:4;28116:13;;28131:2;28096:19;:38::i;:::-;27900:257;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27846:345;;;;;;;;;;;:::i;:::-;;;;;;;;27802:401;27718:492;;:::o;72480:128::-;72545:4;72598:1;72569:31;;:17;72578:7;72569:8;:17::i;:::-;:31;;;;72562:38;;72480:128;;;:::o;35083:108::-;35154:8;:6;:8::i;:::-;35153:9;35145:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;35083:108::o;76740:1229::-;76865:4;76838:31;;:23;76853:7;76838:14;:23::i;:::-;:31;;;76830:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;76944:1;76930:16;;:2;:16;;;76922:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;77000:42;77021:4;77027:2;77031:7;77040:1;77000:20;:42::i;:::-;77172:4;77145:31;;:23;77160:7;77145:14;:23::i;:::-;:31;;;77137:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;77290:15;:24;77306:7;77290:24;;;;;;;;;;;;77283:31;;;;;;;;;;;77785:1;77766:9;:15;77776:4;77766:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;77818:1;77801:9;:13;77811:2;77801:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;77860:2;77841:7;:16;77849:7;77841:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;77899:7;77895:2;77880:27;;77889:4;77880:27;;;;;;;;;;;;77920:41;77940:4;77946:2;77950:7;77959:1;77920:19;:41::i;:::-;76740:1229;;;:::o;35268:108::-;35335:8;:6;:8::i;:::-;35327:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;35268:108::o;74339:942::-;74433:1;74419:16;;:2;:16;;;74411:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;74492:16;74500:7;74492;:16::i;:::-;74491:17;74483:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;74554:48;74583:1;74587:2;74591:7;74600:1;74554:20;:48::i;:::-;74701:16;74709:7;74701;:16::i;:::-;74700:17;74692:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;75116:1;75099:9;:13;75109:2;75099:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;75160:2;75141:7;:16;75149:7;75141:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;75205:7;75201:2;75180:33;;75197:1;75180:33;;;;;;;;;;;;75226:47;75254:1;75258:2;75262:7;75271:1;75226:19;:47::i;:::-;74339:942;;:::o;92213:135::-;92282:20;92294:7;92282:11;:20::i;:::-;92313:27;92332:7;92313:18;:27::i;:::-;92213:135;:::o;79474:853::-;79628:4;79649:15;:2;:13;;;:15::i;:::-;79645:675;;;79701:2;79685:36;;;79722:12;:10;:12::i;:::-;79736:4;79742:7;79751:4;79685:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;79681:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79943:1;79926:6;:13;:18;79922:328;;79969:60;;;;;;;;;;:::i;:::-;;;;;;;;79922:328;80200:6;80194:13;80185:6;80181:2;80177:15;80170:38;79681:584;79817:41;;;79807:51;;;:6;:51;;;;79800:58;;;;;79645:675;80304:4;80297:11;;79474:853;;;;;;;:::o;93941:107::-;94000:13;94033:7;94026:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;93941:107;:::o;16798:948::-;16851:7;16871:14;16888:1;16871:18;;16938:8;16929:5;:17;16925:106;;16976:8;16967:17;;;;;;:::i;:::-;;;;;17013:2;17003:12;;;;16925:106;17058:8;17049:5;:17;17045:106;;17096:8;17087:17;;;;;;:::i;:::-;;;;;17133:2;17123:12;;;;17045:106;17178:8;17169:5;:17;17165:106;;17216:8;17207:17;;;;;;:::i;:::-;;;;;17253:2;17243:12;;;;17165:106;17298:7;17289:5;:16;17285:103;;17335:7;17326:16;;;;;;:::i;:::-;;;;;17371:1;17361:11;;;;17285:103;17415:7;17406:5;:16;17402:103;;17452:7;17443:16;;;;;;:::i;:::-;;;;;17488:1;17478:11;;;;17402:103;17532:7;17523:5;:16;17519:103;;17569:7;17560:16;;;;;;:::i;:::-;;;;;17605:1;17595:11;;;;17519:103;17649:7;17640:5;:16;17636:68;;17687:1;17677:11;;;;17636:68;17732:6;17725:13;;;16798:948;;;:::o;84841:224::-;84943:4;84982:35;84967:50;;;:11;:50;;;;:90;;;;85021:36;85045:11;85021:23;:36::i;:::-;84967:90;84960:97;;84841:224;;;:::o;23431:151::-;23489:13;23522:52;23550:4;23534:22;;21306:2;23522:52;;:11;:52::i;:::-;23515:59;;23431:151;;;:::o;22827:447::-;22902:13;22928:19;22973:1;22964:6;22960:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;22950:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22928:47;;22986:15;:6;22993:1;22986:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;23012;:6;23019:1;23012:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;23043:9;23068:1;23059:6;23055:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;23043:26;;23038:131;23075:1;23071;:5;23038:131;;;23110:8;23127:3;23119:5;:11;23110:21;;;;;;;:::i;:::-;;;;;23098:6;23105:1;23098:9;;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;23156:1;23146:11;;;;;23078:3;;;;:::i;:::-;;;23038:131;;;;23196:1;23187:5;:10;23179:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;23259:6;23245:21;;;22827:447;;;;:::o;99085:390::-;99278:6;:15;99285:7;99278:15;;;;;;;;;;;:26;;;;;;;;;;;;99277:27;99269:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;99346:11;:17;99358:4;99346:17;;;;;;;;;;;;;;;;;;;;;;;;;99345:18;:38;;;;;99368:11;:15;99380:2;99368:15;;;;;;;;;;;;;;;;;;;;;;;;;99367:16;99345:38;99337:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;99411:56;99438:4;99444:2;99448:7;99457:9;99411:26;:56::i;:::-;99085:390;;;;:::o;81897:115::-;;;;;:::o;75620:783::-;75680:13;75696:23;75711:7;75696:14;:23::i;:::-;75680:39;;75732:51;75753:5;75768:1;75772:7;75781:1;75732:20;:51::i;:::-;75896:23;75911:7;75896:14;:23::i;:::-;75888:31;;75967:15;:24;75983:7;75967:24;;;;;;;;;;;;75960:31;;;;;;;;;;;76232:1;76212:9;:16;76222:5;76212:16;;;;;;;;;;;;;;;;:21;;;;;;;;;;;76262:7;:16;76270:7;76262:16;;;;;;;;;;;;76255:23;;;;;;;;;;;76324:7;76320:1;76296:36;;76305:5;76296:36;;;;;;;;;;;;76345:50;76365:5;76380:1;76384:7;76393:1;76345:19;:50::i;:::-;75669:734;75620:783;:::o;39955:114::-;40035:17;:26;40053:7;40035:26;;;;;;;;;;;;40028:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39955:114;:::o;57151:326::-;57211:4;57468:1;57446:7;:19;;;:23;57439:30;;57151:326;;;:::o;91911:170::-;92013:4;92037:36;92061:11;92037:23;:36::i;:::-;92030:43;;91911:170;;;:::o;85978:915::-;86155:61;86182:4;86188:2;86192:12;86206:9;86155:26;:61::i;:::-;86245:1;86233:9;:13;86229:222;;;86376:63;;;;;;;;;;:::i;:::-;;;;;;;;86229:222;86463:15;86481:12;86463:30;;86526:1;86510:18;;:4;:18;;;86506:187;;86545:40;86577:7;86545:31;:40::i;:::-;86506:187;;;86615:2;86607:10;;:4;:10;;;86603:90;;86634:47;86667:4;86673:7;86634:32;:47::i;:::-;86603:90;86506:187;86721:1;86707:16;;:2;:16;;;86703:183;;86740:45;86777:7;86740:36;:45::i;:::-;86703:183;;;86813:4;86807:10;;:2;:10;;;86803:83;;86834:40;86862:2;86866:7;86834:27;:40::i;:::-;86803:83;86703:183;86144:749;85978:915;;;;:::o;66772:305::-;66874:4;66926:25;66911:40;;;:11;:40;;;;:105;;;;66983:33;66968:48;;;:11;:48;;;;66911:105;:158;;;;67033:36;67057:11;67033:23;:36::i;:::-;66911:158;66891:178;;66772:305;;;:::o;81059:116::-;;;;;:::o;87616:164::-;87720:10;:17;;;;87693:15;:24;87709:7;87693:24;;;;;;;;;;;:44;;;;87748:10;87764:7;87748:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87616:164;:::o;88407:988::-;88673:22;88723:1;88698:22;88715:4;88698:16;:22::i;:::-;:26;;;;:::i;:::-;88673:51;;88735:18;88756:17;:26;88774:7;88756:26;;;;;;;;;;;;88735:47;;88903:14;88889:10;:28;88885:328;;88934:19;88956:12;:18;88969:4;88956:18;;;;;;;;;;;;;;;:34;88975:14;88956:34;;;;;;;;;;;;88934:56;;89040:11;89007:12;:18;89020:4;89007:18;;;;;;;;;;;;;;;:30;89026:10;89007:30;;;;;;;;;;;:44;;;;89157:10;89124:17;:30;89142:11;89124:30;;;;;;;;;;;:43;;;;88919:294;88885:328;89309:17;:26;89327:7;89309:26;;;;;;;;;;;89302:33;;;89353:12;:18;89366:4;89353:18;;;;;;;;;;;;;;;:34;89372:14;89353:34;;;;;;;;;;;89346:41;;;88488:907;;88407:988;;:::o;89690:1079::-;89943:22;89988:1;89968:10;:17;;;;:21;;;;:::i;:::-;89943:46;;90000:18;90021:15;:24;90037:7;90021:24;;;;;;;;;;;;90000:45;;90372:19;90394:10;90405:14;90394:26;;;;;;;;:::i;:::-;;;;;;;;;;90372:48;;90458:11;90433:10;90444;90433:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;90569:10;90538:15;:28;90554:11;90538:28;;;;;;;;;;;:41;;;;90710:15;:24;90726:7;90710:24;;;;;;;;;;;90703:31;;;90745:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;89761:1008;;;89690:1079;:::o;87194:221::-;87279:14;87296:20;87313:2;87296:16;:20::i;:::-;87279:37;;87354:7;87327:12;:16;87340:2;87327:16;;;;;;;;;;;;;;;:24;87344:6;87327:24;;;;;;;;;;;:34;;;;87401:6;87372:17;:26;87390:7;87372:26;;;;;;;;;;;:35;;;;87268:147;87194:221;;:::o;26576:204::-;26661:4;26700:32;26685:47;;;:11;:47;;;;:87;;;;26736:36;26760:11;26736:23;:36::i;:::-;26685:87;26678:94;;26576:204;;;:::o;37347:215::-;37449:4;37488:26;37473:41;;;:11;:41;;;;:81;;;;37518:36;37542:11;37518:23;:36::i;:::-;37473:81;37466:88;;37347:215;;;:::o;6162:157::-;6247:4;6286:25;6271:40;;;:11;:40;;;;6264:47;;6162:157;;;:::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:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:122::-;1825:24;1843:5;1825:24;:::i;:::-;1818:5;1815:35;1805:63;;1864:1;1861;1854:12;1805:63;1752:122;:::o;1880:139::-;1926:5;1964:6;1951:20;1942:29;;1980:33;2007:5;1980:33;:::i;:::-;1880:139;;;;:::o;2025:116::-;2095:21;2110:5;2095:21;:::i;:::-;2088:5;2085:32;2075:60;;2131:1;2128;2121:12;2075:60;2025:116;:::o;2147:133::-;2190:5;2228:6;2215:20;2206:29;;2244:30;2268:5;2244:30;:::i;:::-;2147:133;;;;:::o;2286:468::-;2351:6;2359;2408:2;2396:9;2387:7;2383:23;2379:32;2376:119;;;2414:79;;:::i;:::-;2376:119;2534:1;2559:53;2604:7;2595:6;2584:9;2580:22;2559:53;:::i;:::-;2549:63;;2505:117;2661:2;2687:50;2729:7;2720:6;2709:9;2705:22;2687:50;:::i;:::-;2677:60;;2632:115;2286:468;;;;;:::o;2760:99::-;2812:6;2846:5;2840:12;2830:22;;2760:99;;;:::o;2865:169::-;2949:11;2983:6;2978:3;2971:19;3023:4;3018:3;3014:14;2999:29;;2865:169;;;;:::o;3040:246::-;3121:1;3131:113;3145:6;3142:1;3139:13;3131:113;;;3230:1;3225:3;3221:11;3215:18;3211:1;3206:3;3202:11;3195:39;3167:2;3164:1;3160:10;3155:15;;3131:113;;;3278:1;3269:6;3264:3;3260:16;3253:27;3102:184;3040:246;;;:::o;3292:102::-;3333:6;3384:2;3380:7;3375:2;3368:5;3364:14;3360:28;3350:38;;3292:102;;;:::o;3400:377::-;3488:3;3516:39;3549:5;3516:39;:::i;:::-;3571:71;3635:6;3630:3;3571:71;:::i;:::-;3564:78;;3651:65;3709:6;3704:3;3697:4;3690:5;3686:16;3651:65;:::i;:::-;3741:29;3763:6;3741:29;:::i;:::-;3736:3;3732:39;3725:46;;3492:285;3400:377;;;;:::o;3783:313::-;3896:4;3934:2;3923:9;3919:18;3911:26;;3983:9;3977:4;3973:20;3969:1;3958:9;3954:17;3947:47;4011:78;4084:4;4075:6;4011:78;:::i;:::-;4003:86;;3783:313;;;;:::o;4102:77::-;4139:7;4168:5;4157:16;;4102:77;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:329::-;4517:6;4566:2;4554:9;4545:7;4541:23;4537:32;4534:119;;;4572:79;;:::i;:::-;4534:119;4692:1;4717:53;4762:7;4753:6;4742:9;4738:22;4717:53;:::i;:::-;4707:63;;4663:117;4458:329;;;;:::o;4793:118::-;4880:24;4898:5;4880:24;:::i;:::-;4875:3;4868:37;4793:118;;:::o;4917:222::-;5010:4;5048:2;5037:9;5033:18;5025:26;;5061:71;5129:1;5118:9;5114:17;5105:6;5061:71;:::i;:::-;4917:222;;;;:::o;5145:474::-;5213:6;5221;5270:2;5258:9;5249:7;5245:23;5241:32;5238:119;;;5276:79;;:::i;:::-;5238:119;5396:1;5421:53;5466:7;5457:6;5446:9;5442:22;5421:53;:::i;:::-;5411:63;;5367:117;5523:2;5549:53;5594:7;5585:6;5574:9;5570:22;5549:53;:::i;:::-;5539:63;;5494:118;5145:474;;;;;:::o;5625:118::-;5712:24;5730:5;5712:24;:::i;:::-;5707:3;5700:37;5625:118;;:::o;5749:222::-;5842:4;5880:2;5869:9;5865:18;5857:26;;5893:71;5961:1;5950:9;5946:17;5937:6;5893:71;:::i;:::-;5749:222;;;;:::o;5977:619::-;6054:6;6062;6070;6119:2;6107:9;6098:7;6094:23;6090:32;6087:119;;;6125:79;;:::i;:::-;6087:119;6245:1;6270:53;6315:7;6306:6;6295:9;6291:22;6270:53;:::i;:::-;6260:63;;6216:117;6372:2;6398:53;6443:7;6434:6;6423:9;6419:22;6398:53;:::i;:::-;6388:63;;6343:118;6500:2;6526:53;6571:7;6562:6;6551:9;6547:22;6526:53;:::i;:::-;6516:63;;6471:118;5977:619;;;;;:::o;6602:77::-;6639:7;6668:5;6657:16;;6602:77;;;:::o;6685:122::-;6758:24;6776:5;6758:24;:::i;:::-;6751:5;6748:35;6738:63;;6797:1;6794;6787:12;6738:63;6685:122;:::o;6813:139::-;6859:5;6897:6;6884:20;6875:29;;6913:33;6940:5;6913:33;:::i;:::-;6813:139;;;;:::o;6958:329::-;7017:6;7066:2;7054:9;7045:7;7041:23;7037:32;7034:119;;;7072:79;;:::i;:::-;7034:119;7192:1;7217:53;7262:7;7253:6;7242:9;7238:22;7217:53;:::i;:::-;7207:63;;7163:117;6958:329;;;;:::o;7293:118::-;7380:24;7398:5;7380:24;:::i;:::-;7375:3;7368:37;7293:118;;:::o;7417:222::-;7510:4;7548:2;7537:9;7533:18;7525:26;;7561:71;7629:1;7618:9;7614:17;7605:6;7561:71;:::i;:::-;7417:222;;;;:::o;7645:474::-;7713:6;7721;7770:2;7758:9;7749:7;7745:23;7741:32;7738:119;;;7776:79;;:::i;:::-;7738:119;7896:1;7921:53;7966:7;7957:6;7946:9;7942:22;7921:53;:::i;:::-;7911:63;;7867:117;8023:2;8049:53;8094:7;8085:6;8074:9;8070:22;8049:53;:::i;:::-;8039:63;;7994:118;7645:474;;;;;:::o;8125:332::-;8246:4;8284:2;8273:9;8269:18;8261:26;;8297:71;8365:1;8354:9;8350:17;8341:6;8297:71;:::i;:::-;8378:72;8446:2;8435:9;8431:18;8422:6;8378:72;:::i;:::-;8125:332;;;;;:::o;8463:474::-;8531:6;8539;8588:2;8576:9;8567:7;8563:23;8559:32;8556:119;;;8594:79;;:::i;:::-;8556:119;8714:1;8739:53;8784:7;8775:6;8764:9;8760:22;8739:53;:::i;:::-;8729:63;;8685:117;8841:2;8867:53;8912:7;8903:6;8892:9;8888:22;8867:53;:::i;:::-;8857:63;;8812:118;8463:474;;;;;:::o;8943:114::-;9010:6;9044:5;9038:12;9028:22;;8943:114;;;:::o;9063:184::-;9162:11;9196:6;9191:3;9184:19;9236:4;9231:3;9227:14;9212:29;;9063:184;;;;:::o;9253:132::-;9320:4;9343:3;9335:11;;9373:4;9368:3;9364:14;9356:22;;9253:132;;;:::o;9391:108::-;9468:24;9486:5;9468:24;:::i;:::-;9463:3;9456:37;9391:108;;:::o;9505:179::-;9574:10;9595:46;9637:3;9629:6;9595:46;:::i;:::-;9673:4;9668:3;9664:14;9650:28;;9505:179;;;;:::o;9690:113::-;9760:4;9792;9787:3;9783:14;9775:22;;9690:113;;;:::o;9839:732::-;9958:3;9987:54;10035:5;9987:54;:::i;:::-;10057:86;10136:6;10131:3;10057:86;:::i;:::-;10050:93;;10167:56;10217:5;10167:56;:::i;:::-;10246:7;10277:1;10262:284;10287:6;10284:1;10281:13;10262:284;;;10363:6;10357:13;10390:63;10449:3;10434:13;10390:63;:::i;:::-;10383:70;;10476:60;10529:6;10476:60;:::i;:::-;10466:70;;10322:224;10309:1;10306;10302:9;10297:14;;10262:284;;;10266:14;10562:3;10555:10;;9963:608;;;9839:732;;;;:::o;10577:373::-;10720:4;10758:2;10747:9;10743:18;10735:26;;10807:9;10801:4;10797:20;10793:1;10782:9;10778:17;10771:47;10835:108;10938:4;10929:6;10835:108;:::i;:::-;10827:116;;10577:373;;;;:::o;10956:117::-;11065:1;11062;11055:12;11079:117;11188:1;11185;11178:12;11202:180;11250:77;11247:1;11240:88;11347:4;11344:1;11337:15;11371:4;11368:1;11361:15;11388:281;11471:27;11493:4;11471:27;:::i;:::-;11463:6;11459:40;11601:6;11589:10;11586:22;11565:18;11553:10;11550:34;11547:62;11544:88;;;11612:18;;:::i;:::-;11544:88;11652:10;11648:2;11641:22;11431:238;11388:281;;:::o;11675:129::-;11709:6;11736:20;;:::i;:::-;11726:30;;11765:33;11793:4;11785:6;11765:33;:::i;:::-;11675:129;;;:::o;11810:308::-;11872:4;11962:18;11954:6;11951:30;11948:56;;;11984:18;;:::i;:::-;11948:56;12022:29;12044:6;12022:29;:::i;:::-;12014:37;;12106:4;12100;12096:15;12088:23;;11810:308;;;:::o;12124:146::-;12221:6;12216:3;12211;12198:30;12262:1;12253:6;12248:3;12244:16;12237:27;12124:146;;;:::o;12276:425::-;12354:5;12379:66;12395:49;12437:6;12395:49;:::i;:::-;12379:66;:::i;:::-;12370:75;;12468:6;12461:5;12454:21;12506:4;12499:5;12495:16;12544:3;12535:6;12530:3;12526:16;12523:25;12520:112;;;12551:79;;:::i;:::-;12520:112;12641:54;12688:6;12683:3;12678;12641:54;:::i;:::-;12360:341;12276:425;;;;;:::o;12721:340::-;12777:5;12826:3;12819:4;12811:6;12807:17;12803:27;12793:122;;12834:79;;:::i;:::-;12793:122;12951:6;12938:20;12976:79;13051:3;13043:6;13036:4;13028:6;13024:17;12976:79;:::i;:::-;12967:88;;12783:278;12721:340;;;;:::o;13067:509::-;13136:6;13185:2;13173:9;13164:7;13160:23;13156:32;13153:119;;;13191:79;;:::i;:::-;13153:119;13339:1;13328:9;13324:17;13311:31;13369:18;13361:6;13358:30;13355:117;;;13391:79;;:::i;:::-;13355:117;13496:63;13551:7;13542:6;13531:9;13527:22;13496:63;:::i;:::-;13486:73;;13282:287;13067:509;;;;:::o;13582:329::-;13641:6;13690:2;13678:9;13669:7;13665:23;13661:32;13658:119;;;13696:79;;:::i;:::-;13658:119;13816:1;13841:53;13886:7;13877:6;13866:9;13862:22;13841:53;:::i;:::-;13831:63;;13787:117;13582:329;;;;:::o;13917:109::-;13953:7;13993:26;13986:5;13982:38;13971:49;;13917:109;;;:::o;14032:120::-;14104:23;14121:5;14104:23;:::i;:::-;14097:5;14094:34;14084:62;;14142:1;14139;14132:12;14084:62;14032:120;:::o;14158:137::-;14203:5;14241:6;14228:20;14219:29;;14257:32;14283:5;14257:32;:::i;:::-;14158:137;;;;:::o;14301:472::-;14368:6;14376;14425:2;14413:9;14404:7;14400:23;14396:32;14393:119;;;14431:79;;:::i;:::-;14393:119;14551:1;14576:53;14621:7;14612:6;14601:9;14597:22;14576:53;:::i;:::-;14566:63;;14522:117;14678:2;14704:52;14748:7;14739:6;14728:9;14724:22;14704:52;:::i;:::-;14694:62;;14649:117;14301:472;;;;;:::o;14779:619::-;14856:6;14864;14872;14921:2;14909:9;14900:7;14896:23;14892:32;14889:119;;;14927:79;;:::i;:::-;14889:119;15047:1;15072:53;15117:7;15108:6;15097:9;15093:22;15072:53;:::i;:::-;15062:63;;15018:117;15174:2;15200:53;15245:7;15236:6;15225:9;15221:22;15200:53;:::i;:::-;15190:63;;15145:118;15302:2;15328:53;15373:7;15364:6;15353:9;15349:22;15328:53;:::i;:::-;15318:63;;15273:118;14779:619;;;;;:::o;15404:117::-;15513:1;15510;15503:12;15527:117;15636:1;15633;15626:12;15667:568;15740:8;15750:6;15800:3;15793:4;15785:6;15781:17;15777:27;15767:122;;15808:79;;:::i;:::-;15767:122;15921:6;15908:20;15898:30;;15951:18;15943:6;15940:30;15937:117;;;15973:79;;:::i;:::-;15937:117;16087:4;16079:6;16075:17;16063:29;;16141:3;16133:4;16125:6;16121:17;16111:8;16107:32;16104:41;16101:128;;;16148:79;;:::i;:::-;16101:128;15667:568;;;;;:::o;16241:559::-;16327:6;16335;16384:2;16372:9;16363:7;16359:23;16355:32;16352:119;;;16390:79;;:::i;:::-;16352:119;16538:1;16527:9;16523:17;16510:31;16568:18;16560:6;16557:30;16554:117;;;16590:79;;:::i;:::-;16554:117;16703:80;16775:7;16766:6;16755:9;16751:22;16703:80;:::i;:::-;16685:98;;;;16481:312;16241:559;;;;;:::o;16806:307::-;16867:4;16957:18;16949:6;16946:30;16943:56;;;16979:18;;:::i;:::-;16943:56;17017:29;17039:6;17017:29;:::i;:::-;17009:37;;17101:4;17095;17091:15;17083:23;;16806:307;;;:::o;17119:423::-;17196:5;17221:65;17237:48;17278:6;17237:48;:::i;:::-;17221:65;:::i;:::-;17212:74;;17309:6;17302:5;17295:21;17347:4;17340:5;17336:16;17385:3;17376:6;17371:3;17367:16;17364:25;17361:112;;;17392:79;;:::i;:::-;17361:112;17482:54;17529:6;17524:3;17519;17482:54;:::i;:::-;17202:340;17119:423;;;;;:::o;17561:338::-;17616:5;17665:3;17658:4;17650:6;17646:17;17642:27;17632:122;;17673:79;;:::i;:::-;17632:122;17790:6;17777:20;17815:78;17889:3;17881:6;17874:4;17866:6;17862:17;17815:78;:::i;:::-;17806:87;;17622:277;17561:338;;;;:::o;17905:943::-;18000:6;18008;18016;18024;18073:3;18061:9;18052:7;18048:23;18044:33;18041:120;;;18080:79;;:::i;:::-;18041:120;18200:1;18225:53;18270:7;18261:6;18250:9;18246:22;18225:53;:::i;:::-;18215:63;;18171:117;18327:2;18353:53;18398:7;18389:6;18378:9;18374:22;18353:53;:::i;:::-;18343:63;;18298:118;18455:2;18481:53;18526:7;18517:6;18506:9;18502:22;18481:53;:::i;:::-;18471:63;;18426:118;18611:2;18600:9;18596:18;18583:32;18642:18;18634:6;18631:30;18628:117;;;18664:79;;:::i;:::-;18628:117;18769:62;18823:7;18814:6;18803:9;18799:22;18769:62;:::i;:::-;18759:72;;18554:287;17905:943;;;;;;;:::o;18854:311::-;18931:4;19021:18;19013:6;19010:30;19007:56;;;19043:18;;:::i;:::-;19007:56;19093:4;19085:6;19081:17;19073:25;;19153:4;19147;19143:15;19135:23;;18854:311;;;:::o;19188:710::-;19284:5;19309:81;19325:64;19382:6;19325:64;:::i;:::-;19309:81;:::i;:::-;19300:90;;19410:5;19439:6;19432:5;19425:21;19473:4;19466:5;19462:16;19455:23;;19526:4;19518:6;19514:17;19506:6;19502:30;19555:3;19547:6;19544:15;19541:122;;;19574:79;;:::i;:::-;19541:122;19689:6;19672:220;19706:6;19701:3;19698:15;19672:220;;;19781:3;19810:37;19843:3;19831:10;19810:37;:::i;:::-;19805:3;19798:50;19877:4;19872:3;19868:14;19861:21;;19748:144;19732:4;19727:3;19723:14;19716:21;;19672:220;;;19676:21;19290:608;;19188:710;;;;;:::o;19921:370::-;19992:5;20041:3;20034:4;20026:6;20022:17;20018:27;20008:122;;20049:79;;:::i;:::-;20008:122;20166:6;20153:20;20191:94;20281:3;20273:6;20266:4;20258:6;20254:17;20191:94;:::i;:::-;20182:103;;19998:293;19921:370;;;;:::o;20297:1509::-;20451:6;20459;20467;20475;20483;20532:3;20520:9;20511:7;20507:23;20503:33;20500:120;;;20539:79;;:::i;:::-;20500:120;20659:1;20684:53;20729:7;20720:6;20709:9;20705:22;20684:53;:::i;:::-;20674:63;;20630:117;20786:2;20812:53;20857:7;20848:6;20837:9;20833:22;20812:53;:::i;:::-;20802:63;;20757:118;20942:2;20931:9;20927:18;20914:32;20973:18;20965:6;20962:30;20959:117;;;20995:79;;:::i;:::-;20959:117;21100:78;21170:7;21161:6;21150:9;21146:22;21100:78;:::i;:::-;21090:88;;20885:303;21255:2;21244:9;21240:18;21227:32;21286:18;21278:6;21275:30;21272:117;;;21308:79;;:::i;:::-;21272:117;21413:78;21483:7;21474:6;21463:9;21459:22;21413:78;:::i;:::-;21403:88;;21198:303;21568:3;21557:9;21553:19;21540:33;21600:18;21592:6;21589:30;21586:117;;;21622:79;;:::i;:::-;21586:117;21727:62;21781:7;21772:6;21761:9;21757:22;21727:62;:::i;:::-;21717:72;;21511:288;20297:1509;;;;;;;;:::o;21812:115::-;21897:23;21914:5;21897:23;:::i;:::-;21892:3;21885:36;21812:115;;:::o;21933:218::-;22024:4;22062:2;22051:9;22047:18;22039:26;;22075:69;22141:1;22130:9;22126:17;22117:6;22075:69;:::i;:::-;21933:218;;;;:::o;22157:474::-;22225:6;22233;22282:2;22270:9;22261:7;22257:23;22253:32;22250:119;;;22288:79;;:::i;:::-;22250:119;22408:1;22433:53;22478:7;22469:6;22458:9;22454:22;22433:53;:::i;:::-;22423:63;;22379:117;22535:2;22561:53;22606:7;22597:6;22586:9;22582:22;22561:53;:::i;:::-;22551:63;;22506:118;22157:474;;;;;:::o;22637:1089::-;22741:6;22749;22757;22765;22773;22822:3;22810:9;22801:7;22797:23;22793:33;22790:120;;;22829:79;;:::i;:::-;22790:120;22949:1;22974:53;23019:7;23010:6;22999:9;22995:22;22974:53;:::i;:::-;22964:63;;22920:117;23076:2;23102:53;23147:7;23138:6;23127:9;23123:22;23102:53;:::i;:::-;23092:63;;23047:118;23204:2;23230:53;23275:7;23266:6;23255:9;23251:22;23230:53;:::i;:::-;23220:63;;23175:118;23332:2;23358:53;23403:7;23394:6;23383:9;23379:22;23358:53;:::i;:::-;23348:63;;23303:118;23488:3;23477:9;23473:19;23460:33;23520:18;23512:6;23509:30;23506:117;;;23542:79;;:::i;:::-;23506:117;23647:62;23701:7;23692:6;23681:9;23677:22;23647:62;:::i;:::-;23637:72;;23431:288;22637:1089;;;;;;;;:::o;23732:180::-;23780:77;23777:1;23770:88;23877:4;23874:1;23867:15;23901:4;23898:1;23891:15;23918:320;23962:6;23999:1;23993:4;23989:12;23979:22;;24046:1;24040:4;24036:12;24067:18;24057:81;;24123:4;24115:6;24111:17;24101:27;;24057:81;24185:2;24177:6;24174:14;24154:18;24151:38;24148:84;;24204:18;;:::i;:::-;24148:84;23969:269;23918:320;;;:::o;24244:220::-;24384:34;24380:1;24372:6;24368:14;24361:58;24453:3;24448:2;24440:6;24436:15;24429:28;24244:220;:::o;24470:366::-;24612:3;24633:67;24697:2;24692:3;24633:67;:::i;:::-;24626:74;;24709:93;24798:3;24709:93;:::i;:::-;24827:2;24822:3;24818:12;24811:19;;24470:366;;;:::o;24842:419::-;25008:4;25046:2;25035:9;25031:18;25023:26;;25095:9;25089:4;25085:20;25081:1;25070:9;25066:17;25059:47;25123:131;25249:4;25123:131;:::i;:::-;25115:139;;24842:419;;;:::o;25267:248::-;25407:34;25403:1;25395:6;25391:14;25384:58;25476:31;25471:2;25463:6;25459:15;25452:56;25267:248;:::o;25521:366::-;25663:3;25684:67;25748:2;25743:3;25684:67;:::i;:::-;25677:74;;25760:93;25849:3;25760:93;:::i;:::-;25878:2;25873:3;25869:12;25862:19;;25521:366;;;:::o;25893:419::-;26059:4;26097:2;26086:9;26082:18;26074:26;;26146:9;26140:4;26136:20;26132:1;26121:9;26117:17;26110:47;26174:131;26300:4;26174:131;:::i;:::-;26166:139;;25893:419;;;:::o;26318:232::-;26458:34;26454:1;26446:6;26442:14;26435:58;26527:15;26522:2;26514:6;26510:15;26503:40;26318:232;:::o;26556:366::-;26698:3;26719:67;26783:2;26778:3;26719:67;:::i;:::-;26712:74;;26795:93;26884:3;26795:93;:::i;:::-;26913:2;26908:3;26904:12;26897:19;;26556:366;;;:::o;26928:419::-;27094:4;27132:2;27121:9;27117:18;27109:26;;27181:9;27175:4;27171:20;27167:1;27156:9;27152:17;27145:47;27209:131;27335:4;27209:131;:::i;:::-;27201:139;;26928:419;;;:::o;27353:180::-;27401:77;27398:1;27391:88;27498:4;27495:1;27488:15;27522:4;27519:1;27512:15;27539:410;27579:7;27602:20;27620:1;27602:20;:::i;:::-;27597:25;;27636:20;27654:1;27636:20;:::i;:::-;27631:25;;27691:1;27688;27684:9;27713:30;27731:11;27713:30;:::i;:::-;27702:41;;27892:1;27883:7;27879:15;27876:1;27873:22;27853:1;27846:9;27826:83;27803:139;;27922:18;;:::i;:::-;27803:139;27587:362;27539:410;;;;:::o;27955:180::-;28003:77;28000:1;27993:88;28100:4;28097:1;28090:15;28124:4;28121:1;28114:15;28141:185;28181:1;28198:20;28216:1;28198:20;:::i;:::-;28193:25;;28232:20;28250:1;28232:20;:::i;:::-;28227:25;;28271:1;28261:35;;28276:18;;:::i;:::-;28261:35;28318:1;28315;28311:9;28306:14;;28141:185;;;;:::o;28332:230::-;28472:34;28468:1;28460:6;28456:14;28449:58;28541:13;28536:2;28528:6;28524:15;28517:38;28332:230;:::o;28568:366::-;28710:3;28731:67;28795:2;28790:3;28731:67;:::i;:::-;28724:74;;28807:93;28896:3;28807:93;:::i;:::-;28925:2;28920:3;28916:12;28909:19;;28568:366;;;:::o;28940:419::-;29106:4;29144:2;29133:9;29129:18;29121:26;;29193:9;29187:4;29183:20;29179:1;29168:9;29164:17;29157:47;29221:131;29347:4;29221:131;:::i;:::-;29213:139;;28940:419;;;:::o;29365:234::-;29505:34;29501:1;29493:6;29489:14;29482:58;29574:17;29569:2;29561:6;29557:15;29550:42;29365:234;:::o;29605:366::-;29747:3;29768:67;29832:2;29827:3;29768:67;:::i;:::-;29761:74;;29844:93;29933:3;29844:93;:::i;:::-;29962:2;29957:3;29953:12;29946:19;;29605:366;;;:::o;29977:419::-;30143:4;30181:2;30170:9;30166:18;30158:26;;30230:9;30224:4;30220:20;30216:1;30205:9;30201:17;30194:47;30258:131;30384:4;30258:131;:::i;:::-;30250:139;;29977:419;;;:::o;30402:191::-;30442:3;30461:20;30479:1;30461:20;:::i;:::-;30456:25;;30495:20;30513:1;30495:20;:::i;:::-;30490:25;;30538:1;30535;30531:9;30524:16;;30559:3;30556:1;30553:10;30550:36;;;30566:18;;:::i;:::-;30550:36;30402:191;;;;:::o;30599:180::-;30647:77;30644:1;30637:88;30744:4;30741:1;30734:15;30768:4;30765:1;30758:15;30785:233;30824:3;30847:24;30865:5;30847:24;:::i;:::-;30838:33;;30893:66;30886:5;30883:77;30880:103;;30963:18;;:::i;:::-;30880:103;31010:1;31003:5;30999:13;30992:20;;30785:233;;;:::o;31024:171::-;31164:23;31160:1;31152:6;31148:14;31141:47;31024:171;:::o;31201:366::-;31343:3;31364:67;31428:2;31423:3;31364:67;:::i;:::-;31357:74;;31440:93;31529:3;31440:93;:::i;:::-;31558:2;31553:3;31549:12;31542:19;;31201:366;;;:::o;31573:419::-;31739:4;31777:2;31766:9;31762:18;31754:26;;31826:9;31820:4;31816:20;31812:1;31801:9;31797:17;31790:47;31854:131;31980:4;31854:131;:::i;:::-;31846:139;;31573:419;;;:::o;31998:171::-;32138:23;32134:1;32126:6;32122:14;32115:47;31998:171;:::o;32175:366::-;32317:3;32338:67;32402:2;32397:3;32338:67;:::i;:::-;32331:74;;32414:93;32503:3;32414:93;:::i;:::-;32532:2;32527:3;32523:12;32516:19;;32175:366;;;:::o;32547:419::-;32713:4;32751:2;32740:9;32736:18;32728:26;;32800:9;32794:4;32790:20;32786:1;32775:9;32771:17;32764:47;32828:131;32954:4;32828:131;:::i;:::-;32820:139;;32547:419;;;:::o;32972:231::-;33112:34;33108:1;33100:6;33096:14;33089:58;33181:14;33176:2;33168:6;33164:15;33157:39;32972:231;:::o;33209:366::-;33351:3;33372:67;33436:2;33431:3;33372:67;:::i;:::-;33365:74;;33448:93;33537:3;33448:93;:::i;:::-;33566:2;33561:3;33557:12;33550:19;;33209:366;;;:::o;33581:419::-;33747:4;33785:2;33774:9;33770:18;33762:26;;33834:9;33828:4;33824:20;33820:1;33809:9;33805:17;33798:47;33862:131;33988:4;33862:131;:::i;:::-;33854:139;;33581:419;;;:::o;34006:174::-;34146:26;34142:1;34134:6;34130:14;34123:50;34006:174;:::o;34186:366::-;34328:3;34349:67;34413:2;34408:3;34349:67;:::i;:::-;34342:74;;34425:93;34514:3;34425:93;:::i;:::-;34543:2;34538:3;34534:12;34527:19;;34186:366;;;:::o;34558:419::-;34724:4;34762:2;34751:9;34747:18;34739:26;;34811:9;34805:4;34801:20;34797:1;34786:9;34782:17;34775:47;34839:131;34965:4;34839:131;:::i;:::-;34831:139;;34558:419;;;:::o;34983:228::-;35123:34;35119:1;35111:6;35107:14;35100:58;35192:11;35187:2;35179:6;35175:15;35168:36;34983:228;:::o;35217:366::-;35359:3;35380:67;35444:2;35439:3;35380:67;:::i;:::-;35373:74;;35456:93;35545:3;35456:93;:::i;:::-;35574:2;35569:3;35565:12;35558:19;;35217:366;;;:::o;35589:419::-;35755:4;35793:2;35782:9;35778:18;35770:26;;35842:9;35836:4;35832:20;35828:1;35817:9;35813:17;35806:47;35870:131;35996:4;35870:131;:::i;:::-;35862:139;;35589:419;;;:::o;36014:165::-;36154:17;36150:1;36142:6;36138:14;36131:41;36014:165;:::o;36185:366::-;36327:3;36348:67;36412:2;36407:3;36348:67;:::i;:::-;36341:74;;36424:93;36513:3;36424:93;:::i;:::-;36542:2;36537:3;36533:12;36526:19;;36185:366;;;:::o;36557:419::-;36723:4;36761:2;36750:9;36746:18;36738:26;;36810:9;36804:4;36800:20;36796:1;36785:9;36781:17;36774:47;36838:131;36964:4;36838:131;:::i;:::-;36830:139;;36557:419;;;:::o;36982:167::-;37122:19;37118:1;37110:6;37106:14;37099:43;36982:167;:::o;37155:366::-;37297:3;37318:67;37382:2;37377:3;37318:67;:::i;:::-;37311:74;;37394:93;37483:3;37394:93;:::i;:::-;37512:2;37507:3;37503:12;37496:19;;37155:366;;;:::o;37527:419::-;37693:4;37731:2;37720:9;37716:18;37708:26;;37780:9;37774:4;37770:20;37766:1;37755:9;37751:17;37744:47;37808:131;37934:4;37808:131;:::i;:::-;37800:139;;37527:419;;;:::o;37952:171::-;38092:23;38088:1;38080:6;38076:14;38069:47;37952:171;:::o;38129:366::-;38271:3;38292:67;38356:2;38351:3;38292:67;:::i;:::-;38285:74;;38368:93;38457:3;38368:93;:::i;:::-;38486:2;38481:3;38477:12;38470:19;;38129:366;;;:::o;38501:419::-;38667:4;38705:2;38694:9;38690:18;38682:26;;38754:9;38748:4;38744:20;38740:1;38729:9;38725:17;38718:47;38782:131;38908:4;38782:131;:::i;:::-;38774:139;;38501:419;;;:::o;38926:148::-;39028:11;39065:3;39050:18;;38926:148;;;;:::o;39080:390::-;39186:3;39214:39;39247:5;39214:39;:::i;:::-;39269:89;39351:6;39346:3;39269:89;:::i;:::-;39262:96;;39367:65;39425:6;39420:3;39413:4;39406:5;39402:16;39367:65;:::i;:::-;39457:6;39452:3;39448:16;39441:23;;39190:280;39080:390;;;;:::o;39476:435::-;39656:3;39678:95;39769:3;39760:6;39678:95;:::i;:::-;39671:102;;39790:95;39881:3;39872:6;39790:95;:::i;:::-;39783:102;;39902:3;39895:10;;39476:435;;;;;:::o;39917:169::-;40057:21;40053:1;40045:6;40041:14;40034:45;39917:169;:::o;40092:366::-;40234:3;40255:67;40319:2;40314:3;40255:67;:::i;:::-;40248:74;;40331:93;40420:3;40331:93;:::i;:::-;40449:2;40444:3;40440:12;40433:19;;40092:366;;;:::o;40464:419::-;40630:4;40668:2;40657:9;40653:18;40645:26;;40717:9;40711:4;40707:20;40703:1;40692:9;40688:17;40681:47;40745:131;40871:4;40745:131;:::i;:::-;40737:139;;40464:419;;;:::o;40889:141::-;40938:4;40961:3;40953:11;;40984:3;40981:1;40974:14;41018:4;41015:1;41005:18;40997:26;;40889:141;;;:::o;41036:93::-;41073:6;41120:2;41115;41108:5;41104:14;41100:23;41090:33;;41036:93;;;:::o;41135:107::-;41179:8;41229:5;41223:4;41219:16;41198:37;;41135:107;;;;:::o;41248:393::-;41317:6;41367:1;41355:10;41351:18;41390:97;41420:66;41409:9;41390:97;:::i;:::-;41508:39;41538:8;41527:9;41508:39;:::i;:::-;41496:51;;41580:4;41576:9;41569:5;41565:21;41556:30;;41629:4;41619:8;41615:19;41608:5;41605:30;41595:40;;41324:317;;41248:393;;;;;:::o;41647:60::-;41675:3;41696:5;41689:12;;41647:60;;;:::o;41713:142::-;41763:9;41796:53;41814:34;41823:24;41841:5;41823:24;:::i;:::-;41814:34;:::i;:::-;41796:53;:::i;:::-;41783:66;;41713:142;;;:::o;41861:75::-;41904:3;41925:5;41918:12;;41861:75;;;:::o;41942:269::-;42052:39;42083:7;42052:39;:::i;:::-;42113:91;42162:41;42186:16;42162:41;:::i;:::-;42154:6;42147:4;42141:11;42113:91;:::i;:::-;42107:4;42100:105;42018:193;41942:269;;;:::o;42217:73::-;42262:3;42217:73;:::o;42296:189::-;42373:32;;:::i;:::-;42414:65;42472:6;42464;42458:4;42414:65;:::i;:::-;42349:136;42296:189;;:::o;42491:186::-;42551:120;42568:3;42561:5;42558:14;42551:120;;;42622:39;42659:1;42652:5;42622:39;:::i;:::-;42595:1;42588:5;42584:13;42575:22;;42551:120;;;42491:186;;:::o;42683:543::-;42784:2;42779:3;42776:11;42773:446;;;42818:38;42850:5;42818:38;:::i;:::-;42902:29;42920:10;42902:29;:::i;:::-;42892:8;42888:44;43085:2;43073:10;43070:18;43067:49;;;43106:8;43091:23;;43067:49;43129:80;43185:22;43203:3;43185:22;:::i;:::-;43175:8;43171:37;43158:11;43129:80;:::i;:::-;42788:431;;42773:446;42683:543;;;:::o;43232:117::-;43286:8;43336:5;43330:4;43326:16;43305:37;;43232:117;;;;:::o;43355:169::-;43399:6;43432:51;43480:1;43476:6;43468:5;43465:1;43461:13;43432:51;:::i;:::-;43428:56;43513:4;43507;43503:15;43493:25;;43406:118;43355:169;;;;:::o;43529:295::-;43605:4;43751:29;43776:3;43770:4;43751:29;:::i;:::-;43743:37;;43813:3;43810:1;43806:11;43800:4;43797:21;43789:29;;43529:295;;;;:::o;43829:1395::-;43946:37;43979:3;43946:37;:::i;:::-;44048:18;44040:6;44037:30;44034:56;;;44070:18;;:::i;:::-;44034:56;44114:38;44146:4;44140:11;44114:38;:::i;:::-;44199:67;44259:6;44251;44245:4;44199:67;:::i;:::-;44293:1;44317:4;44304:17;;44349:2;44341:6;44338:14;44366:1;44361:618;;;;45023:1;45040:6;45037:77;;;45089:9;45084:3;45080:19;45074:26;45065:35;;45037:77;45140:67;45200:6;45193:5;45140:67;:::i;:::-;45134:4;45127:81;44996:222;44331:887;;44361:618;44413:4;44409:9;44401:6;44397:22;44447:37;44479:4;44447:37;:::i;:::-;44506:1;44520:208;44534:7;44531:1;44528:14;44520:208;;;44613:9;44608:3;44604:19;44598:26;44590:6;44583:42;44664:1;44656:6;44652:14;44642:24;;44711:2;44700:9;44696:18;44683:31;;44557:4;44554:1;44550:12;44545:17;;44520:208;;;44756:6;44747:7;44744:19;44741:179;;;44814:9;44809:3;44805:19;44799:26;44857:48;44899:4;44891:6;44887:17;44876:9;44857:48;:::i;:::-;44849:6;44842:64;44764:156;44741:179;44966:1;44962;44954:6;44950:14;44946:22;44940:4;44933:36;44368:611;;;44331:887;;43921:1303;;;43829:1395;;:::o;45230:229::-;45370:34;45366:1;45358:6;45354:14;45347:58;45439:12;45434:2;45426:6;45422:15;45415:37;45230:229;:::o;45465:366::-;45607:3;45628:67;45692:2;45687:3;45628:67;:::i;:::-;45621:74;;45704:93;45793:3;45704:93;:::i;:::-;45822:2;45817:3;45813:12;45806:19;;45465:366;;;:::o;45837:419::-;46003:4;46041:2;46030:9;46026:18;46018:26;;46090:9;46084:4;46080:20;46076:1;46065:9;46061:17;46054:47;46118:131;46244:4;46118:131;:::i;:::-;46110:139;;45837:419;;;:::o;46262:175::-;46402:27;46398:1;46390:6;46386:14;46379:51;46262:175;:::o;46443:366::-;46585:3;46606:67;46670:2;46665:3;46606:67;:::i;:::-;46599:74;;46682:93;46771:3;46682:93;:::i;:::-;46800:2;46795:3;46791:12;46784:19;;46443:366;;;:::o;46815:419::-;46981:4;47019:2;47008:9;47004:18;46996:26;;47068:9;47062:4;47058:20;47054:1;47043:9;47039:17;47032:47;47096:131;47222:4;47096:131;:::i;:::-;47088:139;;46815:419;;;:::o;47240:175::-;47380:27;47376:1;47368:6;47364:14;47357:51;47240:175;:::o;47421:366::-;47563:3;47584:67;47648:2;47643:3;47584:67;:::i;:::-;47577:74;;47660:93;47749:3;47660:93;:::i;:::-;47778:2;47773:3;47769:12;47762:19;;47421:366;;;:::o;47793:419::-;47959:4;47997:2;47986:9;47982:18;47974:26;;48046:9;48040:4;48036:20;48032:1;48021:9;48017:17;48010:47;48074:131;48200:4;48074:131;:::i;:::-;48066:139;;47793:419;;;:::o;48218:237::-;48358:34;48354:1;48346:6;48342:14;48335:58;48427:20;48422:2;48414:6;48410:15;48403:45;48218:237;:::o;48461:366::-;48603:3;48624:67;48688:2;48683:3;48624:67;:::i;:::-;48617:74;;48700:93;48789:3;48700:93;:::i;:::-;48818:2;48813:3;48809:12;48802:19;;48461:366;;;:::o;48833:419::-;48999:4;49037:2;49026:9;49022:18;49014:26;;49086:9;49080:4;49076:20;49072:1;49061:9;49057:17;49050:47;49114:131;49240:4;49114:131;:::i;:::-;49106:139;;48833:419;;;:::o;49258:173::-;49398:25;49394:1;49386:6;49382:14;49375:49;49258:173;:::o;49437:402::-;49597:3;49618:85;49700:2;49695:3;49618:85;:::i;:::-;49611:92;;49712:93;49801:3;49712:93;:::i;:::-;49830:2;49825:3;49821:12;49814:19;;49437:402;;;:::o;49845:167::-;49985:19;49981:1;49973:6;49969:14;49962:43;49845:167;:::o;50018:402::-;50178:3;50199:85;50281:2;50276:3;50199:85;:::i;:::-;50192:92;;50293:93;50382:3;50293:93;:::i;:::-;50411:2;50406:3;50402:12;50395:19;;50018:402;;;:::o;50426:967::-;50808:3;50830:148;50974:3;50830:148;:::i;:::-;50823:155;;50995:95;51086:3;51077:6;50995:95;:::i;:::-;50988:102;;51107:148;51251:3;51107:148;:::i;:::-;51100:155;;51272:95;51363:3;51354:6;51272:95;:::i;:::-;51265:102;;51384:3;51377:10;;50426:967;;;;;:::o;51399:166::-;51539:18;51535:1;51527:6;51523:14;51516:42;51399:166;:::o;51571:366::-;51713:3;51734:67;51798:2;51793:3;51734:67;:::i;:::-;51727:74;;51810:93;51899:3;51810:93;:::i;:::-;51928:2;51923:3;51919:12;51912:19;;51571:366;;;:::o;51943:419::-;52109:4;52147:2;52136:9;52132:18;52124:26;;52196:9;52190:4;52186:20;52182:1;52171:9;52167:17;52160:47;52224:131;52350:4;52224:131;:::i;:::-;52216:139;;51943:419;;;:::o;52368:224::-;52508:34;52504:1;52496:6;52492:14;52485:58;52577:7;52572:2;52564:6;52560:15;52553:32;52368:224;:::o;52598:366::-;52740:3;52761:67;52825:2;52820:3;52761:67;:::i;:::-;52754:74;;52837:93;52926:3;52837:93;:::i;:::-;52955:2;52950:3;52946:12;52939:19;;52598:366;;;:::o;52970:419::-;53136:4;53174:2;53163:9;53159:18;53151:26;;53223:9;53217:4;53213:20;53209:1;53198:9;53194:17;53187:47;53251:131;53377:4;53251:131;:::i;:::-;53243:139;;52970:419;;;:::o;53395:223::-;53535:34;53531:1;53523:6;53519:14;53512:58;53604:6;53599:2;53591:6;53587:15;53580:31;53395:223;:::o;53624:366::-;53766:3;53787:67;53851:2;53846:3;53787:67;:::i;:::-;53780:74;;53863:93;53952:3;53863:93;:::i;:::-;53981:2;53976:3;53972:12;53965:19;;53624:366;;;:::o;53996:419::-;54162:4;54200:2;54189:9;54185:18;54177:26;;54249:9;54243:4;54239:20;54235:1;54224:9;54220:17;54213:47;54277:131;54403:4;54277:131;:::i;:::-;54269:139;;53996:419;;;:::o;54421:170::-;54561:22;54557:1;54549:6;54545:14;54538:46;54421:170;:::o;54597:366::-;54739:3;54760:67;54824:2;54819:3;54760:67;:::i;:::-;54753:74;;54836:93;54925:3;54836:93;:::i;:::-;54954:2;54949:3;54945:12;54938:19;;54597:366;;;:::o;54969:419::-;55135:4;55173:2;55162:9;55158:18;55150:26;;55222:9;55216:4;55212:20;55208:1;55197:9;55193:17;55186:47;55250:131;55376:4;55250:131;:::i;:::-;55242:139;;54969:419;;;:::o;55394:182::-;55534:34;55530:1;55522:6;55518:14;55511:58;55394:182;:::o;55582:366::-;55724:3;55745:67;55809:2;55804:3;55745:67;:::i;:::-;55738:74;;55821:93;55910:3;55821:93;:::i;:::-;55939:2;55934:3;55930:12;55923:19;;55582:366;;;:::o;55954:419::-;56120:4;56158:2;56147:9;56143:18;56135:26;;56207:9;56201:4;56197:20;56193:1;56182:9;56178:17;56171:47;56235:131;56361:4;56235:131;:::i;:::-;56227:139;;55954:419;;;:::o;56379:178::-;56519:30;56515:1;56507:6;56503:14;56496:54;56379:178;:::o;56563:366::-;56705:3;56726:67;56790:2;56785:3;56726:67;:::i;:::-;56719:74;;56802:93;56891:3;56802:93;:::i;:::-;56920:2;56915:3;56911:12;56904:19;;56563:366;;;:::o;56935:419::-;57101:4;57139:2;57128:9;57124:18;57116:26;;57188:9;57182:4;57178:20;57174:1;57163:9;57159:17;57152:47;57216:131;57342:4;57216:131;:::i;:::-;57208:139;;56935:419;;;:::o;57360:98::-;57411:6;57445:5;57439:12;57429:22;;57360:98;;;:::o;57464:168::-;57547:11;57581:6;57576:3;57569:19;57621:4;57616:3;57612:14;57597:29;;57464:168;;;;:::o;57638:373::-;57724:3;57752:38;57784:5;57752:38;:::i;:::-;57806:70;57869:6;57864:3;57806:70;:::i;:::-;57799:77;;57885:65;57943:6;57938:3;57931:4;57924:5;57920:16;57885:65;:::i;:::-;57975:29;57997:6;57975:29;:::i;:::-;57970:3;57966:39;57959:46;;57728:283;57638:373;;;;:::o;58017:640::-;58212:4;58250:3;58239:9;58235:19;58227:27;;58264:71;58332:1;58321:9;58317:17;58308:6;58264:71;:::i;:::-;58345:72;58413:2;58402:9;58398:18;58389:6;58345:72;:::i;:::-;58427;58495:2;58484:9;58480:18;58471:6;58427:72;:::i;:::-;58546:9;58540:4;58536:20;58531:2;58520:9;58516:18;58509:48;58574:76;58645:4;58636:6;58574:76;:::i;:::-;58566:84;;58017:640;;;;;;;:::o;58663:141::-;58719:5;58750:6;58744:13;58735:22;;58766:32;58792:5;58766:32;:::i;:::-;58663:141;;;;:::o;58810:349::-;58879:6;58928:2;58916:9;58907:7;58903:23;58899:32;58896:119;;;58934:79;;:::i;:::-;58896:119;59054:1;59079:63;59134:7;59125:6;59114:9;59110:22;59079:63;:::i;:::-;59069:73;;59025:127;58810:349;;;;:::o;59165:171::-;59204:3;59227:24;59245:5;59227:24;:::i;:::-;59218:33;;59273:4;59266:5;59263:15;59260:41;;59281:18;;:::i;:::-;59260:41;59328:1;59321:5;59317:13;59310:20;;59165:171;;;:::o;59342:182::-;59482:34;59478:1;59470:6;59466:14;59459:58;59342:182;:::o;59530:366::-;59672:3;59693:67;59757:2;59752:3;59693:67;:::i;:::-;59686:74;;59769:93;59858:3;59769:93;:::i;:::-;59887:2;59882:3;59878:12;59871:19;;59530:366;;;:::o;59902:419::-;60068:4;60106:2;60095:9;60091:18;60083:26;;60155:9;60149:4;60145:20;60141:1;60130:9;60126:17;60119:47;60183:131;60309:4;60183:131;:::i;:::-;60175:139;;59902:419;;;:::o;60327:162::-;60467:14;60463:1;60455:6;60451:14;60444:38;60327:162;:::o;60495:366::-;60637:3;60658:67;60722:2;60717:3;60658:67;:::i;:::-;60651:74;;60734:93;60823:3;60734:93;:::i;:::-;60852:2;60847:3;60843:12;60836:19;;60495:366;;;:::o;60867:419::-;61033:4;61071:2;61060:9;61056:18;61048:26;;61120:9;61114:4;61110:20;61106:1;61095:9;61091:17;61084:47;61148:131;61274:4;61148:131;:::i;:::-;61140:139;;60867:419;;;:::o;61292:240::-;61432:34;61428:1;61420:6;61416:14;61409:58;61501:23;61496:2;61488:6;61484:15;61477:48;61292:240;:::o;61538:366::-;61680:3;61701:67;61765:2;61760:3;61701:67;:::i;:::-;61694:74;;61777:93;61866:3;61777:93;:::i;:::-;61895:2;61890:3;61886:12;61879:19;;61538:366;;;:::o;61910:419::-;62076:4;62114:2;62103:9;62099:18;62091:26;;62163:9;62157:4;62153:20;62149:1;62138:9;62134:17;62127:47;62191:131;62317:4;62191:131;:::i;:::-;62183:139;;61910:419;;;:::o;62335:194::-;62375:4;62395:20;62413:1;62395:20;:::i;:::-;62390:25;;62429:20;62447:1;62429:20;:::i;:::-;62424:25;;62473:1;62470;62466:9;62458:17;;62497:1;62491:4;62488:11;62485:37;;;62502:18;;:::i;:::-;62485:37;62335:194;;;;:::o;62535:180::-;62583:77;62580:1;62573:88;62680:4;62677:1;62670:15;62704:4;62701:1;62694:15

Swarm Source

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