ETH Price: $3,260.75 (-2.94%)

Token

UltraMan (ULTRM)
 

Overview

Max Total Supply

100,000,000,000 ULTRM

Holders

124

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
0.259904914 ULTRM

Value
$0.00
0xcd539ff09efbe094e5611b1f28484861e80d3fd6
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Token

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-06-09
*/

// File: IPancakePair.sol


pragma solidity ^0.8.4;

interface IPancakePair {
    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 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;
}
// File: ISwapFactory.sol


pragma solidity ^0.8.4;

interface ISwapFactory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
    function getPair(address tokenA, address tokenB) external returns (address pair);
}
// File: ISwapRouter.sol


pragma solidity ^0.8.4;

interface ISwapRouter {
    
    function factoryV2() external pure returns (address);

    function factory() external pure returns (address);

    function WETH() external pure returns (address);
    
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to
    ) external;

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

    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 quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) 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);
    
}
// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;





/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```solidity
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```solidity
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}
 * to enforce additional security measures for this role.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role);
        _;
    }

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `_msgSender()` is missing `role`.
     * Overriding this function changes the behavior of the {onlyRole} modifier.
     *
     * Format of the revert message is described in {_checkRole}.
     *
     * _Available since v4.6._
     */
    function _checkRole(bytes32 role) internal view virtual {
        _checkRole(role, _msgSender());
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(account),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleGranted} event.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleRevoked} event.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     *
     * May emit a {RoleRevoked} event.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * May emit a {RoleGranted} event.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleGranted} event.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleRevoked} event.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


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

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 amount) external returns (bool);
}

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

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


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

pragma solidity ^0.8.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(address from, address to, uint256 amount) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}

// File: TOKEN\AutoBuyToken4.sol


pragma solidity ^0.8.4;








