ETH Price: $3,293.03 (-1.84%)

Token

DUDE404 (DUDE)
 

Overview

Max Total Supply

999 DUDE

Holders

0

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
Null: 0x000...000
Balance
0 DUDE

Value
$0.00
0x0000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Dude

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

//SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.0;
// File: @openzeppelin/contracts/utils/ReentrancyGuard.sol


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

pragma solidity ^0.8.20;

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

    /**
     * @dev Unauthorized reentrant call.
     */
    error ReentrancyGuardReentrantCall();

    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
        if (_status == ENTERED) {
            revert ReentrancyGuardReentrantCall();
        }

        // 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: @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/utils/Pausable.sol


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

pragma solidity ^0.8.20;


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

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

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

    /**
     * @dev The operation failed because the contract is paused.
     */
    error EnforcedPause();

    /**
     * @dev The operation failed because the contract is not paused.
     */
    error ExpectedPause();

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

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

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

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

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        if (paused()) {
            revert EnforcedPause();
        }
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        if (!paused()) {
            revert ExpectedPause();
        }
    }

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

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

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


// OpenZeppelin Contracts (last updated 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: @openzeppelin/contracts/access/Ownable2Step.sol


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

pragma solidity ^0.8.20;


/**
 * @dev Contract module which provides access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * The initial owner is specified at deployment time in the constructor for `Ownable`. This
 * can later be changed with {transferOwnership} and {acceptOwnership}.
 *
 * This module is used through inheritance. It will make available all functions
 * from parent (Ownable).
 */
abstract contract Ownable2Step is Ownable {
    address private _pendingOwner;

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

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

    /**
     * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual override onlyOwner {
        _pendingOwner = newOwner;
        emit OwnershipTransferStarted(owner(), newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual override {
        delete _pendingOwner;
        super._transferOwnership(newOwner);
    }

    /**
     * @dev The new owner accepts the ownership transfer.
     */
    function acceptOwnership() public virtual {
        address sender = _msgSender();
        if (pendingOwner() != sender) {
            revert OwnableUnauthorizedAccount(sender);
        }
        _transferOwnership(sender);
    }
}

// File: contracts/ERC404.sol

pragma solidity ^0.8.0;


abstract contract ERC721Receiver {
    function onERC721Received(
        address,
        address,
        uint256,
        bytes calldata
    ) external virtual returns (bytes4) {
        return ERC721Receiver.onERC721Received.selector;
    }
}

/// @notice ERC404
///         A gas-efficient, mixed ERC20 / ERC721 implementation
///         with native liquidity and fractionalization.
///
///         This is an experimental standard designed to integrate
///         with pre-existing ERC20 / ERC721 support as smoothly as
///         possible.
///
/// @dev    In order to support full functionality of ERC20 and ERC721
///         supply assumptions are made that slightly constraint usage.
///         Ensure decimals are sufficiently large (standard 18 recommended)
///         as ids are effectively encoded in the lowest range of amounts.
///
///         NFTs are spent on ERC20 functions in a FILO queue, this is by
///         design.
///
abstract contract ERC404 is Ownable2Step {
    // Events
    event ERC20Transfer(
        address indexed from,
        address indexed to,
        uint256 amount
    );
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 amount
    );
    event Transfer(
        address indexed from,
        address indexed to,
        uint256 indexed id
    );
    event ERC721Approval(
        address indexed owner,
        address indexed spender,
        uint256 indexed id
    );
    event ApprovalForAll(
        address indexed owner,
        address indexed operator,
        bool approved
    );

    // Errors
    error NotFound();
    error AlreadyExists();
    error InvalidRecipient();
    error InvalidSender();
    error UnsafeRecipient();
    error Unauthorized();
    error InvalidOwner();

    // Metadata
    /// @dev Token name
    string public name;

    /// @dev Token symbol
    string public symbol;

    /// @dev Decimals for fractional representation
    uint8 public immutable decimals;

    /// @dev Total supply in fractionalized representation
    uint256 public immutable totalSupply;

    /// @dev Current mint counter, monotonically increasing to ensure accurate ownership
    uint256 public minted;

    // Mappings
    /// @dev Balance of user in fractional representation
    mapping(address => uint256) public balanceOf;

    /// @dev Allowance of user in fractional representation
    mapping(address => mapping(address => uint256)) public allowance;

    /// @dev Approval in native representaion
    mapping(uint256 => address) public getApproved;

    /// @dev Approval for all in native representation
    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /// @dev Owner of id in native representation
    mapping(uint256 => address) internal _ownerOf;

    /// @dev Array of owned ids in native representation
    mapping(address => uint256[]) internal _owned;

    /// @dev Tracks indices for the _owned mapping
    mapping(uint256 => uint256) internal _ownedIndex;

    /// @dev Addresses whitelisted from minting / burning for gas savings (pairs, routers, etc)
    mapping(address => bool) public whitelist;

    // Constructor
    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals,
        uint256 _totalNativeSupply,
        address _owner
    ) Ownable(_owner) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;
        totalSupply = _totalNativeSupply * (10 ** decimals);
    }

    /// @notice Initialization function to set pairs / etc
    ///         saving gas by avoiding mint / burn on unnecessary targets
    function setWhitelist(address target, bool state) public onlyOwner {
        whitelist[target] = state;
    }

    /// @notice Function to find owner of a given native token
    function ownerOf(uint256 id) public view virtual returns (address owner) {
        owner = _ownerOf[id];

        if (owner == address(0)) {
            revert NotFound();
        }
    }

    /// @notice tokenURI must be implemented by child contract
    function tokenURI(uint256 id) public view virtual returns (string memory);

    /// @notice Function for token approvals
    /// @dev This function assumes id / native if amount less than or equal to current max id
    function approve(
        address spender,
        uint256 amountOrId
    ) public virtual returns (bool) {
        if (amountOrId <= minted && amountOrId > 0) {
            address owner = _ownerOf[amountOrId];

            if (msg.sender != owner && !isApprovedForAll[owner][msg.sender]) {
                revert Unauthorized();
            }

            getApproved[amountOrId] = spender;

            emit Approval(owner, spender, amountOrId);
        } else {
            allowance[msg.sender][spender] = amountOrId;

            emit Approval(msg.sender, spender, amountOrId);
        }

        return true;
    }

    /// @notice Function native approvals
    function setApprovalForAll(address operator, bool approved) public virtual {
        isApprovedForAll[msg.sender][operator] = approved;

        emit ApprovalForAll(msg.sender, operator, approved);
    }

    /// @notice Function for mixed transfers
    /// @dev This function assumes id / native if amount less than or equal to current max id
    function transferFrom(
        address from,
        address to,
        uint256 amountOrId
    ) public virtual {
        if (amountOrId <= minted) {
            if (from != _ownerOf[amountOrId]) {
                revert InvalidSender();
            }

            if (to == address(0)) {
                revert InvalidRecipient();
            }

            if (
                msg.sender != from &&
                !isApprovedForAll[from][msg.sender] &&
                msg.sender != getApproved[amountOrId]
            ) {
                revert Unauthorized();
            }

            balanceOf[from] -= _getUnit();

            unchecked {
                balanceOf[to] += _getUnit();
            }

            _ownerOf[amountOrId] = to;
            delete getApproved[amountOrId];

            // update _owned for sender
            uint256 updatedId = _owned[from][_owned[from].length - 1];
            _owned[from][_ownedIndex[amountOrId]] = updatedId;
            // pop
            _owned[from].pop();
            // update index for the moved id
            _ownedIndex[updatedId] = _ownedIndex[amountOrId];
            // push token to to owned
            _owned[to].push(amountOrId);
            // update index for to owned
            _ownedIndex[amountOrId] = _owned[to].length - 1;

            emit Transfer(from, to, amountOrId);
            emit ERC20Transfer(from, to, _getUnit());
        } else {
            uint256 allowed = allowance[from][msg.sender];

            if (allowed != type(uint256).max)
                allowance[from][msg.sender] = allowed - amountOrId;

            _transfer(from, to, amountOrId);
        }
    }

    /// @notice Function for fractional transfers
    function transfer(
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        return _transfer(msg.sender, to, amount);
    }

    /// @notice Function for native transfers with contract support
    function safeTransferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        transferFrom(from, to, id);

        if (
            to.code.length != 0 &&
            ERC721Receiver(to).onERC721Received(msg.sender, from, id, "") !=
            ERC721Receiver.onERC721Received.selector
        ) {
            revert UnsafeRecipient();
        }
    }

    /// @notice Function for native transfers with contract support and callback data
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        bytes calldata data
    ) public virtual {
        transferFrom(from, to, id);

        if (
            to.code.length != 0 &&
            ERC721Receiver(to).onERC721Received(msg.sender, from, id, data) !=
            ERC721Receiver.onERC721Received.selector
        ) {
            revert UnsafeRecipient();
        }
    }

    /// @notice Internal function for fractional transfers
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual returns (bool) {
        uint256 unit = _getUnit();
        uint256 balanceBeforeSender = balanceOf[from];
        uint256 balanceBeforeReceiver = balanceOf[to];

        balanceOf[from] -= amount;

        unchecked {
            balanceOf[to] += amount;
        }

        // Skip burn for certain addresses to save gas
        if (!whitelist[from]) {
            uint256 tokens_to_burn = (balanceBeforeSender / unit) -
                (balanceOf[from] / unit);
            for (uint256 i = 0; i < tokens_to_burn; i++) {
                _burn(from);
            }
        }

        // Skip minting for certain addresses to save gas
        if (!whitelist[to]) {
            uint256 tokens_to_mint = (balanceOf[to] / unit) -
                (balanceBeforeReceiver / unit);
            for (uint256 i = 0; i < tokens_to_mint; i++) {
                _mint(to);
            }
        }

        emit ERC20Transfer(from, to, amount);
        return true;
    }

    // Internal utility logic
    function _getUnit() internal view returns (uint256) {
        return 10 ** decimals;
    }

    function _mint(address to) internal virtual {
        if (to == address(0)) {
            revert InvalidRecipient();
        }

        unchecked {
            minted++;
        }

        uint256 id = minted;

        if (_ownerOf[id] != address(0)) {
            revert AlreadyExists();
        }

        _ownerOf[id] = to;
        _owned[to].push(id);
        _ownedIndex[id] = _owned[to].length - 1;

        emit Transfer(address(0), to, id);
    }

    function _burn(address from) internal virtual {
        if (from == address(0)) {
            revert InvalidSender();
        }

        uint256 id = _owned[from][_owned[from].length - 1];
        _owned[from].pop();
        delete _ownedIndex[id];
        delete _ownerOf[id];
        delete getApproved[id];

        emit Transfer(from, address(0), id);
    }

    function _setNameSymbol(
        string memory _name,
        string memory _symbol
    ) internal {
        name = _name;
        symbol = _symbol;
    }
}


interface IUniswapPair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);
    function swapFee() external view returns (uint32);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
    function setSwapFee(uint32) external;
}

interface IUniswapFactory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
    function setSwapFee(address _pair, uint32 _swapFee) external;
}

interface IUniswapRouter01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut, uint swapFee) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut, uint swapFee) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}


interface IUniswapRouter02 is IUniswapRouter01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}


