APE Price: $1.23 (-7.31%)

Based OnChain Dinos (DINO)

Overview

TokenID

101

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
OnChainDinos

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at apescan.io on 2024-10-22
*/

/**
 *Submitted for verification at basescan.org on 2024-01-05
*/

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


// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)

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


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

pragma solidity ^0.8.20;

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

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

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

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

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


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

pragma solidity ^0.8.20;

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds towards infinity instead
     * of rounding towards zero.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        if (b == 0) {
            // Guarantee the same behavior as in a regular Solidity division.
            return a / b;
        }

        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

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

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

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            if (denominator <= prod1) {
                revert MathOverflowedMulDiv();
            }

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

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

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

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

            uint256 twos = denominator & (0 - denominator);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.20;



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

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

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

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

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

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

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

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

// File: base64-sol/base64.sol



pragma solidity >=0.6.0;

/// @title Base64
/// @author Brecht Devos - <[email protected]>
/// @notice Provides functions for encoding/decoding base64
library Base64 {
    string internal constant TABLE_ENCODE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
    bytes  internal constant TABLE_DECODE = hex"0000000000000000000000000000000000000000000000000000000000000000"
                                            hex"00000000000000000000003e0000003f3435363738393a3b3c3d000000000000"
                                            hex"00000102030405060708090a0b0c0d0e0f101112131415161718190000000000"
                                            hex"001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132330000000000";

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return '';

        // load the table into memory
        string memory table = TABLE_ENCODE;

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 3 bytes at a time
            for {} lt(dataPtr, endPtr) {}
            {
                // read 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // write 4 characters
                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr( 6, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(        input,  0x3F))))
                resultPtr := add(resultPtr, 1)
            }

            // padding with '='
            switch mod(mload(data), 3)
            case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) }
            case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) }
        }

        return result;
    }

    function decode(string memory _data) internal pure returns (bytes memory) {
        bytes memory data = bytes(_data);

        if (data.length == 0) return new bytes(0);
        require(data.length % 4 == 0, "invalid base64 decoder input");

        // load the table into memory
        bytes memory table = TABLE_DECODE;

        // every 4 characters represent 3 bytes
        uint256 decodedLen = (data.length / 4) * 3;

        // add some extra buffer at the end required for the writing
        bytes memory result = new bytes(decodedLen + 32);

        assembly {
            // padding with '='
            let lastBytes := mload(add(data, mload(data)))
            if eq(and(lastBytes, 0xFF), 0x3d) {
                decodedLen := sub(decodedLen, 1)
                if eq(and(lastBytes, 0xFFFF), 0x3d3d) {
                    decodedLen := sub(decodedLen, 1)
                }
            }

            // set the actual output length
            mstore(result, decodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 4 characters at a time
            for {} lt(dataPtr, endPtr) {}
            {
               // read 4 characters
               dataPtr := add(dataPtr, 4)
               let input := mload(dataPtr)

               // write 3 bytes
               let output := add(
                   add(
                       shl(18, and(mload(add(tablePtr, and(shr(24, input), 0xFF))), 0xFF)),
                       shl(12, and(mload(add(tablePtr, and(shr(16, input), 0xFF))), 0xFF))),
                   add(
                       shl( 6, and(mload(add(tablePtr, and(shr( 8, input), 0xFF))), 0xFF)),
                               and(mload(add(tablePtr, and(        input , 0xFF))), 0xFF)
                    )
                )
                mstore(resultPtr, shl(232, output))
                resultPtr := add(resultPtr, 3)
            }
        }

        return result;
    }
}

// File: contracts/helpers/DinoData.sol


pragma solidity ^0.8.20;

contract DinoData {

/// Dino Trait Struct
    struct TraitStruct {
        uint body;
        uint chest;
        uint eye;
        uint face;
        uint feet;
        uint head;
        uint spike;
    }

//// Store a dinos traits here - this is filled when minted!
    mapping(uint => TraitStruct) public tokenTraits;

//// Dino Eggs
    mapping(uint => uint) public DinoEggs;

//// Bodys of Dinos
        bytes[] internal body_data = [
                bytes(hex'06054893c507054893c508054893c509054892c406064893c507064893c508064893c509064893c50a064892c406074893c507074893c508074893c509074893c50a074892c406084893c507084893c508084893c504094893c506094893c507094893c508094893c509094892c4050a4893c5060a4893c5070a4893c5080a4893c5060b4892c4080b4892c4'),
                bytes(hex'0605c4cadf0705c4cadf0805c4cadf0905c4cadf0606aab8e30706aab8e30806aab8e30906aab8e30a06abb8e3060795a8e4070795a8e4080795a8e4090795a8e40a0795a8e406088199e407088199e408088199e40409728de60609728de60709718ee60809718ee60909728de6050a5e7ee2060a5e7ee2070a5e7ee2080a5f7ee2060b5275e2080b5275e2'),
                bytes(hex'06058ba4d507058ba4d508058ba4d509058ca2d206068ba4d507068ba4d508068ba4d509068ba4d50a068ca2d206078ba4d507078ba4d508078ba4d509078ba4d50a078ca2d206088ba4d507088ba4d508088ba4d504098ba4d506098ba4d507098ba4d508098ba4d509098ca2d2050a8ba4d5060a8ba4d5070a8ba4d5080a8ba4d5060b8ca2d2080b8ca2d2'),
                bytes(hex'0605acacac0705acacac0805acacac0905acaaa90606acacac0706acacac0806acacac0906acacac0a06acaaa90607acacac0707acacac0807acacac0907acacac0a07acaaa90608acacac0708acacac0808acacac0409ababab0609acacac0709acacac0809acacac0909acaaa9050aababab060aacacac070aacacac080aacacac060bacaaa9080bacaaa9'),
                bytes(hex'0605f0f0f00705f0f0f00805f0f0f00905f0f0f00606dadada0706dadada0806dadada0906dadada0a06dadada0607c3c3c30707c3c3c30807c3c3c30907c3c3c30a07c2c2c20608b1b1b10708b1b1b10808b1b1b104099b9b9b06099b9b9b07099b9b9b08099b9b9b09099a9b9b050a828282060a828282070a828282080a828283060b6d6d6d080b6d6d6d'),
                bytes(hex'0605c1d9cb0705c1d9cb0805c1d9cb0905c1d9cb0606acd4bd0706acd4bd0806acd4bd0906acd4bd0a06acd4bd06078ed0a907078ed0a908078ed0a909078ed0a90a078ed0a906086ace9407086ace9408086ace94040947d481060958d18a070958d18a080958d18a090958d18a050a47d481060a47d481070a47d481080a47d481060b30d273080b30d273'),
                bytes(hex'06056ab38707056ab38708056ab38709056bb18506066ab38707066ab38708066ab38709066ab3870a066bb18506076ab38707076ab38708076ab38709076ab3870a076bb18506086ab38707086ab38708086ab38704096ab28706096ab38707096ab38708096ab38709096bb185050a6ab287060a6ab387070a6ab387080a6ab387060b6bb185080b6bb185'),
                bytes(hex'0605c7dca40705c7dca40805c7dca40905c7dba20606c7dca40706c7dca40806c7dca40906c7dca40a06c7dba20607c7dca40707c7dca40807c7dca40907c7dca40a07c7dba20608c7dca40708c7dca40808c7dca40409c7daa20609c7dca40709c7dca40809c7dca40909c7dba2050ac7daa2060ac7dca4070ac7dca4080ac7dca4060bc7dba2080bc7dba2'),
                bytes(hex'0605e1d8d10705e1d8d10805e1d8d10905e1d8d10606dfc2ae0706dfc2ae0806dfc2ae0906dfc2ae0a06dfc2ae0607e1b08e0707e1b08e0807e1b08e0907e1b08e0a07e1b08e0608e5a57a0708e5a57a0808e4a57a0409e4955f0609e5955e0709e5955e0809e5955e0909e4955f050ae48442060ae48442070ae48442080ae48442060be37931080be37931'),
                bytes(hex'0605dbbdca0705dbbdc90805dbbdc90905dbbdca0606deadc20706deadc20806deadc20906deadc20a06deadc10607de9db80707de9db80807de9db80907de9db80a07de9db80608dd90b00708dd90b00808dd90b00409dc78a10609dc78a10709dc78a20809dc78a20909dc78a1050adc6c9b060adc6c9b070adc6c9b080adc6c9a060bdd6094080bdd6094'),
                bytes(hex'0605f2adbe0705f2adbe0805f2adbe0905f1acbc0606f2adbe0706f2adbe0806f2adbe0906f2adbe0a06f1acbc0607f2adbe0707f2adbe0807f2adbe0907f2adbe0a07f1acbc0608f2adbe0708f2adbe0808f2adbe0409f0abbb0609f2adbe0709f2adbe0809f2adbe0909f1acbc050af0abbb060af2adbe070af2adbe080af2adbe060bf1acbc080bf1acbc'),
                bytes(hex'0605bf61570705bf61570805bf61570905bf62570606cb88440706cb88440806cb88440906cb88440a06cb88440607ccb1440707ccb1440807ccb1440907ccb1440a07cbb14406086bc15607086bc15608086bc15704096391c506096391c507096391c508096391c509096391c4050a7956c6060a7956c6070a7956c6080a7957c5060bbe67c4080bbe67c4'),
                bytes(hex'0605ba4e460705ba4e460805ba4e460905b84e460606ba4e460706ba4e460806ba4e460906ba4e460a06b84e460607ba4e460707ba4e460807ba4e460907ba4e460a07b84e460608ba4e460708ba4e460808ba4e460409b84e460609ba4e460709ba4e460809ba4e460909b84e46050ab84e46060aba4e46070aba4e46080aba4e46060bb84e46080bb84e46'),
                bytes(hex'06056ec9d407056ec9d408056ec9d409056ecad406066ecad407066ec9d408066ec9d409066ec9d40a066ecad406076ecad407076ec9d408076ec9d409076ec9d40a076ecad406086ecad407086ec9d408086ec9d404096ecad406096ec9d407096ec9d408096ec9d409096ecad4050a6ec9d4060a6ec9d4070a6ec9d4080a6ecad4060b6ecad4080b6ecad4'),
                bytes(hex'0605d7d2aa0705d7d2aa0805d7d2aa0905d7d2aa0606dad1910706dad1910806dad1910906dad1910a06dad1910607dacf7e0707dacf7e0807dacf7e0907dacf7e0a07d9cf7e0608ded16f0708ded16f0808ddd1700409dfd15a0609e0d05a0709e0d05a0809e0d15a0909dfd15a050adecc47060adecc47070adecc47080addcc48060be1cd2c080be1cd2c'),
                bytes(hex'0605dac6780705dac6780805dac6780905dac6780606dac6780706dac6780806dac6780906dac6780a06dac6780607dac6780707dac6780807dac6780907dac6780a07dac6780608dac6780708dac6780808dac6780409d8c6790609dac6780709dac6780809dac6780909dac678050ad8c679060adac678070adac678080adac678060bdac678080bdac678')
        ];

	string[] internal body_traits = [
        'aqua',
        'blue gradient',
        'blue',
        'gray',
        'grayspace gradient',
        'green gradient',
        'green',
        'light green',
        'orange gradient',
        'pink gradient',
        'pink',
        'rainbow',
        'red',
        'teal',
        'yellow gradient',
        'yellow'
    ];

        uint[] internal  body_probability = [8, 11, 18, 27, 30, 33, 43, 53, 56, 59, 65, 67, 77, 87, 90, 100];

//// Chest of Dinos
        bytes[] internal chest_data = [
                bytes(hex'070834b9d2080834b9d2080934b9d2070a34b9d2080a34b9d2'),
                bytes(hex'07087a7acf08087a7acf08097a7acf070a7a7acf080a7a7acf'),
                bytes(hex'070878787808087878780809787878070a787878080a787878'),
                bytes(hex'07087abd7608087abd7608097abd76070a7abd76080a7abd76'),
                bytes(hex'0708dcdcdc0808dcdcdc0809dcdcdc070adcdcdc080adcdcdc'),
                bytes(hex'0708c98f590808c98f590809c98f59070ac98f59080ac98f59'),
                bytes(hex'0708d677550808d677550809d67755070ad67755080ad67755'),
                bytes(hex'0708c05e6a0808c05e6a0809c05e6a070ac05e6a080ac05e6a'),
                bytes(hex'0708d9d5740808d9d5740809d9d574070ad9d574080ad9d574')
        ];

	string[] internal chest_traits = [
        'aqua',       
        'blue',
        'gray',       
        'green',
        'light gray',
        'orange',     
        'orangered',
        'pink',       
        'yellow'
	];

        uint[] internal  chest_probability = [10, 18, 29, 42, 57, 68, 77, 89, 100];

//// Eyes of Dinos
        bytes[] internal eye_data = [
                bytes(hex'0706474dc40906c6a42c'),
                bytes(hex'07065e89c409065e89c4'),
                bytes(hex'07062828280906282828'),
                bytes(hex'07067a140109067a1401'),
                bytes(hex'070648c4470906d84236'),
                bytes(hex'07065fc57009065fc570'),
                bytes(hex'0706e024010806e024010906e024010a06e024010b06e024010c06e024010d06e024010e06e024010f06e02401'),
                bytes(hex'07069292910906929291'),
                bytes(hex'0706d480490906d48049'),
                bytes(hex'0706bd54410906bd5441'),
                bytes(hex'0706f4f4f40906f4f4f4'),
                bytes(hex'0706dec1300906dec130')
        ];

	string[] internal eye_traits = [
        'blue yellow', 
        'blue',
        'dark gray',   
        'dark red',
        'green red',   
        'green',
        'lazer',       
        'light gray',
        'orange',      
        'red',
        'white',       
        'yellow'
	];

        uint[] internal  eye_probability = [4, 19, 30, 36, 40, 48, 50, 58, 64, 70, 90, 100];


//// Face of Dinos
        bytes[] internal face_data = [
                bytes(hex''),
                bytes(hex'06053a3a3a07053a3a3a08053a3a3a09053a3a3a06063a3a3a08063a3a3a0a063a3a3a'),
                bytes(hex'06064a4a4a08064a4a4a0a064a4a4a'),
                bytes(hex'06051049e107051049e108051049e109051049e10a051049e104061049e105061049e106061049e108061049e10a061049e104071049e106071049e107071049e108071049e109071049e10a071049e1'),
                bytes(hex'0704b7b7b70804b7b7b70605b7b7b70705b7b7b70805b7b7b70905b7b7b70606b7b7b70806b7b7b70a06b7b7b70707b6b7b70907b6b7b70b07b6b7b7'),
                bytes(hex'0706ffffff0806ffffff0906ffffff')
        ];

	string[] internal face_traits = [
        'normal',
        'mask',
        'ninja',
        'based noun glasses',
        'skull',
        'vizor'
	];

        uint[] internal  face_probability = [65, 75, 85, 90, 95, 100];

//// Feet of Dinos
        bytes[] internal feet_data = [
                bytes(hex''),
                bytes(hex'0009dddddd000adddddd010adddddd000bdddddd020bdddddd000cdddddd010cdddddd020cdddddd030cdddddd010ddddddd030ddddddd050dc566bf060dc566bf070dc566bf080dc566c0'),
                bytes(hex'0108dededd0109dededd0209dedede020adededd030adedede010bdededd030bdededd040bdedede020cdededd040cdededd050cdedede060c181817070cdedede080c181817'),
                bytes(hex'040b7b4c390a0b7b4c39050c7a4b38060c7a4a38070c7a4a38080c7a4b38090c7a4b38060db9b0ac080db9b0ac')
        ];

	string[] internal feet_traits = [
        'normal', 
        'hoverboard', 
        'rocket boots', 
        'skateboard'
	];

        uint[] internal  feet_probability = [76, 84, 92, 100];

//// Heads of Dinos
        bytes[] internal head_data = [
                bytes(hex''),
                bytes(hex'06059957c907059957c908059957c909059957ca05069957ca04079957ca'),
                bytes(hex'0703318ec60803328ec50903318ec60504318ec60604318ec60704328ec50804328ec50904328ec5'),
                bytes(hex'06039356cb07039356cb08039356cb06049356cb07049557ca08049557ca09049557ca0a049457ca'),
                bytes(hex'0602eaeaea0702eaeaea0802e9e9e90603eaeaea0703eaeaea0803e9e9e90604eaeaea0704eaeaea0804e9e9e9'),
                bytes(hex'0503f0a92a0703f1a9290903f0a92a0504f1a9290604f0a82b0704f0a82a0804f1a92a0904f0a92a'),
                bytes(hex'05043d3d3d06043d3d3d07043d3d3d08043d3d3d05053d3d3d05063d3d3d06063d3d3d05073d3d3d06073d3d3d'),
                bytes(hex'0603bf5dca0703bf5dca0803be5dca0504bf5dca0604bf5dca0704bf5dca0804bf5dca0904bf5dca0a04be5dca'),
                bytes(hex'05049f9f9f06049f9f9f08049f9f9f09049f9f9f05059f9f9f'),
                bytes(hex'0703e6b32e0803e6b22d0604e6b32e0704e6b32e0804e6b32e0904e6b22d'),
                bytes(hex'0703dbdbdb0803dbdbdb0903dadadb0504c245360604c245360704c245360804c245360904c24536')
        ];

	string[] internal head_traits = [
        'none',
        'bandana',
        'cap backwards',
        'cap forwards',
        'chef',
        'crown',
        'headphones',
        'long peak cap forwards',
        'mouse ears',
        'silly yellow bucket hat',
        'two tone cap backwards'
	];

        uint[] internal  head_probability = [45, 48, 57, 67, 71, 74, 78, 86, 88, 92, 100];

/////////////////// Spikes of Dinos
        bytes[] internal spike_data = [
                bytes(hex''),
                bytes(hex'06044169a908044169a905054169a905074169a905094169a9'),
                bytes(hex'0604c16e480804c16e480505c16e480507c16e480509c16e48'),
                bytes(hex'06044140400804414040050541404005074140400509414040'),
                bytes(hex'06046bb37308046bb37305056bb37305076bb37305096bb373'),
                bytes(hex'0604b3b3b30804b3b3b30505b3b3b30507b3b3b30509b3b3b3'),
                bytes(hex'0604a3d8760804a67ad20505d4995e050776a7d80509dc5964'),
                bytes(hex'0604d68f380804d68f380505d68f380507d68f380509d68f38'),
                bytes(hex'0604c466c40804c466c40505c466c40507c466c40509c466c4'),
                bytes(hex'0604c568660804c568660505c568660507c568660509c56866'),
                bytes(hex'06045eaeb108045eaeb105055eaeb105075eaeb105095eaeb1'),
                bytes(hex'0604eeeeee0804eeeeee0505eeeeee0507eeeeee0509eeeeee'),
                bytes(hex'0604ccae520804ccae520505ccae520507ccae520509ccae52')
        ];

	string[] internal spike_traits = [
        'none',     
        'blue',       
        'burnt orange',
        'dark gray',  
        'green',
        'light gray', 
        'multicolor',
        'orange',
        'pink',       
        'red',
        'teal',       
        'white',
        'yellow'
	];

        uint[] internal  spike_probability = [4, 12, 20, 30, 38, 49, 52, 60, 68, 76, 84, 92, 100];

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


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

pragma solidity ^0.8.20;

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

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

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

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


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

pragma solidity ^0.8.20;


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

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

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

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

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

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

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

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

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

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

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

// File: erc721a/contracts/IERC721A.sol


// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of ERC721A.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the
     * ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    // =============================================================
    //                            STRUCTS
    // =============================================================

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
        uint24 extraData;
    }

    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() external view returns (uint256);

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    // =============================================================
    //                            IERC721
    // =============================================================

    /**
     * @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`,
     * 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 be 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,
        bytes calldata data
    ) external payable;

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom}
     * whenever possible.
     *
     * 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 payable;

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

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

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

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

    // =============================================================
    //                           IERC2309
    // =============================================================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId`
     * (inclusive) is transferred from `from` to `to`, as defined in the
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
     *
     * See {_mintERC2309} for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

// File: erc721a/contracts/ERC721A.sol


// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;


/**
 * @dev Interface of ERC721 token receiver.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364).
    struct TokenApprovalRef {
        address value;
    }

    // =============================================================
    //                           CONSTANTS
    // =============================================================

    // Mask of an entry in packed address data.
    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant _BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant _BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant _BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant _BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant _BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The bit position of `extraData` in packed ownership.
    uint256 private constant _BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with {_mintERC2309}.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    // The `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    // =============================================================
    //                            STORAGE
    // =============================================================

    // The next token ID to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See {_packedOwnershipOf} implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

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

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

    // =============================================================
    //                          CONSTRUCTOR
    // =============================================================

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    // =============================================================
    //                   TOKEN COUNTING OPERATIONS
    // =============================================================

    /**
     * @dev Returns the starting token ID.
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view virtual returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * @dev Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view virtual returns (uint256) {
        // Counter underflow is impossible as `_currentIndex` does not decrement,
        // and it is initialized to `_startTokenId()`.
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view virtual returns (uint256) {
        return _burnCounter;
    }

    // =============================================================
    //                    ADDRESS DATA OPERATIONS
    // =============================================================

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
    }

    /**
     * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes
        // of the XOR of all function selectors in the interface.
        // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
        // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

    /**
     * @dev Returns the token collection name.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
    }

    /**
     * @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, it can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    // =============================================================
    //                     OWNERSHIPS OPERATIONS
    // =============================================================

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @dev Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around over time.
     */
    function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal virtual {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & _BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an initialized ownership slot
                        // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                        // before an unintialized ownership slot
                        // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                        // Hence, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    // =============================================================
    //                      APPROVAL OPERATIONS
    // =============================================================

    /**
     * @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) public payable virtual override {
        address owner = ownerOf(tokenId);

        if (_msgSenderERC721A() != owner)
            if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                revert ApprovalCallerNotOwnerNorApproved();
            }

        _tokenApprovals[tokenId].value = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @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) public virtual override {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

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

    /**
     * @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. See {_mint}.
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
     */
    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            // `msgSender == owner || msgSender == approvedAddress`.
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    // =============================================================
    //                      TRANSFER OPERATIONS
    // =============================================================

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) public payable virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @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 memory _data
    ) public payable virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token IDs
     * are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * `startTokenId` - the first token ID to be transferred.
     * `quantity` - the amount to be transferred.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token IDs
     * have been transferred. This includes minting.
     * And also called after one token has been burned.
     *
     * `startTokenId` - the first token ID to be transferred.
     * `quantity` - the amount to be transferred.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * `from` - Previous owner of the given token ID.
     * `to` - Target address that will receive the token.
     * `tokenId` - Token ID to be transferred.
     * `_data` - Optional data to send along with the call.
     *
     * Returns whether the call correctly returned the expected magic value.
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    // =============================================================
    //                        MINT OPERATIONS
    // =============================================================

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            // The duplicated `log4` removes an extra check and reduces stack juggling.
            // The assembly, together with the surrounding Solidity code, have been
            // delicately arranged to nudge the compiler into producing optimized opcodes.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

                // The `iszero(eq(,))` check ensures that large values of `quantity`
                // that overflows uint256 will make the loop run out of gas.
                // The compiler will optimize the `iszero` away for performance.
                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

            _currentIndex = end;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

            _currentIndex = startTokenId + quantity;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        _mint(to, quantity);

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal virtual {
        _safeMint(to, quantity, '');
    }

    // =============================================================
    //                        BURN OPERATIONS
    // =============================================================

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        address from = address(uint160(prevOwnershipPacked));

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    // =============================================================
    //                     EXTRA DATA OPERATIONS
    // =============================================================

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }

    // =============================================================
    //                       OTHER OPERATIONS
    // =============================================================

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a uint256 to its ASCII string decimal representation.
     */
    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), but
            // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
            // We will need 1 word for the trailing zeros padding, 1 word for the length,
            // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
            let m := add(mload(0x40), 0xa0)
            // Update the free memory pointer to allocate.
            mstore(0x40, m)
            // Assign the `str` to the end.
            str := sub(m, 0x20)
            // Zeroize the slot after the string.
            mstore(str, 0)

            // Cache the end of the memory to calculate the length later.
            let end := str

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

            let length := sub(end, str)
            // Move the pointer 32 bytes leftwards to make room for the length.
            str := sub(str, 0x20)
            // Store the length.
            mstore(str, length)
        }
    }
}

// File: contracts/OnChainDinos.sol

//SPDX-License-Identifier: MIT  
pragma solidity ^0.8.20;