contract Token is ERC20,Ownable,AccessControl {
    bytes32 private constant MANAGER_ROLE = keccak256("MANAGER_ROLE");
    using SafeMath for uint256;
    ISwapRouter private uniswapV2Router;
    address public uniswapV2Pair;
    address public usdt;
    uint256 public startTradeBlock;
    address admin;
    address fundAddr;
    uint256 public fundCount;
    mapping(address => bool) private whiteList;
    bool public sellMonitor=true;
    
    constructor()ERC20("UltraMan", "ULTRM") {
        admin=0xbe847d542384b5cb1392a5104F007D3EDf3966C5;
        //admin=msg.sender;
        fundAddr=0xaEFDc52a8117702A3FE6EDd0B0dEb63B187ad93f;
        uint256 total=100000000000*10**decimals();
        _mint(admin, total);
        _grantRole(DEFAULT_ADMIN_ROLE,admin);
        _grantRole(MANAGER_ROLE, admin);
        _grantRole(MANAGER_ROLE, address(this));
        whiteList[admin] = true;
        whiteList[address(this)] = true;
        transferOwnership(admin);
    }
    function initPair(address _token,address _swap)external onlyRole(MANAGER_ROLE){
        usdt=_token;//0xc6e88A94dcEA6f032d805D10558aCf67279f7b4E;//usdt test
        address swap=_swap;//0xD99D1c33F9fC3444f8101754aBC46c52416550D1;//bsc test
        uniswapV2Router = ISwapRouter(swap);
        uniswapV2Pair = ISwapFactory(uniswapV2Router.factory()).createPair(address(this), usdt);
        ERC20(usdt).approve(address(uniswapV2Router), type(uint256).max);
        _approve(address(this), address(uniswapV2Router),type(uint256).max);
        _approve(address(this), address(this),type(uint256).max);
        _approve(admin, address(uniswapV2Router),type(uint256).max);
    }
    function decimals() public view virtual override returns (uint8) {
        return 9;
    }
   
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(amount > 0, "amount must gt 0");
        if(from != uniswapV2Pair && to != uniswapV2Pair) {
            _funTransfer(from, to, amount);
            return;
        }
        if(from == uniswapV2Pair) {
            require(startTradeBlock>0, "not open");
            super._transfer(from, to, amount);
            return;
        }
        if(to == uniswapV2Pair) {
            if(whiteList[from]){
                super._transfer(from, to, amount);
                return;
            }
            if(sellMonitor){
                swapUsdt(amount,fundAddr);
            }
            super._transfer(from, to, amount);
            return;
        }
    }
    function _funTransfer(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        super._transfer(sender, recipient, tAmount);
    }
    bool private inSwap;
    modifier lockTheSwap {
        inSwap = true;
        _;
        inSwap = false;
    }
    function swapToken(uint256 tokenAmount,address to) private lockTheSwap {
        address[] memory path = new address[](2);
        path[0] = address(usdt);
        path[1] = address(this);
        uint256 balance = IERC20(usdt).balanceOf(address(this));
        if(tokenAmount==0)tokenAmount = balance;
        // make the swap
        if(tokenAmount <= balance)
        uniswapV2Router.swapExactTokensForTokensSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of CA
            path,
            address(to),
            block.timestamp
        );
    }
    
    function swapUsdt(uint256 tokenAmount,address to) private lockTheSwap {
        uint256 balance = balanceOf(address(this));
        require(balance > tokenAmount, "not alow");
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = usdt;
        uniswapV2Router.swapExactTokensForTokensSupportingFeeOnTransferTokens(tokenAmount,0,path,to,block.timestamp);
    }

    function startTrade(address[] calldata adrs) public onlyRole(MANAGER_ROLE) {
        startTradeBlock = block.number;
        for(uint i=0;i<adrs.length;i++)
            swapToken((random(10,adrs[i])+1)*10**17,adrs[i]);
    }
    function random(uint number,address _addr) private view returns(uint) {
        return uint(keccak256(abi.encodePacked(block.timestamp,block.difficulty,  _addr))) % number;
    }

    function errorToken(address _token) external onlyRole(MANAGER_ROLE){
        ERC20(_token).transfer(msg.sender, IERC20(_token).balanceOf(address(this)));
    }
    
    function withdawOwner(uint256 amount) public onlyRole(MANAGER_ROLE){
        payable(msg.sender).transfer(amount);
    }
    
    function setSellMonitor(bool _bool) public onlyRole(MANAGER_ROLE){
        sellMonitor=_bool;
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","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":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"errorToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fundCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_swap","type":"address"}],"name":"initPair","outputs":[],"stateMutability":"nonpayable","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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellMonitor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_bool","type":"bool"}],"name":"setSellMonitor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"adrs","type":"address[]"}],"name":"startTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTradeBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usdt","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdawOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526001600f60006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b506040518060400160405280600881526020017f556c7472614d616e0000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f554c54524d0000000000000000000000000000000000000000000000000000008152508160039080519060200190620000b1929190620008c6565b508060049080519060200190620000ca929190620008c6565b505050620000ed620000e1620003c860201b60201c565b620003d060201b60201c565b73be847d542384b5cb1392a5104f007d3edf3966c5600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073aefdc52a8117702a3fe6edd0b0deb63b187ad93f600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000620001a96200049660201b60201c565b600a620001b7919062000b48565b64174876e800620001c9919062000c85565b9050620001ff600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826200049f60201b60201c565b620002366000801b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166200060d60201b60201c565b6200028a7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166200060d60201b60201c565b620002bc7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08306200060d60201b60201c565b6001600e6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600e60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620003c1600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16620006ff60201b60201c565b5062000e3f565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006009905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000512576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005099062000a40565b60405180910390fd5b62000526600083836200079660201b60201c565b80600260008282546200053a919062000a90565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620005ed919062000a62565b60405180910390a362000609600083836200079b60201b60201c565b5050565b6200061f8282620007a060201b60201c565b620006fb5760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620006a0620003c860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6200070f6200080b60201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000782576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200077990620009fc565b60405180910390fd5b6200079381620003d060201b60201c565b50565b505050565b505050565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6200081b620003c860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620008416200089c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200089a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008919062000a1e565b60405180910390fd5b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620008d49062000cfd565b90600052602060002090601f016020900481019282620008f8576000855562000944565b82601f106200091357805160ff191683800117855562000944565b8280016001018555821562000944579182015b828111156200094357825182559160200191906001019062000926565b5b50905062000953919062000957565b5090565b5b808211156200097257600081600090555060010162000958565b5090565b60006200098560268362000a7f565b9150620009928262000d9e565b604082019050919050565b6000620009ac60208362000a7f565b9150620009b98262000ded565b602082019050919050565b6000620009d3601f8362000a7f565b9150620009e08262000e16565b602082019050919050565b620009f68162000ce6565b82525050565b6000602082019050818103600083015262000a178162000976565b9050919050565b6000602082019050818103600083015262000a39816200099d565b9050919050565b6000602082019050818103600083015262000a5b81620009c4565b9050919050565b600060208201905062000a796000830184620009eb565b92915050565b600082825260208201905092915050565b600062000a9d8262000ce6565b915062000aaa8362000ce6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000ae25762000ae162000d33565b5b828201905092915050565b6000808291508390505b600185111562000b3f5780860481111562000b175762000b1662000d33565b5b600185161562000b275780820291505b808102905062000b378562000d91565b945062000af7565b94509492505050565b600062000b558262000ce6565b915062000b628362000cf0565b925062000b917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000b99565b905092915050565b60008262000bab576001905062000c7e565b8162000bbb576000905062000c7e565b816001811462000bd4576002811462000bdf5762000c15565b600191505062000c7e565b60ff84111562000bf45762000bf362000d33565b5b8360020a91508482111562000c0e5762000c0d62000d33565b5b5062000c7e565b5060208310610133831016604e8410600b841016171562000c4f5782820a90508381111562000c495762000c4862000d33565b5b62000c7e565b62000c5e848484600162000aed565b9250905081840481111562000c785762000c7762000d33565b5b81810290505b9392505050565b600062000c928262000ce6565b915062000c9f8362000ce6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000cdb5762000cda62000d33565b5b828202905092915050565b6000819050919050565b600060ff82169050919050565b6000600282049050600182168062000d1657607f821691505b6020821081141562000d2d5762000d2c62000d62565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60008160011c9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b613b6b8062000e4f6000396000f3fe6080604052600436106101dc5760003560e01c80636f6579a311610102578063a217fddf11610095578063d547741f11610064578063d547741f146106f3578063d99274481461071c578063dd62ed3e14610745578063f2fde38b14610782576101e3565b8063a217fddf14610625578063a457c2d714610650578063a9059cbb1461068d578063c88b1904146106ca576101e3565b806380720140116100d157806380720140146105695780638da5cb5b1461059257806391d14854146105bd57806395d89b41146105fa576101e3565b80636f6579a3146104c157806370a08231146104ea578063715018a6146105275780637490f76a1461053e576101e3565b80632f2ff15d1161017a578063395093511161014957806339509351146104035780633f936ff51461044057806349bd5a5e1461046b578063553193ca14610496576101e3565b80632f2ff15d1461035b5780632f48ab7d14610384578063313ce567146103af57806336568abe146103da576101e3565b806318160ddd116101b657806318160ddd1461028d5780631c6a0c4c146102b857806323b872dd146102e1578063248a9ca31461031e576101e3565b806301ffc9a7146101e857806306fdde0314610225578063095ea7b314610250576101e3565b366101e357005b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a9190612b42565b6107ab565b60405161021c9190613054565b60405180910390f35b34801561023157600080fd5b5061023a610825565b604051610247919061308a565b60405180910390f35b34801561025c57600080fd5b50610277600480360381019061027291906129ee565b6108b7565b6040516102849190613054565b60405180910390f35b34801561029957600080fd5b506102a26108da565b6040516102af919061326c565b60405180910390f35b3480156102c457600080fd5b506102df60048036038101906102da9190612b6f565b6108e4565b005b3480156102ed57600080fd5b506103086004803603810190610303919061299b565b610959565b6040516103159190613054565b60405180910390f35b34801561032a57600080fd5b5061034560048036038101906103409190612ad5565b610988565b604051610352919061306f565b60405180910390f35b34801561036757600080fd5b50610382600480360381019061037d9190612b02565b6109a8565b005b34801561039057600080fd5b506103996109c9565b6040516103a69190612fe7565b60405180910390f35b3480156103bb57600080fd5b506103c46109ef565b6040516103d191906132e1565b60405180910390f35b3480156103e657600080fd5b5061040160048036038101906103fc9190612b02565b6109f8565b005b34801561040f57600080fd5b5061042a600480360381019061042591906129ee565b610a7b565b6040516104379190613054565b60405180910390f35b34801561044c57600080fd5b50610455610ab2565b604051610462919061326c565b60405180910390f35b34801561047757600080fd5b50610480610ab8565b60405161048d9190612fe7565b60405180910390f35b3480156104a257600080fd5b506104ab610ade565b6040516104b8919061326c565b60405180910390f35b3480156104cd57600080fd5b506104e860048036038101906104e3919061295b565b610ae4565b005b3480156104f657600080fd5b50610511600480360381019061050c9190612901565b610f02565b60405161051e919061326c565b60405180910390f35b34801561053357600080fd5b5061053c610f4a565b005b34801561054a57600080fd5b50610553610f5e565b6040516105609190613054565b60405180910390f35b34801561057557600080fd5b50610590600480360381019061058b9190612a2e565b610f71565b005b34801561059e57600080fd5b506105a761104a565b6040516105b49190612fe7565b60405180910390f35b3480156105c957600080fd5b506105e460048036038101906105df9190612b02565b611074565b6040516105f19190613054565b60405180910390f35b34801561060657600080fd5b5061060f6110df565b60405161061c919061308a565b60405180910390f35b34801561063157600080fd5b5061063a611171565b604051610647919061306f565b60405180910390f35b34801561065c57600080fd5b50610677600480360381019061067291906129ee565b611178565b6040516106849190613054565b60405180910390f35b34801561069957600080fd5b506106b460048036038101906106af91906129ee565b6111ef565b6040516106c19190613054565b60405180910390f35b3480156106d657600080fd5b506106f160048036038101906106ec9190612a7b565b611212565b005b3480156106ff57600080fd5b5061071a60048036038101906107159190612b02565b61125a565b005b34801561072857600080fd5b50610743600480360381019061073e9190612901565b61127b565b005b34801561075157600080fd5b5061076c6004803603810190610767919061295b565b6113bf565b604051610779919061326c565b60405180910390f35b34801561078e57600080fd5b506107a960048036038101906107a49190612901565b611446565b005b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061081e575061081d826114ca565b5b9050919050565b60606003805461083490613506565b80601f016020809104026020016040519081016040528092919081815260200182805461086090613506565b80156108ad5780601f10610882576101008083540402835291602001916108ad565b820191906000526020600020905b81548152906001019060200180831161089057829003601f168201915b5050505050905090565b6000806108c2611534565b90506108cf81858561153c565b600191505092915050565b6000600254905090565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0861090e81611707565b3373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015610954573d6000803e3d6000fd5b505050565b600080610964611534565b905061097185828561171b565b61097c8585856117a7565b60019150509392505050565b600060066000838152602001908152602001600020600101549050919050565b6109b182610988565b6109ba81611707565b6109c48383611a66565b505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006009905090565b610a00611534565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a649061324c565b60405180910390fd5b610a778282611b47565b5050565b600080610a86611534565b9050610aa7818585610a9885896113bf565b610aa2919061335c565b61153c565b600191505092915050565b600d5481565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08610b0e81611707565b82600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600082905080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015610bfd57600080fd5b505afa158015610c11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c35919061292e565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401610c91929190613002565b602060405180830381600087803b158015610cab57600080fd5b505af1158015610cbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce3919061292e565b600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401610dc292919061302b565b602060405180830381600087803b158015610ddc57600080fd5b505af1158015610df0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e149190612aa8565b50610e6230600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61153c565b610e8d30307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61153c565b610efc600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61153c565b50505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f52611c29565b610f5c6000611ca7565b565b600f60009054906101000a900460ff1681565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08610f9b81611707565b43600a8190555060005b838390508110156110445761103167016345785d8a00006001610ff0600a888887818110610fd657610fd561366d565b5b9050602002016020810190610feb9190612901565b611d6d565b610ffa919061335c565b61100491906133b2565b8585848181106110175761101661366d565b5b905060200201602081019061102c9190612901565b611db0565b808061103c90613538565b915050610fa5565b50505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600480546110ee90613506565b80601f016020809104026020016040519081016040528092919081815260200182805461111a90613506565b80156111675780601f1061113c57610100808354040283529160200191611167565b820191906000526020600020905b81548152906001019060200180831161114a57829003601f168201915b5050505050905090565b6000801b81565b600080611183611534565b9050600061119182866113bf565b9050838110156111d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cd9061322c565b60405180910390fd5b6111e3828686840361153c565b60019250505092915050565b6000806111fa611534565b90506112078185856117a7565b600191505092915050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0861123c81611707565b81600f60006101000a81548160ff0219169083151502179055505050565b61126382610988565b61126c81611707565b6112768383611b47565b505050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b086112a581611707565b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112fb9190612fe7565b60206040518083038186803b15801561131357600080fd5b505afa158015611327573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134b9190612b9c565b6040518363ffffffff1660e01b815260040161136892919061302b565b602060405180830381600087803b15801561138257600080fd5b505af1158015611396573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ba9190612aa8565b505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61144e611c29565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b5906130ec565b60405180910390fd5b6114c781611ca7565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156115ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a39061320c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561161c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116139061310c565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516116fa919061326c565b60405180910390a3505050565b61171881611713611534565b612054565b50565b600061172784846113bf565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146117a15781811015611793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178a9061314c565b60405180910390fd5b6117a0848484840361153c565b5b50505050565b600081116117ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e1906131cc565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156118965750600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156118ab576118a68383836120d9565b611a61565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611956576000600a5411611946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193d9061318c565b60405180910390fd5b6119518383836120e9565b611a61565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a6057600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611a0e57611a098383836120e9565b611a61565b600f60009054906101000a900460ff1615611a5057611a4f81600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612361565b5b611a5b8383836120e9565b611a61565b5b505050565b611a708282611074565b611b435760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611ae8611534565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611b518282611074565b15611c255760006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611bca611534565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b611c31611534565b73ffffffffffffffffffffffffffffffffffffffff16611c4f61104a565b73ffffffffffffffffffffffffffffffffffffffff1614611ca5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9c906131ac565b60405180910390fd5b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600082424484604051602001611d8593929190612faa565b6040516020818303038152906040528051906020012060001c611da891906135af565b905092915050565b6001600f60016101000a81548160ff0219169083151502179055506000600267ffffffffffffffff811115611de857611de761369c565b5b604051908082528060200260200182016040528015611e165781602001602082028036833780820191505090505b509050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600081518110611e5057611e4f61366d565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250503081600181518110611e9f57611e9e61366d565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611f369190612fe7565b60206040518083038186803b158015611f4e57600080fd5b505afa158015611f62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f869190612b9c565b90506000841415611f95578093505b80841161203357600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c11d7958560008587426040518663ffffffff1660e01b8152600401612000959493929190613287565b600060405180830381600087803b15801561201a57600080fd5b505af115801561202e573d6000803e3d6000fd5b505050505b50506000600f60016101000a81548160ff0219169083151502179055505050565b61205e8282611074565b6120d55761206b81612590565b6120798360001c60206125bd565b60405160200161208a929190612f70565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cc919061308a565b60405180910390fd5b5050565b6120e48383836120e9565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612159576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612150906131ec565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c0906130cc565b60405180910390fd5b6121d48383836127f9565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561225a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122519061316c565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612348919061326c565b60405180910390a361235b8484846127fe565b50505050565b6001600f60016101000a81548160ff021916908315150217905550600061238730610f02565b90508281116123cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c29061312c565b60405180910390fd5b6000600267ffffffffffffffff8111156123e8576123e761369c565b5b6040519080825280602002602001820160405280156124165781602001602082028036833780820191505090505b509050308160008151811061242e5761242d61366d565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160018151811061249f5761249e61366d565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c11d7958560008487426040518663ffffffff1660e01b815260040161253d959493929190613287565b600060405180830381600087803b15801561255757600080fd5b505af115801561256b573d6000803e3d6000fd5b5050505050506000600f60016101000a81548160ff0219169083151502179055505050565b60606125b68273ffffffffffffffffffffffffffffffffffffffff16601460ff166125bd565b9050919050565b6060600060028360026125d091906133b2565b6125da919061335c565b67ffffffffffffffff8111156125f3576125f261369c565b5b6040519080825280601f01601f1916602001820160405280156126255781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061265d5761265c61366d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106126c1576126c061366d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261270191906133b2565b61270b919061335c565b90505b60018111156127ab577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061274d5761274c61366d565b5b1a60f81b8282815181106127645761276361366d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806127a4906134dc565b905061270e565b50600084146127ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e6906130ac565b60405180910390fd5b8091505092915050565b505050565b505050565b60008135905061281281613ac2565b92915050565b60008151905061282781613ac2565b92915050565b60008083601f840112612843576128426136d0565b5b8235905067ffffffffffffffff8111156128605761285f6136cb565b5b60208301915083602082028301111561287c5761287b6136d5565b5b9250929050565b60008135905061289281613ad9565b92915050565b6000815190506128a781613ad9565b92915050565b6000813590506128bc81613af0565b92915050565b6000813590506128d181613b07565b92915050565b6000813590506128e681613b1e565b92915050565b6000815190506128fb81613b1e565b92915050565b600060208284031215612917576129166136df565b5b600061292584828501612803565b91505092915050565b600060208284031215612944576129436136df565b5b600061295284828501612818565b91505092915050565b60008060408385031215612972576129716136df565b5b600061298085828601612803565b925050602061299185828601612803565b9150509250929050565b6000806000606084860312156129b4576129b36136df565b5b60006129c286828701612803565b93505060206129d386828701612803565b92505060406129e4868287016128d7565b9150509250925092565b60008060408385031215612a0557612a046136df565b5b6000612a1385828601612803565b9250506020612a24858286016128d7565b9150509250929050565b60008060208385031215612a4557612a446136df565b5b600083013567ffffffffffffffff811115612a6357612a626136da565b5b612a6f8582860161282d565b92509250509250929050565b600060208284031215612a9157612a906136df565b5b6000612a9f84828501612883565b91505092915050565b600060208284031215612abe57612abd6136df565b5b6000612acc84828501612898565b91505092915050565b600060208284031215612aeb57612aea6136df565b5b6000612af9848285016128ad565b91505092915050565b60008060408385031215612b1957612b186136df565b5b6000612b27858286016128ad565b9250506020612b3885828601612803565b9150509250929050565b600060208284031215612b5857612b576136df565b5b6000612b66848285016128c2565b91505092915050565b600060208284031215612b8557612b846136df565b5b6000612b93848285016128d7565b91505092915050565b600060208284031215612bb257612bb16136df565b5b6000612bc0848285016128ec565b91505092915050565b6000612bd58383612be1565b60208301905092915050565b612bea8161340c565b82525050565b612bf98161340c565b82525050565b612c10612c0b8261340c565b613581565b82525050565b6000612c218261330c565b612c2b818561332f565b9350612c36836132fc565b8060005b83811015612c67578151612c4e8882612bc9565b9750612c5983613322565b925050600181019050612c3a565b5085935050505092915050565b612c7d8161341e565b82525050565b612c8c8161342a565b82525050565b612c9b81613497565b82525050565b6000612cac82613317565b612cb68185613340565b9350612cc68185602086016134a9565b612ccf816136e4565b840191505092915050565b6000612ce582613317565b612cef8185613351565b9350612cff8185602086016134a9565b80840191505092915050565b6000612d18602083613340565b9150612d2382613702565b602082019050919050565b6000612d3b602383613340565b9150612d468261372b565b604082019050919050565b6000612d5e602683613340565b9150612d698261377a565b604082019050919050565b6000612d81602283613340565b9150612d8c826137c9565b604082019050919050565b6000612da4600883613340565b9150612daf82613818565b602082019050919050565b6000612dc7601d83613340565b9150612dd282613841565b602082019050919050565b6000612dea602683613340565b9150612df58261386a565b604082019050919050565b6000612e0d600883613340565b9150612e18826138b9565b602082019050919050565b6000612e30602083613340565b9150612e3b826138e2565b602082019050919050565b6000612e53601083613340565b9150612e5e8261390b565b602082019050919050565b6000612e76602583613340565b9150612e8182613934565b604082019050919050565b6000612e99602483613340565b9150612ea482613983565b604082019050919050565b6000612ebc601783613351565b9150612ec7826139d2565b601782019050919050565b6000612edf602583613340565b9150612eea826139fb565b604082019050919050565b6000612f02601183613351565b9150612f0d82613a4a565b601182019050919050565b6000612f25602f83613340565b9150612f3082613a73565b604082019050919050565b612f4481613480565b82525050565b612f5b612f5682613480565b6135a5565b82525050565b612f6a8161348a565b82525050565b6000612f7b82612eaf565b9150612f878285612cda565b9150612f9282612ef5565b9150612f9e8284612cda565b91508190509392505050565b6000612fb68286612f4a565b602082019150612fc68285612f4a565b602082019150612fd68284612bff565b601482019150819050949350505050565b6000602082019050612ffc6000830184612bf0565b92915050565b60006040820190506130176000830185612bf0565b6130246020830184612bf0565b9392505050565b60006040820190506130406000830185612bf0565b61304d6020830184612f3b565b9392505050565b60006020820190506130696000830184612c74565b92915050565b60006020820190506130846000830184612c83565b92915050565b600060208201905081810360008301526130a48184612ca1565b905092915050565b600060208201905081810360008301526130c581612d0b565b9050919050565b600060208201905081810360008301526130e581612d2e565b9050919050565b6000602082019050818103600083015261310581612d51565b9050919050565b6000602082019050818103600083015261312581612d74565b9050919050565b6000602082019050818103600083015261314581612d97565b9050919050565b6000602082019050818103600083015261316581612dba565b9050919050565b6000602082019050818103600083015261318581612ddd565b9050919050565b600060208201905081810360008301526131a581612e00565b9050919050565b600060208201905081810360008301526131c581612e23565b9050919050565b600060208201905081810360008301526131e581612e46565b9050919050565b6000602082019050818103600083015261320581612e69565b9050919050565b6000602082019050818103600083015261322581612e8c565b9050919050565b6000602082019050818103600083015261324581612ed2565b9050919050565b6000602082019050818103600083015261326581612f18565b9050919050565b60006020820190506132816000830184612f3b565b92915050565b600060a08201905061329c6000830188612f3b565b6132a96020830187612c92565b81810360408301526132bb8186612c16565b90506132ca6060830185612bf0565b6132d76080830184612f3b565b9695505050505050565b60006020820190506132f66000830184612f61565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061336782613480565b915061337283613480565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156133a7576133a66135e0565b5b828201905092915050565b60006133bd82613480565b91506133c883613480565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613401576134006135e0565b5b828202905092915050565b600061341782613460565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006134a282613480565b9050919050565b60005b838110156134c75780820151818401526020810190506134ac565b838111156134d6576000848401525b50505050565b60006134e782613480565b915060008214156134fb576134fa6135e0565b5b600182039050919050565b6000600282049050600182168061351e57607f821691505b602082108114156135325761353161363e565b5b50919050565b600061354382613480565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613576576135756135e0565b5b600182019050919050565b600061358c82613593565b9050919050565b600061359e826136f5565b9050919050565b6000819050919050565b60006135ba82613480565b91506135c583613480565b9250826135d5576135d461360f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f6e6f7420616c6f77000000000000000000000000000000000000000000000000600082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f6e6f74206f70656e000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f616d6f756e74206d757374206774203000000000000000000000000000000000600082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b613acb8161340c565b8114613ad657600080fd5b50565b613ae28161341e565b8114613aed57600080fd5b50565b613af98161342a565b8114613b0457600080fd5b50565b613b1081613434565b8114613b1b57600080fd5b50565b613b2781613480565b8114613b3257600080fd5b5056fea2646970667358221220c5e2faa1778d03573f67dcfaafeba66d4e819c6ea95d8305376f9dbdb8cc0b3064736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101dc5760003560e01c80636f6579a311610102578063a217fddf11610095578063d547741f11610064578063d547741f146106f3578063d99274481461071c578063dd62ed3e14610745578063f2fde38b14610782576101e3565b8063a217fddf14610625578063a457c2d714610650578063a9059cbb1461068d578063c88b1904146106ca576101e3565b806380720140116100d157806380720140146105695780638da5cb5b1461059257806391d14854146105bd57806395d89b41146105fa576101e3565b80636f6579a3146104c157806370a08231146104ea578063715018a6146105275780637490f76a1461053e576101e3565b80632f2ff15d1161017a578063395093511161014957806339509351146104035780633f936ff51461044057806349bd5a5e1461046b578063553193ca14610496576101e3565b80632f2ff15d1461035b5780632f48ab7d14610384578063313ce567146103af57806336568abe146103da576101e3565b806318160ddd116101b657806318160ddd1461028d5780631c6a0c4c146102b857806323b872dd146102e1578063248a9ca31461031e576101e3565b806301ffc9a7146101e857806306fdde0314610225578063095ea7b314610250576101e3565b366101e357005b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a9190612b42565b6107ab565b60405161021c9190613054565b60405180910390f35b34801561023157600080fd5b5061023a610825565b604051610247919061308a565b60405180910390f35b34801561025c57600080fd5b50610277600480360381019061027291906129ee565b6108b7565b6040516102849190613054565b60405180910390f35b34801561029957600080fd5b506102a26108da565b6040516102af919061326c565b60405180910390f35b3480156102c457600080fd5b506102df60048036038101906102da9190612b6f565b6108e4565b005b3480156102ed57600080fd5b506103086004803603810190610303919061299b565b610959565b6040516103159190613054565b60405180910390f35b34801561032a57600080fd5b5061034560048036038101906103409190612ad5565b610988565b604051610352919061306f565b60405180910390f35b34801561036757600080fd5b50610382600480360381019061037d9190612b02565b6109a8565b005b34801561039057600080fd5b506103996109c9565b6040516103a69190612fe7565b60405180910390f35b3480156103bb57600080fd5b506103c46109ef565b6040516103d191906132e1565b60405180910390f35b3480156103e657600080fd5b5061040160048036038101906103fc9190612b02565b6109f8565b005b34801561040f57600080fd5b5061042a600480360381019061042591906129ee565b610a7b565b6040516104379190613054565b60405180910390f35b34801561044c57600080fd5b50610455610ab2565b604051610462919061326c565b60405180910390f35b34801561047757600080fd5b50610480610ab8565b60405161048d9190612fe7565b60405180910390f35b3480156104a257600080fd5b506104ab610ade565b6040516104b8919061326c565b60405180910390f35b3480156104cd57600080fd5b506104e860048036038101906104e3919061295b565b610ae4565b005b3480156104f657600080fd5b50610511600480360381019061050c9190612901565b610f02565b60405161051e919061326c565b60405180910390f35b34801561053357600080fd5b5061053c610f4a565b005b34801561054a57600080fd5b50610553610f5e565b6040516105609190613054565b60405180910390f35b34801561057557600080fd5b50610590600480360381019061058b9190612a2e565b610f71565b005b34801561059e57600080fd5b506105a761104a565b6040516105b49190612fe7565b60405180910390f35b3480156105c957600080fd5b506105e460048036038101906105df9190612b02565b611074565b6040516105f19190613054565b60405180910390f35b34801561060657600080fd5b5061060f6110df565b60405161061c919061308a565b60405180910390f35b34801561063157600080fd5b5061063a611171565b604051610647919061306f565b60405180910390f35b34801561065c57600080fd5b50610677600480360381019061067291906129ee565b611178565b6040516106849190613054565b60405180910390f35b34801561069957600080fd5b506106b460048036038101906106af91906129ee565b6111ef565b6040516106c19190613054565b60405180910390f35b3480156106d657600080fd5b506106f160048036038101906106ec9190612a7b565b611212565b005b3480156106ff57600080fd5b5061071a60048036038101906107159190612b02565b61125a565b005b34801561072857600080fd5b50610743600480360381019061073e9190612901565b61127b565b005b34801561075157600080fd5b5061076c6004803603810190610767919061295b565b6113bf565b604051610779919061326c565b60405180910390f35b34801561078e57600080fd5b506107a960048036038101906107a49190612901565b611446565b005b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061081e575061081d826114ca565b5b9050919050565b60606003805461083490613506565b80601f016020809104026020016040519081016040528092919081815260200182805461086090613506565b80156108ad5780601f10610882576101008083540402835291602001916108ad565b820191906000526020600020905b81548152906001019060200180831161089057829003601f168201915b5050505050905090565b6000806108c2611534565b90506108cf81858561153c565b600191505092915050565b6000600254905090565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0861090e81611707565b3373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015610954573d6000803e3d6000fd5b505050565b600080610964611534565b905061097185828561171b565b61097c8585856117a7565b60019150509392505050565b600060066000838152602001908152602001600020600101549050919050565b6109b182610988565b6109ba81611707565b6109c48383611a66565b505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006009905090565b610a00611534565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a649061324c565b60405180910390fd5b610a778282611b47565b5050565b600080610a86611534565b9050610aa7818585610a9885896113bf565b610aa2919061335c565b61153c565b600191505092915050565b600d5481565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08610b0e81611707565b82600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600082905080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015610bfd57600080fd5b505afa158015610c11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c35919061292e565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401610c91929190613002565b602060405180830381600087803b158015610cab57600080fd5b505af1158015610cbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce3919061292e565b600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401610dc292919061302b565b602060405180830381600087803b158015610ddc57600080fd5b505af1158015610df0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e149190612aa8565b50610e6230600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61153c565b610e8d30307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61153c565b610efc600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61153c565b50505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f52611c29565b610f5c6000611ca7565b565b600f60009054906101000a900460ff1681565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08610f9b81611707565b43600a8190555060005b838390508110156110445761103167016345785d8a00006001610ff0600a888887818110610fd657610fd561366d565b5b9050602002016020810190610feb9190612901565b611d6d565b610ffa919061335c565b61100491906133b2565b8585848181106110175761101661366d565b5b905060200201602081019061102c9190612901565b611db0565b808061103c90613538565b915050610fa5565b50505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600480546110ee90613506565b80601f016020809104026020016040519081016040528092919081815260200182805461111a90613506565b80156111675780601f1061113c57610100808354040283529160200191611167565b820191906000526020600020905b81548152906001019060200180831161114a57829003601f168201915b5050505050905090565b6000801b81565b600080611183611534565b9050600061119182866113bf565b9050838110156111d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cd9061322c565b60405180910390fd5b6111e3828686840361153c565b60019250505092915050565b6000806111fa611534565b90506112078185856117a7565b600191505092915050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0861123c81611707565b81600f60006101000a81548160ff0219169083151502179055505050565b61126382610988565b61126c81611707565b6112768383611b47565b505050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b086112a581611707565b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112fb9190612fe7565b60206040518083038186803b15801561131357600080fd5b505afa158015611327573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134b9190612b9c565b6040518363ffffffff1660e01b815260040161136892919061302b565b602060405180830381600087803b15801561138257600080fd5b505af1158015611396573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ba9190612aa8565b505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61144e611c29565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b5906130ec565b60405180910390fd5b6114c781611ca7565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156115ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a39061320c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561161c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116139061310c565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516116fa919061326c565b60405180910390a3505050565b61171881611713611534565b612054565b50565b600061172784846113bf565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146117a15781811015611793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178a9061314c565b60405180910390fd5b6117a0848484840361153c565b5b50505050565b600081116117ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e1906131cc565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156118965750600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156118ab576118a68383836120d9565b611a61565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611956576000600a5411611946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193d9061318c565b60405180910390fd5b6119518383836120e9565b611a61565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a6057600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611a0e57611a098383836120e9565b611a61565b600f60009054906101000a900460ff1615611a5057611a4f81600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612361565b5b611a5b8383836120e9565b611a61565b5b505050565b611a708282611074565b611b435760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611ae8611534565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611b518282611074565b15611c255760006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611bca611534565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b611c31611534565b73ffffffffffffffffffffffffffffffffffffffff16611c4f61104a565b73ffffffffffffffffffffffffffffffffffffffff1614611ca5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9c906131ac565b60405180910390fd5b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600082424484604051602001611d8593929190612faa565b6040516020818303038152906040528051906020012060001c611da891906135af565b905092915050565b6001600f60016101000a81548160ff0219169083151502179055506000600267ffffffffffffffff811115611de857611de761369c565b5b604051908082528060200260200182016040528015611e165781602001602082028036833780820191505090505b509050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600081518110611e5057611e4f61366d565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250503081600181518110611e9f57611e9e61366d565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611f369190612fe7565b60206040518083038186803b158015611f4e57600080fd5b505afa158015611f62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f869190612b9c565b90506000841415611f95578093505b80841161203357600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c11d7958560008587426040518663ffffffff1660e01b8152600401612000959493929190613287565b600060405180830381600087803b15801561201a57600080fd5b505af115801561202e573d6000803e3d6000fd5b505050505b50506000600f60016101000a81548160ff0219169083151502179055505050565b61205e8282611074565b6120d55761206b81612590565b6120798360001c60206125bd565b60405160200161208a929190612f70565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cc919061308a565b60405180910390fd5b5050565b6120e48383836120e9565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612159576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612150906131ec565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c0906130cc565b60405180910390fd5b6121d48383836127f9565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561225a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122519061316c565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612348919061326c565b60405180910390a361235b8484846127fe565b50505050565b6001600f60016101000a81548160ff021916908315150217905550600061238730610f02565b90508281116123cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c29061312c565b60405180910390fd5b6000600267ffffffffffffffff8111156123e8576123e761369c565b5b6040519080825280602002602001820160405280156124165781602001602082028036833780820191505090505b509050308160008151811061242e5761242d61366d565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160018151811061249f5761249e61366d565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c11d7958560008487426040518663ffffffff1660e01b815260040161253d959493929190613287565b600060405180830381600087803b15801561255757600080fd5b505af115801561256b573d6000803e3d6000fd5b5050505050506000600f60016101000a81548160ff0219169083151502179055505050565b60606125b68273ffffffffffffffffffffffffffffffffffffffff16601460ff166125bd565b9050919050565b6060600060028360026125d091906133b2565b6125da919061335c565b67ffffffffffffffff8111156125f3576125f261369c565b5b6040519080825280601f01601f1916602001820160405280156126255781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061265d5761265c61366d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106126c1576126c061366d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261270191906133b2565b61270b919061335c565b90505b60018111156127ab577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061274d5761274c61366d565b5b1a60f81b8282815181106127645761276361366d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806127a4906134dc565b905061270e565b50600084146127ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e6906130ac565b60405180910390fd5b8091505092915050565b505050565b505050565b60008135905061281281613ac2565b92915050565b60008151905061282781613ac2565b92915050565b60008083601f840112612843576128426136d0565b5b8235905067ffffffffffffffff8111156128605761285f6136cb565b5b60208301915083602082028301111561287c5761287b6136d5565b5b9250929050565b60008135905061289281613ad9565b92915050565b6000815190506128a781613ad9565b92915050565b6000813590506128bc81613af0565b92915050565b6000813590506128d181613b07565b92915050565b6000813590506128e681613b1e565b92915050565b6000815190506128fb81613b1e565b92915050565b600060208284031215612917576129166136df565b5b600061292584828501612803565b91505092915050565b600060208284031215612944576129436136df565b5b600061295284828501612818565b91505092915050565b60008060408385031215612972576129716136df565b5b600061298085828601612803565b925050602061299185828601612803565b9150509250929050565b6000806000606084860312156129b4576129b36136df565b5b60006129c286828701612803565b93505060206129d386828701612803565b92505060406129e4868287016128d7565b9150509250925092565b60008060408385031215612a0557612a046136df565b5b6000612a1385828601612803565b9250506020612a24858286016128d7565b9150509250929050565b60008060208385031215612a4557612a446136df565b5b600083013567ffffffffffffffff811115612a6357612a626136da565b5b612a6f8582860161282d565b92509250509250929050565b600060208284031215612a9157612a906136df565b5b6000612a9f84828501612883565b91505092915050565b600060208284031215612abe57612abd6136df565b5b6000612acc84828501612898565b91505092915050565b600060208284031215612aeb57612aea6136df565b5b6000612af9848285016128ad565b91505092915050565b60008060408385031215612b1957612b186136df565b5b6000612b27858286016128ad565b9250506020612b3885828601612803565b9150509250929050565b600060208284031215612b5857612b576136df565b5b6000612b66848285016128c2565b91505092915050565b600060208284031215612b8557612b846136df565b5b6000612b93848285016128d7565b91505092915050565b600060208284031215612bb257612bb16136df565b5b6000612bc0848285016128ec565b91505092915050565b6000612bd58383612be1565b60208301905092915050565b612bea8161340c565b82525050565b612bf98161340c565b82525050565b612c10612c0b8261340c565b613581565b82525050565b6000612c218261330c565b612c2b818561332f565b9350612c36836132fc565b8060005b83811015612c67578151612c4e8882612bc9565b9750612c5983613322565b925050600181019050612c3a565b5085935050505092915050565b612c7d8161341e565b82525050565b612c8c8161342a565b82525050565b612c9b81613497565b82525050565b6000612cac82613317565b612cb68185613340565b9350612cc68185602086016134a9565b612ccf816136e4565b840191505092915050565b6000612ce582613317565b612cef8185613351565b9350612cff8185602086016134a9565b80840191505092915050565b6000612d18602083613340565b9150612d2382613702565b602082019050919050565b6000612d3b602383613340565b9150612d468261372b565b604082019050919050565b6000612d5e602683613340565b9150612d698261377a565b604082019050919050565b6000612d81602283613340565b9150612d8c826137c9565b604082019050919050565b6000612da4600883613340565b9150612daf82613818565b602082019050919050565b6000612dc7601d83613340565b9150612dd282613841565b602082019050919050565b6000612dea602683613340565b9150612df58261386a565b604082019050919050565b6000612e0d600883613340565b9150612e18826138b9565b602082019050919050565b6000612e30602083613340565b9150612e3b826138e2565b602082019050919050565b6000612e53601083613340565b9150612e5e8261390b565b602082019050919050565b6000612e76602583613340565b9150612e8182613934565b604082019050919050565b6000612e99602483613340565b9150612ea482613983565b604082019050919050565b6000612ebc601783613351565b9150612ec7826139d2565b601782019050919050565b6000612edf602583613340565b9150612eea826139fb565b604082019050919050565b6000612f02601183613351565b9150612f0d82613a4a565b601182019050919050565b6000612f25602f83613340565b9150612f3082613a73565b604082019050919050565b612f4481613480565b82525050565b612f5b612f5682613480565b6135a5565b82525050565b612f6a8161348a565b82525050565b6000612f7b82612eaf565b9150612f878285612cda565b9150612f9282612ef5565b9150612f9e8284612cda565b91508190509392505050565b6000612fb68286612f4a565b602082019150612fc68285612f4a565b602082019150612fd68284612bff565b601482019150819050949350505050565b6000602082019050612ffc6000830184612bf0565b92915050565b60006040820190506130176000830185612bf0565b6130246020830184612bf0565b9392505050565b60006040820190506130406000830185612bf0565b61304d6020830184612f3b565b9392505050565b60006020820190506130696000830184612c74565b92915050565b60006020820190506130846000830184612c83565b92915050565b600060208201905081810360008301526130a48184612ca1565b905092915050565b600060208201905081810360008301526130c581612d0b565b9050919050565b600060208201905081810360008301526130e581612d2e565b9050919050565b6000602082019050818103600083015261310581612d51565b9050919050565b6000602082019050818103600083015261312581612d74565b9050919050565b6000602082019050818103600083015261314581612d97565b9050919050565b6000602082019050818103600083015261316581612dba565b9050919050565b6000602082019050818103600083015261318581612ddd565b9050919050565b600060208201905081810360008301526131a581612e00565b9050919050565b600060208201905081810360008301526131c581612e23565b9050919050565b600060208201905081810360008301526131e581612e46565b9050919050565b6000602082019050818103600083015261320581612e69565b9050919050565b6000602082019050818103600083015261322581612e8c565b9050919050565b6000602082019050818103600083015261324581612ed2565b9050919050565b6000602082019050818103600083015261326581612f18565b9050919050565b60006020820190506132816000830184612f3b565b92915050565b600060a08201905061329c6000830188612f3b565b6132a96020830187612c92565b81810360408301526132bb8186612c16565b90506132ca6060830185612bf0565b6132d76080830184612f3b565b9695505050505050565b60006020820190506132f66000830184612f61565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061336782613480565b915061337283613480565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156133a7576133a66135e0565b5b828201905092915050565b60006133bd82613480565b91506133c883613480565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613401576134006135e0565b5b828202905092915050565b600061341782613460565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006134a282613480565b9050919050565b60005b838110156134c75780820151818401526020810190506134ac565b838111156134d6576000848401525b50505050565b60006134e782613480565b915060008214156134fb576134fa6135e0565b5b600182039050919050565b6000600282049050600182168061351e57607f821691505b602082108114156135325761353161363e565b5b50919050565b600061354382613480565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613576576135756135e0565b5b600182019050919050565b600061358c82613593565b9050919050565b600061359e826136f5565b9050919050565b6000819050919050565b60006135ba82613480565b91506135c583613480565b9250826135d5576135d461360f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f6e6f7420616c6f77000000000000000000000000000000000000000000000000600082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f6e6f74206f70656e000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f616d6f756e74206d757374206774203000000000000000000000000000000000600082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b613acb8161340c565b8114613ad657600080fd5b50565b613ae28161341e565b8114613aed57600080fd5b50565b613af98161342a565b8114613b0457600080fd5b50565b613b1081613434565b8114613b1b57600080fd5b50565b613b2781613480565b8114613b3257600080fd5b5056fea2646970667358221220c5e2faa1778d03573f67dcfaafeba66d4e819c6ea95d8305376f9dbdb8cc0b3064736f6c63430008070033