// File: contracts/Dude.sol
contract Dude is ERC404, Pausable, ReentrancyGuard {
    string public baseTokenURI;
    using Strings for uint256;

    // Due to integrate Tax Fee on ERC404
    IUniswapRouter02 public uniswapRouter;
    address public uniswapPair;
    bool private swapping;

    bool public SwapAndLiquifyEnabled = false;

    address payable public marketingWallet =
        payable(0xe45bf199ce4a836232c9088e2C2b980Cb5a049f5);

    uint256 public tokenAmountToSwap = 1000000000000000;

    uint256 public feeOnBuy = 300; // 3%
    uint256 public feeOnSell= 300; // 3%

    // exlcude from fees and max transaction amount
    mapping(address => bool) private _isExcludedFromFees;

    // getting fee addresses
    mapping(address => bool) public _isGetFees;

    mapping(address => bool) public automatedMarketMakerPairs;

    uint256 public blockNumber;
    uint256 public blockDuration = 1;

    //////////////////////////////////////////

    // Events For Fee /////////////////////////
    event UpdateUniswapRouter(
        address indexed newAddress,
        address indexed oldAddress
    );
    event ExcludeFromFees(address indexed account, bool isExcluded);
    event GetFee(address indexed account, bool isGetFee);
    event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event SetTokenAmountToSwap(uint256 tokenAmountToSwap);
    event UpdateSwapAndLiquify(bool value);
    // ////////////////////////////////////////

    constructor(
        address _owner,
        uint256 _initialSupply
    ) ERC404("DUDE404", "DUDE", 18, _initialSupply, _owner) {
        balanceOf[_owner] = _initialSupply * 10 ** 18;

        IUniswapRouter02 _uniswapRouter = IUniswapRouter02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        ); // mainnet
        // Create a uniswap pair
        address _uniswapPair = IUniswapFactory(_uniswapRouter.factory())
            .createPair(address(this), _uniswapRouter.WETH());

        uniswapRouter = _uniswapRouter;
        uniswapPair = _uniswapPair;

        _setAutomatedMarketMakerPair(uniswapPair, true);

        // exclude from paying fees or having max transaction amount
        excludeFromFees(marketingWallet, true);
        excludeFromFees(address(this), true);
        excludeFromFees(owner(), true);

        setWhitelist(address(this), true);
        setWhitelist(uniswapPair, true);
        setWhitelist(marketingWallet, true);
        setWhitelist(owner(), true);

        // SET GET FEE ADDRESS
        _isGetFees[_uniswapPair] = true;
    }

    receive() external payable {}

    function updateSwapAndLiquifiy(bool value) public onlyOwner {
        SwapAndLiquifyEnabled = value;
        emit UpdateSwapAndLiquify(value);
    }

    function updateUniswapRouter(address newAddress) public onlyOwner {
        require(
            newAddress != address(uniswapRouter),
            "The router already has that address"
        );
        emit UpdateUniswapRouter(newAddress, address(uniswapRouter));
        uniswapRouter = IUniswapRouter02(newAddress);
        address _uniswapPair;
        _uniswapPair = IUniswapFactory(uniswapRouter.factory()).getPair(
            address(this),
            uniswapRouter.WETH()
        );
        if (_uniswapPair == address(0)) {
            _uniswapPair = IUniswapFactory(uniswapRouter.factory())
                .createPair(address(this), uniswapRouter.WETH());
        }
        _setAutomatedMarketMakerPair(uniswapPair, false);
        uniswapPair = _uniswapPair;
        _setAutomatedMarketMakerPair(uniswapPair, true);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function excludeFromFees(address account, bool excluded)
        public
        onlyOwner
    {
        _isExcludedFromFees[account] = excluded;

        emit ExcludeFromFees(account, excluded);
    }

    function setFeeAccount(address account, bool isGetFee) public onlyOwner {
        _isGetFees[account] = isGetFee;

        emit GetFee(account, isGetFee);
    }

    function excludeMultipleAccountsFromFees(
        address[] calldata accounts,
        bool excluded
    ) public onlyOwner {
        for (uint256 i = 0; i < accounts.length; i++) {
            _isExcludedFromFees[accounts[i]] = excluded;
        }

        emit ExcludeMultipleAccountsFromFees(accounts, excluded);
    }

    function setAutomatedMarketMakerPair(address pair, bool value)
        public
        onlyOwner
    {
        _setAutomatedMarketMakerPair(pair, value);
    }

    function setTokenAmountToSwap(uint256 _tokenAmount) public onlyOwner {
        tokenAmountToSwap = _tokenAmount;
        emit SetTokenAmountToSwap(tokenAmountToSwap);
    }

    function updateMarketingWallet(address _newWallet) public onlyOwner {
        marketingWallet = payable(_newWallet);
    }

    function updateFee(uint256 _onBuy, uint256 _onSell) public onlyOwner {
        feeOnBuy = _onBuy;
        feeOnSell = _onSell;
    }

    function setBlockNumber() public onlyOwner {
        blockNumber = block.number;
    }

    // Swap tokens on Uniswap
    function swapTokens(uint256 tokenAmount) private {
        // generate the sphynxswap pair path of token -> WETH
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapRouter.WETH();

        allowance[address(this)][address(uniswapRouter)] = tokenAmount;

        // make the swap
        uniswapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of Native
            path,
            marketingWallet,
            block.timestamp
        );
    }

    /////////////////////////////////////////////////////////////

    function _mint(
        address to
    ) internal override whenNotPaused{
        return super._mint(to);
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override virtual whenNotPaused returns (bool){
        // //////////////////////////////////////////////////////
        if (SwapAndLiquifyEnabled) {
            uint256 contractTokenBalance = balanceOf[address(this)];

            bool canSwap = contractTokenBalance >= tokenAmountToSwap;

            if (canSwap && !swapping && !automatedMarketMakerPairs[from]) {
                swapping = true;
                // Set number of tokens to sell to tokenAmountToSwap
                contractTokenBalance = tokenAmountToSwap;
                swapTokens(contractTokenBalance);
                swapping = false;
            }
        }

        if (_isGetFees[to] && blockNumber == 0) {
            blockNumber = block.number;
        }

        // indicates if fee should be deducted from transfer
        bool takeFee = true;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }

        if (takeFee) {
            uint256 fees;
            if (_isGetFees[from] || _isGetFees[to]) {
                if (block.number - blockNumber <= blockDuration) {
                    fees = amount * 99 / 100;
                } else {
                    if (_isGetFees[from]) {
                        fees = amount * feeOnBuy / 10000;
                    } else {
                        fees = amount * feeOnSell / 10000;
                    }
                }

                amount = amount - fees;
                super._transfer(from, address(this), fees);
            }
        }

        // //////////////////////////////////////////////////////////

        return super._transfer(from, to, amount);
    }

    function setTokenURI(string memory _tokenURI) public onlyOwner {
        baseTokenURI = _tokenURI;
    }

    function setNameSymbol(
        string memory _name,
        string memory _symbol
    ) public onlyOwner {
        _setNameSymbol(_name, _symbol);
    }

    function tokenURI(uint256 id) public view override returns (string memory) {
        return bytes(baseTokenURI).length > 0 ? string.concat(baseTokenURI, id.toString(), ".json") : "";
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_initialSupply","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyExists","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"InvalidOwner","type":"error"},{"inputs":[],"name":"InvalidRecipient","type":"error"},{"inputs":[],"name":"InvalidSender","type":"error"},{"inputs":[],"name":"NotFound","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":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"UnsafeRecipient","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ERC721Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeMultipleAccountsFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isGetFee","type":"bool"}],"name":"GetFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmountToSwap","type":"uint256"}],"name":"SetTokenAmountToSwap","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":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"value","type":"bool"}],"name":"UpdateSwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapRouter","type":"event"},{"inputs":[],"name":"SwapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isGetFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amountOrId","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blockDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blockNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeMultipleAccountsFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeOnBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeOnSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minted","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":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","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":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setBlockNumber","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"isGetFee","type":"bool"}],"name":"setFeeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"setNameSymbol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"setTokenAmountToSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenAmountToSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","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":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amountOrId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapRouter","outputs":[{"internalType":"contract IUniswapRouter02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_onBuy","type":"uint256"},{"internalType":"uint256","name":"_onSell","type":"uint256"}],"name":"updateFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newWallet","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"updateSwapAndLiquifiy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040525f601160156101000a81548160ff02191690831515021790555073e45bf199ce4a836232c9088e2c2b980cb5a049f560125f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555066038d7ea4c6800060135561012c60145561012c6015556001601a553480156200009a575f80fd5b50604051620060ba380380620060ba8339818101604052810190620000c0919062000a40565b6040518060400160405280600781526020017f44554445343034000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f445544450000000000000000000000000000000000000000000000000000000081525060128385805f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620001a4575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016200019b919062000a96565b60405180910390fd5b620001b5816200061c60201b60201c565b508460029081620001c7919062000d0c565b508360039081620001d9919062000d0c565b508260ff1660808160ff1681525050608051600a620001f9919062000f79565b8262000206919062000fc9565b60a0818152505050505050505f600d5f6101000a81548160ff0219169083151502179055506001600e81905550670de0b6b3a76400008162000249919062000fc9565b60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f737a250d5630b4cf539739df2c5dacb4c659f2488d90505f8173ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002ed573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000313919062001013565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308473ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000379573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200039f919062001013565b6040518363ffffffff1660e01b8152600401620003be92919062001043565b6020604051808303815f875af1158015620003db573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000401919062001013565b90508160105f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060115f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620004b760115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660016200065460201b60201c565b620004eb60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001620006f260201b60201c565b620004fe306001620006f260201b60201c565b6200052062000512620007aa60201b60201c565b6001620006f260201b60201c565b62000533306001620007d160201b60201c565b6200056760115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001620007d160201b60201c565b6200059b60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001620007d160201b60201c565b620005bd620005af620007aa60201b60201c565b6001620007d160201b60201c565b600160175f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050505050620010a5565b60015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905562000651816200083960201b60201c565b50565b8060185f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b62000702620008fa60201b60201c565b8060165f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7826040516200079e91906200108a565b60405180910390a25050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620007e1620008fa60201b60201c565b80600c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200090a6200099c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000930620007aa60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200099a576200095c6200099c60201b60201c565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040162000991919062000a96565b60405180910390fd5b565b5f33905090565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620009d282620009a7565b9050919050565b620009e481620009c6565b8114620009ef575f80fd5b50565b5f8151905062000a0281620009d9565b92915050565b5f819050919050565b62000a1c8162000a08565b811462000a27575f80fd5b50565b5f8151905062000a3a8162000a11565b92915050565b5f806040838503121562000a595762000a58620009a3565b5b5f62000a6885828601620009f2565b925050602062000a7b8582860162000a2a565b9150509250929050565b62000a9081620009c6565b82525050565b5f60208201905062000aab5f83018462000a85565b92915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168062000b2d57607f821691505b60208210810362000b435762000b4262000ae8565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830262000ba77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000b6a565b62000bb3868362000b6a565b95508019841693508086168417925050509392505050565b5f819050919050565b5f62000bf462000bee62000be88462000a08565b62000bcb565b62000a08565b9050919050565b5f819050919050565b62000c0f8362000bd4565b62000c2762000c1e8262000bfb565b84845462000b76565b825550505050565b5f90565b62000c3d62000c2f565b62000c4a81848462000c04565b505050565b5b8181101562000c715762000c655f8262000c33565b60018101905062000c50565b5050565b601f82111562000cc05762000c8a8162000b49565b62000c958462000b5b565b8101602085101562000ca5578190505b62000cbd62000cb48562000b5b565b83018262000c4f565b50505b505050565b5f82821c905092915050565b5f62000ce25f198460080262000cc5565b1980831691505092915050565b5f62000cfc838362000cd1565b9150826002028217905092915050565b62000d178262000ab1565b67ffffffffffffffff81111562000d335762000d3262000abb565b5b62000d3f825462000b15565b62000d4c82828562000c75565b5f60209050601f83116001811462000d82575f841562000d6d578287015190505b62000d79858262000cef565b86555062000de8565b601f19841662000d928662000b49565b5f5b8281101562000dbb5784890151825560018201915060208501945060208101905062000d94565b8683101562000ddb578489015162000dd7601f89168262000cd1565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b600185111562000e7a5780860481111562000e525762000e5162000df0565b5b600185161562000e625780820291505b808102905062000e728562000e1d565b945062000e32565b94509492505050565b5f8262000e94576001905062000f66565b8162000ea3575f905062000f66565b816001811462000ebc576002811462000ec75762000efd565b600191505062000f66565b60ff84111562000edc5762000edb62000df0565b5b8360020a91508482111562000ef65762000ef562000df0565b5b5062000f66565b5060208310610133831016604e8410600b841016171562000f375782820a90508381111562000f315762000f3062000df0565b5b62000f66565b62000f46848484600162000e29565b9250905081840481111562000f605762000f5f62000df0565b5b81810290505b9392505050565b5f60ff82169050919050565b5f62000f858262000a08565b915062000f928362000f6d565b925062000fc17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000e83565b905092915050565b5f62000fd58262000a08565b915062000fe28362000a08565b925082820262000ff28162000a08565b915082820484148315176200100c576200100b62000df0565b5b5092915050565b5f602082840312156200102b576200102a620009a3565b5b5f6200103a84828501620009f2565b91505092915050565b5f604082019050620010585f83018562000a85565b62001067602083018462000a85565b9392505050565b5f8115159050919050565b62001084816200106e565b82525050565b5f6020820190506200109f5f83018462001079565b92915050565b60805160a051614fec620010ce5f395f610ed301525f818161170e01526128f10152614fec5ff3fe6080604052600436106102b1575f3560e01c80638144ec0c11610174578063b88d4fde116100db578063d547cfb711610094578063e30c39781161006e578063e30c397814610a8a578063e985e9c514610ab4578063f2fde38b14610af0578063fbf6eaa514610b18576102b8565b8063d547cfb7146109fc578063dd62ed3e14610a26578063e0df5b6f14610a62576102b8565b8063b88d4fde146108f4578063bb8c3ee01461091c578063c024666814610946578063c492f0461461096e578063c816841b14610996578063c87b56dd146109c0576102b8565b80639b19251a1161012d5780639b19251a146107c8578063a22cb46514610804578063a4de3c191461082c578063a9059cbb14610854578063aacebbe314610890578063b62496f5146108b8576102b8565b80638144ec0c146106c05780638768a9cd146106e85780638da5cb5b14610724578063908bb2ae1461074e57806395d89b41146107765780639a7a23d6146107a0576102b8565b806353d6fd591161021857806370a08231116101d157806370a08231146105da578063715018a614610616578063735de9f71461062c57806375f0a8741461065657806379ba5097146106805780637a49325114610696576102b8565b806353d6fd59146104d057806357e871e7146104f85780635c975abb146105225780636352211e1461054c57806365048d081461058857806368b4cac9146105b2576102b8565b80632740c1971161026a5780632740c197146103da578063313ce56714610402578063423ce9cc1461042c57806342842e0e146104565780634f02c4201461047e578063504334c2146104a8576102b8565b806306fdde03146102bc578063081812fc146102e6578063095ea7b31461032257806318160ddd1461035e578063201e908e1461038857806323b872dd146103b2576102b8565b366102b857005b5f80fd5b3480156102c7575f80fd5b506102d0610b2e565b6040516102dd9190613cfd565b60405180910390f35b3480156102f1575f80fd5b5061030c60048036038101906103079190613d61565b610bba565b6040516103199190613dcb565b60405180910390f35b34801561032d575f80fd5b5061034860048036038101906103439190613e0e565b610bea565b6040516103559190613e66565b60405180910390f35b348015610369575f80fd5b50610372610ed1565b60405161037f9190613e8e565b60405180910390f35b348015610393575f80fd5b5061039c610ef5565b6040516103a99190613e8e565b60405180910390f35b3480156103bd575f80fd5b506103d860048036038101906103d39190613ea7565b610efb565b005b3480156103e5575f80fd5b5061040060048036038101906103fb9190613ef7565b6116f2565b005b34801561040d575f80fd5b5061041661170c565b6040516104239190613f50565b60405180910390f35b348015610437575f80fd5b50610440611730565b60405161044d9190613e66565b60405180910390f35b348015610461575f80fd5b5061047c60048036038101906104779190613ea7565b611743565b005b348015610489575f80fd5b50610492611872565b60405161049f9190613e8e565b60405180910390f35b3480156104b3575f80fd5b506104ce60048036038101906104c99190614095565b611878565b005b3480156104db575f80fd5b506104f660048036038101906104f19190614135565b61188e565b005b348015610503575f80fd5b5061050c6118ee565b6040516105199190613e8e565b60405180910390f35b34801561052d575f80fd5b506105366118f4565b6040516105439190613e66565b60405180910390f35b348015610557575f80fd5b50610572600480360381019061056d9190613d61565b611909565b60405161057f9190613dcb565b60405180910390f35b348015610593575f80fd5b5061059c6119a7565b6040516105a99190613e8e565b60405180910390f35b3480156105bd575f80fd5b506105d860048036038101906105d39190614173565b6119ad565b005b3480156105e5575f80fd5b5061060060048036038101906105fb919061419e565b611a09565b60405161060d9190613e8e565b60405180910390f35b348015610621575f80fd5b5061062a611a1e565b005b348015610637575f80fd5b50610640611a31565b60405161064d9190614224565b60405180910390f35b348015610661575f80fd5b5061066a611a56565b604051610677919061425d565b60405180910390f35b34801561068b575f80fd5b50610694611a7b565b005b3480156106a1575f80fd5b506106aa611b09565b6040516106b79190613e8e565b60405180910390f35b3480156106cb575f80fd5b506106e660048036038101906106e19190613d61565b611b0f565b005b3480156106f3575f80fd5b5061070e6004803603810190610709919061419e565b611b5a565b60405161071b9190613e66565b60405180910390f35b34801561072f575f80fd5b50610738611b77565b6040516107459190613dcb565b60405180910390f35b348015610759575f80fd5b50610774600480360381019061076f919061419e565b611b9e565b005b348015610781575f80fd5b5061078a6120ed565b6040516107979190613cfd565b60405180910390f35b3480156107ab575f80fd5b506107c660048036038101906107c19190614135565b612179565b005b3480156107d3575f80fd5b506107ee60048036038101906107e9919061419e565b61218f565b6040516107fb9190613e66565b60405180910390f35b34801561080f575f80fd5b5061082a60048036038101906108259190614135565b6121ac565b005b348015610837575f80fd5b50610852600480360381019061084d9190614135565b6122a4565b005b34801561085f575f80fd5b5061087a60048036038101906108759190613e0e565b612352565b6040516108879190613e66565b60405180910390f35b34801561089b575f80fd5b506108b660048036038101906108b1919061419e565b612366565b005b3480156108c3575f80fd5b506108de60048036038101906108d9919061419e565b6123b1565b6040516108eb9190613e66565b60405180910390f35b3480156108ff575f80fd5b5061091a600480360381019061091591906142d3565b6123ce565b005b348015610927575f80fd5b50610930612503565b60405161093d9190613e8e565b60405180910390f35b348015610951575f80fd5b5061096c60048036038101906109679190614135565b612509565b005b348015610979575f80fd5b50610994600480360381019061098f91906143ac565b6125b7565b005b3480156109a1575f80fd5b506109aa612695565b6040516109b79190613dcb565b60405180910390f35b3480156109cb575f80fd5b506109e660048036038101906109e19190613d61565b6126ba565b6040516109f39190613cfd565b60405180910390f35b348015610a07575f80fd5b50610a10612718565b604051610a1d9190613cfd565b60405180910390f35b348015610a31575f80fd5b50610a4c6004803603810190610a479190614409565b6127a4565b604051610a599190613e8e565b60405180910390f35b348015610a6d575f80fd5b50610a886004803603810190610a839190614447565b6127c4565b005b348015610a95575f80fd5b50610a9e6127df565b604051610aab9190613dcb565b60405180910390f35b348015610abf575f80fd5b50610ada6004803603810190610ad59190614409565b612807565b604051610ae79190613e66565b60405180910390f35b348015610afb575f80fd5b50610b166004803603810190610b11919061419e565b612831565b005b348015610b23575f80fd5b50610b2c6128dd565b005b60028054610b3b906144bb565b80601f0160208091040260200160405190810160405280929190818152602001828054610b67906144bb565b8015610bb25780601f10610b8957610100808354040283529160200191610bb2565b820191905f5260205f20905b815481529060010190602001808311610b9557829003601f168201915b505050505081565b6007602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f6004548211158015610bfc57505f82115b15610de4575f60095f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610cf3575060085f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15610d2a576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360075f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610dd69190613e8e565b60405180910390a350610ec7565b8160065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610ebe9190613e8e565b60405180910390a35b6001905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b601a5481565b60045481116115b35760095f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610f99576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ffe576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156110bc575060085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015611124575060075f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b1561115b576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111636128ee565b60055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546111ae9190614518565b925050819055506111bd6128ee565b60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160095f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060075f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555f600a5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001600a5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490506113139190614518565b815481106113245761132361454b565b5b905f5260205f200154905080600a5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600b5f8581526020019081526020015f2054815481106113905761138f61454b565b5b905f5260205f200181905550600a5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054806113e9576113e8614578565b5b600190038181905f5260205f20015f90559055600b5f8381526020019081526020015f2054600b5f8381526020019081526020015f2081905550600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2082908060018154018082558091505060019003905f5260205f20015f90919091909150556001600a5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490506114d19190614518565b600b5f8481526020019081526020015f2081905550818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314876115986128ee565b6040516115a59190613e8e565b60405180910390a3506116ed565b5f60065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146116df5781816116629190614518565b60065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b6116ea848484612921565b50505b505050565b6116fa612cee565b81601481905550806015819055505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b601160159054906101000a900460ff1681565b61174e838383610efb565b5f8273ffffffffffffffffffffffffffffffffffffffff163b14158015611836575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b81526004016117d4939291906145d8565b6020604051808303815f875af11580156117f0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118149190614675565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b1561186d576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60045481565b611880612cee565b61188a8282612d75565b5050565b611896612cee565b80600c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b60195481565b5f600d5f9054906101000a900460ff16905090565b5f60095f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036119a2576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60155481565b6119b5612cee565b80601160156101000a81548160ff0219169083151502179055507f701507a13d5701687328d70ea5a717a33a062f46c229a785b315fb4517fef069816040516119fe9190613e66565b60405180910390a150565b6005602052805f5260405f205f915090505481565b611a26612cee565b611a2f5f612d99565b565b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f611a84612dc9565b90508073ffffffffffffffffffffffffffffffffffffffff16611aa56127df565b73ffffffffffffffffffffffffffffffffffffffff1614611afd57806040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611af49190613dcb565b60405180910390fd5b611b0681612d99565b50565b60135481565b611b17612cee565b806013819055507f4fbe9e6627324d6e978a35ce6052f4445d8b166102b1901a17da2cec33af62fc601354604051611b4f9190613e8e565b60405180910390a150565b6017602052805f5260405f205f915054906101000a900460ff1681565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611ba6612cee565b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2c90614710565b60405180910390fd5b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fb6bf376037f707ef439f1e5e56d7987d6b0c55798fe21ff475fd00b1f37ed92060405160405180910390a38060105f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d5b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d7f9190614742565b73ffffffffffffffffffffffffffffffffffffffff1663e6a439053060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e05573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e299190614742565b6040518363ffffffff1660e01b8152600401611e4692919061476d565b602060405180830381865afa158015611e61573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e859190614742565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036120525760105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f24573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f489190614742565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fce573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ff29190614742565b6040518363ffffffff1660e01b815260040161200f92919061476d565b6020604051808303815f875af115801561202b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061204f9190614742565b90505b61207d60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff165f612dd0565b8060115f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506120e960115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001612dd0565b5050565b600380546120fa906144bb565b80601f0160208091040260200160405190810160405280929190818152602001828054612126906144bb565b80156121715780601f1061214857610100808354040283529160200191612171565b820191905f5260205f20905b81548152906001019060200180831161215457829003601f168201915b505050505081565b612181612cee565b61218b8282612dd0565b5050565b600c602052805f5260405f205f915054906101000a900460ff1681565b8060085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122989190613e66565b60405180910390a35050565b6122ac612cee565b8060175f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fd3d1fab5db42ae85293059c69e12bf01ffffb1dd5ff4caa5e5568f99fc387f24826040516123469190613e66565b60405180910390a25050565b5f61235e338484612921565b905092915050565b61236e612cee565b8060125f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6018602052805f5260405f205f915054906101000a900460ff1681565b6123d9858585610efb565b5f8473ffffffffffffffffffffffffffffffffffffffff163b141580156124c5575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff1663150b7a0233888787876040518663ffffffff1660e01b81526004016124639594939291906147c0565b6020604051808303815f875af115801561247f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124a39190614675565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b156124fc576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b60145481565b612511612cee565b8060165f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7826040516125ab9190613e66565b60405180910390a25050565b6125bf612cee565b5f5b83839050811015612654578160165f8686858181106125e3576125e261454b565b5b90506020020160208101906125f8919061419e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555080806001019150506125c1565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b35838383604051612688939291906148c8565b60405180910390a1505050565b60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60605f600f80546126ca906144bb565b9050116126e55760405180602001604052805f815250612711565b600f6126f083612e6e565b6040516020016127019291906149ea565b6040516020818303038152906040525b9050919050565b600f8054612725906144bb565b80601f0160208091040260200160405190810160405280929190818152602001828054612751906144bb565b801561279c5780601f106127735761010080835404028352916020019161279c565b820191905f5260205f20905b81548152906001019060200180831161277f57829003601f168201915b505050505081565b6006602052815f5260405f20602052805f5260405f205f91509150505481565b6127cc612cee565b80600f90816127db9190614b9e565b5050565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6008602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b612839612cee565b8060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16612898611b77565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6128e5612cee565b43601981905550565b5f7f0000000000000000000000000000000000000000000000000000000000000000600a61291c9190614d9c565b905090565b5f61292a612f38565b601160159054906101000a900460ff1615612a42575f60055f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60135482101590508080156129a35750601160149054906101000a900460ff16155b80156129f6575060185f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15612a3f576001601160146101000a81548160ff0219169083151502179055506013549150612a2482612f79565b5f601160146101000a81548160ff0219169083151502179055505b50505b60175f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015612a9957505f601954145b15612aa657436019819055505b5f6001905060165f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680612b46575060165f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b15612b4f575f90505b8015612cd9575f60175f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680612bf1575060175f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b15612cd757601a5460195443612c079190614518565b11612c2c576064606385612c1b9190614de6565b612c259190614e54565b9050612cbc565b60175f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615612c9d5761271060145485612c8c9190614de6565b612c969190614e54565b9050612cbb565b61271060155485612cae9190614de6565b612cb89190614e54565b90505b5b8084612cc89190614518565b9350612cd5863083613242565b505b505b612ce4858585613242565b9150509392505050565b612cf6612dc9565b73ffffffffffffffffffffffffffffffffffffffff16612d14611b77565b73ffffffffffffffffffffffffffffffffffffffff1614612d7357612d37612dc9565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401612d6a9190613dcb565b60405180910390fd5b565b8160029081612d849190614b9e565b508060039081612d949190614b9e565b505050565b60015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055612dc681613586565b50565b5f33905090565b8060185f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b60605f6001612e7c84613647565b0190505f8167ffffffffffffffff811115612e9a57612e99613f71565b5b6040519080825280601f01601f191660200182016040528015612ecc5781602001600182028036833780820191505090505b5090505f82602001820190505b600115612f2d578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612f2257612f21614e27565b5b0494505f8503612ed9575b819350505050919050565b612f406118f4565b15612f77576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f600267ffffffffffffffff811115612f9557612f94613f71565b5b604051908082528060200260200182016040528015612fc35781602001602082028036833780820191505090505b50905030815f81518110612fda57612fd961454b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561307e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130a29190614742565b816001815181106130b6576130b561454b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508160065f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8460125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b8152600401613211959493929190614f5e565b5f604051808303815f87803b158015613228575f80fd5b505af115801561323a573d5f803e3d5ffd5b505050505050565b5f8061324c6128ee565b90505f60055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508460055f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461331c9190614518565b925050819055508460055f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540192505081905550600c5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16613440575f8360055f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546134059190614e54565b84846134119190614e54565b61341b9190614518565b90505f5b8181101561343d5761343089613798565b808060010191505061341f565b50505b600c5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16613513575f838261349b9190614e54565b8460055f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546134e49190614e54565b6134ee9190614518565b90505f5b8181101561351057613503886139dd565b80806001019150506134f2565b50505b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487876040516135709190613e8e565b60405180910390a3600193505050509392505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106136a3577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161369957613698614e27565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106136e0576d04ee2d6d415b85acef810000000083816136d6576136d5614e27565b5b0492506020810190505b662386f26fc10000831061370f57662386f26fc10000838161370557613704614e27565b5b0492506010810190505b6305f5e1008310613738576305f5e100838161372e5761372d614e27565b5b0492506008810190505b612710831061375d57612710838161375357613752614e27565b5b0492506004810190505b60648310613780576064838161377657613775614e27565b5b0492506002810190505b600a831061378f576001810190505b80915050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036137fd576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001600a5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490506138889190614518565b815481106138995761389861454b565b5b905f5260205f2001549050600a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054806138f1576138f0614578565b5b600190038181905f5260205f20015f90559055600b5f8281526020019081526020015f205f905560095f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560075f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055805f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6139e5612f38565b6139ee816139f1565b50565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613a56576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60045f81548092919060010191905055505f60045490505f73ffffffffffffffffffffffffffffffffffffffff1660095f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613b02576040517f23369fa600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160095f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f90919091909150556001600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050613bff9190614518565b600b5f8381526020019081526020015f2081905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613caa578082015181840152602081019050613c8f565b5f8484015250505050565b5f601f19601f8301169050919050565b5f613ccf82613c73565b613cd98185613c7d565b9350613ce9818560208601613c8d565b613cf281613cb5565b840191505092915050565b5f6020820190508181035f830152613d158184613cc5565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b613d4081613d2e565b8114613d4a575f80fd5b50565b5f81359050613d5b81613d37565b92915050565b5f60208284031215613d7657613d75613d26565b5b5f613d8384828501613d4d565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613db582613d8c565b9050919050565b613dc581613dab565b82525050565b5f602082019050613dde5f830184613dbc565b92915050565b613ded81613dab565b8114613df7575f80fd5b50565b5f81359050613e0881613de4565b92915050565b5f8060408385031215613e2457613e23613d26565b5b5f613e3185828601613dfa565b9250506020613e4285828601613d4d565b9150509250929050565b5f8115159050919050565b613e6081613e4c565b82525050565b5f602082019050613e795f830184613e57565b92915050565b613e8881613d2e565b82525050565b5f602082019050613ea15f830184613e7f565b92915050565b5f805f60608486031215613ebe57613ebd613d26565b5b5f613ecb86828701613dfa565b9350506020613edc86828701613dfa565b9250506040613eed86828701613d4d565b9150509250925092565b5f8060408385031215613f0d57613f0c613d26565b5b5f613f1a85828601613d4d565b9250506020613f2b85828601613d4d565b9150509250929050565b5f60ff82169050919050565b613f4a81613f35565b82525050565b5f602082019050613f635f830184613f41565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613fa782613cb5565b810181811067ffffffffffffffff82111715613fc657613fc5613f71565b5b80604052505050565b5f613fd8613d1d565b9050613fe48282613f9e565b919050565b5f67ffffffffffffffff82111561400357614002613f71565b5b61400c82613cb5565b9050602081019050919050565b828183375f83830152505050565b5f61403961403484613fe9565b613fcf565b90508281526020810184848401111561405557614054613f6d565b5b614060848285614019565b509392505050565b5f82601f83011261407c5761407b613f69565b5b813561408c848260208601614027565b91505092915050565b5f80604083850312156140ab576140aa613d26565b5b5f83013567ffffffffffffffff8111156140c8576140c7613d2a565b5b6140d485828601614068565b925050602083013567ffffffffffffffff8111156140f5576140f4613d2a565b5b61410185828601614068565b9150509250929050565b61411481613e4c565b811461411e575f80fd5b50565b5f8135905061412f8161410b565b92915050565b5f806040838503121561414b5761414a613d26565b5b5f61415885828601613dfa565b925050602061416985828601614121565b9150509250929050565b5f6020828403121561418857614187613d26565b5b5f61419584828501614121565b91505092915050565b5f602082840312156141b3576141b2613d26565b5b5f6141c084828501613dfa565b91505092915050565b5f819050919050565b5f6141ec6141e76141e284613d8c565b6141c9565b613d8c565b9050919050565b5f6141fd826141d2565b9050919050565b5f61420e826141f3565b9050919050565b61421e81614204565b82525050565b5f6020820190506142375f830184614215565b92915050565b5f61424782613d8c565b9050919050565b6142578161423d565b82525050565b5f6020820190506142705f83018461424e565b92915050565b5f80fd5b5f80fd5b5f8083601f84011261429357614292613f69565b5b8235905067ffffffffffffffff8111156142b0576142af614276565b5b6020830191508360018202830111156142cc576142cb61427a565b5b9250929050565b5f805f805f608086880312156142ec576142eb613d26565b5b5f6142f988828901613dfa565b955050602061430a88828901613dfa565b945050604061431b88828901613d4d565b935050606086013567ffffffffffffffff81111561433c5761433b613d2a565b5b6143488882890161427e565b92509250509295509295909350565b5f8083601f84011261436c5761436b613f69565b5b8235905067ffffffffffffffff81111561438957614388614276565b5b6020830191508360208202830111156143a5576143a461427a565b5b9250929050565b5f805f604084860312156143c3576143c2613d26565b5b5f84013567ffffffffffffffff8111156143e0576143df613d2a565b5b6143ec86828701614357565b935093505060206143ff86828701614121565b9150509250925092565b5f806040838503121561441f5761441e613d26565b5b5f61442c85828601613dfa565b925050602061443d85828601613dfa565b9150509250929050565b5f6020828403121561445c5761445b613d26565b5b5f82013567ffffffffffffffff81111561447957614478613d2a565b5b61448584828501614068565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806144d257607f821691505b6020821081036144e5576144e461448e565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61452282613d2e565b915061452d83613d2e565b9250828203905081811115614545576145446144eb565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b5f82825260208201905092915050565b50565b5f6145c35f836145a5565b91506145ce826145b5565b5f82019050919050565b5f6080820190506145eb5f830186613dbc565b6145f86020830185613dbc565b6146056040830184613e7f565b8181036060830152614616816145b8565b9050949350505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61465481614620565b811461465e575f80fd5b50565b5f8151905061466f8161464b565b92915050565b5f6020828403121561468a57614689613d26565b5b5f61469784828501614661565b91505092915050565b7f54686520726f7574657220616c726561647920686173207468617420616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f6146fa602383613c7d565b9150614705826146a0565b604082019050919050565b5f6020820190508181035f830152614727816146ee565b9050919050565b5f8151905061473c81613de4565b92915050565b5f6020828403121561475757614756613d26565b5b5f6147648482850161472e565b91505092915050565b5f6040820190506147805f830185613dbc565b61478d6020830184613dbc565b9392505050565b5f61479f83856145a5565b93506147ac838584614019565b6147b583613cb5565b840190509392505050565b5f6080820190506147d35f830188613dbc565b6147e06020830187613dbc565b6147ed6040830186613e7f565b8181036060830152614800818486614794565b90509695505050505050565b5f82825260208201905092915050565b5f819050919050565b61482e81613dab565b82525050565b5f61483f8383614825565b60208301905092915050565b5f6148596020840184613dfa565b905092915050565b5f602082019050919050565b5f614878838561480c565b93506148838261481c565b805f5b858110156148bb57614898828461484b565b6148a28882614834565b97506148ad83614861565b925050600181019050614886565b5085925050509392505050565b5f6040820190508181035f8301526148e181858761486d565b90506148f06020830184613e57565b949350505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154614920816144bb565b61492a81866148f8565b9450600182165f811461494457600181146149595761498b565b60ff198316865281151582028601935061498b565b61496285614902565b5f5b8381101561498357815481890152600182019150602081019050614964565b838801955050505b50505092915050565b5f61499e82613c73565b6149a881856148f8565b93506149b8818560208601613c8d565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815250565b5f6149f58285614914565b9150614a018284614994565b9150614a0c826149c4565b6005820191508190509392505050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302614a667fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614a2b565b614a708683614a2b565b95508019841693508086168417925050509392505050565b5f614aa2614a9d614a9884613d2e565b6141c9565b613d2e565b9050919050565b5f819050919050565b614abb83614a88565b614acf614ac782614aa9565b848454614a37565b825550505050565b5f90565b614ae3614ad7565b614aee818484614ab2565b505050565b5b81811015614b1157614b065f82614adb565b600181019050614af4565b5050565b601f821115614b5657614b2781614902565b614b3084614a1c565b81016020851015614b3f578190505b614b53614b4b85614a1c565b830182614af3565b50505b505050565b5f82821c905092915050565b5f614b765f1984600802614b5b565b1980831691505092915050565b5f614b8e8383614b67565b9150826002028217905092915050565b614ba782613c73565b67ffffffffffffffff811115614bc057614bbf613f71565b5b614bca82546144bb565b614bd5828285614b15565b5f60209050601f831160018114614c06575f8415614bf4578287015190505b614bfe8582614b83565b865550614c65565b601f198416614c1486614902565b5f5b82811015614c3b57848901518255600182019150602085019450602081019050614c16565b86831015614c585784890151614c54601f891682614b67565b8355505b6001600288020188555050505b505050505050565b5f8160011c9050919050565b5f808291508390505b6001851115614cc257808604811115614c9e57614c9d6144eb565b5b6001851615614cad5780820291505b8081029050614cbb85614c6d565b9450614c82565b94509492505050565b5f82614cda5760019050614d95565b81614ce7575f9050614d95565b8160018114614cfd5760028114614d0757614d36565b6001915050614d95565b60ff841115614d1957614d186144eb565b5b8360020a915084821115614d3057614d2f6144eb565b5b50614d95565b5060208310610133831016604e8410600b8410161715614d6b5782820a905083811115614d6657614d656144eb565b5b614d95565b614d788484846001614c79565b92509050818404811115614d8f57614d8e6144eb565b5b81810290505b9392505050565b5f614da682613d2e565b9150614db183613f35565b9250614dde7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484614ccb565b905092915050565b5f614df082613d2e565b9150614dfb83613d2e565b9250828202614e0981613d2e565b91508282048414831517614e2057614e1f6144eb565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614e5e82613d2e565b9150614e6983613d2e565b925082614e7957614e78614e27565b5b828204905092915050565b5f819050919050565b5f614ea7614ea2614e9d84614e84565b6141c9565b613d2e565b9050919050565b614eb781614e8d565b82525050565b5f81519050919050565b5f819050602082019050919050565b5f602082019050919050565b5f614eec82614ebd565b614ef6818561480c565b9350614f0183614ec7565b805f5b83811015614f31578151614f188882614834565b9750614f2383614ed6565b925050600181019050614f04565b5085935050505092915050565b5f614f48826141f3565b9050919050565b614f5881614f3e565b82525050565b5f60a082019050614f715f830188613e7f565b614f7e6020830187614eae565b8181036040830152614f908186614ee2565b9050614f9f6060830185614f4f565b614fac6080830184613e7f565b969550505050505056fea2646970667358221220753fc434f9eb701d3e281a481ae64ce5d2c17caee17907ed28645e1da76c188b64736f6c6343000818003300000000000000000000000032a691b6a501f2c06120028fa9bbe8053384be8700000000000000000000000000000000000000000000000000000000000003e7

Deployed Bytecode

0x6080604052600436106102b1575f3560e01c80638144ec0c11610174578063b88d4fde116100db578063d547cfb711610094578063e30c39781161006e578063e30c397814610a8a578063e985e9c514610ab4578063f2fde38b14610af0578063fbf6eaa514610b18576102b8565b8063d547cfb7146109fc578063dd62ed3e14610a26578063e0df5b6f14610a62576102b8565b8063b88d4fde146108f4578063bb8c3ee01461091c578063c024666814610946578063c492f0461461096e578063c816841b14610996578063c87b56dd146109c0576102b8565b80639b19251a1161012d5780639b19251a146107c8578063a22cb46514610804578063a4de3c191461082c578063a9059cbb14610854578063aacebbe314610890578063b62496f5146108b8576102b8565b80638144ec0c146106c05780638768a9cd146106e85780638da5cb5b14610724578063908bb2ae1461074e57806395d89b41146107765780639a7a23d6146107a0576102b8565b806353d6fd591161021857806370a08231116101d157806370a08231146105da578063715018a614610616578063735de9f71461062c57806375f0a8741461065657806379ba5097146106805780637a49325114610696576102b8565b806353d6fd59146104d057806357e871e7146104f85780635c975abb146105225780636352211e1461054c57806365048d081461058857806368b4cac9146105b2576102b8565b80632740c1971161026a5780632740c197146103da578063313ce56714610402578063423ce9cc1461042c57806342842e0e146104565780634f02c4201461047e578063504334c2146104a8576102b8565b806306fdde03146102bc578063081812fc146102e6578063095ea7b31461032257806318160ddd1461035e578063201e908e1461038857806323b872dd146103b2576102b8565b366102b857005b5f80fd5b3480156102c7575f80fd5b506102d0610b2e565b6040516102dd9190613cfd565b60405180910390f35b3480156102f1575f80fd5b5061030c60048036038101906103079190613d61565b610bba565b6040516103199190613dcb565b60405180910390f35b34801561032d575f80fd5b5061034860048036038101906103439190613e0e565b610bea565b6040516103559190613e66565b60405180910390f35b348015610369575f80fd5b50610372610ed1565b60405161037f9190613e8e565b60405180910390f35b348015610393575f80fd5b5061039c610ef5565b6040516103a99190613e8e565b60405180910390f35b3480156103bd575f80fd5b506103d860048036038101906103d39190613ea7565b610efb565b005b3480156103e5575f80fd5b5061040060048036038101906103fb9190613ef7565b6116f2565b005b34801561040d575f80fd5b5061041661170c565b6040516104239190613f50565b60405180910390f35b348015610437575f80fd5b50610440611730565b60405161044d9190613e66565b60405180910390f35b348015610461575f80fd5b5061047c60048036038101906104779190613ea7565b611743565b005b348015610489575f80fd5b50610492611872565b60405161049f9190613e8e565b60405180910390f35b3480156104b3575f80fd5b506104ce60048036038101906104c99190614095565b611878565b005b3480156104db575f80fd5b506104f660048036038101906104f19190614135565b61188e565b005b348015610503575f80fd5b5061050c6118ee565b6040516105199190613e8e565b60405180910390f35b34801561052d575f80fd5b506105366118f4565b6040516105439190613e66565b60405180910390f35b348015610557575f80fd5b50610572600480360381019061056d9190613d61565b611909565b60405161057f9190613dcb565b60405180910390f35b348015610593575f80fd5b5061059c6119a7565b6040516105a99190613e8e565b60405180910390f35b3480156105bd575f80fd5b506105d860048036038101906105d39190614173565b6119ad565b005b3480156105e5575f80fd5b5061060060048036038101906105fb919061419e565b611a09565b60405161060d9190613e8e565b60405180910390f35b348015610621575f80fd5b5061062a611a1e565b005b348015610637575f80fd5b50610640611a31565b60405161064d9190614224565b60405180910390f35b348015610661575f80fd5b5061066a611a56565b604051610677919061425d565b60405180910390f35b34801561068b575f80fd5b50610694611a7b565b005b3480156106a1575f80fd5b506106aa611b09565b6040516106b79190613e8e565b60405180910390f35b3480156106cb575f80fd5b506106e660048036038101906106e19190613d61565b611b0f565b005b3480156106f3575f80fd5b5061070e6004803603810190610709919061419e565b611b5a565b60405161071b9190613e66565b60405180910390f35b34801561072f575f80fd5b50610738611b77565b6040516107459190613dcb565b60405180910390f35b348015610759575f80fd5b50610774600480360381019061076f919061419e565b611b9e565b005b348015610781575f80fd5b5061078a6120ed565b6040516107979190613cfd565b60405180910390f35b3480156107ab575f80fd5b506107c660048036038101906107c19190614135565b612179565b005b3480156107d3575f80fd5b506107ee60048036038101906107e9919061419e565b61218f565b6040516107fb9190613e66565b60405180910390f35b34801561080f575f80fd5b5061082a60048036038101906108259190614135565b6121ac565b005b348015610837575f80fd5b50610852600480360381019061084d9190614135565b6122a4565b005b34801561085f575f80fd5b5061087a60048036038101906108759190613e0e565b612352565b6040516108879190613e66565b60405180910390f35b34801561089b575f80fd5b506108b660048036038101906108b1919061419e565b612366565b005b3480156108c3575f80fd5b506108de60048036038101906108d9919061419e565b6123b1565b6040516108eb9190613e66565b60405180910390f35b3480156108ff575f80fd5b5061091a600480360381019061091591906142d3565b6123ce565b005b348015610927575f80fd5b50610930612503565b60405161093d9190613e8e565b60405180910390f35b348015610951575f80fd5b5061096c60048036038101906109679190614135565b612509565b005b348015610979575f80fd5b50610994600480360381019061098f91906143ac565b6125b7565b005b3480156109a1575f80fd5b506109aa612695565b6040516109b79190613dcb565b60405180910390f35b3480156109cb575f80fd5b506109e660048036038101906109e19190613d61565b6126ba565b6040516109f39190613cfd565b60405180910390f35b348015610a07575f80fd5b50610a10612718565b604051610a1d9190613cfd565b60405180910390f35b348015610a31575f80fd5b50610a4c6004803603810190610a479190614409565b6127a4565b604051610a599190613e8e565b60405180910390f35b348015610a6d575f80fd5b50610a886004803603810190610a839190614447565b6127c4565b005b348015610a95575f80fd5b50610a9e6127df565b604051610aab9190613dcb565b60405180910390f35b348015610abf575f80fd5b50610ada6004803603810190610ad59190614409565b612807565b604051610ae79190613e66565b60405180910390f35b348015610afb575f80fd5b50610b166004803603810190610b11919061419e565b612831565b005b348015610b23575f80fd5b50610b2c6128dd565b005b60028054610b3b906144bb565b80601f0160208091040260200160405190810160405280929190818152602001828054610b67906144bb565b8015610bb25780601f10610b8957610100808354040283529160200191610bb2565b820191905f5260205f20905b815481529060010190602001808311610b9557829003601f168201915b505050505081565b6007602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f6004548211158015610bfc57505f82115b15610de4575f60095f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610cf3575060085f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15610d2a576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360075f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610dd69190613e8e565b60405180910390a350610ec7565b8160065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610ebe9190613e8e565b60405180910390a35b6001905092915050565b7f00000000000000000000000000000000000000000000003627e8f712373c000081565b601a5481565b60045481116115b35760095f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610f99576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ffe576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156110bc575060085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015611124575060075f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b1561115b576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111636128ee565b60055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546111ae9190614518565b925050819055506111bd6128ee565b60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160095f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060075f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555f600a5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001600a5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490506113139190614518565b815481106113245761132361454b565b5b905f5260205f200154905080600a5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600b5f8581526020019081526020015f2054815481106113905761138f61454b565b5b905f5260205f200181905550600a5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054806113e9576113e8614578565b5b600190038181905f5260205f20015f90559055600b5f8381526020019081526020015f2054600b5f8381526020019081526020015f2081905550600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2082908060018154018082558091505060019003905f5260205f20015f90919091909150556001600a5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490506114d19190614518565b600b5f8481526020019081526020015f2081905550818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314876115986128ee565b6040516115a59190613e8e565b60405180910390a3506116ed565b5f60065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146116df5781816116629190614518565b60065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b6116ea848484612921565b50505b505050565b6116fa612cee565b81601481905550806015819055505050565b7f000000000000000000000000000000000000000000000000000000000000001281565b601160159054906101000a900460ff1681565b61174e838383610efb565b5f8273ffffffffffffffffffffffffffffffffffffffff163b14158015611836575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b81526004016117d4939291906145d8565b6020604051808303815f875af11580156117f0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118149190614675565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b1561186d576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60045481565b611880612cee565b61188a8282612d75565b5050565b611896612cee565b80600c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b60195481565b5f600d5f9054906101000a900460ff16905090565b5f60095f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036119a2576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60155481565b6119b5612cee565b80601160156101000a81548160ff0219169083151502179055507f701507a13d5701687328d70ea5a717a33a062f46c229a785b315fb4517fef069816040516119fe9190613e66565b60405180910390a150565b6005602052805f5260405f205f915090505481565b611a26612cee565b611a2f5f612d99565b565b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f611a84612dc9565b90508073ffffffffffffffffffffffffffffffffffffffff16611aa56127df565b73ffffffffffffffffffffffffffffffffffffffff1614611afd57806040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611af49190613dcb565b60405180910390fd5b611b0681612d99565b50565b60135481565b611b17612cee565b806013819055507f4fbe9e6627324d6e978a35ce6052f4445d8b166102b1901a17da2cec33af62fc601354604051611b4f9190613e8e565b60405180910390a150565b6017602052805f5260405f205f915054906101000a900460ff1681565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611ba6612cee565b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2c90614710565b60405180910390fd5b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fb6bf376037f707ef439f1e5e56d7987d6b0c55798fe21ff475fd00b1f37ed92060405160405180910390a38060105f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d5b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d7f9190614742565b73ffffffffffffffffffffffffffffffffffffffff1663e6a439053060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e05573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e299190614742565b6040518363ffffffff1660e01b8152600401611e4692919061476d565b602060405180830381865afa158015611e61573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e859190614742565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036120525760105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f24573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f489190614742565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fce573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ff29190614742565b6040518363ffffffff1660e01b815260040161200f92919061476d565b6020604051808303815f875af115801561202b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061204f9190614742565b90505b61207d60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff165f612dd0565b8060115f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506120e960115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001612dd0565b5050565b600380546120fa906144bb565b80601f0160208091040260200160405190810160405280929190818152602001828054612126906144bb565b80156121715780601f1061214857610100808354040283529160200191612171565b820191905f5260205f20905b81548152906001019060200180831161215457829003601f168201915b505050505081565b612181612cee565b61218b8282612dd0565b5050565b600c602052805f5260405f205f915054906101000a900460ff1681565b8060085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122989190613e66565b60405180910390a35050565b6122ac612cee565b8060175f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fd3d1fab5db42ae85293059c69e12bf01ffffb1dd5ff4caa5e5568f99fc387f24826040516123469190613e66565b60405180910390a25050565b5f61235e338484612921565b905092915050565b61236e612cee565b8060125f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6018602052805f5260405f205f915054906101000a900460ff1681565b6123d9858585610efb565b5f8473ffffffffffffffffffffffffffffffffffffffff163b141580156124c5575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff1663150b7a0233888787876040518663ffffffff1660e01b81526004016124639594939291906147c0565b6020604051808303815f875af115801561247f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124a39190614675565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b156124fc576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b60145481565b612511612cee565b8060165f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7826040516125ab9190613e66565b60405180910390a25050565b6125bf612cee565b5f5b83839050811015612654578160165f8686858181106125e3576125e261454b565b5b90506020020160208101906125f8919061419e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555080806001019150506125c1565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b35838383604051612688939291906148c8565b60405180910390a1505050565b60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60605f600f80546126ca906144bb565b9050116126e55760405180602001604052805f815250612711565b600f6126f083612e6e565b6040516020016127019291906149ea565b6040516020818303038152906040525b9050919050565b600f8054612725906144bb565b80601f0160208091040260200160405190810160405280929190818152602001828054612751906144bb565b801561279c5780601f106127735761010080835404028352916020019161279c565b820191905f5260205f20905b81548152906001019060200180831161277f57829003601f168201915b505050505081565b6006602052815f5260405f20602052805f5260405f205f91509150505481565b6127cc612cee565b80600f90816127db9190614b9e565b5050565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6008602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b612839612cee565b8060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16612898611b77565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6128e5612cee565b43601981905550565b5f7f0000000000000000000000000000000000000000000000000000000000000012600a61291c9190614d9c565b905090565b5f61292a612f38565b601160159054906101000a900460ff1615612a42575f60055f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60135482101590508080156129a35750601160149054906101000a900460ff16155b80156129f6575060185f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15612a3f576001601160146101000a81548160ff0219169083151502179055506013549150612a2482612f79565b5f601160146101000a81548160ff0219169083151502179055505b50505b60175f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015612a9957505f601954145b15612aa657436019819055505b5f6001905060165f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680612b46575060165f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b15612b4f575f90505b8015612cd9575f60175f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680612bf1575060175f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b15612cd757601a5460195443612c079190614518565b11612c2c576064606385612c1b9190614de6565b612c259190614e54565b9050612cbc565b60175f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615612c9d5761271060145485612c8c9190614de6565b612c969190614e54565b9050612cbb565b61271060155485612cae9190614de6565b612cb89190614e54565b90505b5b8084612cc89190614518565b9350612cd5863083613242565b505b505b612ce4858585613242565b9150509392505050565b612cf6612dc9565b73ffffffffffffffffffffffffffffffffffffffff16612d14611b77565b73ffffffffffffffffffffffffffffffffffffffff1614612d7357612d37612dc9565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401612d6a9190613dcb565b60405180910390fd5b565b8160029081612d849190614b9e565b508060039081612d949190614b9e565b505050565b60015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055612dc681613586565b50565b5f33905090565b8060185f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b60605f6001612e7c84613647565b0190505f8167ffffffffffffffff811115612e9a57612e99613f71565b5b6040519080825280601f01601f191660200182016040528015612ecc5781602001600182028036833780820191505090505b5090505f82602001820190505b600115612f2d578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612f2257612f21614e27565b5b0494505f8503612ed9575b819350505050919050565b612f406118f4565b15612f77576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f600267ffffffffffffffff811115612f9557612f94613f71565b5b604051908082528060200260200182016040528015612fc35781602001602082028036833780820191505090505b50905030815f81518110612fda57612fd961454b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561307e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130a29190614742565b816001815181106130b6576130b561454b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508160065f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8460125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b8152600401613211959493929190614f5e565b5f604051808303815f87803b158015613228575f80fd5b505af115801561323a573d5f803e3d5ffd5b505050505050565b5f8061324c6128ee565b90505f60055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508460055f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461331c9190614518565b925050819055508460055f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540192505081905550600c5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16613440575f8360055f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546134059190614e54565b84846134119190614e54565b61341b9190614518565b90505f5b8181101561343d5761343089613798565b808060010191505061341f565b50505b600c5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16613513575f838261349b9190614e54565b8460055f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546134e49190614e54565b6134ee9190614518565b90505f5b8181101561351057613503886139dd565b80806001019150506134f2565b50505b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487876040516135709190613e8e565b60405180910390a3600193505050509392505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106136a3577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161369957613698614e27565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106136e0576d04ee2d6d415b85acef810000000083816136d6576136d5614e27565b5b0492506020810190505b662386f26fc10000831061370f57662386f26fc10000838161370557613704614e27565b5b0492506010810190505b6305f5e1008310613738576305f5e100838161372e5761372d614e27565b5b0492506008810190505b612710831061375d57612710838161375357613752614e27565b5b0492506004810190505b60648310613780576064838161377657613775614e27565b5b0492506002810190505b600a831061378f576001810190505b80915050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036137fd576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001600a5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490506138889190614518565b815481106138995761389861454b565b5b905f5260205f2001549050600a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054806138f1576138f0614578565b5b600190038181905f5260205f20015f90559055600b5f8281526020019081526020015f205f905560095f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560075f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055805f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6139e5612f38565b6139ee816139f1565b50565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613a56576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60045f81548092919060010191905055505f60045490505f73ffffffffffffffffffffffffffffffffffffffff1660095f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613b02576040517f23369fa600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160095f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f90919091909150556001600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050613bff9190614518565b600b5f8381526020019081526020015f2081905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613caa578082015181840152602081019050613c8f565b5f8484015250505050565b5f601f19601f8301169050919050565b5f613ccf82613c73565b613cd98185613c7d565b9350613ce9818560208601613c8d565b613cf281613cb5565b840191505092915050565b5f6020820190508181035f830152613d158184613cc5565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b613d4081613d2e565b8114613d4a575f80fd5b50565b5f81359050613d5b81613d37565b92915050565b5f60208284031215613d7657613d75613d26565b5b5f613d8384828501613d4d565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613db582613d8c565b9050919050565b613dc581613dab565b82525050565b5f602082019050613dde5f830184613dbc565b92915050565b613ded81613dab565b8114613df7575f80fd5b50565b5f81359050613e0881613de4565b92915050565b5f8060408385031215613e2457613e23613d26565b5b5f613e3185828601613dfa565b9250506020613e4285828601613d4d565b9150509250929050565b5f8115159050919050565b613e6081613e4c565b82525050565b5f602082019050613e795f830184613e57565b92915050565b613e8881613d2e565b82525050565b5f602082019050613ea15f830184613e7f565b92915050565b5f805f60608486031215613ebe57613ebd613d26565b5b5f613ecb86828701613dfa565b9350506020613edc86828701613dfa565b9250506040613eed86828701613d4d565b9150509250925092565b5f8060408385031215613f0d57613f0c613d26565b5b5f613f1a85828601613d4d565b9250506020613f2b85828601613d4d565b9150509250929050565b5f60ff82169050919050565b613f4a81613f35565b82525050565b5f602082019050613f635f830184613f41565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613fa782613cb5565b810181811067ffffffffffffffff82111715613fc657613fc5613f71565b5b80604052505050565b5f613fd8613d1d565b9050613fe48282613f9e565b919050565b5f67ffffffffffffffff82111561400357614002613f71565b5b61400c82613cb5565b9050602081019050919050565b828183375f83830152505050565b5f61403961403484613fe9565b613fcf565b90508281526020810184848401111561405557614054613f6d565b5b614060848285614019565b509392505050565b5f82601f83011261407c5761407b613f69565b5b813561408c848260208601614027565b91505092915050565b5f80604083850312156140ab576140aa613d26565b5b5f83013567ffffffffffffffff8111156140c8576140c7613d2a565b5b6140d485828601614068565b925050602083013567ffffffffffffffff8111156140f5576140f4613d2a565b5b61410185828601614068565b9150509250929050565b61411481613e4c565b811461411e575f80fd5b50565b5f8135905061412f8161410b565b92915050565b5f806040838503121561414b5761414a613d26565b5b5f61415885828601613dfa565b925050602061416985828601614121565b9150509250929050565b5f6020828403121561418857614187613d26565b5b5f61419584828501614121565b91505092915050565b5f602082840312156141b3576141b2613d26565b5b5f6141c084828501613dfa565b91505092915050565b5f819050919050565b5f6141ec6141e76141e284613d8c565b6141c9565b613d8c565b9050919050565b5f6141fd826141d2565b9050919050565b5f61420e826141f3565b9050919050565b61421e81614204565b82525050565b5f6020820190506142375f830184614215565b92915050565b5f61424782613d8c565b9050919050565b6142578161423d565b82525050565b5f6020820190506142705f83018461424e565b92915050565b5f80fd5b5f80fd5b5f8083601f84011261429357614292613f69565b5b8235905067ffffffffffffffff8111156142b0576142af614276565b5b6020830191508360018202830111156142cc576142cb61427a565b5b9250929050565b5f805f805f608086880312156142ec576142eb613d26565b5b5f6142f988828901613dfa565b955050602061430a88828901613dfa565b945050604061431b88828901613d4d565b935050606086013567ffffffffffffffff81111561433c5761433b613d2a565b5b6143488882890161427e565b92509250509295509295909350565b5f8083601f84011261436c5761436b613f69565b5b8235905067ffffffffffffffff81111561438957614388614276565b5b6020830191508360208202830111156143a5576143a461427a565b5b9250929050565b5f805f604084860312156143c3576143c2613d26565b5b5f84013567ffffffffffffffff8111156143e0576143df613d2a565b5b6143ec86828701614357565b935093505060206143ff86828701614121565b9150509250925092565b5f806040838503121561441f5761441e613d26565b5b5f61442c85828601613dfa565b925050602061443d85828601613dfa565b9150509250929050565b5f6020828403121561445c5761445b613d26565b5b5f82013567ffffffffffffffff81111561447957614478613d2a565b5b61448584828501614068565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806144d257607f821691505b6020821081036144e5576144e461448e565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61452282613d2e565b915061452d83613d2e565b9250828203905081811115614545576145446144eb565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b5f82825260208201905092915050565b50565b5f6145c35f836145a5565b91506145ce826145b5565b5f82019050919050565b5f6080820190506145eb5f830186613dbc565b6145f86020830185613dbc565b6146056040830184613e7f565b8181036060830152614616816145b8565b9050949350505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61465481614620565b811461465e575f80fd5b50565b5f8151905061466f8161464b565b92915050565b5f6020828403121561468a57614689613d26565b5b5f61469784828501614661565b91505092915050565b7f54686520726f7574657220616c726561647920686173207468617420616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f6146fa602383613c7d565b9150614705826146a0565b604082019050919050565b5f6020820190508181035f830152614727816146ee565b9050919050565b5f8151905061473c81613de4565b92915050565b5f6020828403121561475757614756613d26565b5b5f6147648482850161472e565b91505092915050565b5f6040820190506147805f830185613dbc565b61478d6020830184613dbc565b9392505050565b5f61479f83856145a5565b93506147ac838584614019565b6147b583613cb5565b840190509392505050565b5f6080820190506147d35f830188613dbc565b6147e06020830187613dbc565b6147ed6040830186613e7f565b8181036060830152614800818486614794565b90509695505050505050565b5f82825260208201905092915050565b5f819050919050565b61482e81613dab565b82525050565b5f61483f8383614825565b60208301905092915050565b5f6148596020840184613dfa565b905092915050565b5f602082019050919050565b5f614878838561480c565b93506148838261481c565b805f5b858110156148bb57614898828461484b565b6148a28882614834565b97506148ad83614861565b925050600181019050614886565b5085925050509392505050565b5f6040820190508181035f8301526148e181858761486d565b90506148f06020830184613e57565b949350505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154614920816144bb565b61492a81866148f8565b9450600182165f811461494457600181146149595761498b565b60ff198316865281151582028601935061498b565b61496285614902565b5f5b8381101561498357815481890152600182019150602081019050614964565b838801955050505b50505092915050565b5f61499e82613c73565b6149a881856148f8565b93506149b8818560208601613c8d565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815250565b5f6149f58285614914565b9150614a018284614994565b9150614a0c826149c4565b6005820191508190509392505050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302614a667fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614a2b565b614a708683614a2b565b95508019841693508086168417925050509392505050565b5f614aa2614a9d614a9884613d2e565b6141c9565b613d2e565b9050919050565b5f819050919050565b614abb83614a88565b614acf614ac782614aa9565b848454614a37565b825550505050565b5f90565b614ae3614ad7565b614aee818484614ab2565b505050565b5b81811015614b1157614b065f82614adb565b600181019050614af4565b5050565b601f821115614b5657614b2781614902565b614b3084614a1c565b81016020851015614b3f578190505b614b53614b4b85614a1c565b830182614af3565b50505b505050565b5f82821c905092915050565b5f614b765f1984600802614b5b565b1980831691505092915050565b5f614b8e8383614b67565b9150826002028217905092915050565b614ba782613c73565b67ffffffffffffffff811115614bc057614bbf613f71565b5b614bca82546144bb565b614bd5828285614b15565b5f60209050601f831160018114614c06575f8415614bf4578287015190505b614bfe8582614b83565b865550614c65565b601f198416614c1486614902565b5f5b82811015614c3b57848901518255600182019150602085019450602081019050614c16565b86831015614c585784890151614c54601f891682614b67565b8355505b6001600288020188555050505b505050505050565b5f8160011c9050919050565b5f808291508390505b6001851115614cc257808604811115614c9e57614c9d6144eb565b5b6001851615614cad5780820291505b8081029050614cbb85614c6d565b9450614c82565b94509492505050565b5f82614cda5760019050614d95565b81614ce7575f9050614d95565b8160018114614cfd5760028114614d0757614d36565b6001915050614d95565b60ff841115614d1957614d186144eb565b5b8360020a915084821115614d3057614d2f6144eb565b5b50614d95565b5060208310610133831016604e8410600b8410161715614d6b5782820a905083811115614d6657614d656144eb565b5b614d95565b614d788484846001614c79565b92509050818404811115614d8f57614d8e6144eb565b5b81810290505b9392505050565b5f614da682613d2e565b9150614db183613f35565b9250614dde7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484614ccb565b905092915050565b5f614df082613d2e565b9150614dfb83613d2e565b9250828202614e0981613d2e565b91508282048414831517614e2057614e1f6144eb565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614e5e82613d2e565b9150614e6983613d2e565b925082614e7957614e78614e27565b5b828204905092915050565b5f819050919050565b5f614ea7614ea2614e9d84614e84565b6141c9565b613d2e565b9050919050565b614eb781614e8d565b82525050565b5f81519050919050565b5f819050602082019050919050565b5f602082019050919050565b5f614eec82614ebd565b614ef6818561480c565b9350614f0183614ec7565b805f5b83811015614f31578151614f188882614834565b9750614f2383614ed6565b925050600181019050614f04565b5085935050505092915050565b5f614f48826141f3565b9050919050565b614f5881614f3e565b82525050565b5f60a082019050614f715f830188613e7f565b614f7e6020830187614eae565b8181036040830152614f908186614ee2565b9050614f9f6060830185614f4f565b614fac6080830184613e7f565b969550505050505056fea2646970667358221220753fc434f9eb701d3e281a481ae64ce5d2c17caee17907ed28645e1da76c188b64736f6c63430008180033

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

00000000000000000000000032a691b6a501f2c06120028fa9bbe8053384be8700000000000000000000000000000000000000000000000000000000000003e7

-----Decoded View---------------
Arg [0] : _owner (address): 0x32a691b6A501f2C06120028fA9BbE8053384Be87
Arg [1] : _initialSupply (uint256): 999

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000032a691b6a501f2c06120028fa9bbe8053384be87
Arg [1] : 00000000000000000000000000000000000000000000000000000000000003e7


Deployed Bytecode Sourcemap

51647:8590:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34587:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35298:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37129:642;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34823:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52522:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38178:1716;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56803:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34723:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51922:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40190:405;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34958:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59878:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36458:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52489:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26369:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36641:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52184:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54374:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35064:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29742:103;;;;;;;;;;;;;:::i;:::-;;51815:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51972:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32379:235;;;;;;;;;;;;;:::i;:::-;;52082:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56488:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52372:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29067:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54533:855;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34641:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56317:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35909:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37822:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55807:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39953:160;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56671:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52423:57;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40690:437;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52142:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55592:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55979:330;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51859:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60044:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51705:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35178:64;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59764:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31467:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35409:68;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31767:181;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56946:88;;;;;;;;;;;;;:::i;:::-;;34587:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35298:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;37129:642::-;37232:4;37267:6;;37253:10;:20;;:38;;;;;37290:1;37277:10;:14;37253:38;37249:491;;;37308:13;37324:8;:20;37333:10;37324:20;;;;;;;;;;;;;;;;;;;;;37308:36;;37379:5;37365:19;;:10;:19;;;;:59;;;;;37389:16;:23;37406:5;37389:23;;;;;;;;;;;;;;;:35;37413:10;37389:35;;;;;;;;;;;;;;;;;;;;;;;;;37388:36;37365:59;37361:121;;;37452:14;;;;;;;;;;;;;;37361:121;37524:7;37498:11;:23;37510:10;37498:23;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;37569:7;37553:36;;37562:5;37553:36;;;37578:10;37553:36;;;;;;:::i;:::-;;;;;;;;37293:308;37249:491;;;37655:10;37622:9;:21;37632:10;37622:21;;;;;;;;;;;;;;;:30;37644:7;37622:30;;;;;;;;;;;;;;;:43;;;;37708:7;37687:41;;37696:10;37687:41;;;37717:10;37687:41;;;;;;:::i;:::-;;;;;;;;37249:491;37759:4;37752:11;;37129:642;;;;:::o;34823:36::-;;;:::o;52522:32::-;;;;:::o;38178:1716::-;38324:6;;38310:10;:20;38306:1581;;38359:8;:20;38368:10;38359:20;;;;;;;;;;;;;;;;;;;;;38351:28;;:4;:28;;;38347:91;;38407:15;;;;;;;;;;;;;;38347:91;38472:1;38458:16;;:2;:16;;;38454:82;;38502:18;;;;;;;;;;;;;;38454:82;38588:4;38574:18;;:10;:18;;;;:74;;;;;38614:16;:22;38631:4;38614:22;;;;;;;;;;;;;;;:34;38637:10;38614:34;;;;;;;;;;;;;;;;;;;;;;;;;38613:35;38574:74;:132;;;;;38683:11;:23;38695:10;38683:23;;;;;;;;;;;;;;;;;;;;;38669:37;;:10;:37;;;;38574:132;38552:226;;;38748:14;;;;;;;;;;;;;;38552:226;38813:10;:8;:10::i;:::-;38794:9;:15;38804:4;38794:15;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;38886:10;:8;:10::i;:::-;38869:9;:13;38879:2;38869:13;;;;;;;;;;;;;;;;:27;;;;;;;;;;;38951:2;38928:8;:20;38937:10;38928:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;38975:11;:23;38987:10;38975:23;;;;;;;;;;;;38968:30;;;;;;;;;;;39056:17;39076:6;:12;39083:4;39076:12;;;;;;;;;;;;;;;39111:1;39089:6;:12;39096:4;39089:12;;;;;;;;;;;;;;;:19;;;;:23;;;;:::i;:::-;39076:37;;;;;;;;:::i;:::-;;;;;;;;;;39056:57;;39168:9;39128:6;:12;39135:4;39128:12;;;;;;;;;;;;;;;39141:11;:23;39153:10;39141:23;;;;;;;;;;;;39128:37;;;;;;;;:::i;:::-;;;;;;;;;:49;;;;39212:6;:12;39219:4;39212:12;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39316:11;:23;39328:10;39316:23;;;;;;;;;;;;39291:11;:22;39303:9;39291:22;;;;;;;;;;;:48;;;;39393:6;:10;39400:2;39393:10;;;;;;;;;;;;;;;39409;39393:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39523:1;39503:6;:10;39510:2;39503:10;;;;;;;;;;;;;;;:17;;;;:21;;;;:::i;:::-;39477:11;:23;39489:10;39477:23;;;;;;;;;;;:47;;;;39565:10;39561:2;39546:30;;39555:4;39546:30;;;;;;;;;;;;39616:2;39596:35;;39610:4;39596:35;;;39620:10;:8;:10::i;:::-;39596:35;;;;;;:::i;:::-;;;;;;;;38332:1311;38306:1581;;;39664:15;39682:9;:15;39692:4;39682:15;;;;;;;;;;;;;;;:27;39698:10;39682:27;;;;;;;;;;;;;;;;39664:45;;39741:17;39730:7;:28;39726:101;;39817:10;39807:7;:20;;;;:::i;:::-;39777:9;:15;39787:4;39777:15;;;;;;;;;;;;;;;:27;39793:10;39777:27;;;;;;;;;;;;;;;:50;;;;39726:101;39844:31;39854:4;39860:2;39864:10;39844:9;:31::i;:::-;;39649:238;38306:1581;38178:1716;;;:::o;56803:135::-;28953:13;:11;:13::i;:::-;56894:6:::1;56883:8;:17;;;;56923:7;56911:9;:19;;;;56803:135:::0;;:::o;34723:31::-;;;:::o;51922:41::-;;;;;;;;;;;;;:::o;40190:405::-;40314:26;40327:4;40333:2;40337;40314:12;:26::i;:::-;40389:1;40371:2;:14;;;:19;;:154;;;;;40485:40;;;40407:118;;;40422:2;40407:35;;;40443:10;40455:4;40461:2;40407:61;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:118;;;;;40371:154;40353:235;;;40559:17;;;;;;;;;;;;;;40353:235;40190:405;;;:::o;34958:21::-;;;;:::o;59878:158::-;28953:13;:11;:13::i;:::-;59998:30:::1;60013:5;60020:7;59998:14;:30::i;:::-;59878:158:::0;;:::o;36458:111::-;28953:13;:11;:13::i;:::-;36556:5:::1;36536:9;:17;36546:6;36536:17;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;36458:111:::0;;:::o;52489:26::-;;;;:::o;26369:86::-;26416:4;26440:7;;;;;;;;;;;26433:14;;26369:86;:::o;36641:193::-;36699:13;36733:8;:12;36742:2;36733:12;;;;;;;;;;;;;;;;;;;;;36725:20;;36779:1;36762:19;;:5;:19;;;36758:69;;36805:10;;;;;;;;;;;;;;36758:69;36641:193;;;:::o;52184:29::-;;;;:::o;54374:151::-;28953:13;:11;:13::i;:::-;54469:5:::1;54445:21;;:29;;;;;;;;;;;;;;;;;;54490:27;54511:5;54490:27;;;;;;:::i;:::-;;;;;;;;54374:151:::0;:::o;35064:44::-;;;;;;;;;;;;;;;;;:::o;29742:103::-;28953:13;:11;:13::i;:::-;29807:30:::1;29834:1;29807:18;:30::i;:::-;29742:103::o:0;51815:37::-;;;;;;;;;;;;;:::o;51972:101::-;;;;;;;;;;;;;:::o;32379:235::-;32432:14;32449:12;:10;:12::i;:::-;32432:29;;32494:6;32476:24;;:14;:12;:14::i;:::-;:24;;;32472:98;;32551:6;32524:34;;;;;;;;;;;:::i;:::-;;;;;;;;32472:98;32580:26;32599:6;32580:18;:26::i;:::-;32421:193;32379:235::o;52082:51::-;;;;:::o;56488:175::-;28953:13;:11;:13::i;:::-;56588:12:::1;56568:17;:32;;;;56616:39;56637:17;;56616:39;;;;;;:::i;:::-;;;;;;;;56488:175:::0;:::o;52372:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;29067:87::-;29113:7;29140:6;;;;;;;;;;;29133:13;;29067:87;:::o;54533:855::-;28953:13;:11;:13::i;:::-;54654::::1;;;;;;;;;;;54632:36;;:10;:36;;::::0;54610:121:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;54787:13;;;;;;;;;;;54747:55;;54767:10;54747:55;;;;;;;;;;;;54846:10;54813:13;;:44;;;;;;;;;;;;;;;;;;54868:20;54930:13;;;;;;;;;;;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54914:48;;;54985:4;55005:13;;;;;;;;;;;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54914:122;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54899:137;;55075:1;55051:26;;:12;:26;;::::0;55047:180:::1;;55125:13;;;;;;;;;;;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55109:69;;;55187:4;55194:13;;;;;;;;;;;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55109:106;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55094:121;;55047:180;55237:48;55266:11;;;;;;;;;;;55279:5;55237:28;:48::i;:::-;55310:12;55296:11;;:26;;;;;;;;;;;;;;;;;;55333:47;55362:11;;;;;;;;;;;55375:4;55333:28;:47::i;:::-;54599:789;54533:855:::0;:::o;34641:20::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56317:163::-;28953:13;:11;:13::i;:::-;56431:41:::1;56460:4;56466:5;56431:28;:41::i;:::-;56317:163:::0;;:::o;35909:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;37822:207::-;37949:8;37908:16;:28;37925:10;37908:28;;;;;;;;;;;;;;;:38;37937:8;37908:38;;;;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;38002:8;37975:46;;37990:10;37975:46;;;38012:8;37975:46;;;;;;:::i;:::-;;;;;;;;37822:207;;:::o;55807:164::-;28953:13;:11;:13::i;:::-;55912:8:::1;55890:10;:19;55901:7;55890:19;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;55945:7;55938:25;;;55954:8;55938:25;;;;;;:::i;:::-;;;;;;;;55807:164:::0;;:::o;39953:160::-;40048:4;40072:33;40082:10;40094:2;40098:6;40072:9;:33::i;:::-;40065:40;;39953:160;;;;:::o;56671:124::-;28953:13;:11;:13::i;:::-;56776:10:::1;56750:15;;:37;;;;;;;;;;;;;;;;;;56671:124:::0;:::o;52423:57::-;;;;;;;;;;;;;;;;;;;;;;:::o;40690:437::-;40844:26;40857:4;40863:2;40867;40844:12;:26::i;:::-;40919:1;40901:2;:14;;;:19;;:156;;;;;41017:40;;;40937:120;;;40952:2;40937:35;;;40973:10;40985:4;40991:2;40995:4;;40937:63;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:120;;;;;40901:156;40883:237;;;41091:17;;;;;;;;;;;;;;40883:237;40690:437;;;;;:::o;52142:29::-;;;;:::o;55592:207::-;28953:13;:11;:13::i;:::-;55731:8:::1;55700:19;:28;55720:7;55700:28;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;55773:7;55757:34;;;55782:8;55757:34;;;;;;:::i;:::-;;;;;;;;55592:207:::0;;:::o;55979:330::-;28953:13;:11;:13::i;:::-;56122:9:::1;56117:116;56141:8;;:15;;56137:1;:19;56117:116;;;56213:8;56178:19;:32;56198:8;;56207:1;56198:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;56178:32;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;56158:3;;;;;;;56117:116;;;;56250:51;56282:8;;56292;56250:51;;;;;;;;:::i;:::-;;;;;;;;55979:330:::0;;;:::o;51859:26::-;;;;;;;;;;;;;:::o;60044:190::-;60104:13;60166:1;60143:12;60137:26;;;;;:::i;:::-;;;:30;:89;;;;;;;;;;;;;;;;;60184:12;60198:13;:2;:11;:13::i;:::-;60170:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60137:89;60130:96;;60044:190;;;:::o;51705:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35178:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;59764:106::-;28953:13;:11;:13::i;:::-;59853:9:::1;59838:12;:24;;;;;;:::i;:::-;;59764:106:::0;:::o;31467:101::-;31520:7;31547:13;;;;;;;;;;;31540:20;;31467:101;:::o;35409:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31767:181::-;28953:13;:11;:13::i;:::-;31873:8:::1;31857:13;;:24;;;;;;;;;;;;;;;;;;31931:8;31897:43;;31922:7;:5;:7::i;:::-;31897:43;;;;;;;;;;;;31767:181:::0;:::o;56946:88::-;28953:13;:11;:13::i;:::-;57014:12:::1;57000:11;:26;;;;56946:88::o:0;42335:92::-;42378:7;42411:8;42405:2;:14;;;;:::i;:::-;42398:21;;42335:92;:::o;57860:1896::-;58004:4;25974:19;:17;:19::i;:::-;58091:21:::1;;;;;;;;;;;58087:525;;;58129:28;58160:9;:24;58178:4;58160:24;;;;;;;;;;;;;;;;58129:55;;58201:12;58240:17;;58216:20;:41;;58201:56;;58278:7;:20;;;;;58290:8;;;;;;;;;;;58289:9;58278:20;:56;;;;;58303:25;:31;58329:4;58303:31;;;;;;;;;;;;;;;;;;;;;;;;;58302:32;58278:56;58274:327;;;58366:4;58355:8;;:15;;;;;;;;;;;;;;;;;;58482:17;;58459:40;;58518:32;58529:20;58518:10;:32::i;:::-;58580:5;58569:8;;:16;;;;;;;;;;;;;;;;;;58274:327;58114:498;;58087:525;58628:10;:14;58639:2;58628:14;;;;;;;;;;;;;;;;;;;;;;;;;:34;;;;;58661:1;58646:11;;:16;58628:34;58624:93;;;58693:12;58679:11;:26;;;;58624:93;58791:12;58806:4;58791:19;;58912;:25;58932:4;58912:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;58941:19;:23;58961:2;58941:23;;;;;;;;;;;;;;;;;;;;;;;;;58912:52;58908:100;;;58991:5;58981:15;;58908:100;59024:7;59020:603;;;59048:12;59079:10;:16;59090:4;59079:16;;;;;;;;;;;;;;;;;;;;;;;;;:34;;;;59099:10;:14;59110:2;59099:14;;;;;;;;;;;;;;;;;;;;;;;;;59079:34;59075:537;;;59168:13;;59153:11;;59138:12;:26;;;;:::i;:::-;:43;59134:359;;59227:3;59222:2;59213:6;:11;;;;:::i;:::-;:17;;;;:::i;:::-;59206:24;;59134:359;;;59283:10;:16;59294:4;59283:16;;;;;;;;;;;;;;;;;;;;;;;;;59279:195;;;59355:5;59344:8;;59335:6;:17;;;;:::i;:::-;:25;;;;:::i;:::-;59328:32;;59279:195;;;59445:5;59433:9;;59424:6;:18;;;;:::i;:::-;:26;;;;:::i;:::-;59417:33;;59279:195;59134:359;59531:4;59522:6;:13;;;;:::i;:::-;59513:22;;59554:42;59570:4;59584;59591;59554:15;:42::i;:::-;;59075:537;59033:590;59020:603;59715:33;59731:4;59737:2;59741:6;59715:15;:33::i;:::-;59708:40;;;57860:1896:::0;;;;;:::o;29232:166::-;29303:12;:10;:12::i;:::-;29292:23;;:7;:5;:7::i;:::-;:23;;;29288:103;;29366:12;:10;:12::i;:::-;29339:40;;;;;;;;;;;:::i;:::-;;;;;;;;29288:103;29232:166::o;43298:160::-;43418:5;43411:4;:12;;;;;;:::i;:::-;;43443:7;43434:6;:16;;;;;;:::i;:::-;;43298:160;;:::o;32138:156::-;32228:13;;32221:20;;;;;;;;;;;32252:34;32277:8;32252:24;:34::i;:::-;32138:156;:::o;24148:98::-;24201:7;24228:10;24221:17;;24148:98;:::o;55396:188::-;55513:5;55479:25;:31;55505:4;55479:31;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;55570:5;55536:40;;55564:4;55536:40;;;;;;;;;;;;55396:188;;:::o;20918:718::-;20974:13;21025:14;21062:1;21042:17;21053:5;21042:10;:17::i;:::-;:21;21025:38;;21078:20;21112:6;21101:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21078:41;;21134:11;21263:6;21259:2;21255:15;21247:6;21243:28;21236:35;;21300:290;21307:4;21300:290;;;21332:5;;;;;;;;21474:10;21469:2;21462:5;21458:14;21453:32;21448:3;21440:46;21532:2;21523:11;;;;;;:::i;:::-;;;;;21566:1;21557:5;:10;21300:290;21553:21;21300:290;21611:6;21604:13;;;;;20918:718;;;:::o;26528:132::-;26594:8;:6;:8::i;:::-;26590:63;;;26626:15;;;;;;;;;;;;;;26590:63;26528:132::o;57073:587::-;57196:21;57234:1;57220:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57196:40;;57265:4;57247;57252:1;57247:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;57291:13;;;;;;;;;;;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57281:4;57286:1;57281:7;;;;;;;;:::i;:::-;;;;;;;:30;;;;;;;;;;;57375:11;57324:9;:24;57342:4;57324:24;;;;;;;;;;;;;;;:48;57357:13;;;;;;;;;;;57324:48;;;;;;;;;;;;;;;:62;;;;57425:13;;;;;;;;;;;:64;;;57504:11;57530:1;57577:4;57596:15;;;;;;;;;;;57626;57425:227;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57122:538;57073:587;:::o;41195:1101::-;41316:4;41333:12;41348:10;:8;:10::i;:::-;41333:25;;41369:27;41399:9;:15;41409:4;41399:15;;;;;;;;;;;;;;;;41369:45;;41425:29;41457:9;:13;41467:2;41457:13;;;;;;;;;;;;;;;;41425:45;;41502:6;41483:9;:15;41493:4;41483:15;;;;;;;;;;;;;;;;:25;;;;;;;:::i;:::-;;;;;;;;41563:6;41546:9;:13;41556:2;41546:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;41654:9;:15;41664:4;41654:15;;;;;;;;;;;;;;;;;;;;;;;;;41649:251;;41686:22;41778:4;41760:9;:15;41770:4;41760:15;;;;;;;;;;;;;;;;:22;;;;:::i;:::-;41734:4;41712:19;:26;;;;:::i;:::-;41711:72;;;;:::i;:::-;41686:97;;41803:9;41798:91;41822:14;41818:1;:18;41798:91;;;41862:11;41868:4;41862:5;:11::i;:::-;41838:3;;;;;;;41798:91;;;;41671:229;41649:251;41976:9;:13;41986:2;41976:13;;;;;;;;;;;;;;;;;;;;;;;;;41971:247;;42006:22;42098:4;42074:21;:28;;;;:::i;:::-;42048:4;42032:9;:13;42042:2;42032:13;;;;;;;;;;;;;;;;:20;;;;:::i;:::-;42031:72;;;;:::i;:::-;42006:97;;42123:9;42118:89;42142:14;42138:1;:18;42118:89;;;42182:9;42188:2;42182:5;:9::i;:::-;42158:3;;;;;;;42118:89;;;;41991:227;41971:247;42255:2;42235:31;;42249:4;42235:31;;;42259:6;42235:31;;;;;;:::i;:::-;;;;;;;;42284:4;42277:11;;;;;41195:1101;;;;;:::o;30380:191::-;30454:16;30473:6;;;;;;;;;;;30454:25;;30499:8;30490:6;;:17;;;;;;;;;;;;;;;;;;30554:8;30523:40;;30544:8;30523:40;;;;;;;;;;;;30443:128;30380:191;:::o;17322:948::-;17375:7;17395:14;17412:1;17395:18;;17462:8;17453:5;:17;17449:106;;17500:8;17491:17;;;;;;:::i;:::-;;;;;17537:2;17527:12;;;;17449:106;17582:8;17573:5;:17;17569:106;;17620:8;17611:17;;;;;;:::i;:::-;;;;;17657:2;17647:12;;;;17569:106;17702:8;17693:5;:17;17689:106;;17740:8;17731:17;;;;;;:::i;:::-;;;;;17777:2;17767:12;;;;17689:106;17822:7;17813:5;:16;17809:103;;17859:7;17850:16;;;;;;:::i;:::-;;;;;17895:1;17885:11;;;;17809:103;17939:7;17930:5;:16;17926:103;;17976:7;17967:16;;;;;;:::i;:::-;;;;;18012:1;18002:11;;;;17926:103;18056:7;18047:5;:16;18043:103;;18093:7;18084:16;;;;;;:::i;:::-;;;;;18129:1;18119:11;;;;18043:103;18173:7;18164:5;:16;18160:68;;18211:1;18201:11;;;;18160:68;18256:6;18249:13;;;17322:948;;;:::o;42917:373::-;42994:1;42978:18;;:4;:18;;;42974:73;;43020:15;;;;;;;;;;;;;;42974:73;43059:10;43072:6;:12;43079:4;43072:12;;;;;;;;;;;;;;;43107:1;43085:6;:12;43092:4;43085:12;;;;;;;;;;;;;;;:19;;;;:23;;;;:::i;:::-;43072:37;;;;;;;;:::i;:::-;;;;;;;;;;43059:50;;43120:6;:12;43127:4;43120:12;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;43156:11;:15;43168:2;43156:15;;;;;;;;;;;43149:22;;;43189:8;:12;43198:2;43189:12;;;;;;;;;;;;43182:19;;;;;;;;;;;43219:11;:15;43231:2;43219:15;;;;;;;;;;;;43212:22;;;;;;;;;;;43279:2;43275:1;43252:30;;43261:4;43252:30;;;;;;;;;;;;42963:327;42917:373;:::o;57737:115::-;25974:19;:17;:19::i;:::-;57829:15:::1;57841:2;57829:11;:15::i;:::-;57737:115:::0;:::o;42435:474::-;42508:1;42494:16;;:2;:16;;;42490:74;;42534:18;;;;;;;;;;;;;;42490:74;42601:6;;:8;;;;;;;;;;;;;42633:10;42646:6;;42633:19;;42693:1;42669:26;;:8;:12;42678:2;42669:12;;;;;;;;;;;;;;;;;;;;;:26;;;42665:81;;42719:15;;;;;;;;;;;;;;42665:81;42773:2;42758:8;:12;42767:2;42758:12;;;;;;;;;;;;:17;;;;;;;;;;;;;;;;;;42786:6;:10;42793:2;42786:10;;;;;;;;;;;;;;;42802:2;42786:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42854:1;42834:6;:10;42841:2;42834:10;;;;;;;;;;;;;;;:17;;;;:21;;;;:::i;:::-;42816:11;:15;42828:2;42816:15;;;;;;;;;;;:39;;;;42898:2;42894;42873:28;;42890:1;42873:28;;;;;;;;;;;;42479:430;42435:474;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1349:75::-;1382:6;1415:2;1409:9;1399:19;;1349:75;:::o;1430:117::-;1539:1;1536;1529:12;1553:117;1662:1;1659;1652:12;1676:77;1713:7;1742:5;1731:16;;1676:77;;;:::o;1759:122::-;1832:24;1850:5;1832:24;:::i;:::-;1825:5;1822:35;1812:63;;1871:1;1868;1861:12;1812:63;1759:122;:::o;1887:139::-;1933:5;1971:6;1958:20;1949:29;;1987:33;2014:5;1987:33;:::i;:::-;1887:139;;;;:::o;2032:329::-;2091:6;2140:2;2128:9;2119:7;2115:23;2111:32;2108:119;;;2146:79;;:::i;:::-;2108:119;2266:1;2291:53;2336:7;2327:6;2316:9;2312:22;2291:53;:::i;:::-;2281:63;;2237:117;2032:329;;;;:::o;2367:126::-;2404:7;2444:42;2437:5;2433:54;2422:65;;2367:126;;;:::o;2499:96::-;2536:7;2565:24;2583:5;2565:24;:::i;:::-;2554:35;;2499:96;;;:::o;2601:118::-;2688:24;2706:5;2688:24;:::i;:::-;2683:3;2676:37;2601:118;;:::o;2725:222::-;2818:4;2856:2;2845:9;2841:18;2833:26;;2869:71;2937:1;2926:9;2922:17;2913:6;2869:71;:::i;:::-;2725:222;;;;:::o;2953:122::-;3026:24;3044:5;3026:24;:::i;:::-;3019:5;3016:35;3006:63;;3065:1;3062;3055:12;3006:63;2953:122;:::o;3081:139::-;3127:5;3165:6;3152:20;3143:29;;3181:33;3208:5;3181:33;:::i;:::-;3081:139;;;;:::o;3226:474::-;3294:6;3302;3351:2;3339:9;3330:7;3326:23;3322:32;3319:119;;;3357:79;;:::i;:::-;3319:119;3477:1;3502:53;3547:7;3538:6;3527:9;3523:22;3502:53;:::i;:::-;3492:63;;3448:117;3604:2;3630:53;3675:7;3666:6;3655:9;3651:22;3630:53;:::i;:::-;3620:63;;3575:118;3226:474;;;;;:::o;3706:90::-;3740:7;3783:5;3776:13;3769:21;3758:32;;3706:90;;;:::o;3802:109::-;3883:21;3898:5;3883:21;:::i;:::-;3878:3;3871:34;3802:109;;:::o;3917:210::-;4004:4;4042:2;4031:9;4027:18;4019:26;;4055:65;4117:1;4106:9;4102:17;4093:6;4055:65;:::i;:::-;3917:210;;;;:::o;4133:118::-;4220:24;4238:5;4220:24;:::i;:::-;4215:3;4208:37;4133:118;;:::o;4257:222::-;4350:4;4388:2;4377:9;4373:18;4365:26;;4401:71;4469:1;4458:9;4454:17;4445:6;4401:71;:::i;:::-;4257:222;;;;:::o;4485:619::-;4562:6;4570;4578;4627:2;4615:9;4606:7;4602:23;4598:32;4595:119;;;4633:79;;:::i;:::-;4595:119;4753:1;4778:53;4823:7;4814:6;4803:9;4799:22;4778:53;:::i;:::-;4768:63;;4724:117;4880:2;4906:53;4951:7;4942:6;4931:9;4927:22;4906:53;:::i;:::-;4896:63;;4851:118;5008:2;5034:53;5079:7;5070:6;5059:9;5055:22;5034:53;:::i;:::-;5024:63;;4979:118;4485:619;;;;;:::o;5110:474::-;5178:6;5186;5235:2;5223:9;5214:7;5210:23;5206:32;5203:119;;;5241:79;;:::i;:::-;5203:119;5361:1;5386:53;5431:7;5422:6;5411:9;5407:22;5386:53;:::i;:::-;5376:63;;5332:117;5488:2;5514:53;5559:7;5550:6;5539:9;5535:22;5514:53;:::i;:::-;5504:63;;5459:118;5110:474;;;;;:::o;5590:86::-;5625:7;5665:4;5658:5;5654:16;5643:27;;5590:86;;;:::o;5682:112::-;5765:22;5781:5;5765:22;:::i;:::-;5760:3;5753:35;5682:112;;:::o;5800:214::-;5889:4;5927:2;5916:9;5912:18;5904:26;;5940:67;6004:1;5993:9;5989:17;5980:6;5940:67;:::i;:::-;5800:214;;;;:::o;6020:117::-;6129:1;6126;6119:12;6143:117;6252:1;6249;6242:12;6266:180;6314:77;6311:1;6304:88;6411:4;6408:1;6401:15;6435:4;6432:1;6425:15;6452:281;6535:27;6557:4;6535:27;:::i;:::-;6527:6;6523:40;6665:6;6653:10;6650:22;6629:18;6617:10;6614:34;6611:62;6608:88;;;6676:18;;:::i;:::-;6608:88;6716:10;6712:2;6705:22;6495:238;6452:281;;:::o;6739:129::-;6773:6;6800:20;;:::i;:::-;6790:30;;6829:33;6857:4;6849:6;6829:33;:::i;:::-;6739:129;;;:::o;6874:308::-;6936:4;7026:18;7018:6;7015:30;7012:56;;;7048:18;;:::i;:::-;7012:56;7086:29;7108:6;7086:29;:::i;:::-;7078:37;;7170:4;7164;7160:15;7152:23;;6874:308;;;:::o;7188:146::-;7285:6;7280:3;7275;7262:30;7326:1;7317:6;7312:3;7308:16;7301:27;7188:146;;;:::o;7340:425::-;7418:5;7443:66;7459:49;7501:6;7459:49;:::i;:::-;7443:66;:::i;:::-;7434:75;;7532:6;7525:5;7518:21;7570:4;7563:5;7559:16;7608:3;7599:6;7594:3;7590:16;7587:25;7584:112;;;7615:79;;:::i;:::-;7584:112;7705:54;7752:6;7747:3;7742;7705:54;:::i;:::-;7424:341;7340:425;;;;;:::o;7785:340::-;7841:5;7890:3;7883:4;7875:6;7871:17;7867:27;7857:122;;7898:79;;:::i;:::-;7857:122;8015:6;8002:20;8040:79;8115:3;8107:6;8100:4;8092:6;8088:17;8040:79;:::i;:::-;8031:88;;7847:278;7785:340;;;;:::o;8131:834::-;8219:6;8227;8276:2;8264:9;8255:7;8251:23;8247:32;8244:119;;;8282:79;;:::i;:::-;8244:119;8430:1;8419:9;8415:17;8402:31;8460:18;8452:6;8449:30;8446:117;;;8482:79;;:::i;:::-;8446:117;8587:63;8642:7;8633:6;8622:9;8618:22;8587:63;:::i;:::-;8577:73;;8373:287;8727:2;8716:9;8712:18;8699:32;8758:18;8750:6;8747:30;8744:117;;;8780:79;;:::i;:::-;8744:117;8885:63;8940:7;8931:6;8920:9;8916:22;8885:63;:::i;:::-;8875:73;;8670:288;8131:834;;;;;:::o;8971:116::-;9041:21;9056:5;9041:21;:::i;:::-;9034:5;9031:32;9021:60;;9077:1;9074;9067:12;9021:60;8971:116;:::o;9093:133::-;9136:5;9174:6;9161:20;9152:29;;9190:30;9214:5;9190:30;:::i;:::-;9093:133;;;;:::o;9232:468::-;9297:6;9305;9354:2;9342:9;9333:7;9329:23;9325:32;9322:119;;;9360:79;;:::i;:::-;9322:119;9480:1;9505:53;9550:7;9541:6;9530:9;9526:22;9505:53;:::i;:::-;9495:63;;9451:117;9607:2;9633:50;9675:7;9666:6;9655:9;9651:22;9633:50;:::i;:::-;9623:60;;9578:115;9232:468;;;;;:::o;9706:323::-;9762:6;9811:2;9799:9;9790:7;9786:23;9782:32;9779:119;;;9817:79;;:::i;:::-;9779:119;9937:1;9962:50;10004:7;9995:6;9984:9;9980:22;9962:50;:::i;:::-;9952:60;;9908:114;9706:323;;;;:::o;10035:329::-;10094:6;10143:2;10131:9;10122:7;10118:23;10114:32;10111:119;;;10149:79;;:::i;:::-;10111:119;10269:1;10294:53;10339:7;10330:6;10319:9;10315:22;10294:53;:::i;:::-;10284:63;;10240:117;10035:329;;;;:::o;10370:60::-;10398:3;10419:5;10412:12;;10370:60;;;:::o;10436:142::-;10486:9;10519:53;10537:34;10546:24;10564:5;10546:24;:::i;:::-;10537:34;:::i;:::-;10519:53;:::i;:::-;10506:66;;10436:142;;;:::o;10584:126::-;10634:9;10667:37;10698:5;10667:37;:::i;:::-;10654:50;;10584:126;;;:::o;10716:151::-;10791:9;10824:37;10855:5;10824:37;:::i;:::-;10811:50;;10716:151;;;:::o;10873:181::-;10985:62;11041:5;10985:62;:::i;:::-;10980:3;10973:75;10873:181;;:::o;11060:272::-;11178:4;11216:2;11205:9;11201:18;11193:26;;11229:96;11322:1;11311:9;11307:17;11298:6;11229:96;:::i;:::-;11060:272;;;;:::o;11338:104::-;11383:7;11412:24;11430:5;11412:24;:::i;:::-;11401:35;;11338:104;;;:::o;11448:142::-;11551:32;11577:5;11551:32;:::i;:::-;11546:3;11539:45;11448:142;;:::o;11596:254::-;11705:4;11743:2;11732:9;11728:18;11720:26;;11756:87;11840:1;11829:9;11825:17;11816:6;11756:87;:::i;:::-;11596:254;;;;:::o;11856:117::-;11965:1;11962;11955:12;11979:117;12088:1;12085;12078:12;12115:552;12172:8;12182:6;12232:3;12225:4;12217:6;12213:17;12209:27;12199:122;;12240:79;;:::i;:::-;12199:122;12353:6;12340:20;12330:30;;12383:18;12375:6;12372:30;12369:117;;;12405:79;;:::i;:::-;12369:117;12519:4;12511:6;12507:17;12495:29;;12573:3;12565:4;12557:6;12553:17;12543:8;12539:32;12536:41;12533:128;;;12580:79;;:::i;:::-;12533:128;12115:552;;;;;:::o;12673:963::-;12770:6;12778;12786;12794;12802;12851:3;12839:9;12830:7;12826:23;12822:33;12819:120;;;12858:79;;:::i;:::-;12819:120;12978:1;13003:53;13048:7;13039:6;13028:9;13024:22;13003:53;:::i;:::-;12993:63;;12949:117;13105:2;13131:53;13176:7;13167:6;13156:9;13152:22;13131:53;:::i;:::-;13121:63;;13076:118;13233:2;13259:53;13304:7;13295:6;13284:9;13280:22;13259:53;:::i;:::-;13249:63;;13204:118;13389:2;13378:9;13374:18;13361:32;13420:18;13412:6;13409:30;13406:117;;;13442:79;;:::i;:::-;13406:117;13555:64;13611:7;13602:6;13591:9;13587:22;13555:64;:::i;:::-;13537:82;;;;13332:297;12673:963;;;;;;;;:::o;13659:568::-;13732:8;13742:6;13792:3;13785:4;13777:6;13773:17;13769:27;13759:122;;13800:79;;:::i;:::-;13759:122;13913:6;13900:20;13890:30;;13943:18;13935:6;13932:30;13929:117;;;13965:79;;:::i;:::-;13929:117;14079:4;14071:6;14067:17;14055:29;;14133:3;14125:4;14117:6;14113:17;14103:8;14099:32;14096:41;14093:128;;;14140:79;;:::i;:::-;14093:128;13659:568;;;;;:::o;14233:698::-;14325:6;14333;14341;14390:2;14378:9;14369:7;14365:23;14361:32;14358:119;;;14396:79;;:::i;:::-;14358:119;14544:1;14533:9;14529:17;14516:31;14574:18;14566:6;14563:30;14560:117;;;14596:79;;:::i;:::-;14560:117;14709:80;14781:7;14772:6;14761:9;14757:22;14709:80;:::i;:::-;14691:98;;;;14487:312;14838:2;14864:50;14906:7;14897:6;14886:9;14882:22;14864:50;:::i;:::-;14854:60;;14809:115;14233:698;;;;;:::o;14937:474::-;15005:6;15013;15062:2;15050:9;15041:7;15037:23;15033:32;15030:119;;;15068:79;;:::i;:::-;15030:119;15188:1;15213:53;15258:7;15249:6;15238:9;15234:22;15213:53;:::i;:::-;15203:63;;15159:117;15315:2;15341:53;15386:7;15377:6;15366:9;15362:22;15341:53;:::i;:::-;15331:63;;15286:118;14937:474;;;;;:::o;15417:509::-;15486:6;15535:2;15523:9;15514:7;15510:23;15506:32;15503:119;;;15541:79;;:::i;:::-;15503:119;15689:1;15678:9;15674:17;15661:31;15719:18;15711:6;15708:30;15705:117;;;15741:79;;:::i;:::-;15705:117;15846:63;15901:7;15892:6;15881:9;15877:22;15846:63;:::i;:::-;15836:73;;15632:287;15417:509;;;;:::o;15932:180::-;15980:77;15977:1;15970:88;16077:4;16074:1;16067:15;16101:4;16098:1;16091:15;16118:320;16162:6;16199:1;16193:4;16189:12;16179:22;;16246:1;16240:4;16236:12;16267:18;16257:81;;16323:4;16315:6;16311:17;16301:27;;16257:81;16385:2;16377:6;16374:14;16354:18;16351:38;16348:84;;16404:18;;:::i;:::-;16348:84;16169:269;16118:320;;;:::o;16444:180::-;16492:77;16489:1;16482:88;16589:4;16586:1;16579:15;16613:4;16610:1;16603:15;16630:194;16670:4;16690:20;16708:1;16690:20;:::i;:::-;16685:25;;16724:20;16742:1;16724:20;:::i;:::-;16719:25;;16768:1;16765;16761:9;16753:17;;16792:1;16786:4;16783:11;16780:37;;;16797:18;;:::i;:::-;16780:37;16630:194;;;;:::o;16830:180::-;16878:77;16875:1;16868:88;16975:4;16972:1;16965:15;16999:4;16996:1;16989:15;17016:180;17064:77;17061:1;17054:88;17161:4;17158:1;17151:15;17185:4;17182:1;17175:15;17202:168;17285:11;17319:6;17314:3;17307:19;17359:4;17354:3;17350:14;17335:29;;17202:168;;;;:::o;17376:114::-;;:::o;17496:362::-;17637:3;17658:65;17721:1;17716:3;17658:65;:::i;:::-;17651:72;;17732:93;17821:3;17732:93;:::i;:::-;17850:1;17845:3;17841:11;17834:18;;17496:362;;;:::o;17864:748::-;18113:4;18151:3;18140:9;18136:19;18128:27;;18165:71;18233:1;18222:9;18218:17;18209:6;18165:71;:::i;:::-;18246:72;18314:2;18303:9;18299:18;18290:6;18246:72;:::i;:::-;18328;18396:2;18385:9;18381:18;18372:6;18328:72;:::i;:::-;18447:9;18441:4;18437:20;18432:2;18421:9;18417:18;18410:48;18475:130;18600:4;18475:130;:::i;:::-;18467:138;;17864:748;;;;;;:::o;18618:149::-;18654:7;18694:66;18687:5;18683:78;18672:89;;18618:149;;;:::o;18773:120::-;18845:23;18862:5;18845:23;:::i;:::-;18838:5;18835:34;18825:62;;18883:1;18880;18873:12;18825:62;18773:120;:::o;18899:141::-;18955:5;18986:6;18980:13;18971:22;;19002:32;19028:5;19002:32;:::i;:::-;18899:141;;;;:::o;19046:349::-;19115:6;19164:2;19152:9;19143:7;19139:23;19135:32;19132:119;;;19170:79;;:::i;:::-;19132:119;19290:1;19315:63;19370:7;19361:6;19350:9;19346:22;19315:63;:::i;:::-;19305:73;;19261:127;19046:349;;;;:::o;19401:222::-;19541:34;19537:1;19529:6;19525:14;19518:58;19610:5;19605:2;19597:6;19593:15;19586:30;19401:222;:::o;19629:366::-;19771:3;19792:67;19856:2;19851:3;19792:67;:::i;:::-;19785:74;;19868:93;19957:3;19868:93;:::i;:::-;19986:2;19981:3;19977:12;19970:19;;19629:366;;;:::o;20001:419::-;20167:4;20205:2;20194:9;20190:18;20182:26;;20254:9;20248:4;20244:20;20240:1;20229:9;20225:17;20218:47;20282:131;20408:4;20282:131;:::i;:::-;20274:139;;20001:419;;;:::o;20426:143::-;20483:5;20514:6;20508:13;20499:22;;20530:33;20557:5;20530:33;:::i;:::-;20426:143;;;;:::o;20575:351::-;20645:6;20694:2;20682:9;20673:7;20669:23;20665:32;20662:119;;;20700:79;;:::i;:::-;20662:119;20820:1;20845:64;20901:7;20892:6;20881:9;20877:22;20845:64;:::i;:::-;20835:74;;20791:128;20575:351;;;;:::o;20932:332::-;21053:4;21091:2;21080:9;21076:18;21068:26;;21104:71;21172:1;21161:9;21157:17;21148:6;21104:71;:::i;:::-;21185:72;21253:2;21242:9;21238:18;21229:6;21185:72;:::i;:::-;20932:332;;;;;:::o;21292:314::-;21388:3;21409:70;21472:6;21467:3;21409:70;:::i;:::-;21402:77;;21489:56;21538:6;21533:3;21526:5;21489:56;:::i;:::-;21570:29;21592:6;21570:29;:::i;:::-;21565:3;21561:39;21554:46;;21292:314;;;;;:::o;21612:660::-;21817:4;21855:3;21844:9;21840:19;21832:27;;21869:71;21937:1;21926:9;21922:17;21913:6;21869:71;:::i;:::-;21950:72;22018:2;22007:9;22003:18;21994:6;21950:72;:::i;:::-;22032;22100:2;22089:9;22085:18;22076:6;22032:72;:::i;:::-;22151:9;22145:4;22141:20;22136:2;22125:9;22121:18;22114:48;22179:86;22260:4;22251:6;22243;22179:86;:::i;:::-;22171:94;;21612:660;;;;;;;;:::o;22278:184::-;22377:11;22411:6;22406:3;22399:19;22451:4;22446:3;22442:14;22427:29;;22278:184;;;;:::o;22468:102::-;22537:4;22560:3;22552:11;;22468:102;;;:::o;22576:108::-;22653:24;22671:5;22653:24;:::i;:::-;22648:3;22641:37;22576:108;;:::o;22690:179::-;22759:10;22780:46;22822:3;22814:6;22780:46;:::i;:::-;22858:4;22853:3;22849:14;22835:28;;22690:179;;;;:::o;22875:122::-;22927:5;22952:39;22987:2;22982:3;22978:12;22973:3;22952:39;:::i;:::-;22943:48;;22875:122;;;;:::o;23003:115::-;23075:4;23107;23102:3;23098:14;23090:22;;23003:115;;;:::o;23154:699::-;23283:3;23306:86;23385:6;23380:3;23306:86;:::i;:::-;23299:93;;23416:58;23468:5;23416:58;:::i;:::-;23497:7;23528:1;23513:315;23538:6;23535:1;23532:13;23513:315;;;23608:42;23643:6;23634:7;23608:42;:::i;:::-;23670:63;23729:3;23714:13;23670:63;:::i;:::-;23663:70;;23756:62;23811:6;23756:62;:::i;:::-;23746:72;;23573:255;23560:1;23557;23553:9;23548:14;;23513:315;;;23517:14;23844:3;23837:10;;23288:565;;23154:699;;;;;:::o;23859:491::-;24034:4;24072:2;24061:9;24057:18;24049:26;;24121:9;24115:4;24111:20;24107:1;24096:9;24092:17;24085:47;24149:118;24262:4;24253:6;24245;24149:118;:::i;:::-;24141:126;;24277:66;24339:2;24328:9;24324:18;24315:6;24277:66;:::i;:::-;23859:491;;;;;;:::o;24356:148::-;24458:11;24495:3;24480:18;;24356:148;;;;:::o;24510:141::-;24559:4;24582:3;24574:11;;24605:3;24602:1;24595:14;24639:4;24636:1;24626:18;24618:26;;24510:141;;;:::o;24681:874::-;24784:3;24821:5;24815:12;24850:36;24876:9;24850:36;:::i;:::-;24902:89;24984:6;24979:3;24902:89;:::i;:::-;24895:96;;25022:1;25011:9;25007:17;25038:1;25033:166;;;;25213:1;25208:341;;;;25000:549;;25033:166;25117:4;25113:9;25102;25098:25;25093:3;25086:38;25179:6;25172:14;25165:22;25157:6;25153:35;25148:3;25144:45;25137:52;;25033:166;;25208:341;25275:38;25307:5;25275:38;:::i;:::-;25335:1;25349:154;25363:6;25360:1;25357:13;25349:154;;;25437:7;25431:14;25427:1;25422:3;25418:11;25411:35;25487:1;25478:7;25474:15;25463:26;;25385:4;25382:1;25378:12;25373:17;;25349:154;;;25532:6;25527:3;25523:16;25516:23;;25215:334;;25000:549;;24788:767;;24681:874;;;;:::o;25561:390::-;25667:3;25695:39;25728:5;25695:39;:::i;:::-;25750:89;25832:6;25827:3;25750:89;:::i;:::-;25743:96;;25848:65;25906:6;25901:3;25894:4;25887:5;25883:16;25848:65;:::i;:::-;25938:6;25933:3;25929:16;25922:23;;25671:280;25561:390;;;;:::o;25957:182::-;26125:7;26120:3;26113:20;25957:182;:::o;26145:693::-;26412:3;26434:92;26522:3;26513:6;26434:92;:::i;:::-;26427:99;;26543:95;26634:3;26625:6;26543:95;:::i;:::-;26536:102;;26648:137;26781:3;26648:137;:::i;:::-;26810:1;26805:3;26801:11;26794:18;;26829:3;26822:10;;26145:693;;;;;:::o;26844:93::-;26881:6;26928:2;26923;26916:5;26912:14;26908:23;26898:33;;26844:93;;;:::o;26943:107::-;26987:8;27037:5;27031:4;27027:16;27006:37;;26943:107;;;;:::o;27056:393::-;27125:6;27175:1;27163:10;27159:18;27198:97;27228:66;27217:9;27198:97;:::i;:::-;27316:39;27346:8;27335:9;27316:39;:::i;:::-;27304:51;;27388:4;27384:9;27377:5;27373:21;27364:30;;27437:4;27427:8;27423:19;27416:5;27413:30;27403:40;;27132:317;;27056:393;;;;;:::o;27455:142::-;27505:9;27538:53;27556:34;27565:24;27583:5;27565:24;:::i;:::-;27556:34;:::i;:::-;27538:53;:::i;:::-;27525:66;;27455:142;;;:::o;27603:75::-;27646:3;27667:5;27660:12;;27603:75;;;:::o;27684:269::-;27794:39;27825:7;27794:39;:::i;:::-;27855:91;27904:41;27928:16;27904:41;:::i;:::-;27896:6;27889:4;27883:11;27855:91;:::i;:::-;27849:4;27842:105;27760:193;27684:269;;;:::o;27959:73::-;28004:3;27959:73;:::o;28038:189::-;28115:32;;:::i;:::-;28156:65;28214:6;28206;28200:4;28156:65;:::i;:::-;28091:136;28038:189;;:::o;28233:186::-;28293:120;28310:3;28303:5;28300:14;28293:120;;;28364:39;28401:1;28394:5;28364:39;:::i;:::-;28337:1;28330:5;28326:13;28317:22;;28293:120;;;28233:186;;:::o;28425:543::-;28526:2;28521:3;28518:11;28515:446;;;28560:38;28592:5;28560:38;:::i;:::-;28644:29;28662:10;28644:29;:::i;:::-;28634:8;28630:44;28827:2;28815:10;28812:18;28809:49;;;28848:8;28833:23;;28809:49;28871:80;28927:22;28945:3;28927:22;:::i;:::-;28917:8;28913:37;28900:11;28871:80;:::i;:::-;28530:431;;28515:446;28425:543;;;:::o;28974:117::-;29028:8;29078:5;29072:4;29068:16;29047:37;;28974:117;;;;:::o;29097:169::-;29141:6;29174:51;29222:1;29218:6;29210:5;29207:1;29203:13;29174:51;:::i;:::-;29170:56;29255:4;29249;29245:15;29235:25;;29148:118;29097:169;;;;:::o;29271:295::-;29347:4;29493:29;29518:3;29512:4;29493:29;:::i;:::-;29485:37;;29555:3;29552:1;29548:11;29542:4;29539:21;29531:29;;29271:295;;;;:::o;29571:1395::-;29688:37;29721:3;29688:37;:::i;:::-;29790:18;29782:6;29779:30;29776:56;;;29812:18;;:::i;:::-;29776:56;29856:38;29888:4;29882:11;29856:38;:::i;:::-;29941:67;30001:6;29993;29987:4;29941:67;:::i;:::-;30035:1;30059:4;30046:17;;30091:2;30083:6;30080:14;30108:1;30103:618;;;;30765:1;30782:6;30779:77;;;30831:9;30826:3;30822:19;30816:26;30807:35;;30779:77;30882:67;30942:6;30935:5;30882:67;:::i;:::-;30876:4;30869:81;30738:222;30073:887;;30103:618;30155:4;30151:9;30143:6;30139:22;30189:37;30221:4;30189:37;:::i;:::-;30248:1;30262:208;30276:7;30273:1;30270:14;30262:208;;;30355:9;30350:3;30346:19;30340:26;30332:6;30325:42;30406:1;30398:6;30394:14;30384:24;;30453:2;30442:9;30438:18;30425:31;;30299:4;30296:1;30292:12;30287:17;;30262:208;;;30498:6;30489:7;30486:19;30483:179;;;30556:9;30551:3;30547:19;30541:26;30599:48;30641:4;30633:6;30629:17;30618:9;30599:48;:::i;:::-;30591:6;30584:64;30506:156;30483:179;30708:1;30704;30696:6;30692:14;30688:22;30682:4;30675:36;30110:611;;;30073:887;;29663:1303;;;29571:1395;;:::o;30972:102::-;31014:8;31061:5;31058:1;31054:13;31033:34;;30972:102;;;:::o;31080:848::-;31141:5;31148:4;31172:6;31163:15;;31196:5;31187:14;;31210:712;31231:1;31221:8;31218:15;31210:712;;;31326:4;31321:3;31317:14;31311:4;31308:24;31305:50;;;31335:18;;:::i;:::-;31305:50;31385:1;31375:8;31371:16;31368:451;;;31800:4;31793:5;31789:16;31780:25;;31368:451;31850:4;31844;31840:15;31832:23;;31880:32;31903:8;31880:32;:::i;:::-;31868:44;;31210:712;;;31080:848;;;;;;;:::o;31934:1073::-;31988:5;32179:8;32169:40;;32200:1;32191:10;;32202:5;;32169:40;32228:4;32218:36;;32245:1;32236:10;;32247:5;;32218:36;32314:4;32362:1;32357:27;;;;32398:1;32393:191;;;;32307:277;;32357:27;32375:1;32366:10;;32377:5;;;32393:191;32438:3;32428:8;32425:17;32422:43;;;32445:18;;:::i;:::-;32422:43;32494:8;32491:1;32487:16;32478:25;;32529:3;32522:5;32519:14;32516:40;;;32536:18;;:::i;:::-;32516:40;32569:5;;;32307:277;;32693:2;32683:8;32680:16;32674:3;32668:4;32665:13;32661:36;32643:2;32633:8;32630:16;32625:2;32619:4;32616:12;32612:35;32596:111;32593:246;;;32749:8;32743:4;32739:19;32730:28;;32784:3;32777:5;32774:14;32771:40;;;32791:18;;:::i;:::-;32771:40;32824:5;;32593:246;32864:42;32902:3;32892:8;32886:4;32883:1;32864:42;:::i;:::-;32849:57;;;;32938:4;32933:3;32929:14;32922:5;32919:25;32916:51;;;32947:18;;:::i;:::-;32916:51;32996:4;32989:5;32985:16;32976:25;;31934:1073;;;;;;:::o;33013:281::-;33071:5;33095:23;33113:4;33095:23;:::i;:::-;33087:31;;33139:25;33155:8;33139:25;:::i;:::-;33127:37;;33183:104;33220:66;33210:8;33204:4;33183:104;:::i;:::-;33174:113;;33013:281;;;;:::o;33300:410::-;33340:7;33363:20;33381:1;33363:20;:::i;:::-;33358:25;;33397:20;33415:1;33397:20;:::i;:::-;33392:25;;33452:1;33449;33445:9;33474:30;33492:11;33474:30;:::i;:::-;33463:41;;33653:1;33644:7;33640:15;33637:1;33634:22;33614:1;33607:9;33587:83;33564:139;;33683:18;;:::i;:::-;33564:139;33348:362;33300:410;;;;:::o;33716:180::-;33764:77;33761:1;33754:88;33861:4;33858:1;33851:15;33885:4;33882:1;33875:15;33902:185;33942:1;33959:20;33977:1;33959:20;:::i;:::-;33954:25;;33993:20;34011:1;33993:20;:::i;:::-;33988:25;;34032:1;34022:35;;34037:18;;:::i;:::-;34022:35;34079:1;34076;34072:9;34067:14;;33902:185;;;;:::o;34093:85::-;34138:7;34167:5;34156:16;;34093:85;;;:::o;34184:158::-;34242:9;34275:61;34293:42;34302:32;34328:5;34302:32;:::i;:::-;34293:42;:::i;:::-;34275:61;:::i;:::-;34262:74;;34184:158;;;:::o;34348:147::-;34443:45;34482:5;34443:45;:::i;:::-;34438:3;34431:58;34348:147;;:::o;34501:114::-;34568:6;34602:5;34596:12;34586:22;;34501:114;;;:::o;34621:132::-;34688:4;34711:3;34703:11;;34741:4;34736:3;34732:14;34724:22;;34621:132;;;:::o;34759:113::-;34829:4;34861;34856:3;34852:14;34844:22;;34759:113;;;:::o;34908:732::-;35027:3;35056:54;35104:5;35056:54;:::i;:::-;35126:86;35205:6;35200:3;35126:86;:::i;:::-;35119:93;;35236:56;35286:5;35236:56;:::i;:::-;35315:7;35346:1;35331:284;35356:6;35353:1;35350:13;35331:284;;;35432:6;35426:13;35459:63;35518:3;35503:13;35459:63;:::i;:::-;35452:70;;35545:60;35598:6;35545:60;:::i;:::-;35535:70;;35391:224;35378:1;35375;35371:9;35366:14;;35331:284;;;35335:14;35631:3;35624:10;;35032:608;;;34908:732;;;;:::o;35646:134::-;35704:9;35737:37;35768:5;35737:37;:::i;:::-;35724:50;;35646:134;;;:::o;35786:147::-;35881:45;35920:5;35881:45;:::i;:::-;35876:3;35869:58;35786:147;;:::o;35939:847::-;36210:4;36248:3;36237:9;36233:19;36225:27;;36262:71;36330:1;36319:9;36315:17;36306:6;36262:71;:::i;:::-;36343:80;36419:2;36408:9;36404:18;36395:6;36343:80;:::i;:::-;36470:9;36464:4;36460:20;36455:2;36444:9;36440:18;36433:48;36498:108;36601:4;36592:6;36498:108;:::i;:::-;36490:116;;36616:80;36692:2;36681:9;36677:18;36668:6;36616:80;:::i;:::-;36706:73;36774:3;36763:9;36759:19;36750:6;36706:73;:::i;:::-;35939:847;;;;;;;;:::o

Swarm Source

ipfs://753fc434f9eb701d3e281a481ae64ce5d2c17caee17907ed28645e1da76c188b
Loading...
Loading
Loading...
Loading
[ 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.