ETH Price: $3,691.82 (+3.43%)

Token

ERC-20: Boy Soldier (Boy Soldier)
 

Overview

Max Total Supply

0 Boy Soldier

Holders

93

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 Boy Soldier
0x97f20a625a39333be19c93ba163862d4a75935b0
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:
Boy_Soldier

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-11-02
*/

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/interfaces/draft-IERC6093.sol


// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.18;

/**
 * @dev Standard ERC20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
 */
interface IERC20Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC20InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC20InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     * @param allowance Amount of tokens a `spender` is allowed to operate with.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC20InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC20InvalidSpender(address spender);
}

/**
 * @dev Standard ERC721 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.
 */
interface IERC721Errors {
    /**
     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.
     * Used in balance queries.
     * @param owner Address of the current owner of a token.
     */
    error ERC721InvalidOwner(address owner);

    /**
     * @dev Indicates a `tokenId` whose `owner` is the zero address.
     * @param tokenId Identifier number of a token.
     */
    error ERC721NonexistentToken(uint256 tokenId);

    /**
     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param tokenId Identifier number of a token.
     * @param owner Address of the current owner of a token.
     */
    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC721InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC721InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param tokenId Identifier number of a token.
     */
    error ERC721InsufficientApproval(address operator, uint256 tokenId);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC721InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC721InvalidOperator(address operator);
}

/**
 * @dev Standard ERC1155 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.
 */
interface IERC1155Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     * @param tokenId Identifier number of a token.
     */
    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC1155InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC1155InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param owner Address of the current owner of a token.
     */
    error ERC1155MissingApprovalForAll(address operator, address owner);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC1155InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC1155InvalidOperator(address operator);

    /**
     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
     * Used in batch transfers.
     * @param idsLength Length of the array of token identifiers
     * @param valuesLength Length of the array of token amounts
     */
    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}

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


// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol)

pragma solidity ^0.8.18;

/**
 * @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/math/Math.sol


// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol)

pragma solidity ^0.8.18;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Muldiv operation overflow.
     */
    error MathOverflowedMulDiv();

    enum Rounding {
        Floor, // Toward negative infinity
        Ceil, // Toward positive infinity
        Trunc, // Toward zero
        Expand // Away from zero
    }

    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @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 towards infinity instead
     * of rounding towards zero.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        if (b == 0) {
            // Guarantee the same behavior as in a regular Solidity division.
            return a / b;
        }

        // (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 = x * y; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                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.
            if (denominator <= prod1) {
                revert MathOverflowedMulDiv();
            }

            ///////////////////////////////////////////////
            // 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.

            uint256 twos = denominator & (0 - denominator);
            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 (unsignedRoundsUp(rounding) && 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
     * towards zero.
     *
     * 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 + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2 of a positive value rounded towards zero.
     * 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 + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10 of a positive value rounded towards zero.
     * 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 + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256 of a positive value rounded towards zero.
     * 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 + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0);
        }
    }

    /**
     * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.
     */
    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {
        return uint8(rounding) % 2 == 1;
    }
}

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


// OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol)

pragma solidity ^0.8.18;



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

    /**
     * @dev The `value` string doesn't fit in the specified `length`.
     */
    error StringsInsufficientHexLength(uint256 value, uint256 length);

    /**
     * @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), HEX_DIGITS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `int256` to its ASCII `string` decimal representation.
     */
    function toStringSigned(int256 value) internal pure returns (string memory) {
        return string.concat(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) {
        uint256 localValue = value;
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = HEX_DIGITS[localValue & 0xf];
            localValue >>= 4;
        }
        if (localValue != 0) {
            revert StringsInsufficientHexLength(value, length);
        }
        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 bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));
    }
}

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


// OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol)

pragma solidity ^0.8.18;

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

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

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


// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.18;


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

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

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

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

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

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


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.18;

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

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


// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)

pragma solidity ^0.8.18;

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

// File: @openzeppelin/contracts/interfaces/IERC2981.sol


// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.18;


/**
 * @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.
 */
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/interfaces/IERC165.sol


// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)

pragma solidity ^0.8.18;


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


// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)

pragma solidity ^0.8.18;


/**
 * @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);
 * }
 * ```
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/token/common/ERC2981.sol


// OpenZeppelin Contracts (last updated v5.0.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.18;



/**
 * @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.
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

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

    /**
     * @dev The default royalty set is invalid (eg. (numerator / denominator) >= 1).
     */
    error ERC2981InvalidDefaultRoyalty(uint256 numerator, uint256 denominator);

    /**
     * @dev The default royalty receiver is invalid.
     */
    error ERC2981InvalidDefaultRoyaltyReceiver(address receiver);

    /**
     * @dev The royalty set for an specific `tokenId` is invalid (eg. (numerator / denominator) >= 1).
     */
    error ERC2981InvalidTokenRoyalty(uint256 tokenId, uint256 numerator, uint256 denominator);

    /**
     * @dev The royalty receiver for `tokenId` is invalid.
     */
    error ERC2981InvalidTokenRoyaltyReceiver(uint256 tokenId, address receiver);

    /**
     * @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 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 {
        uint256 denominator = _feeDenominator();
        if (feeNumerator > denominator) {
            // Royalty fee will exceed the sale price
            revert ERC2981InvalidDefaultRoyalty(feeNumerator, denominator);
        }
        if (receiver == address(0)) {
            revert ERC2981InvalidDefaultRoyaltyReceiver(address(0));
        }

        _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 {
        uint256 denominator = _feeDenominator();
        if (feeNumerator > denominator) {
            // Royalty fee will exceed the sale price
            revert ERC2981InvalidTokenRoyalty(tokenId, feeNumerator, denominator);
        }
        if (receiver == address(0)) {
            revert ERC2981InvalidTokenRoyaltyReceiver(tokenId, address(0));
        }

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

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

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


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.18;


/**
 * @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 address zero.
     *
     * 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/interfaces/IERC721.sol


// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC721.sol)

pragma solidity ^0.8.18;


// File: @openzeppelin/contracts/interfaces/IERC4906.sol


// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC4906.sol)

pragma solidity ^0.8.18;



/// @title EIP-721 Metadata Update Extension
interface IERC4906 is IERC165, IERC721 {
    /// @dev This event emits when the metadata of a token is changed.
    /// So that the third-party platforms such as NFT market could
    /// timely update the images and related attributes of the NFT.
    event MetadataUpdate(uint256 _tokenId);

    /// @dev This event emits when the metadata of a range of tokens is changed.
    /// So that the third-party platforms such as NFT market could
    /// timely update the images and related attributes of the NFTs.
    event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId);
}

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


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.18;


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

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

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

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


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.18;








/**
 * @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}.
 */
abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Errors {
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    mapping(uint256 tokenId => address) private _owners;

    mapping(address owner => uint256) private _balances;

    mapping(uint256 tokenId => address) private _tokenApprovals;

    mapping(address owner => mapping(address operator => 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 returns (uint256) {
        if (owner == address(0)) {
            revert ERC721InvalidOwner(address(0));
        }
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual returns (address) {
        return _requireOwned(tokenId);
    }

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

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

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

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string.concat(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 {
        _approve(to, tokenId, _msgSender());
    }

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

        return _getApproved(tokenId);
    }

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(address from, address to, uint256 tokenId) public virtual {
        if (to == address(0)) {
            revert ERC721InvalidReceiver(address(0));
        }
        // Setting an "auth" arguments enables the `_isAuthorized` check which verifies that the token exists
        // (from != 0). Therefore, it is not needed to verify that the return value is not 0 here.
        address previousOwner = _update(to, tokenId, _msgSender());
        if (previousOwner != from) {
            revert ERC721IncorrectOwner(from, tokenId, previousOwner);
        }
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual {
        transferFrom(from, to, tokenId);
        _checkOnERC721Received(from, to, tokenId, data);
    }

    /**
     * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist
     *
     * IMPORTANT: Any overrides to this function that add ownership of tokens not tracked by the
     * core ERC721 logic MUST be matched with the use of {_increaseBalance} to keep balances
     * consistent with ownership. The invariant to preserve is 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`.
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

    /**
     * @dev Returns the approved address for `tokenId`. Returns 0 if `tokenId` is not minted.
     */
    function _getApproved(uint256 tokenId) internal view virtual returns (address) {
        return _tokenApprovals[tokenId];
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `owner`'s tokens, or `tokenId` in
     * particular (ignoring whether it is owned by `owner`).
     *
     * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this
     * assumption.
     */
    function _isAuthorized(address owner, address spender, uint256 tokenId) internal view virtual returns (bool) {
        return
            spender != address(0) &&
            (owner == spender || isApprovedForAll(owner, spender) || _getApproved(tokenId) == spender);
    }

    /**
     * @dev Checks if `spender` can operate on `tokenId`, assuming the provided `owner` is the actual owner.
     * Reverts if `spender` does not have approval from the provided `owner` for the given token or for all its assets
     * the `spender` for the specific `tokenId`.
     *
     * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this
     * assumption.
     */
    function _checkAuthorized(address owner, address spender, uint256 tokenId) internal view virtual {
        if (!_isAuthorized(owner, spender, tokenId)) {
            if (owner == address(0)) {
                revert ERC721NonexistentToken(tokenId);
            } else {
                revert ERC721InsufficientApproval(spender, tokenId);
            }
        }
    }

    /**
     * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override.
     *
     * NOTE: the value is limited to type(uint128).max. This protect against _balance overflow. It is unrealistic that
     * a uint256 would ever overflow from increments when these increments are bounded to uint128 values.
     *
     * WARNING: Increasing an account's balance using this function tends to be paired with an override of the
     * {_ownerOf} function to resolve the ownership of the corresponding tokens so that balances and ownership
     * remain consistent with one another.
     */
    function _increaseBalance(address account, uint128 value) internal virtual {
        unchecked {
            _balances[account] += value;
        }
    }

    /**
     * @dev Transfers `tokenId` from its current owner to `to`, or alternatively mints (or burns) if the current owner
     * (or `to`) is the zero address. Returns the owner of the `tokenId` before the update.
     *
     * The `auth` argument is optional. If the value passed is non 0, then this function will check that
     * `auth` is either the owner of the token, or approved to operate on the token (by the owner).
     *
     * Emits a {Transfer} event.
     *
     * NOTE: If overriding this function in a way that tracks balances, see also {_increaseBalance}.
     */
    function _update(address to, uint256 tokenId, address auth) internal virtual returns (address) {
        address from = _ownerOf(tokenId);

        // Perform (optional) operator check
        if (auth != address(0)) {
            _checkAuthorized(from, auth, tokenId);
        }

        // Execute the update
        if (from != address(0)) {
            // Clear approval. No need to re-authorize or emit the Approval event
            _approve(address(0), tokenId, address(0), false);

            unchecked {
                _balances[from] -= 1;
            }
        }

        if (to != address(0)) {
            unchecked {
                _balances[to] += 1;
            }
        }

        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        return from;
    }

    /**
     * @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 {
        if (to == address(0)) {
            revert ERC721InvalidReceiver(address(0));
        }
        address previousOwner = _update(to, tokenId, address(0));
        if (previousOwner != address(0)) {
            revert ERC721InvalidSender(address(0));
        }
    }

    /**
     * @dev Mints `tokenId`, transfers it to `to` and checks for `to` acceptance.
     *
     * 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 {
        _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);
        _checkOnERC721Received(address(0), to, tokenId, data);
    }

    /**
     * @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 {
        address previousOwner = _update(address(0), tokenId, address(0));
        if (previousOwner == address(0)) {
            revert ERC721NonexistentToken(tokenId);
        }
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(address from, address to, uint256 tokenId) internal {
        if (to == address(0)) {
            revert ERC721InvalidReceiver(address(0));
        }
        address previousOwner = _update(to, tokenId, address(0));
        if (previousOwner == address(0)) {
            revert ERC721NonexistentToken(tokenId);
        } else if (previousOwner != from) {
            revert ERC721IncorrectOwner(from, tokenId, previousOwner);
        }
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking that contract recipients
     * are aware of the ERC721 standard 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 like {safeTransferFrom} in the sense that it invokes
     * {IERC721Receiver-onERC721Received} on the receiver, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `tokenId` token must exist and be owned by `from`.
     * - `to` cannot be the zero address.
     * - `from` cannot be the zero address.
     * - 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) internal {
        _safeTransfer(from, to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeTransfer-address-address-uint256-}[`_safeTransfer`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual {
        _transfer(from, to, tokenId);
        _checkOnERC721Received(from, to, tokenId, data);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * The `auth` argument is optional. If the value passed is non 0, then this function will check that `auth` is
     * either the owner of the token, or approved to operate on all tokens held by this owner.
     *
     * Emits an {Approval} event.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(address to, uint256 tokenId, address auth) internal {
        _approve(to, tokenId, auth, true);
    }

    /**
     * @dev Variant of `_approve` with an optional flag to enable or disable the {Approval} event. The event is not
     * emitted in the context of transfers.
     */
    function _approve(address to, uint256 tokenId, address auth, bool emitEvent) internal virtual {
        // Avoid reading the owner unless necessary
        if (emitEvent || auth != address(0)) {
            address owner = _requireOwned(tokenId);

            // We do not use _isAuthorized because single-token approvals should not be able to call approve
            if (auth != address(0) && owner != auth && !isApprovedForAll(owner, auth)) {
                revert ERC721InvalidApprover(auth);
            }

            if (emitEvent) {
                emit Approval(owner, to, tokenId);
            }
        }

        _tokenApprovals[tokenId] = to;
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Requirements:
     * - operator can't be the address zero.
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {
        if (operator == address(0)) {
            revert ERC721InvalidOperator(operator);
        }
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Reverts if the `tokenId` doesn't have a current owner (it hasn't been minted, or it has been burned).
     * Returns the owner.
     *
     * Overrides to ownership logic should be done to {_ownerOf}.
     */
    function _requireOwned(uint256 tokenId) internal view returns (address) {
        address owner = _ownerOf(tokenId);
        if (owner == address(0)) {
            revert ERC721NonexistentToken(tokenId);
        }
        return owner;
    }

    /**
     * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target address. This will revert if the
     * recipient doesn't accept the token transfer. 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
     */
    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data) private {
        if (to.code.length > 0) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
                if (retval != IERC721Receiver.onERC721Received.selector) {
                    revert ERC721InvalidReceiver(to);
                }
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert ERC721InvalidReceiver(to);
                } else {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        }
    }
}

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


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/ERC721URIStorage.sol)

pragma solidity ^0.8.18;





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

    // Interface ID as defined in ERC-4906. This does not correspond to a traditional interface ID as ERC-4906 only
    // defines events and does not include any external function.
    bytes4 private constant ERC4906_INTERFACE_ID = bytes4(0x49064906);

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

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

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

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

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

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Emits {MetadataUpdate}.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        _tokenURIs[tokenId] = _tokenURI;
        emit MetadataUpdate(tokenId);
    }
}

// File: mainnet/0x52a043Ec29fbB9A1B142b8913A76c0bC592D0849/contracts/redeem.sol


pragma solidity ^0.8.18;





abstract contract OperatorFilterer {
    /// @dev The default OpenSea operator blocklist subscription.
    address internal constant _DEFAULT_SUBSCRIPTION =
        0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6;

    /// @dev The OpenSea operator filter registry.
    address internal constant _OPERATOR_FILTER_REGISTRY =
        0x000000000000AAeB6D7670E522A718067333cd4E;

    /// @dev Registers the current contract to OpenSea's operator filter,
    /// and subscribe to the default OpenSea operator blocklist.
    /// Note: Will not revert nor update existing settings for repeated registration.
    function _registerForOperatorFiltering() internal virtual {
        _registerForOperatorFiltering(_DEFAULT_SUBSCRIPTION, true);
    }

    /// @dev Registers the current contract to OpenSea's operator filter.
    /// Note: Will not revert nor update existing settings for repeated registration.
    function _registerForOperatorFiltering(
        address subscriptionOrRegistrantToCopy,
        bool subscribe
    ) internal virtual {
        /// @solidity memory-safe-assembly
        assembly {
            let functionSelector := 0x7d3e3dbe // `registerAndSubscribe(address,address)`.

            // Clean the upper 96 bits of `subscriptionOrRegistrantToCopy` in case they are dirty.
            subscriptionOrRegistrantToCopy := shr(
                96,
                shl(96, subscriptionOrRegistrantToCopy)
            )
            // prettier-ignore
            for {} iszero(subscribe) {} {
                if iszero(subscriptionOrRegistrantToCopy) {
                    functionSelector := 0x4420e486 // `register(address)`.
                    break
                }
                functionSelector := 0xa0af2903 // `registerAndCopyEntries(address,address)`.
                break
            }
            // Store the function selector.
            mstore(0x00, shl(224, functionSelector))
            // Store the `address(this)`.
            mstore(0x04, address())
            // Store the `subscriptionOrRegistrantToCopy`.
            mstore(0x24, subscriptionOrRegistrantToCopy)
            // Register into the registry.
            pop(
                call(
                    gas(),
                    _OPERATOR_FILTER_REGISTRY,
                    0,
                    0x00,
                    0x44,
                    0x00,
                    0x00
                )
            )
            // Restore the part of the free memory pointer that was overwritten,
            // which is guaranteed to be zero, because of Solidity's memory size limits.
            mstore(0x24, 0)
        }
    }

    /// @dev Modifier to guard a function and revert if `from` is a blocked operator.
    /// Can be turned on / off via `enabled`.
    /// For gas efficiency, you can use tight variable packing to efficiently read / write
    /// the boolean value for `enabled`.
    modifier onlyAllowedOperator(address from, bool enabled) virtual {
        /// @solidity memory-safe-assembly
        assembly {
            // This code prioritizes runtime gas costs on a chain with the registry.
            // As such, we will not use `extcodesize`, but rather abuse the behavior
            // of `staticcall` returning 1 when called on an empty / missing contract,
            // to avoid reverting when a chain does not have the registry.

            if enabled {
                // Check if `from` is not equal to `msg.sender`,
                // discarding the upper 96 bits of `from` in case they are dirty.
                if iszero(eq(shr(96, shl(96, from)), caller())) {
                    // Store the function selector of `isOperatorAllowed(address,address)`,
                    // shifted left by 6 bytes, which is enough for 8tb of memory.
                    // We waste 6-3 = 3 bytes to save on 6 runtime gas (PUSH1 0x224 SHL).
                    mstore(0x00, 0xc6171134001122334455)
                    // Store the `address(this)`.
                    mstore(0x1a, address())
                    // Store the `msg.sender`.
                    mstore(0x3a, caller())

                    // `isOperatorAllowed` always returns true if it does not revert.
                    if iszero(
                        staticcall(
                            gas(),
                            _OPERATOR_FILTER_REGISTRY,
                            0x16,
                            0x44,
                            0x00,
                            0x00
                        )
                    ) {
                        // Bubble up the revert if the staticcall reverts.
                        returndatacopy(0x00, 0x00, returndatasize())
                        revert(0x00, returndatasize())
                    }

                    // We'll skip checking if `from` is inside the blacklist.
                    // Even though that can block transferring out of wrapper contracts,
                    // we don't want tokens to be stuck.

                    // Restore the part of the free memory pointer that was overwritten,
                    // which is guaranteed to be zero, if less than 8tb of memory is used.
                    mstore(0x3a, 0)
                }
            }
        }
        _;
    }

    /// @dev Modifier to guard a function from approving a blocked operator.
    /// Can be turned on / off via `enabled`.
    /// For efficiency, you can use tight variable packing to efficiently read / write
    /// the boolean value for `enabled`.
    modifier onlyAllowedOperatorApproval(address operator, bool enabled)
        virtual {
        /// @solidity memory-safe-assembly
        assembly {
            // For more information on the optimization techniques used,
            // see the comments in `onlyAllowedOperator`.

            if enabled {
                // Store the function selector of `isOperatorAllowed(address,address)`,
                mstore(0x00, 0xc6171134001122334455)
                // Store the `address(this)`.
                mstore(0x1a, address())
                // Store the `operator`, discarding the upper 96 bits in case they are dirty.
                mstore(0x3a, shr(96, shl(96, operator)))

                // `isOperatorAllowed` always returns true if it does not revert.
                if iszero(
                    staticcall(
                        gas(),
                        _OPERATOR_FILTER_REGISTRY,
                        0x16,
                        0x44,
                        0x00,
                        0x00
                    )
                ) {
                    // Bubble up the revert if the staticcall reverts.
                    returndatacopy(0x00, 0x00, returndatasize())
                    revert(0x00, returndatasize())
                }

                // Restore the part of the free memory pointer that was overwritten.
                mstore(0x3a, 0)
            }
        }
        _;
    }
}

error WithdrawFailed();

contract Boy_Soldier is
    ERC721,
    ERC721URIStorage,
    ERC2981,
    OperatorFilterer,
    Ownable
{
    bool public operatorFilteringEnabled;
    bool public enableRedeem = false;
    address private craftingContract;
    uint256 public redeemFee = 0.034 ether;
    string baseURI;
    mapping(uint256 => bool) public redeemedTokens;
    mapping(address => uint256) public userRedeemed;

    constructor(address initialOwner, address royalityReciever, uint96 royality)
        ERC721("Boy Soldier", "Boy Soldier")
        Ownable(initialOwner)
    {
        _registerForOperatorFiltering();
        operatorFilteringEnabled = true;
        _setDefaultRoyalty(royalityReciever, royality);
    }

    function publicMint(
        address to,
        uint256 tokenId,
        string memory uri
    ) public {
        require(msg.sender == craftingContract, "You are not authorized");
        _safeMint(to, tokenId);
        _setTokenURI(tokenId, uri);
    }

    function redeem(uint256 tokenId) public payable {
        require(enableRedeem == true, "You can't redeem at this time");
        require(!redeemedTokens[tokenId], "Token already redeemed");
        address tokenOwner = ownerOf(tokenId);
        require(msg.sender == tokenOwner, "You are not the owner");

        require(msg.value >= redeemFee, "Value is not sufficient");

        uint256 extraAmount = msg.value - redeemFee;
        if (extraAmount > 0) {
            payable(msg.sender).transfer(extraAmount);
        }

        // Mark the token as redeemed
        redeemedTokens[tokenId] = true;
        userRedeemed[msg.sender] ++;
        _setTokenURI(tokenId, baseURI);
    }

    function remainItems(address user) public view returns (uint256){
        uint256 i = balanceOf(user) - userRedeemed[user];
        return i;
    }

    function setCraftingContract(address _contract) external onlyOwner {
        craftingContract = _contract;
    }

    function setBaseUri(string memory _uri) external onlyOwner {
        baseURI = _uri;
    }

    function setTokenUri(uint256 id, string memory _URI) external onlyOwner{
        _setTokenURI(id, _URI);
    }

    function setRedeemFee(uint256 _fee) external onlyOwner{
        redeemFee = _fee;
    }

    function setRedeemStatus(bool _setStatus) external onlyOwner{
        enableRedeem = _setStatus;
    }

    /**
     * @notice Withdraw all ETH sent to the contract
     */
    function withdraw() external onlyOwner {
        (bool success, ) = payable(msg.sender).call{
            value: address(this).balance
        }("");
        if (!success) revert WithdrawFailed();
    }

    // The following functions are overrides required by Solidity.

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }

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

    /**
     * @notice Set the state of the OpenSea operator filter
     * @param value Flag indicating if the operator filter should be applied to transfers and approvals
     */
    function setOperatorFilteringEnabled(bool value) external onlyOwner {
        operatorFilteringEnabled = value;
    }

    /**
     * @notice Set new royalties settings for the collection
     * @param receiver Address to receive royalties
     * @param royaltyFraction Royalty fee respective to fee denominator (10_000)
     */
    function setRoyalties(address receiver, uint96 royaltyFraction)
        external
        onlyOwner
    {
        _setDefaultRoyalty(receiver, royaltyFraction);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"initialOwner","type":"address"},{"internalType":"address","name":"royalityReciever","type":"address"},{"internalType":"uint96","name":"royality","type":"uint96"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"ERC2981InvalidDefaultRoyalty","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC2981InvalidDefaultRoyaltyReceiver","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"ERC2981InvalidTokenRoyalty","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC2981InvalidTokenRoyaltyReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721IncorrectOwner","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721InsufficientApproval","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC721InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"ERC721InvalidOperator","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721InvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC721InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC721InvalidSender","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonexistentToken","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"WithdrawFailed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_toTokenId","type":"uint256"}],"name":"BatchMetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"MetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableRedeem","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilteringEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"publicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"redeem","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"redeemFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redeemedTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"remainItems","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","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":"_uri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"setCraftingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setOperatorFilteringEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setRedeemFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_setStatus","type":"bool"}],"name":"setRedeemStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"royaltyFraction","type":"uint96"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"_URI","type":"string"}],"name":"setTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userRedeemed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600960156101000a81548160ff0219169083151502179055506678cad1e25d0000600b553480156200003757600080fd5b50604051620043d2380380620043d283398181016040528101906200005d91906200057b565b826040518060400160405280600b81526020017f426f7920536f6c646965720000000000000000000000000000000000000000008152506040518060400160405280600b81526020017f426f7920536f6c646965720000000000000000000000000000000000000000008152508160009081620000db919062000851565b508060019081620000ed919062000851565b505050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620001655760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016200015c919062000949565b60405180910390fd5b6200017681620001bd60201b60201c565b50620001876200028360201b60201c565b6001600960146101000a81548160ff021916908315150217905550620001b48282620002ac60201b60201c565b505050620009dd565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002aa733cc6cdda760b79bafa08df41ecfa224f810dceb660016200045c60201b60201c565b565b6000620002be620004be60201b60201c565b6bffffffffffffffffffffffff16905080826bffffffffffffffffffffffff161115620003265781816040517f6f483d090000000000000000000000000000000000000000000000000000000081526004016200031d929190620009b0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036200039b5760006040517fb6d9900a00000000000000000000000000000000000000000000000000000000815260040162000392919062000949565b60405180910390fd5b60405180604001604052808473ffffffffffffffffffffffffffffffffffffffff168152602001836bffffffffffffffffffffffff16815250600760008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550905050505050565b637d3e3dbe8260601b60601c9250816200048b57826200048357634420e48690506200048b565b63a0af290390505b8060e01b600052306004528260245260008060446000806daaeb6d7670e522a718067333cd4e5af1506000602452505050565b6000612710905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620004fa82620004cd565b9050919050565b6200050c81620004ed565b81146200051857600080fd5b50565b6000815190506200052c8162000501565b92915050565b60006bffffffffffffffffffffffff82169050919050565b620005558162000532565b81146200056157600080fd5b50565b60008151905062000575816200054a565b92915050565b600080600060608486031215620005975762000596620004c8565b5b6000620005a7868287016200051b565b9350506020620005ba868287016200051b565b9250506040620005cd8682870162000564565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200065957607f821691505b6020821081036200066f576200066e62000611565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620006d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200069a565b620006e586836200069a565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620007326200072c6200072684620006fd565b62000707565b620006fd565b9050919050565b6000819050919050565b6200074e8362000711565b620007666200075d8262000739565b848454620006a7565b825550505050565b600090565b6200077d6200076e565b6200078a81848462000743565b505050565b5b81811015620007b257620007a660008262000773565b60018101905062000790565b5050565b601f8211156200080157620007cb8162000675565b620007d6846200068a565b81016020851015620007e6578190505b620007fe620007f5856200068a565b8301826200078f565b50505b505050565b600082821c905092915050565b6000620008266000198460080262000806565b1980831691505092915050565b600062000841838362000813565b9150826002028217905092915050565b6200085c82620005d7565b67ffffffffffffffff811115620008785762000877620005e2565b5b62000884825462000640565b62000891828285620007b6565b600060209050601f831160018114620008c95760008415620008b4578287015190505b620008c0858262000833565b86555062000930565b601f198416620008d98662000675565b60005b828110156200090357848901518255600182019150602085019450602081019050620008dc565b868310156200092357848901516200091f601f89168262000813565b8355505b6001600288020188555050505b505050505050565b6200094381620004ed565b82525050565b600060208201905062000960600083018462000938565b92915050565b600062000987620009816200097b8462000532565b62000707565b620006fd565b9050919050565b620009998162000966565b82525050565b620009aa81620006fd565b82525050565b6000604082019050620009c760008301856200098e565b620009d660208301846200099f565b9392505050565b6139e580620009ed6000396000f3fe6080604052600436106101ee5760003560e01c80638da5cb5b1161010d578063b884f3f2116100a0578063db006a751161006f578063db006a751461070a578063deffe7f814610726578063e985e9c51461074f578063f2fde38b1461078c578063fb796e6c146107b5576101ee565b8063b884f3f21461063e578063b88d4fde1461067b578063c21b471b146106a4578063c87b56dd146106cd576101ee565b8063a0bcfc7f116100dc578063a0bcfc7f1461059a578063a22cb465146105c3578063a53cd3b1146105ec578063b7c0b8e814610615576101ee565b80638da5cb5b146104dc57806395d89b4114610507578063965fa21e146105325780639f477d741461055d576101ee565b806342842e0e116101855780636352211e116101545780636352211e1461042257806370a082311461045f578063715018a61461049c57806384ff3382146104b3576101ee565b806342842e0e1461036a5780634f4602da1461039357806357f7789e146103d05780635d841af5146103f9576101ee565b8063095ea7b3116101c1578063095ea7b3146102c357806323b872dd146102ec5780632a55205a146103155780633ccfd60b14610353576101ee565b806301ffc9a7146101f3578063061873e81461023057806306fdde031461025b578063081812fc14610286575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190612931565b6107e0565b6040516102279190612979565b60405180910390f35b34801561023c57600080fd5b506102456107f2565b6040516102529190612979565b60405180910390f35b34801561026757600080fd5b50610270610805565b60405161027d9190612a24565b60405180910390f35b34801561029257600080fd5b506102ad60048036038101906102a89190612a7c565b610897565b6040516102ba9190612aea565b60405180910390f35b3480156102cf57600080fd5b506102ea60048036038101906102e59190612b31565b6108b3565b005b3480156102f857600080fd5b50610313600480360381019061030e9190612b71565b6108c9565b005b34801561032157600080fd5b5061033c60048036038101906103379190612bc4565b6109cb565b60405161034a929190612c13565b60405180910390f35b34801561035f57600080fd5b50610368610bb5565b005b34801561037657600080fd5b50610391600480360381019061038c9190612b71565b610c63565b005b34801561039f57600080fd5b506103ba60048036038101906103b59190612a7c565b610c83565b6040516103c79190612979565b60405180910390f35b3480156103dc57600080fd5b506103f760048036038101906103f29190612d71565b610ca3565b005b34801561040557600080fd5b50610420600480360381019061041b9190612a7c565b610cb9565b005b34801561042e57600080fd5b5061044960048036038101906104449190612a7c565b610ccb565b6040516104569190612aea565b60405180910390f35b34801561046b57600080fd5b5061048660048036038101906104819190612dcd565b610cdd565b6040516104939190612dfa565b60405180910390f35b3480156104a857600080fd5b506104b1610d97565b005b3480156104bf57600080fd5b506104da60048036038101906104d59190612dcd565b610dab565b005b3480156104e857600080fd5b506104f1610df7565b6040516104fe9190612aea565b60405180910390f35b34801561051357600080fd5b5061051c610e21565b6040516105299190612a24565b60405180910390f35b34801561053e57600080fd5b50610547610eb3565b6040516105549190612dfa565b60405180910390f35b34801561056957600080fd5b50610584600480360381019061057f9190612dcd565b610eb9565b6040516105919190612dfa565b60405180910390f35b3480156105a657600080fd5b506105c160048036038101906105bc9190612e15565b610ed1565b005b3480156105cf57600080fd5b506105ea60048036038101906105e59190612e8a565b610eec565b005b3480156105f857600080fd5b50610613600480360381019061060e9190612eca565b610f02565b005b34801561062157600080fd5b5061063c60048036038101906106379190612f39565b610fab565b005b34801561064a57600080fd5b5061066560048036038101906106609190612dcd565b610fd0565b6040516106729190612dfa565b60405180910390f35b34801561068757600080fd5b506106a2600480360381019061069d9190613007565b611031565b005b3480156106b057600080fd5b506106cb60048036038101906106c691906130ce565b61104e565b005b3480156106d957600080fd5b506106f460048036038101906106ef9190612a7c565b611064565b6040516107019190612a24565b60405180910390f35b610724600480360381019061071f9190612a7c565b611076565b005b34801561073257600080fd5b5061074d60048036038101906107489190612f39565b61136a565b005b34801561075b57600080fd5b506107766004803603810190610771919061310e565b61138f565b6040516107839190612979565b60405180910390f35b34801561079857600080fd5b506107b360048036038101906107ae9190612dcd565b611423565b005b3480156107c157600080fd5b506107ca6114a9565b6040516107d79190612979565b60405180910390f35b60006107eb826114bc565b9050919050565b600960159054906101000a900460ff1681565b6060600080546108149061317d565b80601f01602080910402602001604051908101604052809291908181526020018280546108409061317d565b801561088d5780601f106108625761010080835404028352916020019161088d565b820191906000526020600020905b81548152906001019060200180831161087057829003601f168201915b5050505050905090565b60006108a282611536565b506108ac826115be565b9050919050565b6108c582826108c06115fb565b611603565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361093b5760006040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016109329190612aea565b60405180910390fd5b600061094f838361094a6115fb565b611615565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109c5578382826040517f64283d7b0000000000000000000000000000000000000000000000000000000081526004016109bc939291906131ae565b60405180910390fd5b50505050565b6000806000600860008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610b605760076040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610b6a61182f565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610b969190613214565b610ba09190613285565b90508160000151819350935050509250929050565b610bbd611839565b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610be3906132e7565b60006040518083038185875af1925050503d8060008114610c20576040519150601f19603f3d011682016040523d82523d6000602084013e610c25565b606091505b5050905080610c60576040517f750b219c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b610c7e83838360405180602001604052806000815250611031565b505050565b600d6020528060005260406000206000915054906101000a900460ff1681565b610cab611839565b610cb582826118c0565b5050565b610cc1611839565b80600b8190555050565b6000610cd682611536565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d505760006040517f89c62b64000000000000000000000000000000000000000000000000000000008152600401610d479190612aea565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d9f611839565b610da9600061191c565b565b610db3611839565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610e309061317d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5c9061317d565b8015610ea95780601f10610e7e57610100808354040283529160200191610ea9565b820191906000526020600020905b815481529060010190602001808311610e8c57829003601f168201915b5050505050905090565b600b5481565b600e6020528060005260406000206000915090505481565b610ed9611839565b80600c9081610ee891906134a8565b5050565b610efe610ef76115fb565b83836119e2565b5050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f89906135c6565b60405180910390fd5b610f9c8383611b51565b610fa682826118c0565b505050565b610fb3611839565b80600960146101000a81548160ff02191690831515021790555050565b600080600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461101c84610cdd565b61102691906135e6565b905080915050919050565b61103c8484846108c9565b61104884848484611b6f565b50505050565b611056611839565b6110608282611d26565b5050565b606061106f82611ec8565b9050919050565b60011515600960159054906101000a900460ff161515146110cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c390613666565b60405180910390fd5b600d600082815260200190815260200160002060009054906101000a900460ff161561112d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611124906136d2565b60405180910390fd5b600061113882610ccb565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119f9061373e565b60405180910390fd5b600b543410156111ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e4906137aa565b60405180910390fd5b6000600b54346111fd91906135e6565b90506000811115611250573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561124e573d6000803e3d6000fd5b505b6001600d600085815260200190815260200160002060006101000a81548160ff021916908315150217905550600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906112cc906137ca565b919050555061136583600c80546112e29061317d565b80601f016020809104026020016040519081016040528092919081815260200182805461130e9061317d565b801561135b5780601f106113305761010080835404028352916020019161135b565b820191906000526020600020905b81548152906001019060200180831161133e57829003601f168201915b50505050506118c0565b505050565b611372611839565b80600960156101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61142b611839565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361149d5760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016114949190612aea565b60405180910390fd5b6114a68161191c565b50565b600960149054906101000a900460ff1681565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061152f575061152e82611fdb565b5b9050919050565b6000806115428361203c565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036115b557826040517f7e2732890000000000000000000000000000000000000000000000000000000081526004016115ac9190612dfa565b60405180910390fd5b80915050919050565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600033905090565b6116108383836001612079565b505050565b6000806116218461203c565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146116635761166281848661223e565b5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146116f4576116a5600085600080612079565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614611777576001600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b846002600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b6000612710905090565b6118416115fb565b73ffffffffffffffffffffffffffffffffffffffff1661185f610df7565b73ffffffffffffffffffffffffffffffffffffffff16146118be576118826115fb565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016118b59190612aea565b60405180910390fd5b565b806006600084815260200190815260200160002090816118e091906134a8565b507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7826040516119109190612dfa565b60405180910390a15050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a5357816040517f5b08ba18000000000000000000000000000000000000000000000000000000008152600401611a4a9190612aea565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b449190612979565b60405180910390a3505050565b611b6b828260405180602001604052806000815250612302565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff163b1115611d20578273ffffffffffffffffffffffffffffffffffffffff1663150b7a02611bb36115fb565b8685856040518563ffffffff1660e01b8152600401611bd59493929190613867565b6020604051808303816000875af1925050508015611c1157506040513d601f19601f82011682018060405250810190611c0e91906138c8565b60015b611c95573d8060008114611c41576040519150601f19603f3d011682016040523d82523d6000602084013e611c46565b606091505b506000815103611c8d57836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401611c849190612aea565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611d1e57836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401611d159190612aea565b60405180910390fd5b505b50505050565b6000611d3061182f565b6bffffffffffffffffffffffff16905080826bffffffffffffffffffffffff161115611d955781816040517f6f483d09000000000000000000000000000000000000000000000000000000008152600401611d8c929190613926565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611e075760006040517fb6d9900a000000000000000000000000000000000000000000000000000000008152600401611dfe9190612aea565b60405180910390fd5b60405180604001604052808473ffffffffffffffffffffffffffffffffffffffff168152602001836bffffffffffffffffffffffff16815250600760008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550905050505050565b6060611ed382611536565b506000600660008481526020019081526020016000208054611ef49061317d565b80601f0160208091040260200160405190810160405280929190818152602001828054611f209061317d565b8015611f6d5780601f10611f4257610100808354040283529160200191611f6d565b820191906000526020600020905b815481529060010190602001808311611f5057829003601f168201915b505050505090506000611f7e61231e565b90506000815103611f93578192505050611fd6565b600082511115611fc8578082604051602001611fb092919061398b565b60405160208183030381529060405292505050611fd6565b611fd184612335565b925050505b919050565b6000634906490660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061203557506120348261239e565b5b9050919050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b80806120b25750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156121e65760006120c284611536565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561212d57508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b8015612140575061213e818461138f565b155b1561218257826040517fa9fbf51f0000000000000000000000000000000000000000000000000000000081526004016121799190612aea565b60405180910390fd5b81156121e457838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b836004600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b612249838383612480565b6122fd57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036122be57806040517f7e2732890000000000000000000000000000000000000000000000000000000081526004016122b59190612dfa565b60405180910390fd5b81816040517f177e802f0000000000000000000000000000000000000000000000000000000081526004016122f4929190612c13565b60405180910390fd5b505050565b61230c8383612541565b6123196000848484611b6f565b505050565b606060405180602001604052806000815250905090565b606061234082611536565b50600061234b61231e565b9050600081511161236b5760405180602001604052806000815250612396565b806123758461263a565b60405160200161238692919061398b565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061246957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612479575061247882612708565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561253857508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806124f957506124f8848461138f565b5b8061253757508273ffffffffffffffffffffffffffffffffffffffff1661251f836115be565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036125b35760006040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016125aa9190612aea565b60405180910390fd5b60006125c183836000611615565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146126355760006040517f73c6ac6e00000000000000000000000000000000000000000000000000000000815260040161262c9190612aea565b60405180910390fd5b505050565b60606000600161264984612772565b01905060008167ffffffffffffffff81111561266857612667612c46565b5b6040519080825280601f01601f19166020018201604052801561269a5781602001600182028036833780820191505090505b509050600082602001820190505b6001156126fd578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816126f1576126f0613256565b5b049450600085036126a8575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106127d0577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816127c6576127c5613256565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061280d576d04ee2d6d415b85acef8100000000838161280357612802613256565b5b0492506020810190505b662386f26fc10000831061283c57662386f26fc10000838161283257612831613256565b5b0492506010810190505b6305f5e1008310612865576305f5e100838161285b5761285a613256565b5b0492506008810190505b612710831061288a5761271083816128805761287f613256565b5b0492506004810190505b606483106128ad57606483816128a3576128a2613256565b5b0492506002810190505b600a83106128bc576001810190505b80915050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61290e816128d9565b811461291957600080fd5b50565b60008135905061292b81612905565b92915050565b600060208284031215612947576129466128cf565b5b60006129558482850161291c565b91505092915050565b60008115159050919050565b6129738161295e565b82525050565b600060208201905061298e600083018461296a565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156129ce5780820151818401526020810190506129b3565b60008484015250505050565b6000601f19601f8301169050919050565b60006129f682612994565b612a00818561299f565b9350612a108185602086016129b0565b612a19816129da565b840191505092915050565b60006020820190508181036000830152612a3e81846129eb565b905092915050565b6000819050919050565b612a5981612a46565b8114612a6457600080fd5b50565b600081359050612a7681612a50565b92915050565b600060208284031215612a9257612a916128cf565b5b6000612aa084828501612a67565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ad482612aa9565b9050919050565b612ae481612ac9565b82525050565b6000602082019050612aff6000830184612adb565b92915050565b612b0e81612ac9565b8114612b1957600080fd5b50565b600081359050612b2b81612b05565b92915050565b60008060408385031215612b4857612b476128cf565b5b6000612b5685828601612b1c565b9250506020612b6785828601612a67565b9150509250929050565b600080600060608486031215612b8a57612b896128cf565b5b6000612b9886828701612b1c565b9350506020612ba986828701612b1c565b9250506040612bba86828701612a67565b9150509250925092565b60008060408385031215612bdb57612bda6128cf565b5b6000612be985828601612a67565b9250506020612bfa85828601612a67565b9150509250929050565b612c0d81612a46565b82525050565b6000604082019050612c286000830185612adb565b612c356020830184612c04565b9392505050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612c7e826129da565b810181811067ffffffffffffffff82111715612c9d57612c9c612c46565b5b80604052505050565b6000612cb06128c5565b9050612cbc8282612c75565b919050565b600067ffffffffffffffff821115612cdc57612cdb612c46565b5b612ce5826129da565b9050602081019050919050565b82818337600083830152505050565b6000612d14612d0f84612cc1565b612ca6565b905082815260208101848484011115612d3057612d2f612c41565b5b612d3b848285612cf2565b509392505050565b600082601f830112612d5857612d57612c3c565b5b8135612d68848260208601612d01565b91505092915050565b60008060408385031215612d8857612d876128cf565b5b6000612d9685828601612a67565b925050602083013567ffffffffffffffff811115612db757612db66128d4565b5b612dc385828601612d43565b9150509250929050565b600060208284031215612de357612de26128cf565b5b6000612df184828501612b1c565b91505092915050565b6000602082019050612e0f6000830184612c04565b92915050565b600060208284031215612e2b57612e2a6128cf565b5b600082013567ffffffffffffffff811115612e4957612e486128d4565b5b612e5584828501612d43565b91505092915050565b612e678161295e565b8114612e7257600080fd5b50565b600081359050612e8481612e5e565b92915050565b60008060408385031215612ea157612ea06128cf565b5b6000612eaf85828601612b1c565b9250506020612ec085828601612e75565b9150509250929050565b600080600060608486031215612ee357612ee26128cf565b5b6000612ef186828701612b1c565b9350506020612f0286828701612a67565b925050604084013567ffffffffffffffff811115612f2357612f226128d4565b5b612f2f86828701612d43565b9150509250925092565b600060208284031215612f4f57612f4e6128cf565b5b6000612f5d84828501612e75565b91505092915050565b600067ffffffffffffffff821115612f8157612f80612c46565b5b612f8a826129da565b9050602081019050919050565b6000612faa612fa584612f66565b612ca6565b905082815260208101848484011115612fc657612fc5612c41565b5b612fd1848285612cf2565b509392505050565b600082601f830112612fee57612fed612c3c565b5b8135612ffe848260208601612f97565b91505092915050565b60008060008060808587031215613021576130206128cf565b5b600061302f87828801612b1c565b945050602061304087828801612b1c565b935050604061305187828801612a67565b925050606085013567ffffffffffffffff811115613072576130716128d4565b5b61307e87828801612fd9565b91505092959194509250565b60006bffffffffffffffffffffffff82169050919050565b6130ab8161308a565b81146130b657600080fd5b50565b6000813590506130c8816130a2565b92915050565b600080604083850312156130e5576130e46128cf565b5b60006130f385828601612b1c565b9250506020613104858286016130b9565b9150509250929050565b60008060408385031215613125576131246128cf565b5b600061313385828601612b1c565b925050602061314485828601612b1c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061319557607f821691505b6020821081036131a8576131a761314e565b5b50919050565b60006060820190506131c36000830186612adb565b6131d06020830185612c04565b6131dd6040830184612adb565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061321f82612a46565b915061322a83612a46565b925082820261323881612a46565b9150828204841483151761324f5761324e6131e5565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061329082612a46565b915061329b83612a46565b9250826132ab576132aa613256565b5b828204905092915050565b600081905092915050565b50565b60006132d16000836132b6565b91506132dc826132c1565b600082019050919050565b60006132f2826132c4565b9150819050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261335e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613321565b6133688683613321565b95508019841693508086168417925050509392505050565b6000819050919050565b60006133a56133a061339b84612a46565b613380565b612a46565b9050919050565b6000819050919050565b6133bf8361338a565b6133d36133cb826133ac565b84845461332e565b825550505050565b600090565b6133e86133db565b6133f38184846133b6565b505050565b5b818110156134175761340c6000826133e0565b6001810190506133f9565b5050565b601f82111561345c5761342d816132fc565b61343684613311565b81016020851015613445578190505b61345961345185613311565b8301826133f8565b50505b505050565b600082821c905092915050565b600061347f60001984600802613461565b1980831691505092915050565b6000613498838361346e565b9150826002028217905092915050565b6134b182612994565b67ffffffffffffffff8111156134ca576134c9612c46565b5b6134d4825461317d565b6134df82828561341b565b600060209050601f8311600181146135125760008415613500578287015190505b61350a858261348c565b865550613572565b601f198416613520866132fc565b60005b8281101561354857848901518255600182019150602085019450602081019050613523565b868310156135655784890151613561601f89168261346e565b8355505b6001600288020188555050505b505050505050565b7f596f7520617265206e6f7420617574686f72697a656400000000000000000000600082015250565b60006135b060168361299f565b91506135bb8261357a565b602082019050919050565b600060208201905081810360008301526135df816135a3565b9050919050565b60006135f182612a46565b91506135fc83612a46565b9250828203905081811115613614576136136131e5565b5b92915050565b7f596f752063616e27742072656465656d20617420746869732074696d65000000600082015250565b6000613650601d8361299f565b915061365b8261361a565b602082019050919050565b6000602082019050818103600083015261367f81613643565b9050919050565b7f546f6b656e20616c72656164792072656465656d656400000000000000000000600082015250565b60006136bc60168361299f565b91506136c782613686565b602082019050919050565b600060208201905081810360008301526136eb816136af565b9050919050565b7f596f7520617265206e6f7420746865206f776e65720000000000000000000000600082015250565b600061372860158361299f565b9150613733826136f2565b602082019050919050565b600060208201905081810360008301526137578161371b565b9050919050565b7f56616c7565206973206e6f742073756666696369656e74000000000000000000600082015250565b600061379460178361299f565b915061379f8261375e565b602082019050919050565b600060208201905081810360008301526137c381613787565b9050919050565b60006137d582612a46565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613807576138066131e5565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b600061383982613812565b613843818561381d565b93506138538185602086016129b0565b61385c816129da565b840191505092915050565b600060808201905061387c6000830187612adb565b6138896020830186612adb565b6138966040830185612c04565b81810360608301526138a8818461382e565b905095945050505050565b6000815190506138c281612905565b92915050565b6000602082840312156138de576138dd6128cf565b5b60006138ec848285016138b3565b91505092915050565b600061391061390b6139068461308a565b613380565b612a46565b9050919050565b613920816138f5565b82525050565b600060408201905061393b6000830185613917565b6139486020830184612c04565b9392505050565b600081905092915050565b600061396582612994565b61396f818561394f565b935061397f8185602086016129b0565b80840191505092915050565b6000613997828561395a565b91506139a3828461395a565b9150819050939250505056fea264697066735822122053bed7642abcf7b065bcaae8ea87e2cf991960d995160f376120d91c487d1fed64736f6c6343000812003300000000000000000000000059de7273191e6bf1907d614e94ecfbe8e5fb73180000000000000000000000000116991b4edf3d88a9db4850b2c9fc5a326b14b500000000000000000000000000000000000000000000000000000000000003e8

