ETH Price: $3,460.51 (-1.73%)
Gas: 4 Gwei

Token

NISHIMOTO IS THE MOUTH -PROFITS TO THE PROPHET- (NITM)
 

Overview

Max Total Supply

200 NITM

Holders

111

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 NITM
0x6b3b5eEe8a7096110E8Cb63Be91bD6F37Ad3b219
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:
Token

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-01-24
*/

// SPDX-License-Identifier: MIT
pragma solidity >=0.8.17 <0.9.0;


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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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


//import "../../utils/Context.sol";
/**
 * @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;
    }
}


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

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

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

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

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

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

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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


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

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

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

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

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

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

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

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

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


//import "../utils/introspection/IERC165.sol";
/**
 * @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);
}


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


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

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

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

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

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

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

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

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

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

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

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

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


//import "./IERC721Receiver.sol";
/**
 * @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);
}


//import "./extensions/IERC721Metadata.sol";
/**
 * @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);
}


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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

        _owners[tokenId] = to;

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

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

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

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

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

        // Clear approvals
        delete _tokenApprovals[tokenId];

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId, 1);

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

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

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

        emit Transfer(from, to, tokenId);

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

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

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

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

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

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

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


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


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

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

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

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

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

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

        return (royalty.receiver, royaltyAmount);
    }

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

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

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

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

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

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

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


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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

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


//import '@openzeppelin/contracts/utils/cryptography/MerkleProof.sol';
/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The tree and the proofs can be generated using our
 * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
 * You will find a quickstart guide in the readme.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 * OpenZeppelin's JavaScript library generates merkle trees that are safe
 * against this attack out of the box.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}


//import {IOperatorFilterRegistry} from "./IOperatorFilterRegistry.sol";
interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}


//import {OperatorFilterer} from "./OperatorFilterer.sol";
/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Allow spending tokens from addresses with balance
        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
        // from an EOA.
        if (from != msg.sender) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

    function _checkFilterOperator(address operator) internal view virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}


//import "operator-filter-registry/src/DefaultOperatorFilterer.sol";
/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}


//-----------------------------------
// Token(ERC721)
//-----------------------------------
contract Token is Ownable, ERC721, ReentrancyGuard, ERC2981, DefaultOperatorFilterer {
    //--------------------------------------
    // constant
    //--------------------------------------
    string constant private TOKEN_NAME = "NISHIMOTO IS THE MOUTH -PROFITS TO THE PROPHET-";
    string constant private TOKEN_SYMBOL = "NITM";
    address constant private OWNER_ADDRESS = 0x40a9AE87b3486d38b1eAe58D8d8AF23169796a87;

    uint96 constant private ROYALTY_FEE_NUMERATOR = 1000;    // 1000/10000 = 10%
    uint256 constant private TOKEN_ID_OFS = 1;
    uint256 constant private BLOCK_SEC_MARGIN = 30;

    // enum
    uint256 constant private INFO_SALE_SUSPENDED = 0;
    uint256 constant private INFO_SALE_START = 1;
    uint256 constant private INFO_SALE_END = 2;
    uint256 constant private INFO_SALE_PRICE = 3;
    uint256 constant private INFO_SALE_WHITELISTED = 4;
    uint256 constant private INFO_SALE_USER_MINTED = 5;
    uint256 constant private INFO_SALE_USER_MINTABLE = 6;
    uint256 constant private INFO_MAX = 7;
    uint256 constant private USER_INFO_SALE_TYPE = INFO_MAX;
    uint256 constant private USER_INFO_TOTAL_SUPPLY = INFO_MAX + 1;
    uint256 constant private USER_INFO_TOKEN_MAX = INFO_MAX + 2;
    uint256 constant private USER_INFO_MINT_LIMIT = INFO_MAX + 3;
    uint256 constant private USER_INFO_MAX = INFO_MAX + 4;

    //--------------------------------------
    // storage
    //--------------------------------------
    address private _manager;

    string private _base_uri_for_hidden;
    string private _base_uri_for_revealed;
    uint256 private _token_max;
    uint256 private _token_reserved;
    uint256 private _token_mint_limit;
    uint256 private _total_supply;

    // PRIVATE(whitelist)
    bool private _PRIVATE_SALE_is_suspended;
    uint256 private _PRIVATE_SALE_start;
    uint256 private _PRIVATE_SALE_end;
    uint256 private _PRIVATE_SALE_price;
    bytes32 private _PRIVATE_SALE_merkle_root;
    mapping( address => uint256 ) private _PRIVATE_SALE_map_user_minted;

    // PUBLIC
    bool private _PUBLIC_SALE_is_suspended;
    uint256 private _PUBLIC_SALE_start;
    uint256 private _PUBLIC_SALE_end;
    uint256 private _PUBLIC_SALE_price;
    uint256 private _PUBLIC_SALE_mintable;
    mapping( address => uint256 ) private _PUBLIC_SALE_map_user_minted;

    //--------------------------------------------------------
    // [modifier] onlyOwnerOrManager
    //--------------------------------------------------------
    modifier onlyOwnerOrManager() {
        require( msg.sender == owner() || msg.sender == manager(), "caller is not the owner neither manager" );
        _;
    }

    //--------------------------------------------------------
    // constructor
    //--------------------------------------------------------
    constructor() Ownable() ERC721( TOKEN_NAME, TOKEN_SYMBOL ) {
        if( msg.sender != OWNER_ADDRESS ){
            transferOwnership( OWNER_ADDRESS );
        }

        _setDefaultRoyalty( OWNER_ADDRESS, ROYALTY_FEE_NUMERATOR );

        _manager = msg.sender;

        //-----------------------
        // mainnet
        //-----------------------
        _base_uri_for_hidden = "ipfs://Qmdc63a6qBr61jrJQy7HygJiU11wUpuGqSMd89X9j2Lo5L/";
        _token_max = 300;
        _token_mint_limit = 1;

        //***********************
        // PRIVATE(whitelist)
        //***********************
        _PRIVATE_SALE_start = 1674727200;               // 2023-01-26 19:00:00(JST)
        _PRIVATE_SALE_end   = 1674734340;               // 2023-01-26 20:59:00(JST)
        _PRIVATE_SALE_price = 50000000000000000;        // 0.05 ETH
        _PRIVATE_SALE_merkle_root = 0xaea8314bd76e90aedeae1680cede1f639911a4f220aa0608acc9a5f11e296f59;
        
        //~~~~~~~~~~~~~~~~~~~~~~~
        // PUBLIC
        //~~~~~~~~~~~~~~~~~~~~~~~
        _PUBLIC_SALE_start = 1674734400;                // 2023-01-26 21:00:00(JST)
        _PUBLIC_SALE_end   = 1674820740;                // 2023-01-27 20:59:00(JST)
        _PUBLIC_SALE_price = 50000000000000000;         // 0.05 ETH
        _PUBLIC_SALE_mintable = 0;                      // no limit
    }

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

    //=======================================================================
    // [external/onlyOwnerOrManager] for ERC2981
    //=======================================================================
    function setDefaultRoyalty( address receiver, uint96 feeNumerator ) external onlyOwnerOrManager { _setDefaultRoyalty( receiver, feeNumerator ); }
    function deleteDefaultRoyalty() external onlyOwnerOrManager { _deleteDefaultRoyalty(); }
    function setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) external onlyOwnerOrManager { _setTokenRoyalty( tokenId, receiver, feeNumerator ); }
    function resetTokenRoyalty( uint256 tokenId ) external onlyOwnerOrManager { _resetTokenRoyalty( tokenId ); }

    //=======================================================================
    // [public/override/onlyAllowedOperatorApproval] for OperatorFilter
    //=======================================================================
    function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); }
    function approve(address operator, uint256 tokenId) public override onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); }
    function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); }
    function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); }
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); }

    //--------------------------------------------------------
    // [public] manager
    //--------------------------------------------------------
    function manager() public view returns (address) {
        return( _manager );
    }

    //--------------------------------------------------------
    // [external/onlyOwner] setManager
    //--------------------------------------------------------
    function setManager( address target ) external onlyOwner {
        _manager = target;
    }

    //--------------------------------------------------------
    // [external] get
    //--------------------------------------------------------
    function baseUriForHidden() external view returns (string memory) { return( _base_uri_for_hidden ); }
    function baseUriForRevealed() external view returns (string memory) { return( _base_uri_for_revealed ); }
    function tokenMax() external view returns (uint256) { return( _token_max ); }
    function tokenReserved() external view returns (uint256) { return( _token_reserved ); }
    function tokenMintLimit() external view returns (uint256) { return( _token_mint_limit ); }    
    function totalSupply() external view returns (uint256) { return( _total_supply ); }

    //--------------------------------------------------------
    // [external/onlyOwnerOrManager] set
    //--------------------------------------------------------
    function setBaseUriForHidden( string calldata uri ) external onlyOwnerOrManager { _base_uri_for_hidden = uri; }
    function setBaseUriForRevealed( string calldata uri ) external onlyOwnerOrManager { _base_uri_for_revealed = uri; }
    function setTokenMax( uint256 max ) external onlyOwnerOrManager { _token_max = max; }
    function setTokenReserved( uint256 reserved ) external onlyOwnerOrManager { _token_reserved = reserved; }
    function setTokenMintLimit( uint256 limit ) external onlyOwnerOrManager { _token_mint_limit = limit; }

    //--------------------------------------------------------
    // [public/override] tokenURI
    //--------------------------------------------------------
    function tokenURI( uint256 tokenId ) public view override returns (string memory) {
        require( _exists( tokenId ), "nonexistent token" );

        if( bytes(_base_uri_for_revealed).length > 0 ){
            return( string( abi.encodePacked( _base_uri_for_revealed, Strings.toString( tokenId ) ) ) );            
        }

        return( string( abi.encodePacked( _base_uri_for_hidden, Strings.toString( tokenId ) ) ) );
    }

    //********************************************************
    // [public] getInfo - PRIVATE(whitelist)
    //********************************************************
    function PRIVATE_SALE_getInfo( address target, uint256 amount, bytes32[] calldata merkleProof ) public view returns (uint256[INFO_MAX] memory) {
        uint256[INFO_MAX] memory arrRet;

        if( _PRIVATE_SALE_is_suspended ){ arrRet[INFO_SALE_SUSPENDED] = 1; }
        arrRet[INFO_SALE_START] = _PRIVATE_SALE_start;
        arrRet[INFO_SALE_END] = _PRIVATE_SALE_end;
        arrRet[INFO_SALE_PRICE] = _PRIVATE_SALE_price;
        if( _checkWhitelisted( target, amount, merkleProof ) ){
            arrRet[INFO_SALE_WHITELISTED] = 1;
            arrRet[INFO_SALE_USER_MINTABLE] = amount;
        }
        arrRet[INFO_SALE_USER_MINTED] = _PRIVATE_SALE_map_user_minted[target];

        return( arrRet );
    }

    //********************************************************
    // [external/onlyOwnerOrManager] write - PRIVATE(whitelist)
    //********************************************************
    function PRIVATE_SALE_suspend( bool flag ) external onlyOwnerOrManager { _PRIVATE_SALE_is_suspended = flag; }
    function PRIVATE_SALE_setStartEnd( uint256 start, uint256 end ) external onlyOwnerOrManager { _PRIVATE_SALE_start = start; _PRIVATE_SALE_end = end; }
    function PRIVATE_SALE_setPrice( uint256 price ) external onlyOwnerOrManager { _PRIVATE_SALE_price = price; }
    function PRIVATE_SALE_setMerkleRoot( bytes32 root ) external onlyOwnerOrManager { _PRIVATE_SALE_merkle_root = root; }

    //********************************************************
    // [external/payable/nonReentrant] mint - PRIVATE(whitelist)
    //********************************************************
    function PRIVATE_SALE_mint( uint256 num, uint256 amount, bytes32[] calldata merkleProof ) external payable nonReentrant {
        uint256[INFO_MAX] memory arrInfo = PRIVATE_SALE_getInfo( msg.sender, amount, merkleProof );

        require( arrInfo[INFO_SALE_SUSPENDED] == 0, "PRIVATE SALE: suspended" );
        require( arrInfo[INFO_SALE_START] == 0 || arrInfo[INFO_SALE_START] <= (block.timestamp+BLOCK_SEC_MARGIN), "PRIVATE SALE: not opend" );
        require( arrInfo[INFO_SALE_END] == 0 || (arrInfo[INFO_SALE_END]+BLOCK_SEC_MARGIN) > block.timestamp, "PRIVATE SALE: finished" );
        require( arrInfo[INFO_SALE_WHITELISTED] == 1, "PRIVATE SALE: not whitelisted" );
        require( arrInfo[INFO_SALE_USER_MINTABLE] >= (arrInfo[INFO_SALE_USER_MINTED]+num), "PRIVATE SALE: reached the limit" );

        _checkPayment( msg.sender, arrInfo[INFO_SALE_PRICE]*num, msg.value );

        _mintTokens( msg.sender, num );
        _PRIVATE_SALE_map_user_minted[msg.sender] += num;
    }

    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // [public] getInfo - PUBLIC
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    function PUBLIC_SALE_getInfo( address target ) public view returns (uint256[INFO_MAX] memory) {
        uint256[INFO_MAX] memory arrRet;

        if( _PUBLIC_SALE_is_suspended ){ arrRet[INFO_SALE_SUSPENDED] = 1; }
        arrRet[INFO_SALE_START] = _PUBLIC_SALE_start;
        arrRet[INFO_SALE_END] = _PUBLIC_SALE_end;
        arrRet[INFO_SALE_PRICE] = _PUBLIC_SALE_price;
        arrRet[INFO_SALE_WHITELISTED] = 1;
        arrRet[INFO_SALE_USER_MINTED] = _PUBLIC_SALE_map_user_minted[target];
        arrRet[INFO_SALE_USER_MINTABLE] = _PUBLIC_SALE_mintable;

        return( arrRet );
    }

    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // [external/onlyOwnerOrManager] write - PUBLIC
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    function PUBLIC_SALE_suspend( bool flag ) external onlyOwnerOrManager { _PUBLIC_SALE_is_suspended = flag; }
    function PUBLIC_SALE_setStartEnd( uint256 start, uint256 end ) external onlyOwnerOrManager { _PUBLIC_SALE_start = start; _PUBLIC_SALE_end = end; }
    function PUBLIC_SALE_setPrice( uint256 price ) external onlyOwnerOrManager { _PUBLIC_SALE_price = price; }
    function PUBLIC_SALE_setMintable( uint256 mintable ) external onlyOwnerOrManager { _PUBLIC_SALE_mintable = mintable; }

    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // [external/payable/nonReentrant] mint - PUBLIC
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    function PUBLIC_SALE_mint( uint256 num ) external payable nonReentrant {
        uint256[INFO_MAX] memory arrInfo = PUBLIC_SALE_getInfo( msg.sender );

        require( arrInfo[INFO_SALE_SUSPENDED] == 0, "PUBLIC SALE: suspended" );
        require( arrInfo[INFO_SALE_START] == 0 || arrInfo[INFO_SALE_START] <= (block.timestamp+BLOCK_SEC_MARGIN), "PUBLIC SALE: not opend" );
        require( arrInfo[INFO_SALE_END] == 0 || (arrInfo[INFO_SALE_END]+BLOCK_SEC_MARGIN) > block.timestamp, "PUBLIC SALE: finished" );
        require( arrInfo[INFO_SALE_USER_MINTABLE] == 0 || arrInfo[INFO_SALE_USER_MINTABLE] >= (arrInfo[INFO_SALE_USER_MINTED]+num), "PUBLIC SALE: reached the limit" );

        _checkPayment( msg.sender, arrInfo[INFO_SALE_PRICE]*num, msg.value );

        _mintTokens( msg.sender, num );
        _PUBLIC_SALE_map_user_minted[msg.sender] += num;
    }

    //--------------------------------------------------------
    // [internal] _checkWhitelisted
    //--------------------------------------------------------
    function _checkWhitelisted( address target, uint256 amount, bytes32[] calldata merkleProof ) internal view returns (bool) {
        bytes32 node = keccak256( abi.encodePacked( target, amount ) );
        return( MerkleProof.verify( merkleProof, _PRIVATE_SALE_merkle_root, node ) );
    }

    //--------------------------------------------------------
    // [internal] _checkPayment
    //--------------------------------------------------------
    function _checkPayment( address msgSender, uint256 price, uint256 payment ) internal {
        require( price <= payment, "insufficient value" );

        // refund if overpaymented
        if( price < payment ){
            uint256 change = payment - price;
            address payable target = payable( msgSender );
            target.transfer( change );
        }
    }

    //--------------------------------------------------------
    // [internal] _mintTokens
    //--------------------------------------------------------
    function _mintTokens( address to, uint256 num ) internal {
        require( _total_supply >= _token_reserved, "reservation not finished" );
        require( (_total_supply+num) <= _token_max, "exceeded the supply range" );
        require( _token_mint_limit == 0 || _token_mint_limit >= num, "reached mint limitation" );

        for( uint256 i=0; i<num; i++ ){
            _mint( to, _total_supply+(TOKEN_ID_OFS+i) );
        }
        _total_supply += num;
    }

    //--------------------------------------------------------
    // [external/onlyOwnerOrManager] reserveTokens
    //--------------------------------------------------------
    function reserveTokens( uint256 num ) external onlyOwnerOrManager {
        require( (_total_supply+num) <= _token_reserved, "exceeded the reservation range" );

        for( uint256 i=0; i<num; i++ ){
            _mint( owner(), _total_supply+(TOKEN_ID_OFS+i) );
        }
        _total_supply += num;
    }

    //--------------------------------------------------------
    // [external] getUserInfo
    //--------------------------------------------------------
    function getUserInfo( address target, uint256 amount, bytes32[] calldata merkleProof ) external view returns (uint256[USER_INFO_MAX] memory) {
        uint256[USER_INFO_MAX] memory userInfo;
        uint256[INFO_MAX] memory info;

        // PRIVATE(whitelist)
        if( (_PRIVATE_SALE_end == 0 || _PRIVATE_SALE_end > (block.timestamp+BLOCK_SEC_MARGIN/2)) && _checkWhitelisted( target, amount, merkleProof ) ){
            userInfo[USER_INFO_SALE_TYPE] = 1;
            info = PRIVATE_SALE_getInfo( target, amount, merkleProof );
        }
        // PUBLIC
        else{
            userInfo[USER_INFO_SALE_TYPE] = 2;
            info = PUBLIC_SALE_getInfo( target );
        }

        for( uint256 i=0; i<INFO_MAX; i++ ){
            userInfo[i] = info[i];
        }

        userInfo[USER_INFO_TOTAL_SUPPLY] = _total_supply;
        userInfo[USER_INFO_TOKEN_MAX] = _token_max;
        userInfo[USER_INFO_MINT_LIMIT] = _token_mint_limit;

        return( userInfo );
    }

    //--------------------------------------------------------
    // [external] checkBalance
    //--------------------------------------------------------
    function checkBalance() external view returns (uint256) {
        return( address(this).balance );
    }

    //--------------------------------------------------------
    // [external/onlyOwnerOrManager] withdraw
    //--------------------------------------------------------
    function withdraw( uint256 amount ) external onlyOwnerOrManager {
        require( amount <= address(this).balance, "insufficient balance" );

        address payable target = payable( owner() );
        target.transfer( amount );
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","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":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":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"PRIVATE_SALE_getInfo","outputs":[{"internalType":"uint256[7]","name":"","type":"uint256[7]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"PRIVATE_SALE_mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"PRIVATE_SALE_setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"PRIVATE_SALE_setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"PRIVATE_SALE_setStartEnd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"flag","type":"bool"}],"name":"PRIVATE_SALE_suspend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"PUBLIC_SALE_getInfo","outputs":[{"internalType":"uint256[7]","name":"","type":"uint256[7]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"PUBLIC_SALE_mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintable","type":"uint256"}],"name":"PUBLIC_SALE_setMintable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"PUBLIC_SALE_setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"PUBLIC_SALE_setStartEnd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"flag","type":"bool"}],"name":"PUBLIC_SALE_suspend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","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":"baseUriForHidden","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseUriForRevealed","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deleteDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"getUserInfo","outputs":[{"internalType":"uint256[11]","name":"","type":"uint256[11]"}],"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":"manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"reserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"resetTokenRoyalty","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":"setBaseUriForHidden","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseUriForRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"setManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"max","type":"uint256"}],"name":"setTokenMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"setTokenMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reserved","type":"uint256"}],"name":"setTokenReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setTokenRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenReserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060600160405280602f815260200162003bf6602f91396040805180820190915260048152634e49544d60e01b60208201526200006933620002d7565b6001620000778382620005ae565b506002620000868282620005ae565b50506001600755506daaeb6d7670e522a718067333cd4e3b15620001d35780156200012157604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b1580156200010257600080fd5b505af115801562000117573d6000803e3d6000fd5b50505050620001d3565b6001600160a01b03821615620001725760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af290390604401620000e7565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b158015620001b957600080fd5b505af1158015620001ce573d6000803e3d6000fd5b505050505b5050337340a9ae87b3486d38b1eae58d8d8af23169796a87146200021057620002107340a9ae87b3486d38b1eae58d8d8af23169796a8762000327565b620002327340a9ae87b3486d38b1eae58d8d8af23169796a876103e8620003aa565b600a80546001600160a01b031916331790556040805160608101909152603680825262003c256020830139600b906200026c9082620005ae565b5061012c600d556001600f556363d24f206012556363d26b0460135566b1a2bc2ec5000060148190557faea8314bd76e90aedeae1680cede1f639911a4f220aa0608acc9a5f11e296f596015556363d26b406018556363d3bc84601955601a556000601b556200067a565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b62000331620004ab565b6001600160a01b0381166200039c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b620003a781620002d7565b50565b6127106001600160601b03821611156200041a5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b606482015260840162000393565b6001600160a01b038216620004725760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c696420726563656976657200000000000000604482015260640162000393565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600855565b6000546001600160a01b03163314620005075760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000393565b565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200053457607f821691505b6020821081036200055557634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620005a957600081815260208120601f850160051c81016020861015620005845750805b601f850160051c820191505b81811015620005a55782815560010162000590565b5050505b505050565b81516001600160401b03811115620005ca57620005ca62000509565b620005e281620005db84546200051f565b846200055b565b602080601f8311600181146200061a5760008415620006015750858301515b600019600386901b1c1916600185901b178555620005a5565b600085815260208120601f198616915b828110156200064b578886015182559484019460019091019084016200062a565b50858210156200066a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61356c806200068a6000396000f3fe6080604052600436106102e45760003560e01c80638a616bc011610190578063c87b56dd116100dc578063f2fde38b11610095578063f7ee70681161006f578063f7ee7068146108af578063f92e4ba5146108c4578063fd0cda23146108e4578063ff4b629e1461091157600080fd5b8063f2fde38b1461085c578063f34e1ea11461087c578063f62e0eba1461089c57600080fd5b8063c87b56dd1461079a578063d031370b146107ba578063d0ebdbe7146107da578063d117bfa3146107fa578063e195d09614610827578063e985e9c51461083c57600080fd5b8063aa1b103f11610149578063b6202ef911610123578063b6202ef914610727578063b88d4fde14610747578063be900d4014610767578063c71daccb1461078757600080fd5b8063aa1b103f146106d2578063ac1349a1146106e7578063b1077d401461070757600080fd5b80638a616bc01461062a5780638da5cb5b1461064a57806395d89b4114610668578063988fe62c1461067d578063a04e5f7f1461069d578063a22cb465146106b257600080fd5b8063375926181161024f5780635944c753116102085780636352211e116101e25780636352211e146105b557806370a08231146105d5578063715018a6146105f55780637c34441e1461060a57600080fd5b80635944c753146105625780635d8ceea9146105825780635e59da6b146105a257600080fd5b806337592618146104ad5780633ef4400f146104cd57806341f43434146104ed57806342842e0e1461050f578063481c6a751461052f57806352c0295f1461054d57600080fd5b806318160ddd116102a157806318160ddd146103d95780631c58eec5146103ee57806323b872dd1461040e5780632a55205a1461042e5780632e1a7d4d1461046d5780632ff2b8361461048d57600080fd5b806301ffc9a7146102e957806304540d371461031e57806304634d8d1461033d57806306fdde031461035f578063081812fc14610381578063095ea7b3146103b9575b600080fd5b3480156102f557600080fd5b50610309610304366004612be7565b610931565b60405190151581526020015b60405180910390f35b34801561032a57600080fd5b50600f545b604051908152602001610315565b34801561034957600080fd5b5061035d610358366004612c37565b610942565b005b34801561036b57600080fd5b50610374610998565b6040516103159190612cba565b34801561038d57600080fd5b506103a161039c366004612ccd565b610a2a565b6040516001600160a01b039091168152602001610315565b3480156103c557600080fd5b5061035d6103d4366004612ce6565b610a51565b3480156103e557600080fd5b5060105461032f565b3480156103fa57600080fd5b5061035d610409366004612d10565b610a6a565b34801561041a57600080fd5b5061035d610429366004612d32565b610ab4565b34801561043a57600080fd5b5061044e610449366004612d10565b610adf565b604080516001600160a01b039093168352602083019190915201610315565b34801561047957600080fd5b5061035d610488366004612ccd565b610b8d565b34801561049957600080fd5b5061035d6104a8366004612ccd565b610c4f565b3480156104b957600080fd5b5061035d6104c8366004612ccd565b610c93565b3480156104d957600080fd5b5061035d6104e8366004612d10565b610cd7565b3480156104f957600080fd5b506103a16daaeb6d7670e522a718067333cd4e81565b34801561051b57600080fd5b5061035d61052a366004612d32565b610d21565b34801561053b57600080fd5b50600a546001600160a01b03166103a1565b34801561055957600080fd5b50610374610d46565b34801561056e57600080fd5b5061035d61057d366004612d6e565b610d55565b34801561058e57600080fd5b5061035d61059d366004612daa565b610d9f565b61035d6105b0366004612ccd565b610deb565b3480156105c157600080fd5b506103a16105d0366004612ccd565b610fda565b3480156105e157600080fd5b5061032f6105f0366004612e1c565b61103a565b34801561060157600080fd5b5061035d6110c0565b34801561061657600080fd5b5061035d610625366004612ccd565b6110d4565b34801561063657600080fd5b5061035d610645366004612ccd565b611118565b34801561065657600080fd5b506000546001600160a01b03166103a1565b34801561067457600080fd5b50610374611168565b34801561068957600080fd5b5061035d610698366004612ccd565b611177565b3480156106a957600080fd5b506103746111bb565b3480156106be57600080fd5b5061035d6106cd366004612e45565b6111ca565b3480156106de57600080fd5b5061035d6111de565b3480156106f357600080fd5b5061035d610702366004612daa565b611227565b34801561071357600080fd5b5061035d610722366004612ccd565b611273565b34801561073357600080fd5b5061035d610742366004612ccd565b6112b7565b34801561075357600080fd5b5061035d610762366004612e92565b6112fb565b34801561077357600080fd5b5061035d610782366004612ccd565b611328565b34801561079357600080fd5b504761032f565b3480156107a657600080fd5b506103746107b5366004612ccd565b61136c565b3480156107c657600080fd5b5061035d6107d5366004612ccd565b61141b565b3480156107e657600080fd5b5061035d6107f5366004612e1c565b611523565b34801561080657600080fd5b5061081a610815366004612fb3565b61154d565b604051610315919061300d565b34801561083357600080fd5b50600e5461032f565b34801561084857600080fd5b5061030961085736600461303e565b6115ce565b34801561086857600080fd5b5061035d610877366004612e1c565b6115fc565b34801561088857600080fd5b5061035d610897366004613068565b611672565b61035d6108aa366004613085565b6116c4565b3480156108bb57600080fd5b50600d5461032f565b3480156108d057600080fd5b5061035d6108df366004613068565b6118fa565b3480156108f057600080fd5b506109046108ff366004612fb3565b61194c565b60405161031591906130c0565b34801561091d57600080fd5b5061081a61092c366004612e1c565b611a94565b600061093c82611b07565b92915050565b6000546001600160a01b03163314806109655750600a546001600160a01b031633145b61098a5760405162461bcd60e51b8152600401610981906130e9565b60405180910390fd5b6109948282611b2c565b5050565b6060600180546109a790613130565b80601f01602080910402602001604051908101604052809291908181526020018280546109d390613130565b8015610a205780601f106109f557610100808354040283529160200191610a20565b820191906000526020600020905b815481529060010190602001808311610a0357829003601f168201915b5050505050905090565b6000610a3582611be6565b506000908152600560205260409020546001600160a01b031690565b81610a5b81611c45565b610a658383611cfe565b505050565b6000546001600160a01b0316331480610a8d5750600a546001600160a01b031633145b610aa95760405162461bcd60e51b8152600401610981906130e9565b601891909155601955565b826001600160a01b0381163314610ace57610ace33611c45565b610ad9848484611e0e565b50505050565b60008281526009602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610b545750604080518082019091526008546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610b73906001600160601b031687613180565b610b7d9190613197565b91519350909150505b9250929050565b6000546001600160a01b0316331480610bb05750600a546001600160a01b031633145b610bcc5760405162461bcd60e51b8152600401610981906130e9565b47811115610c135760405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b6044820152606401610981565b600080546040516001600160a01b039091169182916108fc85150291859190818181858888f19350505050158015610a65573d6000803e3d6000fd5b6000546001600160a01b0316331480610c725750600a546001600160a01b031633145b610c8e5760405162461bcd60e51b8152600401610981906130e9565b601b55565b6000546001600160a01b0316331480610cb65750600a546001600160a01b031633145b610cd25760405162461bcd60e51b8152600401610981906130e9565b600d55565b6000546001600160a01b0316331480610cfa5750600a546001600160a01b031633145b610d165760405162461bcd60e51b8152600401610981906130e9565b601291909155601355565b826001600160a01b0381163314610d3b57610d3b33611c45565b610ad9848484611e3f565b6060600b80546109a790613130565b6000546001600160a01b0316331480610d785750600a546001600160a01b031633145b610d945760405162461bcd60e51b8152600401610981906130e9565b610a65838383611e5a565b6000546001600160a01b0316331480610dc25750600a546001600160a01b031633145b610dde5760405162461bcd60e51b8152600401610981906130e9565b600c610a658284836131ff565b610df3611f25565b6000610dfe33611a94565b805190915015610e495760405162461bcd60e51b8152602060048201526016602482015275141550931250c814d053114e881cdd5cdc195b99195960521b6044820152606401610981565b60208101511580610e685750610e60601e426132d5565b602082015111155b610ead5760405162461bcd60e51b8152602060048201526016602482015275141550931250c814d053114e881b9bdd081bdc195b9960521b6044820152606401610981565b60408101511580610ece575060408101514290610ecc90601e906132d5565b115b610f125760405162461bcd60e51b8152602060048201526015602482015274141550931250c814d053114e88199a5b9a5cda1959605a1b6044820152606401610981565b60c08101511580610f36575060a0810151610f2e9083906132d5565b60c082015110155b610f825760405162461bcd60e51b815260206004820152601e60248201527f5055424c49432053414c453a207265616368656420746865206c696d697400006044820152606401610981565b610fa033838360035b6020020151610f9a9190613180565b34611f7e565b610faa338361201a565b336000908152601c602052604081208054849290610fc99084906132d5565b909155505060016007555050565b50565b6000818152600360205260408120546001600160a01b03168061093c5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610981565b60006001600160a01b0382166110a45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610981565b506001600160a01b031660009081526004602052604090205490565b6110c8612172565b6110d260006121cc565b565b6000546001600160a01b03163314806110f75750600a546001600160a01b031633145b6111135760405162461bcd60e51b8152600401610981906130e9565b601455565b6000546001600160a01b031633148061113b5750600a546001600160a01b031633145b6111575760405162461bcd60e51b8152600401610981906130e9565b600090815260096020526040812055565b6060600280546109a790613130565b6000546001600160a01b031633148061119a5750600a546001600160a01b031633145b6111b65760405162461bcd60e51b8152600401610981906130e9565b601555565b6060600c80546109a790613130565b816111d481611c45565b610a65838361221c565b6000546001600160a01b03163314806112015750600a546001600160a01b031633145b61121d5760405162461bcd60e51b8152600401610981906130e9565b6110d26000600855565b6000546001600160a01b031633148061124a5750600a546001600160a01b031633145b6112665760405162461bcd60e51b8152600401610981906130e9565b600b610a658284836131ff565b6000546001600160a01b03163314806112965750600a546001600160a01b031633145b6112b25760405162461bcd60e51b8152600401610981906130e9565b600f55565b6000546001600160a01b03163314806112da5750600a546001600160a01b031633145b6112f65760405162461bcd60e51b8152600401610981906130e9565b600e55565b836001600160a01b03811633146113155761131533611c45565b61132185858585612227565b5050505050565b6000546001600160a01b031633148061134b5750600a546001600160a01b031633145b6113675760405162461bcd60e51b8152600401610981906130e9565b601a55565b6000818152600360205260409020546060906001600160a01b03166113c75760405162461bcd60e51b81526020600482015260116024820152703737b732bc34b9ba32b73a103a37b5b2b760791b6044820152606401610981565b6000600c80546113d690613130565b9050111561141057600c6113e983612259565b6040516020016113fa9291906132e8565b6040516020818303038152906040529050919050565b600b6113e983612259565b6000546001600160a01b031633148061143e5750600a546001600160a01b031633145b61145a5760405162461bcd60e51b8152600401610981906130e9565b600e548160105461146b91906132d5565b11156114b95760405162461bcd60e51b815260206004820152601e60248201527f657863656564656420746865207265736572766174696f6e2072616e676500006044820152606401610981565b60005b81811015611508576114f66114d96000546001600160a01b031690565b6114e48360016132d5565b6010546114f191906132d5565b6122ec565b806115008161336f565b9150506114bc565b50806010600082825461151b91906132d5565b909155505050565b61152b612172565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b611555612b94565b61155d612b94565b60115460ff161561156d57600181525b60125460208201526013546040820152601454606082015261159186868686612485565b156115a5576001608082015260c081018590525b6001600160a01b03861660009081526016602052604090205460a082015290505b949350505050565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b611604612172565b6001600160a01b0381166116695760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610981565b610fd7816121cc565b6000546001600160a01b03163314806116955750600a546001600160a01b031633145b6116b15760405162461bcd60e51b8152600401610981906130e9565b6017805460ff1916911515919091179055565b6116cc611f25565b60006116da3385858561154d565b80519091501561172c5760405162461bcd60e51b815260206004820152601760248201527f505249564154452053414c453a2073757370656e6465640000000000000000006044820152606401610981565b6020810151158061174b5750611743601e426132d5565b602082015111155b6117975760405162461bcd60e51b815260206004820152601760248201527f505249564154452053414c453a206e6f74206f70656e640000000000000000006044820152606401610981565b604081015115806117b85750604081015142906117b690601e906132d5565b115b6117fd5760405162461bcd60e51b8152602060048201526016602482015275141492559055114814d053114e88199a5b9a5cda195960521b6044820152606401610981565b60808101516001146118515760405162461bcd60e51b815260206004820152601d60248201527f505249564154452053414c453a206e6f742077686974656c69737465640000006044820152606401610981565b60a08101516118619086906132d5565b60c082015110156118b45760405162461bcd60e51b815260206004820152601f60248201527f505249564154452053414c453a207265616368656420746865206c696d6974006044820152606401610981565b6118c13386836003610f8b565b6118cb338661201a565b33600090815260166020526040812080548792906118ea9084906132d5565b9091555050600160075550610ad9565b6000546001600160a01b031633148061191d5750600a546001600160a01b031633145b6119395760405162461bcd60e51b8152600401610981906130e9565b6011805460ff1916911515919091179055565b611954612bb2565b61195c612bb2565b611964612b94565b6013541580611989575061197a6002601e613197565b61198490426132d5565b601354115b801561199c575061199c87878787612485565b156119bb57600160e08301526119b48787878761154d565b90506119ce565b600260e08301526119cb87611a94565b90505b60005b6007811015611a1a578181600781106119ec576119ec6132bf565b60200201518382600b8110611a0357611a036132bf565b602002015280611a128161336f565b9150506119d1565b5060105482611a2b600760016132d5565b600b8110611a3b57611a3b6132bf565b6020020152600d5482611a50600760026132d5565b600b8110611a6057611a606132bf565b6020020152600f5482611a75600760036132d5565b600b8110611a8557611a856132bf565b60200201525095945050505050565b611a9c612b94565b611aa4612b94565b60175460ff1615611ab457600181525b601854602080830191909152601954604080840191909152601a546060840152600160808401526001600160a01b03949094166000908152601c909152929092205460a083015250601b5460c082015290565b60006001600160e01b0319821663152a902d60e11b148061093c575061093c82612513565b6127106001600160601b0382161115611b575760405162461bcd60e51b815260040161098190613388565b6001600160a01b038216611bad5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610981565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600855565b6000818152600360205260409020546001600160a01b0316610fd75760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610981565b6daaeb6d7670e522a718067333cd4e3b15610fd757604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611cb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd691906133d2565b610fd757604051633b79c77360e21b81526001600160a01b0382166004820152602401610981565b6000611d0982610fda565b9050806001600160a01b0316836001600160a01b031603611d765760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610981565b336001600160a01b0382161480611d925750611d9281336115ce565b611e045760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610981565b610a658383612563565b611e1833826125d1565b611e345760405162461bcd60e51b8152600401610981906133ef565b610a6583838361262f565b610a65838383604051806020016040528060008152506112fb565b6127106001600160601b0382161115611e855760405162461bcd60e51b815260040161098190613388565b6001600160a01b038216611edb5760405162461bcd60e51b815260206004820152601b60248201527f455243323938313a20496e76616c696420706172616d657465727300000000006044820152606401610981565b6040805180820182526001600160a01b0393841681526001600160601b0392831660208083019182526000968752600990529190942093519051909116600160a01b029116179055565b600260075403611f775760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610981565b6002600755565b80821115611fc35760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742076616c756560701b6044820152606401610981565b80821015610a65576000611fd7838361343c565b60405190915084906001600160a01b0382169083156108fc029084906000818181858888f19350505050158015612012573d6000803e3d6000fd5b505050505050565b600e54601054101561206e5760405162461bcd60e51b815260206004820152601860248201527f7265736572766174696f6e206e6f742066696e697368656400000000000000006044820152606401610981565b600d548160105461207f91906132d5565b11156120cd5760405162461bcd60e51b815260206004820152601960248201527f65786365656465642074686520737570706c792072616e6765000000000000006044820152606401610981565b600f5415806120de575080600f5410155b61212a5760405162461bcd60e51b815260206004820152601760248201527f72656163686564206d696e74206c696d69746174696f6e0000000000000000006044820152606401610981565b60005b8181101561215657612144836114e48360016132d5565b8061214e8161336f565b91505061212d565b50806010600082825461216991906132d5565b90915550505050565b6000546001600160a01b031633146110d25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610981565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6109943383836127a0565b61223133836125d1565b61224d5760405162461bcd60e51b8152600401610981906133ef565b610ad98484848461286e565b60606000612266836128a1565b600101905060008167ffffffffffffffff81111561228657612286612e7c565b6040519080825280601f01601f1916602001820160405280156122b0576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846122ba57509392505050565b6001600160a01b0382166123425760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610981565b6000818152600360205260409020546001600160a01b0316156123a75760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610981565b6123b5600083836001612979565b6000818152600360205260409020546001600160a01b03161561241a5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610981565b6001600160a01b038216600081815260046020908152604080832080546001019055848352600390915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6040516bffffffffffffffffffffffff19606086901b166020820152603481018490526000908190605401604051602081830303815290604052805190602001209050612509848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506015549150849050612a01565b9695505050505050565b60006001600160e01b031982166380ac58cd60e01b148061254457506001600160e01b03198216635b5e139f60e01b145b8061093c57506301ffc9a760e01b6001600160e01b031983161461093c565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061259882610fda565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806125dd83610fda565b9050806001600160a01b0316846001600160a01b03161480612604575061260481856115ce565b806115c65750836001600160a01b031661261d84610a2a565b6001600160a01b031614949350505050565b826001600160a01b031661264282610fda565b6001600160a01b0316146126685760405162461bcd60e51b81526004016109819061344f565b6001600160a01b0382166126ca5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610981565b6126d78383836001612979565b826001600160a01b03166126ea82610fda565b6001600160a01b0316146127105760405162461bcd60e51b81526004016109819061344f565b600081815260056020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260048552838620805460001901905590871680865283862080546001019055868652600390945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b816001600160a01b0316836001600160a01b0316036128015760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610981565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61287984848461262f565b61288584848484612a17565b610ad95760405162461bcd60e51b815260040161098190613494565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106128e05772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef8100000000831061290c576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061292a57662386f26fc10000830492506010015b6305f5e1008310612942576305f5e100830492506008015b612710831061295657612710830492506004015b60648310612968576064830492506002015b600a831061093c5760010192915050565b6001811115610ad9576001600160a01b038416156129bf576001600160a01b038416600090815260046020526040812080548392906129b990849061343c565b90915550505b6001600160a01b03831615610ad9576001600160a01b038316600090815260046020526040812080548392906129f69084906132d5565b909155505050505050565b600082612a0e8584612b15565b14949350505050565b60006001600160a01b0384163b15612b0d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612a5b9033908990889088906004016134e6565b6020604051808303816000875af1925050508015612a96575060408051601f3d908101601f19168201909252612a9391810190613519565b60015b612af3573d808015612ac4576040519150601f19603f3d011682016040523d82523d6000602084013e612ac9565b606091505b508051600003612aeb5760405162461bcd60e51b815260040161098190613494565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506115c6565b5060016115c6565b600081815b8451811015612b5a57612b4682868381518110612b3957612b396132bf565b6020026020010151612b62565b915080612b528161336f565b915050612b1a565b509392505050565b6000818310612b7e576000828152602084905260409020612b8d565b60008381526020839052604090205b9392505050565b6040518060e001604052806007906020820280368337509192915050565b604051806101600160405280600b906020820280368337509192915050565b6001600160e01b031981168114610fd757600080fd5b600060208284031215612bf957600080fd5b8135612b8d81612bd1565b80356001600160a01b0381168114612c1b57600080fd5b919050565b80356001600160601b0381168114612c1b57600080fd5b60008060408385031215612c4a57600080fd5b612c5383612c04565b9150612c6160208401612c20565b90509250929050565b60005b83811015612c85578181015183820152602001612c6d565b50506000910152565b60008151808452612ca6816020860160208601612c6a565b601f01601f19169290920160200192915050565b602081526000612b8d6020830184612c8e565b600060208284031215612cdf57600080fd5b5035919050565b60008060408385031215612cf957600080fd5b612d0283612c04565b946020939093013593505050565b60008060408385031215612d2357600080fd5b50508035926020909101359150565b600080600060608486031215612d4757600080fd5b612d5084612c04565b9250612d5e60208501612c04565b9150604084013590509250925092565b600080600060608486031215612d8357600080fd5b83359250612d9360208501612c04565b9150612da160408501612c20565b90509250925092565b60008060208385031215612dbd57600080fd5b823567ffffffffffffffff80821115612dd557600080fd5b818501915085601f830112612de957600080fd5b813581811115612df857600080fd5b866020828501011115612e0a57600080fd5b60209290920196919550909350505050565b600060208284031215612e2e57600080fd5b612b8d82612c04565b8015158114610fd757600080fd5b60008060408385031215612e5857600080fd5b612e6183612c04565b91506020830135612e7181612e37565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215612ea857600080fd5b612eb185612c04565b9350612ebf60208601612c04565b925060408501359150606085013567ffffffffffffffff80821115612ee357600080fd5b818701915087601f830112612ef757600080fd5b813581811115612f0957612f09612e7c565b604051601f8201601f19908116603f01168101908382118183101715612f3157612f31612e7c565b816040528281528a6020848701011115612f4a57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008083601f840112612f8057600080fd5b50813567ffffffffffffffff811115612f9857600080fd5b6020830191508360208260051b8501011115610b8657600080fd5b60008060008060608587031215612fc957600080fd5b612fd285612c04565b935060208501359250604085013567ffffffffffffffff811115612ff557600080fd5b61300187828801612f6e565b95989497509550505050565b60e08101818360005b6007811015613035578151835260209283019290910190600101613016565b50505092915050565b6000806040838503121561305157600080fd5b61305a83612c04565b9150612c6160208401612c04565b60006020828403121561307a57600080fd5b8135612b8d81612e37565b6000806000806060858703121561309b57600080fd5b8435935060208501359250604085013567ffffffffffffffff811115612ff557600080fd5b6101608101818360005b600b8110156130355781518352602092830192909101906001016130ca565b60208082526027908201527f63616c6c6572206973206e6f7420746865206f776e6572206e6569746865722060408201526636b0b730b3b2b960c91b606082015260800190565b600181811c9082168061314457607f821691505b60208210810361316457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761093c5761093c61316a565b6000826131b457634e487b7160e01b600052601260045260246000fd5b500490565b601f821115610a6557600081815260208120601f850160051c810160208610156131e05750805b601f850160051c820191505b81811015612012578281556001016131ec565b67ffffffffffffffff83111561321757613217612e7c565b61322b836132258354613130565b836131b9565b6000601f84116001811461325f57600085156132475750838201355b600019600387901b1c1916600186901b178355611321565b600083815260209020601f19861690835b828110156132905786850135825560209485019460019092019101613270565b50868210156132ad5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b634e487b7160e01b600052603260045260246000fd5b8082018082111561093c5761093c61316a565b60008084546132f681613130565b6001828116801561330e576001811461332357613352565b60ff1984168752821515830287019450613352565b8860005260208060002060005b858110156133495781548a820152908401908201613330565b50505082870194505b505050508351613366818360208801612c6a565b01949350505050565b6000600182016133815761338161316a565b5060010190565b6020808252602a908201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646040820152692073616c65507269636560b01b606082015260800190565b6000602082840312156133e457600080fd5b8151612b8d81612e37565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b8181038181111561093c5761093c61316a565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061250990830184612c8e565b60006020828403121561352b57600080fd5b8151612b8d81612bd156fea26469706673582212203883783b52996d450526be43f3485333cc1d6e7b7353161f68dc2f707ab2c03264736f6c634300081100334e495348494d4f544f20495320544845204d4f555448202d50524f4649545320544f205448452050524f504845542d697066733a2f2f516d64633633613671427236316a724a5179374879674a69553131775570754771534d64383958396a324c6f354c2f

Deployed Bytecode

0x6080604052600436106102e45760003560e01c80638a616bc011610190578063c87b56dd116100dc578063f2fde38b11610095578063f7ee70681161006f578063f7ee7068146108af578063f92e4ba5146108c4578063fd0cda23146108e4578063ff4b629e1461091157600080fd5b8063f2fde38b1461085c578063f34e1ea11461087c578063f62e0eba1461089c57600080fd5b8063c87b56dd1461079a578063d031370b146107ba578063d0ebdbe7146107da578063d117bfa3146107fa578063e195d09614610827578063e985e9c51461083c57600080fd5b8063aa1b103f11610149578063b6202ef911610123578063b6202ef914610727578063b88d4fde14610747578063be900d4014610767578063c71daccb1461078757600080fd5b8063aa1b103f146106d2578063ac1349a1146106e7578063b1077d401461070757600080fd5b80638a616bc01461062a5780638da5cb5b1461064a57806395d89b4114610668578063988fe62c1461067d578063a04e5f7f1461069d578063a22cb465146106b257600080fd5b8063375926181161024f5780635944c753116102085780636352211e116101e25780636352211e146105b557806370a08231146105d5578063715018a6146105f55780637c34441e1461060a57600080fd5b80635944c753146105625780635d8ceea9146105825780635e59da6b146105a257600080fd5b806337592618146104ad5780633ef4400f146104cd57806341f43434146104ed57806342842e0e1461050f578063481c6a751461052f57806352c0295f1461054d57600080fd5b806318160ddd116102a157806318160ddd146103d95780631c58eec5146103ee57806323b872dd1461040e5780632a55205a1461042e5780632e1a7d4d1461046d5780632ff2b8361461048d57600080fd5b806301ffc9a7146102e957806304540d371461031e57806304634d8d1461033d57806306fdde031461035f578063081812fc14610381578063095ea7b3146103b9575b600080fd5b3480156102f557600080fd5b50610309610304366004612be7565b610931565b60405190151581526020015b60405180910390f35b34801561032a57600080fd5b50600f545b604051908152602001610315565b34801561034957600080fd5b5061035d610358366004612c37565b610942565b005b34801561036b57600080fd5b50610374610998565b6040516103159190612cba565b34801561038d57600080fd5b506103a161039c366004612ccd565b610a2a565b6040516001600160a01b039091168152602001610315565b3480156103c557600080fd5b5061035d6103d4366004612ce6565b610a51565b3480156103e557600080fd5b5060105461032f565b3480156103fa57600080fd5b5061035d610409366004612d10565b610a6a565b34801561041a57600080fd5b5061035d610429366004612d32565b610ab4565b34801561043a57600080fd5b5061044e610449366004612d10565b610adf565b604080516001600160a01b039093168352602083019190915201610315565b34801561047957600080fd5b5061035d610488366004612ccd565b610b8d565b34801561049957600080fd5b5061035d6104a8366004612ccd565b610c4f565b3480156104b957600080fd5b5061035d6104c8366004612ccd565b610c93565b3480156104d957600080fd5b5061035d6104e8366004612d10565b610cd7565b3480156104f957600080fd5b506103a16daaeb6d7670e522a718067333cd4e81565b34801561051b57600080fd5b5061035d61052a366004612d32565b610d21565b34801561053b57600080fd5b50600a546001600160a01b03166103a1565b34801561055957600080fd5b50610374610d46565b34801561056e57600080fd5b5061035d61057d366004612d6e565b610d55565b34801561058e57600080fd5b5061035d61059d366004612daa565b610d9f565b61035d6105b0366004612ccd565b610deb565b3480156105c157600080fd5b506103a16105d0366004612ccd565b610fda565b3480156105e157600080fd5b5061032f6105f0366004612e1c565b61103a565b34801561060157600080fd5b5061035d6110c0565b34801561061657600080fd5b5061035d610625366004612ccd565b6110d4565b34801561063657600080fd5b5061035d610645366004612ccd565b611118565b34801561065657600080fd5b506000546001600160a01b03166103a1565b34801561067457600080fd5b50610374611168565b34801561068957600080fd5b5061035d610698366004612ccd565b611177565b3480156106a957600080fd5b506103746111bb565b3480156106be57600080fd5b5061035d6106cd366004612e45565b6111ca565b3480156106de57600080fd5b5061035d6111de565b3480156106f357600080fd5b5061035d610702366004612daa565b611227565b34801561071357600080fd5b5061035d610722366004612ccd565b611273565b34801561073357600080fd5b5061035d610742366004612ccd565b6112b7565b34801561075357600080fd5b5061035d610762366004612e92565b6112fb565b34801561077357600080fd5b5061035d610782366004612ccd565b611328565b34801561079357600080fd5b504761032f565b3480156107a657600080fd5b506103746107b5366004612ccd565b61136c565b3480156107c657600080fd5b5061035d6107d5366004612ccd565b61141b565b3480156107e657600080fd5b5061035d6107f5366004612e1c565b611523565b34801561080657600080fd5b5061081a610815366004612fb3565b61154d565b604051610315919061300d565b34801561083357600080fd5b50600e5461032f565b34801561084857600080fd5b5061030961085736600461303e565b6115ce565b34801561086857600080fd5b5061035d610877366004612e1c565b6115fc565b34801561088857600080fd5b5061035d610897366004613068565b611672565b61035d6108aa366004613085565b6116c4565b3480156108bb57600080fd5b50600d5461032f565b3480156108d057600080fd5b5061035d6108df366004613068565b6118fa565b3480156108f057600080fd5b506109046108ff366004612fb3565b61194c565b60405161031591906130c0565b34801561091d57600080fd5b5061081a61092c366004612e1c565b611a94565b600061093c82611b07565b92915050565b6000546001600160a01b03163314806109655750600a546001600160a01b031633145b61098a5760405162461bcd60e51b8152600401610981906130e9565b60405180910390fd5b6109948282611b2c565b5050565b6060600180546109a790613130565b80601f01602080910402602001604051908101604052809291908181526020018280546109d390613130565b8015610a205780601f106109f557610100808354040283529160200191610a20565b820191906000526020600020905b815481529060010190602001808311610a0357829003601f168201915b5050505050905090565b6000610a3582611be6565b506000908152600560205260409020546001600160a01b031690565b81610a5b81611c45565b610a658383611cfe565b505050565b6000546001600160a01b0316331480610a8d5750600a546001600160a01b031633145b610aa95760405162461bcd60e51b8152600401610981906130e9565b601891909155601955565b826001600160a01b0381163314610ace57610ace33611c45565b610ad9848484611e0e565b50505050565b60008281526009602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610b545750604080518082019091526008546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610b73906001600160601b031687613180565b610b7d9190613197565b91519350909150505b9250929050565b6000546001600160a01b0316331480610bb05750600a546001600160a01b031633145b610bcc5760405162461bcd60e51b8152600401610981906130e9565b47811115610c135760405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b6044820152606401610981565b600080546040516001600160a01b039091169182916108fc85150291859190818181858888f19350505050158015610a65573d6000803e3d6000fd5b6000546001600160a01b0316331480610c725750600a546001600160a01b031633145b610c8e5760405162461bcd60e51b8152600401610981906130e9565b601b55565b6000546001600160a01b0316331480610cb65750600a546001600160a01b031633145b610cd25760405162461bcd60e51b8152600401610981906130e9565b600d55565b6000546001600160a01b0316331480610cfa5750600a546001600160a01b031633145b610d165760405162461bcd60e51b8152600401610981906130e9565b601291909155601355565b826001600160a01b0381163314610d3b57610d3b33611c45565b610ad9848484611e3f565b6060600b80546109a790613130565b6000546001600160a01b0316331480610d785750600a546001600160a01b031633145b610d945760405162461bcd60e51b8152600401610981906130e9565b610a65838383611e5a565b6000546001600160a01b0316331480610dc25750600a546001600160a01b031633145b610dde5760405162461bcd60e51b8152600401610981906130e9565b600c610a658284836131ff565b610df3611f25565b6000610dfe33611a94565b805190915015610e495760405162461bcd60e51b8152602060048201526016602482015275141550931250c814d053114e881cdd5cdc195b99195960521b6044820152606401610981565b60208101511580610e685750610e60601e426132d5565b602082015111155b610ead5760405162461bcd60e51b8152602060048201526016602482015275141550931250c814d053114e881b9bdd081bdc195b9960521b6044820152606401610981565b60408101511580610ece575060408101514290610ecc90601e906132d5565b115b610f125760405162461bcd60e51b8152602060048201526015602482015274141550931250c814d053114e88199a5b9a5cda1959605a1b6044820152606401610981565b60c08101511580610f36575060a0810151610f2e9083906132d5565b60c082015110155b610f825760405162461bcd60e51b815260206004820152601e60248201527f5055424c49432053414c453a207265616368656420746865206c696d697400006044820152606401610981565b610fa033838360035b6020020151610f9a9190613180565b34611f7e565b610faa338361201a565b336000908152601c602052604081208054849290610fc99084906132d5565b909155505060016007555050565b50565b6000818152600360205260408120546001600160a01b03168061093c5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610981565b60006001600160a01b0382166110a45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610981565b506001600160a01b031660009081526004602052604090205490565b6110c8612172565b6110d260006121cc565b565b6000546001600160a01b03163314806110f75750600a546001600160a01b031633145b6111135760405162461bcd60e51b8152600401610981906130e9565b601455565b6000546001600160a01b031633148061113b5750600a546001600160a01b031633145b6111575760405162461bcd60e51b8152600401610981906130e9565b600090815260096020526040812055565b6060600280546109a790613130565b6000546001600160a01b031633148061119a5750600a546001600160a01b031633145b6111b65760405162461bcd60e51b8152600401610981906130e9565b601555565b6060600c80546109a790613130565b816111d481611c45565b610a65838361221c565b6000546001600160a01b03163314806112015750600a546001600160a01b031633145b61121d5760405162461bcd60e51b8152600401610981906130e9565b6110d26000600855565b6000546001600160a01b031633148061124a5750600a546001600160a01b031633145b6112665760405162461bcd60e51b8152600401610981906130e9565b600b610a658284836131ff565b6000546001600160a01b03163314806112965750600a546001600160a01b031633145b6112b25760405162461bcd60e51b8152600401610981906130e9565b600f55565b6000546001600160a01b03163314806112da5750600a546001600160a01b031633145b6112f65760405162461bcd60e51b8152600401610981906130e9565b600e55565b836001600160a01b03811633146113155761131533611c45565b61132185858585612227565b5050505050565b6000546001600160a01b031633148061134b5750600a546001600160a01b031633145b6113675760405162461bcd60e51b8152600401610981906130e9565b601a55565b6000818152600360205260409020546060906001600160a01b03166113c75760405162461bcd60e51b81526020600482015260116024820152703737b732bc34b9ba32b73a103a37b5b2b760791b6044820152606401610981565b6000600c80546113d690613130565b9050111561141057600c6113e983612259565b6040516020016113fa9291906132e8565b6040516020818303038152906040529050919050565b600b6113e983612259565b6000546001600160a01b031633148061143e5750600a546001600160a01b031633145b61145a5760405162461bcd60e51b8152600401610981906130e9565b600e548160105461146b91906132d5565b11156114b95760405162461bcd60e51b815260206004820152601e60248201527f657863656564656420746865207265736572766174696f6e2072616e676500006044820152606401610981565b60005b81811015611508576114f66114d96000546001600160a01b031690565b6114e48360016132d5565b6010546114f191906132d5565b6122ec565b806115008161336f565b9150506114bc565b50806010600082825461151b91906132d5565b909155505050565b61152b612172565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b611555612b94565b61155d612b94565b60115460ff161561156d57600181525b60125460208201526013546040820152601454606082015261159186868686612485565b156115a5576001608082015260c081018590525b6001600160a01b03861660009081526016602052604090205460a082015290505b949350505050565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b611604612172565b6001600160a01b0381166116695760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610981565b610fd7816121cc565b6000546001600160a01b03163314806116955750600a546001600160a01b031633145b6116b15760405162461bcd60e51b8152600401610981906130e9565b6017805460ff1916911515919091179055565b6116cc611f25565b60006116da3385858561154d565b80519091501561172c5760405162461bcd60e51b815260206004820152601760248201527f505249564154452053414c453a2073757370656e6465640000000000000000006044820152606401610981565b6020810151158061174b5750611743601e426132d5565b602082015111155b6117975760405162461bcd60e51b815260206004820152601760248201527f505249564154452053414c453a206e6f74206f70656e640000000000000000006044820152606401610981565b604081015115806117b85750604081015142906117b690601e906132d5565b115b6117fd5760405162461bcd60e51b8152602060048201526016602482015275141492559055114814d053114e88199a5b9a5cda195960521b6044820152606401610981565b60808101516001146118515760405162461bcd60e51b815260206004820152601d60248201527f505249564154452053414c453a206e6f742077686974656c69737465640000006044820152606401610981565b60a08101516118619086906132d5565b60c082015110156118b45760405162461bcd60e51b815260206004820152601f60248201527f505249564154452053414c453a207265616368656420746865206c696d6974006044820152606401610981565b6118c13386836003610f8b565b6118cb338661201a565b33600090815260166020526040812080548792906118ea9084906132d5565b9091555050600160075550610ad9565b6000546001600160a01b031633148061191d5750600a546001600160a01b031633145b6119395760405162461bcd60e51b8152600401610981906130e9565b6011805460ff1916911515919091179055565b611954612bb2565b61195c612bb2565b611964612b94565b6013541580611989575061197a6002601e613197565b61198490426132d5565b601354115b801561199c575061199c87878787612485565b156119bb57600160e08301526119b48787878761154d565b90506119ce565b600260e08301526119cb87611a94565b90505b60005b6007811015611a1a578181600781106119ec576119ec6132bf565b60200201518382600b8110611a0357611a036132bf565b602002015280611a128161336f565b9150506119d1565b5060105482611a2b600760016132d5565b600b8110611a3b57611a3b6132bf565b6020020152600d5482611a50600760026132d5565b600b8110611a6057611a606132bf565b6020020152600f5482611a75600760036132d5565b600b8110611a8557611a856132bf565b60200201525095945050505050565b611a9c612b94565b611aa4612b94565b60175460ff1615611ab457600181525b601854602080830191909152601954604080840191909152601a546060840152600160808401526001600160a01b03949094166000908152601c909152929092205460a083015250601b5460c082015290565b60006001600160e01b0319821663152a902d60e11b148061093c575061093c82612513565b6127106001600160601b0382161115611b575760405162461bcd60e51b815260040161098190613388565b6001600160a01b038216611bad5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610981565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600855565b6000818152600360205260409020546001600160a01b0316610fd75760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610981565b6daaeb6d7670e522a718067333cd4e3b15610fd757604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611cb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd691906133d2565b610fd757604051633b79c77360e21b81526001600160a01b0382166004820152602401610981565b6000611d0982610fda565b9050806001600160a01b0316836001600160a01b031603611d765760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610981565b336001600160a01b0382161480611d925750611d9281336115ce565b611e045760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610981565b610a658383612563565b611e1833826125d1565b611e345760405162461bcd60e51b8152600401610981906133ef565b610a6583838361262f565b610a65838383604051806020016040528060008152506112fb565b6127106001600160601b0382161115611e855760405162461bcd60e51b815260040161098190613388565b6001600160a01b038216611edb5760405162461bcd60e51b815260206004820152601b60248201527f455243323938313a20496e76616c696420706172616d657465727300000000006044820152606401610981565b6040805180820182526001600160a01b0393841681526001600160601b0392831660208083019182526000968752600990529190942093519051909116600160a01b029116179055565b600260075403611f775760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610981565b6002600755565b80821115611fc35760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742076616c756560701b6044820152606401610981565b80821015610a65576000611fd7838361343c565b60405190915084906001600160a01b0382169083156108fc029084906000818181858888f19350505050158015612012573d6000803e3d6000fd5b505050505050565b600e54601054101561206e5760405162461bcd60e51b815260206004820152601860248201527f7265736572766174696f6e206e6f742066696e697368656400000000000000006044820152606401610981565b600d548160105461207f91906132d5565b11156120cd5760405162461bcd60e51b815260206004820152601960248201527f65786365656465642074686520737570706c792072616e6765000000000000006044820152606401610981565b600f5415806120de575080600f5410155b61212a5760405162461bcd60e51b815260206004820152601760248201527f72656163686564206d696e74206c696d69746174696f6e0000000000000000006044820152606401610981565b60005b8181101561215657612144836114e48360016132d5565b8061214e8161336f565b91505061212d565b50806010600082825461216991906132d5565b90915550505050565b6000546001600160a01b031633146110d25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610981565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6109943383836127a0565b61223133836125d1565b61224d5760405162461bcd60e51b8152600401610981906133ef565b610ad98484848461286e565b60606000612266836128a1565b600101905060008167ffffffffffffffff81111561228657612286612e7c565b6040519080825280601f01601f1916602001820160405280156122b0576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846122ba57509392505050565b6001600160a01b0382166123425760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610981565b6000818152600360205260409020546001600160a01b0316156123a75760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610981565b6123b5600083836001612979565b6000818152600360205260409020546001600160a01b03161561241a5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610981565b6001600160a01b038216600081815260046020908152604080832080546001019055848352600390915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6040516bffffffffffffffffffffffff19606086901b166020820152603481018490526000908190605401604051602081830303815290604052805190602001209050612509848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506015549150849050612a01565b9695505050505050565b60006001600160e01b031982166380ac58cd60e01b148061254457506001600160e01b03198216635b5e139f60e01b145b8061093c57506301ffc9a760e01b6001600160e01b031983161461093c565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061259882610fda565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806125dd83610fda565b9050806001600160a01b0316846001600160a01b03161480612604575061260481856115ce565b806115c65750836001600160a01b031661261d84610a2a565b6001600160a01b031614949350505050565b826001600160a01b031661264282610fda565b6001600160a01b0316146126685760405162461bcd60e51b81526004016109819061344f565b6001600160a01b0382166126ca5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610981565b6126d78383836001612979565b826001600160a01b03166126ea82610fda565b6001600160a01b0316146127105760405162461bcd60e51b81526004016109819061344f565b600081815260056020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260048552838620805460001901905590871680865283862080546001019055868652600390945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b816001600160a01b0316836001600160a01b0316036128015760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610981565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61287984848461262f565b61288584848484612a17565b610ad95760405162461bcd60e51b815260040161098190613494565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106128e05772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef8100000000831061290c576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061292a57662386f26fc10000830492506010015b6305f5e1008310612942576305f5e100830492506008015b612710831061295657612710830492506004015b60648310612968576064830492506002015b600a831061093c5760010192915050565b6001811115610ad9576001600160a01b038416156129bf576001600160a01b038416600090815260046020526040812080548392906129b990849061343c565b90915550505b6001600160a01b03831615610ad9576001600160a01b038316600090815260046020526040812080548392906129f69084906132d5565b909155505050505050565b600082612a0e8584612b15565b14949350505050565b60006001600160a01b0384163b15612b0d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612a5b9033908990889088906004016134e6565b6020604051808303816000875af1925050508015612a96575060408051601f3d908101601f19168201909252612a9391810190613519565b60015b612af3573d808015612ac4576040519150601f19603f3d011682016040523d82523d6000602084013e612ac9565b606091505b508051600003612aeb5760405162461bcd60e51b815260040161098190613494565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506115c6565b5060016115c6565b600081815b8451811015612b5a57612b4682868381518110612b3957612b396132bf565b6020026020010151612b62565b915080612b528161336f565b915050612b1a565b509392505050565b6000818310612b7e576000828152602084905260409020612b8d565b60008381526020839052604090205b9392505050565b6040518060e001604052806007906020820280368337509192915050565b604051806101600160405280600b906020820280368337509192915050565b6001600160e01b031981168114610fd757600080fd5b600060208284031215612bf957600080fd5b8135612b8d81612bd1565b80356001600160a01b0381168114612c1b57600080fd5b919050565b80356001600160601b0381168114612c1b57600080fd5b60008060408385031215612c4a57600080fd5b612c5383612c04565b9150612c6160208401612c20565b90509250929050565b60005b83811015612c85578181015183820152602001612c6d565b50506000910152565b60008151808452612ca6816020860160208601612c6a565b601f01601f19169290920160200192915050565b602081526000612b8d6020830184612c8e565b600060208284031215612cdf57600080fd5b5035919050565b60008060408385031215612cf957600080fd5b612d0283612c04565b946020939093013593505050565b60008060408385031215612d2357600080fd5b50508035926020909101359150565b600080600060608486031215612d4757600080fd5b612d5084612c04565b9250612d5e60208501612c04565b9150604084013590509250925092565b600080600060608486031215612d8357600080fd5b83359250612d9360208501612c04565b9150612da160408501612c20565b90509250925092565b60008060208385031215612dbd57600080fd5b823567ffffffffffffffff80821115612dd557600080fd5b818501915085601f830112612de957600080fd5b813581811115612df857600080fd5b866020828501011115612e0a57600080fd5b60209290920196919550909350505050565b600060208284031215612e2e57600080fd5b612b8d82612c04565b8015158114610fd757600080fd5b60008060408385031215612e5857600080fd5b612e6183612c04565b91506020830135612e7181612e37565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215612ea857600080fd5b612eb185612c04565b9350612ebf60208601612c04565b925060408501359150606085013567ffffffffffffffff80821115612ee357600080fd5b818701915087601f830112612ef757600080fd5b813581811115612f0957612f09612e7c565b604051601f8201601f19908116603f01168101908382118183101715612f3157612f31612e7c565b816040528281528a6020848701011115612f4a57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008083601f840112612f8057600080fd5b50813567ffffffffffffffff811115612f9857600080fd5b6020830191508360208260051b8501011115610b8657600080fd5b60008060008060608587031215612fc957600080fd5b612fd285612c04565b935060208501359250604085013567ffffffffffffffff811115612ff557600080fd5b61300187828801612f6e565b95989497509550505050565b60e08101818360005b6007811015613035578151835260209283019290910190600101613016565b50505092915050565b6000806040838503121561305157600080fd5b61305a83612c04565b9150612c6160208401612c04565b60006020828403121561307a57600080fd5b8135612b8d81612e37565b6000806000806060858703121561309b57600080fd5b8435935060208501359250604085013567ffffffffffffffff811115612ff557600080fd5b6101608101818360005b600b8110156130355781518352602092830192909101906001016130ca565b60208082526027908201527f63616c6c6572206973206e6f7420746865206f776e6572206e6569746865722060408201526636b0b730b3b2b960c91b606082015260800190565b600181811c9082168061314457607f821691505b60208210810361316457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761093c5761093c61316a565b6000826131b457634e487b7160e01b600052601260045260246000fd5b500490565b601f821115610a6557600081815260208120601f850160051c810160208610156131e05750805b601f850160051c820191505b81811015612012578281556001016131ec565b67ffffffffffffffff83111561321757613217612e7c565b61322b836132258354613130565b836131b9565b6000601f84116001811461325f57600085156132475750838201355b600019600387901b1c1916600186901b178355611321565b600083815260209020601f19861690835b828110156132905786850135825560209485019460019092019101613270565b50868210156132ad5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b634e487b7160e01b600052603260045260246000fd5b8082018082111561093c5761093c61316a565b60008084546132f681613130565b6001828116801561330e576001811461332357613352565b60ff1984168752821515830287019450613352565b8860005260208060002060005b858110156133495781548a820152908401908201613330565b50505082870194505b505050508351613366818360208801612c6a565b01949350505050565b6000600182016133815761338161316a565b5060010190565b6020808252602a908201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646040820152692073616c65507269636560b01b606082015260800190565b6000602082840312156133e457600080fd5b8151612b8d81612e37565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b8181038181111561093c5761093c61316a565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061250990830184612c8e565b60006020828403121561352b57600080fd5b8151612b8d81612bd156fea26469706673582212203883783b52996d450526be43f3485333cc1d6e7b7353161f68dc2f707ab2c03264736f6c63430008110033

Deployed Bytecode Sourcemap

75674:18331:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80105:164;;;;;;;;;;-1:-1:-1;80105:164:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;80105:164:0;;;;;;;;83136:90;;;;;;;;;;-1:-1:-1;83204:17:0;;83136:90;;;738:25:1;;;726:2;711:18;83136:90:0;592:177:1;80485:145:0;;;;;;;;;;-1:-1:-1;80485:145:0;;;;;:::i;:::-;;:::i;:::-;;38218:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;39730:171::-;;;;;;;;;;-1:-1:-1;39730:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2504:32:1;;;2486:51;;2474:2;2459:18;39730:171:0;2340:203:1;81418:143:0;;;;;;;;;;-1:-1:-1;81418:143:0;;;;;:::i;:::-;;:::i;83236:83::-;;;;;;;;;;-1:-1:-1;83301:13:0;;83236:83;;88533:146;;;;;;;;;;-1:-1:-1;88533:146:0;;;;;:::i;:::-;;:::i;81567:149::-;;;;;;;;;;-1:-1:-1;81567:149:0;;;;;:::i;:::-;;:::i;55453:442::-;;;;;;;;;;-1:-1:-1;55453:442:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3585:32:1;;;3567:51;;3649:2;3634:18;;3627:34;;;;3540:18;55453:442:0;3393:274:1;93759:241:0;;;;;;;;;;-1:-1:-1;93759:241:0;;;;;:::i;:::-;;:::i;88797:118::-;;;;;;;;;;-1:-1:-1;88797:118:0;;;;;:::i;:::-;;:::i;83735:85::-;;;;;;;;;;-1:-1:-1;83735:85:0;;;;;:::i;:::-;;:::i;85874:149::-;;;;;;;;;;-1:-1:-1;85874:149:0;;;;;:::i;:::-;;:::i;73107:143::-;;;;;;;;;;;;73207:42;73107:143;;81722:157;;;;;;;;;;-1:-1:-1;81722:157:0;;;;;:::i;:::-;;:::i;82228:86::-;;;;;;;;;;-1:-1:-1;82296:8:0;;-1:-1:-1;;;;;82296:8:0;82228:86;;82742:101;;;;;;;;;;;;;:::i;80730:167::-;;;;;;;;;;-1:-1:-1;80730:167:0;;;;;:::i;:::-;;:::i;83614:115::-;;;;;;;;;;-1:-1:-1;83614:115:0;;;;;:::i;:::-;;:::i;89105:872::-;;;;;;:::i;:::-;;:::i;37928:223::-;;;;;;;;;;-1:-1:-1;37928:223:0;;;;;:::i;:::-;;:::i;37659:207::-;;;;;;;;;;-1:-1:-1;37659:207:0;;;;;:::i;:::-;;:::i;26931:103::-;;;;;;;;;;;;;:::i;86029:108::-;;;;;;;;;;-1:-1:-1;86029:108:0;;;;;:::i;:::-;;:::i;80903:::-;;;;;;;;;;-1:-1:-1;80903:108:0;;;;;:::i;:::-;;:::i;26283:87::-;;;;;;;;;;-1:-1:-1;26329:7:0;26356:6;-1:-1:-1;;;;;26356:6:0;26283:87;;38387:104;;;;;;;;;;;;;:::i;86143:117::-;;;;;;;;;;-1:-1:-1;86143:117:0;;;;;:::i;:::-;;:::i;82849:105::-;;;;;;;;;;;;;:::i;81250:162::-;;;;;;;;;;-1:-1:-1;81250:162:0;;;;;:::i;:::-;;:::i;80636:88::-;;;;;;;;;;;;;:::i;83497:111::-;;;;;;;;;;-1:-1:-1;83497:111:0;;;;;:::i;:::-;;:::i;83937:102::-;;;;;;;;;;-1:-1:-1;83937:102:0;;;;;:::i;:::-;;:::i;83826:105::-;;;;;;;;;;-1:-1:-1;83826:105:0;;;;;:::i;:::-;;:::i;81885:182::-;;;;;;;;;;-1:-1:-1;81885:182:0;;;;;:::i;:::-;;:::i;88685:106::-;;;;;;;;;;-1:-1:-1;88685:106:0;;;;;:::i;:::-;;:::i;93470:::-;;;;;;;;;;-1:-1:-1;93545:21:0;93470:106;;84210:441;;;;;;;;;;-1:-1:-1;84210:441:0;;;;;:::i;:::-;;:::i;91818:316::-;;;;;;;;;;-1:-1:-1;91818:316:0;;;;;:::i;:::-;;:::i;82490:93::-;;;;;;;;;;-1:-1:-1;82490:93:0;;;;;:::i;:::-;;:::i;84833:725::-;;;;;;;;;;-1:-1:-1;84833:725:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;83043:87::-;;;;;;;;;;-1:-1:-1;83110:15:0;;83043:87;;40199:164;;;;;;;;;;-1:-1:-1;40199:164:0;;;;;:::i;:::-;;:::i;27189:201::-;;;;;;;;;;-1:-1:-1;27189:201:0;;;;;:::i;:::-;;:::i;88420:107::-;;;;;;;;;;-1:-1:-1;88420:107:0;;;;;:::i;:::-;;:::i;86462:997::-;;;;;;:::i;:::-;;:::i;82960:77::-;;;;;;;;;;-1:-1:-1;83022:10:0;;82960:77;;85759:109;;;;;;;;;;-1:-1:-1;85759:109:0;;;;;:::i;:::-;;:::i;92301:1001::-;;;;;;;;;;-1:-1:-1;92301:1001:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;87629:602::-;;;;;;;;;;-1:-1:-1;87629:602:0;;;;;:::i;:::-;;:::i;80105:164::-;80201:4;80225:36;80249:11;80225:23;:36::i;:::-;80218:43;80105:164;-1:-1:-1;;80105:164:0:o;80485:145::-;26329:7;26356:6;-1:-1:-1;;;;;26356:6:0;78272:10;:21;;:48;;-1:-1:-1;82296:8:0;;-1:-1:-1;;;;;82296:8:0;78297:10;:23;78272:48;78263:102;;;;-1:-1:-1;;;78263:102:0;;;;;;;:::i;:::-;;;;;;;;;80583:44:::1;80603:8;80613:12;80583:18;:44::i;:::-;80485:145:::0;;:::o;38218:100::-;38272:13;38305:5;38298:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38218:100;:::o;39730:171::-;39806:7;39826:23;39841:7;39826:14;:23::i;:::-;-1:-1:-1;39869:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;39869:24:0;;39730:171::o;81418:143::-;81514:8;74628:30;74649:8;74628:20;:30::i;:::-;81526:32:::1;81540:8;81550:7;81526:13;:32::i;:::-;81418:143:::0;;;:::o;88533:146::-;26329:7;26356:6;-1:-1:-1;;;;;26356:6:0;78272:10;:21;;:48;;-1:-1:-1;82296:8:0;;-1:-1:-1;;;;;82296:8:0;78297:10;:23;78272:48;78263:102;;;;-1:-1:-1;;;78263:102:0;;;;;;;:::i;:::-;88626:18:::1;:26:::0;;;;88654:16:::1;:22:::0;88533:146::o;81567:149::-;81668:4;-1:-1:-1;;;;;74448:18:0;;74456:10;74448:18;74444:83;;74483:32;74504:10;74483:20;:32::i;:::-;81676:37:::1;81695:4;81701:2;81705:7;81676:18;:37::i;:::-;81567:149:::0;;;;:::o;55453:442::-;55550:7;55608:27;;;:17;:27;;;;;;;;55579:56;;;;;;;;;-1:-1:-1;;;;;55579:56:0;;;;;-1:-1:-1;;;55579:56:0;;;-1:-1:-1;;;;;55579:56:0;;;;;;;;55550:7;;55648:92;;-1:-1:-1;55699:29:0;;;;;;;;;55709:19;55699:29;-1:-1:-1;;;;;55699:29:0;;;;-1:-1:-1;;;55699:29:0;;-1:-1:-1;;;;;55699:29:0;;;;;55648:92;55790:23;;;;55752:21;;56261:5;;55777:36;;-1:-1:-1;;;;;55777:36:0;:10;:36;:::i;:::-;55776:58;;;;:::i;:::-;55855:16;;;-1:-1:-1;55752:82:0;;-1:-1:-1;;55453:442:0;;;;;;:::o;93759:241::-;26329:7;26356:6;-1:-1:-1;;;;;26356:6:0;78272:10;:21;;:48;;-1:-1:-1;82296:8:0;;-1:-1:-1;;;;;82296:8:0;78297:10;:23;78272:48;78263:102;;;;-1:-1:-1;;;78263:102:0;;;;;;;:::i;:::-;93853:21:::1;93843:6;:31;;93834:66;;;::::0;-1:-1:-1;;;93834:66:0;;11635:2:1;93834:66:0::1;::::0;::::1;11617:21:1::0;11674:2;11654:18;;;11647:30;-1:-1:-1;;;11693:18:1;;;11686:50;11753:18;;93834:66:0::1;11433:344:1::0;93834:66:0::1;93913:22;26356:6:::0;;93967:25:::1;::::0;-1:-1:-1;;;;;26356:6:0;;;;;;93967:25:::1;::::0;::::1;;::::0;;;;;93913:22;93967:25;;26356:6;93967:25;::::1;;;;;;;;;;;;;::::0;::::1;;;;88797:118:::0;26329:7;26356:6;-1:-1:-1;;;;;26356:6:0;78272:10;:21;;:48;;-1:-1:-1;82296:8:0;;-1:-1:-1;;;;;82296:8:0;78297:10;:23;78272:48;78263:102;;;;-1:-1:-1;;;78263:102:0;;;;;;;:::i;:::-;88880:21:::1;:32:::0;88797:118::o;83735:85::-;26329:7;26356:6;-1:-1:-1;;;;;26356:6:0;78272:10;:21;;:48;;-1:-1:-1;82296:8:0;;-1:-1:-1;;;;;82296:8:0;78297:10;:23;78272:48;78263:102;;;;-1:-1:-1;;;78263:102:0;;;;;;;:::i;:::-;83801:10:::1;:16:::0;83735:85::o;85874:149::-;26329:7;26356:6;-1:-1:-1;;;;;26356:6:0;78272:10;:21;;:48;;-1:-1:-1;82296:8:0;;-1:-1:-1;;;;;82296:8:0;78297:10;:23;78272:48;78263:102;;;;-1:-1:-1;;;78263:102:0;;;;;;;:::i;:::-;85968:19:::1;:27:::0;;;;85997:17:::1;:23:::0;85874:149::o;81722:157::-;81827:4;-1:-1:-1;;;;;74448:18:0;;74456:10;74448:18;74444:83;;74483:32;74504:10;74483:20;:32::i;:::-;81835:41:::1;81858:4;81864:2;81868:7;81835:22;:41::i;82742:101::-:0;82793:13;82818:20;82810:30;;;;;:::i;80730:167::-;26329:7;26356:6;-1:-1:-1;;;;;26356:6:0;78272:10;:21;;:48;;-1:-1:-1;82296:8:0;;-1:-1:-1;;;;;82296:8:0;78297:10;:23;78272:48;78263:102;;;;-1:-1:-1;;;78263:102:0;;;;;;;:::i;:::-;80843:51:::1;80861:7;80870:8;80880:12;80843:16;:51::i;83614:115::-:0;26329:7;26356:6;-1:-1:-1;;;;;26356:6:0;78272:10;:21;;:48;;-1:-1:-1;82296:8:0;;-1:-1:-1;;;;;82296:8:0;78297:10;:23;78272:48;78263:102;;;;-1:-1:-1;;;78263:102:0;;;;;;;:::i;:::-;83698:22:::1;:28;83723:3:::0;;83698:22;:28:::1;:::i;89105:872::-:0;60187:21;:19;:21::i;:::-;89187:32:::1;89222:33;89243:10;89222:19;:33::i;:::-;89277:28:::0;;89187:68;;-1:-1:-1;89277:33:0;89268:70:::1;;;::::0;-1:-1:-1;;;89268:70:0;;14174:2:1;89268:70:0::1;::::0;::::1;14156:21:1::0;14213:2;14193:18;;;14186:30;-1:-1:-1;;;14232:18:1;;;14225:52;14294:18;;89268:70:0::1;13972:346:1::0;89268:70:0::1;89358:24;::::0;::::1;::::0;:29;;:95:::1;;-1:-1:-1::0;89420:32:0::1;76286:2;89420:15;:32;:::i;:::-;89391:24;::::0;::::1;::::0;:62:::1;;89358:95;89349:132;;;::::0;-1:-1:-1;;;89349:132:0;;14655:2:1;89349:132:0::1;::::0;::::1;14637:21:1::0;14694:2;14674:18;;;14667:30;-1:-1:-1;;;14713:18:1;;;14706:52;14775:18;;89349:132:0::1;14453:346:1::0;89349:132:0::1;89501:22:::0;;::::1;::::0;:27;;:90:::1;;-1:-1:-1::0;89533:22:0;;::::1;::::0;89576:15:::1;::::0;89533:39:::1;::::0;76286:2:::1;::::0;89533:39:::1;:::i;:::-;89532:59;89501:90;89492:126;;;::::0;-1:-1:-1;;;89492:126:0;;15006:2:1;89492:126:0::1;::::0;::::1;14988:21:1::0;15045:2;15025:18;;;15018:30;-1:-1:-1;;;15064:18:1;;;15057:51;15125:18;;89492:126:0::1;14804:345:1::0;89492:126:0::1;89638:32:::0;;::::1;::::0;:37;;:113:::1;;-1:-1:-1::0;89716:30:0;;::::1;::::0;:34:::1;::::0;89747:3;;89716:34:::1;:::i;:::-;89679:32:::0;;::::1;::::0;:72:::1;;89638:113;89629:158;;;::::0;-1:-1:-1;;;89629:158:0;;15356:2:1;89629:158:0::1;::::0;::::1;15338:21:1::0;15395:2;15375:18;;;15368:30;15434:32;15414:18;;;15407:60;15484:18;;89629:158:0::1;15154:354:1::0;89629:158:0::1;89800:68;89815:10;89852:3:::0;89827:7;76508:1:::1;89827:24;;;;;:28;;;;:::i;:::-;89857:9;89800:13;:68::i;:::-;89881:30;89894:10;89906:3;89881:11;:30::i;:::-;89951:10;89922:40;::::0;;;:28:::1;:40;::::0;;;;:47;;89966:3;;89922:40;:47:::1;::::0;89966:3;;89922:47:::1;:::i;:::-;::::0;;;-1:-1:-1;;59625:1:0;60751:7;:22;-1:-1:-1;89105:872:0;:::o;60231:20::-;89105:872;:::o;37928:223::-;38000:7;42815:16;;;:7;:16;;;;;;-1:-1:-1;;;;;42815:16:0;;38064:56;;;;-1:-1:-1;;;38064:56:0;;15715:2:1;38064:56:0;;;15697:21:1;15754:2;15734:18;;;15727:30;-1:-1:-1;;;15773:18:1;;;15766:54;15837:18;;38064:56:0;15513:348:1;37659:207:0;37731:7;-1:-1:-1;;;;;37759:19:0;;37751:73;;;;-1:-1:-1;;;37751:73:0;;16068:2:1;37751:73:0;;;16050:21:1;16107:2;16087:18;;;16080:30;16146:34;16126:18;;;16119:62;-1:-1:-1;;;16197:18:1;;;16190:39;16246:19;;37751:73:0;15866:405:1;37751:73:0;-1:-1:-1;;;;;;37842:16:0;;;;;:9;:16;;;;;;;37659:207::o;26931:103::-;26169:13;:11;:13::i;:::-;26996:30:::1;27023:1;26996:18;:30::i;:::-;26931:103::o:0;86029:108::-;26329:7;26356:6;-1:-1:-1;;;;;26356:6:0;78272:10;:21;;:48;;-1:-1:-1;82296:8:0;;-1:-1:-1;;;;;82296:8:0;78297:10;:23;78272:48;78263:102;;;;-1:-1:-1;;;78263:102:0;;;;;;;:::i;:::-;86107:19:::1;:27:::0;86029:108::o;80903:::-;26329:7;26356:6;-1:-1:-1;;;;;26356:6:0;78272:10;:21;;:48;;-1:-1:-1;82296:8:0;;-1:-1:-1;;;;;82296:8:0;78297:10;:23;78272:48;78263:102;;;;-1:-1:-1;;;78263:102:0;;;;;;;:::i;:::-;57909:26;;;;:17;:26;;;;;57902:33;89105:872::o;38387:104::-;38443:13;38476:7;38469:14;;;;;:::i;86143:117::-;26329:7;26356:6;-1:-1:-1;;;;;26356:6:0;78272:10;:21;;:48;;-1:-1:-1;82296:8:0;;-1:-1:-1;;;;;82296:8:0;78297:10;:23;78272:48;78263:102;;;;-1:-1:-1;;;78263:102:0;;;;;;;:::i;:::-;86225:25:::1;:32:::0;86143:117::o;82849:105::-;82902:13;82927:22;82919:32;;;;;:::i;81250:162::-;81354:8;74628:30;74649:8;74628:20;:30::i;:::-;81366:43:::1;81390:8;81400;81366:23;:43::i;80636:88::-:0;26329:7;26356:6;-1:-1:-1;;;;;26356:6:0;78272:10;:21;;:48;;-1:-1:-1;82296:8:0;;-1:-1:-1;;;;;82296:8:0;78297:10;:23;78272:48;78263:102;;;;-1:-1:-1;;;78263:102:0;;;;;;;:::i;:::-;80698:23:::1;57021:19:::0;;57014:26;56953:95;83497:111;26329:7;26356:6;-1:-1:-1;;;;;26356:6:0;78272:10;:21;;:48;;-1:-1:-1;82296:8:0;;-1:-1:-1;;;;;82296:8:0;78297:10;:23;78272:48;78263:102;;;;-1:-1:-1;;;78263:102:0;;;;;;;:::i;:::-;83579:20:::1;:26;83602:3:::0;;83579:20;:26:::1;:::i;83937:102::-:0;26329:7;26356:6;-1:-1:-1;;;;;26356:6:0;78272:10;:21;;:48;;-1:-1:-1;82296:8:0;;-1:-1:-1;;;;;82296:8:0;78297:10;:23;78272:48;78263:102;;;;-1:-1:-1;;;78263:102:0;;;;;;;:::i;:::-;84011:17:::1;:25:::0;83937:102::o;83826:105::-;26329:7;26356:6;-1:-1:-1;;;;;26356:6:0;78272:10;:21;;:48;;-1:-1:-1;82296:8:0;;-1:-1:-1;;;;;82296:8:0;78297:10;:23;78272:48;78263:102;;;;-1:-1:-1;;;78263:102:0;;;;;;;:::i;:::-;83902:15:::1;:26:::0;83826:105::o;81885:182::-;82009:4;-1:-1:-1;;;;;74448:18:0;;74456:10;74448:18;74444:83;;74483:32;74504:10;74483:20;:32::i;:::-;82017:47:::1;82040:4;82046:2;82050:7;82059:4;82017:22;:47::i;:::-;81885:182:::0;;;;;:::o;88685:106::-;26329:7;26356:6;-1:-1:-1;;;;;26356:6:0;78272:10;:21;;:48;;-1:-1:-1;82296:8:0;;-1:-1:-1;;;;;82296:8:0;78297:10;:23;78272:48;78263:102;;;;-1:-1:-1;;;78263:102:0;;;;;;;:::i;:::-;88762:18:::1;:26:::0;88685:106::o;84210:441::-;43217:4;42815:16;;;:7;:16;;;;;;84277:13;;-1:-1:-1;;;;;42815:16:0;84303:50;;;;-1:-1:-1;;;84303:50:0;;16478:2:1;84303:50:0;;;16460:21:1;16517:2;16497:18;;;16490:30;-1:-1:-1;;;16536:18:1;;;16529:47;16593:18;;84303:50:0;16276:341:1;84303:50:0;84409:1;84376:22;84370:36;;;;;:::i;:::-;;;:40;84366:176;;;84461:22;84485:27;84503:7;84485:16;:27::i;:::-;84443:71;;;;;;;;;:::i;:::-;;;;;;;;;;;;;84427:91;;84210:441;;;:::o;84366:176::-;84588:20;84610:27;84628:7;84610:16;:27::i;91818:316::-;26329:7;26356:6;-1:-1:-1;;;;;26356:6:0;78272:10;:21;;:48;;-1:-1:-1;82296:8:0;;-1:-1:-1;;;;;82296:8:0;78297:10;:23;78272:48;78263:102;;;;-1:-1:-1;;;78263:102:0;;;;;;;:::i;:::-;91927:15:::1;;91919:3;91905:13;;:17;;;;:::i;:::-;91904:38;;91895:83;;;::::0;-1:-1:-1;;;91895:83:0;;17849:2:1;91895:83:0::1;::::0;::::1;17831:21:1::0;17888:2;17868:18;;;17861:30;17927:32;17907:18;;;17900:60;17977:18;;91895:83:0::1;17647:354:1::0;91895:83:0::1;91996:9;91991:105;92011:3;92009:1;:5;91991:105;;;92036:48;92043:7;26329::::0;26356:6;-1:-1:-1;;;;;26356:6:0;;26283:87;92043:7:::1;92067:14;92080:1:::0;76234::::1;92067:14;:::i;:::-;92052:13;;:30;;;;:::i;:::-;92036:5;:48::i;:::-;92016:3:::0;::::1;::::0;::::1;:::i;:::-;;;;91991:105;;;;92123:3;92106:13;;:20;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;91818:316:0:o;82490:93::-;26169:13;:11;:13::i;:::-;82558:8:::1;:17:::0;;-1:-1:-1;;;;;;82558:17:0::1;-1:-1:-1::0;;;;;82558:17:0;;;::::1;::::0;;;::::1;::::0;;82490:93::o;84833:725::-;84950:24;;:::i;:::-;84987:31;;:::i;:::-;85035:26;;;;85031:68;;;85095:1;85065:31;;85031:68;85135:19;;85109:23;;;:45;85189:17;;85165:21;;;:41;85243:19;;85217:23;;;:45;85277:48;85296:6;85304;85312:11;;85277:17;:48::i;:::-;85273:169;;;85374:1;85342:29;;;:33;85390:31;;;:40;;;85273:169;-1:-1:-1;;;;;85484:37:0;;;;;;:29;:37;;;;;;85452:29;;;:69;:6;-1:-1:-1;84833:725:0;;;;;;;:::o;40199:164::-;-1:-1:-1;;;;;40320:25:0;;;40296:4;40320:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;40199:164::o;27189:201::-;26169:13;:11;:13::i;:::-;-1:-1:-1;;;;;27278:22:0;::::1;27270:73;;;::::0;-1:-1:-1;;;27270:73:0;;18348:2:1;27270:73:0::1;::::0;::::1;18330:21:1::0;18387:2;18367:18;;;18360:30;18426:34;18406:18;;;18399:62;-1:-1:-1;;;18477:18:1;;;18470:36;18523:19;;27270:73:0::1;18146:402:1::0;27270:73:0::1;27354:28;27373:8;27354:18;:28::i;88420:107::-:0;26329:7;26356:6;-1:-1:-1;;;;;26356:6:0;78272:10;:21;;:48;;-1:-1:-1;82296:8:0;;-1:-1:-1;;;;;82296:8:0;78297:10;:23;78272:48;78263:102;;;;-1:-1:-1;;;78263:102:0;;;;;;;:::i;:::-;88492:25:::1;:32:::0;;-1:-1:-1;;88492:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;88420:107::o;86462:997::-;60187:21;:19;:21::i;:::-;86593:32:::1;86628:55;86650:10;86662:6;86670:11;;86628:20;:55::i;:::-;86705:28:::0;;86593:90;;-1:-1:-1;86705:33:0;86696:71:::1;;;::::0;-1:-1:-1;;;86696:71:0;;18755:2:1;86696:71:0::1;::::0;::::1;18737:21:1::0;18794:2;18774:18;;;18767:30;18833:25;18813:18;;;18806:53;18876:18;;86696:71:0::1;18553:347:1::0;86696:71:0::1;86787:24;::::0;::::1;::::0;:29;;:95:::1;;-1:-1:-1::0;86849:32:0::1;76286:2;86849:15;:32;:::i;:::-;86820:24;::::0;::::1;::::0;:62:::1;;86787:95;86778:133;;;::::0;-1:-1:-1;;;86778:133:0;;19107:2:1;86778:133:0::1;::::0;::::1;19089:21:1::0;19146:2;19126:18;;;19119:30;19185:25;19165:18;;;19158:53;19228:18;;86778:133:0::1;18905:347:1::0;86778:133:0::1;86931:22:::0;;::::1;::::0;:27;;:90:::1;;-1:-1:-1::0;86963:22:0;;::::1;::::0;87006:15:::1;::::0;86963:39:::1;::::0;76286:2:::1;::::0;86963:39:::1;:::i;:::-;86962:59;86931:90;86922:127;;;::::0;-1:-1:-1;;;86922:127:0;;19459:2:1;86922:127:0::1;::::0;::::1;19441:21:1::0;19498:2;19478:18;;;19471:30;-1:-1:-1;;;19517:18:1;;;19510:52;19579:18;;86922:127:0::1;19257:346:1::0;86922:127:0::1;87069:30:::0;;::::1;::::0;87103:1:::1;87069:35;87060:79;;;::::0;-1:-1:-1;;;87060:79:0;;19810:2:1;87060:79:0::1;::::0;::::1;19792:21:1::0;19849:2;19829:18;;;19822:30;19888:31;19868:18;;;19861:59;19937:18;;87060:79:0::1;19608:353:1::0;87060:79:0::1;87196:30:::0;;::::1;::::0;:34:::1;::::0;87227:3;;87196:34:::1;:::i;:::-;87159:32:::0;;::::1;::::0;:72:::1;;87150:118;;;::::0;-1:-1:-1;;;87150:118:0;;20168:2:1;87150:118:0::1;::::0;::::1;20150:21:1::0;20207:2;20187:18;;;20180:30;20246:33;20226:18;;;20219:61;20297:18;;87150:118:0::1;19966:355:1::0;87150:118:0::1;87281:68;87296:10;87333:3:::0;87308:7;76508:1:::1;87308:24;::::0;87281:68:::1;87362:30;87375:10;87387:3;87362:11;:30::i;:::-;87433:10;87403:41;::::0;;;:29:::1;:41;::::0;;;;:48;;87448:3;;87403:41;:48:::1;::::0;87448:3;;87403:48:::1;:::i;:::-;::::0;;;-1:-1:-1;;59625:1:0;60751:7;:22;-1:-1:-1;60231:20:0;60568:213;85759:109;26329:7;26356:6;-1:-1:-1;;;;;26356:6:0;78272:10;:21;;:48;;-1:-1:-1;82296:8:0;;-1:-1:-1;;;;;82296:8:0;78297:10;:23;78272:48;78263:102;;;;-1:-1:-1;;;78263:102:0;;;;;;;:::i;:::-;85832:26:::1;:33:::0;;-1:-1:-1;;85832:33:0::1;::::0;::::1;;::::0;;;::::1;::::0;;85759:109::o;92301:1001::-;92411:29;;:::i;:::-;92453:38;;:::i;:::-;92502:29;;:::i;:::-;92580:17;;:22;;:82;;-1:-1:-1;92643:18:0;92660:1;76286:2;92643:18;:::i;:::-;92627:34;;:15;:34;:::i;:::-;92606:17;;:56;92580:82;92579:136;;;;;92667:48;92686:6;92694;92702:11;;92667:17;:48::i;:::-;92575:419;;;92764:1;92732:29;;;:33;92787:51;92809:6;92817;92825:11;;92787:20;:51::i;:::-;92780:58;;92575:419;;;92930:1;92898:29;;;:33;92953:29;92974:6;92953:19;:29::i;:::-;92946:36;;92575:419;93011:9;93006:83;76725:1;93024;:10;93006:83;;;93070:4;93075:1;93070:7;;;;;;;:::i;:::-;;;;;93056:8;93065:1;93056:11;;;;;;;:::i;:::-;;;;:21;93036:3;;;;:::i;:::-;;;;93006:83;;;-1:-1:-1;93136:13:0;;93101:8;76845:12;76725:1;76856;76845:12;:::i;:::-;93101:32;;;;;;;:::i;:::-;;;;:48;93192:10;;93160:8;76911:12;76725:1;76922;76911:12;:::i;:::-;93160:29;;;;;;;:::i;:::-;;;;:42;93246:17;;93213:8;76978:12;76725:1;76989;76978:12;:::i;:::-;93213:30;;;;;;;:::i;:::-;;;;:50;-1:-1:-1;93284:8:0;92301:1001;-1:-1:-1;;;;;92301:1001:0:o;87629:602::-;87697:24;;:::i;:::-;87734:31;;:::i;:::-;87782:25;;;;87778:67;;;87841:1;87811:31;;87778:67;87881:18;;87855:23;;;;:44;;;;87934:16;;87910:21;;;;:40;;;;87987:18;;87961:23;;;:44;76408:1;88016:29;;;:33;-1:-1:-1;;;;;88092:36:0;;;;-1:-1:-1;88092:36:0;;;:28;:36;;;;;;;;88060:29;;;:68;-1:-1:-1;88173:21:0;;88139:31;;;:55;87855:6;87629:602::o;55183:215::-;55285:4;-1:-1:-1;;;;;;55309:41:0;;-1:-1:-1;;;55309:41:0;;:81;;;55354:36;55378:11;55354:23;:36::i;56545:332::-;56261:5;-1:-1:-1;;;;;56648:33:0;;;;56640:88;;;;-1:-1:-1;;;56640:88:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;56747:22:0;;56739:60;;;;-1:-1:-1;;;56739:60:0;;20939:2:1;56739:60:0;;;20921:21:1;20978:2;20958:18;;;20951:30;21017:27;20997:18;;;20990:55;21062:18;;56739:60:0;20737:349:1;56739:60:0;56834:35;;;;;;;;;-1:-1:-1;;;;;56834:35:0;;;;;;-1:-1:-1;;;;;56834:35:0;;;;;;;;;;-1:-1:-1;;;56812:57:0;;;;:19;:57;56545:332::o;49549:135::-;43217:4;42815:16;;;:7;:16;;;;;;-1:-1:-1;;;;;42815:16:0;49623:53;;;;-1:-1:-1;;;49623:53:0;;15715:2:1;49623:53:0;;;15697:21:1;15754:2;15734:18;;;15727:30;-1:-1:-1;;;15773:18:1;;;15766:54;15837:18;;49623:53:0;15513:348:1;74686:419:0;73207:42;74877:45;:49;74873:225;;74948:67;;-1:-1:-1;;;74948:67:0;;74999:4;74948:67;;;21303:34:1;-1:-1:-1;;;;;21373:15:1;;21353:18;;;21346:43;73207:42:0;;74948;;21238:18:1;;74948:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74943:144;;75043:28;;-1:-1:-1;;;75043:28:0;;-1:-1:-1;;;;;2504:32:1;;75043:28:0;;;2486:51:1;2459:18;;75043:28:0;2340:203:1;39248:416:0;39329:13;39345:23;39360:7;39345:14;:23::i;:::-;39329:39;;39393:5;-1:-1:-1;;;;;39387:11:0;:2;-1:-1:-1;;;;;39387:11:0;;39379:57;;;;-1:-1:-1;;;39379:57:0;;21852:2:1;39379:57:0;;;21834:21:1;21891:2;21871:18;;;21864:30;21930:34;21910:18;;;21903:62;-1:-1:-1;;;21981:18:1;;;21974:31;22022:19;;39379:57:0;21650:397:1;39379:57:0;10041:10;-1:-1:-1;;;;;39471:21:0;;;;:62;;-1:-1:-1;39496:37:0;39513:5;10041:10;40199:164;:::i;39496:37::-;39449:173;;;;-1:-1:-1;;;39449:173:0;;22254:2:1;39449:173:0;;;22236:21:1;22293:2;22273:18;;;22266:30;22332:34;22312:18;;;22305:62;22403:31;22383:18;;;22376:59;22452:19;;39449:173:0;22052:425:1;39449:173:0;39635:21;39644:2;39648:7;39635:8;:21::i;40430:335::-;40625:41;10041:10;40658:7;40625:18;:41::i;:::-;40617:99;;;;-1:-1:-1;;;40617:99:0;;;;;;;:::i;:::-;40729:28;40739:4;40745:2;40749:7;40729:9;:28::i;40836:185::-;40974:39;40991:4;40997:2;41001:7;40974:39;;;;;;;;;;;;:16;:39::i;57328:390::-;56261:5;-1:-1:-1;;;;;57480:33:0;;;;57472:88;;;;-1:-1:-1;;;57472:88:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;57579:22:0;;57571:62;;;;-1:-1:-1;;;57571:62:0;;23098:2:1;57571:62:0;;;23080:21:1;23137:2;23117:18;;;23110:30;23176:29;23156:18;;;23149:57;23223:18;;57571:62:0;22896:351:1;57571:62:0;57675:35;;;;;;;;-1:-1:-1;;;;;57675:35:0;;;;;-1:-1:-1;;;;;57675:35:0;;;;;;;;;;-1:-1:-1;57646:26:0;;;:17;:26;;;;;;:64;;;;;;;-1:-1:-1;;;57646:64:0;;;;;;57328:390::o;60267:293::-;59669:1;60401:7;;:19;60393:63;;;;-1:-1:-1;;;60393:63:0;;23454:2:1;60393:63:0;;;23436:21:1;23493:2;23473:18;;;23466:30;23532:33;23512:18;;;23505:61;23583:18;;60393:63:0;23252:355:1;60393:63:0;59669:1;60534:7;:18;60267:293::o;90609:381::-;90723:7;90714:5;:16;;90705:49;;;;-1:-1:-1;;;90705:49:0;;23814:2:1;90705:49:0;;;23796:21:1;23853:2;23833:18;;;23826:30;-1:-1:-1;;;23872:18:1;;;23865:48;23930:18;;90705:49:0;23612:342:1;90705:49:0;90815:7;90807:5;:15;90803:180;;;90839:14;90856:15;90866:5;90856:7;:15;:::i;:::-;90946:25;;90839:32;;-1:-1:-1;90920:9:0;;-1:-1:-1;;;;;90946:15:0;;;:25;;;;;90839:32;;90886:22;90946:25;90886:22;90946:25;90839:32;90946:15;:25;;;;;;;;;;;;;;;;;;;;;90824:159;;90609:381;;;:::o;91157:473::-;91251:15;;91234:13;;:32;;91225:71;;;;-1:-1:-1;;;91225:71:0;;24294:2:1;91225:71:0;;;24276:21:1;24333:2;24313:18;;;24306:30;24372:26;24352:18;;;24345:54;24416:18;;91225:71:0;24092:348:1;91225:71:0;91339:10;;91331:3;91317:13;;:17;;;;:::i;:::-;91316:33;;91307:73;;;;-1:-1:-1;;;91307:73:0;;24647:2:1;91307:73:0;;;24629:21:1;24686:2;24666:18;;;24659:30;24725:27;24705:18;;;24698:55;24770:18;;91307:73:0;24445:349:1;91307:73:0;91400:17;;:22;;:50;;;91447:3;91426:17;;:24;;91400:50;91391:88;;;;-1:-1:-1;;;91391:88:0;;25001:2:1;91391:88:0;;;24983:21:1;25040:2;25020:18;;;25013:30;25079:25;25059:18;;;25052:53;25122:18;;91391:88:0;24799:347:1;91391:88:0;91497:9;91492:100;91512:3;91510:1;:5;91492:100;;;91537:43;91544:2;91563:14;91576:1;76234;91563:14;:::i;91537:43::-;91517:3;;;;:::i;:::-;;;;91492:100;;;;91619:3;91602:13;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;91157:473:0:o;26448:132::-;26329:7;26356:6;-1:-1:-1;;;;;26356:6:0;10041:10;26512:23;26504:68;;;;-1:-1:-1;;;26504:68:0;;25353:2:1;26504:68:0;;;25335:21:1;;;25372:18;;;25365:30;25431:34;25411:18;;;25404:62;25483:18;;26504:68:0;25151:356:1;27550:191:0;27624:16;27643:6;;-1:-1:-1;;;;;27660:17:0;;;-1:-1:-1;;;;;;27660:17:0;;;;;;27693:40;;27643:6;;;;;;;27693:40;;27624:16;27693:40;27613:128;27550:191;:::o;39973:155::-;40068:52;10041:10;40101:8;40111;40068:18;:52::i;41092:322::-;41266:41;10041:10;41299:7;41266:18;:41::i;:::-;41258:99;;;;-1:-1:-1;;;41258:99:0;;;;;;;:::i;:::-;41368:38;41382:4;41388:2;41392:7;41401:4;41368:13;:38::i;23254:716::-;23310:13;23361:14;23378:17;23389:5;23378:10;:17::i;:::-;23398:1;23378:21;23361:38;;23414:20;23448:6;23437:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23437:18:0;-1:-1:-1;23414:41:0;-1:-1:-1;23579:28:0;;;23595:2;23579:28;23636:288;-1:-1:-1;;23668:5:0;-1:-1:-1;;;23805:2:0;23794:14;;23789:30;23668:5;23776:44;23866:2;23857:11;;;-1:-1:-1;23887:21:0;23636:288;23887:21;-1:-1:-1;23945:6:0;23254:716;-1:-1:-1;;;23254:716:0:o;45045:942::-;-1:-1:-1;;;;;45125:16:0;;45117:61;;;;-1:-1:-1;;;45117:61:0;;25714:2:1;45117:61:0;;;25696:21:1;;;25733:18;;;25726:30;25792:34;25772:18;;;25765:62;25844:18;;45117:61:0;25512:356:1;45117:61:0;43217:4;42815:16;;;:7;:16;;;;;;-1:-1:-1;;;;;42815:16:0;43241:31;45189:58;;;;-1:-1:-1;;;45189:58:0;;26075:2:1;45189:58:0;;;26057:21:1;26114:2;26094:18;;;26087:30;26153;26133:18;;;26126:58;26201:18;;45189:58:0;25873:352:1;45189:58:0;45260:48;45289:1;45293:2;45297:7;45306:1;45260:20;:48::i;:::-;43217:4;42815:16;;;:7;:16;;;;;;-1:-1:-1;;;;;42815:16:0;43241:31;45398:58;;;;-1:-1:-1;;;45398:58:0;;26075:2:1;45398:58:0;;;26057:21:1;26114:2;26094:18;;;26087:30;26153;26133:18;;;26126:58;26201:18;;45398:58:0;25873:352:1;45398:58:0;-1:-1:-1;;;;;45805:13:0;;;;;;:9;:13;;;;;;;;:18;;45822:1;45805:18;;;45847:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;45847:21:0;;;;;45886:33;45855:7;;45805:13;;45886:33;;45805:13;;45886:33;80485:145;;:::o;90150:290::-;90309:34;;-1:-1:-1;;26407:2:1;26403:15;;;26399:53;90309:34:0;;;26387:66:1;26469:12;;;26462:28;;;90266:4:0;;;;26506:12:1;;90309:34:0;;;;;;;;;;;;90298:47;;;;;;90283:62;;90364:66;90384:11;;90364:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;90397:25:0;;;-1:-1:-1;90424:4:0;;-1:-1:-1;90364:18:0;:66::i;:::-;90356:76;90150:290;-1:-1:-1;;;;;;90150:290:0:o;37290:305::-;37392:4;-1:-1:-1;;;;;;37429:40:0;;-1:-1:-1;;;37429:40:0;;:105;;-1:-1:-1;;;;;;;37486:48:0;;-1:-1:-1;;;37486:48:0;37429:105;:158;;;-1:-1:-1;;;;;;;;;;29407:40:0;;;37551:36;29298:157;48828:174;48903:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;48903:29:0;-1:-1:-1;;;;;48903:29:0;;;;;;;;:24;;48957:23;48903:24;48957:14;:23::i;:::-;-1:-1:-1;;;;;48948:46:0;;;;;;;;;;;48828:174;;:::o;43447:264::-;43540:4;43557:13;43573:23;43588:7;43573:14;:23::i;:::-;43557:39;;43626:5;-1:-1:-1;;;;;43615:16:0;:7;-1:-1:-1;;;;;43615:16:0;;:52;;;;43635:32;43652:5;43659:7;43635:16;:32::i;:::-;43615:87;;;;43695:7;-1:-1:-1;;;;;43671:31:0;:20;43683:7;43671:11;:20::i;:::-;-1:-1:-1;;;;;43671:31:0;;43607:96;43447:264;-1:-1:-1;;;;43447:264:0:o;47446:1263::-;47605:4;-1:-1:-1;;;;;47578:31:0;:23;47593:7;47578:14;:23::i;:::-;-1:-1:-1;;;;;47578:31:0;;47570:81;;;;-1:-1:-1;;;47570:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47670:16:0;;47662:65;;;;-1:-1:-1;;;47662:65:0;;27137:2:1;47662:65:0;;;27119:21:1;27176:2;27156:18;;;27149:30;27215:34;27195:18;;;27188:62;-1:-1:-1;;;27266:18:1;;;27259:34;27310:19;;47662:65:0;26935:400:1;47662:65:0;47740:42;47761:4;47767:2;47771:7;47780:1;47740:20;:42::i;:::-;47912:4;-1:-1:-1;;;;;47885:31:0;:23;47900:7;47885:14;:23::i;:::-;-1:-1:-1;;;;;47885:31:0;;47877:81;;;;-1:-1:-1;;;47877:81:0;;;;;;;:::i;:::-;48030:24;;;;:15;:24;;;;;;;;48023:31;;-1:-1:-1;;;;;;48023:31:0;;;;;;-1:-1:-1;;;;;48506:15:0;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;48506:20:0;;;48541:13;;;;;;;;;:18;;48023:31;48541:18;;;48581:16;;;:7;:16;;;;;;:21;;;;;;;;;;48620:27;;48046:7;;48620:27;;;81418:143;;;:::o;49145:315::-;49300:8;-1:-1:-1;;;;;49291:17:0;:5;-1:-1:-1;;;;;49291:17:0;;49283:55;;;;-1:-1:-1;;;49283:55:0;;27542:2:1;49283:55:0;;;27524:21:1;27581:2;27561:18;;;27554:30;27620:27;27600:18;;;27593:55;27665:18;;49283:55:0;27340:349:1;49283:55:0;-1:-1:-1;;;;;49349:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;49349:46:0;;;;;;;;;;49411:41;;540::1;;;49411::0;;513:18:1;49411:41:0;;;;;;;49145:315;;;:::o;42295:313::-;42451:28;42461:4;42467:2;42471:7;42451:9;:28::i;:::-;42498:47;42521:4;42527:2;42531:7;42540:4;42498:22;:47::i;:::-;42490:110;;;;-1:-1:-1;;;42490:110:0;;;;;;;:::i;20219:922::-;20272:7;;-1:-1:-1;;;20350:15:0;;20346:102;;-1:-1:-1;;;20386:15:0;;;-1:-1:-1;20430:2:0;20420:12;20346:102;20475:6;20466:5;:15;20462:102;;20511:6;20502:15;;;-1:-1:-1;20546:2:0;20536:12;20462:102;20591:6;20582:5;:15;20578:102;;20627:6;20618:15;;;-1:-1:-1;20662:2:0;20652:12;20578:102;20707:5;20698;:14;20694:99;;20742:5;20733:14;;;-1:-1:-1;20776:1:0;20766:11;20694:99;20820:5;20811;:14;20807:99;;20855:5;20846:14;;;-1:-1:-1;20889:1:0;20879:11;20807:99;20933:5;20924;:14;20920:99;;20968:5;20959:14;;;-1:-1:-1;21002:1:0;20992:11;20920:99;21046:5;21037;:14;21033:66;;21082:1;21072:11;21127:6;20219:922;-1:-1:-1;;20219:922:0:o;51833:410::-;52023:1;52011:9;:13;52007:229;;;-1:-1:-1;;;;;52045:18:0;;;52041:87;;-1:-1:-1;;;;;52084:15:0;;;;;;:9;:15;;;;;:28;;52103:9;;52084:15;:28;;52103:9;;52084:28;:::i;:::-;;;;-1:-1:-1;;52041:87:0;-1:-1:-1;;;;;52146:16:0;;;52142:83;;-1:-1:-1;;;;;52183:13:0;;;;;;:9;:13;;;;;:26;;52200:9;;52183:13;:26;;52200:9;;52183:26;:::i;:::-;;;;-1:-1:-1;;51833:410:0;;;;:::o;61896:190::-;62021:4;62074;62045:25;62058:5;62065:4;62045:12;:25::i;:::-;:33;;61896:190;-1:-1:-1;;;;61896:190:0:o;50248:853::-;50402:4;-1:-1:-1;;;;;50423:13:0;;1482:19;:23;50419:675;;50459:71;;-1:-1:-1;;;50459:71:0;;-1:-1:-1;;;;;50459:36:0;;;;;:71;;10041:10;;50510:4;;50516:7;;50525:4;;50459:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50459:71:0;;;;;;;;-1:-1:-1;;50459:71:0;;;;;;;;;;;;:::i;:::-;;;50455:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50700:6;:13;50717:1;50700:18;50696:328;;50743:60;;-1:-1:-1;;;50743:60:0;;;;;;;:::i;50696:328::-;50974:6;50968:13;50959:6;50955:2;50951:15;50944:38;50455:584;-1:-1:-1;;;;;;50581:51:0;-1:-1:-1;;;50581:51:0;;-1:-1:-1;50574:58:0;;50419:675;-1:-1:-1;51078:4:0;51071:11;;62763:296;62846:7;62889:4;62846:7;62904:118;62928:5;:12;62924:1;:16;62904:118;;;62977:33;62987:12;63001:5;63007:1;63001:8;;;;;;;;:::i;:::-;;;;;;;62977:9;:33::i;:::-;62962:48;-1:-1:-1;62942:3:0;;;;:::i;:::-;;;;62904:118;;;-1:-1:-1;63039:12:0;62763:296;-1:-1:-1;;;62763:296:0:o;69803:149::-;69866:7;69897:1;69893;:5;:51;;70028:13;70122:15;;;70158:4;70151:15;;;70205:4;70189:21;;69893:51;;;70028:13;70122:15;;;70158:4;70151:15;;;70205:4;70189:21;;69901:20;69886:58;69803:149;-1:-1:-1;;;69803:149:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;774:173::-;842:20;;-1:-1:-1;;;;;891:31:1;;881:42;;871:70;;937:1;934;927:12;871:70;774:173;;;:::o;952:179::-;1019:20;;-1:-1:-1;;;;;1068:38:1;;1058:49;;1048:77;;1121:1;1118;1111:12;1136:258;1203:6;1211;1264:2;1252:9;1243:7;1239:23;1235:32;1232:52;;;1280:1;1277;1270:12;1232:52;1303:29;1322:9;1303:29;:::i;:::-;1293:39;;1351:37;1384:2;1373:9;1369:18;1351:37;:::i;:::-;1341:47;;1136:258;;;;;:::o;1399:250::-;1484:1;1494:113;1508:6;1505:1;1502:13;1494:113;;;1584:11;;;1578:18;1565:11;;;1558:39;1530:2;1523:10;1494:113;;;-1:-1:-1;;1641:1:1;1623:16;;1616:27;1399:250::o;1654:271::-;1696:3;1734:5;1728:12;1761:6;1756:3;1749:19;1777:76;1846:6;1839:4;1834:3;1830:14;1823:4;1816:5;1812:16;1777:76;:::i;:::-;1907:2;1886:15;-1:-1:-1;;1882:29:1;1873:39;;;;1914:4;1869:50;;1654:271;-1:-1:-1;;1654:271:1:o;1930:220::-;2079:2;2068:9;2061:21;2042:4;2099:45;2140:2;2129:9;2125:18;2117:6;2099:45;:::i;2155:180::-;2214:6;2267:2;2255:9;2246:7;2242:23;2238:32;2235:52;;;2283:1;2280;2273:12;2235:52;-1:-1:-1;2306:23:1;;2155:180;-1:-1:-1;2155:180:1:o;2548:254::-;2616:6;2624;2677:2;2665:9;2656:7;2652:23;2648:32;2645:52;;;2693:1;2690;2683:12;2645:52;2716:29;2735:9;2716:29;:::i;:::-;2706:39;2792:2;2777:18;;;;2764:32;;-1:-1:-1;;;2548:254:1:o;2807:248::-;2875:6;2883;2936:2;2924:9;2915:7;2911:23;2907:32;2904:52;;;2952:1;2949;2942:12;2904:52;-1:-1:-1;;2975:23:1;;;3045:2;3030:18;;;3017:32;;-1:-1:-1;2807:248:1:o;3060:328::-;3137:6;3145;3153;3206:2;3194:9;3185:7;3181:23;3177:32;3174:52;;;3222:1;3219;3212:12;3174:52;3245:29;3264:9;3245:29;:::i;:::-;3235:39;;3293:38;3327:2;3316:9;3312:18;3293:38;:::i;:::-;3283:48;;3378:2;3367:9;3363:18;3350:32;3340:42;;3060:328;;;;;:::o;3912:326::-;3988:6;3996;4004;4057:2;4045:9;4036:7;4032:23;4028:32;4025:52;;;4073:1;4070;4063:12;4025:52;4109:9;4096:23;4086:33;;4138:38;4172:2;4161:9;4157:18;4138:38;:::i;:::-;4128:48;;4195:37;4228:2;4217:9;4213:18;4195:37;:::i;:::-;4185:47;;3912:326;;;;;:::o;4243:592::-;4314:6;4322;4375:2;4363:9;4354:7;4350:23;4346:32;4343:52;;;4391:1;4388;4381:12;4343:52;4431:9;4418:23;4460:18;4501:2;4493:6;4490:14;4487:34;;;4517:1;4514;4507:12;4487:34;4555:6;4544:9;4540:22;4530:32;;4600:7;4593:4;4589:2;4585:13;4581:27;4571:55;;4622:1;4619;4612:12;4571:55;4662:2;4649:16;4688:2;4680:6;4677:14;4674:34;;;4704:1;4701;4694:12;4674:34;4749:7;4744:2;4735:6;4731:2;4727:15;4723:24;4720:37;4717:57;;;4770:1;4767;4760:12;4717:57;4801:2;4793:11;;;;;4823:6;;-1:-1:-1;4243:592:1;;-1:-1:-1;;;;4243:592:1:o;4840:186::-;4899:6;4952:2;4940:9;4931:7;4927:23;4923:32;4920:52;;;4968:1;4965;4958:12;4920:52;4991:29;5010:9;4991:29;:::i;5216:118::-;5302:5;5295:13;5288:21;5281:5;5278:32;5268:60;;5324:1;5321;5314:12;5339:315;5404:6;5412;5465:2;5453:9;5444:7;5440:23;5436:32;5433:52;;;5481:1;5478;5471:12;5433:52;5504:29;5523:9;5504:29;:::i;:::-;5494:39;;5583:2;5572:9;5568:18;5555:32;5596:28;5618:5;5596:28;:::i;:::-;5643:5;5633:15;;;5339:315;;;;;:::o;5659:127::-;5720:10;5715:3;5711:20;5708:1;5701:31;5751:4;5748:1;5741:15;5775:4;5772:1;5765:15;5791:1138;5886:6;5894;5902;5910;5963:3;5951:9;5942:7;5938:23;5934:33;5931:53;;;5980:1;5977;5970:12;5931:53;6003:29;6022:9;6003:29;:::i;:::-;5993:39;;6051:38;6085:2;6074:9;6070:18;6051:38;:::i;:::-;6041:48;;6136:2;6125:9;6121:18;6108:32;6098:42;;6191:2;6180:9;6176:18;6163:32;6214:18;6255:2;6247:6;6244:14;6241:34;;;6271:1;6268;6261:12;6241:34;6309:6;6298:9;6294:22;6284:32;;6354:7;6347:4;6343:2;6339:13;6335:27;6325:55;;6376:1;6373;6366:12;6325:55;6412:2;6399:16;6434:2;6430;6427:10;6424:36;;;6440:18;;:::i;:::-;6515:2;6509:9;6483:2;6569:13;;-1:-1:-1;;6565:22:1;;;6589:2;6561:31;6557:40;6545:53;;;6613:18;;;6633:22;;;6610:46;6607:72;;;6659:18;;:::i;:::-;6699:10;6695:2;6688:22;6734:2;6726:6;6719:18;6774:7;6769:2;6764;6760;6756:11;6752:20;6749:33;6746:53;;;6795:1;6792;6785:12;6746:53;6851:2;6846;6842;6838:11;6833:2;6825:6;6821:15;6808:46;6896:1;6891:2;6886;6878:6;6874:15;6870:24;6863:35;6917:6;6907:16;;;;;;;5791:1138;;;;;;;:::o;6934:367::-;6997:8;7007:6;7061:3;7054:4;7046:6;7042:17;7038:27;7028:55;;7079:1;7076;7069:12;7028:55;-1:-1:-1;7102:20:1;;7145:18;7134:30;;7131:50;;;7177:1;7174;7167:12;7131:50;7214:4;7206:6;7202:17;7190:29;;7274:3;7267:4;7257:6;7254:1;7250:14;7242:6;7238:27;7234:38;7231:47;7228:67;;;7291:1;7288;7281:12;7306:579;7410:6;7418;7426;7434;7487:2;7475:9;7466:7;7462:23;7458:32;7455:52;;;7503:1;7500;7493:12;7455:52;7526:29;7545:9;7526:29;:::i;:::-;7516:39;;7602:2;7591:9;7587:18;7574:32;7564:42;;7657:2;7646:9;7642:18;7629:32;7684:18;7676:6;7673:30;7670:50;;;7716:1;7713;7706:12;7670:50;7755:70;7817:7;7808:6;7797:9;7793:22;7755:70;:::i;:::-;7306:579;;;;-1:-1:-1;7844:8:1;-1:-1:-1;;;;7306:579:1:o;7890:495::-;8070:3;8055:19;;8059:9;8151:6;8028:4;8185:194;8199:4;8196:1;8193:11;8185:194;;;8258:13;;8246:26;;8295:4;8319:12;;;;8354:15;;;;8219:1;8212:9;8185:194;;;8189:3;;;7890:495;;;;:::o;8390:260::-;8458:6;8466;8519:2;8507:9;8498:7;8494:23;8490:32;8487:52;;;8535:1;8532;8525:12;8487:52;8558:29;8577:9;8558:29;:::i;:::-;8548:39;;8606:38;8640:2;8629:9;8625:18;8606:38;:::i;8655:241::-;8711:6;8764:2;8752:9;8743:7;8739:23;8735:32;8732:52;;;8780:1;8777;8770:12;8732:52;8819:9;8806:23;8838:28;8860:5;8838:28;:::i;8901:573::-;9005:6;9013;9021;9029;9082:2;9070:9;9061:7;9057:23;9053:32;9050:52;;;9098:1;9095;9088:12;9050:52;9134:9;9121:23;9111:33;;9191:2;9180:9;9176:18;9163:32;9153:42;;9246:2;9235:9;9231:18;9218:32;9273:18;9265:6;9262:30;9259:50;;;9305:1;9302;9295:12;9479:497;9661:3;9646:19;;9650:9;9742:6;9619:4;9776:194;9790:4;9787:1;9784:11;9776:194;;;9849:13;;9837:26;;9886:4;9910:12;;;;9945:15;;;;9810:1;9803:9;9776:194;;9981:403;10183:2;10165:21;;;10222:2;10202:18;;;10195:30;10261:34;10256:2;10241:18;;10234:62;-1:-1:-1;;;10327:2:1;10312:18;;10305:37;10374:3;10359:19;;9981:403::o;10389:380::-;10468:1;10464:12;;;;10511;;;10532:61;;10586:4;10578:6;10574:17;10564:27;;10532:61;10639:2;10631:6;10628:14;10608:18;10605:38;10602:161;;10685:10;10680:3;10676:20;10673:1;10666:31;10720:4;10717:1;10710:15;10748:4;10745:1;10738:15;10602:161;;10389:380;;;:::o;10774:127::-;10835:10;10830:3;10826:20;10823:1;10816:31;10866:4;10863:1;10856:15;10890:4;10887:1;10880:15;10906:168;10979:9;;;11010;;11027:15;;;11021:22;;11007:37;10997:71;;11048:18;;:::i;11211:217::-;11251:1;11277;11267:132;;11321:10;11316:3;11312:20;11309:1;11302:31;11356:4;11353:1;11346:15;11384:4;11381:1;11374:15;11267:132;-1:-1:-1;11413:9:1;;11211:217::o;11908:545::-;12010:2;12005:3;12002:11;11999:448;;;12046:1;12071:5;12067:2;12060:17;12116:4;12112:2;12102:19;12186:2;12174:10;12170:19;12167:1;12163:27;12157:4;12153:38;12222:4;12210:10;12207:20;12204:47;;;-1:-1:-1;12245:4:1;12204:47;12300:2;12295:3;12291:12;12288:1;12284:20;12278:4;12274:31;12264:41;;12355:82;12373:2;12366:5;12363:13;12355:82;;;12418:17;;;12399:1;12388:13;12355:82;;12629:1206;12753:18;12748:3;12745:27;12742:53;;;12775:18;;:::i;:::-;12804:94;12894:3;12854:38;12886:4;12880:11;12854:38;:::i;:::-;12848:4;12804:94;:::i;:::-;12924:1;12949:2;12944:3;12941:11;12966:1;12961:616;;;;13621:1;13638:3;13635:93;;;-1:-1:-1;13694:19:1;;;13681:33;13635:93;-1:-1:-1;;12586:1:1;12582:11;;;12578:24;12574:29;12564:40;12610:1;12606:11;;;12561:57;13741:78;;12934:895;;12961:616;11855:1;11848:14;;;11892:4;11879:18;;-1:-1:-1;;12997:17:1;;;13098:9;13120:229;13134:7;13131:1;13128:14;13120:229;;;13223:19;;;13210:33;13195:49;;13330:4;13315:20;;;;13283:1;13271:14;;;;13150:12;13120:229;;;13124:3;13377;13368:7;13365:16;13362:159;;;13501:1;13497:6;13491:3;13485;13482:1;13478:11;13474:21;13470:34;13466:39;13453:9;13448:3;13444:19;13431:33;13427:79;13419:6;13412:95;13362:159;;;13564:1;13558:3;13555:1;13551:11;13547:19;13541:4;13534:33;12934:895;;12629:1206;;;:::o;13840:127::-;13901:10;13896:3;13892:20;13889:1;13882:31;13932:4;13929:1;13922:15;13956:4;13953:1;13946:15;14323:125;14388:9;;;14409:10;;;14406:36;;;14422:18;;:::i;16622:1020::-;16798:3;16827:1;16860:6;16854:13;16890:36;16916:9;16890:36;:::i;:::-;16945:1;16962:18;;;16989:133;;;;17136:1;17131:356;;;;16955:532;;16989:133;-1:-1:-1;;17022:24:1;;17010:37;;17095:14;;17088:22;17076:35;;17067:45;;;-1:-1:-1;16989:133:1;;17131:356;17162:6;17159:1;17152:17;17192:4;17237:2;17234:1;17224:16;17262:1;17276:165;17290:6;17287:1;17284:13;17276:165;;;17368:14;;17355:11;;;17348:35;17411:16;;;;17305:10;;17276:165;;;17280:3;;;17470:6;17465:3;17461:16;17454:23;;16955:532;;;;;17518:6;17512:13;17534:68;17593:8;17588:3;17581:4;17573:6;17569:17;17534:68;:::i;:::-;17618:18;;16622:1020;-1:-1:-1;;;;16622:1020:1:o;18006:135::-;18045:3;18066:17;;;18063:43;;18086:18;;:::i;:::-;-1:-1:-1;18133:1:1;18122:13;;18006:135::o;20326:406::-;20528:2;20510:21;;;20567:2;20547:18;;;20540:30;20606:34;20601:2;20586:18;;20579:62;-1:-1:-1;;;20672:2:1;20657:18;;20650:40;20722:3;20707:19;;20326:406::o;21400:245::-;21467:6;21520:2;21508:9;21499:7;21495:23;21491:32;21488:52;;;21536:1;21533;21526:12;21488:52;21568:9;21562:16;21587:28;21609:5;21587:28;:::i;22482:409::-;22684:2;22666:21;;;22723:2;22703:18;;;22696:30;22762:34;22757:2;22742:18;;22735:62;-1:-1:-1;;;22828:2:1;22813:18;;22806:43;22881:3;22866:19;;22482:409::o;23959:128::-;24026:9;;;24047:11;;;24044:37;;;24061:18;;:::i;26529:401::-;26731:2;26713:21;;;26770:2;26750:18;;;26743:30;26809:34;26804:2;26789:18;;26782:62;-1:-1:-1;;;26875:2:1;26860:18;;26853:35;26920:3;26905:19;;26529:401::o;27694:414::-;27896:2;27878:21;;;27935:2;27915:18;;;27908:30;27974:34;27969:2;27954:18;;27947:62;-1:-1:-1;;;28040:2:1;28025:18;;28018:48;28098:3;28083:19;;27694:414::o;28113:489::-;-1:-1:-1;;;;;28382:15:1;;;28364:34;;28434:15;;28429:2;28414:18;;28407:43;28481:2;28466:18;;28459:34;;;28529:3;28524:2;28509:18;;28502:31;;;28307:4;;28550:46;;28576:19;;28568:6;28550:46;:::i;28607:249::-;28676:6;28729:2;28717:9;28708:7;28704:23;28700:32;28697:52;;;28745:1;28742;28735:12;28697:52;28777:9;28771:16;28796:30;28820:5;28796:30;:::i

Swarm Source

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