ETH Price: $2,704.01 (-1.28%)

Token

Nordic Invasion (NInv)
 

Overview

Max Total Supply

420 NInv

Holders

149

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 NInv
0x6abc9415bc23cdfcd31513b65b28a759b3f32521
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:
NordicInvasion

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-07-12
*/

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol

// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)
// SPDX-License-Identifier: Unlicensed
pragma solidity ^0.8.0;

/**
 * @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;
    }

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == _ENTERED;
    }
}

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

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

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(
        uint256 a,
        uint256 b
    ) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

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

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

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

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

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/security/Pausable.sol

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

pragma solidity ^0.8.0;

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

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

    bool private _paused;

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

pragma solidity ^0.8.0;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

        _owners[tokenId] = to;

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

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

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

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

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

        // Clear approvals
        delete _tokenApprovals[tokenId];

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId, 1);

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

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

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

        emit Transfer(from, to, tokenId);

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

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

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

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

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

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

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

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

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

// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

        uint256 tokenId = firstTokenId;

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/MintTask.sol

pragma solidity 0.8.17;

contract NordicInvasion is
    ERC721,
    ERC721Enumerable,
    Ownable,
    Pausable,
    ReentrancyGuard
{
    using Strings for uint256;
    using SafeMath for uint256;

    string public baseURI =
        "https://maroon-random-beetle-876.mypinata.cloud/ipfs/QmdN5z3YFipKTzSDQHvoneENCQmerw5XB4HBY7H3xW6jSF/";
    string public baseExtension = ".json";

    uint256 public cost = 0.13 ether;
    uint256 public maxSupply = 10000;
    uint256 public maxMintAmount = 5; // max mint amout per transaction
    uint16 public devPercentage = 700; // percentage in bips
    // *************************************
    //  Dev wallet, Name, Symbol
    // *************************************

    address public devWallet;

    constructor(address _devWallet) ERC721("Nordic Invasion", "NInv") {
        require(
            _devWallet != address(0),
            "Dev Wallet can not be zero address "
        );
        devWallet = _devWallet;
        transferOwnership(0xEF26C0B51Da18afEe2E011f9beBecaEeb81f3093);
    }

    function _batchMint(uint256 _qty) external onlyOwner {
        require(_qty != 0, "quantity can not be zero");
        uint256 supply = totalSupply();
        for (uint256 i = 1; i <= _qty; i++) {
            _safeMint(msg.sender, supply + i);
        }
    }

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

    function mint(
        uint256 _mintAmount
    ) public payable whenNotPaused nonReentrant {
        uint256 supply = totalSupply();
        require(_mintAmount > 0, "need to mint atleast 1 NFT");
        require(
            _mintAmount <= maxMintAmount,
            "max mint amount per transaction exceeded"
        );
        require(supply.add(_mintAmount) <= maxSupply, "max NFT limit Exceeds");

        if (msg.sender != owner()) {
            uint256 devCost = cost.mul(devPercentage).div(10000);
            require(
                msg.value >= cost.add(devCost).mul(_mintAmount),
                "insufficient funds"
            );

            uint256 devPayable = msg.value.mul(devPercentage).div(10000);
            uint256 ownerPayable = msg.value.sub(devPayable);
            (bool successOwner, ) = payable(owner()).call{value: ownerPayable}(
                ""
            );
            (bool successDev, ) = payable(devWallet).call{value: devPayable}(
                ""
            );
            require(successOwner, "NFT: Transfer failed.");
            require(successDev, "NFT: Transfer failed.");
        }

        for (uint256 i = 1; i <= _mintAmount; i++) {
            _safeMint(msg.sender, supply + i);
        }
    } // mint function ends here

    function walletOfOwner(
        address _owner
    ) public view returns (uint256[] memory) {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for (uint256 i; i < ownerTokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIds;
    }

    function tokenURI(
        uint256 tokenId
    ) public view virtual override returns (string memory) {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

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

    // ******************************
    //  For regular user
    // ******************************
    function getPricePerNFT() external view returns (uint256) {
        uint256 devAmount = cost.mul(devPercentage).div(10000);
        return cost.add(devAmount);
    }

    // The following functions are overrides required by Solidity.

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId,
        uint256 batchSize
    ) internal override(ERC721, ERC721Enumerable) whenNotPaused {
        super._beforeTokenTransfer(from, to, tokenId, batchSize);
    }

    // The following functions are overrides required by Solidity.

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

    function withdraw() external onlyOwner nonReentrant {
        uint balance = address(this).balance;
        require(balance > 0, "NFT: No ether left to withdraw");

        (bool success, ) = payable(owner()).call{value: balance}("");
        require(success, "NFT: Transfer failed.");
    }

    // ******************************
    // setters
    // ******************************

    function setCost(uint256 _newCost) public onlyOwner {
        cost = _newCost;
    }

    function setDevPercentage(uint16 _percentageBips) external onlyOwner {
        devPercentage = _percentageBips;
    }

    function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner {
        maxMintAmount = _newmaxMintAmount;
    }

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

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

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

    receive() external payable {}

    fallback() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_devWallet","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"uint256","name":"_qty","type":"uint256"}],"name":"_batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devPercentage","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPricePerNFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_percentageBips","type":"uint16"}],"name":"setDevPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526040518060a0016040528060648152602001620057be60649139600c90816200002e91906200072c565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d90816200007591906200072c565b506701cdda4faccd0000600e55612710600f5560056010556102bc601160006101000a81548161ffff021916908361ffff160217905550348015620000b957600080fd5b5060405162005822380380620058228339818101604052810190620000df91906200087d565b6040518060400160405280600f81526020017f4e6f7264696320496e766173696f6e00000000000000000000000000000000008152506040518060400160405280600481526020017f4e496e760000000000000000000000000000000000000000000000000000000081525081600090816200015c91906200072c565b5080600190816200016e91906200072c565b50505062000191620001856200029360201b60201c565b6200029b60201b60201c565b6000600a60146101000a81548160ff0219169083151502179055506001600b81905550600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000226576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200021d9062000936565b60405180910390fd5b80601160026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200028c73ef26c0b51da18afee2e011f9bebecaeeb81f30936200036160201b60201c565b5062000a62565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b62000371620003f760201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620003e3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003da90620009ce565b60405180910390fd5b620003f4816200029b60201b60201c565b50565b620004076200029360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200042d6200048860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000486576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200047d9062000a40565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200053457607f821691505b6020821081036200054a5762000549620004ec565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005b47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000575565b620005c0868362000575565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200060d620006076200060184620005d8565b620005e2565b620005d8565b9050919050565b6000819050919050565b6200062983620005ec565b62000641620006388262000614565b84845462000582565b825550505050565b600090565b6200065862000649565b620006658184846200061e565b505050565b5b818110156200068d57620006816000826200064e565b6001810190506200066b565b5050565b601f821115620006dc57620006a68162000550565b620006b18462000565565b81016020851015620006c1578190505b620006d9620006d08562000565565b8301826200066a565b50505b505050565b600082821c905092915050565b60006200070160001984600802620006e1565b1980831691505092915050565b60006200071c8383620006ee565b9150826002028217905092915050565b6200073782620004b2565b67ffffffffffffffff811115620007535762000752620004bd565b5b6200075f82546200051b565b6200076c82828562000691565b600060209050601f831160018114620007a457600084156200078f578287015190505b6200079b85826200070e565b8655506200080b565b601f198416620007b48662000550565b60005b82811015620007de57848901518255600182019150602085019450602081019050620007b7565b86831015620007fe5784890151620007fa601f891682620006ee565b8355505b6001600288020188555050505b505050505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008458262000818565b9050919050565b620008578162000838565b81146200086357600080fd5b50565b60008151905062000877816200084c565b92915050565b60006020828403121562000896576200089562000813565b5b6000620008a68482850162000866565b91505092915050565b600082825260208201905092915050565b7f4465762057616c6c65742063616e206e6f74206265207a65726f20616464726560008201527f7373200000000000000000000000000000000000000000000000000000000000602082015250565b60006200091e602383620008af565b91506200092b82620008c0565b604082019050919050565b6000602082019050818103600083015262000951816200090f565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000620009b6602683620008af565b9150620009c38262000958565b604082019050919050565b60006020820190508181036000830152620009e981620009a7565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000a28602083620008af565b915062000a3582620009f0565b602082019050919050565b6000602082019050818103600083015262000a5b8162000a19565b9050919050565b614d4c8062000a726000396000f3fe6080604052600436106102295760003560e01c80636c0360eb11610123578063a22cb465116100ab578063c733b1711161006f578063c733b171146107c8578063c87b56dd146107f3578063d5abeb0114610830578063e985e9c51461085b578063f2fde38b1461089857610230565b8063a22cb465146106f7578063af65f84214610720578063b88d4fde14610749578063c3a4382414610772578063c66828621461079d57610230565b80638456cb59116100f25780638456cb59146106435780638da5cb5b1461065a5780638ea5220f1461068557806395d89b41146106b0578063a0712d68146106db57610230565b80636c0360eb1461059b57806370a08231146105c6578063715018a6146106035780637f00c7a61461061a57610230565b80633ccfd60b116101b1578063475b535a11610175578063475b535a146104a45780634f6ccce7146104cd57806355f804b31461050a5780635c975abb146105335780636352211e1461055e57610230565b80633ccfd60b146103e75780633f4ba83a146103fe57806342842e0e14610415578063438b63001461043e57806344a0d68a1461047b57610230565b806313faede6116101f857806313faede61461030057806318160ddd1461032b578063239c70ae1461035657806323b872dd146103815780632f745c59146103aa57610230565b806301ffc9a71461023257806306fdde031461026f578063081812fc1461029a578063095ea7b3146102d757610230565b3661023057005b005b34801561023e57600080fd5b5061025960048036038101906102549190613145565b6108c1565b604051610266919061318d565b60405180910390f35b34801561027b57600080fd5b506102846108d3565b6040516102919190613238565b60405180910390f35b3480156102a657600080fd5b506102c160048036038101906102bc9190613290565b610965565b6040516102ce91906132fe565b60405180910390f35b3480156102e357600080fd5b506102fe60048036038101906102f99190613345565b6109ab565b005b34801561030c57600080fd5b50610315610ac2565b6040516103229190613394565b60405180910390f35b34801561033757600080fd5b50610340610ac8565b60405161034d9190613394565b60405180910390f35b34801561036257600080fd5b5061036b610ad5565b6040516103789190613394565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a391906133af565b610adb565b005b3480156103b657600080fd5b506103d160048036038101906103cc9190613345565b610b3b565b6040516103de9190613394565b60405180910390f35b3480156103f357600080fd5b506103fc610be0565b005b34801561040a57600080fd5b50610413610cf7565b005b34801561042157600080fd5b5061043c600480360381019061043791906133af565b610d09565b005b34801561044a57600080fd5b5061046560048036038101906104609190613402565b610d29565b60405161047291906134ed565b60405180910390f35b34801561048757600080fd5b506104a2600480360381019061049d9190613290565b610dd7565b005b3480156104b057600080fd5b506104cb60048036038101906104c69190613290565b610de9565b005b3480156104d957600080fd5b506104f460048036038101906104ef9190613290565b610e7b565b6040516105019190613394565b60405180910390f35b34801561051657600080fd5b50610531600480360381019061052c9190613644565b610eec565b005b34801561053f57600080fd5b50610548610f07565b604051610555919061318d565b60405180910390f35b34801561056a57600080fd5b5061058560048036038101906105809190613290565b610f1e565b60405161059291906132fe565b60405180910390f35b3480156105a757600080fd5b506105b0610fa4565b6040516105bd9190613238565b60405180910390f35b3480156105d257600080fd5b506105ed60048036038101906105e89190613402565b611032565b6040516105fa9190613394565b60405180910390f35b34801561060f57600080fd5b506106186110e9565b005b34801561062657600080fd5b50610641600480360381019061063c9190613290565b6110fd565b005b34801561064f57600080fd5b5061065861110f565b005b34801561066657600080fd5b5061066f611121565b60405161067c91906132fe565b60405180910390f35b34801561069157600080fd5b5061069a61114b565b6040516106a791906132fe565b60405180910390f35b3480156106bc57600080fd5b506106c5611171565b6040516106d29190613238565b60405180910390f35b6106f560048036038101906106f09190613290565b611203565b005b34801561070357600080fd5b5061071e600480360381019061071991906136b9565b611602565b005b34801561072c57600080fd5b5061074760048036038101906107429190613733565b611618565b005b34801561075557600080fd5b50610770600480360381019061076b9190613801565b611640565b005b34801561077e57600080fd5b506107876116a2565b6040516107949190613893565b60405180910390f35b3480156107a957600080fd5b506107b26116b6565b6040516107bf9190613238565b60405180910390f35b3480156107d457600080fd5b506107dd611744565b6040516107ea9190613394565b60405180910390f35b3480156107ff57600080fd5b5061081a60048036038101906108159190613290565b6117a1565b6040516108279190613238565b60405180910390f35b34801561083c57600080fd5b5061084561184b565b6040516108529190613394565b60405180910390f35b34801561086757600080fd5b50610882600480360381019061087d91906138ae565b611851565b60405161088f919061318d565b60405180910390f35b3480156108a457600080fd5b506108bf60048036038101906108ba9190613402565b6118e5565b005b60006108cc82611968565b9050919050565b6060600080546108e29061391d565b80601f016020809104026020016040519081016040528092919081815260200182805461090e9061391d565b801561095b5780601f106109305761010080835404028352916020019161095b565b820191906000526020600020905b81548152906001019060200180831161093e57829003601f168201915b5050505050905090565b6000610970826119e2565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109b682610f1e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1d906139c0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a45611a2d565b73ffffffffffffffffffffffffffffffffffffffff161480610a745750610a7381610a6e611a2d565b611851565b5b610ab3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aaa90613a52565b60405180910390fd5b610abd8383611a35565b505050565b600e5481565b6000600880549050905090565b60105481565b610aec610ae6611a2d565b82611aee565b610b2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2290613ae4565b60405180910390fd5b610b36838383611b83565b505050565b6000610b4683611032565b8210610b87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7e90613b76565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610be8611e7c565b610bf0611efa565b600047905060008111610c38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2f90613be2565b60405180910390fd5b6000610c42611121565b73ffffffffffffffffffffffffffffffffffffffff1682604051610c6590613c33565b60006040518083038185875af1925050503d8060008114610ca2576040519150601f19603f3d011682016040523d82523d6000602084013e610ca7565b606091505b5050905080610ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce290613c94565b60405180910390fd5b5050610cf5611f49565b565b610cff611e7c565b610d07611f53565b565b610d2483838360405180602001604052806000815250611640565b505050565b60606000610d3683611032565b905060008167ffffffffffffffff811115610d5457610d53613519565b5b604051908082528060200260200182016040528015610d825781602001602082028036833780820191505090505b50905060005b82811015610dcc57610d9a8582610b3b565b828281518110610dad57610dac613cb4565b5b6020026020010181815250508080610dc490613d12565b915050610d88565b508092505050919050565b610ddf611e7c565b80600e8190555050565b610df1611e7c565b60008103610e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2b90613da6565b60405180910390fd5b6000610e3e610ac8565b90506000600190505b828111610e7657610e63338284610e5e9190613dc6565b611fb6565b8080610e6e90613d12565b915050610e47565b505050565b6000610e85610ac8565b8210610ec6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebd90613e6c565b60405180910390fd5b60088281548110610eda57610ed9613cb4565b5b90600052602060002001549050919050565b610ef4611e7c565b80600c9081610f039190614038565b5050565b6000600a60149054906101000a900460ff16905090565b600080610f2a83611fd4565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9290614156565b60405180910390fd5b80915050919050565b600c8054610fb19061391d565b80601f0160208091040260200160405190810160405280929190818152602001828054610fdd9061391d565b801561102a5780601f10610fff5761010080835404028352916020019161102a565b820191906000526020600020905b81548152906001019060200180831161100d57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611099906141e8565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110f1611e7c565b6110fb6000612011565b565b611105611e7c565b8060108190555050565b611117611e7c565b61111f6120d7565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600180546111809061391d565b80601f01602080910402602001604051908101604052809291908181526020018280546111ac9061391d565b80156111f95780601f106111ce576101008083540402835291602001916111f9565b820191906000526020600020905b8154815290600101906020018083116111dc57829003601f168201915b5050505050905090565b61120b61213a565b611213611efa565b600061121d610ac8565b905060008211611262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125990614254565b60405180910390fd5b6010548211156112a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129e906142e6565b60405180910390fd5b600f546112bd838361218490919063ffffffff16565b11156112fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f590614352565b60405180910390fd5b611306611121565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115bf576000611377612710611369601160009054906101000a900461ffff1661ffff16600e5461219a90919063ffffffff16565b6121b090919063ffffffff16565b90506113a08361139283600e5461218490919063ffffffff16565b61219a90919063ffffffff16565b3410156113e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d9906143be565b60405180910390fd5b600061141f612710611411601160009054906101000a900461ffff1661ffff163461219a90919063ffffffff16565b6121b090919063ffffffff16565b9050600061143682346121c690919063ffffffff16565b90506000611442611121565b73ffffffffffffffffffffffffffffffffffffffff168260405161146590613c33565b60006040518083038185875af1925050503d80600081146114a2576040519150601f19603f3d011682016040523d82523d6000602084013e6114a7565b606091505b505090506000601160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16846040516114f390613c33565b60006040518083038185875af1925050503d8060008114611530576040519150601f19603f3d011682016040523d82523d6000602084013e611535565b606091505b5050905081611579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157090613c94565b60405180910390fd5b806115b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b090613c94565b60405180910390fd5b50505050505b6000600190505b8281116115f5576115e23382846115dd9190613dc6565b611fb6565b80806115ed90613d12565b9150506115c6565b50506115ff611f49565b50565b61161461160d611a2d565b83836121dc565b5050565b611620611e7c565b80601160006101000a81548161ffff021916908361ffff16021790555050565b61165161164b611a2d565b83611aee565b611690576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168790613ae4565b60405180910390fd5b61169c84848484612348565b50505050565b601160009054906101000a900461ffff1681565b600d80546116c39061391d565b80601f01602080910402602001604051908101604052809291908181526020018280546116ef9061391d565b801561173c5780601f106117115761010080835404028352916020019161173c565b820191906000526020600020905b81548152906001019060200180831161171f57829003601f168201915b505050505081565b600080611784612710611776601160009054906101000a900461ffff1661ffff16600e5461219a90919063ffffffff16565b6121b090919063ffffffff16565b905061179b81600e5461218490919063ffffffff16565b91505090565b60606117ac826123a4565b6117eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e290614450565b60405180910390fd5b60006117f56123e5565b905060008151116118155760405180602001604052806000815250611843565b8061181f84612477565b600d6040516020016118339392919061452f565b6040516020818303038152906040525b915050919050565b600f5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118ed611e7c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361195c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611953906145d2565b60405180910390fd5b61196581612011565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119db57506119da82612545565b5b9050919050565b6119eb816123a4565b611a2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2190614156565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611aa883610f1e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611afa83610f1e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611b3c5750611b3b8185611851565b5b80611b7a57508373ffffffffffffffffffffffffffffffffffffffff16611b6284610965565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ba382610f1e565b73ffffffffffffffffffffffffffffffffffffffff1614611bf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf090614664565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5f906146f6565b60405180910390fd5b611c758383836001612627565b8273ffffffffffffffffffffffffffffffffffffffff16611c9582610f1e565b73ffffffffffffffffffffffffffffffffffffffff1614611ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce290614664565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e778383836001612641565b505050565b611e84611a2d565b73ffffffffffffffffffffffffffffffffffffffff16611ea2611121565b73ffffffffffffffffffffffffffffffffffffffff1614611ef8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eef90614762565b60405180910390fd5b565b6002600b5403611f3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f36906147ce565b60405180910390fd5b6002600b81905550565b6001600b81905550565b611f5b612647565b6000600a60146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611f9f611a2d565b604051611fac91906132fe565b60405180910390a1565b611fd0828260405180602001604052806000815250612690565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6120df61213a565b6001600a60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612123611a2d565b60405161213091906132fe565b60405180910390a1565b612142610f07565b15612182576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121799061483a565b60405180910390fd5b565b600081836121929190613dc6565b905092915050565b600081836121a8919061485a565b905092915050565b600081836121be91906148cb565b905092915050565b600081836121d491906148fc565b905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361224a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122419061497c565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161233b919061318d565b60405180910390a3505050565b612353848484611b83565b61235f848484846126eb565b61239e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239590614a0e565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166123c683611fd4565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600c80546123f49061391d565b80601f01602080910402602001604051908101604052809291908181526020018280546124209061391d565b801561246d5780601f106124425761010080835404028352916020019161246d565b820191906000526020600020905b81548152906001019060200180831161245057829003601f168201915b5050505050905090565b60606000600161248684612872565b01905060008167ffffffffffffffff8111156124a5576124a4613519565b5b6040519080825280601f01601f1916602001820160405280156124d75781602001600182028036833780820191505090505b509050600082602001820190505b60011561253a578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161252e5761252d61489c565b5b049450600085036124e5575b819350505050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061261057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612620575061261f826129c5565b5b9050919050565b61262f61213a565b61263b84848484612a2f565b50505050565b50505050565b61264f610f07565b61268e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268590614a7a565b60405180910390fd5b565b61269a8383612b8d565b6126a760008484846126eb565b6126e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126dd90614a0e565b60405180910390fd5b505050565b600061270c8473ffffffffffffffffffffffffffffffffffffffff16612daa565b15612865578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612735611a2d565b8786866040518563ffffffff1660e01b81526004016127579493929190614aef565b6020604051808303816000875af192505050801561279357506040513d601f19601f820116820180604052508101906127909190614b50565b60015b612815573d80600081146127c3576040519150601f19603f3d011682016040523d82523d6000602084013e6127c8565b606091505b50600081510361280d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280490614a0e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061286a565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106128d0577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816128c6576128c561489c565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061290d576d04ee2d6d415b85acef810000000083816129035761290261489c565b5b0492506020810190505b662386f26fc10000831061293c57662386f26fc1000083816129325761293161489c565b5b0492506010810190505b6305f5e1008310612965576305f5e100838161295b5761295a61489c565b5b0492506008810190505b612710831061298a5761271083816129805761297f61489c565b5b0492506004810190505b606483106129ad57606483816129a3576129a261489c565b5b0492506002810190505b600a83106129bc576001810190505b80915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612a3b84848484612dcd565b6001811115612a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7690614bef565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612ac657612ac181612dd3565b612b05565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614612b0457612b038582612e1c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612b4757612b4281612f89565b612b86565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612b8557612b84848261305a565b5b5b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612bfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf390614c5b565b60405180910390fd5b612c05816123a4565b15612c45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3c90614cc7565b60405180910390fd5b612c53600083836001612627565b612c5c816123a4565b15612c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9390614cc7565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612da6600083836001612641565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612e2984611032565b612e3391906148fc565b9050600060076000848152602001908152602001600020549050818114612f18576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612f9d91906148fc565b9050600060096000848152602001908152602001600020549050600060088381548110612fcd57612fcc613cb4565b5b906000526020600020015490508060088381548110612fef57612fee613cb4565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061303e5761303d614ce7565b5b6001900381819060005260206000200160009055905550505050565b600061306583611032565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613122816130ed565b811461312d57600080fd5b50565b60008135905061313f81613119565b92915050565b60006020828403121561315b5761315a6130e3565b5b600061316984828501613130565b91505092915050565b60008115159050919050565b61318781613172565b82525050565b60006020820190506131a2600083018461317e565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156131e25780820151818401526020810190506131c7565b60008484015250505050565b6000601f19601f8301169050919050565b600061320a826131a8565b61321481856131b3565b93506132248185602086016131c4565b61322d816131ee565b840191505092915050565b6000602082019050818103600083015261325281846131ff565b905092915050565b6000819050919050565b61326d8161325a565b811461327857600080fd5b50565b60008135905061328a81613264565b92915050565b6000602082840312156132a6576132a56130e3565b5b60006132b48482850161327b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006132e8826132bd565b9050919050565b6132f8816132dd565b82525050565b600060208201905061331360008301846132ef565b92915050565b613322816132dd565b811461332d57600080fd5b50565b60008135905061333f81613319565b92915050565b6000806040838503121561335c5761335b6130e3565b5b600061336a85828601613330565b925050602061337b8582860161327b565b9150509250929050565b61338e8161325a565b82525050565b60006020820190506133a96000830184613385565b92915050565b6000806000606084860312156133c8576133c76130e3565b5b60006133d686828701613330565b93505060206133e786828701613330565b92505060406133f88682870161327b565b9150509250925092565b600060208284031215613418576134176130e3565b5b600061342684828501613330565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6134648161325a565b82525050565b6000613476838361345b565b60208301905092915050565b6000602082019050919050565b600061349a8261342f565b6134a4818561343a565b93506134af8361344b565b8060005b838110156134e05781516134c7888261346a565b97506134d283613482565b9250506001810190506134b3565b5085935050505092915050565b60006020820190508181036000830152613507818461348f565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613551826131ee565b810181811067ffffffffffffffff821117156135705761356f613519565b5b80604052505050565b60006135836130d9565b905061358f8282613548565b919050565b600067ffffffffffffffff8211156135af576135ae613519565b5b6135b8826131ee565b9050602081019050919050565b82818337600083830152505050565b60006135e76135e284613594565b613579565b90508281526020810184848401111561360357613602613514565b5b61360e8482856135c5565b509392505050565b600082601f83011261362b5761362a61350f565b5b813561363b8482602086016135d4565b91505092915050565b60006020828403121561365a576136596130e3565b5b600082013567ffffffffffffffff811115613678576136776130e8565b5b61368484828501613616565b91505092915050565b61369681613172565b81146136a157600080fd5b50565b6000813590506136b38161368d565b92915050565b600080604083850312156136d0576136cf6130e3565b5b60006136de85828601613330565b92505060206136ef858286016136a4565b9150509250929050565b600061ffff82169050919050565b613710816136f9565b811461371b57600080fd5b50565b60008135905061372d81613707565b92915050565b600060208284031215613749576137486130e3565b5b60006137578482850161371e565b91505092915050565b600067ffffffffffffffff82111561377b5761377a613519565b5b613784826131ee565b9050602081019050919050565b60006137a461379f84613760565b613579565b9050828152602081018484840111156137c0576137bf613514565b5b6137cb8482856135c5565b509392505050565b600082601f8301126137e8576137e761350f565b5b81356137f8848260208601613791565b91505092915050565b6000806000806080858703121561381b5761381a6130e3565b5b600061382987828801613330565b945050602061383a87828801613330565b935050604061384b8782880161327b565b925050606085013567ffffffffffffffff81111561386c5761386b6130e8565b5b613878878288016137d3565b91505092959194509250565b61388d816136f9565b82525050565b60006020820190506138a86000830184613884565b92915050565b600080604083850312156138c5576138c46130e3565b5b60006138d385828601613330565b92505060206138e485828601613330565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061393557607f821691505b602082108103613948576139476138ee565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006139aa6021836131b3565b91506139b58261394e565b604082019050919050565b600060208201905081810360008301526139d98161399d565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613a3c603d836131b3565b9150613a47826139e0565b604082019050919050565b60006020820190508181036000830152613a6b81613a2f565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613ace602d836131b3565b9150613ad982613a72565b604082019050919050565b60006020820190508181036000830152613afd81613ac1565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613b60602b836131b3565b9150613b6b82613b04565b604082019050919050565b60006020820190508181036000830152613b8f81613b53565b9050919050565b7f4e46543a204e6f206574686572206c65667420746f2077697468647261770000600082015250565b6000613bcc601e836131b3565b9150613bd782613b96565b602082019050919050565b60006020820190508181036000830152613bfb81613bbf565b9050919050565b600081905092915050565b50565b6000613c1d600083613c02565b9150613c2882613c0d565b600082019050919050565b6000613c3e82613c10565b9150819050919050565b7f4e46543a205472616e73666572206661696c65642e0000000000000000000000600082015250565b6000613c7e6015836131b3565b9150613c8982613c48565b602082019050919050565b60006020820190508181036000830152613cad81613c71565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613d1d8261325a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d4f57613d4e613ce3565b5b600182019050919050565b7f7175616e746974792063616e206e6f74206265207a65726f0000000000000000600082015250565b6000613d906018836131b3565b9150613d9b82613d5a565b602082019050919050565b60006020820190508181036000830152613dbf81613d83565b9050919050565b6000613dd18261325a565b9150613ddc8361325a565b9250828201905080821115613df457613df3613ce3565b5b92915050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613e56602c836131b3565b9150613e6182613dfa565b604082019050919050565b60006020820190508181036000830152613e8581613e49565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613eee7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613eb1565b613ef88683613eb1565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613f35613f30613f2b8461325a565b613f10565b61325a565b9050919050565b6000819050919050565b613f4f83613f1a565b613f63613f5b82613f3c565b848454613ebe565b825550505050565b600090565b613f78613f6b565b613f83818484613f46565b505050565b5b81811015613fa757613f9c600082613f70565b600181019050613f89565b5050565b601f821115613fec57613fbd81613e8c565b613fc684613ea1565b81016020851015613fd5578190505b613fe9613fe185613ea1565b830182613f88565b50505b505050565b600082821c905092915050565b600061400f60001984600802613ff1565b1980831691505092915050565b60006140288383613ffe565b9150826002028217905092915050565b614041826131a8565b67ffffffffffffffff81111561405a57614059613519565b5b614064825461391d565b61406f828285613fab565b600060209050601f8311600181146140a25760008415614090578287015190505b61409a858261401c565b865550614102565b601f1984166140b086613e8c565b60005b828110156140d8578489015182556001820191506020850194506020810190506140b3565b868310156140f557848901516140f1601f891682613ffe565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006141406018836131b3565b915061414b8261410a565b602082019050919050565b6000602082019050818103600083015261416f81614133565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006141d26029836131b3565b91506141dd82614176565b604082019050919050565b60006020820190508181036000830152614201816141c5565b9050919050565b7f6e65656420746f206d696e742061746c656173742031204e4654000000000000600082015250565b600061423e601a836131b3565b915061424982614208565b602082019050919050565b6000602082019050818103600083015261426d81614231565b9050919050565b7f6d6178206d696e7420616d6f756e7420706572207472616e73616374696f6e2060008201527f6578636565646564000000000000000000000000000000000000000000000000602082015250565b60006142d06028836131b3565b91506142db82614274565b604082019050919050565b600060208201905081810360008301526142ff816142c3565b9050919050565b7f6d6178204e4654206c696d697420457863656564730000000000000000000000600082015250565b600061433c6015836131b3565b915061434782614306565b602082019050919050565b6000602082019050818103600083015261436b8161432f565b9050919050565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b60006143a86012836131b3565b91506143b382614372565b602082019050919050565b600060208201905081810360008301526143d78161439b565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061443a602f836131b3565b9150614445826143de565b604082019050919050565b600060208201905081810360008301526144698161442d565b9050919050565b600081905092915050565b6000614486826131a8565b6144908185614470565b93506144a08185602086016131c4565b80840191505092915050565b600081546144b98161391d565b6144c38186614470565b945060018216600081146144de57600181146144f357614526565b60ff1983168652811515820286019350614526565b6144fc85613e8c565b60005b8381101561451e578154818901526001820191506020810190506144ff565b838801955050505b50505092915050565b600061453b828661447b565b9150614547828561447b565b915061455382846144ac565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006145bc6026836131b3565b91506145c782614560565b604082019050919050565b600060208201905081810360008301526145eb816145af565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061464e6025836131b3565b9150614659826145f2565b604082019050919050565b6000602082019050818103600083015261467d81614641565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006146e06024836131b3565b91506146eb82614684565b604082019050919050565b6000602082019050818103600083015261470f816146d3565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061474c6020836131b3565b915061475782614716565b602082019050919050565b6000602082019050818103600083015261477b8161473f565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006147b8601f836131b3565b91506147c382614782565b602082019050919050565b600060208201905081810360008301526147e7816147ab565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006148246010836131b3565b915061482f826147ee565b602082019050919050565b6000602082019050818103600083015261485381614817565b9050919050565b60006148658261325a565b91506148708361325a565b925082820261487e8161325a565b9150828204841483151761489557614894613ce3565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006148d68261325a565b91506148e18361325a565b9250826148f1576148f061489c565b5b828204905092915050565b60006149078261325a565b91506149128361325a565b925082820390508181111561492a57614929613ce3565b5b92915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006149666019836131b3565b915061497182614930565b602082019050919050565b6000602082019050818103600083015261499581614959565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006149f86032836131b3565b9150614a038261499c565b604082019050919050565b60006020820190508181036000830152614a27816149eb565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614a646014836131b3565b9150614a6f82614a2e565b602082019050919050565b60006020820190508181036000830152614a9381614a57565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614ac182614a9a565b614acb8185614aa5565b9350614adb8185602086016131c4565b614ae4816131ee565b840191505092915050565b6000608082019050614b0460008301876132ef565b614b1160208301866132ef565b614b1e6040830185613385565b8181036060830152614b308184614ab6565b905095945050505050565b600081519050614b4a81613119565b92915050565b600060208284031215614b6657614b656130e3565b5b6000614b7484828501614b3b565b91505092915050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000614bd96035836131b3565b9150614be482614b7d565b604082019050919050565b60006020820190508181036000830152614c0881614bcc565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614c456020836131b3565b9150614c5082614c0f565b602082019050919050565b60006020820190508181036000830152614c7481614c38565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614cb1601c836131b3565b9150614cbc82614c7b565b602082019050919050565b60006020820190508181036000830152614ce081614ca4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220f09b7c749348172d918a304156f967945ed32332916e7aa55546bceed02f3f1364736f6c6343000811003368747470733a2f2f6d61726f6f6e2d72616e646f6d2d626565746c652d3837362e6d7970696e6174612e636c6f75642f697066732f516d644e357a33594669704b547a53445148766f6e65454e43516d657277355842344842593748337857366a53462f0000000000000000000000008d36108711e7701107386a60fe7c80219c8a3c11

Deployed Bytecode

0x6080604052600436106102295760003560e01c80636c0360eb11610123578063a22cb465116100ab578063c733b1711161006f578063c733b171146107c8578063c87b56dd146107f3578063d5abeb0114610830578063e985e9c51461085b578063f2fde38b1461089857610230565b8063a22cb465146106f7578063af65f84214610720578063b88d4fde14610749578063c3a4382414610772578063c66828621461079d57610230565b80638456cb59116100f25780638456cb59146106435780638da5cb5b1461065a5780638ea5220f1461068557806395d89b41146106b0578063a0712d68146106db57610230565b80636c0360eb1461059b57806370a08231146105c6578063715018a6146106035780637f00c7a61461061a57610230565b80633ccfd60b116101b1578063475b535a11610175578063475b535a146104a45780634f6ccce7146104cd57806355f804b31461050a5780635c975abb146105335780636352211e1461055e57610230565b80633ccfd60b146103e75780633f4ba83a146103fe57806342842e0e14610415578063438b63001461043e57806344a0d68a1461047b57610230565b806313faede6116101f857806313faede61461030057806318160ddd1461032b578063239c70ae1461035657806323b872dd146103815780632f745c59146103aa57610230565b806301ffc9a71461023257806306fdde031461026f578063081812fc1461029a578063095ea7b3146102d757610230565b3661023057005b005b34801561023e57600080fd5b5061025960048036038101906102549190613145565b6108c1565b604051610266919061318d565b60405180910390f35b34801561027b57600080fd5b506102846108d3565b6040516102919190613238565b60405180910390f35b3480156102a657600080fd5b506102c160048036038101906102bc9190613290565b610965565b6040516102ce91906132fe565b60405180910390f35b3480156102e357600080fd5b506102fe60048036038101906102f99190613345565b6109ab565b005b34801561030c57600080fd5b50610315610ac2565b6040516103229190613394565b60405180910390f35b34801561033757600080fd5b50610340610ac8565b60405161034d9190613394565b60405180910390f35b34801561036257600080fd5b5061036b610ad5565b6040516103789190613394565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a391906133af565b610adb565b005b3480156103b657600080fd5b506103d160048036038101906103cc9190613345565b610b3b565b6040516103de9190613394565b60405180910390f35b3480156103f357600080fd5b506103fc610be0565b005b34801561040a57600080fd5b50610413610cf7565b005b34801561042157600080fd5b5061043c600480360381019061043791906133af565b610d09565b005b34801561044a57600080fd5b5061046560048036038101906104609190613402565b610d29565b60405161047291906134ed565b60405180910390f35b34801561048757600080fd5b506104a2600480360381019061049d9190613290565b610dd7565b005b3480156104b057600080fd5b506104cb60048036038101906104c69190613290565b610de9565b005b3480156104d957600080fd5b506104f460048036038101906104ef9190613290565b610e7b565b6040516105019190613394565b60405180910390f35b34801561051657600080fd5b50610531600480360381019061052c9190613644565b610eec565b005b34801561053f57600080fd5b50610548610f07565b604051610555919061318d565b60405180910390f35b34801561056a57600080fd5b5061058560048036038101906105809190613290565b610f1e565b60405161059291906132fe565b60405180910390f35b3480156105a757600080fd5b506105b0610fa4565b6040516105bd9190613238565b60405180910390f35b3480156105d257600080fd5b506105ed60048036038101906105e89190613402565b611032565b6040516105fa9190613394565b60405180910390f35b34801561060f57600080fd5b506106186110e9565b005b34801561062657600080fd5b50610641600480360381019061063c9190613290565b6110fd565b005b34801561064f57600080fd5b5061065861110f565b005b34801561066657600080fd5b5061066f611121565b60405161067c91906132fe565b60405180910390f35b34801561069157600080fd5b5061069a61114b565b6040516106a791906132fe565b60405180910390f35b3480156106bc57600080fd5b506106c5611171565b6040516106d29190613238565b60405180910390f35b6106f560048036038101906106f09190613290565b611203565b005b34801561070357600080fd5b5061071e600480360381019061071991906136b9565b611602565b005b34801561072c57600080fd5b5061074760048036038101906107429190613733565b611618565b005b34801561075557600080fd5b50610770600480360381019061076b9190613801565b611640565b005b34801561077e57600080fd5b506107876116a2565b6040516107949190613893565b60405180910390f35b3480156107a957600080fd5b506107b26116b6565b6040516107bf9190613238565b60405180910390f35b3480156107d457600080fd5b506107dd611744565b6040516107ea9190613394565b60405180910390f35b3480156107ff57600080fd5b5061081a60048036038101906108159190613290565b6117a1565b6040516108279190613238565b60405180910390f35b34801561083c57600080fd5b5061084561184b565b6040516108529190613394565b60405180910390f35b34801561086757600080fd5b50610882600480360381019061087d91906138ae565b611851565b60405161088f919061318d565b60405180910390f35b3480156108a457600080fd5b506108bf60048036038101906108ba9190613402565b6118e5565b005b60006108cc82611968565b9050919050565b6060600080546108e29061391d565b80601f016020809104026020016040519081016040528092919081815260200182805461090e9061391d565b801561095b5780601f106109305761010080835404028352916020019161095b565b820191906000526020600020905b81548152906001019060200180831161093e57829003601f168201915b5050505050905090565b6000610970826119e2565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109b682610f1e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1d906139c0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a45611a2d565b73ffffffffffffffffffffffffffffffffffffffff161480610a745750610a7381610a6e611a2d565b611851565b5b610ab3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aaa90613a52565b60405180910390fd5b610abd8383611a35565b505050565b600e5481565b6000600880549050905090565b60105481565b610aec610ae6611a2d565b82611aee565b610b2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2290613ae4565b60405180910390fd5b610b36838383611b83565b505050565b6000610b4683611032565b8210610b87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7e90613b76565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610be8611e7c565b610bf0611efa565b600047905060008111610c38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2f90613be2565b60405180910390fd5b6000610c42611121565b73ffffffffffffffffffffffffffffffffffffffff1682604051610c6590613c33565b60006040518083038185875af1925050503d8060008114610ca2576040519150601f19603f3d011682016040523d82523d6000602084013e610ca7565b606091505b5050905080610ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce290613c94565b60405180910390fd5b5050610cf5611f49565b565b610cff611e7c565b610d07611f53565b565b610d2483838360405180602001604052806000815250611640565b505050565b60606000610d3683611032565b905060008167ffffffffffffffff811115610d5457610d53613519565b5b604051908082528060200260200182016040528015610d825781602001602082028036833780820191505090505b50905060005b82811015610dcc57610d9a8582610b3b565b828281518110610dad57610dac613cb4565b5b6020026020010181815250508080610dc490613d12565b915050610d88565b508092505050919050565b610ddf611e7c565b80600e8190555050565b610df1611e7c565b60008103610e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2b90613da6565b60405180910390fd5b6000610e3e610ac8565b90506000600190505b828111610e7657610e63338284610e5e9190613dc6565b611fb6565b8080610e6e90613d12565b915050610e47565b505050565b6000610e85610ac8565b8210610ec6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebd90613e6c565b60405180910390fd5b60088281548110610eda57610ed9613cb4565b5b90600052602060002001549050919050565b610ef4611e7c565b80600c9081610f039190614038565b5050565b6000600a60149054906101000a900460ff16905090565b600080610f2a83611fd4565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9290614156565b60405180910390fd5b80915050919050565b600c8054610fb19061391d565b80601f0160208091040260200160405190810160405280929190818152602001828054610fdd9061391d565b801561102a5780601f10610fff5761010080835404028352916020019161102a565b820191906000526020600020905b81548152906001019060200180831161100d57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611099906141e8565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110f1611e7c565b6110fb6000612011565b565b611105611e7c565b8060108190555050565b611117611e7c565b61111f6120d7565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600180546111809061391d565b80601f01602080910402602001604051908101604052809291908181526020018280546111ac9061391d565b80156111f95780601f106111ce576101008083540402835291602001916111f9565b820191906000526020600020905b8154815290600101906020018083116111dc57829003601f168201915b5050505050905090565b61120b61213a565b611213611efa565b600061121d610ac8565b905060008211611262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125990614254565b60405180910390fd5b6010548211156112a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129e906142e6565b60405180910390fd5b600f546112bd838361218490919063ffffffff16565b11156112fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f590614352565b60405180910390fd5b611306611121565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115bf576000611377612710611369601160009054906101000a900461ffff1661ffff16600e5461219a90919063ffffffff16565b6121b090919063ffffffff16565b90506113a08361139283600e5461218490919063ffffffff16565b61219a90919063ffffffff16565b3410156113e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d9906143be565b60405180910390fd5b600061141f612710611411601160009054906101000a900461ffff1661ffff163461219a90919063ffffffff16565b6121b090919063ffffffff16565b9050600061143682346121c690919063ffffffff16565b90506000611442611121565b73ffffffffffffffffffffffffffffffffffffffff168260405161146590613c33565b60006040518083038185875af1925050503d80600081146114a2576040519150601f19603f3d011682016040523d82523d6000602084013e6114a7565b606091505b505090506000601160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16846040516114f390613c33565b60006040518083038185875af1925050503d8060008114611530576040519150601f19603f3d011682016040523d82523d6000602084013e611535565b606091505b5050905081611579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157090613c94565b60405180910390fd5b806115b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b090613c94565b60405180910390fd5b50505050505b6000600190505b8281116115f5576115e23382846115dd9190613dc6565b611fb6565b80806115ed90613d12565b9150506115c6565b50506115ff611f49565b50565b61161461160d611a2d565b83836121dc565b5050565b611620611e7c565b80601160006101000a81548161ffff021916908361ffff16021790555050565b61165161164b611a2d565b83611aee565b611690576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168790613ae4565b60405180910390fd5b61169c84848484612348565b50505050565b601160009054906101000a900461ffff1681565b600d80546116c39061391d565b80601f01602080910402602001604051908101604052809291908181526020018280546116ef9061391d565b801561173c5780601f106117115761010080835404028352916020019161173c565b820191906000526020600020905b81548152906001019060200180831161171f57829003601f168201915b505050505081565b600080611784612710611776601160009054906101000a900461ffff1661ffff16600e5461219a90919063ffffffff16565b6121b090919063ffffffff16565b905061179b81600e5461218490919063ffffffff16565b91505090565b60606117ac826123a4565b6117eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e290614450565b60405180910390fd5b60006117f56123e5565b905060008151116118155760405180602001604052806000815250611843565b8061181f84612477565b600d6040516020016118339392919061452f565b6040516020818303038152906040525b915050919050565b600f5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118ed611e7c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361195c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611953906145d2565b60405180910390fd5b61196581612011565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119db57506119da82612545565b5b9050919050565b6119eb816123a4565b611a2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2190614156565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611aa883610f1e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611afa83610f1e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611b3c5750611b3b8185611851565b5b80611b7a57508373ffffffffffffffffffffffffffffffffffffffff16611b6284610965565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ba382610f1e565b73ffffffffffffffffffffffffffffffffffffffff1614611bf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf090614664565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5f906146f6565b60405180910390fd5b611c758383836001612627565b8273ffffffffffffffffffffffffffffffffffffffff16611c9582610f1e565b73ffffffffffffffffffffffffffffffffffffffff1614611ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce290614664565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e778383836001612641565b505050565b611e84611a2d565b73ffffffffffffffffffffffffffffffffffffffff16611ea2611121565b73ffffffffffffffffffffffffffffffffffffffff1614611ef8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eef90614762565b60405180910390fd5b565b6002600b5403611f3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f36906147ce565b60405180910390fd5b6002600b81905550565b6001600b81905550565b611f5b612647565b6000600a60146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611f9f611a2d565b604051611fac91906132fe565b60405180910390a1565b611fd0828260405180602001604052806000815250612690565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6120df61213a565b6001600a60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612123611a2d565b60405161213091906132fe565b60405180910390a1565b612142610f07565b15612182576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121799061483a565b60405180910390fd5b565b600081836121929190613dc6565b905092915050565b600081836121a8919061485a565b905092915050565b600081836121be91906148cb565b905092915050565b600081836121d491906148fc565b905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361224a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122419061497c565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161233b919061318d565b60405180910390a3505050565b612353848484611b83565b61235f848484846126eb565b61239e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239590614a0e565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166123c683611fd4565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600c80546123f49061391d565b80601f01602080910402602001604051908101604052809291908181526020018280546124209061391d565b801561246d5780601f106124425761010080835404028352916020019161246d565b820191906000526020600020905b81548152906001019060200180831161245057829003601f168201915b5050505050905090565b60606000600161248684612872565b01905060008167ffffffffffffffff8111156124a5576124a4613519565b5b6040519080825280601f01601f1916602001820160405280156124d75781602001600182028036833780820191505090505b509050600082602001820190505b60011561253a578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161252e5761252d61489c565b5b049450600085036124e5575b819350505050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061261057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612620575061261f826129c5565b5b9050919050565b61262f61213a565b61263b84848484612a2f565b50505050565b50505050565b61264f610f07565b61268e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268590614a7a565b60405180910390fd5b565b61269a8383612b8d565b6126a760008484846126eb565b6126e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126dd90614a0e565b60405180910390fd5b505050565b600061270c8473ffffffffffffffffffffffffffffffffffffffff16612daa565b15612865578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612735611a2d565b8786866040518563ffffffff1660e01b81526004016127579493929190614aef565b6020604051808303816000875af192505050801561279357506040513d601f19601f820116820180604052508101906127909190614b50565b60015b612815573d80600081146127c3576040519150601f19603f3d011682016040523d82523d6000602084013e6127c8565b606091505b50600081510361280d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280490614a0e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061286a565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106128d0577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816128c6576128c561489c565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061290d576d04ee2d6d415b85acef810000000083816129035761290261489c565b5b0492506020810190505b662386f26fc10000831061293c57662386f26fc1000083816129325761293161489c565b5b0492506010810190505b6305f5e1008310612965576305f5e100838161295b5761295a61489c565b5b0492506008810190505b612710831061298a5761271083816129805761297f61489c565b5b0492506004810190505b606483106129ad57606483816129a3576129a261489c565b5b0492506002810190505b600a83106129bc576001810190505b80915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612a3b84848484612dcd565b6001811115612a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7690614bef565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612ac657612ac181612dd3565b612b05565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614612b0457612b038582612e1c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612b4757612b4281612f89565b612b86565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612b8557612b84848261305a565b5b5b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612bfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf390614c5b565b60405180910390fd5b612c05816123a4565b15612c45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3c90614cc7565b60405180910390fd5b612c53600083836001612627565b612c5c816123a4565b15612c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9390614cc7565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612da6600083836001612641565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612e2984611032565b612e3391906148fc565b9050600060076000848152602001908152602001600020549050818114612f18576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612f9d91906148fc565b9050600060096000848152602001908152602001600020549050600060088381548110612fcd57612fcc613cb4565b5b906000526020600020015490508060088381548110612fef57612fee613cb4565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061303e5761303d614ce7565b5b6001900381819060005260206000200160009055905550505050565b600061306583611032565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613122816130ed565b811461312d57600080fd5b50565b60008135905061313f81613119565b92915050565b60006020828403121561315b5761315a6130e3565b5b600061316984828501613130565b91505092915050565b60008115159050919050565b61318781613172565b82525050565b60006020820190506131a2600083018461317e565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156131e25780820151818401526020810190506131c7565b60008484015250505050565b6000601f19601f8301169050919050565b600061320a826131a8565b61321481856131b3565b93506132248185602086016131c4565b61322d816131ee565b840191505092915050565b6000602082019050818103600083015261325281846131ff565b905092915050565b6000819050919050565b61326d8161325a565b811461327857600080fd5b50565b60008135905061328a81613264565b92915050565b6000602082840312156132a6576132a56130e3565b5b60006132b48482850161327b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006132e8826132bd565b9050919050565b6132f8816132dd565b82525050565b600060208201905061331360008301846132ef565b92915050565b613322816132dd565b811461332d57600080fd5b50565b60008135905061333f81613319565b92915050565b6000806040838503121561335c5761335b6130e3565b5b600061336a85828601613330565b925050602061337b8582860161327b565b9150509250929050565b61338e8161325a565b82525050565b60006020820190506133a96000830184613385565b92915050565b6000806000606084860312156133c8576133c76130e3565b5b60006133d686828701613330565b93505060206133e786828701613330565b92505060406133f88682870161327b565b9150509250925092565b600060208284031215613418576134176130e3565b5b600061342684828501613330565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6134648161325a565b82525050565b6000613476838361345b565b60208301905092915050565b6000602082019050919050565b600061349a8261342f565b6134a4818561343a565b93506134af8361344b565b8060005b838110156134e05781516134c7888261346a565b97506134d283613482565b9250506001810190506134b3565b5085935050505092915050565b60006020820190508181036000830152613507818461348f565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613551826131ee565b810181811067ffffffffffffffff821117156135705761356f613519565b5b80604052505050565b60006135836130d9565b905061358f8282613548565b919050565b600067ffffffffffffffff8211156135af576135ae613519565b5b6135b8826131ee565b9050602081019050919050565b82818337600083830152505050565b60006135e76135e284613594565b613579565b90508281526020810184848401111561360357613602613514565b5b61360e8482856135c5565b509392505050565b600082601f83011261362b5761362a61350f565b5b813561363b8482602086016135d4565b91505092915050565b60006020828403121561365a576136596130e3565b5b600082013567ffffffffffffffff811115613678576136776130e8565b5b61368484828501613616565b91505092915050565b61369681613172565b81146136a157600080fd5b50565b6000813590506136b38161368d565b92915050565b600080604083850312156136d0576136cf6130e3565b5b60006136de85828601613330565b92505060206136ef858286016136a4565b9150509250929050565b600061ffff82169050919050565b613710816136f9565b811461371b57600080fd5b50565b60008135905061372d81613707565b92915050565b600060208284031215613749576137486130e3565b5b60006137578482850161371e565b91505092915050565b600067ffffffffffffffff82111561377b5761377a613519565b5b613784826131ee565b9050602081019050919050565b60006137a461379f84613760565b613579565b9050828152602081018484840111156137c0576137bf613514565b5b6137cb8482856135c5565b509392505050565b600082601f8301126137e8576137e761350f565b5b81356137f8848260208601613791565b91505092915050565b6000806000806080858703121561381b5761381a6130e3565b5b600061382987828801613330565b945050602061383a87828801613330565b935050604061384b8782880161327b565b925050606085013567ffffffffffffffff81111561386c5761386b6130e8565b5b613878878288016137d3565b91505092959194509250565b61388d816136f9565b82525050565b60006020820190506138a86000830184613884565b92915050565b600080604083850312156138c5576138c46130e3565b5b60006138d385828601613330565b92505060206138e485828601613330565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061393557607f821691505b602082108103613948576139476138ee565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006139aa6021836131b3565b91506139b58261394e565b604082019050919050565b600060208201905081810360008301526139d98161399d565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613a3c603d836131b3565b9150613a47826139e0565b604082019050919050565b60006020820190508181036000830152613a6b81613a2f565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613ace602d836131b3565b9150613ad982613a72565b604082019050919050565b60006020820190508181036000830152613afd81613ac1565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613b60602b836131b3565b9150613b6b82613b04565b604082019050919050565b60006020820190508181036000830152613b8f81613b53565b9050919050565b7f4e46543a204e6f206574686572206c65667420746f2077697468647261770000600082015250565b6000613bcc601e836131b3565b9150613bd782613b96565b602082019050919050565b60006020820190508181036000830152613bfb81613bbf565b9050919050565b600081905092915050565b50565b6000613c1d600083613c02565b9150613c2882613c0d565b600082019050919050565b6000613c3e82613c10565b9150819050919050565b7f4e46543a205472616e73666572206661696c65642e0000000000000000000000600082015250565b6000613c7e6015836131b3565b9150613c8982613c48565b602082019050919050565b60006020820190508181036000830152613cad81613c71565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613d1d8261325a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d4f57613d4e613ce3565b5b600182019050919050565b7f7175616e746974792063616e206e6f74206265207a65726f0000000000000000600082015250565b6000613d906018836131b3565b9150613d9b82613d5a565b602082019050919050565b60006020820190508181036000830152613dbf81613d83565b9050919050565b6000613dd18261325a565b9150613ddc8361325a565b9250828201905080821115613df457613df3613ce3565b5b92915050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613e56602c836131b3565b9150613e6182613dfa565b604082019050919050565b60006020820190508181036000830152613e8581613e49565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613eee7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613eb1565b613ef88683613eb1565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613f35613f30613f2b8461325a565b613f10565b61325a565b9050919050565b6000819050919050565b613f4f83613f1a565b613f63613f5b82613f3c565b848454613ebe565b825550505050565b600090565b613f78613f6b565b613f83818484613f46565b505050565b5b81811015613fa757613f9c600082613f70565b600181019050613f89565b5050565b601f821115613fec57613fbd81613e8c565b613fc684613ea1565b81016020851015613fd5578190505b613fe9613fe185613ea1565b830182613f88565b50505b505050565b600082821c905092915050565b600061400f60001984600802613ff1565b1980831691505092915050565b60006140288383613ffe565b9150826002028217905092915050565b614041826131a8565b67ffffffffffffffff81111561405a57614059613519565b5b614064825461391d565b61406f828285613fab565b600060209050601f8311600181146140a25760008415614090578287015190505b61409a858261401c565b865550614102565b601f1984166140b086613e8c565b60005b828110156140d8578489015182556001820191506020850194506020810190506140b3565b868310156140f557848901516140f1601f891682613ffe565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006141406018836131b3565b915061414b8261410a565b602082019050919050565b6000602082019050818103600083015261416f81614133565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006141d26029836131b3565b91506141dd82614176565b604082019050919050565b60006020820190508181036000830152614201816141c5565b9050919050565b7f6e65656420746f206d696e742061746c656173742031204e4654000000000000600082015250565b600061423e601a836131b3565b915061424982614208565b602082019050919050565b6000602082019050818103600083015261426d81614231565b9050919050565b7f6d6178206d696e7420616d6f756e7420706572207472616e73616374696f6e2060008201527f6578636565646564000000000000000000000000000000000000000000000000602082015250565b60006142d06028836131b3565b91506142db82614274565b604082019050919050565b600060208201905081810360008301526142ff816142c3565b9050919050565b7f6d6178204e4654206c696d697420457863656564730000000000000000000000600082015250565b600061433c6015836131b3565b915061434782614306565b602082019050919050565b6000602082019050818103600083015261436b8161432f565b9050919050565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b60006143a86012836131b3565b91506143b382614372565b602082019050919050565b600060208201905081810360008301526143d78161439b565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061443a602f836131b3565b9150614445826143de565b604082019050919050565b600060208201905081810360008301526144698161442d565b9050919050565b600081905092915050565b6000614486826131a8565b6144908185614470565b93506144a08185602086016131c4565b80840191505092915050565b600081546144b98161391d565b6144c38186614470565b945060018216600081146144de57600181146144f357614526565b60ff1983168652811515820286019350614526565b6144fc85613e8c565b60005b8381101561451e578154818901526001820191506020810190506144ff565b838801955050505b50505092915050565b600061453b828661447b565b9150614547828561447b565b915061455382846144ac565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006145bc6026836131b3565b91506145c782614560565b604082019050919050565b600060208201905081810360008301526145eb816145af565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061464e6025836131b3565b9150614659826145f2565b604082019050919050565b6000602082019050818103600083015261467d81614641565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006146e06024836131b3565b91506146eb82614684565b604082019050919050565b6000602082019050818103600083015261470f816146d3565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061474c6020836131b3565b915061475782614716565b602082019050919050565b6000602082019050818103600083015261477b8161473f565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006147b8601f836131b3565b91506147c382614782565b602082019050919050565b600060208201905081810360008301526147e7816147ab565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006148246010836131b3565b915061482f826147ee565b602082019050919050565b6000602082019050818103600083015261485381614817565b9050919050565b60006148658261325a565b91506148708361325a565b925082820261487e8161325a565b9150828204841483151761489557614894613ce3565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006148d68261325a565b91506148e18361325a565b9250826148f1576148f061489c565b5b828204905092915050565b60006149078261325a565b91506149128361325a565b925082820390508181111561492a57614929613ce3565b5b92915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006149666019836131b3565b915061497182614930565b602082019050919050565b6000602082019050818103600083015261499581614959565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006149f86032836131b3565b9150614a038261499c565b604082019050919050565b60006020820190508181036000830152614a27816149eb565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614a646014836131b3565b9150614a6f82614a2e565b602082019050919050565b60006020820190508181036000830152614a9381614a57565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614ac182614a9a565b614acb8185614aa5565b9350614adb8185602086016131c4565b614ae4816131ee565b840191505092915050565b6000608082019050614b0460008301876132ef565b614b1160208301866132ef565b614b1e6040830185613385565b8181036060830152614b308184614ab6565b905095945050505050565b600081519050614b4a81613119565b92915050565b600060208284031215614b6657614b656130e3565b5b6000614b7484828501614b3b565b91505092915050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000614bd96035836131b3565b9150614be482614b7d565b604082019050919050565b60006020820190508181036000830152614c0881614bcc565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614c456020836131b3565b9150614c5082614c0f565b602082019050919050565b60006020820190508181036000830152614c7481614c38565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614cb1601c836131b3565b9150614cbc82614c7b565b602082019050919050565b60006020820190508181036000830152614ce081614ca4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220f09b7c749348172d918a304156f967945ed32332916e7aa55546bceed02f3f1364736f6c63430008110033

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

0000000000000000000000008d36108711e7701107386a60fe7c80219c8a3c11

-----Decoded View---------------
Arg [0] : _devWallet (address): 0x8D36108711E7701107386a60Fe7c80219C8A3C11

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000008d36108711e7701107386a60fe7c80219c8a3c11


Deployed Bytecode Sourcemap

80619:5747:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85095:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57582:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59157:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58675:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80995:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75184:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81073:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59923:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74790:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85290:297;;;;;;;;;;;;;:::i;:::-;;86223:65;;;;;;;;;;;;;:::i;:::-;;60366:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83401:374;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85691:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81676:265;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75374:286;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86042:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30781:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57276:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80807:135;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56954:260;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33660:103;;;;;;;;;;;;;:::i;:::-;;85912:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;86154:61;;;;;;;;;;;;;:::i;:::-;;33019:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81336:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57751:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82082:1284;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59416:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85785:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60622:359;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81146:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80949:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84503:168;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83783:608;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81034:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59667:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33918:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85095:187;85214:4;85238:36;85262:11;85238:23;:36::i;:::-;85231:43;;85095:187;;;:::o;57582:100::-;57636:13;57669:5;57662:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57582:100;:::o;59157:187::-;59249:7;59269:23;59284:7;59269:14;:23::i;:::-;59312:15;:24;59328:7;59312:24;;;;;;;;;;;;;;;;;;;;;59305:31;;59157:187;;;:::o;58675:416::-;58756:13;58772:23;58787:7;58772:14;:23::i;:::-;58756:39;;58820:5;58814:11;;:2;:11;;;58806:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;58914:5;58898:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;58923:37;58940:5;58947:12;:10;:12::i;:::-;58923:16;:37::i;:::-;58898:62;58876:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;59062:21;59071:2;59075:7;59062:8;:21::i;:::-;58745:346;58675:416;;:::o;80995:32::-;;;;:::o;75184:113::-;75245:7;75272:10;:17;;;;75265:24;;75184:113;:::o;81073:32::-;;;;:::o;59923:372::-;60132:41;60151:12;:10;:12::i;:::-;60165:7;60132:18;:41::i;:::-;60110:136;;;;;;;;;;;;:::i;:::-;;;;;;;;;60259:28;60269:4;60275:2;60279:7;60259:9;:28::i;:::-;59923:372;;;:::o;74790:318::-;74912:7;74962:23;74979:5;74962:16;:23::i;:::-;74954:5;:31;74932:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;75074:12;:19;75087:5;75074:19;;;;;;;;;;;;;;;:26;75094:5;75074:26;;;;;;;;;;;;75067:33;;74790:318;;;;:::o;85290:297::-;32905:13;:11;:13::i;:::-;2381:21:::1;:19;:21::i;:::-;85353:12:::2;85368:21;85353:36;;85418:1;85408:7;:11;85400:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;85468:12;85494:7;:5;:7::i;:::-;85486:21;;85515:7;85486:41;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85467:60;;;85546:7;85538:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;85342:245;;2425:20:::1;:18;:20::i;:::-;85290:297::o:0;86223:65::-;32905:13;:11;:13::i;:::-;86270:10:::1;:8;:10::i;:::-;86223:65::o:0;60366:185::-;60504:39;60521:4;60527:2;60531:7;60504:39;;;;;;;;;;;;:16;:39::i;:::-;60366:185;;;:::o;83401:374::-;83477:16;83506:23;83532:17;83542:6;83532:9;:17::i;:::-;83506:43;;83560:25;83602:15;83588:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83560:58;;83634:9;83629:113;83649:15;83645:1;:19;83629:113;;;83700:30;83720:6;83728:1;83700:19;:30::i;:::-;83686:8;83695:1;83686:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;83666:3;;;;;:::i;:::-;;;;83629:113;;;;83759:8;83752:15;;;;83401:374;;;:::o;85691:86::-;32905:13;:11;:13::i;:::-;85761:8:::1;85754:4;:15;;;;85691:86:::0;:::o;81676:265::-;32905:13;:11;:13::i;:::-;81756:1:::1;81748:4;:9:::0;81740:46:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;81797:14;81814:13;:11;:13::i;:::-;81797:30;;81843:9;81855:1;81843:13;;81838:96;81863:4;81858:1;:9;81838:96;;81889:33;81899:10;81920:1;81911:6;:10;;;;:::i;:::-;81889:9;:33::i;:::-;81869:3;;;;;:::i;:::-;;;;81838:96;;;;81729:212;81676:265:::0;:::o;75374:286::-;75465:7;75515:30;:28;:30::i;:::-;75507:5;:38;75485:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;75635:10;75646:5;75635:17;;;;;;;;:::i;:::-;;;;;;;;;;75628:24;;75374:286;;;:::o;86042:104::-;32905:13;:11;:13::i;:::-;86127:11:::1;86117:7;:21;;;;;;:::i;:::-;;86042:104:::0;:::o;30781:86::-;30828:4;30852:7;;;;;;;;;;;30845:14;;30781:86;:::o;57276:239::-;57364:7;57384:13;57400:17;57409:7;57400:8;:17::i;:::-;57384:33;;57453:1;57436:19;;:5;:19;;;57428:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;57502:5;57495:12;;;57276:239;;;:::o;80807:135::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56954:260::-;57042:7;57101:1;57084:19;;:5;:19;;;57062:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;57190:9;:16;57200:5;57190:16;;;;;;;;;;;;;;;;57183:23;;56954:260;;;:::o;33660:103::-;32905:13;:11;:13::i;:::-;33725:30:::1;33752:1;33725:18;:30::i;:::-;33660:103::o:0;85912:122::-;32905:13;:11;:13::i;:::-;86009:17:::1;85993:13;:33;;;;85912:122:::0;:::o;86154:61::-;32905:13;:11;:13::i;:::-;86199:8:::1;:6;:8::i;:::-;86154:61::o:0;33019:87::-;33065:7;33092:6;;;;;;;;;;;33085:13;;33019:87;:::o;81336:24::-;;;;;;;;;;;;;:::o;57751:104::-;57807:13;57840:7;57833:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57751:104;:::o;82082:1284::-;30386:19;:17;:19::i;:::-;2381:21:::1;:19;:21::i;:::-;82186:14:::2;82203:13;:11;:13::i;:::-;82186:30;;82249:1;82235:11;:15;82227:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;82329:13;;82314:11;:28;;82292:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;82456:9;;82429:23;82440:11;82429:6;:10;;:23;;;;:::i;:::-;:36;;82421:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;82522:7;:5;:7::i;:::-;82508:21;;:10;:21;;;82504:740;;82546:15;82564:34;82592:5;82564:23;82573:13;;;;;;;;;;;82564:23;;:4;;:8;;:23;;;;:::i;:::-;:27;;:34;;;;:::i;:::-;82546:52;;82652:34;82674:11;82652:17;82661:7;82652:4;;:8;;:17;;;;:::i;:::-;:21;;:34;;;;:::i;:::-;82639:9;:47;;82613:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;82757:18;82778:39;82811:5;82778:28;82792:13;;;;;;;;;;;82778:28;;:9;:13;;:28;;;;:::i;:::-;:32;;:39;;;;:::i;:::-;82757:60;;82832:20;82855:25;82869:10;82855:9;:13;;:25;;;;:::i;:::-;82832:48;;82896:17;82927:7;:5;:7::i;:::-;82919:21;;82948:12;82919:78;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82895:102;;;83013:15;83042:9;;;;;;;;;;;83034:23;;83065:10;83034:78;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83012:100;;;83135:12;83127:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;83196:10;83188:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;82531:713;;;;;82504:740;83261:9;83273:1;83261:13;;83256:103;83281:11;83276:1;:16;83256:103;;83314:33;83324:10;83345:1;83336:6;:10;;;;:::i;:::-;83314:9;:33::i;:::-;83294:3;;;;;:::i;:::-;;;;83256:103;;;;82175:1191;2425:20:::1;:18;:20::i;:::-;82082:1284:::0;:::o;59416:180::-;59536:52;59555:12;:10;:12::i;:::-;59569:8;59579;59536:18;:52::i;:::-;59416:180;;:::o;85785:119::-;32905:13;:11;:13::i;:::-;85881:15:::1;85865:13;;:31;;;;;;;;;;;;;;;;;;85785:119:::0;:::o;60622:359::-;60810:41;60829:12;:10;:12::i;:::-;60843:7;60810:18;:41::i;:::-;60788:136;;;;;;;;;;;;:::i;:::-;;;;;;;;;60935:38;60949:4;60955:2;60959:7;60968:4;60935:13;:38::i;:::-;60622:359;;;;:::o;81146:33::-;;;;;;;;;;;;;:::o;80949:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;84503:168::-;84552:7;84572:17;84592:34;84620:5;84592:23;84601:13;;;;;;;;;;;84592:23;;:4;;:8;;:23;;;;:::i;:::-;:27;;:34;;;;:::i;:::-;84572:54;;84644:19;84653:9;84644:4;;:8;;:19;;;;:::i;:::-;84637:26;;;84503:168;:::o;83783:608::-;83872:13;83920:16;83928:7;83920;:16::i;:::-;83898:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;84024:28;84055:10;:8;:10::i;:::-;84024:41;;84127:1;84102:14;84096:28;:32;:287;;;;;;;;;;;;;;;;;84220:14;84261:18;:7;:16;:18::i;:::-;84306:13;84177:165;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;84096:287;84076:307;;;83783:608;;;:::o;81034:32::-;;;;:::o;59667:189::-;59789:4;59813:18;:25;59832:5;59813:25;;;;;;;;;;;;;;;:35;59839:8;59813:35;;;;;;;;;;;;;;;;;;;;;;;;;59806:42;;59667:189;;;;:::o;33918:238::-;32905:13;:11;:13::i;:::-;34041:1:::1;34021:22;;:8;:22;;::::0;33999:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;34120:28;34139:8;34120:18;:28::i;:::-;33918:238:::0;:::o;74440:266::-;74558:4;74610:35;74595:50;;;:11;:50;;;;:103;;;;74662:36;74686:11;74662:23;:36::i;:::-;74595:103;74575:123;;74440:266;;;:::o;69278:135::-;69360:16;69368:7;69360;:16::i;:::-;69352:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;69278:135;:::o;28898:98::-;28951:7;28978:10;28971:17;;28898:98;:::o;68557:174::-;68659:2;68632:15;:24;68648:7;68632:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;68715:7;68711:2;68677:46;;68686:23;68701:7;68686:14;:23::i;:::-;68677:46;;;;;;;;;;;;68557:174;;:::o;63051:315::-;63169:4;63186:13;63202:23;63217:7;63202:14;:23::i;:::-;63186:39;;63255:5;63244:16;;:7;:16;;;:65;;;;63277:32;63294:5;63301:7;63277:16;:32::i;:::-;63244:65;:113;;;;63350:7;63326:31;;:20;63338:7;63326:11;:20::i;:::-;:31;;;63244:113;63236:122;;;63051:315;;;;:::o;67101:1337::-;67274:4;67247:31;;:23;67262:7;67247:14;:23::i;:::-;:31;;;67225:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;67376:1;67362:16;;:2;:16;;;67354:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;67432:42;67453:4;67459:2;67463:7;67472:1;67432:20;:42::i;:::-;67618:4;67591:31;;:23;67606:7;67591:14;:23::i;:::-;:31;;;67569:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;67759:15;:24;67775:7;67759:24;;;;;;;;;;;;67752:31;;;;;;;;;;;68254:1;68235:9;:15;68245:4;68235:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;68287:1;68270:9;:13;68280:2;68270:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;68329:2;68310:7;:16;68318:7;68310:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;68368:7;68364:2;68349:27;;68358:4;68349:27;;;;;;;;;;;;68389:41;68409:4;68415:2;68419:7;68428:1;68389:19;:41::i;:::-;67101:1337;;;:::o;33184:132::-;33259:12;:10;:12::i;:::-;33248:23;;:7;:5;:7::i;:::-;:23;;;33240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33184:132::o;2461:293::-;1863:1;2595:7;;:19;2587:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1863:1;2728:7;:18;;;;2461:293::o;2762:213::-;1819:1;2945:7;:22;;;;2762:213::o;31636:120::-;30645:16;:14;:16::i;:::-;31705:5:::1;31695:7;;:15;;;;;;;;;;;;;;;;;;31726:22;31735:12;:10;:12::i;:::-;31726:22;;;;;;:::i;:::-;;;;;;;;31636:120::o:0;63708:110::-;63784:26;63794:2;63798:7;63784:26;;;;;;;;;;;;:9;:26::i;:::-;63708:110;;:::o;62326:117::-;62392:7;62419;:16;62427:7;62419:16;;;;;;;;;;;;;;;;;;;;;62412:23;;62326:117;;;:::o;34316:191::-;34390:16;34409:6;;;;;;;;;;;34390:25;;34435:8;34426:6;;:17;;;;;;;;;;;;;;;;;;34490:8;34459:40;;34480:8;34459:40;;;;;;;;;;;;34379:128;34316:191;:::o;31377:118::-;30386:19;:17;:19::i;:::-;31447:4:::1;31437:7;;:14;;;;;;;;;;;;;;;;;;31467:20;31474:12;:10;:12::i;:::-;31467:20;;;;;;:::i;:::-;;;;;;;;31377:118::o:0;30940:108::-;31011:8;:6;:8::i;:::-;31010:9;31002:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;30940:108::o;6275:98::-;6333:7;6364:1;6360;:5;;;;:::i;:::-;6353:12;;6275:98;;;;:::o;7013:::-;7071:7;7102:1;7098;:5;;;;:::i;:::-;7091:12;;7013:98;;;;:::o;7412:::-;7470:7;7501:1;7497;:5;;;;:::i;:::-;7490:12;;7412:98;;;;:::o;6656:::-;6714:7;6745:1;6741;:5;;;;:::i;:::-;6734:12;;6656:98;;;;:::o;68874:315::-;69029:8;69020:17;;:5;:17;;;69012:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;69116:8;69078:18;:25;69097:5;69078:25;;;;;;;;;;;;;;;:35;69104:8;69078:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;69162:8;69140:41;;69155:5;69140:41;;;69172:8;69140:41;;;;;;:::i;:::-;;;;;;;;68874:315;;;:::o;61862:350::-;62018:28;62028:4;62034:2;62038:7;62018:9;:28::i;:::-;62079:47;62102:4;62108:2;62112:7;62121:4;62079:22;:47::i;:::-;62057:147;;;;;;;;;;;;:::i;:::-;;;;;;;;;61862:350;;;;:::o;62756:128::-;62821:4;62874:1;62845:31;;:17;62854:7;62845:8;:17::i;:::-;:31;;;;62838:38;;62756:128;;;:::o;81966:108::-;82026:13;82059:7;82052:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81966:108;:::o;25663:716::-;25719:13;25770:14;25807:1;25787:17;25798:5;25787:10;:17::i;:::-;:21;25770:38;;25823:20;25857:6;25846:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25823:41;;25879:11;26008:6;26004:2;26000:15;25992:6;25988:28;25981:35;;26045:288;26052:4;26045:288;;;26077:5;;;;;;;;26219:8;26214:2;26207:5;26203:14;26198:30;26193:3;26185:44;26275:2;26266:11;;;;;;:::i;:::-;;;;;26309:1;26300:5;:10;26045:288;26296:21;26045:288;26354:6;26347:13;;;;;25663:716;;;:::o;56569:321::-;56687:4;56739:25;56724:40;;;:11;:40;;;;:105;;;;56796:33;56781:48;;;:11;:48;;;;56724:105;:158;;;;56846:36;56870:11;56846:23;:36::i;:::-;56724:158;56704:178;;56569:321;;;:::o;84749:268::-;30386:19;:17;:19::i;:::-;84953:56:::1;84980:4;84986:2;84990:7;84999:9;84953:26;:56::i;:::-;84749:268:::0;;;;:::o;72624:158::-;;;;;:::o;31125:108::-;31192:8;:6;:8::i;:::-;31184:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;31125:108::o;64045:319::-;64174:18;64180:2;64184:7;64174:5;:18::i;:::-;64225:53;64256:1;64260:2;64264:7;64273:4;64225:22;:53::i;:::-;64203:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;64045:319;;;:::o;69977:1034::-;70131:4;70152:15;:2;:13;;;:15::i;:::-;70148:856;;;70221:2;70205:36;;;70264:12;:10;:12::i;:::-;70299:4;70326:7;70356:4;70205:174;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;70184:765;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70579:1;70562:6;:13;:18;70558:376;;70605:108;;;;;;;;;;:::i;:::-;;;;;;;;70558:376;70884:6;70878:13;70869:6;70865:2;70861:15;70854:38;70184:765;70453:41;;;70443:51;;;:6;:51;;;;70436:58;;;;;70148:856;70988:4;70981:11;;69977:1034;;;;;;;:::o;22385:948::-;22438:7;22458:14;22475:1;22458:18;;22525:8;22516:5;:17;22512:106;;22563:8;22554:17;;;;;;:::i;:::-;;;;;22600:2;22590:12;;;;22512:106;22645:8;22636:5;:17;22632:106;;22683:8;22674:17;;;;;;:::i;:::-;;;;;22720:2;22710:12;;;;22632:106;22765:8;22756:5;:17;22752:106;;22803:8;22794:17;;;;;;:::i;:::-;;;;;22840:2;22830:12;;;;22752:106;22885:7;22876:5;:16;22872:103;;22922:7;22913:16;;;;;;:::i;:::-;;;;;22958:1;22948:11;;;;22872:103;23002:7;22993:5;:16;22989:103;;23039:7;23030:16;;;;;;:::i;:::-;;;;;23075:1;23065:11;;;;22989:103;23119:7;23110:5;:16;23106:103;;23156:7;23147:16;;;;;;:::i;:::-;;;;;23192:1;23182:11;;;;23106:103;23236:7;23227:5;:16;23223:68;;23274:1;23264:11;;;;23223:68;23319:6;23312:13;;;22385:948;;;:::o;47880:173::-;47981:4;48020:25;48005:40;;;:11;:40;;;;47998:47;;47880:173;;;:::o;75734:915::-;75911:61;75938:4;75944:2;75948:12;75962:9;75911:26;:61::i;:::-;76001:1;75989:9;:13;75985:222;;;76132:63;;;;;;;;;;:::i;:::-;;;;;;;;75985:222;76219:15;76237:12;76219:30;;76282:1;76266:18;;:4;:18;;;76262:187;;76301:40;76333:7;76301:31;:40::i;:::-;76262:187;;;76371:2;76363:10;;:4;:10;;;76359:90;;76390:47;76423:4;76429:7;76390:32;:47::i;:::-;76359:90;76262:187;76477:1;76463:16;;:2;:16;;;76459:183;;76496:45;76533:7;76496:36;:45::i;:::-;76459:183;;;76569:4;76563:10;;:2;:10;;;76559:83;;76590:40;76618:2;76622:7;76590:27;:40::i;:::-;76559:83;76459:183;75900:749;75734:915;;;;:::o;64700:942::-;64794:1;64780:16;;:2;:16;;;64772:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;64853:16;64861:7;64853;:16::i;:::-;64852:17;64844:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;64915:48;64944:1;64948:2;64952:7;64961:1;64915:20;:48::i;:::-;65062:16;65070:7;65062;:16::i;:::-;65061:17;65053:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;65477:1;65460:9;:13;65470:2;65460:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;65521:2;65502:7;:16;65510:7;65502:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;65566:7;65562:2;65541:33;;65558:1;65541:33;;;;;;;;;;;;65587:47;65615:1;65619:2;65623:7;65632:1;65587:19;:47::i;:::-;64700:942;;:::o;35986:326::-;36046:4;36303:1;36281:7;:19;;;:23;36274:30;;35986:326;;;:::o;71743:159::-;;;;;:::o;77372:164::-;77476:10;:17;;;;77449:15;:24;77465:7;77449:24;;;;;;;;;;;:44;;;;77504:10;77520:7;77504:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77372:164;:::o;78163:1013::-;78454:22;78504:1;78479:22;78496:4;78479:16;:22::i;:::-;:26;;;;:::i;:::-;78454:51;;78516:18;78537:17;:26;78555:7;78537:26;;;;;;;;;;;;78516:47;;78684:14;78670:10;:28;78666:328;;78715:19;78737:12;:18;78750:4;78737:18;;;;;;;;;;;;;;;:34;78756:14;78737:34;;;;;;;;;;;;78715:56;;78821:11;78788:12;:18;78801:4;78788:18;;;;;;;;;;;;;;;:30;78807:10;78788:30;;;;;;;;;;;:44;;;;78938:10;78905:17;:30;78923:11;78905:30;;;;;;;;;;;:43;;;;78700:294;78666:328;79090:17;:26;79108:7;79090:26;;;;;;;;;;;79083:33;;;79134:12;:18;79147:4;79134:18;;;;;;;;;;;;;;;:34;79153:14;79134:34;;;;;;;;;;;79127:41;;;78269:907;;78163:1013;;:::o;79471:1079::-;79724:22;79769:1;79749:10;:17;;;;:21;;;;:::i;:::-;79724:46;;79781:18;79802:15;:24;79818:7;79802:24;;;;;;;;;;;;79781:45;;80153:19;80175:10;80186:14;80175:26;;;;;;;;:::i;:::-;;;;;;;;;;80153:48;;80239:11;80214:10;80225;80214:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;80350:10;80319:15;:28;80335:11;80319:28;;;;;;;;;;;:41;;;;80491:15;:24;80507:7;80491:24;;;;;;;;;;;80484:31;;;80526:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;79542:1008;;;79471:1079;:::o;76950:221::-;77035:14;77052:20;77069:2;77052:16;:20::i;:::-;77035:37;;77110:7;77083:12;:16;77096:2;77083:16;;;;;;;;;;;;;;;:24;77100:6;77083:24;;;;;;;;;;;:34;;;;77157:6;77128:17;:26;77146:7;77128:26;;;;;;;;;;;:35;;;;77024:147;76950:221;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:329::-;5926:6;5975:2;5963:9;5954:7;5950:23;5946:32;5943:119;;;5981:79;;:::i;:::-;5943:119;6101:1;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6072:117;5867:329;;;;:::o;6202:114::-;6269:6;6303:5;6297:12;6287:22;;6202:114;;;:::o;6322:184::-;6421:11;6455:6;6450:3;6443:19;6495:4;6490:3;6486:14;6471:29;;6322:184;;;;:::o;6512:132::-;6579:4;6602:3;6594:11;;6632:4;6627:3;6623:14;6615:22;;6512:132;;;:::o;6650:108::-;6727:24;6745:5;6727:24;:::i;:::-;6722:3;6715:37;6650:108;;:::o;6764:179::-;6833:10;6854:46;6896:3;6888:6;6854:46;:::i;:::-;6932:4;6927:3;6923:14;6909:28;;6764:179;;;;:::o;6949:113::-;7019:4;7051;7046:3;7042:14;7034:22;;6949:113;;;:::o;7098:732::-;7217:3;7246:54;7294:5;7246:54;:::i;:::-;7316:86;7395:6;7390:3;7316:86;:::i;:::-;7309:93;;7426:56;7476:5;7426:56;:::i;:::-;7505:7;7536:1;7521:284;7546:6;7543:1;7540:13;7521:284;;;7622:6;7616:13;7649:63;7708:3;7693:13;7649:63;:::i;:::-;7642:70;;7735:60;7788:6;7735:60;:::i;:::-;7725:70;;7581:224;7568:1;7565;7561:9;7556:14;;7521:284;;;7525:14;7821:3;7814:10;;7222:608;;;7098:732;;;;:::o;7836:373::-;7979:4;8017:2;8006:9;8002:18;7994:26;;8066:9;8060:4;8056:20;8052:1;8041:9;8037:17;8030:47;8094:108;8197:4;8188:6;8094:108;:::i;:::-;8086:116;;7836:373;;;;:::o;8215:117::-;8324:1;8321;8314:12;8338:117;8447:1;8444;8437:12;8461:180;8509:77;8506:1;8499:88;8606:4;8603:1;8596:15;8630:4;8627:1;8620:15;8647:281;8730:27;8752:4;8730:27;:::i;:::-;8722:6;8718:40;8860:6;8848:10;8845:22;8824:18;8812:10;8809:34;8806:62;8803:88;;;8871:18;;:::i;:::-;8803:88;8911:10;8907:2;8900:22;8690:238;8647:281;;:::o;8934:129::-;8968:6;8995:20;;:::i;:::-;8985:30;;9024:33;9052:4;9044:6;9024:33;:::i;:::-;8934:129;;;:::o;9069:308::-;9131:4;9221:18;9213:6;9210:30;9207:56;;;9243:18;;:::i;:::-;9207:56;9281:29;9303:6;9281:29;:::i;:::-;9273:37;;9365:4;9359;9355:15;9347:23;;9069:308;;;:::o;9383:146::-;9480:6;9475:3;9470;9457:30;9521:1;9512:6;9507:3;9503:16;9496:27;9383:146;;;:::o;9535:425::-;9613:5;9638:66;9654:49;9696:6;9654:49;:::i;:::-;9638:66;:::i;:::-;9629:75;;9727:6;9720:5;9713:21;9765:4;9758:5;9754:16;9803:3;9794:6;9789:3;9785:16;9782:25;9779:112;;;9810:79;;:::i;:::-;9779:112;9900:54;9947:6;9942:3;9937;9900:54;:::i;:::-;9619:341;9535:425;;;;;:::o;9980:340::-;10036:5;10085:3;10078:4;10070:6;10066:17;10062:27;10052:122;;10093:79;;:::i;:::-;10052:122;10210:6;10197:20;10235:79;10310:3;10302:6;10295:4;10287:6;10283:17;10235:79;:::i;:::-;10226:88;;10042:278;9980:340;;;;:::o;10326:509::-;10395:6;10444:2;10432:9;10423:7;10419:23;10415:32;10412:119;;;10450:79;;:::i;:::-;10412:119;10598:1;10587:9;10583:17;10570:31;10628:18;10620:6;10617:30;10614:117;;;10650:79;;:::i;:::-;10614:117;10755:63;10810:7;10801:6;10790:9;10786:22;10755:63;:::i;:::-;10745:73;;10541:287;10326:509;;;;:::o;10841:116::-;10911:21;10926:5;10911:21;:::i;:::-;10904:5;10901:32;10891:60;;10947:1;10944;10937:12;10891:60;10841:116;:::o;10963:133::-;11006:5;11044:6;11031:20;11022:29;;11060:30;11084:5;11060:30;:::i;:::-;10963:133;;;;:::o;11102:468::-;11167:6;11175;11224:2;11212:9;11203:7;11199:23;11195:32;11192:119;;;11230:79;;:::i;:::-;11192:119;11350:1;11375:53;11420:7;11411:6;11400:9;11396:22;11375:53;:::i;:::-;11365:63;;11321:117;11477:2;11503:50;11545:7;11536:6;11525:9;11521:22;11503:50;:::i;:::-;11493:60;;11448:115;11102:468;;;;;:::o;11576:89::-;11612:7;11652:6;11645:5;11641:18;11630:29;;11576:89;;;:::o;11671:120::-;11743:23;11760:5;11743:23;:::i;:::-;11736:5;11733:34;11723:62;;11781:1;11778;11771:12;11723:62;11671:120;:::o;11797:137::-;11842:5;11880:6;11867:20;11858:29;;11896:32;11922:5;11896:32;:::i;:::-;11797:137;;;;:::o;11940:327::-;11998:6;12047:2;12035:9;12026:7;12022:23;12018:32;12015:119;;;12053:79;;:::i;:::-;12015:119;12173:1;12198:52;12242:7;12233:6;12222:9;12218:22;12198:52;:::i;:::-;12188:62;;12144:116;11940:327;;;;:::o;12273:307::-;12334:4;12424:18;12416:6;12413:30;12410:56;;;12446:18;;:::i;:::-;12410:56;12484:29;12506:6;12484:29;:::i;:::-;12476:37;;12568:4;12562;12558:15;12550:23;;12273:307;;;:::o;12586:423::-;12663:5;12688:65;12704:48;12745:6;12704:48;:::i;:::-;12688:65;:::i;:::-;12679:74;;12776:6;12769:5;12762:21;12814:4;12807:5;12803:16;12852:3;12843:6;12838:3;12834:16;12831:25;12828:112;;;12859:79;;:::i;:::-;12828:112;12949:54;12996:6;12991:3;12986;12949:54;:::i;:::-;12669:340;12586:423;;;;;:::o;13028:338::-;13083:5;13132:3;13125:4;13117:6;13113:17;13109:27;13099:122;;13140:79;;:::i;:::-;13099:122;13257:6;13244:20;13282:78;13356:3;13348:6;13341:4;13333:6;13329:17;13282:78;:::i;:::-;13273:87;;13089:277;13028:338;;;;:::o;13372:943::-;13467:6;13475;13483;13491;13540:3;13528:9;13519:7;13515:23;13511:33;13508:120;;;13547:79;;:::i;:::-;13508:120;13667:1;13692:53;13737:7;13728:6;13717:9;13713:22;13692:53;:::i;:::-;13682:63;;13638:117;13794:2;13820:53;13865:7;13856:6;13845:9;13841:22;13820:53;:::i;:::-;13810:63;;13765:118;13922:2;13948:53;13993:7;13984:6;13973:9;13969:22;13948:53;:::i;:::-;13938:63;;13893:118;14078:2;14067:9;14063:18;14050:32;14109:18;14101:6;14098:30;14095:117;;;14131:79;;:::i;:::-;14095:117;14236:62;14290:7;14281:6;14270:9;14266:22;14236:62;:::i;:::-;14226:72;;14021:287;13372:943;;;;;;;:::o;14321:115::-;14406:23;14423:5;14406:23;:::i;:::-;14401:3;14394:36;14321:115;;:::o;14442:218::-;14533:4;14571:2;14560:9;14556:18;14548:26;;14584:69;14650:1;14639:9;14635:17;14626:6;14584:69;:::i;:::-;14442:218;;;;:::o;14666:474::-;14734:6;14742;14791:2;14779:9;14770:7;14766:23;14762:32;14759:119;;;14797:79;;:::i;:::-;14759:119;14917:1;14942:53;14987:7;14978:6;14967:9;14963:22;14942:53;:::i;:::-;14932:63;;14888:117;15044:2;15070:53;15115:7;15106:6;15095:9;15091:22;15070:53;:::i;:::-;15060:63;;15015:118;14666:474;;;;;:::o;15146:180::-;15194:77;15191:1;15184:88;15291:4;15288:1;15281:15;15315:4;15312:1;15305:15;15332:320;15376:6;15413:1;15407:4;15403:12;15393:22;;15460:1;15454:4;15450:12;15481:18;15471:81;;15537:4;15529:6;15525:17;15515:27;;15471:81;15599:2;15591:6;15588:14;15568:18;15565:38;15562:84;;15618:18;;:::i;:::-;15562:84;15383:269;15332:320;;;:::o;15658:220::-;15798:34;15794:1;15786:6;15782:14;15775:58;15867:3;15862:2;15854:6;15850:15;15843:28;15658:220;:::o;15884:366::-;16026:3;16047:67;16111:2;16106:3;16047:67;:::i;:::-;16040:74;;16123:93;16212:3;16123:93;:::i;:::-;16241:2;16236:3;16232:12;16225:19;;15884:366;;;:::o;16256:419::-;16422:4;16460:2;16449:9;16445:18;16437:26;;16509:9;16503:4;16499:20;16495:1;16484:9;16480:17;16473:47;16537:131;16663:4;16537:131;:::i;:::-;16529:139;;16256:419;;;:::o;16681:248::-;16821:34;16817:1;16809:6;16805:14;16798:58;16890:31;16885:2;16877:6;16873:15;16866:56;16681:248;:::o;16935:366::-;17077:3;17098:67;17162:2;17157:3;17098:67;:::i;:::-;17091:74;;17174:93;17263:3;17174:93;:::i;:::-;17292:2;17287:3;17283:12;17276:19;;16935:366;;;:::o;17307:419::-;17473:4;17511:2;17500:9;17496:18;17488:26;;17560:9;17554:4;17550:20;17546:1;17535:9;17531:17;17524:47;17588:131;17714:4;17588:131;:::i;:::-;17580:139;;17307:419;;;:::o;17732:232::-;17872:34;17868:1;17860:6;17856:14;17849:58;17941:15;17936:2;17928:6;17924:15;17917:40;17732:232;:::o;17970:366::-;18112:3;18133:67;18197:2;18192:3;18133:67;:::i;:::-;18126:74;;18209:93;18298:3;18209:93;:::i;:::-;18327:2;18322:3;18318:12;18311:19;;17970:366;;;:::o;18342:419::-;18508:4;18546:2;18535:9;18531:18;18523:26;;18595:9;18589:4;18585:20;18581:1;18570:9;18566:17;18559:47;18623:131;18749:4;18623:131;:::i;:::-;18615:139;;18342:419;;;:::o;18767:230::-;18907:34;18903:1;18895:6;18891:14;18884:58;18976:13;18971:2;18963:6;18959:15;18952:38;18767:230;:::o;19003:366::-;19145:3;19166:67;19230:2;19225:3;19166:67;:::i;:::-;19159:74;;19242:93;19331:3;19242:93;:::i;:::-;19360:2;19355:3;19351:12;19344:19;;19003:366;;;:::o;19375:419::-;19541:4;19579:2;19568:9;19564:18;19556:26;;19628:9;19622:4;19618:20;19614:1;19603:9;19599:17;19592:47;19656:131;19782:4;19656:131;:::i;:::-;19648:139;;19375:419;;;:::o;19800:180::-;19940:32;19936:1;19928:6;19924:14;19917:56;19800:180;:::o;19986:366::-;20128:3;20149:67;20213:2;20208:3;20149:67;:::i;:::-;20142:74;;20225:93;20314:3;20225:93;:::i;:::-;20343:2;20338:3;20334:12;20327:19;;19986:366;;;:::o;20358:419::-;20524:4;20562:2;20551:9;20547:18;20539:26;;20611:9;20605:4;20601:20;20597:1;20586:9;20582:17;20575:47;20639:131;20765:4;20639:131;:::i;:::-;20631:139;;20358:419;;;:::o;20783:147::-;20884:11;20921:3;20906:18;;20783:147;;;;:::o;20936:114::-;;:::o;21056:398::-;21215:3;21236:83;21317:1;21312:3;21236:83;:::i;:::-;21229:90;;21328:93;21417:3;21328:93;:::i;:::-;21446:1;21441:3;21437:11;21430:18;;21056:398;;;:::o;21460:379::-;21644:3;21666:147;21809:3;21666:147;:::i;:::-;21659:154;;21830:3;21823:10;;21460:379;;;:::o;21845:171::-;21985:23;21981:1;21973:6;21969:14;21962:47;21845:171;:::o;22022:366::-;22164:3;22185:67;22249:2;22244:3;22185:67;:::i;:::-;22178:74;;22261:93;22350:3;22261:93;:::i;:::-;22379:2;22374:3;22370:12;22363:19;;22022:366;;;:::o;22394:419::-;22560:4;22598:2;22587:9;22583:18;22575:26;;22647:9;22641:4;22637:20;22633:1;22622:9;22618:17;22611:47;22675:131;22801:4;22675:131;:::i;:::-;22667:139;;22394:419;;;:::o;22819:180::-;22867:77;22864:1;22857:88;22964:4;22961:1;22954:15;22988:4;22985:1;22978:15;23005:180;23053:77;23050:1;23043:88;23150:4;23147:1;23140:15;23174:4;23171:1;23164:15;23191:233;23230:3;23253:24;23271:5;23253:24;:::i;:::-;23244:33;;23299:66;23292:5;23289:77;23286:103;;23369:18;;:::i;:::-;23286:103;23416:1;23409:5;23405:13;23398:20;;23191:233;;;:::o;23430:174::-;23570:26;23566:1;23558:6;23554:14;23547:50;23430:174;:::o;23610:366::-;23752:3;23773:67;23837:2;23832:3;23773:67;:::i;:::-;23766:74;;23849:93;23938:3;23849:93;:::i;:::-;23967:2;23962:3;23958:12;23951:19;;23610:366;;;:::o;23982:419::-;24148:4;24186:2;24175:9;24171:18;24163:26;;24235:9;24229:4;24225:20;24221:1;24210:9;24206:17;24199:47;24263:131;24389:4;24263:131;:::i;:::-;24255:139;;23982:419;;;:::o;24407:191::-;24447:3;24466:20;24484:1;24466:20;:::i;:::-;24461:25;;24500:20;24518:1;24500:20;:::i;:::-;24495:25;;24543:1;24540;24536:9;24529:16;;24564:3;24561:1;24558:10;24555:36;;;24571:18;;:::i;:::-;24555:36;24407:191;;;;:::o;24604:231::-;24744:34;24740:1;24732:6;24728:14;24721:58;24813:14;24808:2;24800:6;24796:15;24789:39;24604:231;:::o;24841:366::-;24983:3;25004:67;25068:2;25063:3;25004:67;:::i;:::-;24997:74;;25080:93;25169:3;25080:93;:::i;:::-;25198:2;25193:3;25189:12;25182:19;;24841:366;;;:::o;25213:419::-;25379:4;25417:2;25406:9;25402:18;25394:26;;25466:9;25460:4;25456:20;25452:1;25441:9;25437:17;25430:47;25494:131;25620:4;25494:131;:::i;:::-;25486:139;;25213:419;;;:::o;25638:141::-;25687:4;25710:3;25702:11;;25733:3;25730:1;25723:14;25767:4;25764:1;25754:18;25746:26;;25638:141;;;:::o;25785:93::-;25822:6;25869:2;25864;25857:5;25853:14;25849:23;25839:33;;25785:93;;;:::o;25884:107::-;25928:8;25978:5;25972:4;25968:16;25947:37;;25884:107;;;;:::o;25997:393::-;26066:6;26116:1;26104:10;26100:18;26139:97;26169:66;26158:9;26139:97;:::i;:::-;26257:39;26287:8;26276:9;26257:39;:::i;:::-;26245:51;;26329:4;26325:9;26318:5;26314:21;26305:30;;26378:4;26368:8;26364:19;26357:5;26354:30;26344:40;;26073:317;;25997:393;;;;;:::o;26396:60::-;26424:3;26445:5;26438:12;;26396:60;;;:::o;26462:142::-;26512:9;26545:53;26563:34;26572:24;26590:5;26572:24;:::i;:::-;26563:34;:::i;:::-;26545:53;:::i;:::-;26532:66;;26462:142;;;:::o;26610:75::-;26653:3;26674:5;26667:12;;26610:75;;;:::o;26691:269::-;26801:39;26832:7;26801:39;:::i;:::-;26862:91;26911:41;26935:16;26911:41;:::i;:::-;26903:6;26896:4;26890:11;26862:91;:::i;:::-;26856:4;26849:105;26767:193;26691:269;;;:::o;26966:73::-;27011:3;26966:73;:::o;27045:189::-;27122:32;;:::i;:::-;27163:65;27221:6;27213;27207:4;27163:65;:::i;:::-;27098:136;27045:189;;:::o;27240:186::-;27300:120;27317:3;27310:5;27307:14;27300:120;;;27371:39;27408:1;27401:5;27371:39;:::i;:::-;27344:1;27337:5;27333:13;27324:22;;27300:120;;;27240:186;;:::o;27432:543::-;27533:2;27528:3;27525:11;27522:446;;;27567:38;27599:5;27567:38;:::i;:::-;27651:29;27669:10;27651:29;:::i;:::-;27641:8;27637:44;27834:2;27822:10;27819:18;27816:49;;;27855:8;27840:23;;27816:49;27878:80;27934:22;27952:3;27934:22;:::i;:::-;27924:8;27920:37;27907:11;27878:80;:::i;:::-;27537:431;;27522:446;27432:543;;;:::o;27981:117::-;28035:8;28085:5;28079:4;28075:16;28054:37;;27981:117;;;;:::o;28104:169::-;28148:6;28181:51;28229:1;28225:6;28217:5;28214:1;28210:13;28181:51;:::i;:::-;28177:56;28262:4;28256;28252:15;28242:25;;28155:118;28104:169;;;;:::o;28278:295::-;28354:4;28500:29;28525:3;28519:4;28500:29;:::i;:::-;28492:37;;28562:3;28559:1;28555:11;28549:4;28546:21;28538:29;;28278:295;;;;:::o;28578:1395::-;28695:37;28728:3;28695:37;:::i;:::-;28797:18;28789:6;28786:30;28783:56;;;28819:18;;:::i;:::-;28783:56;28863:38;28895:4;28889:11;28863:38;:::i;:::-;28948:67;29008:6;29000;28994:4;28948:67;:::i;:::-;29042:1;29066:4;29053:17;;29098:2;29090:6;29087:14;29115:1;29110:618;;;;29772:1;29789:6;29786:77;;;29838:9;29833:3;29829:19;29823:26;29814:35;;29786:77;29889:67;29949:6;29942:5;29889:67;:::i;:::-;29883:4;29876:81;29745:222;29080:887;;29110:618;29162:4;29158:9;29150:6;29146:22;29196:37;29228:4;29196:37;:::i;:::-;29255:1;29269:208;29283:7;29280:1;29277:14;29269:208;;;29362:9;29357:3;29353:19;29347:26;29339:6;29332:42;29413:1;29405:6;29401:14;29391:24;;29460:2;29449:9;29445:18;29432:31;;29306:4;29303:1;29299:12;29294:17;;29269:208;;;29505:6;29496:7;29493:19;29490:179;;;29563:9;29558:3;29554:19;29548:26;29606:48;29648:4;29640:6;29636:17;29625:9;29606:48;:::i;:::-;29598:6;29591:64;29513:156;29490:179;29715:1;29711;29703:6;29699:14;29695:22;29689:4;29682:36;29117:611;;;29080:887;;28670:1303;;;28578:1395;;:::o;29979:174::-;30119:26;30115:1;30107:6;30103:14;30096:50;29979:174;:::o;30159:366::-;30301:3;30322:67;30386:2;30381:3;30322:67;:::i;:::-;30315:74;;30398:93;30487:3;30398:93;:::i;:::-;30516:2;30511:3;30507:12;30500:19;;30159:366;;;:::o;30531:419::-;30697:4;30735:2;30724:9;30720:18;30712:26;;30784:9;30778:4;30774:20;30770:1;30759:9;30755:17;30748:47;30812:131;30938:4;30812:131;:::i;:::-;30804:139;;30531:419;;;:::o;30956:228::-;31096:34;31092:1;31084:6;31080:14;31073:58;31165:11;31160:2;31152:6;31148:15;31141:36;30956:228;:::o;31190:366::-;31332:3;31353:67;31417:2;31412:3;31353:67;:::i;:::-;31346:74;;31429:93;31518:3;31429:93;:::i;:::-;31547:2;31542:3;31538:12;31531:19;;31190:366;;;:::o;31562:419::-;31728:4;31766:2;31755:9;31751:18;31743:26;;31815:9;31809:4;31805:20;31801:1;31790:9;31786:17;31779:47;31843:131;31969:4;31843:131;:::i;:::-;31835:139;;31562:419;;;:::o;31987:176::-;32127:28;32123:1;32115:6;32111:14;32104:52;31987:176;:::o;32169:366::-;32311:3;32332:67;32396:2;32391:3;32332:67;:::i;:::-;32325:74;;32408:93;32497:3;32408:93;:::i;:::-;32526:2;32521:3;32517:12;32510:19;;32169:366;;;:::o;32541:419::-;32707:4;32745:2;32734:9;32730:18;32722:26;;32794:9;32788:4;32784:20;32780:1;32769:9;32765:17;32758:47;32822:131;32948:4;32822:131;:::i;:::-;32814:139;;32541:419;;;:::o;32966:227::-;33106:34;33102:1;33094:6;33090:14;33083:58;33175:10;33170:2;33162:6;33158:15;33151:35;32966:227;:::o;33199:366::-;33341:3;33362:67;33426:2;33421:3;33362:67;:::i;:::-;33355:74;;33438:93;33527:3;33438:93;:::i;:::-;33556:2;33551:3;33547:12;33540:19;;33199:366;;;:::o;33571:419::-;33737:4;33775:2;33764:9;33760:18;33752:26;;33824:9;33818:4;33814:20;33810:1;33799:9;33795:17;33788:47;33852:131;33978:4;33852:131;:::i;:::-;33844:139;;33571:419;;;:::o;33996:171::-;34136:23;34132:1;34124:6;34120:14;34113:47;33996:171;:::o;34173:366::-;34315:3;34336:67;34400:2;34395:3;34336:67;:::i;:::-;34329:74;;34412:93;34501:3;34412:93;:::i;:::-;34530:2;34525:3;34521:12;34514:19;;34173:366;;;:::o;34545:419::-;34711:4;34749:2;34738:9;34734:18;34726:26;;34798:9;34792:4;34788:20;34784:1;34773:9;34769:17;34762:47;34826:131;34952:4;34826:131;:::i;:::-;34818:139;;34545:419;;;:::o;34970:168::-;35110:20;35106:1;35098:6;35094:14;35087:44;34970:168;:::o;35144:366::-;35286:3;35307:67;35371:2;35366:3;35307:67;:::i;:::-;35300:74;;35383:93;35472:3;35383:93;:::i;:::-;35501:2;35496:3;35492:12;35485:19;;35144:366;;;:::o;35516:419::-;35682:4;35720:2;35709:9;35705:18;35697:26;;35769:9;35763:4;35759:20;35755:1;35744:9;35740:17;35733:47;35797:131;35923:4;35797:131;:::i;:::-;35789:139;;35516:419;;;:::o;35941:234::-;36081:34;36077:1;36069:6;36065:14;36058:58;36150:17;36145:2;36137:6;36133:15;36126:42;35941:234;:::o;36181:366::-;36323:3;36344:67;36408:2;36403:3;36344:67;:::i;:::-;36337:74;;36420:93;36509:3;36420:93;:::i;:::-;36538:2;36533:3;36529:12;36522:19;;36181:366;;;:::o;36553:419::-;36719:4;36757:2;36746:9;36742:18;36734:26;;36806:9;36800:4;36796:20;36792:1;36781:9;36777:17;36770:47;36834:131;36960:4;36834:131;:::i;:::-;36826:139;;36553:419;;;:::o;36978:148::-;37080:11;37117:3;37102:18;;36978:148;;;;:::o;37132:390::-;37238:3;37266:39;37299:5;37266:39;:::i;:::-;37321:89;37403:6;37398:3;37321:89;:::i;:::-;37314:96;;37419:65;37477:6;37472:3;37465:4;37458:5;37454:16;37419:65;:::i;:::-;37509:6;37504:3;37500:16;37493:23;;37242:280;37132:390;;;;:::o;37552:874::-;37655:3;37692:5;37686:12;37721:36;37747:9;37721:36;:::i;:::-;37773:89;37855:6;37850:3;37773:89;:::i;:::-;37766:96;;37893:1;37882:9;37878:17;37909:1;37904:166;;;;38084:1;38079:341;;;;37871:549;;37904:166;37988:4;37984:9;37973;37969:25;37964:3;37957:38;38050:6;38043:14;38036:22;38028:6;38024:35;38019:3;38015:45;38008:52;;37904:166;;38079:341;38146:38;38178:5;38146:38;:::i;:::-;38206:1;38220:154;38234:6;38231:1;38228:13;38220:154;;;38308:7;38302:14;38298:1;38293:3;38289:11;38282:35;38358:1;38349:7;38345:15;38334:26;;38256:4;38253:1;38249:12;38244:17;;38220:154;;;38403:6;38398:3;38394:16;38387:23;;38086:334;;37871:549;;37659:767;;37552:874;;;;:::o;38432:589::-;38657:3;38679:95;38770:3;38761:6;38679:95;:::i;:::-;38672:102;;38791:95;38882:3;38873:6;38791:95;:::i;:::-;38784:102;;38903:92;38991:3;38982:6;38903:92;:::i;:::-;38896:99;;39012:3;39005:10;;38432:589;;;;;;:::o;39027:225::-;39167:34;39163:1;39155:6;39151:14;39144:58;39236:8;39231:2;39223:6;39219:15;39212:33;39027:225;:::o;39258:366::-;39400:3;39421:67;39485:2;39480:3;39421:67;:::i;:::-;39414:74;;39497:93;39586:3;39497:93;:::i;:::-;39615:2;39610:3;39606:12;39599:19;;39258:366;;;:::o;39630:419::-;39796:4;39834:2;39823:9;39819:18;39811:26;;39883:9;39877:4;39873:20;39869:1;39858:9;39854:17;39847:47;39911:131;40037:4;39911:131;:::i;:::-;39903:139;;39630:419;;;:::o;40055:224::-;40195:34;40191:1;40183:6;40179:14;40172:58;40264:7;40259:2;40251:6;40247:15;40240:32;40055:224;:::o;40285:366::-;40427:3;40448:67;40512:2;40507:3;40448:67;:::i;:::-;40441:74;;40524:93;40613:3;40524:93;:::i;:::-;40642:2;40637:3;40633:12;40626:19;;40285:366;;;:::o;40657:419::-;40823:4;40861:2;40850:9;40846:18;40838:26;;40910:9;40904:4;40900:20;40896:1;40885:9;40881:17;40874:47;40938:131;41064:4;40938:131;:::i;:::-;40930:139;;40657:419;;;:::o;41082:223::-;41222:34;41218:1;41210:6;41206:14;41199:58;41291:6;41286:2;41278:6;41274:15;41267:31;41082:223;:::o;41311:366::-;41453:3;41474:67;41538:2;41533:3;41474:67;:::i;:::-;41467:74;;41550:93;41639:3;41550:93;:::i;:::-;41668:2;41663:3;41659:12;41652:19;;41311:366;;;:::o;41683:419::-;41849:4;41887:2;41876:9;41872:18;41864:26;;41936:9;41930:4;41926:20;41922:1;41911:9;41907:17;41900:47;41964:131;42090:4;41964:131;:::i;:::-;41956:139;;41683:419;;;:::o;42108:182::-;42248:34;42244:1;42236:6;42232:14;42225:58;42108:182;:::o;42296:366::-;42438:3;42459:67;42523:2;42518:3;42459:67;:::i;:::-;42452:74;;42535:93;42624:3;42535:93;:::i;:::-;42653:2;42648:3;42644:12;42637:19;;42296:366;;;:::o;42668:419::-;42834:4;42872:2;42861:9;42857:18;42849:26;;42921:9;42915:4;42911:20;42907:1;42896:9;42892:17;42885:47;42949:131;43075:4;42949:131;:::i;:::-;42941:139;;42668:419;;;:::o;43093:181::-;43233:33;43229:1;43221:6;43217:14;43210:57;43093:181;:::o;43280:366::-;43422:3;43443:67;43507:2;43502:3;43443:67;:::i;:::-;43436:74;;43519:93;43608:3;43519:93;:::i;:::-;43637:2;43632:3;43628:12;43621:19;;43280:366;;;:::o;43652:419::-;43818:4;43856:2;43845:9;43841:18;43833:26;;43905:9;43899:4;43895:20;43891:1;43880:9;43876:17;43869:47;43933:131;44059:4;43933:131;:::i;:::-;43925:139;;43652:419;;;:::o;44077:166::-;44217:18;44213:1;44205:6;44201:14;44194:42;44077:166;:::o;44249:366::-;44391:3;44412:67;44476:2;44471:3;44412:67;:::i;:::-;44405:74;;44488:93;44577:3;44488:93;:::i;:::-;44606:2;44601:3;44597:12;44590:19;;44249:366;;;:::o;44621:419::-;44787:4;44825:2;44814:9;44810:18;44802:26;;44874:9;44868:4;44864:20;44860:1;44849:9;44845:17;44838:47;44902:131;45028:4;44902:131;:::i;:::-;44894:139;;44621:419;;;:::o;45046:410::-;45086:7;45109:20;45127:1;45109:20;:::i;:::-;45104:25;;45143:20;45161:1;45143:20;:::i;:::-;45138:25;;45198:1;45195;45191:9;45220:30;45238:11;45220:30;:::i;:::-;45209:41;;45399:1;45390:7;45386:15;45383:1;45380:22;45360:1;45353:9;45333:83;45310:139;;45429:18;;:::i;:::-;45310:139;45094:362;45046:410;;;;:::o;45462:180::-;45510:77;45507:1;45500:88;45607:4;45604:1;45597:15;45631:4;45628:1;45621:15;45648:185;45688:1;45705:20;45723:1;45705:20;:::i;:::-;45700:25;;45739:20;45757:1;45739:20;:::i;:::-;45734:25;;45778:1;45768:35;;45783:18;;:::i;:::-;45768:35;45825:1;45822;45818:9;45813:14;;45648:185;;;;:::o;45839:194::-;45879:4;45899:20;45917:1;45899:20;:::i;:::-;45894:25;;45933:20;45951:1;45933:20;:::i;:::-;45928:25;;45977:1;45974;45970:9;45962:17;;46001:1;45995:4;45992:11;45989:37;;;46006:18;;:::i;:::-;45989:37;45839:194;;;;:::o;46039:175::-;46179:27;46175:1;46167:6;46163:14;46156:51;46039:175;:::o;46220:366::-;46362:3;46383:67;46447:2;46442:3;46383:67;:::i;:::-;46376:74;;46459:93;46548:3;46459:93;:::i;:::-;46577:2;46572:3;46568:12;46561:19;;46220:366;;;:::o;46592:419::-;46758:4;46796:2;46785:9;46781:18;46773:26;;46845:9;46839:4;46835:20;46831:1;46820:9;46816:17;46809:47;46873:131;46999:4;46873:131;:::i;:::-;46865:139;;46592:419;;;:::o;47017:237::-;47157:34;47153:1;47145:6;47141:14;47134:58;47226:20;47221:2;47213:6;47209:15;47202:45;47017:237;:::o;47260:366::-;47402:3;47423:67;47487:2;47482:3;47423:67;:::i;:::-;47416:74;;47499:93;47588:3;47499:93;:::i;:::-;47617:2;47612:3;47608:12;47601:19;;47260:366;;;:::o;47632:419::-;47798:4;47836:2;47825:9;47821:18;47813:26;;47885:9;47879:4;47875:20;47871:1;47860:9;47856:17;47849:47;47913:131;48039:4;47913:131;:::i;:::-;47905:139;;47632:419;;;:::o;48057:170::-;48197:22;48193:1;48185:6;48181:14;48174:46;48057:170;:::o;48233:366::-;48375:3;48396:67;48460:2;48455:3;48396:67;:::i;:::-;48389:74;;48472:93;48561:3;48472:93;:::i;:::-;48590:2;48585:3;48581:12;48574:19;;48233:366;;;:::o;48605:419::-;48771:4;48809:2;48798:9;48794:18;48786:26;;48858:9;48852:4;48848:20;48844:1;48833:9;48829:17;48822:47;48886:131;49012:4;48886:131;:::i;:::-;48878:139;;48605:419;;;:::o;49030:98::-;49081:6;49115:5;49109:12;49099:22;;49030:98;;;:::o;49134:168::-;49217:11;49251:6;49246:3;49239:19;49291:4;49286:3;49282:14;49267:29;;49134:168;;;;:::o;49308:373::-;49394:3;49422:38;49454:5;49422:38;:::i;:::-;49476:70;49539:6;49534:3;49476:70;:::i;:::-;49469:77;;49555:65;49613:6;49608:3;49601:4;49594:5;49590:16;49555:65;:::i;:::-;49645:29;49667:6;49645:29;:::i;:::-;49640:3;49636:39;49629:46;;49398:283;49308:373;;;;:::o;49687:640::-;49882:4;49920:3;49909:9;49905:19;49897:27;;49934:71;50002:1;49991:9;49987:17;49978:6;49934:71;:::i;:::-;50015:72;50083:2;50072:9;50068:18;50059:6;50015:72;:::i;:::-;50097;50165:2;50154:9;50150:18;50141:6;50097:72;:::i;:::-;50216:9;50210:4;50206:20;50201:2;50190:9;50186:18;50179:48;50244:76;50315:4;50306:6;50244:76;:::i;:::-;50236:84;;49687:640;;;;;;;:::o;50333:141::-;50389:5;50420:6;50414:13;50405:22;;50436:32;50462:5;50436:32;:::i;:::-;50333:141;;;;:::o;50480:349::-;50549:6;50598:2;50586:9;50577:7;50573:23;50569:32;50566:119;;;50604:79;;:::i;:::-;50566:119;50724:1;50749:63;50804:7;50795:6;50784:9;50780:22;50749:63;:::i;:::-;50739:73;;50695:127;50480:349;;;;:::o;50835:240::-;50975:34;50971:1;50963:6;50959:14;50952:58;51044:23;51039:2;51031:6;51027:15;51020:48;50835:240;:::o;51081:366::-;51223:3;51244:67;51308:2;51303:3;51244:67;:::i;:::-;51237:74;;51320:93;51409:3;51320:93;:::i;:::-;51438:2;51433:3;51429:12;51422:19;;51081:366;;;:::o;51453:419::-;51619:4;51657:2;51646:9;51642:18;51634:26;;51706:9;51700:4;51696:20;51692:1;51681:9;51677:17;51670:47;51734:131;51860:4;51734:131;:::i;:::-;51726:139;;51453:419;;;:::o;51878:182::-;52018:34;52014:1;52006:6;52002:14;51995:58;51878:182;:::o;52066:366::-;52208:3;52229:67;52293:2;52288:3;52229:67;:::i;:::-;52222:74;;52305:93;52394:3;52305:93;:::i;:::-;52423:2;52418:3;52414:12;52407:19;;52066:366;;;:::o;52438:419::-;52604:4;52642:2;52631:9;52627:18;52619:26;;52691:9;52685:4;52681:20;52677:1;52666:9;52662:17;52655:47;52719:131;52845:4;52719:131;:::i;:::-;52711:139;;52438:419;;;:::o;52863:178::-;53003:30;52999:1;52991:6;52987:14;52980:54;52863:178;:::o;53047:366::-;53189:3;53210:67;53274:2;53269:3;53210:67;:::i;:::-;53203:74;;53286:93;53375:3;53286:93;:::i;:::-;53404:2;53399:3;53395:12;53388:19;;53047:366;;;:::o;53419:419::-;53585:4;53623:2;53612:9;53608:18;53600:26;;53672:9;53666:4;53662:20;53658:1;53647:9;53643:17;53636:47;53700:131;53826:4;53700:131;:::i;:::-;53692:139;;53419:419;;;:::o;53844:180::-;53892:77;53889:1;53882:88;53989:4;53986:1;53979:15;54013:4;54010:1;54003:15

Swarm Source

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