Deployed Bytecode

0x6080604052600436106101ee5760003560e01c80638da5cb5b1161010d578063b884f3f2116100a0578063db006a751161006f578063db006a751461070a578063deffe7f814610726578063e985e9c51461074f578063f2fde38b1461078c578063fb796e6c146107b5576101ee565b8063b884f3f21461063e578063b88d4fde1461067b578063c21b471b146106a4578063c87b56dd146106cd576101ee565b8063a0bcfc7f116100dc578063a0bcfc7f1461059a578063a22cb465146105c3578063a53cd3b1146105ec578063b7c0b8e814610615576101ee565b80638da5cb5b146104dc57806395d89b4114610507578063965fa21e146105325780639f477d741461055d576101ee565b806342842e0e116101855780636352211e116101545780636352211e1461042257806370a082311461045f578063715018a61461049c57806384ff3382146104b3576101ee565b806342842e0e1461036a5780634f4602da1461039357806357f7789e146103d05780635d841af5146103f9576101ee565b8063095ea7b3116101c1578063095ea7b3146102c357806323b872dd146102ec5780632a55205a146103155780633ccfd60b14610353576101ee565b806301ffc9a7146101f3578063061873e81461023057806306fdde031461025b578063081812fc14610286575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190612931565b6107e0565b6040516102279190612979565b60405180910390f35b34801561023c57600080fd5b506102456107f2565b6040516102529190612979565b60405180910390f35b34801561026757600080fd5b50610270610805565b60405161027d9190612a24565b60405180910390f35b34801561029257600080fd5b506102ad60048036038101906102a89190612a7c565b610897565b6040516102ba9190612aea565b60405180910390f35b3480156102cf57600080fd5b506102ea60048036038101906102e59190612b31565b6108b3565b005b3480156102f857600080fd5b50610313600480360381019061030e9190612b71565b6108c9565b005b34801561032157600080fd5b5061033c60048036038101906103379190612bc4565b6109cb565b60405161034a929190612c13565b60405180910390f35b34801561035f57600080fd5b50610368610bb5565b005b34801561037657600080fd5b50610391600480360381019061038c9190612b71565b610c63565b005b34801561039f57600080fd5b506103ba60048036038101906103b59190612a7c565b610c83565b6040516103c79190612979565b60405180910390f35b3480156103dc57600080fd5b506103f760048036038101906103f29190612d71565b610ca3565b005b34801561040557600080fd5b50610420600480360381019061041b9190612a7c565b610cb9565b005b34801561042e57600080fd5b5061044960048036038101906104449190612a7c565b610ccb565b6040516104569190612aea565b60405180910390f35b34801561046b57600080fd5b5061048660048036038101906104819190612dcd565b610cdd565b6040516104939190612dfa565b60405180910390f35b3480156104a857600080fd5b506104b1610d97565b005b3480156104bf57600080fd5b506104da60048036038101906104d59190612dcd565b610dab565b005b3480156104e857600080fd5b506104f1610df7565b6040516104fe9190612aea565b60405180910390f35b34801561051357600080fd5b5061051c610e21565b6040516105299190612a24565b60405180910390f35b34801561053e57600080fd5b50610547610eb3565b6040516105549190612dfa565b60405180910390f35b34801561056957600080fd5b50610584600480360381019061057f9190612dcd565b610eb9565b6040516105919190612dfa565b60405180910390f35b3480156105a657600080fd5b506105c160048036038101906105bc9190612e15565b610ed1565b005b3480156105cf57600080fd5b506105ea60048036038101906105e59190612e8a565b610eec565b005b3480156105f857600080fd5b50610613600480360381019061060e9190612eca565b610f02565b005b34801561062157600080fd5b5061063c60048036038101906106379190612f39565b610fab565b005b34801561064a57600080fd5b5061066560048036038101906106609190612dcd565b610fd0565b6040516106729190612dfa565b60405180910390f35b34801561068757600080fd5b506106a2600480360381019061069d9190613007565b611031565b005b3480156106b057600080fd5b506106cb60048036038101906106c691906130ce565b61104e565b005b3480156106d957600080fd5b506106f460048036038101906106ef9190612a7c565b611064565b6040516107019190612a24565b60405180910390f35b610724600480360381019061071f9190612a7c565b611076565b005b34801561073257600080fd5b5061074d60048036038101906107489190612f39565b61136a565b005b34801561075b57600080fd5b506107766004803603810190610771919061310e565b61138f565b6040516107839190612979565b60405180910390f35b34801561079857600080fd5b506107b360048036038101906107ae9190612dcd565b611423565b005b3480156107c157600080fd5b506107ca6114a9565b6040516107d79190612979565b60405180910390f35b60006107eb826114bc565b9050919050565b600960159054906101000a900460ff1681565b6060600080546108149061317d565b80601f01602080910402602001604051908101604052809291908181526020018280546108409061317d565b801561088d5780601f106108625761010080835404028352916020019161088d565b820191906000526020600020905b81548152906001019060200180831161087057829003601f168201915b5050505050905090565b60006108a282611536565b506108ac826115be565b9050919050565b6108c582826108c06115fb565b611603565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361093b5760006040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016109329190612aea565b60405180910390fd5b600061094f838361094a6115fb565b611615565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109c5578382826040517f64283d7b0000000000000000000000000000000000000000000000000000000081526004016109bc939291906131ae565b60405180910390fd5b50505050565b6000806000600860008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610b605760076040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610b6a61182f565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610b969190613214565b610ba09190613285565b90508160000151819350935050509250929050565b610bbd611839565b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610be3906132e7565b60006040518083038185875af1925050503d8060008114610c20576040519150601f19603f3d011682016040523d82523d6000602084013e610c25565b606091505b5050905080610c60576040517f750b219c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b610c7e83838360405180602001604052806000815250611031565b505050565b600d6020528060005260406000206000915054906101000a900460ff1681565b610cab611839565b610cb582826118c0565b5050565b610cc1611839565b80600b8190555050565b6000610cd682611536565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d505760006040517f89c62b64000000000000000000000000000000000000000000000000000000008152600401610d479190612aea565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d9f611839565b610da9600061191c565b565b610db3611839565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610e309061317d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5c9061317d565b8015610ea95780601f10610e7e57610100808354040283529160200191610ea9565b820191906000526020600020905b815481529060010190602001808311610e8c57829003601f168201915b5050505050905090565b600b5481565b600e6020528060005260406000206000915090505481565b610ed9611839565b80600c9081610ee891906134a8565b5050565b610efe610ef76115fb565b83836119e2565b5050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f89906135c6565b60405180910390fd5b610f9c8383611b51565b610fa682826118c0565b505050565b610fb3611839565b80600960146101000a81548160ff02191690831515021790555050565b600080600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461101c84610cdd565b61102691906135e6565b905080915050919050565b61103c8484846108c9565b61104884848484611b6f565b50505050565b611056611839565b6110608282611d26565b5050565b606061106f82611ec8565b9050919050565b60011515600960159054906101000a900460ff161515146110cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c390613666565b60405180910390fd5b600d600082815260200190815260200160002060009054906101000a900460ff161561112d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611124906136d2565b60405180910390fd5b600061113882610ccb565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119f9061373e565b60405180910390fd5b600b543410156111ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e4906137aa565b60405180910390fd5b6000600b54346111fd91906135e6565b90506000811115611250573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561124e573d6000803e3d6000fd5b505b6001600d600085815260200190815260200160002060006101000a81548160ff021916908315150217905550600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906112cc906137ca565b919050555061136583600c80546112e29061317d565b80601f016020809104026020016040519081016040528092919081815260200182805461130e9061317d565b801561135b5780601f106113305761010080835404028352916020019161135b565b820191906000526020600020905b81548152906001019060200180831161133e57829003601f168201915b50505050506118c0565b505050565b611372611839565b80600960156101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61142b611839565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361149d5760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016114949190612aea565b60405180910390fd5b6114a68161191c565b50565b600960149054906101000a900460ff1681565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061152f575061152e82611fdb565b5b9050919050565b6000806115428361203c565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036115b557826040517f7e2732890000000000000000000000000000000000000000000000000000000081526004016115ac9190612dfa565b60405180910390fd5b80915050919050565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600033905090565b6116108383836001612079565b505050565b6000806116218461203c565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146116635761166281848661223e565b5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146116f4576116a5600085600080612079565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614611777576001600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b846002600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b6000612710905090565b6118416115fb565b73ffffffffffffffffffffffffffffffffffffffff1661185f610df7565b73ffffffffffffffffffffffffffffffffffffffff16146118be576118826115fb565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016118b59190612aea565b60405180910390fd5b565b806006600084815260200190815260200160002090816118e091906134a8565b507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7826040516119109190612dfa565b60405180910390a15050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a5357816040517f5b08ba18000000000000000000000000000000000000000000000000000000008152600401611a4a9190612aea565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b449190612979565b60405180910390a3505050565b611b6b828260405180602001604052806000815250612302565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff163b1115611d20578273ffffffffffffffffffffffffffffffffffffffff1663150b7a02611bb36115fb565b8685856040518563ffffffff1660e01b8152600401611bd59493929190613867565b6020604051808303816000875af1925050508015611c1157506040513d601f19601f82011682018060405250810190611c0e91906138c8565b60015b611c95573d8060008114611c41576040519150601f19603f3d011682016040523d82523d6000602084013e611c46565b606091505b506000815103611c8d57836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401611c849190612aea565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611d1e57836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401611d159190612aea565b60405180910390fd5b505b50505050565b6000611d3061182f565b6bffffffffffffffffffffffff16905080826bffffffffffffffffffffffff161115611d955781816040517f6f483d09000000000000000000000000000000000000000000000000000000008152600401611d8c929190613926565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611e075760006040517fb6d9900a000000000000000000000000000000000000000000000000000000008152600401611dfe9190612aea565b60405180910390fd5b60405180604001604052808473ffffffffffffffffffffffffffffffffffffffff168152602001836bffffffffffffffffffffffff16815250600760008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550905050505050565b6060611ed382611536565b506000600660008481526020019081526020016000208054611ef49061317d565b80601f0160208091040260200160405190810160405280929190818152602001828054611f209061317d565b8015611f6d5780601f10611f4257610100808354040283529160200191611f6d565b820191906000526020600020905b815481529060010190602001808311611f5057829003601f168201915b505050505090506000611f7e61231e565b90506000815103611f93578192505050611fd6565b600082511115611fc8578082604051602001611fb092919061398b565b60405160208183030381529060405292505050611fd6565b611fd184612335565b925050505b919050565b6000634906490660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061203557506120348261239e565b5b9050919050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b80806120b25750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156121e65760006120c284611536565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561212d57508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b8015612140575061213e818461138f565b155b1561218257826040517fa9fbf51f0000000000000000000000000000000000000000000000000000000081526004016121799190612aea565b60405180910390fd5b81156121e457838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b836004600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b612249838383612480565b6122fd57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036122be57806040517f7e2732890000000000000000000000000000000000000000000000000000000081526004016122b59190612dfa565b60405180910390fd5b81816040517f177e802f0000000000000000000000000000000000000000000000000000000081526004016122f4929190612c13565b60405180910390fd5b505050565b61230c8383612541565b6123196000848484611b6f565b505050565b606060405180602001604052806000815250905090565b606061234082611536565b50600061234b61231e565b9050600081511161236b5760405180602001604052806000815250612396565b806123758461263a565b60405160200161238692919061398b565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061246957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612479575061247882612708565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561253857508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806124f957506124f8848461138f565b5b8061253757508273ffffffffffffffffffffffffffffffffffffffff1661251f836115be565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036125b35760006040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016125aa9190612aea565b60405180910390fd5b60006125c183836000611615565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146126355760006040517f73c6ac6e00000000000000000000000000000000000000000000000000000000815260040161262c9190612aea565b60405180910390fd5b505050565b60606000600161264984612772565b01905060008167ffffffffffffffff81111561266857612667612c46565b5b6040519080825280601f01601f19166020018201604052801561269a5781602001600182028036833780820191505090505b509050600082602001820190505b6001156126fd578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816126f1576126f0613256565b5b049450600085036126a8575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106127d0577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816127c6576127c5613256565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061280d576d04ee2d6d415b85acef8100000000838161280357612802613256565b5b0492506020810190505b662386f26fc10000831061283c57662386f26fc10000838161283257612831613256565b5b0492506010810190505b6305f5e1008310612865576305f5e100838161285b5761285a613256565b5b0492506008810190505b612710831061288a5761271083816128805761287f613256565b5b0492506004810190505b606483106128ad57606483816128a3576128a2613256565b5b0492506002810190505b600a83106128bc576001810190505b80915050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61290e816128d9565b811461291957600080fd5b50565b60008135905061292b81612905565b92915050565b600060208284031215612947576129466128cf565b5b60006129558482850161291c565b91505092915050565b60008115159050919050565b6129738161295e565b82525050565b600060208201905061298e600083018461296a565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156129ce5780820151818401526020810190506129b3565b60008484015250505050565b6000601f19601f8301169050919050565b60006129f682612994565b612a00818561299f565b9350612a108185602086016129b0565b612a19816129da565b840191505092915050565b60006020820190508181036000830152612a3e81846129eb565b905092915050565b6000819050919050565b612a5981612a46565b8114612a6457600080fd5b50565b600081359050612a7681612a50565b92915050565b600060208284031215612a9257612a916128cf565b5b6000612aa084828501612a67565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ad482612aa9565b9050919050565b612ae481612ac9565b82525050565b6000602082019050612aff6000830184612adb565b92915050565b612b0e81612ac9565b8114612b1957600080fd5b50565b600081359050612b2b81612b05565b92915050565b60008060408385031215612b4857612b476128cf565b5b6000612b5685828601612b1c565b9250506020612b6785828601612a67565b9150509250929050565b600080600060608486031215612b8a57612b896128cf565b5b6000612b9886828701612b1c565b9350506020612ba986828701612b1c565b9250506040612bba86828701612a67565b9150509250925092565b60008060408385031215612bdb57612bda6128cf565b5b6000612be985828601612a67565b9250506020612bfa85828601612a67565b9150509250929050565b612c0d81612a46565b82525050565b6000604082019050612c286000830185612adb565b612c356020830184612c04565b9392505050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612c7e826129da565b810181811067ffffffffffffffff82111715612c9d57612c9c612c46565b5b80604052505050565b6000612cb06128c5565b9050612cbc8282612c75565b919050565b600067ffffffffffffffff821115612cdc57612cdb612c46565b5b612ce5826129da565b9050602081019050919050565b82818337600083830152505050565b6000612d14612d0f84612cc1565b612ca6565b905082815260208101848484011115612d3057612d2f612c41565b5b612d3b848285612cf2565b509392505050565b600082601f830112612d5857612d57612c3c565b5b8135612d68848260208601612d01565b91505092915050565b60008060408385031215612d8857612d876128cf565b5b6000612d9685828601612a67565b925050602083013567ffffffffffffffff811115612db757612db66128d4565b5b612dc385828601612d43565b9150509250929050565b600060208284031215612de357612de26128cf565b5b6000612df184828501612b1c565b91505092915050565b6000602082019050612e0f6000830184612c04565b92915050565b600060208284031215612e2b57612e2a6128cf565b5b600082013567ffffffffffffffff811115612e4957612e486128d4565b5b612e5584828501612d43565b91505092915050565b612e678161295e565b8114612e7257600080fd5b50565b600081359050612e8481612e5e565b92915050565b60008060408385031215612ea157612ea06128cf565b5b6000612eaf85828601612b1c565b9250506020612ec085828601612e75565b9150509250929050565b600080600060608486031215612ee357612ee26128cf565b5b6000612ef186828701612b1c565b9350506020612f0286828701612a67565b925050604084013567ffffffffffffffff811115612f2357612f226128d4565b5b612f2f86828701612d43565b9150509250925092565b600060208284031215612f4f57612f4e6128cf565b5b6000612f5d84828501612e75565b91505092915050565b600067ffffffffffffffff821115612f8157612f80612c46565b5b612f8a826129da565b9050602081019050919050565b6000612faa612fa584612f66565b612ca6565b905082815260208101848484011115612fc657612fc5612c41565b5b612fd1848285612cf2565b509392505050565b600082601f830112612fee57612fed612c3c565b5b8135612ffe848260208601612f97565b91505092915050565b60008060008060808587031215613021576130206128cf565b5b600061302f87828801612b1c565b945050602061304087828801612b1c565b935050604061305187828801612a67565b925050606085013567ffffffffffffffff811115613072576130716128d4565b5b61307e87828801612fd9565b91505092959194509250565b60006bffffffffffffffffffffffff82169050919050565b6130ab8161308a565b81146130b657600080fd5b50565b6000813590506130c8816130a2565b92915050565b600080604083850312156130e5576130e46128cf565b5b60006130f385828601612b1c565b9250506020613104858286016130b9565b9150509250929050565b60008060408385031215613125576131246128cf565b5b600061313385828601612b1c565b925050602061314485828601612b1c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061319557607f821691505b6020821081036131a8576131a761314e565b5b50919050565b60006060820190506131c36000830186612adb565b6131d06020830185612c04565b6131dd6040830184612adb565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061321f82612a46565b915061322a83612a46565b925082820261323881612a46565b9150828204841483151761324f5761324e6131e5565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061329082612a46565b915061329b83612a46565b9250826132ab576132aa613256565b5b828204905092915050565b600081905092915050565b50565b60006132d16000836132b6565b91506132dc826132c1565b600082019050919050565b60006132f2826132c4565b9150819050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261335e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613321565b6133688683613321565b95508019841693508086168417925050509392505050565b6000819050919050565b60006133a56133a061339b84612a46565b613380565b612a46565b9050919050565b6000819050919050565b6133bf8361338a565b6133d36133cb826133ac565b84845461332e565b825550505050565b600090565b6133e86133db565b6133f38184846133b6565b505050565b5b818110156134175761340c6000826133e0565b6001810190506133f9565b5050565b601f82111561345c5761342d816132fc565b61343684613311565b81016020851015613445578190505b61345961345185613311565b8301826133f8565b50505b505050565b600082821c905092915050565b600061347f60001984600802613461565b1980831691505092915050565b6000613498838361346e565b9150826002028217905092915050565b6134b182612994565b67ffffffffffffffff8111156134ca576134c9612c46565b5b6134d4825461317d565b6134df82828561341b565b600060209050601f8311600181146135125760008415613500578287015190505b61350a858261348c565b865550613572565b601f198416613520866132fc565b60005b8281101561354857848901518255600182019150602085019450602081019050613523565b868310156135655784890151613561601f89168261346e565b8355505b6001600288020188555050505b505050505050565b7f596f7520617265206e6f7420617574686f72697a656400000000000000000000600082015250565b60006135b060168361299f565b91506135bb8261357a565b602082019050919050565b600060208201905081810360008301526135df816135a3565b9050919050565b60006135f182612a46565b91506135fc83612a46565b9250828203905081811115613614576136136131e5565b5b92915050565b7f596f752063616e27742072656465656d20617420746869732074696d65000000600082015250565b6000613650601d8361299f565b915061365b8261361a565b602082019050919050565b6000602082019050818103600083015261367f81613643565b9050919050565b7f546f6b656e20616c72656164792072656465656d656400000000000000000000600082015250565b60006136bc60168361299f565b91506136c782613686565b602082019050919050565b600060208201905081810360008301526136eb816136af565b9050919050565b7f596f7520617265206e6f7420746865206f776e65720000000000000000000000600082015250565b600061372860158361299f565b9150613733826136f2565b602082019050919050565b600060208201905081810360008301526137578161371b565b9050919050565b7f56616c7565206973206e6f742073756666696369656e74000000000000000000600082015250565b600061379460178361299f565b915061379f8261375e565b602082019050919050565b600060208201905081810360008301526137c381613787565b9050919050565b60006137d582612a46565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613807576138066131e5565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b600061383982613812565b613843818561381d565b93506138538185602086016129b0565b61385c816129da565b840191505092915050565b600060808201905061387c6000830187612adb565b6138896020830186612adb565b6138966040830185612c04565b81810360608301526138a8818461382e565b905095945050505050565b6000815190506138c281612905565b92915050565b6000602082840312156138de576138dd6128cf565b5b60006138ec848285016138b3565b91505092915050565b600061391061390b6139068461308a565b613380565b612a46565b9050919050565b613920816138f5565b82525050565b600060408201905061393b6000830185613917565b6139486020830184612c04565b9392505050565b600081905092915050565b600061396582612994565b61396f818561394f565b935061397f8185602086016129b0565b80840191505092915050565b6000613997828561395a565b91506139a3828461395a565b9150819050939250505056fea264697066735822122053bed7642abcf7b065bcaae8ea87e2cf991960d995160f376120d91c487d1fed64736f6c63430008120033

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