///// Based OnChain Dinos
///// Developed by Apex777.eth - @Apex_Ether
contract OnChainDinos is ERC721A, Ownable, DinoData, ReentrancyGuard  {  

    address public deployer;
    bytes32 private lastBlockHash;
    uint256 private lastBlockNumber;

    /// Mint Settings
    uint     public maxSupply    = 2000;
    uint     public mintPrice    = 0.5 ether;
    uint     public maxFree      = 500;
    uint     public freeCount    = 0;
    bool     public mintEnabled  = false;

    /// Mint Rules
    uint     public maxMintPerTrans = 20;
    uint     public maxMintPerWallet = 100;

    /// Whitelist Settings
    mapping(address => uint) public mintAmount;
    mapping(address => bool) public whiteListed;

    /// Whitelist setup
    address public listController;

    modifier onlylistController() {
        require(msg.sender == listController, "Controller Only");
        _;
    }


    constructor() ERC721A("Based OnChain Dinos", "DINO") Ownable(msg.sender){
        deployer = msg.sender;
        listController = 0x85FD82fec33A00953227Ea82649a6Cb5572BE6A0;
        lastBlockHash = blockhash(block.number - 1);
        lastBlockNumber = block.number;
        _reserveDino(); /// Apex gets to pick their Dino!! 
    }

    function _startTokenId() internal pure override returns (uint256) {
        return 1;
    }

    function mint(uint256 quantity) external payable {
        uint256 cost = mintPrice;
        require(mintEnabled, "Mint not ready yet");
        require(msg.value == quantity * cost, "Please send the exact ETH amount");
        require(quantity <= maxMintPerTrans, "Exceeds max mint per transaction");

        // Check if the mint quantity exceeds the per wallet limit
        uint256 totalMintedByWallet = mintAmount[msg.sender] + quantity;
        require(totalMintedByWallet <= maxMintPerWallet, "Exceeds max mint per wallet");
        mintAmount[msg.sender] = mintAmount[msg.sender] + totalMintedByWallet;

        // Start minting
        _internalMint(quantity);
    }

    function free_mint() external {
        require(whiteListed[msg.sender] == true, "Not on whitelist");
        require(mintEnabled, "Mint not ready yet");
        require(freeCount + 1 <= maxFree, "No more free Dinos!");

        whiteListed[msg.sender] = false;
        freeCount = freeCount + 1;

        // Start minting
        _internalMint(1);

    }

    function _internalMint(uint256 quantity) internal  {

        require(_totalMinted() + quantity <= maxSupply, "Sold Out!");
        require(msg.sender == tx.origin, "The minter is another contract");

        // What token do we start minting with?
        uint startTokenID = _startTokenId() + _totalMinted();
        uint mintUntilTokenID =  quantity + startTokenID;

        for(uint256 tokenId = startTokenID; tokenId < mintUntilTokenID; tokenId++) {

            /// got get our random traits
            uint[7] memory randomSeeds = _randomSeed(lastBlockHash,tokenId);

            /// set this new dinos traits!
            _setDinoTraits(tokenId, randomSeeds);

            _setDinoEggs(tokenId);

        }
        lastBlockHash = blockhash(block.number - 1);
        lastBlockNumber = block.number;
        _safeMint(msg.sender, quantity);

    }

    function _randomSeed(bytes32 _lastBlockHash, uint256 _tokenId) internal pure returns (uint[7] memory _randomSeeds) {
        // Initial seed
        _randomSeeds[0] = uint256(keccak256(abi.encodePacked(_lastBlockHash, _tokenId))) % 101;

        // Generate subsequent seeds
        for (uint i = 1; i < 7; i++) {
            _randomSeeds[i] = uint256(keccak256(abi.encodePacked(_randomSeeds[i - 1], _tokenId))) % 101;
        }

        return _randomSeeds;
    }

    function _setDinoTraits(uint _tokenID, uint[7] memory _randomSeeds) internal {
        // Randomly select traits
        uint randBody   = _pickTraitByProbability(_randomSeeds[0], body_data, body_probability);
        uint randChest  = _pickTraitByProbability(_randomSeeds[1], chest_data, chest_probability);
        uint randEyes   = _pickTraitByProbability(_randomSeeds[2], eye_data, eye_probability);
        uint randHead   = _pickTraitByProbability(_randomSeeds[3], head_data, head_probability);
        uint randFeet   = _pickTraitByProbability(_randomSeeds[4], feet_data, feet_probability);
        uint randSpikes = _pickTraitByProbability(_randomSeeds[5], spike_data, spike_probability);
        uint randFace   = _pickTraitByProbability(_randomSeeds[6], face_data, face_probability);


        TraitStruct memory newTraits = TraitStruct({
            body: randBody,
            chest: randChest,
            eye: randEyes,
            face: randFace,
            feet: randFeet,
            head: randHead,
            spike: randSpikes
        });

        // Assign the generated traits to the token
        tokenTraits[_tokenID] = newTraits;

    }

    function _pickTraitByProbability(uint seed, bytes[] memory traitArray, uint[] memory traitProbability) internal pure returns (uint) {
        require(traitArray.length > 0, "Elements array is empty");
        require(traitArray.length == traitProbability.length, "Elements and weights length mismatch");
        
        for (uint i = 0; i < traitProbability.length; i++) {
            if(seed < traitProbability[i]) {
                return i;
            }
        }
        // Fallback, return first element as a safe default
        return 0;
    }

    function _setDinoEggs(uint _tokenID) internal {
        uint eggsCount = uint256(keccak256(abi.encodePacked(lastBlockNumber, _tokenID))) % 999 + 1;
        DinoEggs[_tokenID] = eggsCount;
    }

    function _reserveDino() internal {
        uint startTokenID = _startTokenId() + _totalMinted();
        TraitStruct memory newTraits = TraitStruct({
            body: 11,
            chest: 4,
            eye: 10,
            face: 2,
            feet: 0,
            head: 0,
            spike: 6
        });
        tokenTraits[startTokenID] = newTraits;
        _setDinoEggs(startTokenID);
        freeCount = freeCount +1;
        _safeMint(0x777c47498b42dbe449fB4cB810871A46cD777777, 1);
    }


    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        // Get image
        string memory image = buildSVG(tokenId);

        // Encode SVG data to base64
        string memory base64Image = Base64.encode(bytes(image));

        // Build JSON metadata
        string memory json = string(
            abi.encodePacked(
                '{"name": "OnChain Dinos #', Strings.toString(tokenId), '",',
                '"description": "OnChain Dinos have hatched on Base - 100% stored on the Blockchain",',
                '"attributes": [', _getDinoTraits(tokenId), '],',
                '"image": "data:image/svg+xml;base64,', base64Image, '"}'
            )
        );

        // Encode JSON data to base64
        string memory base64Json = Base64.encode(bytes(json));

        // Construct final URI
        return string(abi.encodePacked('data:application/json;base64,', base64Json));
    }

    function buildSVG(uint tokenid) public view returns (string memory) {

        require(_exists(tokenid), "Token does not exist");

        TraitStruct memory localTraits = tokenTraits[tokenid];

        string memory svg = string(abi.encodePacked(
        '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" shape-rendering="crispEdges" width="512" height="512">',
        '<rect width="16" height="16" fill="#99ccff"/>',
            _getSVGTraitData(body_data[localTraits.body]),
            _getSVGTraitData(chest_data[localTraits.chest]),
            _getSVGTraitData(eye_data[localTraits.eye]),
            _getSVGTraitData(spike_data[localTraits.spike]),
            _getSVGTraitData(feet_data[localTraits.feet]),
            _getSVGTraitData(face_data[localTraits.face]),
            _getSVGTraitData(head_data[localTraits.head]),
        '</svg>'
        ));
        return svg;

    }

    function _getSVGTraitData(bytes memory data) internal pure returns (string memory) {

        require(data.length % 5 == 0, "Invalid number of reacts");

        /// if empty this is a transparent react
        if (data.length == 0) {
             return "<rect x=\"0\" y=\"0\" width=\"0\" height=\"0\" fill=\"rgb(0,0,0)\"/>"; 
        }

        // Initialize arrays to store values
        uint reactCount = data.length / 5;


        /// react string to return
        string memory rects;

        uint[] memory x = new uint[](reactCount);
        uint[] memory y = new uint[](reactCount);
        uint[] memory r = new uint[](reactCount);
        uint[] memory g = new uint[](reactCount);
        uint[] memory b = new uint[](reactCount);

        // Iterate through each react and get the values we need
        for (uint i = 0; i < reactCount; i++) {

            // Convert and assign values to respective arrays
            x[i] = uint8(data[i * 5]);
            y[i] = uint8(data[i * 5 + 1]);
            r[i] = uint8(data[i * 5 + 2]);
            g[i] = uint8(data[i * 5 + 3]);
            b[i] = uint8(data[i * 5 + 4]);

            // Convert uint values to strings
            string memory xStr = Strings.toString(x[i]);
            string memory yStr = Strings.toString(y[i]);
            string memory rStr = Strings.toString(r[i]);
            string memory gStr = Strings.toString(g[i]);
            string memory bStr = Strings.toString(b[i]);

            rects = string(abi.encodePacked(rects, '<rect x="', xStr, '" y="', yStr, '" width="1" height="1" fill="rgb(', rStr, ',', gStr, ',', bStr, ')" />'));
        }

        return rects;
    }

    function _getDinoTraits(uint tokenid) internal view returns (string memory) {

        TraitStruct memory traits = tokenTraits[tokenid];

        string memory DinoEggs = Strings.toString(DinoEggs[tokenid]);

        string memory metadata = string(abi.encodePacked(
        '{"trait_type":"Dino Eggs","display_type": "number", "value":"', DinoEggs, '"},',
        '{"trait_type":"Body", "value":"', body_traits[traits.body], '"},',
        '{"trait_type":"Chest", "value":"', chest_traits[traits.chest], '"},',
        '{"trait_type":"Eyes", "value":"', eye_traits[traits.eye], '"},',
        '{"trait_type":"Face", "value":"', face_traits[traits.face], '"},',
        '{"trait_type":"Feet", "value":"', feet_traits[traits.feet], '"},',
        '{"trait_type":"Head", "value":"', head_traits[traits.head], '"},',
        '{"trait_type":"Spikes", "value":"', spike_traits[traits.spike], '"}'
        ));

        return metadata;

    }