Deployed Bytecode Sourcemap

62794:4823:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37632:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51722:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54082:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52851:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67342:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54863:261;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39455:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39896:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63029:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64480:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41040:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55533:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63135:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62994:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63055:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63792:682;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53022:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45177:103;;;;;;;;;;;;;:::i;:::-;;63215:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66747:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44536:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37928:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51941:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37033:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56274:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53355:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67476:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40336:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67169:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53611:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45435:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37632:204;37717:4;37756:32;37741:47;;;:11;:47;;;;:87;;;;37792:36;37816:11;37792:23;:36::i;:::-;37741:87;37734:94;;37632:204;;;:::o;51722:100::-;51776:13;51809:5;51802:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51722:100;:::o;54082:201::-;54165:4;54182:13;54198:12;:10;:12::i;:::-;54182:28;;54221:32;54230:5;54237:7;54246:6;54221:8;:32::i;:::-;54271:4;54264:11;;;54082:201;;;;:::o;52851:108::-;52912:7;52939:12;;52932:19;;52851:108;:::o;67342:122::-;62887:25;37524:16;37535:4;37524:10;:16::i;:::-;67428:10:::1;67420:28;;:36;67449:6;67420:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;67342:122:::0;;:::o;54863:261::-;54960:4;54977:15;54995:12;:10;:12::i;:::-;54977:30;;55018:38;55034:4;55040:7;55049:6;55018:15;:38::i;:::-;55067:27;55077:4;55083:2;55087:6;55067:9;:27::i;:::-;55112:4;55105:11;;;54863:261;;;;;:::o;39455:131::-;39529:7;39556:6;:12;39563:4;39556:12;;;;;;;;;;;:22;;;39549:29;;39455:131;;;:::o;39896:147::-;39979:18;39992:4;39979:12;:18::i;:::-;37524:16;37535:4;37524:10;:16::i;:::-;40010:25:::1;40021:4;40027:7;40010:10;:25::i;:::-;39896:147:::0;;;:::o;63029:19::-;;;;;;;;;;;;;:::o;64480:92::-;64538:5;64563:1;64556:8;;64480:92;:::o;41040:218::-;41147:12;:10;:12::i;:::-;41136:23;;:7;:23;;;41128:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;41224:26;41236:4;41242:7;41224:11;:26::i;:::-;41040:218;;:::o;55533:238::-;55621:4;55638:13;55654:12;:10;:12::i;:::-;55638:28;;55677:64;55686:5;55693:7;55730:10;55702:25;55712:5;55719:7;55702:9;:25::i;:::-;:38;;;;:::i;:::-;55677:8;:64::i;:::-;55759:4;55752:11;;;55533:238;;;;:::o;63135:24::-;;;;:::o;62994:28::-;;;;;;;;;;;;;:::o;63055:30::-;;;;:::o;63792:682::-;62887:25;37524:16;37535:4;37524:10;:16::i;:::-;63886:6:::1;63881:4;;:11;;;;;;;;;;;;;;;;;;63959:12;63972:5;63959:18;;64073:4;64043:15;;:35;;;;;;;;;;;;;;;;;;64118:15;;;;;;;;;;;:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64105:50;;;64164:4;64171;;;;;;;;;;;64105:71;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64089:13;;:87;;;;;;;;;;;;;;;;;;64193:4;;;;;;;;;;;64187:19;;;64215:15;;;;;;;;;;;64233:17;64187:64;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;64262:67;64279:4;64294:15;;;;;;;;;;;64311:17;64262:8;:67::i;:::-;64340:56;64357:4;64372;64378:17;64340:8;:56::i;:::-;64407:59;64416:5;;;;;;;;;;;64431:15;;;;;;;;;;;64448:17;64407:8;:59::i;:::-;63870:604;63792:682:::0;;;:::o;53022:127::-;53096:7;53123:9;:18;53133:7;53123:18;;;;;;;;;;;;;;;;53116:25;;53022:127;;;:::o;45177:103::-;44422:13;:11;:13::i;:::-;45242:30:::1;45269:1;45242:18;:30::i;:::-;45177:103::o:0;63215:28::-;;;;;;;;;;;;;:::o;66747:228::-;62887:25;37524:16;37535:4;37524:10;:16::i;:::-;66851:12:::1;66833:15;:30;;;;66878:6;66874:93;66889:4;;:11;;66887:1;:13;66874:93;;;66919:48;66952:6;66949:1;66930:18;66937:2;66940:4;;66945:1;66940:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;66930:6;:18::i;:::-;:20;;;;:::i;:::-;66929:29;;;;:::i;:::-;66959:4;;66964:1;66959:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;66919:9;:48::i;:::-;66901:3;;;;;:::i;:::-;;;;66874:93;;;;66747:228:::0;;;:::o;44536:87::-;44582:7;44609:6;;;;;;;;;;;44602:13;;44536:87;:::o;37928:147::-;38014:4;38038:6;:12;38045:4;38038:12;;;;;;;;;;;:20;;:29;38059:7;38038:29;;;;;;;;;;;;;;;;;;;;;;;;;38031:36;;37928:147;;;;:::o;51941:104::-;51997:13;52030:7;52023:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51941:104;:::o;37033:49::-;37078:4;37033:49;;;:::o;56274:436::-;56367:4;56384:13;56400:12;:10;:12::i;:::-;56384:28;;56423:24;56450:25;56460:5;56467:7;56450:9;:25::i;:::-;56423:52;;56514:15;56494:16;:35;;56486:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;56607:60;56616:5;56623:7;56651:15;56632:16;:34;56607:8;:60::i;:::-;56698:4;56691:11;;;;56274:436;;;;:::o;53355:193::-;53434:4;53451:13;53467:12;:10;:12::i;:::-;53451:28;;53490;53500:5;53507:2;53511:6;53490:9;:28::i;:::-;53536:4;53529:11;;;53355:193;;;;:::o;67476:101::-;62887:25;37524:16;37535:4;37524:10;:16::i;:::-;67564:5:::1;67552:11;;:17;;;;;;;;;;;;;;;;;;67476:101:::0;;:::o;40336:149::-;40420:18;40433:4;40420:12;:18::i;:::-;37524:16;37535:4;37524:10;:16::i;:::-;40451:26:::1;40463:4;40469:7;40451:11;:26::i;:::-;40336:149:::0;;;:::o;67169:161::-;62887:25;37524:16;37535:4;37524:10;:16::i;:::-;67253:6:::1;67247:22;;;67270:10;67289:6;67282:24;;;67315:4;67282:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67247:75;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;67169:161:::0;;:::o;53611:151::-;53700:7;53727:11;:18;53739:5;53727:18;;;;;;;;;;;;;;;:27;53746:7;53727:27;;;;;;;;;;;;;;;;53720:34;;53611:151;;;;:::o;45435:201::-;44422:13;:11;:13::i;:::-;45544:1:::1;45524:22;;:8;:22;;;;45516:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;45600:28;45619:8;45600:18;:28::i;:::-;45435:201:::0;:::o;6569:157::-;6654:4;6693:25;6678:40;;;:11;:40;;;;6671:47;;6569:157;;;:::o;34714:98::-;34767:7;34794:10;34787:17;;34714:98;:::o;60267:346::-;60386:1;60369:19;;:5;:19;;;;60361:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60467:1;60448:21;;:7;:21;;;;60440:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60551:6;60521:11;:18;60533:5;60521:18;;;;;;;;;;;;;;;:27;60540:7;60521:27;;;;;;;;;;;;;;;:36;;;;60589:7;60573:32;;60582:5;60573:32;;;60598:6;60573:32;;;;;;:::i;:::-;;;;;;;;60267:346;;;:::o;38379:105::-;38446:30;38457:4;38463:12;:10;:12::i;:::-;38446:10;:30::i;:::-;38379:105;:::o;60904:419::-;61005:24;61032:25;61042:5;61049:7;61032:9;:25::i;:::-;61005:52;;61092:17;61072:16;:37;61068:248;;61154:6;61134:16;:26;;61126:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61238:51;61247:5;61254:7;61282:6;61263:16;:25;61238:8;:51::i;:::-;61068:248;60994:329;60904:419;;;:::o;64583:808::-;64724:1;64715:6;:10;64707:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;64768:13;;;;;;;;;;;64760:21;;:4;:21;;;;:44;;;;;64791:13;;;;;;;;;;;64785:19;;:2;:19;;;;64760:44;64757:127;;;64821:30;64834:4;64840:2;64844:6;64821:12;:30::i;:::-;64866:7;;64757:127;64905:13;;;;;;;;;;;64897:21;;:4;:21;;;64894:160;;;64959:1;64943:15;;:17;64935:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;64988:33;65004:4;65010:2;65014:6;64988:15;:33::i;:::-;65036:7;;64894:160;65073:13;;;;;;;;;;;65067:19;;:2;:19;;;65064:320;;;65106:9;:15;65116:4;65106:15;;;;;;;;;;;;;;;;;;;;;;;;;65103:112;;;65141:33;65157:4;65163:2;65167:6;65141:15;:33::i;:::-;65193:7;;65103:112;65232:11;;;;;;;;;;;65229:75;;;65263:25;65272:6;65279:8;;;;;;;;;;;65263;:25::i;:::-;65229:75;65318:33;65334:4;65340:2;65344:6;65318:15;:33::i;:::-;65366:7;;65064:320;64583:808;;;;:::o;42637:238::-;42721:22;42729:4;42735:7;42721;:22::i;:::-;42716:152;;42792:4;42760:6;:12;42767:4;42760:12;;;;;;;;;;;:20;;:29;42781:7;42760:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;42843:12;:10;:12::i;:::-;42816:40;;42834:7;42816:40;;42828:4;42816:40;;;;;;;;;;42716:152;42637:238;;:::o;43055:239::-;43139:22;43147:4;43153:7;43139;:22::i;:::-;43135:152;;;43210:5;43178:6;:12;43185:4;43178:12;;;;;;;;;;;:20;;:29;43199:7;43178:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;43262:12;:10;:12::i;:::-;43235:40;;43253:7;43235:40;;43247:4;43235:40;;;;;;;;;;43135:152;43055:239;;:::o;44701:132::-;44776:12;:10;:12::i;:::-;44765:23;;:7;:5;:7::i;:::-;:23;;;44757:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44701:132::o;45796:191::-;45870:16;45889:6;;;;;;;;;;;45870:25;;45915:8;45906:6;;:17;;;;;;;;;;;;;;;;;;45970:8;45939:40;;45960:8;45939:40;;;;;;;;;;;;45859:128;45796:191;:::o;66981:180::-;67045:4;67147:6;67101:15;67117:16;67136:5;67084:58;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67074:69;;;;;;67069:75;;:84;;;;:::i;:::-;67062:91;;66981:180;;;;:::o;65703:611::-;65648:4;65639:6;;:13;;;;;;;;;;;;;;;;;;65785:21:::1;65823:1;65809:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65785:40;;65854:4;;;;;;;;;;;65836;65841:1;65836:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;65888:4;65870;65875:1;65870:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;65904:15;65929:4;;;;;;;;;;;65922:22;;;65953:4;65922:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65904:55;;65986:1;65973:11;:14;65970:39;;;66002:7;65988:21;;65970:39;66064:7;66049:11;:22;66046:260;;66082:15;;;;;;;;;;;:69;;;66166:11;66192:1;66235:4;66262:2;66280:15;66082:224;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;66046:260;65774:540;;65684:5:::0;65675:6;;:14;;;;;;;;;;;;;;;;;;65703:611;;:::o;38774:492::-;38863:22;38871:4;38877:7;38863;:22::i;:::-;38858:401;;39051:28;39071:7;39051:19;:28::i;:::-;39152:38;39180:4;39172:13;;39187:2;39152:19;:38::i;:::-;38956:257;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38902:345;;;;;;;;;;;:::i;:::-;;;;;;;;38858:401;38774:492;;:::o;65397:178::-;65524:43;65540:6;65548:9;65559:7;65524:15;:43::i;:::-;65397:178;;;:::o;57180:806::-;57293:1;57277:18;;:4;:18;;;;57269:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57370:1;57356:16;;:2;:16;;;;57348:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;57425:38;57446:4;57452:2;57456:6;57425:20;:38::i;:::-;57476:19;57498:9;:15;57508:4;57498:15;;;;;;;;;;;;;;;;57476:37;;57547:6;57532:11;:21;;57524:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;57664:6;57650:11;:20;57632:9;:15;57642:4;57632:15;;;;;;;;;;;;;;;:38;;;;57867:6;57850:9;:13;57860:2;57850:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;57917:2;57902:26;;57911:4;57902:26;;;57921:6;57902:26;;;;;;:::i;:::-;;;;;;;;57941:37;57961:4;57967:2;57971:6;57941:19;:37::i;:::-;57258:728;57180:806;;;:::o;66326:413::-;65648:4;65639:6;;:13;;;;;;;;;;;;;;;;;;66407:15:::1;66425:24;66443:4;66425:9;:24::i;:::-;66407:42;;66478:11;66468:7;:21;66460:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;66513:21;66551:1;66537:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66513:40;;66582:4;66564;66569:1;66564:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;66608:4;;;;;;;;;;;66598;66603:1;66598:7;;;;;;;;:::i;:::-;;;;;;;:14;;;;;;;;;::::0;::::1;66623:15;;;;;;;;;;;:69;;;66693:11;66705:1;66707:4;66712:2;66715:15;66623:108;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;66396:343;;65684:5:::0;65675:6;;:14;;;;;;;;;;;;;;;;;;66326:413;;:::o;23669:151::-;23727:13;23760:52;23788:4;23772:22;;21544:2;23760:52;;:11;:52::i;:::-;23753:59;;23669:151;;;:::o;23065:447::-;23140:13;23166:19;23211:1;23202:6;23198:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;23188:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23166:47;;23224:15;:6;23231:1;23224:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;23250;:6;23257:1;23250:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;23281:9;23306:1;23297:6;23293:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;23281:26;;23276:131;23313:1;23309;:5;23276:131;;;23348:8;23365:3;23357:5;:11;23348:21;;;;;;;:::i;:::-;;;;;23336:6;23343:1;23336:9;;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;23394:1;23384:11;;;;;23316:3;;;;:::i;:::-;;;23276:131;;;;23434:1;23425:5;:10;23417:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;23497:6;23483:21;;;23065:447;;;;:::o;61923:91::-;;;;:::o;62618:90::-;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;7:139;;;;:::o;152:143::-;209:5;240:6;234:13;225:22;;256:33;283:5;256:33;:::i;:::-;152:143;;;;:::o;318:568::-;391:8;401:6;451:3;444:4;436:6;432:17;428:27;418:122;;459:79;;:::i;:::-;418:122;572:6;559:20;549:30;;602:18;594:6;591:30;588:117;;;624:79;;:::i;:::-;588:117;738:4;730:6;726:17;714:29;;792:3;784:4;776:6;772:17;762:8;758:32;755:41;752:128;;;799:79;;:::i;:::-;752:128;318:568;;;;;:::o;892:133::-;935:5;973:6;960:20;951:29;;989:30;1013:5;989:30;:::i;:::-;892:133;;;;:::o;1031:137::-;1085:5;1116:6;1110:13;1101:22;;1132:30;1156:5;1132:30;:::i;:::-;1031:137;;;;:::o;1174:139::-;1220:5;1258:6;1245:20;1236:29;;1274:33;1301:5;1274:33;:::i;:::-;1174:139;;;;:::o;1319:137::-;1364:5;1402:6;1389:20;1380:29;;1418:32;1444:5;1418:32;:::i;:::-;1319:137;;;;:::o;1462:139::-;1508:5;1546:6;1533:20;1524:29;;1562:33;1589:5;1562:33;:::i;:::-;1462:139;;;;:::o;1607:143::-;1664:5;1695:6;1689:13;1680:22;;1711:33;1738:5;1711:33;:::i;:::-;1607:143;;;;:::o;1756:329::-;1815:6;1864:2;1852:9;1843:7;1839:23;1835:32;1832:119;;;1870:79;;:::i;:::-;1832:119;1990:1;2015:53;2060:7;2051:6;2040:9;2036:22;2015:53;:::i;:::-;2005:63;;1961:117;1756:329;;;;:::o;2091:351::-;2161:6;2210:2;2198:9;2189:7;2185:23;2181:32;2178:119;;;2216:79;;:::i;:::-;2178:119;2336:1;2361:64;2417:7;2408:6;2397:9;2393:22;2361:64;:::i;:::-;2351:74;;2307:128;2091:351;;;;:::o;2448:474::-;2516:6;2524;2573:2;2561:9;2552:7;2548:23;2544:32;2541:119;;;2579:79;;:::i;:::-;2541:119;2699:1;2724:53;2769:7;2760:6;2749:9;2745:22;2724:53;:::i;:::-;2714:63;;2670:117;2826:2;2852:53;2897:7;2888:6;2877:9;2873:22;2852:53;:::i;:::-;2842:63;;2797:118;2448:474;;;;;:::o;2928:619::-;3005:6;3013;3021;3070:2;3058:9;3049:7;3045:23;3041:32;3038:119;;;3076:79;;:::i;:::-;3038:119;3196:1;3221:53;3266:7;3257:6;3246:9;3242:22;3221:53;:::i;:::-;3211:63;;3167:117;3323:2;3349:53;3394:7;3385:6;3374:9;3370:22;3349:53;:::i;:::-;3339:63;;3294:118;3451:2;3477:53;3522:7;3513:6;3502:9;3498:22;3477:53;:::i;:::-;3467:63;;3422:118;2928:619;;;;;:::o;3553:474::-;3621:6;3629;3678:2;3666:9;3657:7;3653:23;3649:32;3646:119;;;3684:79;;:::i;:::-;3646:119;3804:1;3829:53;3874:7;3865:6;3854:9;3850:22;3829:53;:::i;:::-;3819:63;;3775:117;3931:2;3957:53;4002:7;3993:6;3982:9;3978:22;3957:53;:::i;:::-;3947:63;;3902:118;3553:474;;;;;:::o;4033:559::-;4119:6;4127;4176:2;4164:9;4155:7;4151:23;4147:32;4144:119;;;4182:79;;:::i;:::-;4144:119;4330:1;4319:9;4315:17;4302:31;4360:18;4352:6;4349:30;4346:117;;;4382:79;;:::i;:::-;4346:117;4495:80;4567:7;4558:6;4547:9;4543:22;4495:80;:::i;:::-;4477:98;;;;4273:312;4033:559;;;;;:::o;4598:323::-;4654:6;4703:2;4691:9;4682:7;4678:23;4674:32;4671:119;;;4709:79;;:::i;:::-;4671:119;4829:1;4854:50;4896:7;4887:6;4876:9;4872:22;4854:50;:::i;:::-;4844:60;;4800:114;4598:323;;;;:::o;4927:345::-;4994:6;5043:2;5031:9;5022:7;5018:23;5014:32;5011:119;;;5049:79;;:::i;:::-;5011:119;5169:1;5194:61;5247:7;5238:6;5227:9;5223:22;5194:61;:::i;:::-;5184:71;;5140:125;4927:345;;;;:::o;5278:329::-;5337:6;5386:2;5374:9;5365:7;5361:23;5357:32;5354:119;;;5392:79;;:::i;:::-;5354:119;5512:1;5537:53;5582:7;5573:6;5562:9;5558:22;5537:53;:::i;:::-;5527:63;;5483:117;5278:329;;;;:::o;5613:474::-;5681:6;5689;5738:2;5726:9;5717:7;5713:23;5709:32;5706:119;;;5744:79;;:::i;:::-;5706:119;5864:1;5889:53;5934:7;5925:6;5914:9;5910:22;5889:53;:::i;:::-;5879:63;;5835:117;5991:2;6017:53;6062:7;6053:6;6042:9;6038:22;6017:53;:::i;:::-;6007:63;;5962:118;5613:474;;;;;:::o;6093:327::-;6151:6;6200:2;6188:9;6179:7;6175:23;6171:32;6168:119;;;6206:79;;:::i;:::-;6168:119;6326:1;6351:52;6395:7;6386:6;6375:9;6371:22;6351:52;:::i;:::-;6341:62;;6297:116;6093:327;;;;:::o;6426:329::-;6485:6;6534:2;6522:9;6513:7;6509:23;6505:32;6502:119;;;6540:79;;:::i;:::-;6502:119;6660:1;6685:53;6730:7;6721:6;6710:9;6706:22;6685:53;:::i;:::-;6675:63;;6631:117;6426:329;;;;:::o;6761:351::-;6831:6;6880:2;6868:9;6859:7;6855:23;6851:32;6848:119;;;6886:79;;:::i;:::-;6848:119;7006:1;7031:64;7087:7;7078:6;7067:9;7063:22;7031:64;:::i;:::-;7021:74;;6977:128;6761:351;;;;:::o;7118:179::-;7187:10;7208:46;7250:3;7242:6;7208:46;:::i;:::-;7286:4;7281:3;7277:14;7263:28;;7118:179;;;;:::o;7303:108::-;7380:24;7398:5;7380:24;:::i;:::-;7375:3;7368:37;7303:108;;:::o;7417:118::-;7504:24;7522:5;7504:24;:::i;:::-;7499:3;7492:37;7417:118;;:::o;7541:157::-;7646:45;7666:24;7684:5;7666:24;:::i;:::-;7646:45;:::i;:::-;7641:3;7634:58;7541:157;;:::o;7734:732::-;7853:3;7882:54;7930:5;7882:54;:::i;:::-;7952:86;8031:6;8026:3;7952:86;:::i;:::-;7945:93;;8062:56;8112:5;8062:56;:::i;:::-;8141:7;8172:1;8157:284;8182:6;8179:1;8176:13;8157:284;;;8258:6;8252:13;8285:63;8344:3;8329:13;8285:63;:::i;:::-;8278:70;;8371:60;8424:6;8371:60;:::i;:::-;8361:70;;8217:224;8204:1;8201;8197:9;8192:14;;8157:284;;;8161:14;8457:3;8450:10;;7858:608;;;7734:732;;;;:::o;8472:109::-;8553:21;8568:5;8553:21;:::i;:::-;8548:3;8541:34;8472:109;;:::o;8587:118::-;8674:24;8692:5;8674:24;:::i;:::-;8669:3;8662:37;8587:118;;:::o;8711:147::-;8806:45;8845:5;8806:45;:::i;:::-;8801:3;8794:58;8711:147;;:::o;8864:364::-;8952:3;8980:39;9013:5;8980:39;:::i;:::-;9035:71;9099:6;9094:3;9035:71;:::i;:::-;9028:78;;9115:52;9160:6;9155:3;9148:4;9141:5;9137:16;9115:52;:::i;:::-;9192:29;9214:6;9192:29;:::i;:::-;9187:3;9183:39;9176:46;;8956:272;8864:364;;;;:::o;9234:377::-;9340:3;9368:39;9401:5;9368:39;:::i;:::-;9423:89;9505:6;9500:3;9423:89;:::i;:::-;9416:96;;9521:52;9566:6;9561:3;9554:4;9547:5;9543:16;9521:52;:::i;:::-;9598:6;9593:3;9589:16;9582:23;;9344:267;9234:377;;;;:::o;9617:366::-;9759:3;9780:67;9844:2;9839:3;9780:67;:::i;:::-;9773:74;;9856:93;9945:3;9856:93;:::i;:::-;9974:2;9969:3;9965:12;9958:19;;9617:366;;;:::o;9989:::-;10131:3;10152:67;10216:2;10211:3;10152:67;:::i;:::-;10145:74;;10228:93;10317:3;10228:93;:::i;:::-;10346:2;10341:3;10337:12;10330:19;;9989:366;;;:::o;10361:::-;10503:3;10524:67;10588:2;10583:3;10524:67;:::i;:::-;10517:74;;10600:93;10689:3;10600:93;:::i;:::-;10718:2;10713:3;10709:12;10702:19;;10361:366;;;:::o;10733:::-;10875:3;10896:67;10960:2;10955:3;10896:67;:::i;:::-;10889:74;;10972:93;11061:3;10972:93;:::i;:::-;11090:2;11085:3;11081:12;11074:19;;10733:366;;;:::o;11105:365::-;11247:3;11268:66;11332:1;11327:3;11268:66;:::i;:::-;11261:73;;11343:93;11432:3;11343:93;:::i;:::-;11461:2;11456:3;11452:12;11445:19;;11105:365;;;:::o;11476:366::-;11618:3;11639:67;11703:2;11698:3;11639:67;:::i;:::-;11632:74;;11715:93;11804:3;11715:93;:::i;:::-;11833:2;11828:3;11824:12;11817:19;;11476:366;;;:::o;11848:::-;11990:3;12011:67;12075:2;12070:3;12011:67;:::i;:::-;12004:74;;12087:93;12176:3;12087:93;:::i;:::-;12205:2;12200:3;12196:12;12189:19;;11848:366;;;:::o;12220:365::-;12362:3;12383:66;12447:1;12442:3;12383:66;:::i;:::-;12376:73;;12458:93;12547:3;12458:93;:::i;:::-;12576:2;12571:3;12567:12;12560:19;;12220:365;;;:::o;12591:366::-;12733:3;12754:67;12818:2;12813:3;12754:67;:::i;:::-;12747:74;;12830:93;12919:3;12830:93;:::i;:::-;12948:2;12943:3;12939:12;12932:19;;12591:366;;;:::o;12963:::-;13105:3;13126:67;13190:2;13185:3;13126:67;:::i;:::-;13119:74;;13202:93;13291:3;13202:93;:::i;:::-;13320:2;13315:3;13311:12;13304:19;;12963:366;;;:::o;13335:::-;13477:3;13498:67;13562:2;13557:3;13498:67;:::i;:::-;13491:74;;13574:93;13663:3;13574:93;:::i;:::-;13692:2;13687:3;13683:12;13676:19;;13335:366;;;:::o;13707:::-;13849:3;13870:67;13934:2;13929:3;13870:67;:::i;:::-;13863:74;;13946:93;14035:3;13946:93;:::i;:::-;14064:2;14059:3;14055:12;14048:19;;13707:366;;;:::o;14079:402::-;14239:3;14260:85;14342:2;14337:3;14260:85;:::i;:::-;14253:92;;14354:93;14443:3;14354:93;:::i;:::-;14472:2;14467:3;14463:12;14456:19;;14079:402;;;:::o;14487:366::-;14629:3;14650:67;14714:2;14709:3;14650:67;:::i;:::-;14643:74;;14726:93;14815:3;14726:93;:::i;:::-;14844:2;14839:3;14835:12;14828:19;;14487:366;;;:::o;14859:402::-;15019:3;15040:85;15122:2;15117:3;15040:85;:::i;:::-;15033:92;;15134:93;15223:3;15134:93;:::i;:::-;15252:2;15247:3;15243:12;15236:19;;14859:402;;;:::o;15267:366::-;15409:3;15430:67;15494:2;15489:3;15430:67;:::i;:::-;15423:74;;15506:93;15595:3;15506:93;:::i;:::-;15624:2;15619:3;15615:12;15608:19;;15267:366;;;:::o;15639:118::-;15726:24;15744:5;15726:24;:::i;:::-;15721:3;15714:37;15639:118;;:::o;15763:157::-;15868:45;15888:24;15906:5;15888:24;:::i;:::-;15868:45;:::i;:::-;15863:3;15856:58;15763:157;;:::o;15926:112::-;16009:22;16025:5;16009:22;:::i;:::-;16004:3;15997:35;15926:112;;:::o;16044:967::-;16426:3;16448:148;16592:3;16448:148;:::i;:::-;16441:155;;16613:95;16704:3;16695:6;16613:95;:::i;:::-;16606:102;;16725:148;16869:3;16725:148;:::i;:::-;16718:155;;16890:95;16981:3;16972:6;16890:95;:::i;:::-;16883:102;;17002:3;16995:10;;16044:967;;;;;:::o;17017:538::-;17185:3;17200:75;17271:3;17262:6;17200:75;:::i;:::-;17300:2;17295:3;17291:12;17284:19;;17313:75;17384:3;17375:6;17313:75;:::i;:::-;17413:2;17408:3;17404:12;17397:19;;17426:75;17497:3;17488:6;17426:75;:::i;:::-;17526:2;17521:3;17517:12;17510:19;;17546:3;17539:10;;17017:538;;;;;;:::o;17561:222::-;17654:4;17692:2;17681:9;17677:18;17669:26;;17705:71;17773:1;17762:9;17758:17;17749:6;17705:71;:::i;:::-;17561:222;;;;:::o;17789:332::-;17910:4;17948:2;17937:9;17933:18;17925:26;;17961:71;18029:1;18018:9;18014:17;18005:6;17961:71;:::i;:::-;18042:72;18110:2;18099:9;18095:18;18086:6;18042:72;:::i;:::-;17789:332;;;;;:::o;18127:::-;18248:4;18286:2;18275:9;18271:18;18263:26;;18299:71;18367:1;18356:9;18352:17;18343:6;18299:71;:::i;:::-;18380:72;18448:2;18437:9;18433:18;18424:6;18380:72;:::i;:::-;18127:332;;;;;:::o;18465:210::-;18552:4;18590:2;18579:9;18575:18;18567:26;;18603:65;18665:1;18654:9;18650:17;18641:6;18603:65;:::i;:::-;18465:210;;;;:::o;18681:222::-;18774:4;18812:2;18801:9;18797:18;18789:26;;18825:71;18893:1;18882:9;18878:17;18869:6;18825:71;:::i;:::-;18681:222;;;;:::o;18909:313::-;19022:4;19060:2;19049:9;19045:18;19037:26;;19109:9;19103:4;19099:20;19095:1;19084:9;19080:17;19073:47;19137:78;19210:4;19201:6;19137:78;:::i;:::-;19129:86;;18909:313;;;;:::o;19228:419::-;19394:4;19432:2;19421:9;19417:18;19409:26;;19481:9;19475:4;19471:20;19467:1;19456:9;19452:17;19445:47;19509:131;19635:4;19509:131;:::i;:::-;19501:139;;19228:419;;;:::o;19653:::-;19819:4;19857:2;19846:9;19842:18;19834:26;;19906:9;19900:4;19896:20;19892:1;19881:9;19877:17;19870:47;19934:131;20060:4;19934:131;:::i;:::-;19926:139;;19653:419;;;:::o;20078:::-;20244:4;20282:2;20271:9;20267:18;20259:26;;20331:9;20325:4;20321:20;20317:1;20306:9;20302:17;20295:47;20359:131;20485:4;20359:131;:::i;:::-;20351:139;;20078:419;;;:::o;20503:::-;20669:4;20707:2;20696:9;20692:18;20684:26;;20756:9;20750:4;20746:20;20742:1;20731:9;20727:17;20720:47;20784:131;20910:4;20784:131;:::i;:::-;20776:139;;20503:419;;;:::o;20928:::-;21094:4;21132:2;21121:9;21117:18;21109:26;;21181:9;21175:4;21171:20;21167:1;21156:9;21152:17;21145:47;21209:131;21335:4;21209:131;:::i;:::-;21201:139;;20928:419;;;:::o;21353:::-;21519:4;21557:2;21546:9;21542:18;21534:26;;21606:9;21600:4;21596:20;21592:1;21581:9;21577:17;21570:47;21634:131;21760:4;21634:131;:::i;:::-;21626:139;;21353:419;;;:::o;21778:::-;21944:4;21982:2;21971:9;21967:18;21959:26;;22031:9;22025:4;22021:20;22017:1;22006:9;22002:17;21995:47;22059:131;22185:4;22059:131;:::i;:::-;22051:139;;21778:419;;;:::o;22203:::-;22369:4;22407:2;22396:9;22392:18;22384:26;;22456:9;22450:4;22446:20;22442:1;22431:9;22427:17;22420:47;22484:131;22610:4;22484:131;:::i;:::-;22476:139;;22203:419;;;:::o;22628:::-;22794:4;22832:2;22821:9;22817:18;22809:26;;22881:9;22875:4;22871:20;22867:1;22856:9;22852:17;22845:47;22909:131;23035:4;22909:131;:::i;:::-;22901:139;;22628:419;;;:::o;23053:::-;23219:4;23257:2;23246:9;23242:18;23234:26;;23306:9;23300:4;23296:20;23292:1;23281:9;23277:17;23270:47;23334:131;23460:4;23334:131;:::i;:::-;23326:139;;23053:419;;;:::o;23478:::-;23644:4;23682:2;23671:9;23667:18;23659:26;;23731:9;23725:4;23721:20;23717:1;23706:9;23702:17;23695:47;23759:131;23885:4;23759:131;:::i;:::-;23751:139;;23478:419;;;:::o;23903:::-;24069:4;24107:2;24096:9;24092:18;24084:26;;24156:9;24150:4;24146:20;24142:1;24131:9;24127:17;24120:47;24184:131;24310:4;24184:131;:::i;:::-;24176:139;;23903:419;;;:::o;24328:::-;24494:4;24532:2;24521:9;24517:18;24509:26;;24581:9;24575:4;24571:20;24567:1;24556:9;24552:17;24545:47;24609:131;24735:4;24609:131;:::i;:::-;24601:139;;24328:419;;;:::o;24753:::-;24919:4;24957:2;24946:9;24942:18;24934:26;;25006:9;25000:4;24996:20;24992:1;24981:9;24977:17;24970:47;25034:131;25160:4;25034:131;:::i;:::-;25026:139;;24753:419;;;:::o;25178:222::-;25271:4;25309:2;25298:9;25294:18;25286:26;;25322:71;25390:1;25379:9;25375:17;25366:6;25322:71;:::i;:::-;25178:222;;;;:::o;25406:831::-;25669:4;25707:3;25696:9;25692:19;25684:27;;25721:71;25789:1;25778:9;25774:17;25765:6;25721:71;:::i;:::-;25802:80;25878:2;25867:9;25863:18;25854:6;25802:80;:::i;:::-;25929:9;25923:4;25919:20;25914:2;25903:9;25899:18;25892:48;25957:108;26060:4;26051:6;25957:108;:::i;:::-;25949:116;;26075:72;26143:2;26132:9;26128:18;26119:6;26075:72;:::i;:::-;26157:73;26225:3;26214:9;26210:19;26201:6;26157:73;:::i;:::-;25406:831;;;;;;;;:::o;26243:214::-;26332:4;26370:2;26359:9;26355:18;26347:26;;26383:67;26447:1;26436:9;26432:17;26423:6;26383:67;:::i;:::-;26243:214;;;;:::o;26544:132::-;26611:4;26634:3;26626:11;;26664:4;26659:3;26655:14;26647:22;;26544:132;;;:::o;26682:114::-;26749:6;26783:5;26777:12;26767:22;;26682:114;;;:::o;26802:99::-;26854:6;26888:5;26882:12;26872:22;;26802:99;;;:::o;26907:113::-;26977:4;27009;27004:3;27000:14;26992:22;;26907:113;;;:::o;27026:184::-;27125:11;27159:6;27154:3;27147:19;27199:4;27194:3;27190:14;27175:29;;27026:184;;;;:::o;27216:169::-;27300:11;27334:6;27329:3;27322:19;27374:4;27369:3;27365:14;27350:29;;27216:169;;;;:::o;27391:148::-;27493:11;27530:3;27515:18;;27391:148;;;;:::o;27545:305::-;27585:3;27604:20;27622:1;27604:20;:::i;:::-;27599:25;;27638:20;27656:1;27638:20;:::i;:::-;27633:25;;27792:1;27724:66;27720:74;27717:1;27714:81;27711:107;;;27798:18;;:::i;:::-;27711:107;27842:1;27839;27835:9;27828:16;;27545:305;;;;:::o;27856:348::-;27896:7;27919:20;27937:1;27919:20;:::i;:::-;27914:25;;27953:20;27971:1;27953:20;:::i;:::-;27948:25;;28141:1;28073:66;28069:74;28066:1;28063:81;28058:1;28051:9;28044:17;28040:105;28037:131;;;28148:18;;:::i;:::-;28037:131;28196:1;28193;28189:9;28178:20;;27856:348;;;;:::o;28210:96::-;28247:7;28276:24;28294:5;28276:24;:::i;:::-;28265:35;;28210:96;;;:::o;28312:90::-;28346:7;28389:5;28382:13;28375:21;28364:32;;28312:90;;;:::o;28408:77::-;28445:7;28474:5;28463:16;;28408:77;;;:::o;28491:149::-;28527:7;28567:66;28560:5;28556:78;28545:89;;28491:149;;;:::o;28646:126::-;28683:7;28723:42;28716:5;28712:54;28701:65;;28646:126;;;:::o;28778:77::-;28815:7;28844:5;28833:16;;28778:77;;;:::o;28861:86::-;28896:7;28936:4;28929:5;28925:16;28914:27;;28861:86;;;:::o;28953:121::-;29011:9;29044:24;29062:5;29044:24;:::i;:::-;29031:37;;28953:121;;;:::o;29080:307::-;29148:1;29158:113;29172:6;29169:1;29166:13;29158:113;;;29257:1;29252:3;29248:11;29242:18;29238:1;29233:3;29229:11;29222:39;29194:2;29191:1;29187:10;29182:15;;29158:113;;;29289:6;29286:1;29283:13;29280:101;;;29369:1;29360:6;29355:3;29351:16;29344:27;29280:101;29129:258;29080:307;;;:::o;29393:171::-;29432:3;29455:24;29473:5;29455:24;:::i;:::-;29446:33;;29501:4;29494:5;29491:15;29488:41;;;29509:18;;:::i;:::-;29488:41;29556:1;29549:5;29545:13;29538:20;;29393:171;;;:::o;29570:320::-;29614:6;29651:1;29645:4;29641:12;29631:22;;29698:1;29692:4;29688:12;29719:18;29709:81;;29775:4;29767:6;29763:17;29753:27;;29709:81;29837:2;29829:6;29826:14;29806:18;29803:38;29800:84;;;29856:18;;:::i;:::-;29800:84;29621:269;29570:320;;;:::o;29896:233::-;29935:3;29958:24;29976:5;29958:24;:::i;:::-;29949:33;;30004:66;29997:5;29994:77;29991:103;;;30074:18;;:::i;:::-;29991:103;30121:1;30114:5;30110:13;30103:20;;29896:233;;;:::o;30135:100::-;30174:7;30203:26;30223:5;30203:26;:::i;:::-;30192:37;;30135:100;;;:::o;30241:94::-;30280:7;30309:20;30323:5;30309:20;:::i;:::-;30298:31;;30241:94;;;:::o;30341:79::-;30380:7;30409:5;30398:16;;30341:79;;;:::o;30426:176::-;30458:1;30475:20;30493:1;30475:20;:::i;:::-;30470:25;;30509:20;30527:1;30509:20;:::i;:::-;30504:25;;30548:1;30538:35;;30553:18;;:::i;:::-;30538:35;30594:1;30591;30587:9;30582:14;;30426:176;;;;:::o;30608:180::-;30656:77;30653:1;30646:88;30753:4;30750:1;30743:15;30777:4;30774:1;30767:15;30794:180;30842:77;30839:1;30832:88;30939:4;30936:1;30929:15;30963:4;30960:1;30953:15;30980:180;31028:77;31025:1;31018:88;31125:4;31122:1;31115:15;31149:4;31146:1;31139:15;31166:180;31214:77;31211:1;31204:88;31311:4;31308:1;31301:15;31335:4;31332:1;31325:15;31352:180;31400:77;31397:1;31390:88;31497:4;31494:1;31487:15;31521:4;31518:1;31511:15;31538:117;31647:1;31644;31637:12;31661:117;31770:1;31767;31760:12;31784:117;31893:1;31890;31883:12;31907:117;32016:1;32013;32006:12;32030:117;32139:1;32136;32129:12;32153:102;32194:6;32245:2;32241:7;32236:2;32229:5;32225:14;32221:28;32211:38;;32153:102;;;:::o;32261:94::-;32294:8;32342:5;32338:2;32334:14;32313:35;;32261:94;;;:::o;32361:182::-;32501:34;32497:1;32489:6;32485:14;32478:58;32361:182;:::o;32549:222::-;32689:34;32685:1;32677:6;32673:14;32666:58;32758:5;32753:2;32745:6;32741:15;32734:30;32549:222;:::o;32777:225::-;32917:34;32913:1;32905:6;32901:14;32894:58;32986:8;32981:2;32973:6;32969:15;32962:33;32777:225;:::o;33008:221::-;33148:34;33144:1;33136:6;33132:14;33125:58;33217:4;33212:2;33204:6;33200:15;33193:29;33008:221;:::o;33235:158::-;33375:10;33371:1;33363:6;33359:14;33352:34;33235:158;:::o;33399:179::-;33539:31;33535:1;33527:6;33523:14;33516:55;33399:179;:::o;33584:225::-;33724:34;33720:1;33712:6;33708:14;33701:58;33793:8;33788:2;33780:6;33776:15;33769:33;33584:225;:::o;33815:158::-;33955:10;33951:1;33943:6;33939:14;33932:34;33815:158;:::o;33979:182::-;34119:34;34115:1;34107:6;34103:14;34096:58;33979:182;:::o;34167:166::-;34307:18;34303:1;34295:6;34291:14;34284:42;34167:166;:::o;34339:224::-;34479:34;34475:1;34467:6;34463:14;34456:58;34548:7;34543:2;34535:6;34531:15;34524:32;34339:224;:::o;34569:223::-;34709:34;34705:1;34697:6;34693:14;34686:58;34778:6;34773:2;34765:6;34761:15;34754:31;34569:223;:::o;34798:173::-;34938:25;34934:1;34926:6;34922:14;34915:49;34798:173;:::o;34977:224::-;35117:34;35113:1;35105:6;35101:14;35094:58;35186:7;35181:2;35173:6;35169:15;35162:32;34977:224;:::o;35207:167::-;35347:19;35343:1;35335:6;35331:14;35324:43;35207:167;:::o;35380:234::-;35520:34;35516:1;35508:6;35504:14;35497:58;35589:17;35584:2;35576:6;35572:15;35565:42;35380:234;:::o;35620:122::-;35693:24;35711:5;35693:24;:::i;:::-;35686:5;35683:35;35673:63;;35732:1;35729;35722:12;35673:63;35620:122;:::o;35748:116::-;35818:21;35833:5;35818:21;:::i;:::-;35811:5;35808:32;35798:60;;35854:1;35851;35844:12;35798:60;35748:116;:::o;35870:122::-;35943:24;35961:5;35943:24;:::i;:::-;35936:5;35933:35;35923:63;;35982:1;35979;35972:12;35923:63;35870:122;:::o;35998:120::-;36070:23;36087:5;36070:23;:::i;:::-;36063:5;36060:34;36050:62;;36108:1;36105;36098:12;36050:62;35998:120;:::o;36124:122::-;36197:24;36215:5;36197:24;:::i;:::-;36190:5;36187:35;36177:63;;36236:1;36233;36226:12;36177:63;36124:122;:::o

Swarm Source

ipfs://c5e2faa1778d03573f67dcfaafeba66d4e819c6ea95d8305376f9dbdb8cc0b30
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.