00000000000000000000000059de7273191e6bf1907d614e94ecfbe8e5fb73180000000000000000000000000116991b4edf3d88a9db4850b2c9fc5a326b14b500000000000000000000000000000000000000000000000000000000000003e8

-----Decoded View---------------
Arg [0] : initialOwner (address): 0x59dE7273191E6bf1907d614e94eCFbe8e5FB7318
Arg [1] : royalityReciever (address): 0x0116991B4eDF3D88a9Db4850b2C9FC5a326b14b5
Arg [2] : royality (uint96): 1000

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000059de7273191e6bf1907d614e94ecfbe8e5fb7318
Arg [1] : 0000000000000000000000000116991b4edf3d88a9db4850b2c9fc5a326b14b5
Arg [2] : 00000000000000000000000000000000000000000000000000000000000003e8


Deployed Bytecode Sourcemap

73949:3910:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76931:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74110:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48940:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50112:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49931:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50781:588;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37190:429;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;76442:207;;;;;;;;;;;;;:::i;:::-;;51440:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74254:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76041:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76161:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48753:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48478:213;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30047:103;;;;;;;;;;;;;:::i;:::-;;75819:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29372:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49100:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74188:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74307:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75941:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50342:146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74679:263;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77344:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75661:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51645:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77686:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76727:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74950:703;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76258:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50559:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30305:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74067:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76931:221;77079:4;77108:36;77132:11;77108:23;:36::i;:::-;77101:43;;76931:221;;;:::o;74110:32::-;;;;;;;;;;;;;:::o;48940:91::-;48985:13;49018:5;49011:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48940:91;:::o;50112:158::-;50179:7;50199:22;50213:7;50199:13;:22::i;:::-;;50241:21;50254:7;50241:12;:21::i;:::-;50234:28;;50112:158;;;:::o;49931:115::-;50003:35;50012:2;50016:7;50025:12;:10;:12::i;:::-;50003:8;:35::i;:::-;49931:115;;:::o;50781:588::-;50890:1;50876:16;;:2;:16;;;50872:89;;50946:1;50916:33;;;;;;;;;;;:::i;:::-;;;;;;;;50872:89;51182:21;51206:34;51214:2;51218:7;51227:12;:10;:12::i;:::-;51206:7;:34::i;:::-;51182:58;;51272:4;51255:21;;:13;:21;;;51251:111;;51321:4;51327:7;51336:13;51300:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;51251:111;50861:508;50781:588;;;:::o;37190:429::-;37276:7;37285;37305:26;37334:17;:26;37352:7;37334:26;;;;;;;;;;;37305:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37405:1;37377:30;;:7;:16;;;:30;;;37373:92;;37434:19;37424:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37373:92;37477:21;37541:17;:15;:17::i;:::-;37501:57;;37514:7;:23;;;37502:35;;:9;:35;;;;:::i;:::-;37501:57;;;;:::i;:::-;37477:81;;37579:7;:16;;;37597:13;37571:40;;;;;;37190:429;;;;;:::o;76442:207::-;29258:13;:11;:13::i;:::-;76493:12:::1;76519:10;76511:24;;76557:21;76511:82;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76492:101;;;76609:7;76604:37;;76625:16;;;;;;;;;;;;;;76604:37;76481:168;76442:207::o:0;51440:134::-;51527:39;51544:4;51550:2;51554:7;51527:39;;;;;;;;;;;;:16;:39::i;:::-;51440:134;;;:::o;74254:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;76041:112::-;29258:13;:11;:13::i;:::-;76123:22:::1;76136:2;76140:4;76123:12;:22::i;:::-;76041:112:::0;;:::o;76161:89::-;29258:13;:11;:13::i;:::-;76238:4:::1;76226:9;:16;;;;76161:89:::0;:::o;48753:120::-;48816:7;48843:22;48857:7;48843:13;:22::i;:::-;48836:29;;48753:120;;;:::o;48478:213::-;48541:7;48582:1;48565:19;;:5;:19;;;48561:89;;48635:1;48608:30;;;;;;;;;;;:::i;:::-;;;;;;;;48561:89;48667:9;:16;48677:5;48667:16;;;;;;;;;;;;;;;;48660:23;;48478:213;;;:::o;30047:103::-;29258:13;:11;:13::i;:::-;30112:30:::1;30139:1;30112:18;:30::i;:::-;30047:103::o:0;75819:114::-;29258:13;:11;:13::i;:::-;75916:9:::1;75897:16;;:28;;;;;;;;;;;;;;;;;;75819:114:::0;:::o;29372:87::-;29418:7;29445:6;;;;;;;;;;;29438:13;;29372:87;:::o;49100:95::-;49147:13;49180:7;49173:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49100:95;:::o;74188:38::-;;;;:::o;74307:47::-;;;;;;;;;;;;;;;;;:::o;75941:92::-;29258:13;:11;:13::i;:::-;76021:4:::1;76011:7;:14;;;;;;:::i;:::-;;75941:92:::0;:::o;50342:146::-;50428:52;50447:12;:10;:12::i;:::-;50461:8;50471;50428:18;:52::i;:::-;50342:146;;:::o;74679:263::-;74821:16;;;;;;;;;;;74807:30;;:10;:30;;;74799:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;74875:22;74885:2;74889:7;74875:9;:22::i;:::-;74908:26;74921:7;74930:3;74908:12;:26::i;:::-;74679:263;;;:::o;77344:119::-;29258:13;:11;:13::i;:::-;77450:5:::1;77423:24;;:32;;;;;;;;;;;;;;;;;;77344:119:::0;:::o;75661:150::-;75717:7;75736:9;75766:12;:18;75779:4;75766:18;;;;;;;;;;;;;;;;75748:15;75758:4;75748:9;:15::i;:::-;:36;;;;:::i;:::-;75736:48;;75802:1;75795:8;;;75661:150;;;:::o;51645:211::-;51759:31;51772:4;51778:2;51782:7;51759:12;:31::i;:::-;51801:47;51824:4;51830:2;51834:7;51843:4;51801:22;:47::i;:::-;51645:211;;;;:::o;77686:170::-;29258:13;:11;:13::i;:::-;77803:45:::1;77822:8;77832:15;77803:18;:45::i;:::-;77686:170:::0;;:::o;76727:196::-;76854:13;76892:23;76907:7;76892:14;:23::i;:::-;76885:30;;76727:196;;;:::o;74950:703::-;75033:4;75017:20;;:12;;;;;;;;;;;:20;;;75009:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;75091:14;:23;75106:7;75091:23;;;;;;;;;;;;;;;;;;;;;75090:24;75082:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;75152:18;75173:16;75181:7;75173;:16::i;:::-;75152:37;;75222:10;75208:24;;:10;:24;;;75200:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;75292:9;;75279;:22;;75271:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;75342:19;75376:9;;75364;:21;;;;:::i;:::-;75342:43;;75414:1;75400:11;:15;75396:89;;;75440:10;75432:28;;:41;75461:11;75432:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75396:89;75562:4;75536:14;:23;75551:7;75536:23;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;75577:12;:24;75590:10;75577:24;;;;;;;;;;;;;;;;:27;;;;;;;;;:::i;:::-;;;;;;75615:30;75628:7;75637;75615:30;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;:30::i;:::-;74998:655;;74950:703;:::o;76258:104::-;29258:13;:11;:13::i;:::-;76344:10:::1;76329:12;;:25;;;;;;;;;;;;;;;;;;76258:104:::0;:::o;50559:155::-;50647:4;50671:18;:25;50690:5;50671:25;;;;;;;;;;;;;;;:35;50697:8;50671:35;;;;;;;;;;;;;;;;;;;;;;;;;50664:42;;50559:155;;;;:::o;30305:220::-;29258:13;:11;:13::i;:::-;30410:1:::1;30390:22;;:8;:22;;::::0;30386:93:::1;;30464:1;30436:31;;;;;;;;;;;:::i;:::-;;;;;;;;30386:93;30489:28;30508:8;30489:18;:28::i;:::-;30305:220:::0;:::o;74067:36::-;;;;;;;;;;;;;:::o;36920:215::-;37022:4;37061:26;37046:41;;;:11;:41;;;;:81;;;;37091:36;37115:11;37091:23;:36::i;:::-;37046:81;37039:88;;36920:215;;;:::o;63087:247::-;63150:7;63170:13;63186:17;63195:7;63186:8;:17::i;:::-;63170:33;;63235:1;63218:19;;:5;:19;;;63214:90;;63284:7;63261:31;;;;;;;;;;;:::i;:::-;;;;;;;;63214:90;63321:5;63314:12;;;63087:247;;;:::o;52618:129::-;52688:7;52715:15;:24;52731:7;52715:24;;;;;;;;;;;;;;;;;;;;;52708:31;;52618:129;;;:::o;27488:98::-;27541:7;27568:10;27561:17;;27488:98;:::o;61319:122::-;61400:33;61409:2;61413:7;61422:4;61428;61400:8;:33::i;:::-;61319:122;;;:::o;55580:824::-;55666:7;55686:12;55701:17;55710:7;55701:8;:17::i;:::-;55686:32;;55797:1;55781:18;;:4;:18;;;55777:88;;55816:37;55833:4;55839;55845:7;55816:16;:37::i;:::-;55777:88;55928:1;55912:18;;:4;:18;;;55908:263;;56030:48;56047:1;56051:7;56068:1;56072:5;56030:8;:48::i;:::-;56143:1;56124:9;:15;56134:4;56124:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;55908:263;56201:1;56187:16;;:2;:16;;;56183:111;;56266:1;56249:9;:13;56259:2;56249:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;56183:111;56325:2;56306:7;:16;56314:7;56306:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;56364:7;56360:2;56345:27;;56354:4;56345:27;;;;;;;;;;;;56392:4;56385:11;;;55580:824;;;;;:::o;37901:97::-;37959:6;37985:5;37978:12;;37901:97;:::o;29537:166::-;29608:12;:10;:12::i;:::-;29597:23;;:7;:5;:7::i;:::-;:23;;;29593:103;;29671:12;:10;:12::i;:::-;29644:40;;;;;;;;;;;:::i;:::-;;;;;;;;29593:103;29537:166::o;66514:170::-;66628:9;66606:10;:19;66617:7;66606:19;;;;;;;;;;;:31;;;;;;:::i;:::-;;66653:23;66668:7;66653:23;;;;;;:::i;:::-;;;;;;;;66514:170;;:::o;30685:191::-;30759:16;30778:6;;;;;;;;;;;30759:25;;30804:8;30795:6;;:17;;;;;;;;;;;;;;;;;;30859:8;30828:40;;30849:8;30828:40;;;;;;;;;;;;30748:128;30685:191;:::o;62526:318::-;62654:1;62634:22;;:8;:22;;;62630:93;;62702:8;62680:31;;;;;;;;;;;:::i;:::-;;;;;;;;62630:93;62771:8;62733:18;:25;62752:5;62733:25;;;;;;;;;;;;;;;:35;62759:8;62733:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;62817:8;62795:41;;62810:5;62795:41;;;62827:8;62795:41;;;;;;:::i;:::-;;;;;;;;62526:318;;;:::o;57438:102::-;57506:26;57516:2;57520:7;57506:26;;;;;;;;;;;;:9;:26::i;:::-;57438:102;;:::o;63884:799::-;64018:1;64001:2;:14;;;:18;63997:679;;;64056:2;64040:36;;;64077:12;:10;:12::i;:::-;64091:4;64097:7;64106:4;64040:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;64036:629;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64371:1;64354:6;:13;:18;64350:300;;64426:2;64404:25;;;;;;;;;;;:::i;:::-;;;;;;;;64350:300;64600:6;64594:13;64585:6;64581:2;64577:15;64570:38;64036:629;64169:41;;;64159:51;;;:6;:51;;;;64155:132;;64264:2;64242:25;;;;;;;;;;;:::i;:::-;;;;;;;;64155:132;64112:190;63997:679;63884:799;;;;:::o;38269:518::-;38364:19;38386:17;:15;:17::i;:::-;38364:39;;;;38433:11;38418:12;:26;;;38414:176;;;38552:12;38566:11;38523:55;;;;;;;;;;;;:::i;:::-;;;;;;;;38414:176;38624:1;38604:22;;:8;:22;;;38600:110;;38695:1;38650:48;;;;;;;;;;;:::i;:::-;;;;;;;;38600:110;38744:35;;;;;;;;38756:8;38744:35;;;;;;38766:12;38744:35;;;;;38722:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38353:434;38269:518;;:::o;65779:609::-;65852:13;65878:22;65892:7;65878:13;:22::i;:::-;;65913:23;65939:10;:19;65950:7;65939:19;;;;;;;;;;;65913:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65969:18;65990:10;:8;:10::i;:::-;65969:31;;66098:1;66082:4;66076:18;:23;66072:72;;66123:9;66116:16;;;;;;66072:72;66271:1;66251:9;66245:23;:27;66241:97;;;66310:4;66316:9;66296:30;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66289:37;;;;;;66241:97;66357:23;66372:7;66357:14;:23::i;:::-;66350:30;;;;65779:609;;;;:::o;65499:209::-;65601:4;65314:10;65307:18;;65625:35;;;:11;:35;;;;:75;;;;65664:36;65688:11;65664:23;:36::i;:::-;65625:75;65618:82;;65499:209;;;:::o;52380:117::-;52446:7;52473;:16;52481:7;52473:16;;;;;;;;;;;;;;;;;;;;;52466:23;;52380:117;;;:::o;61629:678::-;61791:9;:31;;;;61820:1;61804:18;;:4;:18;;;;61791:31;61787:471;;;61839:13;61855:22;61869:7;61855:13;:22::i;:::-;61839:38;;62024:1;62008:18;;:4;:18;;;;:35;;;;;62039:4;62030:13;;:5;:13;;;;62008:35;:69;;;;;62048:29;62065:5;62072:4;62048:16;:29::i;:::-;62047:30;62008:69;62004:144;;;62127:4;62105:27;;;;;;;;;;;:::i;:::-;;;;;;;;62004:144;62168:9;62164:83;;;62223:7;62219:2;62203:28;;62212:5;62203:28;;;;;;;;;;;;62164:83;61824:434;61787:471;62297:2;62270:15;:24;62286:7;62270:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;61629:678;;;;:::o;53787:376::-;53900:38;53914:5;53921:7;53930;53900:13;:38::i;:::-;53895:261;;53976:1;53959:19;;:5;:19;;;53955:190;;54029:7;54006:31;;;;;;;;;;;:::i;:::-;;;;;;;;53955:190;54112:7;54121;54085:44;;;;;;;;;;;;:::i;:::-;;;;;;;;53895:261;53787:376;;;:::o;57767:185::-;57862:18;57868:2;57872:7;57862:5;:18::i;:::-;57891:53;57922:1;57926:2;57930:7;57939:4;57891:22;:53::i;:::-;57767:185;;;:::o;49775:94::-;49826:13;49852:9;;;;;;;;;;;;;;49775:94;:::o;49266:260::-;49330:13;49356:22;49370:7;49356:13;:22::i;:::-;;49391:21;49415:10;:8;:10::i;:::-;49391:34;;49467:1;49449:7;49443:21;:25;:75;;;;;;;;;;;;;;;;;49485:7;49494:18;:7;:16;:18::i;:::-;49471:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49443:75;49436:82;;;49266:260;;;:::o;48109:305::-;48211:4;48263:25;48248:40;;;:11;:40;;;;:105;;;;48320:33;48305:48;;;:11;:48;;;;48248:105;:158;;;;48370:36;48394:11;48370:23;:36::i;:::-;48248:158;48228:178;;48109:305;;;:::o;53067:276::-;53170:4;53226:1;53207:21;;:7;:21;;;;:128;;;;;53255:7;53246:16;;:5;:16;;;:52;;;;53266:32;53283:5;53290:7;53266:16;:32::i;:::-;53246:52;:88;;;;53327:7;53302:32;;:21;53315:7;53302:12;:21::i;:::-;:32;;;53246:88;53207:128;53187:148;;53067:276;;;;;:::o;56740:335::-;56822:1;56808:16;;:2;:16;;;56804:89;;56878:1;56848:33;;;;;;;;;;;:::i;:::-;;;;;;;;56804:89;56903:21;56927:32;56935:2;56939:7;56956:1;56927:7;:32::i;:::-;56903:56;;56999:1;56974:27;;:13;:27;;;56970:98;;57053:1;57025:31;;;;;;;;;;;:::i;:::-;;;;;;;;56970:98;56793:282;56740:335;;:::o;24258:718::-;24314:13;24365:14;24402:1;24382:17;24393:5;24382:10;:17::i;:::-;:21;24365:38;;24418:20;24452:6;24441:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24418:41;;24474:11;24603:6;24599:2;24595:15;24587:6;24583:28;24576:35;;24640:290;24647:4;24640:290;;;24672:5;;;;;;;;24814:10;24809:2;24802:5;24798:14;24793:32;24788:3;24780:46;24872:2;24863:11;;;;;;:::i;:::-;;;;;24906:1;24897:5;:10;24640:290;24893:21;24640:290;24951:6;24944:13;;;;;24258:718;;;:::o;34692:148::-;34768:4;34807:25;34792:40;;;:11;:40;;;;34785:47;;34692:148;;;:::o;20662:948::-;20715:7;20735:14;20752:1;20735:18;;20802:8;20793:5;:17;20789:106;;20840:8;20831:17;;;;;;:::i;:::-;;;;;20877:2;20867:12;;;;20789:106;20922:8;20913:5;:17;20909:106;;20960:8;20951:17;;;;;;:::i;:::-;;;;;20997:2;20987:12;;;;20909:106;21042:8;21033:5;:17;21029:106;;21080:8;21071:17;;;;;;:::i;:::-;;;;;21117:2;21107:12;;;;21029:106;21162:7;21153:5;:16;21149:103;;21199:7;21190:16;;;;;;:::i;:::-;;;;;21235:1;21225:11;;;;21149:103;21279:7;21270:5;:16;21266:103;;21316:7;21307:16;;;;;;:::i;:::-;;;;;21352:1;21342:11;;;;21266:103;21396:7;21387:5;:16;21383:103;;21433:7;21424:16;;;;;;:::i;:::-;;;;;21469:1;21459:11;;;;21383:103;21513:7;21504:5;:16;21500:68;;21551:1;21541:11;;;;21500:68;21596:6;21589:13;;;20662:948;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:619::-;4967:6;4975;4983;5032:2;5020:9;5011:7;5007:23;5003:32;5000:119;;;5038:79;;:::i;:::-;5000:119;5158:1;5183:53;5228:7;5219:6;5208:9;5204:22;5183:53;:::i;:::-;5173:63;;5129:117;5285:2;5311:53;5356:7;5347:6;5336:9;5332:22;5311:53;:::i;:::-;5301:63;;5256:118;5413:2;5439:53;5484:7;5475:6;5464:9;5460:22;5439:53;:::i;:::-;5429:63;;5384:118;4890:619;;;;;:::o;5515:474::-;5583:6;5591;5640:2;5628:9;5619:7;5615:23;5611:32;5608:119;;;5646:79;;:::i;:::-;5608:119;5766:1;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5737:117;5893:2;5919:53;5964:7;5955:6;5944:9;5940:22;5919:53;:::i;:::-;5909:63;;5864:118;5515:474;;;;;:::o;5995:118::-;6082:24;6100:5;6082:24;:::i;:::-;6077:3;6070:37;5995:118;;:::o;6119:332::-;6240:4;6278:2;6267:9;6263:18;6255:26;;6291:71;6359:1;6348:9;6344:17;6335:6;6291:71;:::i;:::-;6372:72;6440:2;6429:9;6425:18;6416:6;6372:72;:::i;:::-;6119:332;;;;;:::o;6457:117::-;6566:1;6563;6556:12;6580:117;6689:1;6686;6679:12;6703:180;6751:77;6748:1;6741:88;6848:4;6845:1;6838:15;6872:4;6869:1;6862:15;6889:281;6972:27;6994:4;6972:27;:::i;:::-;6964:6;6960:40;7102:6;7090:10;7087:22;7066:18;7054:10;7051:34;7048:62;7045:88;;;7113:18;;:::i;:::-;7045:88;7153:10;7149:2;7142:22;6932:238;6889:281;;:::o;7176:129::-;7210:6;7237:20;;:::i;:::-;7227:30;;7266:33;7294:4;7286:6;7266:33;:::i;:::-;7176:129;;;:::o;7311:308::-;7373:4;7463:18;7455:6;7452:30;7449:56;;;7485:18;;:::i;:::-;7449:56;7523:29;7545:6;7523:29;:::i;:::-;7515:37;;7607:4;7601;7597:15;7589:23;;7311:308;;;:::o;7625:146::-;7722:6;7717:3;7712;7699:30;7763:1;7754:6;7749:3;7745:16;7738:27;7625:146;;;:::o;7777:425::-;7855:5;7880:66;7896:49;7938:6;7896:49;:::i;:::-;7880:66;:::i;:::-;7871:75;;7969:6;7962:5;7955:21;8007:4;8000:5;7996:16;8045:3;8036:6;8031:3;8027:16;8024:25;8021:112;;;8052:79;;:::i;:::-;8021:112;8142:54;8189:6;8184:3;8179;8142:54;:::i;:::-;7861:341;7777:425;;;;;:::o;8222:340::-;8278:5;8327:3;8320:4;8312:6;8308:17;8304:27;8294:122;;8335:79;;:::i;:::-;8294:122;8452:6;8439:20;8477:79;8552:3;8544:6;8537:4;8529:6;8525:17;8477:79;:::i;:::-;8468:88;;8284:278;8222:340;;;;:::o;8568:654::-;8646:6;8654;8703:2;8691:9;8682:7;8678:23;8674:32;8671:119;;;8709:79;;:::i;:::-;8671:119;8829:1;8854:53;8899:7;8890:6;8879:9;8875:22;8854:53;:::i;:::-;8844:63;;8800:117;8984:2;8973:9;8969:18;8956:32;9015:18;9007:6;9004:30;9001:117;;;9037:79;;:::i;:::-;9001:117;9142:63;9197:7;9188:6;9177:9;9173:22;9142:63;:::i;:::-;9132:73;;8927:288;8568:654;;;;;:::o;9228:329::-;9287:6;9336:2;9324:9;9315:7;9311:23;9307:32;9304:119;;;9342:79;;:::i;:::-;9304:119;9462:1;9487:53;9532:7;9523:6;9512:9;9508:22;9487:53;:::i;:::-;9477:63;;9433:117;9228:329;;;;:::o;9563:222::-;9656:4;9694:2;9683:9;9679:18;9671:26;;9707:71;9775:1;9764:9;9760:17;9751:6;9707:71;:::i;:::-;9563:222;;;;:::o;9791:509::-;9860:6;9909:2;9897:9;9888:7;9884:23;9880:32;9877:119;;;9915:79;;:::i;:::-;9877:119;10063:1;10052:9;10048:17;10035:31;10093:18;10085:6;10082:30;10079:117;;;10115:79;;:::i;:::-;10079:117;10220:63;10275:7;10266:6;10255:9;10251:22;10220:63;:::i;:::-;10210:73;;10006:287;9791:509;;;;:::o;10306:116::-;10376:21;10391:5;10376:21;:::i;:::-;10369:5;10366:32;10356:60;;10412:1;10409;10402:12;10356:60;10306:116;:::o;10428:133::-;10471:5;10509:6;10496:20;10487:29;;10525:30;10549:5;10525:30;:::i;:::-;10428:133;;;;:::o;10567:468::-;10632:6;10640;10689:2;10677:9;10668:7;10664:23;10660:32;10657:119;;;10695:79;;:::i;:::-;10657:119;10815:1;10840:53;10885:7;10876:6;10865:9;10861:22;10840:53;:::i;:::-;10830:63;;10786:117;10942:2;10968:50;11010:7;11001:6;10990:9;10986:22;10968:50;:::i;:::-;10958:60;;10913:115;10567:468;;;;;:::o;11041:799::-;11128:6;11136;11144;11193:2;11181:9;11172:7;11168:23;11164:32;11161:119;;;11199:79;;:::i;:::-;11161:119;11319:1;11344:53;11389:7;11380:6;11369:9;11365:22;11344:53;:::i;:::-;11334:63;;11290:117;11446:2;11472:53;11517:7;11508:6;11497:9;11493:22;11472:53;:::i;:::-;11462:63;;11417:118;11602:2;11591:9;11587:18;11574:32;11633:18;11625:6;11622:30;11619:117;;;11655:79;;:::i;:::-;11619:117;11760:63;11815:7;11806:6;11795:9;11791:22;11760:63;:::i;:::-;11750:73;;11545:288;11041:799;;;;;:::o;11846:323::-;11902:6;11951:2;11939:9;11930:7;11926:23;11922:32;11919:119;;;11957:79;;:::i;:::-;11919:119;12077:1;12102:50;12144:7;12135:6;12124:9;12120:22;12102:50;:::i;:::-;12092:60;;12048:114;11846:323;;;;:::o;12175:307::-;12236:4;12326:18;12318:6;12315:30;12312:56;;;12348:18;;:::i;:::-;12312:56;12386:29;12408:6;12386:29;:::i;:::-;12378:37;;12470:4;12464;12460:15;12452:23;;12175:307;;;:::o;12488:423::-;12565:5;12590:65;12606:48;12647:6;12606:48;:::i;:::-;12590:65;:::i;:::-;12581:74;;12678:6;12671:5;12664:21;12716:4;12709:5;12705:16;12754:3;12745:6;12740:3;12736:16;12733:25;12730:112;;;12761:79;;:::i;:::-;12730:112;12851:54;12898:6;12893:3;12888;12851:54;:::i;:::-;12571:340;12488:423;;;;;:::o;12930:338::-;12985:5;13034:3;13027:4;13019:6;13015:17;13011:27;13001:122;;13042:79;;:::i;:::-;13001:122;13159:6;13146:20;13184:78;13258:3;13250:6;13243:4;13235:6;13231:17;13184:78;:::i;:::-;13175:87;;12991:277;12930:338;;;;:::o;13274:943::-;13369:6;13377;13385;13393;13442:3;13430:9;13421:7;13417:23;13413:33;13410:120;;;13449:79;;:::i;:::-;13410:120;13569:1;13594:53;13639:7;13630:6;13619:9;13615:22;13594:53;:::i;:::-;13584:63;;13540:117;13696:2;13722:53;13767:7;13758:6;13747:9;13743:22;13722:53;:::i;:::-;13712:63;;13667:118;13824:2;13850:53;13895:7;13886:6;13875:9;13871:22;13850:53;:::i;:::-;13840:63;;13795:118;13980:2;13969:9;13965:18;13952:32;14011:18;14003:6;14000:30;13997:117;;;14033:79;;:::i;:::-;13997:117;14138:62;14192:7;14183:6;14172:9;14168:22;14138:62;:::i;:::-;14128:72;;13923:287;13274:943;;;;;;;:::o;14223:109::-;14259:7;14299:26;14292:5;14288:38;14277:49;;14223:109;;;:::o;14338:120::-;14410:23;14427:5;14410:23;:::i;:::-;14403:5;14400:34;14390:62;;14448:1;14445;14438:12;14390:62;14338:120;:::o;14464:137::-;14509:5;14547:6;14534:20;14525:29;;14563:32;14589:5;14563:32;:::i;:::-;14464:137;;;;:::o;14607:472::-;14674:6;14682;14731:2;14719:9;14710:7;14706:23;14702:32;14699:119;;;14737:79;;:::i;:::-;14699:119;14857:1;14882:53;14927:7;14918:6;14907:9;14903:22;14882:53;:::i;:::-;14872:63;;14828:117;14984:2;15010:52;15054:7;15045:6;15034:9;15030:22;15010:52;:::i;:::-;15000:62;;14955:117;14607:472;;;;;:::o;15085:474::-;15153:6;15161;15210:2;15198:9;15189:7;15185:23;15181:32;15178:119;;;15216:79;;:::i;:::-;15178:119;15336:1;15361:53;15406:7;15397:6;15386:9;15382:22;15361:53;:::i;:::-;15351:63;;15307:117;15463:2;15489:53;15534:7;15525:6;15514:9;15510:22;15489:53;:::i;:::-;15479:63;;15434:118;15085:474;;;;;:::o;15565:180::-;15613:77;15610:1;15603:88;15710:4;15707:1;15700:15;15734:4;15731:1;15724:15;15751:320;15795:6;15832:1;15826:4;15822:12;15812:22;;15879:1;15873:4;15869:12;15900:18;15890:81;;15956:4;15948:6;15944:17;15934:27;;15890:81;16018:2;16010:6;16007:14;15987:18;15984:38;15981:84;;16037:18;;:::i;:::-;15981:84;15802:269;15751:320;;;:::o;16077:442::-;16226:4;16264:2;16253:9;16249:18;16241:26;;16277:71;16345:1;16334:9;16330:17;16321:6;16277:71;:::i;:::-;16358:72;16426:2;16415:9;16411:18;16402:6;16358:72;:::i;:::-;16440;16508:2;16497:9;16493:18;16484:6;16440:72;:::i;:::-;16077:442;;;;;;:::o;16525:180::-;16573:77;16570:1;16563:88;16670:4;16667:1;16660:15;16694:4;16691:1;16684:15;16711:410;16751:7;16774:20;16792:1;16774:20;:::i;:::-;16769:25;;16808:20;16826:1;16808:20;:::i;:::-;16803:25;;16863:1;16860;16856:9;16885:30;16903:11;16885:30;:::i;:::-;16874:41;;17064:1;17055:7;17051:15;17048:1;17045:22;17025:1;17018:9;16998:83;16975:139;;17094:18;;:::i;:::-;16975:139;16759:362;16711:410;;;;:::o;17127:180::-;17175:77;17172:1;17165:88;17272:4;17269:1;17262:15;17296:4;17293:1;17286:15;17313:185;17353:1;17370:20;17388:1;17370:20;:::i;:::-;17365:25;;17404:20;17422:1;17404:20;:::i;:::-;17399:25;;17443:1;17433:35;;17448:18;;:::i;:::-;17433:35;17490:1;17487;17483:9;17478:14;;17313:185;;;;:::o;17504:147::-;17605:11;17642:3;17627:18;;17504:147;;;;:::o;17657:114::-;;:::o;17777:398::-;17936:3;17957:83;18038:1;18033:3;17957:83;:::i;:::-;17950:90;;18049:93;18138:3;18049:93;:::i;:::-;18167:1;18162:3;18158:11;18151:18;;17777:398;;;:::o;18181:379::-;18365:3;18387:147;18530:3;18387:147;:::i;:::-;18380:154;;18551:3;18544:10;;18181:379;;;:::o;18566:141::-;18615:4;18638:3;18630:11;;18661:3;18658:1;18651:14;18695:4;18692:1;18682:18;18674:26;;18566:141;;;:::o;18713:93::-;18750:6;18797:2;18792;18785:5;18781:14;18777:23;18767:33;;18713:93;;;:::o;18812:107::-;18856:8;18906:5;18900:4;18896:16;18875:37;;18812:107;;;;:::o;18925:393::-;18994:6;19044:1;19032:10;19028:18;19067:97;19097:66;19086:9;19067:97;:::i;:::-;19185:39;19215:8;19204:9;19185:39;:::i;:::-;19173:51;;19257:4;19253:9;19246:5;19242:21;19233:30;;19306:4;19296:8;19292:19;19285:5;19282:30;19272:40;;19001:317;;18925:393;;;;;:::o;19324:60::-;19352:3;19373:5;19366:12;;19324:60;;;:::o;19390:142::-;19440:9;19473:53;19491:34;19500:24;19518:5;19500:24;:::i;:::-;19491:34;:::i;:::-;19473:53;:::i;:::-;19460:66;;19390:142;;;:::o;19538:75::-;19581:3;19602:5;19595:12;;19538:75;;;:::o;19619:269::-;19729:39;19760:7;19729:39;:::i;:::-;19790:91;19839:41;19863:16;19839:41;:::i;:::-;19831:6;19824:4;19818:11;19790:91;:::i;:::-;19784:4;19777:105;19695:193;19619:269;;;:::o;19894:73::-;19939:3;19894:73;:::o;19973:189::-;20050:32;;:::i;:::-;20091:65;20149:6;20141;20135:4;20091:65;:::i;:::-;20026:136;19973:189;;:::o;20168:186::-;20228:120;20245:3;20238:5;20235:14;20228:120;;;20299:39;20336:1;20329:5;20299:39;:::i;:::-;20272:1;20265:5;20261:13;20252:22;;20228:120;;;20168:186;;:::o;20360:543::-;20461:2;20456:3;20453:11;20450:446;;;20495:38;20527:5;20495:38;:::i;:::-;20579:29;20597:10;20579:29;:::i;:::-;20569:8;20565:44;20762:2;20750:10;20747:18;20744:49;;;20783:8;20768:23;;20744:49;20806:80;20862:22;20880:3;20862:22;:::i;:::-;20852:8;20848:37;20835:11;20806:80;:::i;:::-;20465:431;;20450:446;20360:543;;;:::o;20909:117::-;20963:8;21013:5;21007:4;21003:16;20982:37;;20909:117;;;;:::o;21032:169::-;21076:6;21109:51;21157:1;21153:6;21145:5;21142:1;21138:13;21109:51;:::i;:::-;21105:56;21190:4;21184;21180:15;21170:25;;21083:118;21032:169;;;;:::o;21206:295::-;21282:4;21428:29;21453:3;21447:4;21428:29;:::i;:::-;21420:37;;21490:3;21487:1;21483:11;21477:4;21474:21;21466:29;;21206:295;;;;:::o;21506:1395::-;21623:37;21656:3;21623:37;:::i;:::-;21725:18;21717:6;21714:30;21711:56;;;21747:18;;:::i;:::-;21711:56;21791:38;21823:4;21817:11;21791:38;:::i;:::-;21876:67;21936:6;21928;21922:4;21876:67;:::i;:::-;21970:1;21994:4;21981:17;;22026:2;22018:6;22015:14;22043:1;22038:618;;;;22700:1;22717:6;22714:77;;;22766:9;22761:3;22757:19;22751:26;22742:35;;22714:77;22817:67;22877:6;22870:5;22817:67;:::i;:::-;22811:4;22804:81;22673:222;22008:887;;22038:618;22090:4;22086:9;22078:6;22074:22;22124:37;22156:4;22124:37;:::i;:::-;22183:1;22197:208;22211:7;22208:1;22205:14;22197:208;;;22290:9;22285:3;22281:19;22275:26;22267:6;22260:42;22341:1;22333:6;22329:14;22319:24;;22388:2;22377:9;22373:18;22360:31;;22234:4;22231:1;22227:12;22222:17;;22197:208;;;22433:6;22424:7;22421:19;22418:179;;;22491:9;22486:3;22482:19;22476:26;22534:48;22576:4;22568:6;22564:17;22553:9;22534:48;:::i;:::-;22526:6;22519:64;22441:156;22418:179;22643:1;22639;22631:6;22627:14;22623:22;22617:4;22610:36;22045:611;;;22008:887;;21598:1303;;;21506:1395;;:::o;22907:172::-;23047:24;23043:1;23035:6;23031:14;23024:48;22907:172;:::o;23085:366::-;23227:3;23248:67;23312:2;23307:3;23248:67;:::i;:::-;23241:74;;23324:93;23413:3;23324:93;:::i;:::-;23442:2;23437:3;23433:12;23426:19;;23085:366;;;:::o;23457:419::-;23623:4;23661:2;23650:9;23646:18;23638:26;;23710:9;23704:4;23700:20;23696:1;23685:9;23681:17;23674:47;23738:131;23864:4;23738:131;:::i;:::-;23730:139;;23457:419;;;:::o;23882:194::-;23922:4;23942:20;23960:1;23942:20;:::i;:::-;23937:25;;23976:20;23994:1;23976:20;:::i;:::-;23971:25;;24020:1;24017;24013:9;24005:17;;24044:1;24038:4;24035:11;24032:37;;;24049:18;;:::i;:::-;24032:37;23882:194;;;;:::o;24082:179::-;24222:31;24218:1;24210:6;24206:14;24199:55;24082:179;:::o;24267:366::-;24409:3;24430:67;24494:2;24489:3;24430:67;:::i;:::-;24423:74;;24506:93;24595:3;24506:93;:::i;:::-;24624:2;24619:3;24615:12;24608:19;;24267:366;;;:::o;24639:419::-;24805:4;24843:2;24832:9;24828:18;24820:26;;24892:9;24886:4;24882:20;24878:1;24867:9;24863:17;24856:47;24920:131;25046:4;24920:131;:::i;:::-;24912:139;;24639:419;;;:::o;25064:172::-;25204:24;25200:1;25192:6;25188:14;25181:48;25064:172;:::o;25242:366::-;25384:3;25405:67;25469:2;25464:3;25405:67;:::i;:::-;25398:74;;25481:93;25570:3;25481:93;:::i;:::-;25599:2;25594:3;25590:12;25583:19;;25242:366;;;:::o;25614:419::-;25780:4;25818:2;25807:9;25803:18;25795:26;;25867:9;25861:4;25857:20;25853:1;25842:9;25838:17;25831:47;25895:131;26021:4;25895:131;:::i;:::-;25887:139;;25614:419;;;:::o;26039:171::-;26179:23;26175:1;26167:6;26163:14;26156:47;26039:171;:::o;26216:366::-;26358:3;26379:67;26443:2;26438:3;26379:67;:::i;:::-;26372:74;;26455:93;26544:3;26455:93;:::i;:::-;26573:2;26568:3;26564:12;26557:19;;26216:366;;;:::o;26588:419::-;26754:4;26792:2;26781:9;26777:18;26769:26;;26841:9;26835:4;26831:20;26827:1;26816:9;26812:17;26805:47;26869:131;26995:4;26869:131;:::i;:::-;26861:139;;26588:419;;;:::o;27013:173::-;27153:25;27149:1;27141:6;27137:14;27130:49;27013:173;:::o;27192:366::-;27334:3;27355:67;27419:2;27414:3;27355:67;:::i;:::-;27348:74;;27431:93;27520:3;27431:93;:::i;:::-;27549:2;27544:3;27540:12;27533:19;;27192:366;;;:::o;27564:419::-;27730:4;27768:2;27757:9;27753:18;27745:26;;27817:9;27811:4;27807:20;27803:1;27792:9;27788:17;27781:47;27845:131;27971:4;27845:131;:::i;:::-;27837:139;;27564:419;;;:::o;27989:233::-;28028:3;28051:24;28069:5;28051:24;:::i;:::-;28042:33;;28097:66;28090:5;28087:77;28084:103;;28167:18;;:::i;:::-;28084:103;28214:1;28207:5;28203:13;28196:20;;27989:233;;;:::o;28228:98::-;28279:6;28313:5;28307:12;28297:22;;28228:98;;;:::o;28332:168::-;28415:11;28449:6;28444:3;28437:19;28489:4;28484:3;28480:14;28465:29;;28332:168;;;;:::o;28506:373::-;28592:3;28620:38;28652:5;28620:38;:::i;:::-;28674:70;28737:6;28732:3;28674:70;:::i;:::-;28667:77;;28753:65;28811:6;28806:3;28799:4;28792:5;28788:16;28753:65;:::i;:::-;28843:29;28865:6;28843:29;:::i;:::-;28838:3;28834:39;28827:46;;28596:283;28506:373;;;;:::o;28885:640::-;29080:4;29118:3;29107:9;29103:19;29095:27;;29132:71;29200:1;29189:9;29185:17;29176:6;29132:71;:::i;:::-;29213:72;29281:2;29270:9;29266:18;29257:6;29213:72;:::i;:::-;29295;29363:2;29352:9;29348:18;29339:6;29295:72;:::i;:::-;29414:9;29408:4;29404:20;29399:2;29388:9;29384:18;29377:48;29442:76;29513:4;29504:6;29442:76;:::i;:::-;29434:84;;28885:640;;;;;;;:::o;29531:141::-;29587:5;29618:6;29612:13;29603:22;;29634:32;29660:5;29634:32;:::i;:::-;29531:141;;;;:::o;29678:349::-;29747:6;29796:2;29784:9;29775:7;29771:23;29767:32;29764:119;;;29802:79;;:::i;:::-;29764:119;29922:1;29947:63;30002:7;29993:6;29982:9;29978:22;29947:63;:::i;:::-;29937:73;;29893:127;29678:349;;;;:::o;30033:140::-;30082:9;30115:52;30133:33;30142:23;30159:5;30142:23;:::i;:::-;30133:33;:::i;:::-;30115:52;:::i;:::-;30102:65;;30033:140;;;:::o;30179:129::-;30265:36;30295:5;30265:36;:::i;:::-;30260:3;30253:49;30179:129;;:::o;30314:330::-;30434:4;30472:2;30461:9;30457:18;30449:26;;30485:70;30552:1;30541:9;30537:17;30528:6;30485:70;:::i;:::-;30565:72;30633:2;30622:9;30618:18;30609:6;30565:72;:::i;:::-;30314:330;;;;;:::o;30650:148::-;30752:11;30789:3;30774:18;;30650:148;;;;:::o;30804:390::-;30910:3;30938:39;30971:5;30938:39;:::i;:::-;30993:89;31075:6;31070:3;30993:89;:::i;:::-;30986:96;;31091:65;31149:6;31144:3;31137:4;31130:5;31126:16;31091:65;:::i;:::-;31181:6;31176:3;31172:16;31165:23;;30914:280;30804:390;;;;:::o;31200:435::-;31380:3;31402:95;31493:3;31484:6;31402:95;:::i;:::-;31395:102;;31514:95;31605:3;31596:6;31514:95;:::i;:::-;31507:102;;31626:3;31619:10;;31200:435;;;;;:::o

Swarm Source

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