//// Admin methods
    function toggleMinting() external onlyOwner {
        mintEnabled = !mintEnabled;
    }

    function setMaxFree(uint _newMaxFree) external onlyOwner {
        maxFree = _newMaxFree;
    }

    function devMint(uint _quantity) external onlyOwner {
        _internalMint(_quantity);
    }

    function addToWhiteList(address[] calldata addresses) external onlylistController nonReentrant {
        for (uint i = 0; i < addresses.length; i++) {
            whiteListed[addresses[i]] = true;
        }
    }

    function changelistController(address _address) external onlyOwner {
        listController = _address;
    }

    function withdraw() external onlyOwner nonReentrant {
        (bool success, ) = msg.sender.call{value: address(this).balance}("");
        require(success, "Transfer failed.");
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"DinoEggs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addToWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenid","type":"uint256"}],"name":"buildSVG","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"changelistController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deployer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"free_mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"listController","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerTrans","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerWallet","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":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxFree","type":"uint256"}],"name":"setMaxFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenTraits","outputs":[{"internalType":"uint256","name":"body","type":"uint256"},{"internalType":"uint256","name":"chest","type":"uint256"},{"internalType":"uint256","name":"eye","type":"uint256"},{"internalType":"uint256","name":"face","type":"uint256"},{"internalType":"uint256","name":"feet","type":"uint256"},{"internalType":"uint256","name":"head","type":"uint256"},{"internalType":"uint256","name":"spike","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whiteListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518061020001604052806040518060c00160405280608c815260200162009846608c913981526020016040518060c00160405280608c815260200162009b5c608c913981526020016040518060c00160405280608c815260200162009e0e608c913981526020016040518060c00160405280608c815260200162009eef608c913981526020016040518060c00160405280608c81526020016200a0b6608c913981526020016040518060c00160405280608c815260200162009a1c608c913981526020016040518060c00160405280608c815260200162009c42608c913981526020016040518060c00160405280608c815260200162009f7b608c913981526020016040518060c00160405280608c81526020016200a33b608c913981526020016040518060c00160405280608c815260200162009d82608c913981526020016040518060c00160405280608c81526020016200a2af608c913981526020016040518060c00160405280608c81526020016200990e608c913981526020016040518060c00160405280608c81526020016200a007608c913981526020016040518060c00160405280608c81526020016200a142608c913981526020016040518060c00160405280608c815260200162009cce608c913981526020016040518060c00160405280608c815260200162009aa8608c9139815250600b9060106200021092919062002b2a565b506040518061020001604052806040518060400160405280600481526020017f617175610000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f626c7565206772616469656e740000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f626c75650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f677261790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280601281526020017f677261797370616365206772616469656e74000000000000000000000000000081525081526020016040518060400160405280600e81526020017f677265656e206772616469656e7400000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f677265656e00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f6c6967687420677265656e00000000000000000000000000000000000000000081525081526020016040518060400160405280600f81526020017f6f72616e6765206772616469656e74000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f70696e6b206772616469656e740000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f70696e6b0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f7261696e626f770000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f726564000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f7465616c0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600f81526020017f79656c6c6f77206772616469656e74000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f79656c6c6f770000000000000000000000000000000000000000000000000000815250815250600c906010620005dd92919062002b88565b50604051806102000160405280600860ff168152602001600b60ff168152602001601260ff168152602001601b60ff168152602001601e60ff168152602001602160ff168152602001602b60ff168152602001603560ff168152602001603860ff168152602001603b60ff168152602001604160ff168152602001604360ff168152602001604d60ff168152602001605760ff168152602001605a60ff168152602001606460ff16815250600d9060106200069a92919062002be6565b506040518061012001604052806040518060400160405280601981526020017f070834b9d2080834b9d2080934b9d2070a34b9d2080a34b9d20000000000000081525081526020016040518060400160405280601981526020017f07087a7acf08087a7acf08097a7acf070a7a7acf080a7a7acf0000000000000081525081526020016040518060400160405280601981526020017f070878787808087878780809787878070a787878080a7878780000000000000081525081526020016040518060400160405280601981526020017f07087abd7608087abd7608097abd76070a7abd76080a7abd760000000000000081525081526020016040518060400160405280601981526020017f0708dcdcdc0808dcdcdc0809dcdcdc070adcdcdc080adcdcdc0000000000000081525081526020016040518060400160405280601981526020017f0708c98f590808c98f590809c98f59070ac98f59080ac98f590000000000000081525081526020016040518060400160405280601981526020017f0708d677550808d677550809d67755070ad67755080ad677550000000000000081525081526020016040518060400160405280601981526020017f0708c05e6a0808c05e6a0809c05e6a070ac05e6a080ac05e6a0000000000000081525081526020016040518060400160405280601981526020017f0708d9d5740808d9d5740809d9d574070ad9d574080ad9d57400000000000000815250815250600e906009620008ca92919062002c3b565b506040518061012001604052806040518060400160405280600481526020017f617175610000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f626c75650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f677261790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f677265656e00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f6c6967687420677261790000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f6f72616e6765000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f6f72616e6765726564000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f70696e6b0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f79656c6c6f770000000000000000000000000000000000000000000000000000815250815250600f90600962000afa92919062002c99565b50604051806101200160405280600a60ff168152602001601260ff168152602001601d60ff168152602001602a60ff168152602001603960ff168152602001604460ff168152602001604d60ff168152602001605960ff168152602001606460ff16815250601090600962000b7192919062002cf7565b506040518061018001604052806040518060400160405280600a81526020017f0706474dc40906c6a42c0000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f07065e89c409065e89c40000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f070628282809062828280000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f07067a140109067a14010000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f070648c4470906d842360000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f07065fc57009065fc5700000000000000000000000000000000000000000000081525081526020016040518060600160405280602d815260200162009c15602d913981526020016040518060400160405280600a81526020017f070692929109069292910000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f0706d480490906d480490000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f0706bd54410906bd54410000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f0706f4f4f40906f4f4f40000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f0706dec1300906dec13000000000000000000000000000000000000000000000815250815250601190600c62000e3692919062002d4c565b506040518061018001604052806040518060400160405280600b81526020017f626c75652079656c6c6f7700000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f626c75650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f6461726b2067726179000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f6461726b2072656400000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f677265656e20726564000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f677265656e00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f6c617a657200000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f6c6967687420677261790000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f6f72616e6765000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f726564000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f776869746500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f79656c6c6f770000000000000000000000000000000000000000000000000000815250815250601290600c6200111792919062002daa565b50604051806101800160405280600460ff168152602001601360ff168152602001601e60ff168152602001602460ff168152602001602860ff168152602001603060ff168152602001603260ff168152602001603a60ff168152602001604060ff168152602001604660ff168152602001605a60ff168152602001606460ff16815250601390600c620011ac92919062002e08565b506040518060c0016040528060405180602001604052805f81525081526020016040518060600160405280602381526020016200a0936023913981526020016040518060400160405280600f81526020017f06064a4a4a08064a4a4a0a064a4a4a000000000000000000000000000000000081525081526020016040518060800160405280605081526020016200a1ce6050913981526020016040518060600160405280603c8152602001620098d2603c913981526020016040518060400160405280600f81526020017f0706ffffff0806ffffff0906ffffff00000000000000000000000000000000008152508152506014906006620012af92919062002e5d565b506040518060c001604052806040518060400160405280600681526020017f6e6f726d616c000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f6d61736b0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f6e696e6a6100000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280601281526020017f6261736564206e6f756e20676c6173736573000000000000000000000000000081525081526020016040518060400160405280600581526020017f736b756c6c00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f76697a6f7200000000000000000000000000000000000000000000000000000081525081525060159060066200142d92919062002ebb565b506040518060c00160405280604160ff168152602001604b60ff168152602001605560ff168152602001605a60ff168152602001605f60ff168152602001606460ff1681525060169060066200148592919062002f19565b50604051806080016040528060405180602001604052805f81525081526020016040518060800160405280604b81526020016200a264604b913981526020016040518060800160405280604681526020016200a21e6046913981526020016040518060600160405280602d815260200162009be8602d913981525060179060046200151292919062002f6e565b5060405180608001604052806040518060400160405280600681526020017f6e6f726d616c000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f686f766572626f6172640000000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f726f636b657420626f6f7473000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f736b617465626f6172640000000000000000000000000000000000000000000081525081525060189060046200161a92919062002fcc565b506040518060800160405280604c60ff168152602001605460ff168152602001605c60ff168152602001606460ff1681525060199060046200165e9291906200302a565b5060405180610160016040528060405180602001604052805f81525081526020016040518060400160405280601e81526020017f06059957c907059957c908059957c909059957ca05069957ca04079957ca0000815250815260200160405180606001604052806028815260200162009d5a60289139815260200160405180606001604052806028815260200162009b346028913981526020016040518060600160405280602d8152602001620099ef602d9139815260200160405180606001604052806028815260200162009e9a6028913981526020016040518060600160405280602d815260200162009ec2602d913981526020016040518060600160405280602d81526020016200999a602d913981526020016040518060400160405280601981526020017f05049f9f9f06049f9f9f08049f9f9f09049f9f9f05059f9f9f0000000000000081525081526020016040518060400160405280601e81526020017f0703e6b32e0803e6b22d0604e6b32e0704e6b32e0804e6b32e0904e6b22d00008152508152602001604051806060016040528060288152602001620099c760289139815250601a90600b620018199291906200307f565b506040518061016001604052806040518060400160405280600481526020017f6e6f6e650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f62616e64616e610000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f636170206261636b77617264730000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f63617020666f727761726473000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f636865660000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f63726f776e00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f6865616470686f6e65730000000000000000000000000000000000000000000081525081526020016040518060400160405280601681526020017f6c6f6e67207065616b2063617020666f7277617264730000000000000000000081525081526020016040518060400160405280600a81526020017f6d6f75736520656172730000000000000000000000000000000000000000000081525081526020016040518060400160405280601781526020017f73696c6c792079656c6c6f77206275636b65742068617400000000000000000081525081526020016040518060400160405280601681526020017f74776f20746f6e6520636170206261636b776172647300000000000000000000815250815250601b90600b62001abf929190620030dd565b50604051806101600160405280602d60ff168152602001603060ff168152602001603960ff168152602001604360ff168152602001604760ff168152602001604a60ff168152602001604e60ff168152602001605660ff168152602001605860ff168152602001605c60ff168152602001606460ff16815250601c90600b62001b4a9291906200313b565b50604051806101a0016040528060405180602001604052805f81525081526020016040518060400160405280601981526020017f06044169a908044169a905054169a905074169a905094169a90000000000000081525081526020016040518060400160405280601981526020017f0604c16e480804c16e480505c16e480507c16e480509c16e480000000000000081525081526020016040518060400160405280601981526020017f060441404008044140400505414040050741404005094140400000000000000081525081526020016040518060400160405280601981526020017f06046bb37308046bb37305056bb37305076bb37305096bb3730000000000000081525081526020016040518060400160405280601981526020017f0604b3b3b30804b3b3b30505b3b3b30507b3b3b30509b3b3b30000000000000081525081526020016040518060400160405280601981526020017f0604a3d8760804a67ad20505d4995e050776a7d80509dc59640000000000000081525081526020016040518060400160405280601981526020017f0604d68f380804d68f380505d68f380507d68f380509d68f380000000000000081525081526020016040518060400160405280601981526020017f0604c466c40804c466c40505c466c40507c466c40509c466c40000000000000081525081526020016040518060400160405280601981526020017f0604c568660804c568660505c568660507c568660509c568660000000000000081525081526020016040518060400160405280601981526020017f06045eaeb108045eaeb105055eaeb105075eaeb105095eaeb10000000000000081525081526020016040518060400160405280601981526020017f0604eeeeee0804eeeeee0505eeeeee0507eeeeee0509eeeeee0000000000000081525081526020016040518060400160405280601981526020017f0604ccae520804ccae520505ccae520507ccae520509ccae5200000000000000815250815250601d90600d62001e3f92919062003190565b50604051806101a001604052806040518060400160405280600481526020017f6e6f6e650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f626c75650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f6275726e74206f72616e6765000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f6461726b2067726179000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f677265656e00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f6c6967687420677261790000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f6d756c7469636f6c6f720000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f6f72616e6765000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f70696e6b0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f726564000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f7465616c0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f776869746500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f79656c6c6f770000000000000000000000000000000000000000000000000000815250815250601e90600d6200215b929190620031ee565b50604051806101a00160405280600460ff168152602001600c60ff168152602001601460ff168152602001601e60ff168152602001602660ff168152602001603160ff168152602001603460ff168152602001603c60ff168152602001604460ff168152602001604c60ff168152602001605460ff168152602001605c60ff168152602001606460ff16815250601f90600d620021fa9291906200324c565b506107d06024556706f05b59d3b200006025556101f46026555f6027555f60285f6101000a81548160ff02191690831515021790555060146029556064602a5534801562002246575f80fd5b50336040518060400160405280601381526020017f4261736564204f6e436861696e2044696e6f73000000000000000000000000008152506040518060400160405280600481526020017f44494e4f000000000000000000000000000000000000000000000000000000008152508160029081620022c59190620035f6565b508060039081620022d79190620035f6565b50620022e86200244360201b60201c565b5f8190555050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362002362575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016200235991906200371d565b60405180910390fd5b62002373816200244b60201b60201c565b5060016020819055503360215f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507385fd82fec33a00953227ea82649a6cb5572be6a0602d5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001436200241f919062003765565b40602281905550436023819055506200243d6200250e60201b60201c565b62003b5b565b5f6001905090565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f6200251f6200262460201b60201c565b6200252f6200244360201b60201c565b6200253b91906200379f565b90505f6040518060e00160405280600b815260200160048152602001600a8152602001600281526020015f81526020015f8152602001600681525090508060095f8481526020019081526020015f205f820151815f01556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060155905050620025e2826200263d60201b60201c565b6001602754620025f391906200379f565b6027819055506200262073777c47498b42dbe449fb4cb810871a46cd7777776001620026a660201b60201c565b5050565b5f620026356200244360201b60201c565b5f5403905090565b5f60016103e7602354846040516020016200265a929190620037fd565b604051602081830303815290604052805190602001205f1c6200267e919062003859565b6200268a91906200379f565b905080600a5f8481526020019081526020015f20819055505050565b620026c7828260405180602001604052805f815250620026cb60201b60201c565b5050565b620026dd83836200277660201b60201c565b5f8373ffffffffffffffffffffffffffffffffffffffff163b1462002771575f805490505f83820390505b620027225f8683806001019450866200294b60201b60201c565b62002759576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106200270857815f54146200276e575f80fd5b50505b505050565b5f805490505f8203620027b5576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620027c95f84838562002aa760201b60201c565b600160406001901b17820260055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055506200285383620028355f865f62002aad60201b60201c565b620028468562002adc60201b60201c565b1762002aeb60201b60201c565b60045f8381526020019081526020015f20819055505f80838301905073ffffffffffffffffffffffffffffffffffffffff8516915082825f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600183015b818114620028ef5780835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600181019050620028b4565b505f82036200292a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819055505050620029465f84838562002b1560201b60201c565b505050565b5f8373ffffffffffffffffffffffffffffffffffffffff1663150b7a026200297862002b1b60201b60201c565b8786866040518563ffffffff1660e01b81526004016200299c949392919062003935565b6020604051808303815f875af1925050508015620029da57506040513d601f19601f82011682018060405250810190620029d79190620039e5565b60015b62002a54573d805f811462002a0b576040519150601f19603f3d011682016040523d82523d5f602084013e62002a10565b606091505b505f81510362002a4c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b5f8060e883901c905060e862002acb86868462002b2260201b60201c565b62ffffff16901b9150509392505050565b5f6001821460e11b9050919050565b5f73ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b5f33905090565b5f9392505050565b828054828255905f5260205f2090810192821562002b75579160200282015b8281111562002b7457825182908162002b63919062003a77565b509160200191906001019062002b49565b5b50905062002b849190620032a1565b5090565b828054828255905f5260205f2090810192821562002bd3579160200282015b8281111562002bd257825182908162002bc19190620035f6565b509160200191906001019062002ba7565b5b50905062002be29190620032c8565b5090565b828054828255905f5260205f2090810192821562002c28579160200282015b8281111562002c27578251829060ff1690559160200191906001019062002c05565b5b50905062002c379190620032ef565b5090565b828054828255905f5260205f2090810192821562002c86579160200282015b8281111562002c8557825182908162002c74919062003a77565b509160200191906001019062002c5a565b5b50905062002c959190620032a1565b5090565b828054828255905f5260205f2090810192821562002ce4579160200282015b8281111562002ce357825182908162002cd29190620035f6565b509160200191906001019062002cb8565b5b50905062002cf39190620032c8565b5090565b828054828255905f5260205f2090810192821562002d39579160200282015b8281111562002d38578251829060ff1690559160200191906001019062002d16565b5b50905062002d489190620032ef565b5090565b828054828255905f5260205f2090810192821562002d97579160200282015b8281111562002d9657825182908162002d85919062003a77565b509160200191906001019062002d6b565b5b50905062002da69190620032a1565b5090565b828054828255905f5260205f2090810192821562002df5579160200282015b8281111562002df457825182908162002de39190620035f6565b509160200191906001019062002dc9565b5b50905062002e049190620032c8565b5090565b828054828255905f5260205f2090810192821562002e4a579160200282015b8281111562002e49578251829060ff1690559160200191906001019062002e27565b5b50905062002e599190620032ef565b5090565b828054828255905f5260205f2090810192821562002ea8579160200282015b8281111562002ea757825182908162002e96919062003a77565b509160200191906001019062002e7c565b5b50905062002eb79190620032a1565b5090565b828054828255905f5260205f2090810192821562002f06579160200282015b8281111562002f0557825182908162002ef49190620035f6565b509160200191906001019062002eda565b5b50905062002f159190620032c8565b5090565b828054828255905f5260205f2090810192821562002f5b579160200282015b8281111562002f5a578251829060ff1690559160200191906001019062002f38565b5b50905062002f6a9190620032ef565b5090565b828054828255905f5260205f2090810192821562002fb9579160200282015b8281111562002fb857825182908162002fa7919062003a77565b509160200191906001019062002f8d565b5b50905062002fc89190620032a1565b5090565b828054828255905f5260205f2090810192821562003017579160200282015b8281111562003016578251829081620030059190620035f6565b509160200191906001019062002feb565b5b509050620030269190620032c8565b5090565b828054828255905f5260205f209081019282156200306c579160200282015b828111156200306b578251829060ff1690559160200191906001019062003049565b5b5090506200307b9190620032ef565b5090565b828054828255905f5260205f20908101928215620030ca579160200282015b82811115620030c9578251829081620030b8919062003a77565b50916020019190600101906200309e565b5b509050620030d99190620032a1565b5090565b828054828255905f5260205f2090810192821562003128579160200282015b8281111562003127578251829081620031169190620035f6565b5091602001919060010190620030fc565b5b509050620031379190620032c8565b5090565b828054828255905f5260205f209081019282156200317d579160200282015b828111156200317c578251829060ff169055916020019190600101906200315a565b5b5090506200318c9190620032ef565b5090565b828054828255905f5260205f20908101928215620031db579160200282015b82811115620031da578251829081620031c9919062003a77565b5091602001919060010190620031af565b5b509050620031ea9190620032a1565b5090565b828054828255905f5260205f2090810192821562003239579160200282015b8281111562003238578251829081620032279190620035f6565b50916020019190600101906200320d565b5b509050620032489190620032c8565b5090565b828054828255905f5260205f209081019282156200328e579160200282015b828111156200328d578251829060ff169055916020019190600101906200326b565b5b5090506200329d9190620032ef565b5090565b5b80821115620032c4575f8181620032ba91906200330c565b50600101620032a2565b5090565b5b80821115620032eb575f8181620032e191906200334f565b50600101620032c9565b5090565b5b8082111562003308575f815f905550600101620032f0565b5090565b5080546200331a90620033f6565b5f825580601f106200332d57506200334c565b601f0160209004905f5260205f20908101906200334b9190620032ef565b5b50565b5080546200335d90620033f6565b5f825580601f106200337057506200338f565b601f0160209004905f5260205f20908101906200338e9190620032ef565b5b50565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200340e57607f821691505b602082108103620034245762003423620033c9565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620034887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200344b565b6200349486836200344b565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620034de620034d8620034d284620034ac565b620034b5565b620034ac565b9050919050565b5f819050919050565b620034f983620034be565b620035116200350882620034e5565b84845462003457565b825550505050565b5f90565b6200352762003519565b62003534818484620034ee565b505050565b5b818110156200355b576200354f5f826200351d565b6001810190506200353a565b5050565b601f821115620035aa5762003574816200342a565b6200357f846200343c565b810160208510156200358f578190505b620035a76200359e856200343c565b83018262003539565b50505b505050565b5f82821c905092915050565b5f620035cc5f1984600802620035af565b1980831691505092915050565b5f620035e68383620035bb565b9150826002028217905092915050565b620036018262003392565b67ffffffffffffffff8111156200361d576200361c6200339c565b5b620036298254620033f6565b620036368282856200355f565b5f60209050601f8311600181146200366c575f841562003657578287015190505b620036638582620035d9565b865550620036d2565b601f1984166200367c866200342a565b5f5b82811015620036a5578489015182556001820191506020850194506020810190506200367e565b86831015620036c55784890151620036c1601f891682620035bb565b8355505b6001600288020188555050505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6200370582620036da565b9050919050565b6200371781620036f9565b82525050565b5f602082019050620037325f8301846200370c565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6200377182620034ac565b91506200377e83620034ac565b925082820390508181111562003799576200379862003738565b5b92915050565b5f620037ab82620034ac565b9150620037b883620034ac565b9250828201905080821115620037d357620037d262003738565b5b92915050565b5f819050919050565b620037f7620037f182620034ac565b620037d9565b82525050565b5f6200380a8285620037e2565b6020820191506200381c8284620037e2565b6020820191508190509392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6200386582620034ac565b91506200387283620034ac565b9250826200388557620038846200382c565b5b828206905092915050565b6200389b81620034ac565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015620038da578082015181840152602081019050620038bd565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6200390182620038a1565b6200390d8185620038ab565b93506200391f818560208601620038bb565b6200392a81620038e5565b840191505092915050565b5f6080820190506200394a5f8301876200370c565b6200395960208301866200370c565b62003968604083018562003890565b81810360608301526200397c8184620038f5565b905095945050505050565b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b620039c1816200398b565b8114620039cc575f80fd5b50565b5f81519050620039df81620039b6565b92915050565b5f60208284031215620039fd57620039fc62003987565b5b5f62003a0c84828501620039cf565b91505092915050565b5f819050815f5260205f209050919050565b601f82111562003a725762003a3c8162003a15565b62003a47846200343c565b8101602085101562003a57578190505b62003a6f62003a66856200343c565b83018262003539565b50505b505050565b62003a8282620038a1565b67ffffffffffffffff81111562003a9e5762003a9d6200339c565b5b62003aaa8254620033f6565b62003ab782828562003a27565b5f60209050601f83116001811462003aed575f841562003ad8578287015190505b62003ae48582620035d9565b86555062003b53565b601f19841662003afd8662003a15565b5f5b8281101562003b265784890151825560018201915060208501945060208101905062003aff565b8683101562003b46578489015162003b42601f891682620035bb565b8355505b6001600288020188555050505b505050505050565b615cdd8062003b695f395ff3fe60806040526004361061022f575f3560e01c80637d55094d1161012d578063c87b56dd116100aa578063e05c57bf1161006e578063e05c57bf146107b7578063e985e9c5146107f9578063ed288f9914610835578063f2fde38b1461085f578063fa0fca84146108875761022f565b8063c87b56dd146106d5578063d123973014610711578063d5abeb011461073b578063d5f3948814610765578063d755bf991461078f5761022f565b8063a22cb465116100f1578063a22cb46514610627578063a4c19a9f1461064f578063a6f48c9014610665578063b228d9251461068f578063b88d4fde146106b95761022f565b80637d55094d146105655780637eaf19b31461057b5780638da5cb5b146105b757806395d89b41146105e1578063a0712d681461060b5761022f565b80633ccfd60b116101bb5780636352211e1161017f5780636352211e146104855780636817c76c146104c157806370a08231146104eb578063715018a614610527578063740d73f31461053d5761022f565b80633ccfd60b146103c55780633e53eb28146103db57806342842e0e14610417578063481231a514610433578063485a68a31461045b5761022f565b8063095ea7b311610202578063095ea7b31461031157806318160ddd1461032d57806323b872dd14610357578063367b2a2014610373578063375a069a1461039d5761022f565b806301ffc9a714610233578063055d822c1461026f57806306fdde03146102ab578063081812fc146102d5575b5f80fd5b34801561023e575f80fd5b5061025960048036038101906102549190613f73565b6108c3565b6040516102669190613fb8565b60405180910390f35b34801561027a575f80fd5b506102956004803603810190610290919061402b565b610954565b6040516102a2919061406e565b60405180910390f35b3480156102b6575f80fd5b506102bf610969565b6040516102cc9190614111565b60405180910390f35b3480156102e0575f80fd5b506102fb60048036038101906102f6919061415b565b6109f9565b6040516103089190614195565b60405180910390f35b61032b600480360381019061032691906141ae565b610a73565b005b348015610338575f80fd5b50610341610bb2565b60405161034e919061406e565b60405180910390f35b610371600480360381019061036c91906141ec565b610bc7565b005b34801561037e575f80fd5b50610387610ed5565b6040516103949190614195565b60405180910390f35b3480156103a8575f80fd5b506103c360048036038101906103be919061415b565b610efa565b005b3480156103d0575f80fd5b506103d9610f0e565b005b3480156103e6575f80fd5b5061040160048036038101906103fc919061415b565b610fd1565b60405161040e9190614111565b60405180910390f35b610431600480360381019061042c91906141ec565b611579565b005b34801561043e575f80fd5b506104596004803603810190610454919061402b565b611598565b005b348015610466575f80fd5b5061046f6115e3565b60405161047c919061406e565b60405180910390f35b348015610490575f80fd5b506104ab60048036038101906104a6919061415b565b6115e9565b6040516104b89190614195565b60405180910390f35b3480156104cc575f80fd5b506104d56115fa565b6040516104e2919061406e565b60405180910390f35b3480156104f6575f80fd5b50610511600480360381019061050c919061402b565b611600565b60405161051e919061406e565b60405180910390f35b348015610532575f80fd5b5061053b6116b5565b005b348015610548575f80fd5b50610563600480360381019061055e919061429d565b6116c8565b005b348015610570575f80fd5b50610579611808565b005b348015610586575f80fd5b506105a1600480360381019061059c919061415b565b61183a565b6040516105ae919061406e565b60405180910390f35b3480156105c2575f80fd5b506105cb61184f565b6040516105d89190614195565b60405180910390f35b3480156105ec575f80fd5b506105f5611877565b6040516106029190614111565b60405180910390f35b6106256004803603810190610620919061415b565b611907565b005b348015610632575f80fd5b5061064d60048036038101906106489190614312565b611b16565b005b34801561065a575f80fd5b50610663611c1c565b005b348015610670575f80fd5b50610679611dc2565b604051610686919061406e565b60405180910390f35b34801561069a575f80fd5b506106a3611dc8565b6040516106b0919061406e565b60405180910390f35b6106d360048036038101906106ce9190614478565b611dce565b005b3480156106e0575f80fd5b506106fb60048036038101906106f6919061415b565b611e40565b6040516107089190614111565b60405180910390f35b34801561071c575f80fd5b50610725611ec8565b6040516107329190613fb8565b60405180910390f35b348015610746575f80fd5b5061074f611eda565b60405161075c919061406e565b60405180910390f35b348015610770575f80fd5b50610779611ee0565b6040516107869190614195565b60405180910390f35b34801561079a575f80fd5b506107b560048036038101906107b0919061415b565b611f05565b005b3480156107c2575f80fd5b506107dd60048036038101906107d8919061415b565b611f17565b6040516107f097969594939291906144f8565b60405180910390f35b348015610804575f80fd5b5061081f600480360381019061081a9190614565565b611f55565b60405161082c9190613fb8565b60405180910390f35b348015610840575f80fd5b50610849611fe3565b604051610856919061406e565b60405180910390f35b34801561086a575f80fd5b506108856004803603810190610880919061402b565b611fe9565b005b348015610892575f80fd5b506108ad60048036038101906108a8919061402b565b61206d565b6040516108ba9190613fb8565b60405180910390f35b5f6301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061091d57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061094d5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b602b602052805f5260405f205f915090505481565b606060028054610978906145d0565b80601f01602080910402602001604051908101604052809291908181526020018280546109a4906145d0565b80156109ef5780601f106109c6576101008083540402835291602001916109ef565b820191905f5260205f20905b8154815290600101906020018083116109d257829003601f168201915b5050505050905090565b5f610a038261208a565b610a39576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f610a7d826115e9565b90508073ffffffffffffffffffffffffffffffffffffffff16610a9e6120e4565b73ffffffffffffffffffffffffffffffffffffffff1614610b0157610aca81610ac56120e4565b611f55565b610b00576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b8260065f8481526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b5f610bbb6120eb565b6001545f540303905090565b5f610bd1826120f3565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c38576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80610c43846121b6565b91509150610c598187610c546120e4565b6121d9565b610ca557610c6e86610c696120e4565b611f55565b610ca4576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610d0a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d17868686600161221c565b8015610d21575f82555b60055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600190039190508190555060055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815460010191905081905550610de985610dc5888887612222565b7c020000000000000000000000000000000000000000000000000000000017612249565b60045f8681526020019081526020015f20819055505f7c0200000000000000000000000000000000000000000000000000000000841603610e65575f6001850190505f60045f8381526020019081526020015f205403610e63575f548114610e62578360045f8381526020019081526020015f20819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ecd8686866001612273565b505050505050565b602d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610f02612279565b610f0b81612300565b50565b610f16612279565b610f1e61245f565b5f3373ffffffffffffffffffffffffffffffffffffffff1647604051610f439061462d565b5f6040518083038185875af1925050503d805f8114610f7d576040519150601f19603f3d011682016040523d82523d5f602084013e610f82565b606091505b5050905080610fc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbd9061468b565b60405180910390fd5b50610fcf6124ae565b565b6060610fdc8261208a565b61101b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611012906146f3565b60405180910390fd5b5f60095f8481526020019081526020015f206040518060e00160405290815f8201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152505090505f61112e600b835f01518154811061109a57611099614711565b5b905f5260205f200180546110ad906145d0565b80601f01602080910402602001604051908101604052809291908181526020018280546110d9906145d0565b80156111245780601f106110fb57610100808354040283529160200191611124565b820191905f5260205f20905b81548152906001019060200180831161110757829003601f168201915b50505050506124b8565b6111dd600e84602001518154811061114957611148614711565b5b905f5260205f2001805461115c906145d0565b80601f0160208091040260200160405190810160405280929190818152602001828054611188906145d0565b80156111d35780601f106111aa576101008083540402835291602001916111d3565b820191905f5260205f20905b8154815290600101906020018083116111b657829003601f168201915b50505050506124b8565b61128c60118560400151815481106111f8576111f7614711565b5b905f5260205f2001805461120b906145d0565b80601f0160208091040260200160405190810160405280929190818152602001828054611237906145d0565b80156112825780601f1061125957610100808354040283529160200191611282565b820191905f5260205f20905b81548152906001019060200180831161126557829003601f168201915b50505050506124b8565b61133b601d8660c00151815481106112a7576112a6614711565b5b905f5260205f200180546112ba906145d0565b80601f01602080910402602001604051908101604052809291908181526020018280546112e6906145d0565b80156113315780601f1061130857610100808354040283529160200191611331565b820191905f5260205f20905b81548152906001019060200180831161131457829003601f168201915b50505050506124b8565b6113ea601787608001518154811061135657611355614711565b5b905f5260205f20018054611369906145d0565b80601f0160208091040260200160405190810160405280929190818152602001828054611395906145d0565b80156113e05780601f106113b7576101008083540402835291602001916113e0565b820191905f5260205f20905b8154815290600101906020018083116113c357829003601f168201915b50505050506124b8565b611499601488606001518154811061140557611404614711565b5b905f5260205f20018054611418906145d0565b80601f0160208091040260200160405190810160405280929190818152602001828054611444906145d0565b801561148f5780601f106114665761010080835404028352916020019161148f565b820191905f5260205f20905b81548152906001019060200180831161147257829003601f168201915b50505050506124b8565b611548601a8960a00151815481106114b4576114b3614711565b5b905f5260205f200180546114c7906145d0565b80601f01602080910402602001604051908101604052809291908181526020018280546114f3906145d0565b801561153e5780601f106115155761010080835404028352916020019161153e565b820191905f5260205f20905b81548152906001019060200180831161152157829003601f168201915b50505050506124b8565b60405160200161155e97969594939291906148ee565b60405160208183030381529060405290508092505050919050565b61159383838360405180602001604052805f815250611dce565b505050565b6115a0612279565b80602d5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60265481565b5f6115f3826120f3565b9050919050565b60255481565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611666576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054169050919050565b6116bd612279565b6116c65f612998565b565b602d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174e906149bd565b60405180910390fd5b61175f61245f565b5f5b828290508110156117fb576001602c5f85858581811061178457611783614711565b5b9050602002016020810190611799919061402b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555080806117f390614a08565b915050611761565b506118046124ae565b5050565b611810612279565b60285f9054906101000a900460ff161560285f6101000a81548160ff021916908315150217905550565b600a602052805f5260405f205f915090505481565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054611886906145d0565b80601f01602080910402602001604051908101604052809291908181526020018280546118b2906145d0565b80156118fd5780601f106118d4576101008083540402835291602001916118fd565b820191905f5260205f20905b8154815290600101906020018083116118e057829003601f168201915b5050505050905090565b5f602554905060285f9054906101000a900460ff1661195b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195290614a99565b60405180910390fd5b80826119679190614ab7565b34146119a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199f90614b42565b60405180910390fd5b6029548211156119ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e490614baa565b60405180910390fd5b5f82602b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611a379190614bc8565b9050602a54811115611a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7590614c45565b60405180910390fd5b80602b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611ac79190614bc8565b602b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550611b1183612300565b505050565b8060075f611b226120e4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611bcb6120e4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c109190613fb8565b60405180910390a35050565b60011515602c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151514611cac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca390614cad565b60405180910390fd5b60285f9054906101000a900460ff16611cfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf190614a99565b60405180910390fd5b6026546001602754611d0c9190614bc8565b1115611d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4490614d15565b60405180910390fd5b5f602c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001602754611db09190614bc8565b602781905550611dc06001612300565b565b60275481565b602a5481565b611dd9848484610bc7565b5f8373ffffffffffffffffffffffffffffffffffffffff163b14611e3a57611e0384848484612a5b565b611e39576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60605f611e4c83610fd1565b90505f611e5882612ba6565b90505f611e6485612d19565b611e6d86612de3565b83604051602001611e8093929190614fab565b60405160208183030381529060405290505f611e9b82612ba6565b905080604051602001611eae9190615072565b604051602081830303815290604052945050505050919050565b60285f9054906101000a900460ff1681565b60245481565b60215f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611f0d612279565b8060268190555050565b6009602052805f5260405f205f91509050805f0154908060010154908060020154908060030154908060040154908060050154908060060154905087565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b60295481565b611ff1612279565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612061575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016120589190614195565b60405180910390fd5b61206a81612998565b50565b602c602052805f5260405f205f915054906101000a900460ff1681565b5f816120946120eb565b111580156120a257505f5482105b80156120dd57505f7c010000000000000000000000000000000000000000000000000000000060045f8581526020019081526020015f205416145b9050919050565b5f33905090565b5f6001905090565b5f80829050806121016120eb565b1161217f575f5481101561217e575f60045f8381526020019081526020015f205490505f7c010000000000000000000000000000000000000000000000000000000082160361217c575b5f81036121725760045f836001900393508381526020019081526020015f2054905061214b565b80925050506121b1565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f805f60065f8581526020019081526020015f2090508092508254915050915091565b5f73ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b5f8060e883901c905060e8612238868684612f7a565b62ffffff16901b9150509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b612281612f82565b73ffffffffffffffffffffffffffffffffffffffff1661229f61184f565b73ffffffffffffffffffffffffffffffffffffffff16146122fe576122c2612f82565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016122f59190614195565b60405180910390fd5b565b6024548161230c612f89565b6123169190614bc8565b1115612357576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234e906150dd565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146123c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bc90615145565b60405180910390fd5b5f6123ce612f89565b6123d66120eb565b6123e09190614bc8565b90505f81836123ef9190614bc8565b90505f8290505b81811015612434575f61240b60225483612f9a565b90506124178282613094565b612420826139ee565b50808061242c90614a08565b9150506123f6565b506001436124429190615163565b406022819055504360238190555061245a3384613a51565b505050565b6002602054036124a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249b906151e0565b60405180910390fd5b6002602081905550565b6001602081905550565b60605f600583516124c9919061522b565b14612509576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612500906152a5565b60405180910390fd5b5f825103612531576040518060600160405280603a8152602001615c2e603a91399050612993565b5f6005835161254091906152c3565b905060605f8267ffffffffffffffff81111561255f5761255e614354565b5b60405190808252806020026020018201604052801561258d5781602001602082028036833780820191505090505b5090505f8367ffffffffffffffff8111156125ab576125aa614354565b5b6040519080825280602002602001820160405280156125d95781602001602082028036833780820191505090505b5090505f8467ffffffffffffffff8111156125f7576125f6614354565b5b6040519080825280602002602001820160405280156126255781602001602082028036833780820191505090505b5090505f8567ffffffffffffffff81111561264357612642614354565b5b6040519080825280602002602001820160405280156126715781602001602082028036833780820191505090505b5090505f8667ffffffffffffffff81111561268f5761268e614354565b5b6040519080825280602002602001820160405280156126bd5781602001602082028036833780820191505090505b5090505f5b8781101561298757896005826126d89190614ab7565b815181106126e9576126e8614711565b5b602001015160f81c60f81b60f81c60ff1686828151811061270d5761270c614711565b5b6020026020010181815250508960016005836127299190614ab7565b6127339190614bc8565b8151811061274457612743614711565b5b602001015160f81c60f81b60f81c60ff1685828151811061276857612767614711565b5b6020026020010181815250508960026005836127849190614ab7565b61278e9190614bc8565b8151811061279f5761279e614711565b5b602001015160f81c60f81b60f81c60ff168482815181106127c3576127c2614711565b5b6020026020010181815250508960036005836127df9190614ab7565b6127e99190614bc8565b815181106127fa576127f9614711565b5b602001015160f81c60f81b60f81c60ff1683828151811061281e5761281d614711565b5b60200260200101818152505089600460058361283a9190614ab7565b6128449190614bc8565b8151811061285557612854614711565b5b602001015160f81c60f81b60f81c60ff1682828151811061287957612878614711565b5b6020026020010181815250505f6128a987838151811061289c5761289b614711565b5b6020026020010151612d19565b90505f6128cf8784815181106128c2576128c1614711565b5b6020026020010151612d19565b90505f6128f58785815181106128e8576128e7614711565b5b6020026020010151612d19565b90505f61291b87868151811061290e5761290d614711565b5b6020026020010151612d19565b90505f61294187878151811061293457612933614711565b5b6020026020010151612d19565b90508b858585858560405160200161295e9695949392919061548b565b6040516020818303038152906040529b505050505050808061297f90614a08565b9150506126c2565b50859750505050505050505b919050565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f8373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a806120e4565b8786866040518563ffffffff1660e01b8152600401612aa29493929190615576565b6020604051808303815f875af1925050508015612add57506040513d601f19601f82011682018060405250810190612ada91906155d4565b60015b612b53573d805f8114612b0b576040519150601f19603f3d011682016040523d82523d5f602084013e612b10565b606091505b505f815103612b4b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60605f825103612bc65760405180602001604052805f8152509050612d14565b5f604051806060016040528060408152602001615c686040913990505f600360028551612bf39190614bc8565b612bfd91906152c3565b6004612c099190614ab7565b90505f602082612c199190614bc8565b67ffffffffffffffff811115612c3257612c31614354565b5b6040519080825280601f01601f191660200182016040528015612c645781602001600182028036833780820191505090505b509050818152600183018586518101602084015b81831015612cd3576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825360018201915050612c78565b600389510660018114612ced5760028114612cfd57612d08565b613d3d60f01b6002830352612d08565b603d60f81b60018303525b50505050508093505050505b919050565b60605f6001612d2784613a6e565b0190505f8167ffffffffffffffff811115612d4557612d44614354565b5b6040519080825280601f01601f191660200182016040528015612d775781602001600182028036833780820191505090505b5090505f82602001820190505b600115612dd8578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612dcd57612dcc6151fe565b5b0494505f8503612d84575b819350505050919050565b60605f60095f8481526020019081526020015f206040518060e00160405290815f8201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152505090505f612e64600a5f8681526020019081526020015f2054612d19565b90505f81600c845f015181548110612e7f57612e7e614711565b5b905f5260205f2001600f856020015181548110612e9f57612e9e614711565b5b905f5260205f20016012866040015181548110612ebf57612ebe614711565b5b905f5260205f20016015876060015181548110612edf57612ede614711565b5b905f5260205f20016018886080015181548110612eff57612efe614711565b5b905f5260205f2001601b8960a0015181548110612f1f57612f1e614711565b5b905f5260205f2001601e8a60c0015181548110612f3f57612f3e614711565b5b905f5260205f2001604051602001612f5e989796959493929190615977565b6040516020818303038152906040529050809350505050919050565b5f9392505050565b5f33905090565b5f612f926120eb565b5f5403905090565b612fa2613eeb565b60658383604051602001612fb7929190615ae1565b604051602081830303815290604052805190602001205f1c612fd9919061522b565b815f60078110612fec57612feb614711565b5b6020020181815250505f600190505b600781101561308d576065826001836130149190615163565b6007811061302557613024614711565b5b60200201518460405160200161303c929190615b0c565b604051602081830303815290604052805190602001205f1c61305e919061522b565b82826007811061307157613070614711565b5b602002018181525050808061308590614a08565b915050612ffb565b5092915050565b5f6131d1825f600781106130ab576130aa614711565b5b6020020151600b805480602002602001604051908101604052809291908181526020015f905b82821015613179578382905f5260205f200180546130ee906145d0565b80601f016020809104026020016040519081016040528092919081815260200182805461311a906145d0565b80156131655780601f1061313c57610100808354040283529160200191613165565b820191905f5260205f20905b81548152906001019060200180831161314857829003601f168201915b5050505050815260200190600101906130d1565b50505050600d8054806020026020016040519081016040528092919081815260200182805480156131c757602002820191905f5260205f20905b8154815260200190600101908083116131b3575b5050505050613bbf565b90505f613311836001600781106131eb576131ea614711565b5b6020020151600e805480602002602001604051908101604052809291908181526020015f905b828210156132b9578382905f5260205f2001805461322e906145d0565b80601f016020809104026020016040519081016040528092919081815260200182805461325a906145d0565b80156132a55780601f1061327c576101008083540402835291602001916132a5565b820191905f5260205f20905b81548152906001019060200180831161328857829003601f168201915b505050505081526020019060010190613211565b50505050601080548060200260200160405190810160405280929190818152602001828054801561330757602002820191905f5260205f20905b8154815260200190600101908083116132f3575b5050505050613bbf565b90505f6134518460026007811061332b5761332a614711565b5b60200201516011805480602002602001604051908101604052809291908181526020015f905b828210156133f9578382905f5260205f2001805461336e906145d0565b80601f016020809104026020016040519081016040528092919081815260200182805461339a906145d0565b80156133e55780601f106133bc576101008083540402835291602001916133e5565b820191905f5260205f20905b8154815290600101906020018083116133c857829003601f168201915b505050505081526020019060010190613351565b50505050601380548060200260200160405190810160405280929190818152602001828054801561344757602002820191905f5260205f20905b815481526020019060010190808311613433575b5050505050613bbf565b90505f6135918560036007811061346b5761346a614711565b5b6020020151601a805480602002602001604051908101604052809291908181526020015f905b82821015613539578382905f5260205f200180546134ae906145d0565b80601f01602080910402602001604051908101604052809291908181526020018280546134da906145d0565b80156135255780601f106134fc57610100808354040283529160200191613525565b820191905f5260205f20905b81548152906001019060200180831161350857829003601f168201915b505050505081526020019060010190613491565b50505050601c80548060200260200160405190810160405280929190818152602001828054801561358757602002820191905f5260205f20905b815481526020019060010190808311613573575b5050505050613bbf565b90505f6136d1866004600781106135ab576135aa614711565b5b60200201516017805480602002602001604051908101604052809291908181526020015f905b82821015613679578382905f5260205f200180546135ee906145d0565b80601f016020809104026020016040519081016040528092919081815260200182805461361a906145d0565b80156136655780601f1061363c57610100808354040283529160200191613665565b820191905f5260205f20905b81548152906001019060200180831161364857829003601f168201915b5050505050815260200190600101906135d1565b5050505060198054806020026020016040519081016040528092919081815260200182805480156136c757602002820191905f5260205f20905b8154815260200190600101908083116136b3575b5050505050613bbf565b90505f613811876005600781106136eb576136ea614711565b5b6020020151601d805480602002602001604051908101604052809291908181526020015f905b828210156137b9578382905f5260205f2001805461372e906145d0565b80601f016020809104026020016040519081016040528092919081815260200182805461375a906145d0565b80156137a55780601f1061377c576101008083540402835291602001916137a5565b820191905f5260205f20905b81548152906001019060200180831161378857829003601f168201915b505050505081526020019060010190613711565b50505050601f80548060200260200160405190810160405280929190818152602001828054801561380757602002820191905f5260205f20905b8154815260200190600101908083116137f3575b5050505050613bbf565b90505f6139518860066007811061382b5761382a614711565b5b60200201516014805480602002602001604051908101604052809291908181526020015f905b828210156138f9578382905f5260205f2001805461386e906145d0565b80601f016020809104026020016040519081016040528092919081815260200182805461389a906145d0565b80156138e55780601f106138bc576101008083540402835291602001916138e5565b820191905f5260205f20905b8154815290600101906020018083116138c857829003601f168201915b505050505081526020019060010190613851565b50505050601680548060200260200160405190810160405280929190818152602001828054801561394757602002820191905f5260205f20905b815481526020019060010190808311613933575b5050505050613bbf565b90505f6040518060e001604052808981526020018881526020018781526020018381526020018581526020018681526020018481525090508060095f8c81526020019081526020015f205f820151815f01556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015590505050505050505050505050565b5f60016103e760235484604051602001613a09929190615b0c565b604051602081830303815290604052805190602001205f1c613a2b919061522b565b613a359190614bc8565b905080600a5f8481526020019081526020015f20819055505050565b613a6a828260405180602001604052805f815250613c9c565b5050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613aca577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381613ac057613abf6151fe565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613b07576d04ee2d6d415b85acef81000000008381613afd57613afc6151fe565b5b0492506020810190505b662386f26fc100008310613b3657662386f26fc100008381613b2c57613b2b6151fe565b5b0492506010810190505b6305f5e1008310613b5f576305f5e1008381613b5557613b546151fe565b5b0492506008810190505b6127108310613b84576127108381613b7a57613b796151fe565b5b0492506004810190505b60648310613ba75760648381613b9d57613b9c6151fe565b5b0492506002810190505b600a8310613bb6576001810190505b80915050919050565b5f80835111613c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bfa90615b81565b60405180910390fd5b8151835114613c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c3e90615c0f565b60405180910390fd5b5f5b8251811015613c9057828181518110613c6557613c64614711565b5b6020026020010151851015613c7d5780915050613c95565b8080613c8890614a08565b915050613c49565b505f90505b9392505050565b613ca68383613d33565b5f8373ffffffffffffffffffffffffffffffffffffffff163b14613d2e575f805490505f83820390505b613ce25f868380600101945086612a5b565b613d18576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110613cd057815f5414613d2b575f80fd5b50505b505050565b5f805490505f8203613d71576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d7d5f84838561221c565b600160406001901b17820260055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540192505081905550613def83613de05f865f612222565b613de985613edc565b17612249565b60045f8381526020019081526020015f20819055505f80838301905073ffffffffffffffffffffffffffffffffffffffff8516915082825f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600183015b818114613e895780835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600181019050613e50565b505f8203613ec3576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819055505050613ed75f848385612273565b505050565b5f6001821460e11b9050919050565b6040518060e00160405280600790602082028036833780820191505090505090565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613f5281613f1e565b8114613f5c575f80fd5b50565b5f81359050613f6d81613f49565b92915050565b5f60208284031215613f8857613f87613f16565b5b5f613f9584828501613f5f565b91505092915050565b5f8115159050919050565b613fb281613f9e565b82525050565b5f602082019050613fcb5f830184613fa9565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613ffa82613fd1565b9050919050565b61400a81613ff0565b8114614014575f80fd5b50565b5f8135905061402581614001565b92915050565b5f602082840312156140405761403f613f16565b5b5f61404d84828501614017565b91505092915050565b5f819050919050565b61406881614056565b82525050565b5f6020820190506140815f83018461405f565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156140be5780820151818401526020810190506140a3565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6140e382614087565b6140ed8185614091565b93506140fd8185602086016140a1565b614106816140c9565b840191505092915050565b5f6020820190508181035f83015261412981846140d9565b905092915050565b61413a81614056565b8114614144575f80fd5b50565b5f8135905061415581614131565b92915050565b5f602082840312156141705761416f613f16565b5b5f61417d84828501614147565b91505092915050565b61418f81613ff0565b82525050565b5f6020820190506141a85f830184614186565b92915050565b5f80604083850312156141c4576141c3613f16565b5b5f6141d185828601614017565b92505060206141e285828601614147565b9150509250929050565b5f805f6060848603121561420357614202613f16565b5b5f61421086828701614017565b935050602061422186828701614017565b925050604061423286828701614147565b9150509250925092565b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261425d5761425c61423c565b5b8235905067ffffffffffffffff81111561427a57614279614240565b5b60208301915083602082028301111561429657614295614244565b5b9250929050565b5f80602083850312156142b3576142b2613f16565b5b5f83013567ffffffffffffffff8111156142d0576142cf613f1a565b5b6142dc85828601614248565b92509250509250929050565b6142f181613f9e565b81146142fb575f80fd5b50565b5f8135905061430c816142e8565b92915050565b5f806040838503121561432857614327613f16565b5b5f61433585828601614017565b9250506020614346858286016142fe565b9150509250929050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61438a826140c9565b810181811067ffffffffffffffff821117156143a9576143a8614354565b5b80604052505050565b5f6143bb613f0d565b90506143c78282614381565b919050565b5f67ffffffffffffffff8211156143e6576143e5614354565b5b6143ef826140c9565b9050602081019050919050565b828183375f83830152505050565b5f61441c614417846143cc565b6143b2565b90508281526020810184848401111561443857614437614350565b5b6144438482856143fc565b509392505050565b5f82601f83011261445f5761445e61423c565b5b813561446f84826020860161440a565b91505092915050565b5f805f80608085870312156144905761448f613f16565b5b5f61449d87828801614017565b94505060206144ae87828801614017565b93505060406144bf87828801614147565b925050606085013567ffffffffffffffff8111156144e0576144df613f1a565b5b6144ec8782880161444b565b91505092959194509250565b5f60e08201905061450b5f83018a61405f565b614518602083018961405f565b614525604083018861405f565b614532606083018761405f565b61453f608083018661405f565b61454c60a083018561405f565b61455960c083018461405f565b98975050505050505050565b5f806040838503121561457b5761457a613f16565b5b5f61458885828601614017565b925050602061459985828601614017565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806145e757607f821691505b6020821081036145fa576145f96145a3565b5b50919050565b5f81905092915050565b50565b5f6146185f83614600565b91506146238261460a565b5f82019050919050565b5f6146378261460d565b9150819050919050565b7f5472616e73666572206661696c65642e000000000000000000000000000000005f82015250565b5f614675601083614091565b915061468082614641565b602082019050919050565b5f6020820190508181035f8301526146a281614669565b9050919050565b7f546f6b656e20646f6573206e6f742065786973740000000000000000000000005f82015250565b5f6146dd601483614091565b91506146e8826146a9565b602082019050919050565b5f6020820190508181035f83015261470a816146d1565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81905092915050565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f32305f8201527f30302f737667222076696577426f783d2230203020313620313622207368617060208201527f652d72656e646572696e673d2263726973704564676573222077696474683d2260408201527f35313222206865696768743d22353132223e0000000000000000000000000000606082015250565b5f6147ee60728361473e565b91506147f982614748565b607282019050919050565b7f3c726563742077696474683d22313622206865696768743d223136222066696c5f8201527f6c3d2223393963636666222f3e00000000000000000000000000000000000000602082015250565b5f61485e602d8361473e565b915061486982614804565b602d82019050919050565b5f61487e82614087565b614888818561473e565b93506148988185602086016140a1565b80840191505092915050565b7f3c2f7376673e00000000000000000000000000000000000000000000000000005f82015250565b5f6148d860068361473e565b91506148e3826148a4565b600682019050919050565b5f6148f8826147e2565b915061490382614852565b915061490f828a614874565b915061491b8289614874565b91506149278288614874565b91506149338287614874565b915061493f8286614874565b915061494b8285614874565b91506149578284614874565b9150614962826148cc565b915081905098975050505050505050565b7f436f6e74726f6c6c6572204f6e6c7900000000000000000000000000000000005f82015250565b5f6149a7600f83614091565b91506149b282614973565b602082019050919050565b5f6020820190508181035f8301526149d48161499b565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614a1282614056565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a4457614a436149db565b5b600182019050919050565b7f4d696e74206e6f742072656164792079657400000000000000000000000000005f82015250565b5f614a83601283614091565b9150614a8e82614a4f565b602082019050919050565b5f6020820190508181035f830152614ab081614a77565b9050919050565b5f614ac182614056565b9150614acc83614056565b9250828202614ada81614056565b91508282048414831517614af157614af06149db565b5b5092915050565b7f506c656173652073656e64207468652065786163742045544820616d6f756e745f82015250565b5f614b2c602083614091565b9150614b3782614af8565b602082019050919050565b5f6020820190508181035f830152614b5981614b20565b9050919050565b7f45786365656473206d6178206d696e7420706572207472616e73616374696f6e5f82015250565b5f614b94602083614091565b9150614b9f82614b60565b602082019050919050565b5f6020820190508181035f830152614bc181614b88565b9050919050565b5f614bd282614056565b9150614bdd83614056565b9250828201905080821115614bf557614bf46149db565b5b92915050565b7f45786365656473206d6178206d696e74207065722077616c6c657400000000005f82015250565b5f614c2f601b83614091565b9150614c3a82614bfb565b602082019050919050565b5f6020820190508181035f830152614c5c81614c23565b9050919050565b7f4e6f74206f6e2077686974656c697374000000000000000000000000000000005f82015250565b5f614c97601083614091565b9150614ca282614c63565b602082019050919050565b5f6020820190508181035f830152614cc481614c8b565b9050919050565b7f4e6f206d6f726520667265652044696e6f7321000000000000000000000000005f82015250565b5f614cff601383614091565b9150614d0a82614ccb565b602082019050919050565b5f6020820190508181035f830152614d2c81614cf3565b9050919050565b7f7b226e616d65223a20224f6e436861696e2044696e6f732023000000000000005f82015250565b5f614d6760198361473e565b9150614d7282614d33565b601982019050919050565b7f222c0000000000000000000000000000000000000000000000000000000000005f82015250565b5f614db160028361473e565b9150614dbc82614d7d565b600282019050919050565b7f226465736372697074696f6e223a20224f6e436861696e2044696e6f732068615f8201527f76652068617463686564206f6e2042617365202d20313030252073746f72656460208201527f206f6e2074686520426c6f636b636861696e222c000000000000000000000000604082015250565b5f614e4760548361473e565b9150614e5282614dc7565b605482019050919050565b7f2261747472696275746573223a205b00000000000000000000000000000000005f82015250565b5f614e91600f8361473e565b9150614e9c82614e5d565b600f82019050919050565b7f5d2c0000000000000000000000000000000000000000000000000000000000005f82015250565b5f614edb60028361473e565b9150614ee682614ea7565b600282019050919050565b7f22696d616765223a2022646174613a696d6167652f7376672b786d6c3b6261735f8201527f6536342c00000000000000000000000000000000000000000000000000000000602082015250565b5f614f4b60248361473e565b9150614f5682614ef1565b602482019050919050565b7f227d0000000000000000000000000000000000000000000000000000000000005f82015250565b5f614f9560028361473e565b9150614fa082614f61565b600282019050919050565b5f614fb582614d5b565b9150614fc18286614874565b9150614fcc82614da5565b9150614fd782614e3b565b9150614fe282614e85565b9150614fee8285614874565b9150614ff982614ecf565b915061500482614f3f565b91506150108284614874565b915061501b82614f89565b9150819050949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000005f82015250565b5f61505c601d8361473e565b915061506782615028565b601d82019050919050565b5f61507c82615050565b91506150888284614874565b915081905092915050565b7f536f6c64204f75742100000000000000000000000000000000000000000000005f82015250565b5f6150c7600983614091565b91506150d282615093565b602082019050919050565b5f6020820190508181035f8301526150f4816150bb565b9050919050565b7f546865206d696e74657220697320616e6f7468657220636f6e747261637400005f82015250565b5f61512f601e83614091565b915061513a826150fb565b602082019050919050565b5f6020820190508181035f83015261515c81615123565b9050919050565b5f61516d82614056565b915061517883614056565b92508282039050818111156151905761518f6149db565b5b92915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f6151ca601f83614091565b91506151d582615196565b602082019050919050565b5f6020820190508181035f8301526151f7816151be565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61523582614056565b915061524083614056565b9250826152505761524f6151fe565b5b828206905092915050565b7f496e76616c6964206e756d626572206f662072656163747300000000000000005f82015250565b5f61528f601883614091565b915061529a8261525b565b602082019050919050565b5f6020820190508181035f8301526152bc81615283565b9050919050565b5f6152cd82614056565b91506152d883614056565b9250826152e8576152e76151fe565b5b828204905092915050565b7f3c7265637420783d2200000000000000000000000000000000000000000000005f82015250565b5f61532760098361473e565b9150615332826152f3565b600982019050919050565b7f2220793d220000000000000000000000000000000000000000000000000000005f82015250565b5f61537160058361473e565b915061537c8261533d565b600582019050919050565b7f222077696474683d223122206865696768743d2231222066696c6c3d227267625f8201527f2800000000000000000000000000000000000000000000000000000000000000602082015250565b5f6153e160218361473e565b91506153ec82615387565b602182019050919050565b7f2c000000000000000000000000000000000000000000000000000000000000005f82015250565b5f61542b60018361473e565b9150615436826153f7565b600182019050919050565b7f2922202f3e0000000000000000000000000000000000000000000000000000005f82015250565b5f61547560058361473e565b915061548082615441565b600582019050919050565b5f6154968289614874565b91506154a18261531b565b91506154ad8288614874565b91506154b882615365565b91506154c48287614874565b91506154cf826153d5565b91506154db8286614874565b91506154e68261541f565b91506154f28285614874565b91506154fd8261541f565b91506155098284614874565b915061551482615469565b9150819050979650505050505050565b5f81519050919050565b5f82825260208201905092915050565b5f61554882615524565b615552818561552e565b93506155628185602086016140a1565b61556b816140c9565b840191505092915050565b5f6080820190506155895f830187614186565b6155966020830186614186565b6155a3604083018561405f565b81810360608301526155b5818461553e565b905095945050505050565b5f815190506155ce81613f49565b92915050565b5f602082840312156155e9576155e8613f16565b5b5f6155f6848285016155c0565b91505092915050565b7f7b2274726169745f74797065223a2244696e6f2045676773222c22646973706c5f8201527f61795f74797065223a20226e756d626572222c202276616c7565223a22000000602082015250565b5f615659603d8361473e565b9150615664826155ff565b603d82019050919050565b7f227d2c00000000000000000000000000000000000000000000000000000000005f82015250565b5f6156a360038361473e565b91506156ae8261566f565b600382019050919050565b7f7b2274726169745f74797065223a22426f6479222c202276616c7565223a22005f82015250565b5f6156ed601f8361473e565b91506156f8826156b9565b601f82019050919050565b5f819050815f5260205f209050919050565b5f8154615721816145d0565b61572b818661473e565b9450600182165f8114615745576001811461575a5761578c565b60ff198316865281151582028601935061578c565b61576385615703565b5f5b8381101561578457815481890152600182019150602081019050615765565b838801955050505b50505092915050565b7f7b2274726169745f74797065223a224368657374222c202276616c7565223a225f82015250565b5f6157c960208361473e565b91506157d482615795565b602082019050919050565b7f7b2274726169745f74797065223a2245796573222c202276616c7565223a22005f82015250565b5f615813601f8361473e565b915061581e826157df565b601f82019050919050565b7f7b2274726169745f74797065223a2246616365222c202276616c7565223a22005f82015250565b5f61585d601f8361473e565b915061586882615829565b601f82019050919050565b7f7b2274726169745f74797065223a2246656574222c202276616c7565223a22005f82015250565b5f6158a7601f8361473e565b91506158b282615873565b601f82019050919050565b7f7b2274726169745f74797065223a2248656164222c202276616c7565223a22005f82015250565b5f6158f1601f8361473e565b91506158fc826158bd565b601f82019050919050565b7f7b2274726169745f74797065223a225370696b6573222c202276616c7565223a5f8201527f2200000000000000000000000000000000000000000000000000000000000000602082015250565b5f61596160218361473e565b915061596c82615907565b602182019050919050565b5f6159818261564d565b915061598d828b614874565b915061599882615697565b91506159a3826156e1565b91506159af828a615715565b91506159ba82615697565b91506159c5826157bd565b91506159d18289615715565b91506159dc82615697565b91506159e782615807565b91506159f38288615715565b91506159fe82615697565b9150615a0982615851565b9150615a158287615715565b9150615a2082615697565b9150615a2b8261589b565b9150615a378286615715565b9150615a4282615697565b9150615a4d826158e5565b9150615a598285615715565b9150615a6482615697565b9150615a6f82615955565b9150615a7b8284615715565b9150615a8682614f89565b91508190509998505050505050505050565b5f819050919050565b5f819050919050565b615abb615ab682615a98565b615aa1565b82525050565b5f819050919050565b615adb615ad682614056565b615ac1565b82525050565b5f615aec8285615aaa565b602082019150615afc8284615aca565b6020820191508190509392505050565b5f615b178285615aca565b602082019150615b278284615aca565b6020820191508190509392505050565b7f456c656d656e747320617272617920697320656d7074790000000000000000005f82015250565b5f615b6b601783614091565b9150615b7682615b37565b602082019050919050565b5f6020820190508181035f830152615b9881615b5f565b9050919050565b7f456c656d656e747320616e642077656967687473206c656e677468206d69736d5f8201527f6174636800000000000000000000000000000000000000000000000000000000602082015250565b5f615bf9602483614091565b9150615c0482615b9f565b604082019050919050565b5f6020820190508181035f830152615c2681615bed565b905091905056fe3c7265637420783d22302220793d2230222077696474683d223022206865696768743d2230222066696c6c3d2272676228302c302c3029222f3e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220c3379405c74c81f23aacdbe1a99796fd5d3514bb9a4aa45f8f0d1e68dac4c95464736f6c6343000814003306054893c507054893c508054893c509054892c406064893c507064893c508064893c509064893c50a064892c406074893c507074893c508074893c509074893c50a074892c406084893c507084893c508084893c504094893c506094893c507094893c508094893c509094892c4050a4893c5060a4893c5070a4893c5080a4893c5060b4892c4080b4892c40704b7b7b70804b7b7b70605b7b7b70705b7b7b70805b7b7b70905b7b7b70606b7b7b70806b7b7b70a06b7b7b70707b6b7b70907b6b7b70b07b6b7b70605bf61570705bf61570805bf61570905bf62570606cb88440706cb88440806cb88440906cb88440a06cb88440607ccb1440707ccb1440807ccb1440907ccb1440a07cbb14406086bc15607086bc15608086bc15704096391c506096391c507096391c508096391c509096391c4050a7956c6060a7956c6070a7956c6080a7957c5060bbe67c4080bbe67c40603bf5dca0703bf5dca0803be5dca0504bf5dca0604bf5dca0704bf5dca0804bf5dca0904bf5dca0a04be5dca0703dbdbdb0803dbdbdb0903dadadb0504c245360604c245360704c245360804c245360904c245360602eaeaea0702eaeaea0802e9e9e90603eaeaea0703eaeaea0803e9e9e90604eaeaea0704eaeaea0804e9e9e90605c1d9cb0705c1d9cb0805c1d9cb0905c1d9cb0606acd4bd0706acd4bd0806acd4bd0906acd4bd0a06acd4bd06078ed0a907078ed0a908078ed0a909078ed0a90a078ed0a906086ace9407086ace9408086ace94040947d481060958d18a070958d18a080958d18a090958d18a050a47d481060a47d481070a47d481080a47d481060b30d273080b30d2730605dac6780705dac6780805dac6780905dac6780606dac6780706dac6780806dac6780906dac6780a06dac6780607dac6780707dac6780807dac6780907dac6780a07dac6780608dac6780708dac6780808dac6780409d8c6790609dac6780709dac6780809dac6780909dac678050ad8c679060adac678070adac678080adac678060bdac678080bdac67806039356cb07039356cb08039356cb06049356cb07049557ca08049557ca09049557ca0a049457ca0605c4cadf0705c4cadf0805c4cadf0905c4cadf0606aab8e30706aab8e30806aab8e30906aab8e30a06abb8e3060795a8e4070795a8e4080795a8e4090795a8e40a0795a8e406088199e407088199e408088199e40409728de60609728de60709718ee60809718ee60909728de6050a5e7ee2060a5e7ee2070a5e7ee2080a5f7ee2060b5275e2080b5275e2040b7b4c390a0b7b4c39050c7a4b38060c7a4a38070c7a4a38080c7a4b38090c7a4b38060db9b0ac080db9b0ac0706e024010806e024010906e024010a06e024010b06e024010c06e024010d06e024010e06e024010f06e0240106056ab38707056ab38708056ab38709056bb18506066ab38707066ab38708066ab38709066ab3870a066bb18506076ab38707076ab38708076ab38709076ab3870a076bb18506086ab38707086ab38708086ab38704096ab28706096ab38707096ab38708096ab38709096bb185050a6ab287060a6ab387070a6ab387080a6ab387060b6bb185080b6bb1850605d7d2aa0705d7d2aa0805d7d2aa0905d7d2aa0606dad1910706dad1910806dad1910906dad1910a06dad1910607dacf7e0707dacf7e0807dacf7e0907dacf7e0a07d9cf7e0608ded16f0708ded16f0808ddd1700409dfd15a0609e0d05a0709e0d05a0809e0d15a0909dfd15a050adecc47060adecc47070adecc47080addcc48060be1cd2c080be1cd2c0703318ec60803328ec50903318ec60504318ec60604318ec60704328ec50804328ec50904328ec50605dbbdca0705dbbdc90805dbbdc90905dbbdca0606deadc20706deadc20806deadc20906deadc20a06deadc10607de9db80707de9db80807de9db80907de9db80a07de9db80608dd90b00708dd90b00808dd90b00409dc78a10609dc78a10709dc78a20809dc78a20909dc78a1050adc6c9b060adc6c9b070adc6c9b080adc6c9a060bdd6094080bdd609406058ba4d507058ba4d508058ba4d509058ca2d206068ba4d507068ba4d508068ba4d509068ba4d50a068ca2d206078ba4d507078ba4d508078ba4d509078ba4d50a078ca2d206088ba4d507088ba4d508088ba4d504098ba4d506098ba4d507098ba4d508098ba4d509098ca2d2050a8ba4d5060a8ba4d5070a8ba4d5080a8ba4d5060b8ca2d2080b8ca2d20503f0a92a0703f1a9290903f0a92a0504f1a9290604f0a82b0704f0a82a0804f1a92a0904f0a92a05043d3d3d06043d3d3d07043d3d3d08043d3d3d05053d3d3d05063d3d3d06063d3d3d05073d3d3d06073d3d3d0605acacac0705acacac0805acacac0905acaaa90606acacac0706acacac0806acacac0906acacac0a06acaaa90607acacac0707acacac0807acacac0907acacac0a07acaaa90608acacac0708acacac0808acacac0409ababab0609acacac0709acacac0809acacac0909acaaa9050aababab060aacacac070aacacac080aacacac060bacaaa9080bacaaa90605c7dca40705c7dca40805c7dca40905c7dba20606c7dca40706c7dca40806c7dca40906c7dca40a06c7dba20607c7dca40707c7dca40807c7dca40907c7dca40a07c7dba20608c7dca40708c7dca40808c7dca40409c7daa20609c7dca40709c7dca40809c7dca40909c7dba2050ac7daa2060ac7dca4070ac7dca4080ac7dca4060bc7dba2080bc7dba20605ba4e460705ba4e460805ba4e460905b84e460606ba4e460706ba4e460806ba4e460906ba4e460a06b84e460607ba4e460707ba4e460807ba4e460907ba4e460a07b84e460608ba4e460708ba4e460808ba4e460409b84e460609ba4e460709ba4e460809ba4e460909b84e46050ab84e46060aba4e46070aba4e46080aba4e46060bb84e46080bb84e4606053a3a3a07053a3a3a08053a3a3a09053a3a3a06063a3a3a08063a3a3a0a063a3a3a0605f0f0f00705f0f0f00805f0f0f00905f0f0f00606dadada0706dadada0806dadada0906dadada0a06dadada0607c3c3c30707c3c3c30807c3c3c30907c3c3c30a07c2c2c20608b1b1b10708b1b1b10808b1b1b104099b9b9b06099b9b9b07099b9b9b08099b9b9b09099a9b9b050a828282060a828282070a828282080a828283060b6d6d6d080b6d6d6d06056ec9d407056ec9d408056ec9d409056ecad406066ecad407066ec9d408066ec9d409066ec9d40a066ecad406076ecad407076ec9d408076ec9d409076ec9d40a076ecad406086ecad407086ec9d408086ec9d404096ecad406096ec9d407096ec9d408096ec9d409096ecad4050a6ec9d4060a6ec9d4070a6ec9d4080a6ecad4060b6ecad4080b6ecad406051049e107051049e108051049e109051049e10a051049e104061049e105061049e106061049e108061049e10a061049e104071049e106071049e107071049e108071049e109071049e10a071049e10108dededd0109dededd0209dedede020adededd030adedede010bdededd030bdededd040bdedede020cdededd040cdededd050cdedede060c181817070cdedede080c1818170009dddddd000adddddd010adddddd000bdddddd020bdddddd000cdddddd010cdddddd020cdddddd030cdddddd010ddddddd030ddddddd050dc566bf060dc566bf070dc566bf080dc566c00605f2adbe0705f2adbe0805f2adbe0905f1acbc0606f2adbe0706f2adbe0806f2adbe0906f2adbe0a06f1acbc0607f2adbe0707f2adbe0807f2adbe0907f2adbe0a07f1acbc0608f2adbe0708f2adbe0808f2adbe0409f0abbb0609f2adbe0709f2adbe0809f2adbe0909f1acbc050af0abbb060af2adbe070af2adbe080af2adbe060bf1acbc080bf1acbc0605e1d8d10705e1d8d10805e1d8d10905e1d8d10606dfc2ae0706dfc2ae0806dfc2ae0906dfc2ae0a06dfc2ae0607e1b08e0707e1b08e0807e1b08e0907e1b08e0a07e1b08e0608e5a57a0708e5a57a0808e4a57a0409e4955f0609e5955e0709e5955e0809e5955e0909e4955f050ae48442060ae48442070ae48442080ae48442060be37931080be37931

Deployed Bytecode

0x60806040526004361061022f575f3560e01c80637d55094d1161012d578063c87b56dd116100aa578063e05c57bf1161006e578063e05c57bf146107b7578063e985e9c5146107f9578063ed288f9914610835578063f2fde38b1461085f578063fa0fca84146108875761022f565b8063c87b56dd146106d5578063d123973014610711578063d5abeb011461073b578063d5f3948814610765578063d755bf991461078f5761022f565b8063a22cb465116100f1578063a22cb46514610627578063a4c19a9f1461064f578063a6f48c9014610665578063b228d9251461068f578063b88d4fde146106b95761022f565b80637d55094d146105655780637eaf19b31461057b5780638da5cb5b146105b757806395d89b41146105e1578063a0712d681461060b5761022f565b80633ccfd60b116101bb5780636352211e1161017f5780636352211e146104855780636817c76c146104c157806370a08231146104eb578063715018a614610527578063740d73f31461053d5761022f565b80633ccfd60b146103c55780633e53eb28146103db57806342842e0e14610417578063481231a514610433578063485a68a31461045b5761022f565b8063095ea7b311610202578063095ea7b31461031157806318160ddd1461032d57806323b872dd14610357578063367b2a2014610373578063375a069a1461039d5761022f565b806301ffc9a714610233578063055d822c1461026f57806306fdde03146102ab578063081812fc146102d5575b5f80fd5b34801561023e575f80fd5b5061025960048036038101906102549190613f73565b6108c3565b6040516102669190613fb8565b60405180910390f35b34801561027a575f80fd5b506102956004803603810190610290919061402b565b610954565b6040516102a2919061406e565b60405180910390f35b3480156102b6575f80fd5b506102bf610969565b6040516102cc9190614111565b60405180910390f35b3480156102e0575f80fd5b506102fb60048036038101906102f6919061415b565b6109f9565b6040516103089190614195565b60405180910390f35b61032b600480360381019061032691906141ae565b610a73565b005b348015610338575f80fd5b50610341610bb2565b60405161034e919061406e565b60405180910390f35b610371600480360381019061036c91906141ec565b610bc7565b005b34801561037e575f80fd5b50610387610ed5565b6040516103949190614195565b60405180910390f35b3480156103a8575f80fd5b506103c360048036038101906103be919061415b565b610efa565b005b3480156103d0575f80fd5b506103d9610f0e565b005b3480156103e6575f80fd5b5061040160048036038101906103fc919061415b565b610fd1565b60405161040e9190614111565b60405180910390f35b610431600480360381019061042c91906141ec565b611579565b005b34801561043e575f80fd5b506104596004803603810190610454919061402b565b611598565b005b348015610466575f80fd5b5061046f6115e3565b60405161047c919061406e565b60405180910390f35b348015610490575f80fd5b506104ab60048036038101906104a6919061415b565b6115e9565b6040516104b89190614195565b60405180910390f35b3480156104cc575f80fd5b506104d56115fa565b6040516104e2919061406e565b60405180910390f35b3480156104f6575f80fd5b50610511600480360381019061050c919061402b565b611600565b60405161051e919061406e565b60405180910390f35b348015610532575f80fd5b5061053b6116b5565b005b348015610548575f80fd5b50610563600480360381019061055e919061429d565b6116c8565b005b348015610570575f80fd5b50610579611808565b005b348015610586575f80fd5b506105a1600480360381019061059c919061415b565b61183a565b6040516105ae919061406e565b60405180910390f35b3480156105c2575f80fd5b506105cb61184f565b6040516105d89190614195565b60405180910390f35b3480156105ec575f80fd5b506105f5611877565b6040516106029190614111565b60405180910390f35b6106256004803603810190610620919061415b565b611907565b005b348015610632575f80fd5b5061064d60048036038101906106489190614312565b611b16565b005b34801561065a575f80fd5b50610663611c1c565b005b348015610670575f80fd5b50610679611dc2565b604051610686919061406e565b60405180910390f35b34801561069a575f80fd5b506106a3611dc8565b6040516106b0919061406e565b60405180910390f35b6106d360048036038101906106ce9190614478565b611dce565b005b3480156106e0575f80fd5b506106fb60048036038101906106f6919061415b565b611e40565b6040516107089190614111565b60405180910390f35b34801561071c575f80fd5b50610725611ec8565b6040516107329190613fb8565b60405180910390f35b348015610746575f80fd5b5061074f611eda565b60405161075c919061406e565b60405180910390f35b348015610770575f80fd5b50610779611ee0565b6040516107869190614195565b60405180910390f35b34801561079a575f80fd5b506107b560048036038101906107b0919061415b565b611f05565b005b3480156107c2575f80fd5b506107dd60048036038101906107d8919061415b565b611f17565b6040516107f097969594939291906144f8565b60405180910390f35b348015610804575f80fd5b5061081f600480360381019061081a9190614565565b611f55565b60405161082c9190613fb8565b60405180910390f35b348015610840575f80fd5b50610849611fe3565b604051610856919061406e565b60405180910390f35b34801561086a575f80fd5b506108856004803603810190610880919061402b565b611fe9565b005b348015610892575f80fd5b506108ad60048036038101906108a8919061402b565b61206d565b6040516108ba9190613fb8565b60405180910390f35b5f6301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061091d57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061094d5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b602b602052805f5260405f205f915090505481565b606060028054610978906145d0565b80601f01602080910402602001604051908101604052809291908181526020018280546109a4906145d0565b80156109ef5780601f106109c6576101008083540402835291602001916109ef565b820191905f5260205f20905b8154815290600101906020018083116109d257829003601f168201915b5050505050905090565b5f610a038261208a565b610a39576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f610a7d826115e9565b90508073ffffffffffffffffffffffffffffffffffffffff16610a9e6120e4565b73ffffffffffffffffffffffffffffffffffffffff1614610b0157610aca81610ac56120e4565b611f55565b610b00576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b8260065f8481526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b5f610bbb6120eb565b6001545f540303905090565b5f610bd1826120f3565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c38576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80610c43846121b6565b91509150610c598187610c546120e4565b6121d9565b610ca557610c6e86610c696120e4565b611f55565b610ca4576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610d0a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d17868686600161221c565b8015610d21575f82555b60055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600190039190508190555060055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815460010191905081905550610de985610dc5888887612222565b7c020000000000000000000000000000000000000000000000000000000017612249565b60045f8681526020019081526020015f20819055505f7c0200000000000000000000000000000000000000000000000000000000841603610e65575f6001850190505f60045f8381526020019081526020015f205403610e63575f548114610e62578360045f8381526020019081526020015f20819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ecd8686866001612273565b505050505050565b602d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610f02612279565b610f0b81612300565b50565b610f16612279565b610f1e61245f565b5f3373ffffffffffffffffffffffffffffffffffffffff1647604051610f439061462d565b5f6040518083038185875af1925050503d805f8114610f7d576040519150601f19603f3d011682016040523d82523d5f602084013e610f82565b606091505b5050905080610fc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbd9061468b565b60405180910390fd5b50610fcf6124ae565b565b6060610fdc8261208a565b61101b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611012906146f3565b60405180910390fd5b5f60095f8481526020019081526020015f206040518060e00160405290815f8201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152505090505f61112e600b835f01518154811061109a57611099614711565b5b905f5260205f200180546110ad906145d0565b80601f01602080910402602001604051908101604052809291908181526020018280546110d9906145d0565b80156111245780601f106110fb57610100808354040283529160200191611124565b820191905f5260205f20905b81548152906001019060200180831161110757829003601f168201915b50505050506124b8565b6111dd600e84602001518154811061114957611148614711565b5b905f5260205f2001805461115c906145d0565b80601f0160208091040260200160405190810160405280929190818152602001828054611188906145d0565b80156111d35780601f106111aa576101008083540402835291602001916111d3565b820191905f5260205f20905b8154815290600101906020018083116111b657829003601f168201915b50505050506124b8565b61128c60118560400151815481106111f8576111f7614711565b5b905f5260205f2001805461120b906145d0565b80601f0160208091040260200160405190810160405280929190818152602001828054611237906145d0565b80156112825780601f1061125957610100808354040283529160200191611282565b820191905f5260205f20905b81548152906001019060200180831161126557829003601f168201915b50505050506124b8565b61133b601d8660c00151815481106112a7576112a6614711565b5b905f5260205f200180546112ba906145d0565b80601f01602080910402602001604051908101604052809291908181526020018280546112e6906145d0565b80156113315780601f1061130857610100808354040283529160200191611331565b820191905f5260205f20905b81548152906001019060200180831161131457829003601f168201915b50505050506124b8565b6113ea601787608001518154811061135657611355614711565b5b905f5260205f20018054611369906145d0565b80601f0160208091040260200160405190810160405280929190818152602001828054611395906145d0565b80156113e05780601f106113b7576101008083540402835291602001916113e0565b820191905f5260205f20905b8154815290600101906020018083116113c357829003601f168201915b50505050506124b8565b611499601488606001518154811061140557611404614711565b5b905f5260205f20018054611418906145d0565b80601f0160208091040260200160405190810160405280929190818152602001828054611444906145d0565b801561148f5780601f106114665761010080835404028352916020019161148f565b820191905f5260205f20905b81548152906001019060200180831161147257829003601f168201915b50505050506124b8565b611548601a8960a00151815481106114b4576114b3614711565b5b905f5260205f200180546114c7906145d0565b80601f01602080910402602001604051908101604052809291908181526020018280546114f3906145d0565b801561153e5780601f106115155761010080835404028352916020019161153e565b820191905f5260205f20905b81548152906001019060200180831161152157829003601f168201915b50505050506124b8565b60405160200161155e97969594939291906148ee565b60405160208183030381529060405290508092505050919050565b61159383838360405180602001604052805f815250611dce565b505050565b6115a0612279565b80602d5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60265481565b5f6115f3826120f3565b9050919050565b60255481565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611666576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054169050919050565b6116bd612279565b6116c65f612998565b565b602d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174e906149bd565b60405180910390fd5b61175f61245f565b5f5b828290508110156117fb576001602c5f85858581811061178457611783614711565b5b9050602002016020810190611799919061402b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555080806117f390614a08565b915050611761565b506118046124ae565b5050565b611810612279565b60285f9054906101000a900460ff161560285f6101000a81548160ff021916908315150217905550565b600a602052805f5260405f205f915090505481565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054611886906145d0565b80601f01602080910402602001604051908101604052809291908181526020018280546118b2906145d0565b80156118fd5780601f106118d4576101008083540402835291602001916118fd565b820191905f5260205f20905b8154815290600101906020018083116118e057829003601f168201915b5050505050905090565b5f602554905060285f9054906101000a900460ff1661195b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195290614a99565b60405180910390fd5b80826119679190614ab7565b34146119a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199f90614b42565b60405180910390fd5b6029548211156119ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e490614baa565b60405180910390fd5b5f82602b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611a379190614bc8565b9050602a54811115611a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7590614c45565b60405180910390fd5b80602b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611ac79190614bc8565b602b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550611b1183612300565b505050565b8060075f611b226120e4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611bcb6120e4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c109190613fb8565b60405180910390a35050565b60011515602c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151514611cac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca390614cad565b60405180910390fd5b60285f9054906101000a900460ff16611cfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf190614a99565b60405180910390fd5b6026546001602754611d0c9190614bc8565b1115611d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4490614d15565b60405180910390fd5b5f602c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001602754611db09190614bc8565b602781905550611dc06001612300565b565b60275481565b602a5481565b611dd9848484610bc7565b5f8373ffffffffffffffffffffffffffffffffffffffff163b14611e3a57611e0384848484612a5b565b611e39576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60605f611e4c83610fd1565b90505f611e5882612ba6565b90505f611e6485612d19565b611e6d86612de3565b83604051602001611e8093929190614fab565b60405160208183030381529060405290505f611e9b82612ba6565b905080604051602001611eae9190615072565b604051602081830303815290604052945050505050919050565b60285f9054906101000a900460ff1681565b60245481565b60215f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611f0d612279565b8060268190555050565b6009602052805f5260405f205f91509050805f0154908060010154908060020154908060030154908060040154908060050154908060060154905087565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b60295481565b611ff1612279565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612061575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016120589190614195565b60405180910390fd5b61206a81612998565b50565b602c602052805f5260405f205f915054906101000a900460ff1681565b5f816120946120eb565b111580156120a257505f5482105b80156120dd57505f7c010000000000000000000000000000000000000000000000000000000060045f8581526020019081526020015f205416145b9050919050565b5f33905090565b5f6001905090565b5f80829050806121016120eb565b1161217f575f5481101561217e575f60045f8381526020019081526020015f205490505f7c010000000000000000000000000000000000000000000000000000000082160361217c575b5f81036121725760045f836001900393508381526020019081526020015f2054905061214b565b80925050506121b1565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f805f60065f8581526020019081526020015f2090508092508254915050915091565b5f73ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b5f8060e883901c905060e8612238868684612f7a565b62ffffff16901b9150509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b612281612f82565b73ffffffffffffffffffffffffffffffffffffffff1661229f61184f565b73ffffffffffffffffffffffffffffffffffffffff16146122fe576122c2612f82565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016122f59190614195565b60405180910390fd5b565b6024548161230c612f89565b6123169190614bc8565b1115612357576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234e906150dd565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146123c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bc90615145565b60405180910390fd5b5f6123ce612f89565b6123d66120eb565b6123e09190614bc8565b90505f81836123ef9190614bc8565b90505f8290505b81811015612434575f61240b60225483612f9a565b90506124178282613094565b612420826139ee565b50808061242c90614a08565b9150506123f6565b506001436124429190615163565b406022819055504360238190555061245a3384613a51565b505050565b6002602054036124a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249b906151e0565b60405180910390fd5b6002602081905550565b6001602081905550565b60605f600583516124c9919061522b565b14612509576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612500906152a5565b60405180910390fd5b5f825103612531576040518060600160405280603a8152602001615c2e603a91399050612993565b5f6005835161254091906152c3565b905060605f8267ffffffffffffffff81111561255f5761255e614354565b5b60405190808252806020026020018201604052801561258d5781602001602082028036833780820191505090505b5090505f8367ffffffffffffffff8111156125ab576125aa614354565b5b6040519080825280602002602001820160405280156125d95781602001602082028036833780820191505090505b5090505f8467ffffffffffffffff8111156125f7576125f6614354565b5b6040519080825280602002602001820160405280156126255781602001602082028036833780820191505090505b5090505f8567ffffffffffffffff81111561264357612642614354565b5b6040519080825280602002602001820160405280156126715781602001602082028036833780820191505090505b5090505f8667ffffffffffffffff81111561268f5761268e614354565b5b6040519080825280602002602001820160405280156126bd5781602001602082028036833780820191505090505b5090505f5b8781101561298757896005826126d89190614ab7565b815181106126e9576126e8614711565b5b602001015160f81c60f81b60f81c60ff1686828151811061270d5761270c614711565b5b6020026020010181815250508960016005836127299190614ab7565b6127339190614bc8565b8151811061274457612743614711565b5b602001015160f81c60f81b60f81c60ff1685828151811061276857612767614711565b5b6020026020010181815250508960026005836127849190614ab7565b61278e9190614bc8565b8151811061279f5761279e614711565b5b602001015160f81c60f81b60f81c60ff168482815181106127c3576127c2614711565b5b6020026020010181815250508960036005836127df9190614ab7565b6127e99190614bc8565b815181106127fa576127f9614711565b5b602001015160f81c60f81b60f81c60ff1683828151811061281e5761281d614711565b5b60200260200101818152505089600460058361283a9190614ab7565b6128449190614bc8565b8151811061285557612854614711565b5b602001015160f81c60f81b60f81c60ff1682828151811061287957612878614711565b5b6020026020010181815250505f6128a987838151811061289c5761289b614711565b5b6020026020010151612d19565b90505f6128cf8784815181106128c2576128c1614711565b5b6020026020010151612d19565b90505f6128f58785815181106128e8576128e7614711565b5b6020026020010151612d19565b90505f61291b87868151811061290e5761290d614711565b5b6020026020010151612d19565b90505f61294187878151811061293457612933614711565b5b6020026020010151612d19565b90508b858585858560405160200161295e9695949392919061548b565b6040516020818303038152906040529b505050505050808061297f90614a08565b9150506126c2565b50859750505050505050505b919050565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f8373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a806120e4565b8786866040518563ffffffff1660e01b8152600401612aa29493929190615576565b6020604051808303815f875af1925050508015612add57506040513d601f19601f82011682018060405250810190612ada91906155d4565b60015b612b53573d805f8114612b0b576040519150601f19603f3d011682016040523d82523d5f602084013e612b10565b606091505b505f815103612b4b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60605f825103612bc65760405180602001604052805f8152509050612d14565b5f604051806060016040528060408152602001615c686040913990505f600360028551612bf39190614bc8565b612bfd91906152c3565b6004612c099190614ab7565b90505f602082612c199190614bc8565b67ffffffffffffffff811115612c3257612c31614354565b5b6040519080825280601f01601f191660200182016040528015612c645781602001600182028036833780820191505090505b509050818152600183018586518101602084015b81831015612cd3576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825360018201915050612c78565b600389510660018114612ced5760028114612cfd57612d08565b613d3d60f01b6002830352612d08565b603d60f81b60018303525b50505050508093505050505b919050565b60605f6001612d2784613a6e565b0190505f8167ffffffffffffffff811115612d4557612d44614354565b5b6040519080825280601f01601f191660200182016040528015612d775781602001600182028036833780820191505090505b5090505f82602001820190505b600115612dd8578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612dcd57612dcc6151fe565b5b0494505f8503612d84575b819350505050919050565b60605f60095f8481526020019081526020015f206040518060e00160405290815f8201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152505090505f612e64600a5f8681526020019081526020015f2054612d19565b90505f81600c845f015181548110612e7f57612e7e614711565b5b905f5260205f2001600f856020015181548110612e9f57612e9e614711565b5b905f5260205f20016012866040015181548110612ebf57612ebe614711565b5b905f5260205f20016015876060015181548110612edf57612ede614711565b5b905f5260205f20016018886080015181548110612eff57612efe614711565b5b905f5260205f2001601b8960a0015181548110612f1f57612f1e614711565b5b905f5260205f2001601e8a60c0015181548110612f3f57612f3e614711565b5b905f5260205f2001604051602001612f5e989796959493929190615977565b6040516020818303038152906040529050809350505050919050565b5f9392505050565b5f33905090565b5f612f926120eb565b5f5403905090565b612fa2613eeb565b60658383604051602001612fb7929190615ae1565b604051602081830303815290604052805190602001205f1c612fd9919061522b565b815f60078110612fec57612feb614711565b5b6020020181815250505f600190505b600781101561308d576065826001836130149190615163565b6007811061302557613024614711565b5b60200201518460405160200161303c929190615b0c565b604051602081830303815290604052805190602001205f1c61305e919061522b565b82826007811061307157613070614711565b5b602002018181525050808061308590614a08565b915050612ffb565b5092915050565b5f6131d1825f600781106130ab576130aa614711565b5b6020020151600b805480602002602001604051908101604052809291908181526020015f905b82821015613179578382905f5260205f200180546130ee906145d0565b80601f016020809104026020016040519081016040528092919081815260200182805461311a906145d0565b80156131655780601f1061313c57610100808354040283529160200191613165565b820191905f5260205f20905b81548152906001019060200180831161314857829003601f168201915b5050505050815260200190600101906130d1565b50505050600d8054806020026020016040519081016040528092919081815260200182805480156131c757602002820191905f5260205f20905b8154815260200190600101908083116131b3575b5050505050613bbf565b90505f613311836001600781106131eb576131ea614711565b5b6020020151600e805480602002602001604051908101604052809291908181526020015f905b828210156132b9578382905f5260205f2001805461322e906145d0565b80601f016020809104026020016040519081016040528092919081815260200182805461325a906145d0565b80156132a55780601f1061327c576101008083540402835291602001916132a5565b820191905f5260205f20905b81548152906001019060200180831161328857829003601f168201915b505050505081526020019060010190613211565b50505050601080548060200260200160405190810160405280929190818152602001828054801561330757602002820191905f5260205f20905b8154815260200190600101908083116132f3575b5050505050613bbf565b90505f6134518460026007811061332b5761332a614711565b5b60200201516011805480602002602001604051908101604052809291908181526020015f905b828210156133f9578382905f5260205f2001805461336e906145d0565b80601f016020809104026020016040519081016040528092919081815260200182805461339a906145d0565b80156133e55780601f106133bc576101008083540402835291602001916133e5565b820191905f5260205f20905b8154815290600101906020018083116133c857829003601f168201915b505050505081526020019060010190613351565b50505050601380548060200260200160405190810160405280929190818152602001828054801561344757602002820191905f5260205f20905b815481526020019060010190808311613433575b5050505050613bbf565b90505f6135918560036007811061346b5761346a614711565b5b6020020151601a805480602002602001604051908101604052809291908181526020015f905b82821015613539578382905f5260205f200180546134ae906145d0565b80601f01602080910402602001604051908101604052809291908181526020018280546134da906145d0565b80156135255780601f106134fc57610100808354040283529160200191613525565b820191905f5260205f20905b81548152906001019060200180831161350857829003601f168201915b505050505081526020019060010190613491565b50505050601c80548060200260200160405190810160405280929190818152602001828054801561358757602002820191905f5260205f20905b815481526020019060010190808311613573575b5050505050613bbf565b90505f6136d1866004600781106135ab576135aa614711565b5b60200201516017805480602002602001604051908101604052809291908181526020015f905b82821015613679578382905f5260205f200180546135ee906145d0565b80601f016020809104026020016040519081016040528092919081815260200182805461361a906145d0565b80156136655780601f1061363c57610100808354040283529160200191613665565b820191905f5260205f20905b81548152906001019060200180831161364857829003601f168201915b5050505050815260200190600101906135d1565b5050505060198054806020026020016040519081016040528092919081815260200182805480156136c757602002820191905f5260205f20905b8154815260200190600101908083116136b3575b5050505050613bbf565b90505f613811876005600781106136eb576136ea614711565b5b6020020151601d805480602002602001604051908101604052809291908181526020015f905b828210156137b9578382905f5260205f2001805461372e906145d0565b80601f016020809104026020016040519081016040528092919081815260200182805461375a906145d0565b80156137a55780601f1061377c576101008083540402835291602001916137a5565b820191905f5260205f20905b81548152906001019060200180831161378857829003601f168201915b505050505081526020019060010190613711565b50505050601f80548060200260200160405190810160405280929190818152602001828054801561380757602002820191905f5260205f20905b8154815260200190600101908083116137f3575b5050505050613bbf565b90505f6139518860066007811061382b5761382a614711565b5b60200201516014805480602002602001604051908101604052809291908181526020015f905b828210156138f9578382905f5260205f2001805461386e906145d0565b80601f016020809104026020016040519081016040528092919081815260200182805461389a906145d0565b80156138e55780601f106138bc576101008083540402835291602001916138e5565b820191905f5260205f20905b8154815290600101906020018083116138c857829003601f168201915b505050505081526020019060010190613851565b50505050601680548060200260200160405190810160405280929190818152602001828054801561394757602002820191905f5260205f20905b815481526020019060010190808311613933575b5050505050613bbf565b90505f6040518060e001604052808981526020018881526020018781526020018381526020018581526020018681526020018481525090508060095f8c81526020019081526020015f205f820151815f01556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015590505050505050505050505050565b5f60016103e760235484604051602001613a09929190615b0c565b604051602081830303815290604052805190602001205f1c613a2b919061522b565b613a359190614bc8565b905080600a5f8481526020019081526020015f20819055505050565b613a6a828260405180602001604052805f815250613c9c565b5050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613aca577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381613ac057613abf6151fe565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613b07576d04ee2d6d415b85acef81000000008381613afd57613afc6151fe565b5b0492506020810190505b662386f26fc100008310613b3657662386f26fc100008381613b2c57613b2b6151fe565b5b0492506010810190505b6305f5e1008310613b5f576305f5e1008381613b5557613b546151fe565b5b0492506008810190505b6127108310613b84576127108381613b7a57613b796151fe565b5b0492506004810190505b60648310613ba75760648381613b9d57613b9c6151fe565b5b0492506002810190505b600a8310613bb6576001810190505b80915050919050565b5f80835111613c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bfa90615b81565b60405180910390fd5b8151835114613c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c3e90615c0f565b60405180910390fd5b5f5b8251811015613c9057828181518110613c6557613c64614711565b5b6020026020010151851015613c7d5780915050613c95565b8080613c8890614a08565b915050613c49565b505f90505b9392505050565b613ca68383613d33565b5f8373ffffffffffffffffffffffffffffffffffffffff163b14613d2e575f805490505f83820390505b613ce25f868380600101945086612a5b565b613d18576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110613cd057815f5414613d2b575f80fd5b50505b505050565b5f805490505f8203613d71576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d7d5f84838561221c565b600160406001901b17820260055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540192505081905550613def83613de05f865f612222565b613de985613edc565b17612249565b60045f8381526020019081526020015f20819055505f80838301905073ffffffffffffffffffffffffffffffffffffffff8516915082825f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600183015b818114613e895780835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600181019050613e50565b505f8203613ec3576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819055505050613ed75f848385612273565b505050565b5f6001821460e11b9050919050565b6040518060e00160405280600790602082028036833780820191505090505090565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613f5281613f1e565b8114613f5c575f80fd5b50565b5f81359050613f6d81613f49565b92915050565b5f60208284031215613f8857613f87613f16565b5b5f613f9584828501613f5f565b91505092915050565b5f8115159050919050565b613fb281613f9e565b82525050565b5f602082019050613fcb5f830184613fa9565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613ffa82613fd1565b9050919050565b61400a81613ff0565b8114614014575f80fd5b50565b5f8135905061402581614001565b92915050565b5f602082840312156140405761403f613f16565b5b5f61404d84828501614017565b91505092915050565b5f819050919050565b61406881614056565b82525050565b5f6020820190506140815f83018461405f565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156140be5780820151818401526020810190506140a3565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6140e382614087565b6140ed8185614091565b93506140fd8185602086016140a1565b614106816140c9565b840191505092915050565b5f6020820190508181035f83015261412981846140d9565b905092915050565b61413a81614056565b8114614144575f80fd5b50565b5f8135905061415581614131565b92915050565b5f602082840312156141705761416f613f16565b5b5f61417d84828501614147565b91505092915050565b61418f81613ff0565b82525050565b5f6020820190506141a85f830184614186565b92915050565b5f80604083850312156141c4576141c3613f16565b5b5f6141d185828601614017565b92505060206141e285828601614147565b9150509250929050565b5f805f6060848603121561420357614202613f16565b5b5f61421086828701614017565b935050602061422186828701614017565b925050604061423286828701614147565b9150509250925092565b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261425d5761425c61423c565b5b8235905067ffffffffffffffff81111561427a57614279614240565b5b60208301915083602082028301111561429657614295614244565b5b9250929050565b5f80602083850312156142b3576142b2613f16565b5b5f83013567ffffffffffffffff8111156142d0576142cf613f1a565b5b6142dc85828601614248565b92509250509250929050565b6142f181613f9e565b81146142fb575f80fd5b50565b5f8135905061430c816142e8565b92915050565b5f806040838503121561432857614327613f16565b5b5f61433585828601614017565b9250506020614346858286016142fe565b9150509250929050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61438a826140c9565b810181811067ffffffffffffffff821117156143a9576143a8614354565b5b80604052505050565b5f6143bb613f0d565b90506143c78282614381565b919050565b5f67ffffffffffffffff8211156143e6576143e5614354565b5b6143ef826140c9565b9050602081019050919050565b828183375f83830152505050565b5f61441c614417846143cc565b6143b2565b90508281526020810184848401111561443857614437614350565b5b6144438482856143fc565b509392505050565b5f82601f83011261445f5761445e61423c565b5b813561446f84826020860161440a565b91505092915050565b5f805f80608085870312156144905761448f613f16565b5b5f61449d87828801614017565b94505060206144ae87828801614017565b93505060406144bf87828801614147565b925050606085013567ffffffffffffffff8111156144e0576144df613f1a565b5b6144ec8782880161444b565b91505092959194509250565b5f60e08201905061450b5f83018a61405f565b614518602083018961405f565b614525604083018861405f565b614532606083018761405f565b61453f608083018661405f565b61454c60a083018561405f565b61455960c083018461405f565b98975050505050505050565b5f806040838503121561457b5761457a613f16565b5b5f61458885828601614017565b925050602061459985828601614017565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806145e757607f821691505b6020821081036145fa576145f96145a3565b5b50919050565b5f81905092915050565b50565b5f6146185f83614600565b91506146238261460a565b5f82019050919050565b5f6146378261460d565b9150819050919050565b7f5472616e73666572206661696c65642e000000000000000000000000000000005f82015250565b5f614675601083614091565b915061468082614641565b602082019050919050565b5f6020820190508181035f8301526146a281614669565b9050919050565b7f546f6b656e20646f6573206e6f742065786973740000000000000000000000005f82015250565b5f6146dd601483614091565b91506146e8826146a9565b602082019050919050565b5f6020820190508181035f83015261470a816146d1565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81905092915050565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f32305f8201527f30302f737667222076696577426f783d2230203020313620313622207368617060208201527f652d72656e646572696e673d2263726973704564676573222077696474683d2260408201527f35313222206865696768743d22353132223e0000000000000000000000000000606082015250565b5f6147ee60728361473e565b91506147f982614748565b607282019050919050565b7f3c726563742077696474683d22313622206865696768743d223136222066696c5f8201527f6c3d2223393963636666222f3e00000000000000000000000000000000000000602082015250565b5f61485e602d8361473e565b915061486982614804565b602d82019050919050565b5f61487e82614087565b614888818561473e565b93506148988185602086016140a1565b80840191505092915050565b7f3c2f7376673e00000000000000000000000000000000000000000000000000005f82015250565b5f6148d860068361473e565b91506148e3826148a4565b600682019050919050565b5f6148f8826147e2565b915061490382614852565b915061490f828a614874565b915061491b8289614874565b91506149278288614874565b91506149338287614874565b915061493f8286614874565b915061494b8285614874565b91506149578284614874565b9150614962826148cc565b915081905098975050505050505050565b7f436f6e74726f6c6c6572204f6e6c7900000000000000000000000000000000005f82015250565b5f6149a7600f83614091565b91506149b282614973565b602082019050919050565b5f6020820190508181035f8301526149d48161499b565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614a1282614056565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a4457614a436149db565b5b600182019050919050565b7f4d696e74206e6f742072656164792079657400000000000000000000000000005f82015250565b5f614a83601283614091565b9150614a8e82614a4f565b602082019050919050565b5f6020820190508181035f830152614ab081614a77565b9050919050565b5f614ac182614056565b9150614acc83614056565b9250828202614ada81614056565b91508282048414831517614af157614af06149db565b5b5092915050565b7f506c656173652073656e64207468652065786163742045544820616d6f756e745f82015250565b5f614b2c602083614091565b9150614b3782614af8565b602082019050919050565b5f6020820190508181035f830152614b5981614b20565b9050919050565b7f45786365656473206d6178206d696e7420706572207472616e73616374696f6e5f82015250565b5f614b94602083614091565b9150614b9f82614b60565b602082019050919050565b5f6020820190508181035f830152614bc181614b88565b9050919050565b5f614bd282614056565b9150614bdd83614056565b9250828201905080821115614bf557614bf46149db565b5b92915050565b7f45786365656473206d6178206d696e74207065722077616c6c657400000000005f82015250565b5f614c2f601b83614091565b9150614c3a82614bfb565b602082019050919050565b5f6020820190508181035f830152614c5c81614c23565b9050919050565b7f4e6f74206f6e2077686974656c697374000000000000000000000000000000005f82015250565b5f614c97601083614091565b9150614ca282614c63565b602082019050919050565b5f6020820190508181035f830152614cc481614c8b565b9050919050565b7f4e6f206d6f726520667265652044696e6f7321000000000000000000000000005f82015250565b5f614cff601383614091565b9150614d0a82614ccb565b602082019050919050565b5f6020820190508181035f830152614d2c81614cf3565b9050919050565b7f7b226e616d65223a20224f6e436861696e2044696e6f732023000000000000005f82015250565b5f614d6760198361473e565b9150614d7282614d33565b601982019050919050565b7f222c0000000000000000000000000000000000000000000000000000000000005f82015250565b5f614db160028361473e565b9150614dbc82614d7d565b600282019050919050565b7f226465736372697074696f6e223a20224f6e436861696e2044696e6f732068615f8201527f76652068617463686564206f6e2042617365202d20313030252073746f72656460208201527f206f6e2074686520426c6f636b636861696e222c000000000000000000000000604082015250565b5f614e4760548361473e565b9150614e5282614dc7565b605482019050919050565b7f2261747472696275746573223a205b00000000000000000000000000000000005f82015250565b5f614e91600f8361473e565b9150614e9c82614e5d565b600f82019050919050565b7f5d2c0000000000000000000000000000000000000000000000000000000000005f82015250565b5f614edb60028361473e565b9150614ee682614ea7565b600282019050919050565b7f22696d616765223a2022646174613a696d6167652f7376672b786d6c3b6261735f8201527f6536342c00000000000000000000000000000000000000000000000000000000602082015250565b5f614f4b60248361473e565b9150614f5682614ef1565b602482019050919050565b7f227d0000000000000000000000000000000000000000000000000000000000005f82015250565b5f614f9560028361473e565b9150614fa082614f61565b600282019050919050565b5f614fb582614d5b565b9150614fc18286614874565b9150614fcc82614da5565b9150614fd782614e3b565b9150614fe282614e85565b9150614fee8285614874565b9150614ff982614ecf565b915061500482614f3f565b91506150108284614874565b915061501b82614f89565b9150819050949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000005f82015250565b5f61505c601d8361473e565b915061506782615028565b601d82019050919050565b5f61507c82615050565b91506150888284614874565b915081905092915050565b7f536f6c64204f75742100000000000000000000000000000000000000000000005f82015250565b5f6150c7600983614091565b91506150d282615093565b602082019050919050565b5f6020820190508181035f8301526150f4816150bb565b9050919050565b7f546865206d696e74657220697320616e6f7468657220636f6e747261637400005f82015250565b5f61512f601e83614091565b915061513a826150fb565b602082019050919050565b5f6020820190508181035f83015261515c81615123565b9050919050565b5f61516d82614056565b915061517883614056565b92508282039050818111156151905761518f6149db565b5b92915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f6151ca601f83614091565b91506151d582615196565b602082019050919050565b5f6020820190508181035f8301526151f7816151be565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61523582614056565b915061524083614056565b9250826152505761524f6151fe565b5b828206905092915050565b7f496e76616c6964206e756d626572206f662072656163747300000000000000005f82015250565b5f61528f601883614091565b915061529a8261525b565b602082019050919050565b5f6020820190508181035f8301526152bc81615283565b9050919050565b5f6152cd82614056565b91506152d883614056565b9250826152e8576152e76151fe565b5b828204905092915050565b7f3c7265637420783d2200000000000000000000000000000000000000000000005f82015250565b5f61532760098361473e565b9150615332826152f3565b600982019050919050565b7f2220793d220000000000000000000000000000000000000000000000000000005f82015250565b5f61537160058361473e565b915061537c8261533d565b600582019050919050565b7f222077696474683d223122206865696768743d2231222066696c6c3d227267625f8201527f2800000000000000000000000000000000000000000000000000000000000000602082015250565b5f6153e160218361473e565b91506153ec82615387565b602182019050919050565b7f2c000000000000000000000000000000000000000000000000000000000000005f82015250565b5f61542b60018361473e565b9150615436826153f7565b600182019050919050565b7f2922202f3e0000000000000000000000000000000000000000000000000000005f82015250565b5f61547560058361473e565b915061548082615441565b600582019050919050565b5f6154968289614874565b91506154a18261531b565b91506154ad8288614874565b91506154b882615365565b91506154c48287614874565b91506154cf826153d5565b91506154db8286614874565b91506154e68261541f565b91506154f28285614874565b91506154fd8261541f565b91506155098284614874565b915061551482615469565b9150819050979650505050505050565b5f81519050919050565b5f82825260208201905092915050565b5f61554882615524565b615552818561552e565b93506155628185602086016140a1565b61556b816140c9565b840191505092915050565b5f6080820190506155895f830187614186565b6155966020830186614186565b6155a3604083018561405f565b81810360608301526155b5818461553e565b905095945050505050565b5f815190506155ce81613f49565b92915050565b5f602082840312156155e9576155e8613f16565b5b5f6155f6848285016155c0565b91505092915050565b7f7b2274726169745f74797065223a2244696e6f2045676773222c22646973706c5f8201527f61795f74797065223a20226e756d626572222c202276616c7565223a22000000602082015250565b5f615659603d8361473e565b9150615664826155ff565b603d82019050919050565b7f227d2c00000000000000000000000000000000000000000000000000000000005f82015250565b5f6156a360038361473e565b91506156ae8261566f565b600382019050919050565b7f7b2274726169745f74797065223a22426f6479222c202276616c7565223a22005f82015250565b5f6156ed601f8361473e565b91506156f8826156b9565b601f82019050919050565b5f819050815f5260205f209050919050565b5f8154615721816145d0565b61572b818661473e565b9450600182165f8114615745576001811461575a5761578c565b60ff198316865281151582028601935061578c565b61576385615703565b5f5b8381101561578457815481890152600182019150602081019050615765565b838801955050505b50505092915050565b7f7b2274726169745f74797065223a224368657374222c202276616c7565223a225f82015250565b5f6157c960208361473e565b91506157d482615795565b602082019050919050565b7f7b2274726169745f74797065223a2245796573222c202276616c7565223a22005f82015250565b5f615813601f8361473e565b915061581e826157df565b601f82019050919050565b7f7b2274726169745f74797065223a2246616365222c202276616c7565223a22005f82015250565b5f61585d601f8361473e565b915061586882615829565b601f82019050919050565b7f7b2274726169745f74797065223a2246656574222c202276616c7565223a22005f82015250565b5f6158a7601f8361473e565b91506158b282615873565b601f82019050919050565b7f7b2274726169745f74797065223a2248656164222c202276616c7565223a22005f82015250565b5f6158f1601f8361473e565b91506158fc826158bd565b601f82019050919050565b7f7b2274726169745f74797065223a225370696b6573222c202276616c7565223a5f8201527f2200000000000000000000000000000000000000000000000000000000000000602082015250565b5f61596160218361473e565b915061596c82615907565b602182019050919050565b5f6159818261564d565b915061598d828b614874565b915061599882615697565b91506159a3826156e1565b91506159af828a615715565b91506159ba82615697565b91506159c5826157bd565b91506159d18289615715565b91506159dc82615697565b91506159e782615807565b91506159f38288615715565b91506159fe82615697565b9150615a0982615851565b9150615a158287615715565b9150615a2082615697565b9150615a2b8261589b565b9150615a378286615715565b9150615a4282615697565b9150615a4d826158e5565b9150615a598285615715565b9150615a6482615697565b9150615a6f82615955565b9150615a7b8284615715565b9150615a8682614f89565b91508190509998505050505050505050565b5f819050919050565b5f819050919050565b615abb615ab682615a98565b615aa1565b82525050565b5f819050919050565b615adb615ad682614056565b615ac1565b82525050565b5f615aec8285615aaa565b602082019150615afc8284615aca565b6020820191508190509392505050565b5f615b178285615aca565b602082019150615b278284615aca565b6020820191508190509392505050565b7f456c656d656e747320617272617920697320656d7074790000000000000000005f82015250565b5f615b6b601783614091565b9150615b7682615b37565b602082019050919050565b5f6020820190508181035f830152615b9881615b5f565b9050919050565b7f456c656d656e747320616e642077656967687473206c656e677468206d69736d5f8201527f6174636800000000000000000000000000000000000000000000000000000000602082015250565b5f615bf9602483614091565b9150615c0482615b9f565b604082019050919050565b5f6020820190508181035f830152615c2681615bed565b905091905056fe3c7265637420783d22302220793d2230222077696474683d223022206865696768743d2230222066696c6c3d2272676228302c302c3029222f3e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220c3379405c74c81f23aacdbe1a99796fd5d3514bb9a4aa45f8f0d1e68dac4c95464736f6c63430008140033

Deployed Bytecode Sourcemap

97228:11657:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64011:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;97790:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64913:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71404:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70837:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60664:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75043:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;97916:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;108248:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;108694:186;;;;;;;;;;;;;:::i;:::-;;104417:921;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77964:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;108575:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;97527:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66306:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;97480:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61848:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44771:103;;;;;;;;;;;;;:::i;:::-;;108351:216;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;108046:89;;;;;;;;;;;;;:::i;:::-;;28734:37;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44096:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65089:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;98528:688;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71962:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;99224:366;;;;;;;;;;;;;:::i;:::-;;97568:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;97715:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78755:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;103461:948;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;97607:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;97438:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;97309:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;108143:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28662:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;72353:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;97672:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45029:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;97839:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64011:639;64096:4;64435:10;64420:25;;:11;:25;;;;:102;;;;64512:10;64497:25;;:11;:25;;;;64420:102;:179;;;;64589:10;64574:25;;:11;:25;;;;64420:179;64400:199;;64011:639;;;:::o;97790:42::-;;;;;;;;;;;;;;;;;:::o;64913:100::-;64967:13;65000:5;64993:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64913:100;:::o;71404:218::-;71480:7;71505:16;71513:7;71505;:16::i;:::-;71500:64;;71530:34;;;;;;;;;;;;;;71500:64;71584:15;:24;71600:7;71584:24;;;;;;;;;;;:30;;;;;;;;;;;;71577:37;;71404:218;;;:::o;70837:408::-;70926:13;70942:16;70950:7;70942;:16::i;:::-;70926:32;;70998:5;70975:28;;:19;:17;:19::i;:::-;:28;;;70971:175;;71023:44;71040:5;71047:19;:17;:19::i;:::-;71023:16;:44::i;:::-;71018:128;;71095:35;;;;;;;;;;;;;;71018:128;70971:175;71191:2;71158:15;:24;71174:7;71158:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;71229:7;71225:2;71209:28;;71218:5;71209:28;;;;;;;;;;;;70915:330;70837:408;;:::o;60664:323::-;60725:7;60953:15;:13;:15::i;:::-;60938:12;;60922:13;;:28;:46;60915:53;;60664:323;:::o;75043:2825::-;75185:27;75215;75234:7;75215:18;:27::i;:::-;75185:57;;75300:4;75259:45;;75275:19;75259:45;;;75255:86;;75313:28;;;;;;;;;;;;;;75255:86;75355:27;75384:23;75411:35;75438:7;75411:26;:35::i;:::-;75354:92;;;;75546:68;75571:15;75588:4;75594:19;:17;:19::i;:::-;75546:24;:68::i;:::-;75541:180;;75634:43;75651:4;75657:19;:17;:19::i;:::-;75634:16;:43::i;:::-;75629:92;;75686:35;;;;;;;;;;;;;;75629:92;75541:180;75752:1;75738:16;;:2;:16;;;75734:52;;75763:23;;;;;;;;;;;;;;75734:52;75799:43;75821:4;75827:2;75831:7;75840:1;75799:21;:43::i;:::-;75935:15;75932:160;;;76075:1;76054:19;76047:30;75932:160;76472:18;:24;76491:4;76472:24;;;;;;;;;;;;;;;;76470:26;;;;;;;;;;;;76541:18;:22;76560:2;76541:22;;;;;;;;;;;;;;;;76539:24;;;;;;;;;;;76863:146;76900:2;76949:45;76964:4;76970:2;76974:19;76949:14;:45::i;:::-;57063:8;76921:73;76863:18;:146::i;:::-;76834:17;:26;76852:7;76834:26;;;;;;;;;;;:175;;;;77180:1;57063:8;77129:19;:47;:52;77125:627;;77202:19;77234:1;77224:7;:11;77202:33;;77391:1;77357:17;:30;77375:11;77357:30;;;;;;;;;;;;:35;77353:384;;77495:13;;77480:11;:28;77476:242;;77675:19;77642:17;:30;77660:11;77642:30;;;;;;;;;;;:52;;;;77476:242;77353:384;77183:569;77125:627;77799:7;77795:2;77780:27;;77789:4;77780:27;;;;;;;;;;;;77818:42;77839:4;77845:2;77849:7;77858:1;77818:20;:42::i;:::-;75174:2694;;;75043:2825;;;:::o;97916:29::-;;;;;;;;;;;;;:::o;108248:95::-;43982:13;:11;:13::i;:::-;108311:24:::1;108325:9;108311:13;:24::i;:::-;108248:95:::0;:::o;108694:186::-;43982:13;:11;:13::i;:::-;2416:21:::1;:19;:21::i;:::-;108758:12:::2;108776:10;:15;;108799:21;108776:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;108757:68;;;108844:7;108836:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;108746:134;2460:20:::1;:18;:20::i;:::-;108694:186::o:0;104417:921::-;104470:13;104506:16;104514:7;104506;:16::i;:::-;104498:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;104560:30;104593:11;:20;104605:7;104593:20;;;;;;;;;;;104560:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;104626:17;104869:45;104886:9;104896:11;:16;;;104886:27;;;;;;;;:::i;:::-;;;;;;;;;104869:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:16;:45::i;:::-;104929:47;104946:10;104957:11;:17;;;104946:29;;;;;;;;:::i;:::-;;;;;;;;;104929:47;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:16;:47::i;:::-;104991:43;105008:8;105017:11;:15;;;105008:25;;;;;;;;:::i;:::-;;;;;;;;;104991:43;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:16;:43::i;:::-;105049:47;105066:10;105077:11;:17;;;105066:29;;;;;;;;:::i;:::-;;;;;;;;;105049:47;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:16;:47::i;:::-;105111:45;105128:9;105138:11;:16;;;105128:27;;;;;;;;:::i;:::-;;;;;;;;;105111:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:16;:45::i;:::-;105171;105188:9;105198:11;:16;;;105188:27;;;;;;;;:::i;:::-;;;;;;;;;105171:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:16;:45::i;:::-;105231;105248:9;105258:11;:16;;;105248:27;;;;;;;;:::i;:::-;;;;;;;;;105231:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:16;:45::i;:::-;104653:653;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;104626:681;;105325:3;105318:10;;;;104417:921;;;:::o;77964:193::-;78110:39;78127:4;78133:2;78137:7;78110:39;;;;;;;;;;;;:16;:39::i;:::-;77964:193;;;:::o;108575:111::-;43982:13;:11;:13::i;:::-;108670:8:::1;108653:14;;:25;;;;;;;;;;;;;;;;;;108575:111:::0;:::o;97527:34::-;;;;:::o;66306:152::-;66378:7;66421:27;66440:7;66421:18;:27::i;:::-;66398:52;;66306:152;;;:::o;97480:40::-;;;;:::o;61848:233::-;61920:7;61961:1;61944:19;;:5;:19;;;61940:60;;61972:28;;;;;;;;;;;;;;61940:60;56007:13;62018:18;:25;62037:5;62018:25;;;;;;;;;;;;;;;;:55;62011:62;;61848:233;;;:::o;44771:103::-;43982:13;:11;:13::i;:::-;44836:30:::1;44863:1;44836:18;:30::i;:::-;44771:103::o:0;108351:216::-;98017:14;;;;;;;;;;;98003:28;;:10;:28;;;97995:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;2416:21:::1;:19;:21::i;:::-;108462:6:::2;108457:103;108478:9;;:16;;108474:1;:20;108457:103;;;108544:4;108516:11;:25;108528:9;;108538:1;108528:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;108516:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;108496:3;;;;;:::i;:::-;;;;108457:103;;;;2460:20:::1;:18;:20::i;:::-;108351:216:::0;;:::o;108046:89::-;43982:13;:11;:13::i;:::-;108116:11:::1;;;;;;;;;;;108115:12;108101:11;;:26;;;;;;;;;;;;;;;;;;108046:89::o:0;28734:37::-;;;;;;;;;;;;;;;;;:::o;44096:87::-;44142:7;44169:6;;;;;;;;;;;44162:13;;44096:87;:::o;65089:104::-;65145:13;65178:7;65171:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65089:104;:::o;98528:688::-;98588:12;98603:9;;98588:24;;98631:11;;;;;;;;;;;98623:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;98708:4;98697:8;:15;;;;:::i;:::-;98684:9;:28;98676:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;98780:15;;98768:8;:27;;98760:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;98913:27;98968:8;98943:10;:22;98954:10;98943:22;;;;;;;;;;;;;;;;:33;;;;:::i;:::-;98913:63;;99018:16;;98995:19;:39;;98987:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;99127:19;99102:10;:22;99113:10;99102:22;;;;;;;;;;;;;;;;:44;;;;:::i;:::-;99077:10;:22;99088:10;99077:22;;;;;;;;;;;;;;;:69;;;;99185:23;99199:8;99185:13;:23::i;:::-;98577:639;;98528:688;:::o;71962:234::-;72109:8;72057:18;:39;72076:19;:17;:19::i;:::-;72057:39;;;;;;;;;;;;;;;:49;72097:8;72057:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;72169:8;72133:55;;72148:19;:17;:19::i;:::-;72133:55;;;72179:8;72133:55;;;;;;:::i;:::-;;;;;;;;71962:234;;:::o;99224:366::-;99300:4;99273:31;;:11;:23;99285:10;99273:23;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;99265:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;99344:11;;;;;;;;;;;99336:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;99414:7;;99409:1;99397:9;;:13;;;;:::i;:::-;:24;;99389:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;99484:5;99458:11;:23;99470:10;99458:23;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;99524:1;99512:9;;:13;;;;:::i;:::-;99500:9;:25;;;;99564:16;99578:1;99564:13;:16::i;:::-;99224:366::o;97568:32::-;;;;:::o;97715:38::-;;;;:::o;78755:407::-;78930:31;78943:4;78949:2;78953:7;78930:12;:31::i;:::-;78994:1;78976:2;:14;;;:19;78972:183;;79015:56;79046:4;79052:2;79056:7;79065:5;79015:30;:56::i;:::-;79010:145;;79099:40;;;;;;;;;;;;;;79010:145;78972:183;78755:407;;;;:::o;103461:948::-;103526:13;103574:19;103596:17;103605:7;103596:8;:17::i;:::-;103574:39;;103664:25;103692:27;103712:5;103692:13;:27::i;:::-;103664:55;;103764:18;103870:25;103887:7;103870:16;:25::i;:::-;104044:23;104059:7;104044:14;:23::i;:::-;104132:11;103806:358;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;103764:411;;104227:24;104254:26;104274:4;104254:13;:26::i;:::-;104227:53;;104389:10;104339:61;;;;;;;;:::i;:::-;;;;;;;;;;;;;104325:76;;;;;;103461:948;;;:::o;97607:36::-;;;;;;;;;;;;;:::o;97438:35::-;;;;:::o;97309:23::-;;;;;;;;;;;;;:::o;108143:97::-;43982:13;:11;:13::i;:::-;108221:11:::1;108211:7;:21;;;;108143:97:::0;:::o;28662:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;72353:164::-;72450:4;72474:18;:25;72493:5;72474:25;;;;;;;;;;;;;;;:35;72500:8;72474:35;;;;;;;;;;;;;;;;;;;;;;;;;72467:42;;72353:164;;;;:::o;97672:36::-;;;;:::o;45029:220::-;43982:13;:11;:13::i;:::-;45134:1:::1;45114:22;;:8;:22;;::::0;45110:93:::1;;45188:1;45160:31;;;;;;;;;;;:::i;:::-;;;;;;;;45110:93;45213:28;45232:8;45213:18;:28::i;:::-;45029:220:::0;:::o;97839:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;72775:282::-;72840:4;72896:7;72877:15;:13;:15::i;:::-;:26;;:66;;;;;72930:13;;72920:7;:23;72877:66;:153;;;;;73029:1;56783:8;72981:17;:26;72999:7;72981:26;;;;;;;;;;;;:44;:49;72877:153;72857:173;;72775:282;;;:::o;95083:105::-;95143:7;95170:10;95163:17;;95083:105;:::o;98427:93::-;98484:7;98511:1;98504:8;;98427:93;:::o;67461:1275::-;67528:7;67548:12;67563:7;67548:22;;67631:4;67612:15;:13;:15::i;:::-;:23;67608:1061;;67665:13;;67658:4;:20;67654:1015;;;67703:14;67720:17;:23;67738:4;67720:23;;;;;;;;;;;;67703:40;;67837:1;56783:8;67809:6;:24;:29;67805:845;;68474:113;68491:1;68481:6;:11;68474:113;;68534:17;:25;68552:6;;;;;;;68534:25;;;;;;;;;;;;68525:34;;68474:113;;;68620:6;68613:13;;;;;;67805:845;67680:989;67654:1015;67608:1061;68697:31;;;;;;;;;;;;;;67461:1275;;;;:::o;73938:485::-;74040:27;74069:23;74110:38;74151:15;:24;74167:7;74151:24;;;;;;;;;;;74110:65;;74328:18;74305:41;;74385:19;74379:26;74360:45;;74290:126;73938:485;;;:::o;73166:659::-;73315:11;73480:16;73473:5;73469:28;73460:37;;73640:16;73629:9;73625:32;73612:45;;73790:15;73779:9;73776:30;73768:5;73757:9;73754:20;73751:56;73741:66;;73166:659;;;;;:::o;79824:159::-;;;;;:::o;94392:311::-;94527:7;94547:16;57187:3;94573:19;:41;;94547:68;;57187:3;94641:31;94652:4;94658:2;94662:9;94641:10;:31::i;:::-;94633:40;;:62;;94626:69;;;94392:311;;;;;:::o;69284:450::-;69364:14;69532:16;69525:5;69521:28;69512:37;;69709:5;69695:11;69670:23;69666:41;69663:52;69656:5;69653:63;69643:73;;69284:450;;;;:::o;80648:158::-;;;;;:::o;44261:166::-;44332:12;:10;:12::i;:::-;44321:23;;:7;:5;:7::i;:::-;:23;;;44317:103;;44395:12;:10;:12::i;:::-;44368:40;;;;;;;;;;;:::i;:::-;;;;;;;;44317:103;44261:166::o;99598:880::-;99699:9;;99687:8;99670:14;:12;:14::i;:::-;:25;;;;:::i;:::-;:38;;99662:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;99755:9;99741:23;;:10;:23;;;99733:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;99861:17;99899:14;:12;:14::i;:::-;99881:15;:13;:15::i;:::-;:32;;;;:::i;:::-;99861:52;;99924:21;99960:12;99949:8;:23;;;;:::i;:::-;99924:48;;99989:15;100007:12;99989:30;;99985:347;100031:16;100021:7;:26;99985:347;;;100120:26;100149:34;100161:13;;100175:7;100149:11;:34::i;:::-;100120:63;;100244:36;100259:7;100268:11;100244:14;:36::i;:::-;100297:21;100310:7;100297:12;:21::i;:::-;100060:272;100049:9;;;;;:::i;:::-;;;;99985:347;;;;100383:1;100368:12;:16;;;;:::i;:::-;100358:27;100342:13;:43;;;;100414:12;100396:15;:30;;;;100437:31;100447:10;100459:8;100437:9;:31::i;:::-;99649:829;;99598:880;:::o;2496:293::-;1898:1;2630:7;;:19;2622:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1898:1;2763:7;:18;;;;2496:293::o;2797:213::-;1854:1;2980:7;:22;;;;2797:213::o;105346:1707::-;105414:13;105469:1;105464;105450:4;:11;:15;;;;:::i;:::-;:20;105442:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;105581:1;105566:4;:11;:16;105562:128;;105600:77;;;;;;;;;;;;;;;;;;;;;105562:128;105748:15;105780:1;105766:4;:11;:15;;;;:::i;:::-;105748:33;;105832:19;105864:15;105893:10;105882:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;105864:40;;105915:15;105944:10;105933:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;105915:40;;105966:15;105995:10;105984:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;105966:40;;106017:15;106046:10;106035:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;106017:40;;106068:15;106097:10;106086:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;106068:40;;106192:6;106187:834;106208:10;106204:1;:14;106187:834;;;106318:4;106327:1;106323;:5;;;;:::i;:::-;106318:11;;;;;;;;:::i;:::-;;;;;;;;;;106312:18;;106305:25;;:1;106307;106305:4;;;;;;;;:::i;:::-;;;;;;;:25;;;;;106358:4;106371:1;106367;106363;:5;;;;:::i;:::-;:9;;;;:::i;:::-;106358:15;;;;;;;;:::i;:::-;;;;;;;;;;106352:22;;106345:29;;:1;106347;106345:4;;;;;;;;:::i;:::-;;;;;;;:29;;;;;106402:4;106415:1;106411;106407;:5;;;;:::i;:::-;:9;;;;:::i;:::-;106402:15;;;;;;;;:::i;:::-;;;;;;;;;;106396:22;;106389:29;;:1;106391;106389:4;;;;;;;;:::i;:::-;;;;;;;:29;;;;;106446:4;106459:1;106455;106451;:5;;;;:::i;:::-;:9;;;;:::i;:::-;106446:15;;;;;;;;:::i;:::-;;;;;;;;;;106440:22;;106433:29;;:1;106435;106433:4;;;;;;;;:::i;:::-;;;;;;;:29;;;;;106490:4;106503:1;106499;106495;:5;;;;:::i;:::-;:9;;;;:::i;:::-;106490:15;;;;;;;;:::i;:::-;;;;;;;;;;106484:22;;106477:29;;:1;106479;106477:4;;;;;;;;:::i;:::-;;;;;;;:29;;;;;106570:18;106591:22;106608:1;106610;106608:4;;;;;;;;:::i;:::-;;;;;;;;106591:16;:22::i;:::-;106570:43;;106628:18;106649:22;106666:1;106668;106666:4;;;;;;;;:::i;:::-;;;;;;;;106649:16;:22::i;:::-;106628:43;;106686:18;106707:22;106724:1;106726;106724:4;;;;;;;;:::i;:::-;;;;;;;;106707:16;:22::i;:::-;106686:43;;106744:18;106765:22;106782:1;106784;106782:4;;;;;;;;:::i;:::-;;;;;;;;106765:16;:22::i;:::-;106744:43;;106802:18;106823:22;106840:1;106842;106840:4;;;;;;;;:::i;:::-;;;;;;;;106823:16;:22::i;:::-;106802:43;;106894:5;106914:4;106929;106972;106983;106994;106877:131;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;106862:147;;106225:796;;;;;106220:3;;;;;:::i;:::-;;;;106187:834;;;;107040:5;107033:12;;;;;;;;;105346:1707;;;;:::o;45409:191::-;45483:16;45502:6;;;;;;;;;;;45483:25;;45528:8;45519:6;;:17;;;;;;;;;;;;;;;;;;45583:8;45552:40;;45573:8;45552:40;;;;;;;;;;;;45472:128;45409:191;:::o;81246:716::-;81409:4;81455:2;81430:45;;;81476:19;:17;:19::i;:::-;81497:4;81503:7;81512:5;81430:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;81426:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81730:1;81713:6;:13;:18;81709:235;;81759:40;;;;;;;;;;;;;;81709:235;81902:6;81896:13;81887:6;81883:2;81879:15;81872:38;81426:529;81599:54;;;81589:64;;;:6;:64;;;;81582:71;;;81246:716;;;;;;:::o;24135:1912::-;24193:13;24238:1;24223:4;:11;:16;24219:31;;24241:9;;;;;;;;;;;;;;;;24219:31;24302:19;24324:12;;;;;;;;;;;;;;;;;24302:34;;24388:18;24434:1;24429;24415:4;:11;:15;;;;:::i;:::-;24414:21;;;;:::i;:::-;24409:1;:27;;;;:::i;:::-;24388:48;;24519:20;24566:2;24553:10;:15;;;;:::i;:::-;24542:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24519:50;;24666:10;24658:6;24651:26;24761:1;24754:5;24750:13;24820:4;24871;24865:11;24856:7;24852:25;24967:2;24959:6;24955:15;25040:754;25059:6;25050:7;25047:19;25040:754;;;25159:1;25150:7;25146:15;25135:26;;25198:7;25192:14;25324:4;25316:5;25312:2;25308:14;25304:25;25294:8;25290:40;25284:47;25273:9;25265:67;25378:1;25367:9;25363:17;25350:30;;25457:4;25449:5;25445:2;25441:14;25437:25;25427:8;25423:40;25417:47;25406:9;25398:67;25511:1;25500:9;25496:17;25483:30;;25590:4;25582:5;25579:1;25574:14;25570:25;25560:8;25556:40;25550:47;25539:9;25531:67;25644:1;25633:9;25629:17;25616:30;;25723:4;25715:5;25703:25;25693:8;25689:40;25683:47;25672:9;25664:67;25777:1;25766:9;25762:17;25749:30;;25083:711;25040:754;;;25867:1;25860:4;25854:11;25850:19;25888:1;25883:54;;;;25956:1;25951:52;;;;25843:160;;25883:54;25927:6;25922:3;25918:16;25914:1;25903:9;25899:17;25892:43;25883:54;;25951:52;25995:4;25990:3;25986:14;25982:1;25971:9;25967:17;25960:41;25843:160;;24591:1423;;;;26033:6;26026:13;;;;;24135:1912;;;;:::o;20806:718::-;20862:13;20913:14;20950:1;20930:17;20941:5;20930:10;:17::i;:::-;:21;20913:38;;20966:20;21000:6;20989:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20966:41;;21022:11;21151:6;21147:2;21143:15;21135:6;21131:28;21124:35;;21188:290;21195:4;21188:290;;;21220:5;;;;;;;;21362:10;21357:2;21350:5;21346:14;21341:32;21336:3;21328:46;21420:2;21411:11;;;;;;:::i;:::-;;;;;21454:1;21445:5;:10;21188:290;21441:21;21188:290;21499:6;21492:13;;;;;20806:718;;;:::o;107061:955::-;107122:13;107150:25;107178:11;:20;107190:7;107178:20;;;;;;;;;;;107150:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;107211:22;107236:35;107253:8;:17;107262:7;107253:17;;;;;;;;;;;;107236:16;:35::i;:::-;107211:60;;107284:22;107408:8;107469:11;107481:6;:11;;;107469:24;;;;;;;;:::i;:::-;;;;;;;;;107547:12;107560:6;:12;;;107547:26;;;;;;;;:::i;:::-;;;;;;;;;107626:10;107637:6;:10;;;107626:22;;;;;;;;:::i;:::-;;;;;;;;;107701:11;107713:6;:11;;;107701:24;;;;;;;;:::i;:::-;;;;;;;;;107778:11;107790:6;:11;;;107778:24;;;;;;;;:::i;:::-;;;;;;;;;107855:11;107867:6;:11;;;107855:24;;;;;;;;:::i;:::-;;;;;;;;;107934:12;107947:6;:12;;;107934:26;;;;;;;;:::i;:::-;;;;;;;;;107316:661;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;107284:694;;107998:8;107991:15;;;;;107061:955;;;:::o;94093:147::-;94230:6;94093:147;;;;;:::o;42105:98::-;42158:7;42185:10;42178:17;;42105:98;:::o;61085:296::-;61140:7;61347:15;:13;:15::i;:::-;61331:13;;:31;61324:38;;61085:296;:::o;100486:474::-;100572:27;;:::i;:::-;100720:3;100690:14;100706:8;100673:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;100663:53;;;;;;100655:62;;:68;;;;:::i;:::-;100637:12;100650:1;100637:15;;;;;;;:::i;:::-;;;;;:86;;;;;100779:6;100788:1;100779:10;;100774:147;100795:1;100791;:5;100774:147;;;100906:3;100871:12;100888:1;100884;:5;;;;:::i;:::-;100871:19;;;;;;;:::i;:::-;;;;;;100892:8;100854:47;;;;;;;;;:::i;:::-;;;;;;;;;;;;;100844:58;;;;;;100836:67;;:73;;;;:::i;:::-;100818:12;100831:1;100818:15;;;;;;;:::i;:::-;;;;;:91;;;;;100798:3;;;;;:::i;:::-;;;;100774:147;;;;100486:474;;;;:::o;100968:1186::-;101091:13;101109:69;101133:12;101146:1;101133:15;;;;;;;:::i;:::-;;;;;;101150:9;101109:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;101161:16;101109:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;:69::i;:::-;101091:87;;101189:14;101207:71;101231:12;101244:1;101231:15;;;;;;;:::i;:::-;;;;;;101248:10;101207:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;101260:17;101207:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;:71::i;:::-;101189:89;;101289:13;101307:67;101331:12;101344:1;101331:15;;;;;;;:::i;:::-;;;;;;101348:8;101307:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;101358:15;101307:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;:67::i;:::-;101289:85;;101385:13;101403:69;101427:12;101440:1;101427:15;;;;;;;:::i;:::-;;;;;;101444:9;101403:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;101455:16;101403:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;:69::i;:::-;101385:87;;101483:13;101501:69;101525:12;101538:1;101525:15;;;;;;;:::i;:::-;;;;;;101542:9;101501:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;101553:16;101501:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;:69::i;:::-;101483:87;;101581:15;101599:71;101623:12;101636:1;101623:15;;;;;;;:::i;:::-;;;;;;101640:10;101599:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;101652:17;101599:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;:71::i;:::-;101581:89;;101681:13;101699:69;101723:12;101736:1;101723:15;;;;;;;:::i;:::-;;;;;;101740:9;101699:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;101751:16;101699:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;:69::i;:::-;101681:87;;101783:28;101814:231;;;;;;;;101847:8;101814:231;;;;101877:9;101814:231;;;;101906:8;101814:231;;;;101935:8;101814:231;;;;101964:8;101814:231;;;;101993:8;101814:231;;;;102023:10;101814:231;;;101783:262;;102135:9;102111:11;:21;102123:8;102111:21;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;101045:1109;;;;;;;;100968:1186;;:::o;102733:196::-;102790:14;102879:1;102873:3;102842:15;;102859:8;102825:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;102815:54;;;;;;102807:63;;:69;;;;:::i;:::-;:73;;;;:::i;:::-;102790:90;;102912:9;102891:8;:18;102900:8;102891:18;;;;;;;;;;;:30;;;;102779:150;102733:196;:::o;88915:112::-;88992:27;89002:2;89006:8;88992:27;;;;;;;;;;;;:9;:27::i;:::-;88915:112;;:::o;17210:948::-;17263:7;17283:14;17300:1;17283:18;;17350:8;17341:5;:17;17337:106;;17388:8;17379:17;;;;;;:::i;:::-;;;;;17425:2;17415:12;;;;17337:106;17470:8;17461:5;:17;17457:106;;17508:8;17499:17;;;;;;:::i;:::-;;;;;17545:2;17535:12;;;;17457:106;17590:8;17581:5;:17;17577:106;;17628:8;17619:17;;;;;;:::i;:::-;;;;;17665:2;17655:12;;;;17577:106;17710:7;17701:5;:16;17697:103;;17747:7;17738:16;;;;;;:::i;:::-;;;;;17783:1;17773:11;;;;17697:103;17827:7;17818:5;:16;17814:103;;17864:7;17855:16;;;;;;:::i;:::-;;;;;17900:1;17890:11;;;;17814:103;17944:7;17935:5;:16;17931:103;;17981:7;17972:16;;;;;;:::i;:::-;;;;;18017:1;18007:11;;;;17931:103;18061:7;18052:5;:16;18048:68;;18099:1;18089:11;;;;18048:68;18144:6;18137:13;;;17210:948;;;:::o;102162:563::-;102288:4;102333:1;102313:10;:17;:21;102305:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;102402:16;:23;102381:10;:17;:44;102373:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;102492:6;102487:151;102508:16;:23;102504:1;:27;102487:151;;;102563:16;102580:1;102563:19;;;;;;;;:::i;:::-;;;;;;;;102556:4;:26;102553:74;;;102610:1;102603:8;;;;;102553:74;102533:3;;;;;:::i;:::-;;;;102487:151;;;;102716:1;102709:8;;102162:563;;;;;;:::o;88142:689::-;88273:19;88279:2;88283:8;88273:5;:19::i;:::-;88352:1;88334:2;:14;;;:19;88330:483;;88374:11;88388:13;;88374:27;;88420:13;88442:8;88436:3;:14;88420:30;;88469:233;88500:62;88539:1;88543:2;88547:7;;;;;;88556:5;88500:30;:62::i;:::-;88495:167;;88598:40;;;;;;;;;;;;;;88495:167;88697:3;88689:5;:11;88469:233;;88784:3;88767:13;;:20;88763:34;;88789:8;;;88763:34;88355:458;;88330:483;88142:689;;;:::o;82424:2966::-;82497:20;82520:13;;82497:36;;82560:1;82548:8;:13;82544:44;;82570:18;;;;;;;;;;;;;;82544:44;82601:61;82631:1;82635:2;82639:12;82653:8;82601:21;:61::i;:::-;83145:1;56145:2;83115:1;:26;;83114:32;83102:8;:45;83076:18;:22;83095:2;83076:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;83424:139;83461:2;83515:33;83538:1;83542:2;83546:1;83515:14;:33::i;:::-;83482:30;83503:8;83482:20;:30::i;:::-;:66;83424:18;:139::i;:::-;83390:17;:31;83408:12;83390:31;;;;;;;;;;;:173;;;;83580:16;83611:11;83640:8;83625:12;:23;83611:37;;84161:16;84157:2;84153:25;84141:37;;84533:12;84493:8;84452:1;84390:25;84331:1;84270;84243:335;84904:1;84890:12;84886:20;84844:346;84945:3;84936:7;84933:16;84844:346;;85163:7;85153:8;85150:1;85123:25;85120:1;85117;85112:59;84998:1;84989:7;84985:15;84974:26;;84844:346;;;84848:77;85235:1;85223:8;:13;85219:45;;85245:19;;;;;;;;;;;;;;85219:45;85297:3;85281:13;:19;;;;82850:2462;;85322:60;85351:1;85355:2;85359:12;85373:8;85322:20;:60::i;:::-;82486:2904;82424:2966;;:::o;69836:324::-;69906:14;70139:1;70129:8;70126:15;70100:24;70096:46;70086:56;;69836:324;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:122::-;1825:24;1843:5;1825:24;:::i;:::-;1818:5;1815:35;1805:63;;1864:1;1861;1854:12;1805:63;1752:122;:::o;1880:139::-;1926:5;1964:6;1951:20;1942:29;;1980:33;2007:5;1980:33;:::i;:::-;1880:139;;;;:::o;2025:329::-;2084:6;2133:2;2121:9;2112:7;2108:23;2104:32;2101:119;;;2139:79;;:::i;:::-;2101:119;2259:1;2284:53;2329:7;2320:6;2309:9;2305:22;2284:53;:::i;:::-;2274:63;;2230:117;2025:329;;;;:::o;2360:77::-;2397:7;2426:5;2415:16;;2360:77;;;:::o;2443:118::-;2530:24;2548:5;2530:24;:::i;:::-;2525:3;2518:37;2443:118;;:::o;2567:222::-;2660:4;2698:2;2687:9;2683:18;2675:26;;2711:71;2779:1;2768:9;2764:17;2755:6;2711:71;:::i;:::-;2567:222;;;;:::o;2795:99::-;2847:6;2881:5;2875:12;2865:22;;2795:99;;;:::o;2900:169::-;2984:11;3018:6;3013:3;3006:19;3058:4;3053:3;3049:14;3034:29;;2900:169;;;;:::o;3075:246::-;3156:1;3166:113;3180:6;3177:1;3174:13;3166:113;;;3265:1;3260:3;3256:11;3250:18;3246:1;3241:3;3237:11;3230:39;3202:2;3199:1;3195:10;3190:15;;3166:113;;;3313:1;3304:6;3299:3;3295:16;3288:27;3137:184;3075:246;;;:::o;3327:102::-;3368:6;3419:2;3415:7;3410:2;3403:5;3399:14;3395:28;3385:38;;3327:102;;;:::o;3435:377::-;3523:3;3551:39;3584:5;3551:39;:::i;:::-;3606:71;3670:6;3665:3;3606:71;:::i;:::-;3599:78;;3686:65;3744:6;3739:3;3732:4;3725:5;3721:16;3686:65;:::i;:::-;3776:29;3798:6;3776:29;:::i;:::-;3771:3;3767:39;3760:46;;3527:285;3435:377;;;;:::o;3818:313::-;3931:4;3969:2;3958:9;3954:18;3946:26;;4018:9;4012:4;4008:20;4004:1;3993:9;3989:17;3982:47;4046:78;4119:4;4110:6;4046:78;:::i;:::-;4038:86;;3818:313;;;;:::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:329::-;4469:6;4518:2;4506:9;4497:7;4493:23;4489:32;4486:119;;;4524:79;;:::i;:::-;4486:119;4644:1;4669:53;4714:7;4705:6;4694:9;4690:22;4669:53;:::i;:::-;4659:63;;4615:117;4410:329;;;;:::o;4745:118::-;4832:24;4850:5;4832:24;:::i;:::-;4827:3;4820:37;4745:118;;:::o;4869:222::-;4962:4;5000:2;4989:9;4985:18;4977:26;;5013:71;5081:1;5070:9;5066:17;5057:6;5013:71;:::i;:::-;4869:222;;;;:::o;5097:474::-;5165:6;5173;5222:2;5210:9;5201:7;5197:23;5193:32;5190:119;;;5228:79;;:::i;:::-;5190:119;5348:1;5373:53;5418:7;5409:6;5398:9;5394:22;5373:53;:::i;:::-;5363:63;;5319:117;5475:2;5501:53;5546:7;5537:6;5526:9;5522:22;5501:53;:::i;:::-;5491:63;;5446:118;5097:474;;;;;:::o;5577:619::-;5654:6;5662;5670;5719:2;5707:9;5698:7;5694:23;5690:32;5687:119;;;5725:79;;:::i;:::-;5687:119;5845:1;5870:53;5915:7;5906:6;5895:9;5891:22;5870:53;:::i;:::-;5860:63;;5816:117;5972:2;5998:53;6043:7;6034:6;6023:9;6019:22;5998:53;:::i;:::-;5988:63;;5943:118;6100:2;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6071:118;5577:619;;;;;:::o;6202:117::-;6311:1;6308;6301:12;6325:117;6434:1;6431;6424:12;6448:117;6557:1;6554;6547:12;6588:568;6661:8;6671:6;6721:3;6714:4;6706:6;6702:17;6698:27;6688:122;;6729:79;;:::i;:::-;6688:122;6842:6;6829:20;6819:30;;6872:18;6864:6;6861:30;6858:117;;;6894:79;;:::i;:::-;6858:117;7008:4;7000:6;6996:17;6984:29;;7062:3;7054:4;7046:6;7042:17;7032:8;7028:32;7025:41;7022:128;;;7069:79;;:::i;:::-;7022:128;6588:568;;;;;:::o;7162:559::-;7248:6;7256;7305:2;7293:9;7284:7;7280:23;7276:32;7273:119;;;7311:79;;:::i;:::-;7273:119;7459:1;7448:9;7444:17;7431:31;7489:18;7481:6;7478:30;7475:117;;;7511:79;;:::i;:::-;7475:117;7624:80;7696:7;7687:6;7676:9;7672:22;7624:80;:::i;:::-;7606:98;;;;7402:312;7162:559;;;;;:::o;7727:116::-;7797:21;7812:5;7797:21;:::i;:::-;7790:5;7787:32;7777:60;;7833:1;7830;7823:12;7777:60;7727:116;:::o;7849:133::-;7892:5;7930:6;7917:20;7908:29;;7946:30;7970:5;7946:30;:::i;:::-;7849:133;;;;:::o;7988:468::-;8053:6;8061;8110:2;8098:9;8089:7;8085:23;8081:32;8078:119;;;8116:79;;:::i;:::-;8078:119;8236:1;8261:53;8306:7;8297:6;8286:9;8282:22;8261:53;:::i;:::-;8251:63;;8207:117;8363:2;8389:50;8431:7;8422:6;8411:9;8407:22;8389:50;:::i;:::-;8379:60;;8334:115;7988:468;;;;;:::o;8462:117::-;8571:1;8568;8561:12;8585:180;8633:77;8630:1;8623:88;8730:4;8727:1;8720:15;8754:4;8751:1;8744:15;8771:281;8854:27;8876:4;8854:27;:::i;:::-;8846:6;8842:40;8984:6;8972:10;8969:22;8948:18;8936:10;8933:34;8930:62;8927:88;;;8995:18;;:::i;:::-;8927:88;9035:10;9031:2;9024:22;8814:238;8771:281;;:::o;9058:129::-;9092:6;9119:20;;:::i;:::-;9109:30;;9148:33;9176:4;9168:6;9148:33;:::i;:::-;9058:129;;;:::o;9193:307::-;9254:4;9344:18;9336:6;9333:30;9330:56;;;9366:18;;:::i;:::-;9330:56;9404:29;9426:6;9404:29;:::i;:::-;9396:37;;9488:4;9482;9478:15;9470:23;;9193:307;;;:::o;9506:146::-;9603:6;9598:3;9593;9580:30;9644:1;9635:6;9630:3;9626:16;9619:27;9506:146;;;:::o;9658:423::-;9735:5;9760:65;9776:48;9817:6;9776:48;:::i;:::-;9760:65;:::i;:::-;9751:74;;9848:6;9841:5;9834:21;9886:4;9879:5;9875:16;9924:3;9915:6;9910:3;9906:16;9903:25;9900:112;;;9931:79;;:::i;:::-;9900:112;10021:54;10068:6;10063:3;10058;10021:54;:::i;:::-;9741:340;9658:423;;;;;:::o;10100:338::-;10155:5;10204:3;10197:4;10189:6;10185:17;10181:27;10171:122;;10212:79;;:::i;:::-;10171:122;10329:6;10316:20;10354:78;10428:3;10420:6;10413:4;10405:6;10401:17;10354:78;:::i;:::-;10345:87;;10161:277;10100:338;;;;:::o;10444:943::-;10539:6;10547;10555;10563;10612:3;10600:9;10591:7;10587:23;10583:33;10580:120;;;10619:79;;:::i;:::-;10580:120;10739:1;10764:53;10809:7;10800:6;10789:9;10785:22;10764:53;:::i;:::-;10754:63;;10710:117;10866:2;10892:53;10937:7;10928:6;10917:9;10913:22;10892:53;:::i;:::-;10882:63;;10837:118;10994:2;11020:53;11065:7;11056:6;11045:9;11041:22;11020:53;:::i;:::-;11010:63;;10965:118;11150:2;11139:9;11135:18;11122:32;11181:18;11173:6;11170:30;11167:117;;;11203:79;;:::i;:::-;11167:117;11308:62;11362:7;11353:6;11342:9;11338:22;11308:62;:::i;:::-;11298:72;;11093:287;10444:943;;;;;;;:::o;11393:886::-;11654:4;11692:3;11681:9;11677:19;11669:27;;11706:71;11774:1;11763:9;11759:17;11750:6;11706:71;:::i;:::-;11787:72;11855:2;11844:9;11840:18;11831:6;11787:72;:::i;:::-;11869;11937:2;11926:9;11922:18;11913:6;11869:72;:::i;:::-;11951;12019:2;12008:9;12004:18;11995:6;11951:72;:::i;:::-;12033:73;12101:3;12090:9;12086:19;12077:6;12033:73;:::i;:::-;12116;12184:3;12173:9;12169:19;12160:6;12116:73;:::i;:::-;12199;12267:3;12256:9;12252:19;12243:6;12199:73;:::i;:::-;11393:886;;;;;;;;;;:::o;12285:474::-;12353:6;12361;12410:2;12398:9;12389:7;12385:23;12381:32;12378:119;;;12416:79;;:::i;:::-;12378:119;12536:1;12561:53;12606:7;12597:6;12586:9;12582:22;12561:53;:::i;:::-;12551:63;;12507:117;12663:2;12689:53;12734:7;12725:6;12714:9;12710:22;12689:53;:::i;:::-;12679:63;;12634:118;12285:474;;;;;:::o;12765:180::-;12813:77;12810:1;12803:88;12910:4;12907:1;12900:15;12934:4;12931:1;12924:15;12951:320;12995:6;13032:1;13026:4;13022:12;13012:22;;13079:1;13073:4;13069:12;13100:18;13090:81;;13156:4;13148:6;13144:17;13134:27;;13090:81;13218:2;13210:6;13207:14;13187:18;13184:38;13181:84;;13237:18;;:::i;:::-;13181:84;13002:269;12951:320;;;:::o;13277:147::-;13378:11;13415:3;13400:18;;13277:147;;;;:::o;13430:114::-;;:::o;13550:398::-;13709:3;13730:83;13811:1;13806:3;13730:83;:::i;:::-;13723:90;;13822:93;13911:3;13822:93;:::i;:::-;13940:1;13935:3;13931:11;13924:18;;13550:398;;;:::o;13954:379::-;14138:3;14160:147;14303:3;14160:147;:::i;:::-;14153:154;;14324:3;14317:10;;13954:379;;;:::o;14339:166::-;14479:18;14475:1;14467:6;14463:14;14456:42;14339:166;:::o;14511:366::-;14653:3;14674:67;14738:2;14733:3;14674:67;:::i;:::-;14667:74;;14750:93;14839:3;14750:93;:::i;:::-;14868:2;14863:3;14859:12;14852:19;;14511:366;;;:::o;14883:419::-;15049:4;15087:2;15076:9;15072:18;15064:26;;15136:9;15130:4;15126:20;15122:1;15111:9;15107:17;15100:47;15164:131;15290:4;15164:131;:::i;:::-;15156:139;;14883:419;;;:::o;15308:170::-;15448:22;15444:1;15436:6;15432:14;15425:46;15308:170;:::o;15484:366::-;15626:3;15647:67;15711:2;15706:3;15647:67;:::i;:::-;15640:74;;15723:93;15812:3;15723:93;:::i;:::-;15841:2;15836:3;15832:12;15825:19;;15484:366;;;:::o;15856:419::-;16022:4;16060:2;16049:9;16045:18;16037:26;;16109:9;16103:4;16099:20;16095:1;16084:9;16080:17;16073:47;16137:131;16263:4;16137:131;:::i;:::-;16129:139;;15856:419;;;:::o;16281:180::-;16329:77;16326:1;16319:88;16426:4;16423:1;16416:15;16450:4;16447:1;16440:15;16467:148;16569:11;16606:3;16591:18;;16467:148;;;;:::o;16621:517::-;16761:66;16757:1;16749:6;16745:14;16738:90;16862:66;16857:2;16849:6;16845:15;16838:91;16963:66;16958:2;16950:6;16946:15;16939:91;17064:66;17059:2;17051:6;17047:15;17040:91;16621:517;:::o;17144:404::-;17304:3;17325:86;17407:3;17402;17325:86;:::i;:::-;17318:93;;17420;17509:3;17420:93;:::i;:::-;17538:3;17533;17529:13;17522:20;;17144:404;;;:::o;17554:315::-;17694:66;17690:1;17682:6;17678:14;17671:90;17795:66;17790:2;17782:6;17778:15;17771:91;17554:315;:::o;17875:402::-;18035:3;18056:85;18138:2;18133:3;18056:85;:::i;:::-;18049:92;;18150:93;18239:3;18150:93;:::i;:::-;18268:2;18263:3;18259:12;18252:19;;17875:402;;;:::o;18283:390::-;18389:3;18417:39;18450:5;18417:39;:::i;:::-;18472:89;18554:6;18549:3;18472:89;:::i;:::-;18465:96;;18570:65;18628:6;18623:3;18616:4;18609:5;18605:16;18570:65;:::i;:::-;18660:6;18655:3;18651:16;18644:23;;18393:280;18283:390;;;;:::o;18679:156::-;18819:8;18815:1;18807:6;18803:14;18796:32;18679:156;:::o;18841:400::-;19001:3;19022:84;19104:1;19099:3;19022:84;:::i;:::-;19015:91;;19115:93;19204:3;19115:93;:::i;:::-;19233:1;19228:3;19224:11;19217:18;;18841:400;;;:::o;19247:2033::-;19970:3;19992:148;20136:3;19992:148;:::i;:::-;19985:155;;20157:148;20301:3;20157:148;:::i;:::-;20150:155;;20322:95;20413:3;20404:6;20322:95;:::i;:::-;20315:102;;20434:95;20525:3;20516:6;20434:95;:::i;:::-;20427:102;;20546:95;20637:3;20628:6;20546:95;:::i;:::-;20539:102;;20658:95;20749:3;20740:6;20658:95;:::i;:::-;20651:102;;20770:95;20861:3;20852:6;20770:95;:::i;:::-;20763:102;;20882:95;20973:3;20964:6;20882:95;:::i;:::-;20875:102;;20994:95;21085:3;21076:6;20994:95;:::i;:::-;20987:102;;21106:148;21250:3;21106:148;:::i;:::-;21099:155;;21271:3;21264:10;;19247:2033;;;;;;;;;;:::o;21286:165::-;21426:17;21422:1;21414:6;21410:14;21403:41;21286:165;:::o;21457:366::-;21599:3;21620:67;21684:2;21679:3;21620:67;:::i;:::-;21613:74;;21696:93;21785:3;21696:93;:::i;:::-;21814:2;21809:3;21805:12;21798:19;;21457:366;;;:::o;21829:419::-;21995:4;22033:2;22022:9;22018:18;22010:26;;22082:9;22076:4;22072:20;22068:1;22057:9;22053:17;22046:47;22110:131;22236:4;22110:131;:::i;:::-;22102:139;;21829:419;;;:::o;22254:180::-;22302:77;22299:1;22292:88;22399:4;22396:1;22389:15;22423:4;22420:1;22413:15;22440:233;22479:3;22502:24;22520:5;22502:24;:::i;:::-;22493:33;;22548:66;22541:5;22538:77;22535:103;;22618:18;;:::i;:::-;22535:103;22665:1;22658:5;22654:13;22647:20;;22440:233;;;:::o;22679:168::-;22819:20;22815:1;22807:6;22803:14;22796:44;22679:168;:::o;22853:366::-;22995:3;23016:67;23080:2;23075:3;23016:67;:::i;:::-;23009:74;;23092:93;23181:3;23092:93;:::i;:::-;23210:2;23205:3;23201:12;23194:19;;22853:366;;;:::o;23225:419::-;23391:4;23429:2;23418:9;23414:18;23406:26;;23478:9;23472:4;23468:20;23464:1;23453:9;23449:17;23442:47;23506:131;23632:4;23506:131;:::i;:::-;23498:139;;23225:419;;;:::o;23650:410::-;23690:7;23713:20;23731:1;23713:20;:::i;:::-;23708:25;;23747:20;23765:1;23747:20;:::i;:::-;23742:25;;23802:1;23799;23795:9;23824:30;23842:11;23824:30;:::i;:::-;23813:41;;24003:1;23994:7;23990:15;23987:1;23984:22;23964:1;23957:9;23937:83;23914:139;;24033:18;;:::i;:::-;23914:139;23698:362;23650:410;;;;:::o;24066:182::-;24206:34;24202:1;24194:6;24190:14;24183:58;24066:182;:::o;24254:366::-;24396:3;24417:67;24481:2;24476:3;24417:67;:::i;:::-;24410:74;;24493:93;24582:3;24493:93;:::i;:::-;24611:2;24606:3;24602:12;24595:19;;24254:366;;;:::o;24626:419::-;24792:4;24830:2;24819:9;24815:18;24807:26;;24879:9;24873:4;24869:20;24865:1;24854:9;24850:17;24843:47;24907:131;25033:4;24907:131;:::i;:::-;24899:139;;24626:419;;;:::o;25051:182::-;25191:34;25187:1;25179:6;25175:14;25168:58;25051:182;:::o;25239:366::-;25381:3;25402:67;25466:2;25461:3;25402:67;:::i;:::-;25395:74;;25478:93;25567:3;25478:93;:::i;:::-;25596:2;25591:3;25587:12;25580:19;;25239:366;;;:::o;25611:419::-;25777:4;25815:2;25804:9;25800:18;25792:26;;25864:9;25858:4;25854:20;25850:1;25839:9;25835:17;25828:47;25892:131;26018:4;25892:131;:::i;:::-;25884:139;;25611:419;;;:::o;26036:191::-;26076:3;26095:20;26113:1;26095:20;:::i;:::-;26090:25;;26129:20;26147:1;26129:20;:::i;:::-;26124:25;;26172:1;26169;26165:9;26158:16;;26193:3;26190:1;26187:10;26184:36;;;26200:18;;:::i;:::-;26184:36;26036:191;;;;:::o;26233:177::-;26373:29;26369:1;26361:6;26357:14;26350:53;26233:177;:::o;26416:366::-;26558:3;26579:67;26643:2;26638:3;26579:67;:::i;:::-;26572:74;;26655:93;26744:3;26655:93;:::i;:::-;26773:2;26768:3;26764:12;26757:19;;26416:366;;;:::o;26788:419::-;26954:4;26992:2;26981:9;26977:18;26969:26;;27041:9;27035:4;27031:20;27027:1;27016:9;27012:17;27005:47;27069:131;27195:4;27069:131;:::i;:::-;27061:139;;26788:419;;;:::o;27213:166::-;27353:18;27349:1;27341:6;27337:14;27330:42;27213:166;:::o;27385:366::-;27527:3;27548:67;27612:2;27607:3;27548:67;:::i;:::-;27541:74;;27624:93;27713:3;27624:93;:::i;:::-;27742:2;27737:3;27733:12;27726:19;;27385:366;;;:::o;27757:419::-;27923:4;27961:2;27950:9;27946:18;27938:26;;28010:9;28004:4;28000:20;27996:1;27985:9;27981:17;27974:47;28038:131;28164:4;28038:131;:::i;:::-;28030:139;;27757:419;;;:::o;28182:169::-;28322:21;28318:1;28310:6;28306:14;28299:45;28182:169;:::o;28357:366::-;28499:3;28520:67;28584:2;28579:3;28520:67;:::i;:::-;28513:74;;28596:93;28685:3;28596:93;:::i;:::-;28714:2;28709:3;28705:12;28698:19;;28357:366;;;:::o;28729:419::-;28895:4;28933:2;28922:9;28918:18;28910:26;;28982:9;28976:4;28972:20;28968:1;28957:9;28953:17;28946:47;29010:131;29136:4;29010:131;:::i;:::-;29002:139;;28729:419;;;:::o;29154:214::-;29294:66;29290:1;29282:6;29278:14;29271:90;29154:214;:::o;29374:402::-;29534:3;29555:85;29637:2;29632:3;29555:85;:::i;:::-;29548:92;;29649:93;29738:3;29649:93;:::i;:::-;29767:2;29762:3;29758:12;29751:19;;29374:402;;;:::o;29782:214::-;29922:66;29918:1;29910:6;29906:14;29899:90;29782:214;:::o;30002:400::-;30162:3;30183:84;30265:1;30260:3;30183:84;:::i;:::-;30176:91;;30276:93;30365:3;30276:93;:::i;:::-;30394:1;30389:3;30385:11;30378:18;;30002:400;;;:::o;30408:384::-;30548:66;30544:1;30536:6;30532:14;30525:90;30649:34;30644:2;30636:6;30632:15;30625:59;30718:66;30713:2;30705:6;30701:15;30694:91;30408:384;:::o;30798:402::-;30958:3;30979:85;31061:2;31056:3;30979:85;:::i;:::-;30972:92;;31073:93;31162:3;31073:93;:::i;:::-;31191:2;31186:3;31182:12;31175:19;;30798:402;;;:::o;31206:214::-;31346:66;31342:1;31334:6;31330:14;31323:90;31206:214;:::o;31426:402::-;31586:3;31607:85;31689:2;31684:3;31607:85;:::i;:::-;31600:92;;31701:93;31790:3;31701:93;:::i;:::-;31819:2;31814:3;31810:12;31803:19;;31426:402;;;:::o;31834:152::-;31974:4;31970:1;31962:6;31958:14;31951:28;31834:152;:::o;31992:400::-;32152:3;32173:84;32255:1;32250:3;32173:84;:::i;:::-;32166:91;;32266:93;32355:3;32266:93;:::i;:::-;32384:1;32379:3;32375:11;32368:18;;31992:400;;;:::o;32398:255::-;32538:66;32534:1;32526:6;32522:14;32515:90;32639:6;32634:2;32626:6;32622:15;32615:31;32398:255;:::o;32659:402::-;32819:3;32840:85;32922:2;32917:3;32840:85;:::i;:::-;32833:92;;32934:93;33023:3;32934:93;:::i;:::-;33052:2;33047:3;33043:12;33036:19;;32659:402;;;:::o;33067:214::-;33207:66;33203:1;33195:6;33191:14;33184:90;33067:214;:::o;33287:400::-;33447:3;33468:84;33550:1;33545:3;33468:84;:::i;:::-;33461:91;;33561:93;33650:3;33561:93;:::i;:::-;33679:1;33674:3;33670:11;33663:18;;33287:400;;;:::o;33693:2457::-;34628:3;34650:148;34794:3;34650:148;:::i;:::-;34643:155;;34815:95;34906:3;34897:6;34815:95;:::i;:::-;34808:102;;34927:148;35071:3;34927:148;:::i;:::-;34920:155;;35092:148;35236:3;35092:148;:::i;:::-;35085:155;;35257:148;35401:3;35257:148;:::i;:::-;35250:155;;35422:95;35513:3;35504:6;35422:95;:::i;:::-;35415:102;;35534:148;35678:3;35534:148;:::i;:::-;35527:155;;35699:148;35843:3;35699:148;:::i;:::-;35692:155;;35864:95;35955:3;35946:6;35864:95;:::i;:::-;35857:102;;35976:148;36120:3;35976:148;:::i;:::-;35969:155;;36141:3;36134:10;;33693:2457;;;;;;:::o;36156:179::-;36296:31;36292:1;36284:6;36280:14;36273:55;36156:179;:::o;36341:402::-;36501:3;36522:85;36604:2;36599:3;36522:85;:::i;:::-;36515:92;;36616:93;36705:3;36616:93;:::i;:::-;36734:2;36729:3;36725:12;36718:19;;36341:402;;;:::o;36749:541::-;36982:3;37004:148;37148:3;37004:148;:::i;:::-;36997:155;;37169:95;37260:3;37251:6;37169:95;:::i;:::-;37162:102;;37281:3;37274:10;;36749:541;;;;:::o;37296:159::-;37436:11;37432:1;37424:6;37420:14;37413:35;37296:159;:::o;37461:365::-;37603:3;37624:66;37688:1;37683:3;37624:66;:::i;:::-;37617:73;;37699:93;37788:3;37699:93;:::i;:::-;37817:2;37812:3;37808:12;37801:19;;37461:365;;;:::o;37832:419::-;37998:4;38036:2;38025:9;38021:18;38013:26;;38085:9;38079:4;38075:20;38071:1;38060:9;38056:17;38049:47;38113:131;38239:4;38113:131;:::i;:::-;38105:139;;37832:419;;;:::o;38257:180::-;38397:32;38393:1;38385:6;38381:14;38374:56;38257:180;:::o;38443:366::-;38585:3;38606:67;38670:2;38665:3;38606:67;:::i;:::-;38599:74;;38682:93;38771:3;38682:93;:::i;:::-;38800:2;38795:3;38791:12;38784:19;;38443:366;;;:::o;38815:419::-;38981:4;39019:2;39008:9;39004:18;38996:26;;39068:9;39062:4;39058:20;39054:1;39043:9;39039:17;39032:47;39096:131;39222:4;39096:131;:::i;:::-;39088:139;;38815:419;;;:::o;39240:194::-;39280:4;39300:20;39318:1;39300:20;:::i;:::-;39295:25;;39334:20;39352:1;39334:20;:::i;:::-;39329:25;;39378:1;39375;39371:9;39363:17;;39402:1;39396:4;39393:11;39390:37;;;39407:18;;:::i;:::-;39390:37;39240:194;;;;:::o;39440:181::-;39580:33;39576:1;39568:6;39564:14;39557:57;39440:181;:::o;39627:366::-;39769:3;39790:67;39854:2;39849:3;39790:67;:::i;:::-;39783:74;;39866:93;39955:3;39866:93;:::i;:::-;39984:2;39979:3;39975:12;39968:19;;39627:366;;;:::o;39999:419::-;40165:4;40203:2;40192:9;40188:18;40180:26;;40252:9;40246:4;40242:20;40238:1;40227:9;40223:17;40216:47;40280:131;40406:4;40280:131;:::i;:::-;40272:139;;39999:419;;;:::o;40424:180::-;40472:77;40469:1;40462:88;40569:4;40566:1;40559:15;40593:4;40590:1;40583:15;40610:176;40642:1;40659:20;40677:1;40659:20;:::i;:::-;40654:25;;40693:20;40711:1;40693:20;:::i;:::-;40688:25;;40732:1;40722:35;;40737:18;;:::i;:::-;40722:35;40778:1;40775;40771:9;40766:14;;40610:176;;;;:::o;40792:174::-;40932:26;40928:1;40920:6;40916:14;40909:50;40792:174;:::o;40972:366::-;41114:3;41135:67;41199:2;41194:3;41135:67;:::i;:::-;41128:74;;41211:93;41300:3;41211:93;:::i;:::-;41329:2;41324:3;41320:12;41313:19;;40972:366;;;:::o;41344:419::-;41510:4;41548:2;41537:9;41533:18;41525:26;;41597:9;41591:4;41587:20;41583:1;41572:9;41568:17;41561:47;41625:131;41751:4;41625:131;:::i;:::-;41617:139;;41344:419;;;:::o;41769:185::-;41809:1;41826:20;41844:1;41826:20;:::i;:::-;41821:25;;41860:20;41878:1;41860:20;:::i;:::-;41855:25;;41899:1;41889:35;;41904:18;;:::i;:::-;41889:35;41946:1;41943;41939:9;41934:14;;41769:185;;;;:::o;41960:214::-;42100:66;42096:1;42088:6;42084:14;42077:90;41960:214;:::o;42180:400::-;42340:3;42361:84;42443:1;42438:3;42361:84;:::i;:::-;42354:91;;42454:93;42543:3;42454:93;:::i;:::-;42572:1;42567:3;42563:11;42556:18;;42180:400;;;:::o;42586:214::-;42726:66;42722:1;42714:6;42710:14;42703:90;42586:214;:::o;42806:400::-;42966:3;42987:84;43069:1;43064:3;42987:84;:::i;:::-;42980:91;;43080:93;43169:3;43080:93;:::i;:::-;43198:1;43193:3;43189:11;43182:18;;42806:400;;;:::o;43212:256::-;43352:66;43348:1;43340:6;43336:14;43329:90;43453:3;43448:2;43440:6;43436:15;43429:28;43212:256;:::o;43478:418::-;43638:3;43663:85;43745:2;43740:3;43663:85;:::i;:::-;43656:92;;43761:93;43850:3;43761:93;:::i;:::-;43883:2;43878:3;43874:12;43867:19;;43478:418;;;:::o;43906:159::-;44050:3;44046:1;44038:6;44034:14;44027:27;43906:159;:::o;44075:416::-;44235:3;44260:84;44342:1;44337:3;44260:84;:::i;:::-;44253:91;;44357:93;44446:3;44357:93;:::i;:::-;44479:1;44474:3;44470:11;44463:18;;44075:416;;;:::o;44501:222::-;44645:66;44641:1;44633:6;44629:14;44622:90;44501:222;:::o;44733:416::-;44893:3;44918:84;45000:1;44995:3;44918:84;:::i;:::-;44911:91;;45015:93;45104:3;45015:93;:::i;:::-;45137:1;45132:3;45128:11;45121:18;;44733:416;;;:::o;45159:2727::-;46137:3;46163:95;46254:3;46245:6;46163:95;:::i;:::-;46156:102;;46279:148;46423:3;46279:148;:::i;:::-;46272:155;;46448:95;46539:3;46530:6;46448:95;:::i;:::-;46441:102;;46564:148;46708:3;46564:148;:::i;:::-;46557:155;;46733:95;46824:3;46815:6;46733:95;:::i;:::-;46726:102;;46849:148;46993:3;46849:148;:::i;:::-;46842:155;;47018:95;47109:3;47100:6;47018:95;:::i;:::-;47011:102;;47134:148;47278:3;47134:148;:::i;:::-;47127:155;;47303:95;47394:3;47385:6;47303:95;:::i;:::-;47296:102;;47419:148;47563:3;47419:148;:::i;:::-;47412:155;;47588:95;47679:3;47670:6;47588:95;:::i;:::-;47581:102;;47704:148;47848:3;47704:148;:::i;:::-;47697:155;;47873:3;47866:10;;45159:2727;;;;;;;;;:::o;47896:106::-;47947:6;47985:5;47979:12;47969:22;;47896:106;;;:::o;48012:180::-;48095:11;48133:6;48128:3;48121:19;48177:4;48172:3;48168:14;48153:29;;48012:180;;;;:::o;48202:393::-;48288:3;48320:38;48352:5;48320:38;:::i;:::-;48378:70;48441:6;48436:3;48378:70;:::i;:::-;48371:77;;48461:65;48519:6;48514:3;48507:4;48500:5;48496:16;48461:65;:::i;:::-;48555:29;48577:6;48555:29;:::i;:::-;48550:3;48546:39;48539:46;;48292:303;48202:393;;;;:::o;48605:668::-;48800:4;48842:3;48831:9;48827:19;48819:27;;48860:71;48928:1;48917:9;48913:17;48904:6;48860:71;:::i;:::-;48945:72;49013:2;49002:9;48998:18;48989:6;48945:72;:::i;:::-;49031;49099:2;49088:9;49084:18;49075:6;49031:72;:::i;:::-;49154:9;49148:4;49144:20;49139:2;49128:9;49124:18;49117:48;49186:76;49257:4;49248:6;49186:76;:::i;:::-;49178:84;;48605:668;;;;;;;:::o;49283:153::-;49339:5;49374:6;49368:13;49359:22;;49394:32;49420:5;49394:32;:::i;:::-;49283:153;;;;:::o;49446:373::-;49515:6;49568:2;49556:9;49547:7;49543:23;49539:32;49536:119;;;49574:79;;:::i;:::-;49536:119;49702:1;49731:63;49786:7;49777:6;49766:9;49762:22;49731:63;:::i;:::-;49721:73;;49669:139;49446:373;;;;:::o;49829:327::-;49973:66;49969:1;49961:6;49957:14;49950:90;50078:66;50073:2;50065:6;50061:15;50054:91;49829:327;:::o;50166:418::-;50326:3;50351:85;50433:2;50428:3;50351:85;:::i;:::-;50344:92;;50449:93;50538:3;50449:93;:::i;:::-;50571:2;50566:3;50562:12;50555:19;;50166:418;;;:::o;50594:222::-;50738:66;50734:1;50726:6;50722:14;50715:90;50594:222;:::o;50826:416::-;50986:3;51011:84;51093:1;51088:3;51011:84;:::i;:::-;51004:91;;51108:93;51197:3;51108:93;:::i;:::-;51230:1;51225:3;51221:11;51214:18;;50826:416;;;:::o;51252:222::-;51396:66;51392:1;51384:6;51380:14;51373:90;51252:222;:::o;51484:418::-;51644:3;51669:85;51751:2;51746:3;51669:85;:::i;:::-;51662:92;;51767:93;51856:3;51767:93;:::i;:::-;51889:2;51884:3;51880:12;51873:19;;51484:418;;;:::o;51912:157::-;51961:4;51988:3;51980:11;;52015:3;52012:1;52005:14;52053:4;52050:1;52040:18;52032:26;;51912:157;;;:::o;52107:954::-;52210:3;52251:5;52245:12;52284:36;52310:9;52284:36;:::i;:::-;52340:89;52422:6;52417:3;52340:89;:::i;:::-;52333:96;;52464:1;52453:9;52449:17;52484:1;52479:182;;;;52679:1;52674:377;;;;52442:609;;52479:182;52571:4;52567:9;52556;52552:25;52547:3;52540:38;52637:6;52630:14;52623:22;52615:6;52611:35;52606:3;52602:45;52595:52;;52479:182;;52674:377;52749:38;52781:5;52749:38;:::i;:::-;52813:1;52831:166;52845:6;52842:1;52839:13;52831:166;;;52923:7;52917:14;52913:1;52908:3;52904:11;52897:35;52977:1;52968:7;52964:15;52953:26;;52867:4;52864:1;52860:12;52855:17;;52831:166;;;53030:6;53025:3;53021:16;53014:23;;52681:370;;52442:609;;52214:847;;52107:954;;;;:::o;53071:222::-;53215:66;53211:1;53203:6;53199:14;53192:90;53071:222;:::o;53303:418::-;53463:3;53488:85;53570:2;53565:3;53488:85;:::i;:::-;53481:92;;53586:93;53675:3;53586:93;:::i;:::-;53708:2;53703:3;53699:12;53692:19;;53303:418;;;:::o;53731:222::-;53875:66;53871:1;53863:6;53859:14;53852:90;53731:222;:::o;53963:418::-;54123:3;54148:85;54230:2;54225:3;54148:85;:::i;:::-;54141:92;;54246:93;54335:3;54246:93;:::i;:::-;54368:2;54363:3;54359:12;54352:19;;53963:418;;;:::o;54391:222::-;54535:66;54531:1;54523:6;54519:14;54512:90;54391:222;:::o;54623:418::-;54783:3;54808:85;54890:2;54885:3;54808:85;:::i;:::-;54801:92;;54906:93;54995:3;54906:93;:::i;:::-;55028:2;55023:3;55019:12;55012:19;;54623:418;;;:::o;55051:222::-;55195:66;55191:1;55183:6;55179:14;55172:90;55051:222;:::o;55283:418::-;55443:3;55468:85;55550:2;55545:3;55468:85;:::i;:::-;55461:92;;55566:93;55655:3;55566:93;:::i;:::-;55688:2;55683:3;55679:12;55672:19;;55283:418;;;:::o;55711:222::-;55855:66;55851:1;55843:6;55839:14;55832:90;55711:222;:::o;55943:418::-;56103:3;56128:85;56210:2;56205:3;56128:85;:::i;:::-;56121:92;;56226:93;56315:3;56226:93;:::i;:::-;56348:2;56343:3;56339:12;56332:19;;55943:418;;;:::o;56371:327::-;56515:66;56511:1;56503:6;56499:14;56492:90;56620:66;56615:2;56607:6;56603:15;56596:91;56371:327;:::o;56708:418::-;56868:3;56893:85;56975:2;56970:3;56893:85;:::i;:::-;56886:92;;56991:93;57080:3;56991:93;:::i;:::-;57113:2;57108:3;57104:12;57097:19;;56708:418;;;:::o;57136:5713::-;59199:3;59225:148;59369:3;59225:148;:::i;:::-;59218:155;;59394:95;59485:3;59476:6;59394:95;:::i;:::-;59387:102;;59510:148;59654:3;59510:148;:::i;:::-;59503:155;;59679:148;59823:3;59679:148;:::i;:::-;59672:155;;59848:92;59936:3;59927:6;59848:92;:::i;:::-;59841:99;;59961:148;60105:3;59961:148;:::i;:::-;59954:155;;60130:148;60274:3;60130:148;:::i;:::-;60123:155;;60299:92;60387:3;60378:6;60299:92;:::i;:::-;60292:99;;60412:148;60556:3;60412:148;:::i;:::-;60405:155;;60581:148;60725:3;60581:148;:::i;:::-;60574:155;;60750:92;60838:3;60829:6;60750:92;:::i;:::-;60743:99;;60863:148;61007:3;60863:148;:::i;:::-;60856:155;;61032:148;61176:3;61032:148;:::i;:::-;61025:155;;61201:92;61289:3;61280:6;61201:92;:::i;:::-;61194:99;;61314:148;61458:3;61314:148;:::i;:::-;61307:155;;61483:148;61627:3;61483:148;:::i;:::-;61476:155;;61652:92;61740:3;61731:6;61652:92;:::i;:::-;61645:99;;61765:148;61909:3;61765:148;:::i;:::-;61758:155;;61934:148;62078:3;61934:148;:::i;:::-;61927:155;;62103:92;62191:3;62182:6;62103:92;:::i;:::-;62096:99;;62216:148;62360:3;62216:148;:::i;:::-;62209:155;;62385:148;62529:3;62385:148;:::i;:::-;62378:155;;62554:92;62642:3;62633:6;62554:92;:::i;:::-;62547:99;;62667:148;62811:3;62667:148;:::i;:::-;62660:155;;62836:3;62829:10;;57136:5713;;;;;;;;;;;:::o;62859:85::-;62896:7;62929:5;62918:16;;62859:85;;;:::o;62954:87::-;62993:7;63026:5;63015:16;;62954:87;;;:::o;63051:165::-;63160:45;63180:24;63198:5;63180:24;:::i;:::-;63160:45;:::i;:::-;63155:3;63148:58;63051:165;;:::o;63226:87::-;63265:7;63298:5;63287:16;;63226:87;;;:::o;63323:165::-;63432:45;63452:24;63470:5;63452:24;:::i;:::-;63432:45;:::i;:::-;63427:3;63420:58;63323:165;;:::o;63498:421::-;63638:3;63657:75;63728:3;63719:6;63657:75;:::i;:::-;63761:2;63756:3;63752:12;63745:19;;63778:75;63849:3;63840:6;63778:75;:::i;:::-;63882:2;63877:3;63873:12;63866:19;;63906:3;63899:10;;63498:421;;;;;:::o;63929:::-;64069:3;64088:75;64159:3;64150:6;64088:75;:::i;:::-;64192:2;64187:3;64183:12;64176:19;;64209:75;64280:3;64271:6;64209:75;:::i;:::-;64313:2;64308:3;64304:12;64297:19;;64337:3;64330:10;;63929:421;;;;;:::o;64360:181::-;64504:25;64500:1;64492:6;64488:14;64481:49;64360:181;:::o;64551:382::-;64693:3;64718:67;64782:2;64777:3;64718:67;:::i;:::-;64711:74;;64798:93;64887:3;64798:93;:::i;:::-;64920:2;64915:3;64911:12;64904:19;;64551:382;;;:::o;64943:435::-;65109:4;65151:2;65140:9;65136:18;65128:26;;65204:9;65198:4;65194:20;65190:1;65179:9;65175:17;65168:47;65236:131;65362:4;65236:131;:::i;:::-;65228:139;;64943:435;;;:::o;65388:235::-;65532:34;65528:1;65520:6;65516:14;65509:58;65605:6;65600:2;65592:6;65588:15;65581:31;65388:235;:::o;65633:382::-;65775:3;65800:67;65864:2;65859:3;65800:67;:::i;:::-;65793:74;;65880:93;65969:3;65880:93;:::i;:::-;66002:2;65997:3;65993:12;65986:19;;65633:382;;;:::o;66025:435::-;66191:4;66233:2;66222:9;66218:18;66210:26;;66286:9;66280:4;66276:20;66272:1;66261:9;66257:17;66250:47;66318:131;66444:4;66318:131;:::i;:::-;66310:139;;66025:435;;;:::o

Swarm Source

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